@vestra-player/sdk 1.6.15 → 1.6.16

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.6.16
4
+
5
+ **Who must change: nobody.** A data refresh for the player's four built-in panels (player 0.7.6) and one additive read; no API is removed, `apiVersion` stays `vestra/1`.
6
+
7
+ - **`BUILTIN_COMMANDS`**: the Picture, Audio, Subtitles and Playback panels open from four top-level items, **Picture…** (`vestra.video`, `video.picture`, Alt+1), **Audio…** (`audio.workbench`, Alt+2), **Subtitles…** (`tune`, Alt+3) and **Playback…** (`vestra.playback`, `panel`, Alt+4), next to Playlist. The commands their panels hold left the menus for the command palette, with their keys and categories: Video's Pixel Shaders, Deinterlace, Aspect, Crop/Stretch, Framing, Image Processing and Rotation, the picture steps and GPU Rendering; Audio's track, channel, equalizer, preset, sync and processing items; Subtitles' show, style, secondary subtitle, sync and reload items; the playback plugin's seek steps, keyframes, Jump to Time… and speeds; the Reset items of the video, audio and subtitles plugins (the visualizer's Reset ▸ Idle Logo stays). **Subtitle Track ▸ Off** and **Audio Track ▸ No Audio Tracks** are now top-level submenus. New palette commands: Remove External Subtitle (`vestra.subtitles`, `remove`) and Picture Panel (`video.resetPanel`, a reset of the panel's values). Audio ▸ Output Device ▸ No Output Devices (`audio.device.none`) is gone.
8
+ - **`BUILTIN_SUBMENUS`**: the Video, Audio and Subtitles submenus of these plugins are gone; **Subtitle Track** (`vestra.subtitles`) and **Audio Track** (`vestra.audio`) are new, at the top level. Online Subtitles and Snapshot stay.
9
+ - **`plugin.commands.keys("host/<id>")`** reads the keys of the player's own commands (`host/volume-up`, `host/mute`, the ids of the `host` rows of `BUILTIN_COMMANDS`), read-only and current like a plugin's own, so a panel can show the player's key caps beside its controls; `onKeysChange` fires for their changes too. The `commands.keys` answer and event carry them as `host/<id>` entries (a local id has no `/`); player 0.7.6, like `keys` itself. A side effect: rebinding one of the player's own commands now sends `commands.keys` to every plugin listening for it, and a listener in standby is started for it (as for a change to its own keys); `onKeysChange` still fires only when a label the plugin can read changed.
10
+ - **`TestHost`**: `commands.keys` answers the core commands as `host/<id>` too, and `rebind` takes a core command's `host/<id>`.
11
+
3
12
  ## 1.6.15
4
13
 
5
14
  **Who must change: nobody.** A plugin may now mount one panel per slot (player 0.7.6) instead of one panel in all; plugins with one panel work as before, and `apiVersion` stays `vestra/1`.
@@ -348,8 +348,9 @@ export type CommandDeclaration = {
348
348
  };
349
349
  /**
350
350
  * `commands.keys` (player 0.7.6): each of the plugin's own commands, by
351
- * local id, with the labels of its current keys; the answer to the request
352
- * and the data of the event of that name.
351
+ * local id, and (SDK 1.6.16) each of the player's own as `host/<id>`, with
352
+ * the labels of its current keys; the answer to the request and the data of
353
+ * the event of that name.
353
354
  */
354
355
  export type CommandKeys = {
355
356
  keys: Record<string, string[]>;
package/dist/commands.js CHANGED
@@ -275,32 +275,7 @@ export const BUILTIN_SUBMENUS = Object.freeze([
275
275
  path: ["Subtitles", "Online Subtitles"],
276
276
  plugins: ["vestra.subtitle-online"],
277
277
  },
278
- { path: ["Subtitles", "Secondary Subtitle"], plugins: ["vestra.subtitles"] },
279
- {
280
- path: ["Subtitles", "Secondary Subtitle", "Position"],
281
- plugins: ["vestra.subtitles"],
282
- },
283
- { path: ["Subtitles", "Subtitle Style"], plugins: ["vestra.subtitles"] },
284
- { path: ["Subtitles", "Subtitle Track"], plugins: ["vestra.subtitles"] },
285
- { path: ["Subtitles", "Sync"], plugins: ["vestra.subtitles"] },
286
- { path: ["Video", "Aspect"], plugins: ["vestra.video"] },
287
- { path: ["Video", "Crop/Stretch"], plugins: ["vestra.video"] },
288
- { path: ["Video", "Deinterlace"], plugins: ["vestra.video"] },
289
- { path: ["Video", "Deinterlace", "Output"], plugins: ["vestra.video"] },
290
- { path: ["Video", "Framing"], plugins: ["vestra.video"] },
291
- { path: ["Video", "Image Processing"], plugins: ["vestra.video"] },
292
- { path: ["Video", "Pixel Shaders"], plugins: ["vestra.video"] },
293
- {
294
- path: ["Video", "Pixel Shaders", "HDR Tone Mapping"],
295
- plugins: ["vestra.video"],
296
- },
297
- { path: ["Video", "Rotation"], plugins: ["vestra.video"] },
298
278
  { path: ["Video", "Snapshot"], plugins: ["vestra.capture"] },
299
- { path: ["Audio", "Audio Sync"], plugins: ["vestra.audio"] },
300
- { path: ["Audio", "Audio Track"], plugins: ["vestra.audio"] },
301
- { path: ["Audio", "Output Device"], plugins: ["vestra.audio"] },
302
- { path: ["Audio", "Preset"], plugins: ["vestra.audio"] },
303
- { path: ["Audio", "Processing"], plugins: ["vestra.audio"] },
304
279
  { path: ["Screen", "Always on Top"], plugins: ["vestra.window"] },
305
280
  { path: ["Screen", "When Playback Starts"], plugins: ["vestra.window"] },
306
281
  {
@@ -309,6 +284,8 @@ export const BUILTIN_SUBMENUS = Object.freeze([
309
284
  },
310
285
  { path: ["Settings", "Language"], plugins: ["vestra.preferences"] },
311
286
  { path: ["Copy to Clipboard"], plugins: ["vestra.playback"] },
287
+ { path: ["Subtitle Track"], plugins: ["vestra.subtitles"] },
288
+ { path: ["Audio Track"], plugins: ["vestra.audio"] },
312
289
  ]);
313
290
  /** owner | id | key path, or (title) outside the menu | bindings | panel */
314
291
  const BUILTIN_COMMAND_TABLE = `
@@ -330,24 +307,6 @@ vestra.playback | copy-path | Copy to Clipboard ▸ Full Path
330
307
  host | play-pause | Playback ▸ Play/Pause | Space, Mouse:LeftClick
331
308
  host | previous | Playback ▸ Previous | PageUp, Mouse:X2
332
309
  host | next | Playback ▸ Next | PageDown, Mouse:X1
333
- vestra.playback | keyframe-back | Playback ▸ Seek ▸ Previous Keyframe | Ctrl+Shift+ArrowLeft
334
- vestra.playback | keyframe-forward | Playback ▸ Seek ▸ Next Keyframe | Ctrl+Shift+ArrowRight
335
- vestra.playback | backward-2 | Playback ▸ Seek ▸ Back 30 s | Ctrl+ArrowLeft
336
- vestra.playback | forward-2 | Playback ▸ Seek ▸ Forward 30 s | Ctrl+ArrowRight
337
- vestra.playback | backward-3 | Playback ▸ Seek ▸ Back 60 s | Shift+ArrowLeft
338
- vestra.playback | forward-3 | Playback ▸ Seek ▸ Forward 60 s | Shift+ArrowRight
339
- vestra.playback | backward-4 | Playback ▸ Seek ▸ Back 300 s | Ctrl+Alt+ArrowLeft
340
- vestra.playback | forward-4 | Playback ▸ Seek ▸ Forward 300 s | Ctrl+Alt+ArrowRight
341
- vestra.subtitles | dialogue-previous | Playback ▸ Seek ▸ Previous Dialogue | Home
342
- vestra.subtitles | dialogue-next | Playback ▸ Seek ▸ Next Dialogue | End
343
- vestra.subtitles | dialogue-current | Playback ▸ Seek ▸ Current Subtitle Start | Ctrl+Home
344
- vestra.playback | jump-start | Playback ▸ Seek ▸ Jump to Start | Backspace
345
- vestra.playback | time-jump | Playback ▸ Seek ▸ Seek Steps…
346
- vestra.playback | jump | Playback ▸ Jump to Time… | G
347
- vestra.playback | rate-05 | Playback ▸ Speed ▸ 0.5×
348
- vestra.playback | rate-15 | Playback ▸ Speed ▸ 1.5×
349
- vestra.playback | rate-20 | Playback ▸ Speed ▸ 2×
350
- vestra.playback | rate-custom | Playback ▸ Speed ▸ Custom…
351
310
  vestra.playlist | playlist.add | Playback ▸ Playlist ▸ Add Files…
352
311
  vestra.playlist | playlist.link | Playback ▸ Playlist ▸ Add Link…
353
312
  vestra.playlist | playlist.add-folder | Playback ▸ Playlist ▸ Add Folder…
@@ -397,139 +356,19 @@ vestra.marks | ab.count.2 | Playback ▸ A-B Loop ▸ Loop Count ▸ 2 Times
397
356
  vestra.marks | ab.count.3 | Playback ▸ A-B Loop ▸ Loop Count ▸ 3 Times
398
357
  vestra.marks | ab.count.5 | Playback ▸ A-B Loop ▸ Loop Count ▸ 5 Times
399
358
  vestra.marks | ab.count.10 | Playback ▸ A-B Loop ▸ Loop Count ▸ 10 Times
400
- vestra.subtitles | show | Subtitles ▸ Show Subtitles | Alt+H
401
- vestra.subtitles | track-off | Subtitles ▸ Subtitle Track ▸ Off
402
- vestra.subtitles | track-cycle | Subtitles ▸ Subtitle Track ▸ Cycle | Alt+L
403
- vestra.subtitles | second-off | Subtitles ▸ Secondary Subtitle ▸ Off
404
- vestra.subtitles | second-position-top | Subtitles ▸ Secondary Subtitle ▸ Position ▸ Top
405
- vestra.subtitles | second-position-aboveMain | Subtitles ▸ Secondary Subtitle ▸ Position ▸ Above Main Subtitle
406
- vestra.subtitles | bold | Subtitles ▸ Subtitle Style ▸ Bold | Alt+B
407
- vestra.subtitles | size-up | Subtitles ▸ Subtitle Style ▸ Size + | Alt+PageUp
408
- vestra.subtitles | size-down | Subtitles ▸ Subtitle Style ▸ Size − | Alt+PageDown
409
- vestra.subtitles | move-up | Subtitles ▸ Subtitle Style ▸ Move Up
410
- vestra.subtitles | move-down | Subtitles ▸ Subtitle Style ▸ Move Down
411
- vestra.subtitles | shadow | Subtitles ▸ Subtitle Style ▸ Shadow
412
- vestra.subtitles | box | Subtitles ▸ Subtitle Style ▸ Opaque Box
413
- vestra.subtitles | ass-original | Subtitles ▸ Original ASS/SSA Styles
414
- vestra.subtitles | sync-earlier | Subtitles ▸ Sync ▸ Earlier 0.5 s | .
415
- vestra.subtitles | sync-later | Subtitles ▸ Sync ▸ Later 0.5 s | ,
416
- vestra.subtitles | sync-input | Subtitles ▸ Sync ▸ Adjust Sync…
417
359
  vestra.subtitle-online | search | Subtitles ▸ Online Subtitles ▸ Search and Download Subtitles…
418
360
  vestra.subtitle-online | settings | Subtitles ▸ Online Subtitles ▸ Online Subtitle Settings…
419
- vestra.subtitles | reload | Subtitles ▸ Reload Subtitles | Ctrl+Alt+Y
420
- vestra.subtitles | refresh | Subtitles ▸ Refresh Subtitle Tracks
421
- vestra.subtitles | tune | Subtitles ▸ Subtitle Tuning…
422
- vestra.subtitles | settings | Subtitles ▸ Subtitle Settings…
423
- vestra.video | video.shader.use | Video ▸ Pixel Shaders ▸ Use Shaders | Shift+P
424
- vestra.video | video.shader.list | Video ▸ Pixel Shaders ▸ Shader List…
425
- vestra.video | video.shader.folder | Video ▸ Pixel Shaders ▸ Open Shader Folder
426
- vestra.video | video.shader.reload | Video ▸ Pixel Shaders ▸ Reload Shaders
427
- vestra.video | video.hdr.auto | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Auto
428
- vestra.video | video.hdr.off | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Off
429
- vestra.video | video.hdr.bt.2390 | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ BT.2390
430
- vestra.video | video.hdr.hable | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Hable
431
- vestra.video | video.hdr.mobius | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Mobius
432
- vestra.video | video.hdr.reinhard | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Reinhard
433
- vestra.video | video.hdr.clip | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Clip
434
- vestra.video | video.hdr.peak | Video ▸ Pixel Shaders ▸ HDR Tone Mapping ▸ Dynamic Peak Detection
435
- vestra.video | video.hdr.settings | Video ▸ Pixel Shaders ▸ HDR Settings…
436
- vestra.video | video.deinterlace.cycle | Video ▸ Deinterlace ▸ Cycle | Ctrl+I
437
- vestra.video | video.deinterlace.auto | Video ▸ Deinterlace ▸ Auto
438
- vestra.video | video.deinterlace.on | Video ▸ Deinterlace ▸ Always
439
- vestra.video | video.deinterlace.off | Video ▸ Deinterlace ▸ Never
440
- vestra.video | video.deinterlace.output.frame | Video ▸ Deinterlace ▸ Output ▸ By Frame
441
- vestra.video | video.deinterlace.output.field | Video ▸ Deinterlace ▸ Output ▸ By Field (Double Rate)
442
- vestra.video | video.fit.keep | Video ▸ Aspect ▸ Keep Aspect Ratio
443
- vestra.video | video.fit.stretch | Video ▸ Aspect ▸ Ignore Aspect Ratio
444
- vestra.video | video.fit.fill | Video ▸ Aspect ▸ Fill Window (Crop Excess)
445
- vestra.video | video.aspect.cycle | Video ▸ Aspect ▸ Cycle Aspect Ratio | Shift+F6
446
- vestra.video | video.aspect.default | Video ▸ Aspect ▸ Default (Source)
447
- vestra.video | video.aspect.0 | Video ▸ Aspect ▸ 4:3
448
- vestra.video | video.aspect.1 | Video ▸ Aspect ▸ 16:9
449
- vestra.video | video.aspect.2 | Video ▸ Aspect ▸ 16:10
450
- vestra.video | video.aspect.3 | Video ▸ Aspect ▸ 1.85:1
451
- vestra.video | video.aspect.4 | Video ▸ Aspect ▸ 2.35:1
452
- vestra.video | video.aspect.custom | Video ▸ Aspect ▸ Custom (x:y)
453
- vestra.video | video.aspect.edit | Video ▸ Aspect ▸ Custom Aspect Ratio…
454
- vestra.video | video.reframe.none | Video ▸ Crop/Stretch ▸ None
455
- vestra.video | video.reframe.pad.0 | Video ▸ Crop/Stretch ▸ Stretch to 4:3
456
- vestra.video | video.reframe.pad.1 | Video ▸ Crop/Stretch ▸ Stretch to 16:9
457
- vestra.video | video.reframe.pad.2 | Video ▸ Crop/Stretch ▸ Stretch to 16:10
458
- vestra.video | video.reframe.pad.3 | Video ▸ Crop/Stretch ▸ Stretch to 1.85:1
459
- vestra.video | video.reframe.pad.4 | Video ▸ Crop/Stretch ▸ Stretch to 2.35:1
460
- vestra.video | video.reframe.crop.0 | Video ▸ Crop/Stretch ▸ Crop to 4:3
461
- vestra.video | video.reframe.crop.1 | Video ▸ Crop/Stretch ▸ Crop to 16:9
462
- vestra.video | video.reframe.crop.2 | Video ▸ Crop/Stretch ▸ Crop to 16:10
463
- vestra.video | video.reframe.crop.3 | Video ▸ Crop/Stretch ▸ Crop to 1.85:1
464
- vestra.video | video.reframe.crop.4 | Video ▸ Crop/Stretch ▸ Crop to 2.35:1
465
- vestra.video | video.reframe.left | Video ▸ Crop/Stretch ▸ Move Left
466
- vestra.video | video.reframe.right | Video ▸ Crop/Stretch ▸ Move Right
467
- vestra.video | video.reframe.up | Video ▸ Crop/Stretch ▸ Move Up
468
- vestra.video | video.reframe.down | Video ▸ Crop/Stretch ▸ Move Down
469
- vestra.video | video.frame.zoom-in | Video ▸ Framing ▸ Zoom In | Numpad9, Alt+Plus
470
- vestra.video | video.frame.zoom-out | Video ▸ Framing ▸ Zoom Out | Numpad1, Alt+-
471
- vestra.video | video.frame.right | Video ▸ Framing ▸ Pan → | Ctrl+Numpad6, Alt+ArrowRight
472
- vestra.video | video.frame.left | Video ▸ Framing ▸ Pan ← | Ctrl+Numpad4, Alt+ArrowLeft
473
- vestra.video | video.frame.up | Video ▸ Framing ▸ Pan ↑ | Ctrl+Numpad8, Alt+ArrowUp
474
- vestra.video | video.frame.down | Video ▸ Framing ▸ Pan ↓ | Ctrl+Numpad2, Alt+ArrowDown
475
- vestra.video | video.frame.centre | Video ▸ Framing ▸ Center Frame | Ctrl+Numpad5
476
- vestra.video | video.flip.vertical | Video ▸ Image Processing ▸ Flip Vertically | Ctrl+P
477
- vestra.video | video.flip.horizontal | Video ▸ Image Processing ▸ Flip Horizontally | Ctrl+Z
478
- vestra.video | video.gaussian | Video ▸ Image Processing ▸ Gaussian Blur | Ctrl+B
479
- vestra.video | video.sharpen | Video ▸ Image Processing ▸ Sharpen | Ctrl+R
480
- vestra.video | video.edge | Video ▸ Image Processing ▸ Edge Sharpen
481
- vestra.video | video.deblock | Video ▸ Image Processing ▸ Deblock | Ctrl+H
482
- vestra.video | video.deband | Video ▸ Image Processing ▸ Deband
483
- vestra.video | video.denoise.d3 | Video ▸ Image Processing ▸ 3D Denoise | Ctrl+N
484
- vestra.video | video.denoise.gradual | Video ▸ Image Processing ▸ Gradual Denoise
485
- vestra.video | video.denoise.temporal | Video ▸ Image Processing ▸ Temporal Denoise | Ctrl+M
486
- vestra.video | video.frame-blend | Video ▸ Image Processing ▸ Frame Doubling
487
- vestra.video | video.interpolation | Video ▸ Image Processing ▸ Motion Interpolation
488
- vestra.video | video.rotate.cycle | Video ▸ Rotation ▸ Cycle | Alt+K
489
- vestra.video | video.rotate.0 | Video ▸ Rotation ▸ No Rotation
490
- vestra.video | video.rotate.90 | Video ▸ Rotation ▸ 90°
491
- vestra.video | video.rotate.180 | Video ▸ Rotation ▸ 180°
492
- vestra.video | video.rotate.270 | Video ▸ Rotation ▸ 270°
361
+ vestra.subtitles | track-off | Subtitle Track ▸ Off
493
362
  vestra.capture | capture.save | Video ▸ Snapshot ▸ Save Current Frame | Ctrl+E
494
363
  vestra.capture | capture.panel | Video ▸ Snapshot ▸ Capture… | Alt+S
495
364
  vestra.capture | capture.copy | Video ▸ Snapshot ▸ Copy Current Frame | Ctrl+C
496
365
  vestra.capture | capture.burst | Video ▸ Snapshot ▸ Burst… | Ctrl+G
497
366
  vestra.capture | capture.clip | Video ▸ Snapshot ▸ Export Clip…
498
- vestra.video | video.picture | Video ▸ Picture Adjustments…
499
- vestra.video | video.brightness.down | Video ▸ Brightness -1% | W
500
- vestra.video | video.brightness.up | Video ▸ Brightness +1% | E
501
- vestra.video | video.contrast.down | Video ▸ Contrast -1% | R
502
- vestra.video | video.contrast.up | Video ▸ Contrast +1% | T
503
- vestra.video | video.saturation.down | Video ▸ Saturation -1% | Y
504
- vestra.video | video.saturation.up | Video ▸ Saturation +1% | U
505
- vestra.video | video.hue.down | Video ▸ Hue -1% | I
506
- vestra.video | video.hue.up | Video ▸ Hue +1% | O
507
- vestra.video | video.gpu-rendering | Video ▸ GPU Rendering (Experimental)
508
367
  host | volume-up | Audio ▸ Volume + | ArrowUp, Mouse:WheelUp
509
368
  host | volume-down | Audio ▸ Volume − | ArrowDown, Mouse:WheelDown
510
369
  host | mute | Audio ▸ Mute | M
511
- vestra.audio | audio.workbench | Audio ▸ Audio Workbench…
512
- vestra.audio | audio.track.none | Audio ▸ Audio Track ▸ No Audio Tracks
513
- vestra.audio | audio.track.cycle | Audio ▸ Audio Track ▸ Cycle Tracks | Alt+A
514
- vestra.audio | audio.channels.stereo | Audio ▸ Audio Track ▸ Stereo
515
- vestra.audio | audio.channels.left | Audio ▸ Audio Track ▸ Left Channel
516
- vestra.audio | audio.channels.right | Audio ▸ Audio Track ▸ Right Channel
517
- vestra.audio | audio.channels.mono | Audio ▸ Audio Track ▸ Mono Mix
518
- vestra.audio | audio.channels.swap | Audio ▸ Audio Track ▸ Swap Left and Right
519
- vestra.audio | audio.device.none | Audio ▸ Output Device ▸ No Output Devices
520
- vestra.audio | audio.equalizer | Audio ▸ Equalizer | Shift+E
521
- vestra.audio | audio.preset.0 | Audio ▸ Preset ▸ Flat
522
- vestra.audio | audio.preset.1 | Audio ▸ Preset ▸ Voice
523
- vestra.audio | audio.preset.2 | Audio ▸ Preset ▸ Music
524
- vestra.audio | audio.preset.3 | Audio ▸ Preset ▸ Cinema
525
- vestra.audio | audio.sync.earlier | Audio ▸ Audio Sync ▸ 50 ms Earlier | >
526
- vestra.audio | audio.sync.later | Audio ▸ Audio Sync ▸ 50 ms Later | <
527
- vestra.audio | audio.sync.keep.none | Audio ▸ Audio Sync ▸ Don't Keep
528
- vestra.audio | audio.sync.keep.session | Audio ▸ Audio Sync ▸ Keep for This Run
529
- vestra.audio | audio.sync.keep.always | Audio ▸ Audio Sync ▸ Always Keep
530
- vestra.audio | audio.normalize | Audio ▸ Processing ▸ Normalize | Shift+N
531
- vestra.audio | audio.clarity | Audio ▸ Processing ▸ Crystalizer | Shift+C
532
370
  vestra.visualizer | audio-cover | Audio ▸ Show Album Cover for Audio Only
371
+ vestra.audio | audio.track.none | Audio Track ▸ No Audio Tracks
533
372
  host | fullscreen | Toggle Fullscreen | Escape
534
373
  vestra.window | pip | Screen ▸ Picture-in-Picture
535
374
  vestra.window | mini | Screen ▸ Mini Size | \`
@@ -550,6 +389,10 @@ vestra.window | top.never | Screen ▸ Always on Top ▸ Never
550
389
  vestra.window | top.always | Screen ▸ Always on Top ▸ Always
551
390
  vestra.window | top.playing | Screen ▸ Always on Top ▸ While Playing
552
391
  vestra.window | top.fullscreen | Screen ▸ Always on Top ▸ While Playing in Fullscreen
392
+ vestra.video | video.picture | Picture… | Alt+1
393
+ vestra.audio | audio.workbench | Audio… | Alt+2
394
+ vestra.subtitles | tune | Subtitles… | Alt+3
395
+ vestra.playback | panel | Playback… | Alt+4
553
396
  vestra.playlist | playlist.visibility | Playlist | F6
554
397
  vestra.info | info.toggle | Playback Info | Tab
555
398
  vestra.info | info.properties | Playback Properties… | Ctrl+F1
@@ -571,13 +414,6 @@ vestra.preferences | language.ko | Settings ▸ Language ▸ 한국어
571
414
  vestra.preferences | language.de | Settings ▸ Language ▸ Deutsch
572
415
  vestra.preferences | language.fr | Settings ▸ Language ▸ Français
573
416
  vestra.preferences | language.es | Settings ▸ Language ▸ Español
574
- vestra.subtitles | move-reset | Reset ▸ Subtitle Position | Alt+Home
575
- vestra.subtitles | sync-reset | Reset ▸ Subtitle Sync | /
576
- vestra.video | video.reset | Reset ▸ Picture | Q
577
- vestra.video | video.frame.reset | Reset ▸ Framing | Numpad5, Alt+Backspace
578
- vestra.video | video.reframe.reset | Reset ▸ Crop Position
579
- vestra.audio | audio.sync.reset | Reset ▸ Audio Sync | ?
580
- vestra.audio | audio.reset | Reset ▸ Audio Processing
581
417
  vestra.visualizer | reset-logo | Reset ▸ Idle Logo
582
418
  vestra.info | info.about | About Vestra Player… | F1
583
419
  vestra.info | info.update | Check for Updates…
@@ -594,6 +430,26 @@ host | seek-forward | (Forward 5 s) | ArrowRight
594
430
  host | rate-normal | (Normal) | Z
595
431
  host | rate-down | (Slower 0.1) | X
596
432
  host | rate-up | (Faster 0.1) | C
433
+ vestra.audio | audio.track.cycle | (Cycle Tracks) | Alt+A
434
+ vestra.audio | audio.channels.stereo | (Stereo)
435
+ vestra.audio | audio.channels.left | (Left Channel)
436
+ vestra.audio | audio.channels.right | (Right Channel)
437
+ vestra.audio | audio.channels.mono | (Mono Mix)
438
+ vestra.audio | audio.channels.swap | (Swap Left and Right)
439
+ vestra.audio | audio.equalizer | (Equalizer) | Shift+E
440
+ vestra.audio | audio.preset.0 | (Flat)
441
+ vestra.audio | audio.preset.1 | (Voice)
442
+ vestra.audio | audio.preset.2 | (Music)
443
+ vestra.audio | audio.preset.3 | (Cinema)
444
+ vestra.audio | audio.sync.earlier | (50 ms Earlier) | >
445
+ vestra.audio | audio.sync.later | (50 ms Later) | <
446
+ vestra.audio | audio.sync.reset | (Reset) | ?
447
+ vestra.audio | audio.sync.keep.none | (Don't Keep)
448
+ vestra.audio | audio.sync.keep.session | (Keep for This Run)
449
+ vestra.audio | audio.sync.keep.always | (Always Keep)
450
+ vestra.audio | audio.normalize | (Normalize) | Shift+N
451
+ vestra.audio | audio.clarity | (Crystalizer) | Shift+C
452
+ vestra.audio | audio.reset | (Reset)
597
453
  vestra.capture | capture.clipExport | (Export Clip Range) | Ctrl+Shift+E
598
454
  vestra.capture | capture.saveAs | (Save Current Frame As…)
599
455
  vestra.capture | capture.saveScreen | (Save Rendered Frame) | Ctrl+Alt+E
@@ -615,6 +471,21 @@ vestra.capture | capture.clipStart | (Set Clip Start)
615
471
  vestra.capture | capture.clipEnd | (Set Clip End)
616
472
  vestra.capture | capture.last30 | (Export Last 30 Seconds) | Ctrl+Shift+R
617
473
  vestra.info | info.brief | (Brief Info) | Shift+Tab
474
+ vestra.playback | keyframe-back | (Previous Keyframe) | Ctrl+Shift+ArrowLeft
475
+ vestra.playback | keyframe-forward | (Next Keyframe) | Ctrl+Shift+ArrowRight
476
+ vestra.playback | jump | (Jump to Time…) | G
477
+ vestra.playback | jump-start | (Jump to Start) | Backspace
478
+ vestra.playback | time-jump | (Seek Steps…)
479
+ vestra.playback | rate-05 | (0.5×)
480
+ vestra.playback | rate-15 | (1.5×)
481
+ vestra.playback | rate-20 | (2×)
482
+ vestra.playback | rate-custom | (Custom…)
483
+ vestra.playback | backward-2 | (Back 30 s) | Ctrl+ArrowLeft
484
+ vestra.playback | forward-2 | (Forward 30 s) | Ctrl+ArrowRight
485
+ vestra.playback | backward-3 | (Back 60 s) | Shift+ArrowLeft
486
+ vestra.playback | forward-3 | (Forward 60 s) | Shift+ArrowRight
487
+ vestra.playback | backward-4 | (Back 300 s) | Ctrl+Alt+ArrowLeft
488
+ vestra.playback | forward-4 | (Forward 300 s) | Ctrl+Alt+ArrowRight
618
489
  vestra.playlist | playlist.play | (Play) | Enter, P | panel
619
490
  vestra.playlist | playlist.list-add | (Add Files…) | Ctrl+I | panel
620
491
  vestra.playlist | playlist.list-add-folder | (Add Folder…) | Ctrl+O | panel
@@ -646,6 +517,114 @@ vestra.playlist | playlist.list-open-list | (Open List File…) | F3 | panel
646
517
  vestra.playlist | playlist.list-save-list | (Save List…) | F2 | panel
647
518
  vestra.playlist | playlist.close | (Close List) | F6 | panel
648
519
  vestra.playlist | playlist.settings | (Playlist Settings…) | F5 | panel
520
+ vestra.subtitles | show | (Show Subtitles) | Alt+H
521
+ vestra.subtitles | second-off | (Off)
522
+ vestra.subtitles | second-position-top | (Top)
523
+ vestra.subtitles | second-position-aboveMain | (Above Main Subtitle)
524
+ vestra.subtitles | track-cycle | (Cycle) | Alt+L
525
+ vestra.subtitles | size-up | (Size +) | Alt+PageUp
526
+ vestra.subtitles | size-down | (Size −) | Alt+PageDown
527
+ vestra.subtitles | move-up | (Move Up)
528
+ vestra.subtitles | move-down | (Move Down)
529
+ vestra.subtitles | move-reset | (Subtitle Position) | Alt+Home
530
+ vestra.subtitles | bold | (Bold) | Alt+B
531
+ vestra.subtitles | shadow | (Shadow)
532
+ vestra.subtitles | box | (Opaque Box)
533
+ vestra.subtitles | ass-original | (Original ASS/SSA Styles)
534
+ vestra.subtitles | dialogue-previous | (Previous Dialogue) | Home
535
+ vestra.subtitles | dialogue-next | (Next Dialogue) | End
536
+ vestra.subtitles | dialogue-current | (Current Subtitle Start) | Ctrl+Home
537
+ vestra.subtitles | sync-reset | (Subtitle Sync) | /
538
+ vestra.subtitles | sync-input | (Adjust Sync…)
539
+ vestra.subtitles | reload | (Reload Subtitles) | Ctrl+Alt+Y
540
+ vestra.subtitles | refresh | (Refresh Subtitle Tracks)
541
+ vestra.subtitles | remove | (Remove External Subtitle)
542
+ vestra.subtitles | settings | (Subtitle Settings…)
543
+ vestra.subtitles | sync-earlier | (Earlier 0.5 s) | .
544
+ vestra.subtitles | sync-later | (Later 0.5 s) | ,
545
+ vestra.video | video.shader.use | (Use Shaders) | Shift+P
546
+ vestra.video | video.shader.list | (Shader List…)
547
+ vestra.video | video.shader.folder | (Open Shader Folder)
548
+ vestra.video | video.shader.reload | (Reload Shaders)
549
+ vestra.video | video.hdr.auto | (Auto)
550
+ vestra.video | video.hdr.off | (Off)
551
+ vestra.video | video.hdr.bt.2390 | (BT.2390)
552
+ vestra.video | video.hdr.hable | (Hable)
553
+ vestra.video | video.hdr.mobius | (Mobius)
554
+ vestra.video | video.hdr.reinhard | (Reinhard)
555
+ vestra.video | video.hdr.clip | (Clip)
556
+ vestra.video | video.hdr.peak | (Dynamic Peak Detection)
557
+ vestra.video | video.hdr.settings | (HDR Settings…)
558
+ vestra.video | video.deinterlace.cycle | (Cycle) | Ctrl+I
559
+ vestra.video | video.deinterlace.auto | (Auto)
560
+ vestra.video | video.deinterlace.on | (Always)
561
+ vestra.video | video.deinterlace.off | (Never)
562
+ vestra.video | video.deinterlace.output.frame | (By Frame)
563
+ vestra.video | video.deinterlace.output.field | (By Field (Double Rate))
564
+ vestra.video | video.fit.keep | (Keep Aspect Ratio)
565
+ vestra.video | video.fit.stretch | (Ignore Aspect Ratio)
566
+ vestra.video | video.fit.fill | (Fill Window (Crop Excess))
567
+ vestra.video | video.aspect.cycle | (Cycle Aspect Ratio) | Shift+F6
568
+ vestra.video | video.aspect.default | (Default (Source))
569
+ vestra.video | video.aspect.0 | (4:3)
570
+ vestra.video | video.aspect.1 | (16:9)
571
+ vestra.video | video.aspect.2 | (16:10)
572
+ vestra.video | video.aspect.3 | (1.85:1)
573
+ vestra.video | video.aspect.4 | (2.35:1)
574
+ vestra.video | video.aspect.custom | (Custom (x:y))
575
+ vestra.video | video.aspect.edit | (Custom Aspect Ratio…)
576
+ vestra.video | video.reframe.none | (None)
577
+ vestra.video | video.reframe.pad.0 | (Stretch to 4:3)
578
+ vestra.video | video.reframe.pad.1 | (Stretch to 16:9)
579
+ vestra.video | video.reframe.pad.2 | (Stretch to 16:10)
580
+ vestra.video | video.reframe.pad.3 | (Stretch to 1.85:1)
581
+ vestra.video | video.reframe.pad.4 | (Stretch to 2.35:1)
582
+ vestra.video | video.reframe.crop.0 | (Crop to 4:3)
583
+ vestra.video | video.reframe.crop.1 | (Crop to 16:9)
584
+ vestra.video | video.reframe.crop.2 | (Crop to 16:10)
585
+ vestra.video | video.reframe.crop.3 | (Crop to 1.85:1)
586
+ vestra.video | video.reframe.crop.4 | (Crop to 2.35:1)
587
+ vestra.video | video.reframe.left | (Move Left)
588
+ vestra.video | video.reframe.right | (Move Right)
589
+ vestra.video | video.reframe.up | (Move Up)
590
+ vestra.video | video.reframe.down | (Move Down)
591
+ vestra.video | video.reframe.reset | (Crop Position)
592
+ vestra.video | video.frame.zoom-in | (Zoom In) | Alt+Plus, Numpad9
593
+ vestra.video | video.frame.zoom-out | (Zoom Out) | Alt+-, Numpad1
594
+ vestra.video | video.frame.right | (Pan →) | Alt+ArrowRight, Ctrl+Numpad6
595
+ vestra.video | video.frame.left | (Pan ←) | Alt+ArrowLeft, Ctrl+Numpad4
596
+ vestra.video | video.frame.up | (Pan ↑) | Alt+ArrowUp, Ctrl+Numpad8
597
+ vestra.video | video.frame.down | (Pan ↓) | Alt+ArrowDown, Ctrl+Numpad2
598
+ vestra.video | video.frame.centre | (Center Frame) | Ctrl+Numpad5
599
+ vestra.video | video.frame.reset | (Framing) | Alt+Backspace, Numpad5
600
+ vestra.video | video.flip.vertical | (Flip Vertically) | Ctrl+P
601
+ vestra.video | video.flip.horizontal | (Flip Horizontally) | Ctrl+Z
602
+ vestra.video | video.gaussian | (Gaussian Blur) | Ctrl+B
603
+ vestra.video | video.sharpen | (Sharpen) | Ctrl+R
604
+ vestra.video | video.edge | (Edge Sharpen)
605
+ vestra.video | video.deblock | (Deblock) | Ctrl+H
606
+ vestra.video | video.deband | (Deband)
607
+ vestra.video | video.denoise.d3 | (3D Denoise) | Ctrl+N
608
+ vestra.video | video.denoise.gradual | (Gradual Denoise)
609
+ vestra.video | video.denoise.temporal | (Temporal Denoise) | Ctrl+M
610
+ vestra.video | video.frame-blend | (Frame Doubling)
611
+ vestra.video | video.interpolation | (Motion Interpolation)
612
+ vestra.video | video.rotate.cycle | (Cycle) | Alt+K
613
+ vestra.video | video.rotate.0 | (No Rotation)
614
+ vestra.video | video.rotate.90 | (90°)
615
+ vestra.video | video.rotate.180 | (180°)
616
+ vestra.video | video.rotate.270 | (270°)
617
+ vestra.video | video.reset | (Picture) | Q
618
+ vestra.video | video.resetPanel | (Picture Panel)
619
+ vestra.video | video.brightness.down | (Brightness -1%) | W
620
+ vestra.video | video.brightness.up | (Brightness +1%) | E
621
+ vestra.video | video.contrast.down | (Contrast -1%) | R
622
+ vestra.video | video.contrast.up | (Contrast +1%) | T
623
+ vestra.video | video.saturation.down | (Saturation -1%) | Y
624
+ vestra.video | video.saturation.up | (Saturation +1%) | U
625
+ vestra.video | video.hue.down | (Hue -1%) | I
626
+ vestra.video | video.hue.up | (Hue +1%) | O
627
+ vestra.video | video.gpu-rendering | (GPU Rendering (Experimental))
649
628
  `;
650
629
  /**
651
630
  * The commands the player and its built-in plugins register when the
Binary file
@@ -13,7 +13,9 @@ const SDK_DIRECTORY = fileURLToPath(new URL("..", import.meta.url));
13
13
  export const WAKE_EVENTS = [
14
14
  "packages.changed",
15
15
  "bindings.changed",
16
- // Player 0.7.6: sent only to the plugin whose own keys changed.
16
+ // Player 0.7.6: sent to a plugin whose own keys changed and, from SDK
17
+ // 1.6.16, to every listener when a player command (`host/<id>`) is
18
+ // rebound, which wakes each parked listener.
17
19
  "commands.keys",
18
20
  "appearance.changed",
19
21
  "resolvers.fileTypes",
@@ -2557,8 +2557,9 @@ export declare class TestHost implements Transport {
2557
2557
  */
2558
2558
  get conflicts(): string[][];
2559
2559
  /**
2560
- * Change the keys of one of the plugin's commands as the user does in
2561
- * Keyboard Shortcuts (SDK 1.6.6): `inputs` replaces its keys (`[]`
2560
+ * Change the keys of one of the plugin's commands, or of one of the
2561
+ * player's core commands by its `host/<id>` (SDK 1.6.16), as the user
2562
+ * does in Keyboard Shortcuts (SDK 1.6.6): `inputs` replaces its keys (`[]`
2562
2563
  * clears them, as Ignore Default Shortcuts does for every default),
2563
2564
  * `null` gives it its own defaults back. It writes
2564
2565
  * {@link TestHost.bindings | bindings.overlay}, and the plugin hears it
@@ -2580,7 +2581,8 @@ export declare class TestHost implements Transport {
2580
2581
  * ```
2581
2582
  *
2582
2583
  * @capability None.
2583
- * @throws `Error` `command` is not a command of the plugin.
2584
+ * @throws `Error` `command` is neither a command of the plugin nor a
2585
+ * core command.
2584
2586
  * @since 1.6.6
2585
2587
  */
2586
2588
  rebind(command: string, inputs: readonly string[] | null): void;
@@ -3244,8 +3244,9 @@ export class TestHost {
3244
3244
  return this.coreCommands.has(id) ? id : `${this.manifestId}/${id}`;
3245
3245
  }
3246
3246
  /**
3247
- * Change the keys of one of the plugin's commands as the user does in
3248
- * Keyboard Shortcuts (SDK 1.6.6): `inputs` replaces its keys (`[]`
3247
+ * Change the keys of one of the plugin's commands, or of one of the
3248
+ * player's core commands by its `host/<id>` (SDK 1.6.16), as the user
3249
+ * does in Keyboard Shortcuts (SDK 1.6.6): `inputs` replaces its keys (`[]`
3249
3250
  * clears them, as Ignore Default Shortcuts does for every default),
3250
3251
  * `null` gives it its own defaults back. It writes
3251
3252
  * {@link TestHost.bindings | bindings.overlay}, and the plugin hears it
@@ -3267,11 +3268,12 @@ export class TestHost {
3267
3268
  * ```
3268
3269
  *
3269
3270
  * @capability None.
3270
- * @throws `Error` `command` is not a command of the plugin.
3271
+ * @throws `Error` `command` is neither a command of the plugin nor a
3272
+ * core command.
3271
3273
  * @since 1.6.6
3272
3274
  */
3273
3275
  rebind(command, inputs) {
3274
- if (!this.commands.has(command))
3276
+ if (!this.commands.has(command) && !this.coreCommands.has(command))
3275
3277
  throw new Error(`test host: no command ${command}`);
3276
3278
  const key = this.#bindingKey(command);
3277
3279
  if (inputs === null)
@@ -3287,15 +3289,19 @@ export class TestHost {
3287
3289
  #keysRevision = 0;
3288
3290
  /**
3289
3291
  * `commands.keys` as the player answers it: each of the plugin's own
3290
- * commands with the labels of the keys it holds now (the overlay, else
3291
- * its defaults; not a key an earlier command holds), as menus write
3292
- * them on `systemInfo.os`.
3292
+ * commands, and the player's core commands as `host/<id>` (SDK 1.6.16),
3293
+ * with the labels of the keys it holds now (the overlay, else its
3294
+ * defaults; not a key an earlier command holds), as menus write them on
3295
+ * `systemInfo.os`.
3293
3296
  */
3294
3297
  #keys() {
3295
3298
  const claims = this.#claims();
3296
3299
  const mac = this.systemInfo.os === "macos";
3297
3300
  const keys = {};
3298
- for (const [id, { declaration }] of this.commands) {
3301
+ for (const [id, { declaration }] of [
3302
+ ...this.commands,
3303
+ ...this.coreCommands,
3304
+ ]) {
3299
3305
  const scope = declaration.focus ? "panel" : "global";
3300
3306
  const current = this.bindings.overlay.get(this.#bindingKey(id)) ??
3301
3307
  declaration.bindings ??
@@ -1470,8 +1470,11 @@ export interface Commands {
1470
1470
  * player, and until its answer arrives (a few milliseconds) every
1471
1471
  * command reads `[]`; a binding that read it runs again then.
1472
1472
  *
1473
- * Only the plugin's own commands: an id the plugin has not added (or
1474
- * another plugin's) reads `[]`. Needs nothing beyond `commands`, not
1473
+ * The plugin's own commands, and the player's own as `host/<id>` (SDK
1474
+ * 1.6.16; `host/volume-up`, `host/mute`: the ids of
1475
+ * {@link "@vestra-player/sdk/testing"!BUILTIN_COMMANDS | BUILTIN_COMMANDS} rows owned by `host`), for a panel that
1476
+ * shows the player's keys beside its own controls; an id the plugin has
1477
+ * not added (or another plugin's) reads `[]`. Needs nothing beyond `commands`, not
1475
1478
  * `bindings.manage` (the whole binding table, every plugin's, is
1476
1479
  * {@link Bindings.list}). Without the `commands` capability every
1477
1480
  * command reads `[]`. Players before 0.7.6 have no `keys` (the player
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vestra Player SDK
2
2
 
3
- > @vestra-player/sdk 1.6.15: write plugins for Vestra Player in TypeScript (plugin API `vestra/1`). A plugin is a folder with `manifest.json` and an entry module whose default export `activate(plugin)` the player calls. The documentation is a tree of short pages read by path, like `go doc`: the same pages and API as https://vestrasys.github.io/vestra-player-sdk/.
3
+ > @vestra-player/sdk 1.6.16: write plugins for Vestra Player in TypeScript (plugin API `vestra/1`). A plugin is a folder with `manifest.json` and an entry module whose default export `activate(plugin)` the player calls. The documentation is a tree of short pages read by path, like `go doc`: the same pages and API as https://vestrasys.github.io/vestra-player-sdk/.
4
4
 
5
5
  ## Read the documentation
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vestra-player/sdk",
3
- "version": "1.6.15",
3
+ "version": "1.6.16",
4
4
  "description": "Plugin API types, test host and plugin CLI for Vestra Player (apiVersion vestra/1)",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {