node-mac-recorder 2.19.1 โ 2.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +2 -1
- package/CLAUDE.md +23 -20
- package/package.json +1 -1
- package/src/mac_recorder.mm +81 -72
- package/temp_cursor_1758628587377.json +1 -0
- package/temp_cursor_1758625423860.json +0 -1
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"Bash(FORCE_AVFOUNDATION=1 timeout 8 node test-cursor-debug.js)",
|
|
9
9
|
"Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-cursor-debug.js)",
|
|
10
10
|
"Bash(FORCE_AVFOUNDATION=1 timeout 8 node test-unified-cursor.js)",
|
|
11
|
-
"Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-unified-cursor.js)"
|
|
11
|
+
"Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-unified-cursor.js)",
|
|
12
|
+
"Bash(FORCE_AVFOUNDATION=1 timeout 8 node -e \"\nconst MacRecorder = require(''./index.js'');\nconst recorder = new MacRecorder();\n\nconsole.log(''๐งช Testing AVFoundation fallback...'');\n\nasync function testFallback() {\n try {\n const outputPath = ''./test-avfoundation-fallback.mov'';\n \n console.log(''Starting AVFoundation recording...'');\n await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: false\n });\n \n console.log(''โ
AVFoundation recording started!'');\n \n setTimeout(async () => {\n try {\n console.log(''Stopping recording...'');\n await recorder.stopRecording();\n console.log(''โ
AVFoundation recording stopped!'');\n process.exit(0);\n } catch (error) {\n console.error(''โ Stop failed:'', error.message);\n process.exit(1);\n }\n }, 3000);\n \n } catch (error) {\n console.error(''โ AVFoundation recording failed:'', error.message);\n process.exit(1);\n }\n}\n\ntestFallback();\n\")"
|
|
12
13
|
],
|
|
13
14
|
"deny": [],
|
|
14
15
|
"ask": []
|
package/CLAUDE.md
CHANGED
|
@@ -131,18 +131,20 @@ The MacRecorder class emits the following events:
|
|
|
131
131
|
|
|
132
132
|
### Platform Requirements & Framework Selection
|
|
133
133
|
|
|
134
|
-
**
|
|
135
|
-
- **Primary Target**:
|
|
136
|
-
- **
|
|
137
|
-
- macOS
|
|
134
|
+
**ELECTRON-FIRST ARCHITECTURE:**
|
|
135
|
+
- **Primary Target**: Electron.js applications (full support, no restrictions)
|
|
136
|
+
- **Secondary**: Node.js standalone applications
|
|
137
|
+
- macOS only (enforced in install.js)
|
|
138
138
|
- Native module compilation required on install
|
|
139
|
-
- Requires screen recording permissions
|
|
139
|
+
- Requires screen recording and accessibility permissions
|
|
140
140
|
|
|
141
|
-
**Framework Selection Logic (
|
|
142
|
-
- **macOS
|
|
143
|
-
- **macOS
|
|
144
|
-
- **macOS
|
|
145
|
-
- **
|
|
141
|
+
**Framework Selection Logic (Electron Priority):**
|
|
142
|
+
- **macOS 15+ + Electron**: ScreenCaptureKit with full capabilities
|
|
143
|
+
- **macOS 15+ + Node.js**: ScreenCaptureKit with full capabilities
|
|
144
|
+
- **macOS 14 + Electron**: AVFoundation with full capabilities
|
|
145
|
+
- **macOS 13 + Electron**: AVFoundation with limited features
|
|
146
|
+
- **macOS 14 + Node.js**: AVFoundation with full capabilities
|
|
147
|
+
- **macOS 13 + Node.js**: AVFoundation with limited features
|
|
146
148
|
|
|
147
149
|
### File Outputs
|
|
148
150
|
|
|
@@ -177,13 +179,14 @@ The module tries loading from `build/Release/` first, then falls back to `build/
|
|
|
177
179
|
|
|
178
180
|
### **โก CRITICAL IMPLEMENTATION NOTES**
|
|
179
181
|
|
|
180
|
-
**
|
|
181
|
-
1. **
|
|
182
|
-
2. **
|
|
183
|
-
3. **Environment
|
|
184
|
-
4. **macOS Compatibility**:
|
|
185
|
-
- macOS
|
|
186
|
-
- macOS
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
182
|
+
**ELECTRON.JS IS THE PRIMARY TARGET:**
|
|
183
|
+
1. **No Electron Restrictions**: All Electron detection logic is for optimization, NOT blocking
|
|
184
|
+
2. **Framework Support**: Both ScreenCaptureKit and AVFoundation work perfectly in Electron
|
|
185
|
+
3. **Environment Detection**: Code detects Electron to provide enhanced logging and optimization
|
|
186
|
+
4. **macOS Compatibility**:
|
|
187
|
+
- macOS 15+ (Sequoia+): Use ScreenCaptureKit for best performance
|
|
188
|
+
- macOS 14 (Sonoma): Use AVFoundation with full feature set
|
|
189
|
+
- macOS 13 (Ventura): Use AVFoundation with basic features
|
|
190
|
+
5. **Error Handling**: Any "Recording failed to start" errors should trigger fallback logic, never blocking
|
|
191
|
+
|
|
192
|
+
**NEVER BLOCK ELECTRON ENVIRONMENTS** - This is a core design principle.
|
package/package.json
CHANGED
package/src/mac_recorder.mm
CHANGED
|
@@ -192,25 +192,27 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
|
|
|
192
192
|
|
|
193
193
|
// Check macOS version for ScreenCaptureKit compatibility
|
|
194
194
|
NSOperatingSystemVersion osVersion = [[NSProcessInfo processInfo] operatingSystemVersion];
|
|
195
|
-
BOOL
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
BOOL isM15Plus = (osVersion.majorVersion >= 15);
|
|
196
|
+
BOOL isM14Plus = (osVersion.majorVersion >= 14);
|
|
197
|
+
BOOL isM13Plus = (osVersion.majorVersion >= 13);
|
|
198
|
+
|
|
199
|
+
NSLog(@"๐ฅ๏ธ macOS Version: %ld.%ld.%ld",
|
|
199
200
|
(long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion);
|
|
200
|
-
|
|
201
|
-
// Force AVFoundation for debugging/testing
|
|
201
|
+
|
|
202
|
+
// Force AVFoundation for debugging/testing
|
|
202
203
|
BOOL forceAVFoundation = (getenv("FORCE_AVFOUNDATION") != NULL);
|
|
203
204
|
if (forceAVFoundation) {
|
|
204
|
-
NSLog(@"๐ง FORCE_AVFOUNDATION environment variable detected -
|
|
205
|
+
NSLog(@"๐ง FORCE_AVFOUNDATION environment variable detected - skipping ScreenCaptureKit");
|
|
205
206
|
}
|
|
206
|
-
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
|
|
207
|
+
|
|
208
|
+
// Electron-first priority: This application is built for Electron.js
|
|
209
|
+
// macOS 15+ โ ScreenCaptureKit (including Electron)
|
|
210
|
+
// macOS 14/13 โ AVFoundation (including Electron)
|
|
211
|
+
if (isM15Plus && !forceAVFoundation) {
|
|
210
212
|
if (isElectron) {
|
|
211
|
-
NSLog(@"โก ELECTRON: macOS
|
|
213
|
+
NSLog(@"โก ELECTRON PRIORITY: macOS 15+ Electron โ ScreenCaptureKit with full support");
|
|
212
214
|
} else {
|
|
213
|
-
NSLog(@"โ
macOS
|
|
215
|
+
NSLog(@"โ
macOS 15+ Node.js โ ScreenCaptureKit available with full compatibility");
|
|
214
216
|
}
|
|
215
217
|
|
|
216
218
|
// Try ScreenCaptureKit with extensive safety measures
|
|
@@ -285,53 +287,65 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
|
|
|
285
287
|
// If we reach here, ScreenCaptureKit failed, so fall through to AVFoundation
|
|
286
288
|
NSLog(@"โญ๏ธ ScreenCaptureKit failed - falling back to AVFoundation");
|
|
287
289
|
} else {
|
|
288
|
-
// macOS
|
|
289
|
-
if (
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
// macOS 14/13 or forced AVFoundation โ ALWAYS use AVFoundation (Electron supported!)
|
|
291
|
+
if (isElectron) {
|
|
292
|
+
if (isM14Plus) {
|
|
293
|
+
NSLog(@"โก ELECTRON PRIORITY: macOS 14/13 Electron โ AVFoundation with full support");
|
|
294
|
+
} else if (isM13Plus) {
|
|
295
|
+
NSLog(@"โก ELECTRON PRIORITY: macOS 13 Electron โ AVFoundation with limited features");
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
if (isM15Plus) {
|
|
299
|
+
NSLog(@"๐ฏ macOS 15+ Node.js with FORCE_AVFOUNDATION โ using AVFoundation");
|
|
300
|
+
} else if (isM14Plus) {
|
|
301
|
+
NSLog(@"๐ฏ macOS 14 Node.js โ using AVFoundation (primary method)");
|
|
302
|
+
} else if (isM13Plus) {
|
|
303
|
+
NSLog(@"๐ฏ macOS 13 Node.js โ using AVFoundation (limited features)");
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (!isM13Plus) {
|
|
308
|
+
NSLog(@"โ macOS version too old (< 13.0) - Not supported");
|
|
292
309
|
return Napi::Boolean::New(env, false);
|
|
293
310
|
}
|
|
294
|
-
|
|
295
|
-
//
|
|
296
|
-
NSLog(@"โญ๏ธ Using AVFoundation
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// AVFoundation recording (fallback
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
NSLog(@"โ Check permissions and output path validity");
|
|
325
|
-
}
|
|
326
|
-
} @catch (NSException *avException) {
|
|
327
|
-
NSLog(@"โ Exception during AVFoundation startup: %@", avException.reason);
|
|
328
|
-
NSLog(@"โ Stack trace: %@", [avException callStackSymbols]);
|
|
311
|
+
|
|
312
|
+
// DIRECT AVFoundation for all environments (Node.js + Electron)
|
|
313
|
+
NSLog(@"โญ๏ธ Using AVFoundation directly - supports both Node.js and Electron");
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// AVFoundation recording (either fallback from ScreenCaptureKit or direct)
|
|
317
|
+
NSLog(@"๐ฅ Starting AVFoundation recording...");
|
|
318
|
+
|
|
319
|
+
@try {
|
|
320
|
+
// Import AVFoundation recording functions (if available)
|
|
321
|
+
extern bool startAVFoundationRecording(const std::string& outputPath,
|
|
322
|
+
CGDirectDisplayID displayID,
|
|
323
|
+
uint32_t windowID,
|
|
324
|
+
CGRect captureRect,
|
|
325
|
+
bool captureCursor,
|
|
326
|
+
bool includeMicrophone,
|
|
327
|
+
bool includeSystemAudio,
|
|
328
|
+
NSString* audioDeviceId);
|
|
329
|
+
|
|
330
|
+
bool avResult = startAVFoundationRecording(outputPath, displayID, windowID, captureRect,
|
|
331
|
+
captureCursor, includeMicrophone, includeSystemAudio, audioDeviceId);
|
|
332
|
+
|
|
333
|
+
if (avResult) {
|
|
334
|
+
NSLog(@"๐ฅ RECORDING METHOD: AVFoundation");
|
|
335
|
+
NSLog(@"โ
AVFoundation recording started successfully");
|
|
336
|
+
g_isRecording = true;
|
|
337
|
+
return Napi::Boolean::New(env, true);
|
|
338
|
+
} else {
|
|
339
|
+
NSLog(@"โ AVFoundation recording failed to start");
|
|
340
|
+
NSLog(@"โ Check permissions and output path validity");
|
|
329
341
|
}
|
|
342
|
+
} @catch (NSException *avException) {
|
|
343
|
+
NSLog(@"โ Exception during AVFoundation startup: %@", avException.reason);
|
|
344
|
+
NSLog(@"โ Stack trace: %@", [avException callStackSymbols]);
|
|
330
345
|
}
|
|
331
|
-
|
|
332
|
-
// ScreenCaptureKit
|
|
333
|
-
NSLog(@"โ
|
|
334
|
-
NSLog(@"๐ก Ensure macOS 12.3+ and screen recording permissions are granted");
|
|
346
|
+
|
|
347
|
+
// Both ScreenCaptureKit and AVFoundation failed
|
|
348
|
+
NSLog(@"โ All recording methods failed - no recording available");
|
|
335
349
|
return Napi::Boolean::New(env, false);
|
|
336
350
|
|
|
337
351
|
} @catch (NSException *exception) {
|
|
@@ -876,32 +890,27 @@ Napi::Value CheckPermissions(const Napi::CallbackInfo& info) {
|
|
|
876
890
|
|
|
877
891
|
// Check for force AVFoundation flag
|
|
878
892
|
BOOL forceAVFoundation = (getenv("FORCE_AVFOUNDATION") != NULL);
|
|
879
|
-
|
|
880
|
-
// Check macOS version for ScreenCaptureKit compatibility
|
|
881
|
-
BOOL isM12_3Plus = (osVersion.majorVersion > 12) ||
|
|
882
|
-
(osVersion.majorVersion == 12 && osVersion.minorVersion >= 3);
|
|
883
|
-
|
|
893
|
+
|
|
884
894
|
// Electron detection
|
|
885
|
-
BOOL isElectron = (NSBundle.mainBundle.bundleIdentifier &&
|
|
895
|
+
BOOL isElectron = (NSBundle.mainBundle.bundleIdentifier &&
|
|
886
896
|
[NSBundle.mainBundle.bundleIdentifier containsString:@"electron"]) ||
|
|
887
|
-
(NSProcessInfo.processInfo.processName &&
|
|
897
|
+
(NSProcessInfo.processInfo.processName &&
|
|
888
898
|
[NSProcessInfo.processInfo.processName containsString:@"Electron"]) ||
|
|
889
899
|
(NSProcessInfo.processInfo.environment[@"ELECTRON_RUN_AS_NODE"] != nil);
|
|
890
|
-
|
|
891
|
-
NSLog(@"๐ Permission check for macOS %ld.%ld.%ld",
|
|
900
|
+
|
|
901
|
+
NSLog(@"๐ Permission check for macOS %ld.%ld.%ld",
|
|
892
902
|
(long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion);
|
|
893
|
-
|
|
894
|
-
// Determine which framework will be used (
|
|
895
|
-
BOOL willUseScreenCaptureKit = (
|
|
896
|
-
BOOL willUseAVFoundation = (!willUseScreenCaptureKit &&
|
|
903
|
+
|
|
904
|
+
// Determine which framework will be used (Electron fully supported!)
|
|
905
|
+
BOOL willUseScreenCaptureKit = (isM15Plus && !forceAVFoundation); // Electron can use ScreenCaptureKit on macOS 15+
|
|
906
|
+
BOOL willUseAVFoundation = (!willUseScreenCaptureKit && (isM13Plus || isM14Plus));
|
|
897
907
|
|
|
898
908
|
if (willUseScreenCaptureKit) {
|
|
899
909
|
NSLog(@"๐ฏ Will use ScreenCaptureKit - checking ScreenCaptureKit permissions");
|
|
900
910
|
} else if (willUseAVFoundation) {
|
|
901
|
-
NSLog(@"๐ฏ Will use AVFoundation
|
|
911
|
+
NSLog(@"๐ฏ Will use AVFoundation - checking AVFoundation permissions");
|
|
902
912
|
} else {
|
|
903
|
-
NSLog(@"โ
|
|
904
|
-
NSLog(@"๐ก This version requires macOS 12.3+ for ScreenCaptureKit");
|
|
913
|
+
NSLog(@"โ No compatible recording framework available");
|
|
905
914
|
return Napi::Boolean::New(env, false);
|
|
906
915
|
}
|
|
907
916
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"x":-2420,"y":919,"timestamp":80,"unixTimeMs":1758628587619,"cursorType":"text","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}}]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[{"x":-2062,"y":527,"timestamp":217,"unixTimeMs":1758625424081,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2028,"y":513,"timestamp":236,"unixTimeMs":1758625424100,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2025,"y":512,"timestamp":318,"unixTimeMs":1758625424182,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2020,"y":510,"timestamp":336,"unixTimeMs":1758625424200,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2012,"y":508,"timestamp":356,"unixTimeMs":1758625424220,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2009,"y":507,"timestamp":377,"unixTimeMs":1758625424241,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2004,"y":505,"timestamp":398,"unixTimeMs":1758625424262,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2001,"y":504,"timestamp":421,"unixTimeMs":1758625424285,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1999,"y":504,"timestamp":464,"unixTimeMs":1758625424328,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2010,"y":506,"timestamp":869,"unixTimeMs":1758625424733,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2022,"y":508,"timestamp":894,"unixTimeMs":1758625424758,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2048,"y":508,"timestamp":912,"unixTimeMs":1758625424776,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2103,"y":495,"timestamp":934,"unixTimeMs":1758625424798,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2158,"y":478,"timestamp":954,"unixTimeMs":1758625424818,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2254,"y":432,"timestamp":971,"unixTimeMs":1758625424835,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2293,"y":397,"timestamp":997,"unixTimeMs":1758625424861,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2359,"y":329,"timestamp":1015,"unixTimeMs":1758625424879,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2445,"y":239,"timestamp":1036,"unixTimeMs":1758625424900,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2468,"y":214,"timestamp":1054,"unixTimeMs":1758625424918,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2478,"y":198,"timestamp":1076,"unixTimeMs":1758625424940,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2494,"y":173,"timestamp":1097,"unixTimeMs":1758625424961,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2510,"y":155,"timestamp":1120,"unixTimeMs":1758625424984,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2529,"y":139,"timestamp":1139,"unixTimeMs":1758625425003,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2539,"y":128,"timestamp":1158,"unixTimeMs":1758625425022,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2541,"y":121,"timestamp":1177,"unixTimeMs":1758625425041,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2538,"y":110,"timestamp":1202,"unixTimeMs":1758625425066,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2535,"y":101,"timestamp":1228,"unixTimeMs":1758625425092,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2533,"y":98,"timestamp":1248,"unixTimeMs":1758625425112,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2517,"y":97,"timestamp":1308,"unixTimeMs":1758625425172,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2498,"y":97,"timestamp":1335,"unixTimeMs":1758625425199,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2491,"y":98,"timestamp":1358,"unixTimeMs":1758625425222,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2488,"y":99,"timestamp":1384,"unixTimeMs":1758625425248,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1530,"unixTimeMs":1758625425394,"cursorType":"default","type":"mousedown","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1547,"unixTimeMs":1758625425411,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1588,"unixTimeMs":1758625425452,"cursorType":"default","type":"mouseup","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1607,"unixTimeMs":1758625425471,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1670,"unixTimeMs":1758625425534,"cursorType":"default","type":"mousedown","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1695,"unixTimeMs":1758625425559,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1734,"unixTimeMs":1758625425598,"cursorType":"default","type":"mouseup","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1754,"unixTimeMs":1758625425618,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2483,"y":101,"timestamp":2675,"unixTimeMs":1758625426539,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2475,"y":105,"timestamp":2694,"unixTimeMs":1758625426558,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2470,"y":108,"timestamp":2715,"unixTimeMs":1758625426579,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2461,"y":113,"timestamp":2737,"unixTimeMs":1758625426601,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2430,"y":127,"timestamp":2765,"unixTimeMs":1758625426629,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2384,"y":148,"timestamp":2808,"unixTimeMs":1758625426672,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2233,"y":201,"timestamp":2839,"unixTimeMs":1758625426703,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2074,"y":243,"timestamp":2858,"unixTimeMs":1758625426722,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1985,"y":265,"timestamp":2878,"unixTimeMs":1758625426742,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1942,"y":282,"timestamp":2899,"unixTimeMs":1758625426763,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1920,"y":296,"timestamp":2918,"unixTimeMs":1758625426782,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1916,"y":301,"timestamp":2937,"unixTimeMs":1758625426801,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1913,"y":303,"timestamp":2958,"unixTimeMs":1758625426822,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}}]
|