streamit-player 1.0.0

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.
Files changed (118) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +203 -0
  3. package/README.md +552 -0
  4. package/dist/Player-BfmqCREY.cjs +11616 -0
  5. package/dist/Player-YpukGRGt.js +11617 -0
  6. package/dist/PlayerController-Bt7Po42U.cjs +14093 -0
  7. package/dist/PlayerController-CW0pxrIt.js +14072 -0
  8. package/dist/core/index.cjs +194 -0
  9. package/dist/core/index.js +194 -0
  10. package/dist/core/src/AdScheduler.d.ts +56 -0
  11. package/dist/core/src/AdScheduler.d.ts.map +1 -0
  12. package/dist/core/src/AdsController.d.ts +48 -0
  13. package/dist/core/src/AdsController.d.ts.map +1 -0
  14. package/dist/core/src/AdsManager.d.ts +181 -0
  15. package/dist/core/src/AdsManager.d.ts.map +1 -0
  16. package/dist/core/src/DrmManager.d.ts +162 -0
  17. package/dist/core/src/DrmManager.d.ts.map +1 -0
  18. package/dist/core/src/DrmValidator.d.ts +36 -0
  19. package/dist/core/src/DrmValidator.d.ts.map +1 -0
  20. package/dist/core/src/KeyboardManager.d.ts +73 -0
  21. package/dist/core/src/KeyboardManager.d.ts.map +1 -0
  22. package/dist/core/src/PictureInPictureManager.d.ts +47 -0
  23. package/dist/core/src/PictureInPictureManager.d.ts.map +1 -0
  24. package/dist/core/src/PlayerController.d.ts +231 -0
  25. package/dist/core/src/PlayerController.d.ts.map +1 -0
  26. package/dist/core/src/PlaylistManager.d.ts +63 -0
  27. package/dist/core/src/PlaylistManager.d.ts.map +1 -0
  28. package/dist/core/src/SourceManager.d.ts +142 -0
  29. package/dist/core/src/SourceManager.d.ts.map +1 -0
  30. package/dist/core/src/SubtitleManager.d.ts +77 -0
  31. package/dist/core/src/SubtitleManager.d.ts.map +1 -0
  32. package/dist/core/src/TimelineMath.d.ts +14 -0
  33. package/dist/core/src/TimelineMath.d.ts.map +1 -0
  34. package/dist/core/src/html-overlay/HtmlOverlayRenderer.d.ts +103 -0
  35. package/dist/core/src/html-overlay/HtmlOverlayRenderer.d.ts.map +1 -0
  36. package/dist/core/src/index.d.ts +21 -0
  37. package/dist/core/src/index.d.ts.map +1 -0
  38. package/dist/core/src/providers/ImaProvider.d.ts +135 -0
  39. package/dist/core/src/providers/ImaProvider.d.ts.map +1 -0
  40. package/dist/core/src/providers/ThumbnailProviders.d.ts +102 -0
  41. package/dist/core/src/providers/ThumbnailProviders.d.ts.map +1 -0
  42. package/dist/core/src/providers/VastProvider.d.ts +202 -0
  43. package/dist/core/src/providers/VastProvider.d.ts.map +1 -0
  44. package/dist/core/src/providers/VmapProvider.d.ts +98 -0
  45. package/dist/core/src/providers/VmapProvider.d.ts.map +1 -0
  46. package/dist/core/src/providers/fetchXmlWithPolicy.d.ts +9 -0
  47. package/dist/core/src/providers/fetchXmlWithPolicy.d.ts.map +1 -0
  48. package/dist/core/src/simid/SimidBridge.d.ts +44 -0
  49. package/dist/core/src/simid/SimidBridge.d.ts.map +1 -0
  50. package/dist/core/src/simid/SimidManager.d.ts +21 -0
  51. package/dist/core/src/simid/SimidManager.d.ts.map +1 -0
  52. package/dist/core/src/simid/SimidRuntime.d.ts +113 -0
  53. package/dist/core/src/simid/SimidRuntime.d.ts.map +1 -0
  54. package/dist/core/src/simid/SimidSession.d.ts +48 -0
  55. package/dist/core/src/simid/SimidSession.d.ts.map +1 -0
  56. package/dist/core/src/simid/types.d.ts +115 -0
  57. package/dist/core/src/simid/types.d.ts.map +1 -0
  58. package/dist/core/src/storage.d.ts +10 -0
  59. package/dist/core/src/storage.d.ts.map +1 -0
  60. package/dist/core/src/types.d.ts +1403 -0
  61. package/dist/core/src/types.d.ts.map +1 -0
  62. package/dist/core/src/utils.d.ts +34 -0
  63. package/dist/core/src/utils.d.ts.map +1 -0
  64. package/dist/core/src/vendorLoaders.d.ts +16 -0
  65. package/dist/core/src/vendorLoaders.d.ts.map +1 -0
  66. package/dist/index.cjs +55 -0
  67. package/dist/index.js +55 -0
  68. package/dist/src/index.d.ts +3 -0
  69. package/dist/src/index.d.ts.map +1 -0
  70. package/dist/streamit-player.esm.js +26226 -0
  71. package/dist/streamit-player.esm.min.js +18830 -0
  72. package/dist/streamit-player.iife.js +26229 -0
  73. package/dist/streamit-player.iife.min.js +4750 -0
  74. package/dist/web-components/index.cjs +15 -0
  75. package/dist/web-components/index.js +15 -0
  76. package/dist/web-components/src/ChaptersButton.d.ts +27 -0
  77. package/dist/web-components/src/ChaptersButton.d.ts.map +1 -0
  78. package/dist/web-components/src/ChaptersButton.styles.d.ts +2 -0
  79. package/dist/web-components/src/ChaptersButton.styles.d.ts.map +1 -0
  80. package/dist/web-components/src/PlayButton.d.ts +17 -0
  81. package/dist/web-components/src/PlayButton.d.ts.map +1 -0
  82. package/dist/web-components/src/PlayButton.styles.d.ts +2 -0
  83. package/dist/web-components/src/PlayButton.styles.d.ts.map +1 -0
  84. package/dist/web-components/src/Player.d.ts +271 -0
  85. package/dist/web-components/src/Player.d.ts.map +1 -0
  86. package/dist/web-components/src/Player.styles.d.ts +2 -0
  87. package/dist/web-components/src/Player.styles.d.ts.map +1 -0
  88. package/dist/web-components/src/SeekButton.d.ts +18 -0
  89. package/dist/web-components/src/SeekButton.d.ts.map +1 -0
  90. package/dist/web-components/src/SeekButton.styles.d.ts +2 -0
  91. package/dist/web-components/src/SeekButton.styles.d.ts.map +1 -0
  92. package/dist/web-components/src/Seekbar.d.ts +101 -0
  93. package/dist/web-components/src/Seekbar.d.ts.map +1 -0
  94. package/dist/web-components/src/Seekbar.styles.d.ts +2 -0
  95. package/dist/web-components/src/Seekbar.styles.d.ts.map +1 -0
  96. package/dist/web-components/src/Themes.d.ts +5 -0
  97. package/dist/web-components/src/Themes.d.ts.map +1 -0
  98. package/dist/web-components/src/VerticalControls.d.ts +49 -0
  99. package/dist/web-components/src/VerticalControls.d.ts.map +1 -0
  100. package/dist/web-components/src/VerticalControls.styles.d.ts +2 -0
  101. package/dist/web-components/src/VerticalControls.styles.d.ts.map +1 -0
  102. package/dist/web-components/src/VolumeControl.d.ts +21 -0
  103. package/dist/web-components/src/VolumeControl.d.ts.map +1 -0
  104. package/dist/web-components/src/VolumeControl.styles.d.ts +2 -0
  105. package/dist/web-components/src/VolumeControl.styles.d.ts.map +1 -0
  106. package/dist/web-components/src/icons/IconRegistry.d.ts +24 -0
  107. package/dist/web-components/src/icons/IconRegistry.d.ts.map +1 -0
  108. package/dist/web-components/src/index.d.ts +10 -0
  109. package/dist/web-components/src/index.d.ts.map +1 -0
  110. package/dist/web-components/src/player-internals/GestureController.d.ts +140 -0
  111. package/dist/web-components/src/player-internals/GestureController.d.ts.map +1 -0
  112. package/dist/web-components/src/player-internals/PrefetchController.d.ts +34 -0
  113. package/dist/web-components/src/player-internals/PrefetchController.d.ts.map +1 -0
  114. package/dist/web-components/src/player-internals/SettingsMenuController.d.ts +59 -0
  115. package/dist/web-components/src/player-internals/SettingsMenuController.d.ts.map +1 -0
  116. package/dist/web-components/src/player-internals/ThumbnailCache.d.ts +64 -0
  117. package/dist/web-components/src/player-internals/ThumbnailCache.d.ts.map +1 -0
  118. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeControl.styles.d.ts","sourceRoot":"","sources":["../../../web-components/src/VolumeControl.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAwLlB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { DirectiveResult } from 'lit/directive.js';
3
+ import { UnsafeSVGDirective } from 'lit/directives/unsafe-svg.js';
4
+
5
+ export type IconName = 'play' | 'pause' | 'replay' | 'loading' | 'volume' | 'volume-mute' | 'volume-low' | 'volume-medium' | 'settings' | 'settings-vertical' | 'fullscreen' | 'fullscreen-exit' | 'pip' | 'captions' | 'seek-backward' | 'seek-forward' | 'live' | 'playlist-prev' | 'playlist-next' | 'chapters' | 'markers' | 'arrow-back' | 'arrow-forward' | 'check' | 'audio-only' | 'speed-feedback';
6
+ export type IconValue = string | TemplateResult | Element | ((params?: Record<string, unknown>) => string | TemplateResult | Element);
7
+ export declare class IconRegistry {
8
+ private static globalPacks;
9
+ private static defaultIcons;
10
+ static registerDefaultIcon(name: IconName, value: IconValue): void;
11
+ static registerIconPack(packName: string, pack: Record<string, IconValue>): void;
12
+ static getGlobalPack(packName: string): Record<string, IconValue> | undefined;
13
+ static getDefaultIcon(name: IconName): IconValue | undefined;
14
+ }
15
+ export declare class PlayerIconRegistry {
16
+ private overrides;
17
+ private activePack;
18
+ constructor(configIcons?: Record<string, IconValue>, packName?: string);
19
+ setIcon(name: IconName, value: IconValue): void;
20
+ useIconPack(packName: string): void;
21
+ getIcon(name: IconName, params?: Record<string, unknown>): string | TemplateResult | Element;
22
+ }
23
+ export declare function renderIcon(value: IconValue): string | TemplateResult | Element | DirectiveResult<typeof UnsafeSVGDirective>;
24
+ //# sourceMappingURL=IconRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconRegistry.d.ts","sourceRoot":"","sources":["../../../../web-components/src/icons/IconRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAG3C,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,aAAa,GACb,YAAY,GACZ,eAAe,GACf,UAAU,GACV,mBAAmB,GACnB,YAAY,GACZ,iBAAiB,GACjB,KAAK,GACL,UAAU,GACV,eAAe,GACf,cAAc,GACd,MAAM,GACN,eAAe,GACf,eAAe,GACf,UAAU,GACV,SAAS,GACT,YAAY,GACZ,eAAe,GACf,OAAO,GACP,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,cAAc,GACd,OAAO,GACP,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC;AAE9E,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,WAAW,CAAgD;IAC1E,OAAO,CAAC,MAAM,CAAC,YAAY,CAAkC;WAE/C,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS;WAIpD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;WAIlE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS;WAItE,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS;CAGpE;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,UAAU,CAA0C;gBAEhD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM;IAW/D,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS;IAIxC,WAAW,CAAC,QAAQ,EAAE,MAAM;IAO5B,OAAO,CACZ,IAAI,EAAE,QAAQ,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,GAAG,cAAc,GAAG,OAAO;CAgBrC;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,GACf,MAAM,GAAG,cAAc,GAAG,OAAO,GAAG,eAAe,CAAC,OAAO,kBAAkB,CAAC,CAQhF"}
@@ -0,0 +1,10 @@
1
+ export { PlayerPlayer } from './Player';
2
+ export { PlayerPlayButton } from './PlayButton';
3
+ export { PlayerSeekbar } from './Seekbar';
4
+ export { PlayerVolumeControl } from './VolumeControl';
5
+ export { PlayerSeekButton } from './SeekButton';
6
+ export { PlayerChaptersButton } from './ChaptersButton';
7
+ export { PlayerVerticalControls } from './VerticalControls';
8
+ export { THEME_PRESETS, compileTheme } from './Themes';
9
+ export * from './icons/IconRegistry';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../web-components/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { PlayerConfiguration, PlayerController, PlayerState } from '../../../core/src/index';
2
+ import { PrefetchController } from './PrefetchController';
3
+ import { SettingsMenuController } from './SettingsMenuController';
4
+ import { ThumbnailCache } from './ThumbnailCache';
5
+
6
+ export type SpeedLockState = 'IDLE' | 'HOLDING' | 'READY_TO_LOCK' | 'LOCKED' | 'LOCKED_HOLDING' | 'READY_TO_UNLOCK';
7
+ /**
8
+ * The slice of the `<player-player>` element the gesture layer drives.
9
+ *
10
+ * It extends HTMLElement because the gestures are bound to the host itself
11
+ * (wheel / swipe) as well as to the inner <video>. Everything reactive that a
12
+ * gesture writes (`speedLockState`, `isVisualTransitioning`, ...) stays a Lit
13
+ * `@state()` on the element; this controller owns the transitions between those
14
+ * values, not their storage.
15
+ */
16
+ export interface GestureHost extends HTMLElement {
17
+ readonly playerState: PlayerState;
18
+ readonly controller: PlayerController;
19
+ config?: PlayerConfiguration;
20
+ displayMode: 'standard' | 'vertical' | 'audio-only' | 'custom' | 'mini' | 'floating';
21
+ readonly videoElement: HTMLVideoElement;
22
+ readonly updateComplete: Promise<boolean>;
23
+ isVisualTransitioning: boolean;
24
+ transitionDirection: 'next' | 'prev';
25
+ transitionStage: 'idle' | 'start' | 'active';
26
+ speedLockState: SpeedLockState;
27
+ isSpeedOverlayFadingOut: boolean;
28
+ activeSpeedFeedback: number | null;
29
+ speedFeedbackTimer?: number;
30
+ suppressPlayPauseFeedback: boolean;
31
+ shouldAutoplayAfterTransition: boolean;
32
+ readonly thumbnailCache: ThumbnailCache;
33
+ readonly prefetch: PrefetchController;
34
+ readonly settingsMenu: SettingsMenuController;
35
+ requestUpdate(): void;
36
+ handleActivity(): void;
37
+ handleReplay(): void;
38
+ showFeedbackOverlay(type: 'rewind' | 'fastforward'): void;
39
+ isOverlayEnabled(id: string): boolean;
40
+ next(): void;
41
+ previous(): void;
42
+ }
43
+ /**
44
+ * Pointer/touch gestures for the player surface, plus the canvas double-buffer
45
+ * transition that vertical-feed navigation animates through.
46
+ *
47
+ * Gestures owned here:
48
+ * - long-press-to-speed, including its IDLE -> HOLDING -> READY_TO_LOCK ->
49
+ * LOCKED -> LOCKED_HOLDING -> READY_TO_UNLOCK lock/unlock state machine
50
+ * - double-tap-to-seek (and the single-tap play toggle it defers to)
51
+ * - horizontal drag to scrub / vertical drag on the right half to set volume
52
+ * - swipe- and wheel-to-navigate between playlist items
53
+ *
54
+ * The transition lives here too because the swipe gesture drives it directly: a
55
+ * drag paints the outgoing and incoming frames into one double-height canvas
56
+ * and translates it under the finger, then either commits (switching the
57
+ * source) or springs back.
58
+ *
59
+ * Every DOM listener is an arrow-function property, so attach() and detach()
60
+ * add and remove the exact same reference.
61
+ */
62
+ export declare class GestureController {
63
+ private readonly host;
64
+ private gestureState;
65
+ private gestureStartX;
66
+ private gestureStartY;
67
+ private gestureLastTapTime;
68
+ private gestureSingleTapTimer;
69
+ private gestureLongPressTimer;
70
+ private gestureIsRightSide;
71
+ private gestureStartVolume;
72
+ private gestureActiveDrag;
73
+ private gestureStartTimeVal;
74
+ private gestureLastTouchType;
75
+ private isLongPressSpeedActiveInternal;
76
+ private preLongPressPlaybackRate;
77
+ private touchStartY;
78
+ private touchStartX;
79
+ private touchDeltaY;
80
+ private isTouchActive;
81
+ private lastFeedTransitionTime;
82
+ private isTransitionLockedInternal;
83
+ private isDragPreviewActive;
84
+ private dragPreviewDirection;
85
+ private dragPreviewCanvasHeight;
86
+ private dragCanvasEl;
87
+ private dragPreviewPending;
88
+ constructor(host: GestureHost);
89
+ /** True while a long-press speed change is active (suppresses tap handling). */
90
+ get isLongPressSpeedActive(): boolean;
91
+ /** True while a feed transition is animating; blocks concurrent navigation. */
92
+ get isTransitionLocked(): boolean;
93
+ /** Binds wheel + mouse + touch gestures. Mirrored exactly by detach(). */
94
+ attach(): void;
95
+ /** Removes every listener attach() added and clears pending gesture timers. */
96
+ detach(): void;
97
+ private isTransitionAnimationFinished;
98
+ private cleanupReadyListener?;
99
+ private drawFrame;
100
+ private prepareTransitionFrames;
101
+ initiateVisualTransition(direction: 'next' | 'prev', loadSourceCallback: () => void): void;
102
+ private cleanupTransitionListeners?;
103
+ private onTransitionAnimationEnd;
104
+ checkTransitionCompletion(): void;
105
+ endVisualTransition(): void;
106
+ throttleTransition(callback: () => void): void;
107
+ /**
108
+ * Starts a live drag-follow preview: the incoming video's cached thumbnail
109
+ * slides in tracking the finger, mirroring Reels/Shorts drag behavior.
110
+ * The canvas is left in transitionStage 'idle' (which has no matching CSS
111
+ * transform/transition rule) so it is driven purely by inline styles here.
112
+ */
113
+ private beginDragPreview;
114
+ /** Moves the drag-preview canvas to follow the given raw touch deltaY. */
115
+ private updateDragPreview;
116
+ /** Finger lifted past the threshold: animate the rest of the way and commit the switch. */
117
+ private completeDragPreview;
118
+ /** Finger lifted without passing the threshold: spring the preview back and cancel. */
119
+ private cancelDragPreview;
120
+ private handleWheel;
121
+ private handleVideoDown;
122
+ private handleVideoMove;
123
+ private handleVideoUp;
124
+ private handleVideoTouchStart;
125
+ private handleVideoTouchMove;
126
+ private handleVideoTouchEnd;
127
+ private handleVideoTouchCancel;
128
+ private handleVideoMouseDown;
129
+ private handleVideoMouseMove;
130
+ private handleVideoMouseUp;
131
+ private handleVideoMouseLeave;
132
+ private triggerLongPressEnd;
133
+ private triggerSingleTap;
134
+ private triggerDoubleTap;
135
+ private isTouchOnInteractiveElement;
136
+ private handleTouchStart;
137
+ private handleTouchMove;
138
+ private handleTouchEnd;
139
+ }
140
+ //# sourceMappingURL=GestureController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureController.d.ts","sourceRoot":"","sources":["../../../../web-components/src/player-internals/GestureController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,SAAS,GACT,eAAe,GACf,QAAQ,GACR,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACrF,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,eAAe,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,cAAc,EAAE,cAAc,CAAC;IAC/B,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,OAAO,CAAC;IACnC,6BAA6B,EAAE,OAAO,CAAC;IAEvC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;IAE9C,aAAa,IAAI,IAAI,CAAC;IACtB,cAAc,IAAI,IAAI,CAAC;IACvB,YAAY,IAAI,IAAI,CAAC;IACrB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;IAC1D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,IAAI,IAAI,IAAI,CAAC;IACb,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IAGnC,OAAO,CAAC,YAAY,CAAoD;IACxE,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,wBAAwB,CAAK;IAGrC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAAK;IAGnC,OAAO,CAAC,0BAA0B,CAAS;IAC3C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,IAAI,EAAE,WAAW;IAI7B,gFAAgF;IAChF,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,+EAA+E;IAC/E,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED,0EAA0E;IAC1E,MAAM,IAAI,IAAI;IAyBd,+EAA+E;IAC/E,MAAM,IAAI,IAAI;IA6Bd,OAAO,CAAC,6BAA6B,CAAS;IAC9C,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAE1C,OAAO,CAAC,SAAS;IA6CjB,OAAO,CAAC,uBAAuB;IAsF/B,wBAAwB,CACtB,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,kBAAkB,EAAE,MAAM,IAAI,GAC7B,IAAI;IAwDP,OAAO,CAAC,0BAA0B,CAAC,CAAa;IAEhD,OAAO,CAAC,wBAAwB;IAKhC,yBAAyB,IAAI,IAAI;IA6CjC,mBAAmB,IAAI,IAAI;IAyC3B,kBAAkB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAQ9C;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAmCxB,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB;IAUzB,2FAA2F;IAC3F,OAAO,CAAC,mBAAmB;IAmD3B,uFAAuF;IACvF,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,WAAW,CAoBjB;IAEF,OAAO,CAAC,eAAe;IAqDvB,OAAO,CAAC,eAAe;IAwFvB,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,qBAAqB,CAI3B;IAEF,OAAO,CAAC,oBAAoB,CAU1B;IAEF,OAAO,CAAC,mBAAmB,CAQzB;IAEF,OAAO,CAAC,sBAAsB,CAM5B;IAEF,OAAO,CAAC,oBAAoB,CAG1B;IAEF,OAAO,CAAC,oBAAoB,CAE1B;IAEF,OAAO,CAAC,kBAAkB,CAGxB;IAEF,OAAO,CAAC,qBAAqB,CAS3B;IAEF,OAAO,CAAC,mBAAmB;IAoE3B,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,2BAA2B;IAuBnC,OAAO,CAAC,gBAAgB,CAwBtB;IAEF,OAAO,CAAC,eAAe,CAwCrB;IAEF,OAAO,CAAC,cAAc,CA8CpB;CACH"}
@@ -0,0 +1,34 @@
1
+ import { PlayerState } from '../../../core/src/index';
2
+
3
+ /**
4
+ * The narrow slice of the `<player-player>` element the prefetcher reads: the
5
+ * current player state (playlist, active index, status, current source) and
6
+ * whether a vertical-feed transition is animating.
7
+ */
8
+ export interface PrefetchHost {
9
+ readonly playerState: PlayerState;
10
+ readonly isVisualTransitioning: boolean;
11
+ }
12
+ /**
13
+ * Idle-callback-scheduled prefetching of the next (or previous) playlist
14
+ * source, so switching items in a vertical feed starts from a warm cache.
15
+ *
16
+ * Only one prefetch is in flight at a time; it is aborted whenever the target
17
+ * changes, and deliberately *not* aborted when the target is the source that
18
+ * just became active (aborting then would cancel a request the media element
19
+ * is about to reuse).
20
+ */
21
+ export declare class PrefetchController {
22
+ private readonly host;
23
+ private direction;
24
+ private abortController;
25
+ private activeUrl;
26
+ constructor(host: PrefetchHost);
27
+ /** Which neighbour to warm next; set by navigation and drag commits. */
28
+ setDirection(direction: 'next' | 'prev'): void;
29
+ getDirection(): 'next' | 'prev';
30
+ cancel(keepUrl?: string): void;
31
+ trigger(): void;
32
+ private execute;
33
+ }
34
+ //# sourceMappingURL=PrefetchController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrefetchController.d.ts","sourceRoot":"","sources":["../../../../web-components/src/player-internals/PrefetchController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,yBAAyB,CAAC;AAEvE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,SAAS,CAAM;gBAEX,IAAI,EAAE,YAAY;IAI9B,wEAAwE;IACxE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI9C,YAAY,IAAI,MAAM,GAAG,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqB9B,OAAO,IAAI,IAAI;YAmFD,OAAO;CAuEtB"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The narrow slice of the `<player-player>` element the settings menu needs.
3
+ * `settingsMenuOpen` / `activeMenuScreen` stay on the element itself because
4
+ * they are Lit `@state()` properties that both `render()` and `updated()`
5
+ * (via `changedProperties`) depend on; this controller owns the transitions
6
+ * between them, not their storage.
7
+ */
8
+ export interface SettingsMenuHost {
9
+ settingsMenuOpen: boolean;
10
+ activeMenuScreen: string;
11
+ readonly shadowRoot: ShadowRoot | null;
12
+ handleActivity(): void;
13
+ getDeepActiveElement(): Element | null;
14
+ requestUpdate(): void;
15
+ }
16
+ /**
17
+ * The multi-screen settings menu stack: which screen is showing, how the user
18
+ * moves between screens, and the focus management that goes with it.
19
+ *
20
+ * Every handler that a Lit template binds directly (`@click=${...}`) is an
21
+ * arrow-function property, because Lit invokes a bound listener with the host
22
+ * *element* as `this` - a plain method would lose this controller.
23
+ *
24
+ * The screens themselves are still rendered by `Player.ts`: their templates are
25
+ * built from `html` tagged literals that read player state, icons and
26
+ * localization, so splitting them out would only move the coupling around.
27
+ */
28
+ export declare class SettingsMenuController {
29
+ private readonly host;
30
+ private lastFocusedSettingsButton;
31
+ constructor(host: SettingsMenuHost);
32
+ get isOpen(): boolean;
33
+ get activeScreen(): string;
34
+ /** Opens the menu on a given screen without touching focus. */
35
+ open: (screen?: string) => void;
36
+ close: () => void;
37
+ /** Navigates to a sub-screen of the currently open menu. */
38
+ goTo: (screen: string) => void;
39
+ backToMain: () => void;
40
+ /** Settings button click / `player-settings-toggle`: opens or closes the menu. */
41
+ toggle: () => void;
42
+ /** Enter/Space on a menu row behaves like a click. */
43
+ handleItemKey: (e: KeyboardEvent) => void;
44
+ getAriaLabel(): string;
45
+ /** The settings button, which lives in the standard bar or in the vertical rail. */
46
+ getSettingsButton(): HTMLElement | null;
47
+ /**
48
+ * Keyboard navigation while the menu is open. Returns true when the event was
49
+ * consumed and the caller must stop processing it.
50
+ */
51
+ handleKeyDown(e: KeyboardEvent, deepActiveEl: Element | null): boolean;
52
+ /** Closes the menu when a click / focus lands outside of it. */
53
+ closeIfOutside(e: Event): void;
54
+ /** `updated()` hook: move focus to the first row of a newly shown screen. */
55
+ onScreenChanged(): void;
56
+ /** `updated()` hook: restore focus to the settings button once the menu closes. */
57
+ onOpenStateChanged(wasOpen: boolean | undefined): void;
58
+ }
59
+ //# sourceMappingURL=SettingsMenuController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsMenuController.d.ts","sourceRoot":"","sources":["../../../../web-components/src/player-internals/SettingsMenuController.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,cAAc,IAAI,IAAI,CAAC;IACvB,oBAAoB,IAAI,OAAO,GAAG,IAAI,CAAC;IACvC,aAAa,IAAI,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,yBAAyB,CAA4B;gBAEjD,IAAI,EAAE,gBAAgB;IAIlC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,+DAA+D;IAC/D,IAAI,GAAI,SAAQ,MAAe,KAAG,IAAI,CAGpC;IAEF,KAAK,QAAO,IAAI,CAEd;IAEF,4DAA4D;IAC5D,IAAI,GAAI,QAAQ,MAAM,KAAG,IAAI,CAE3B;IAEF,UAAU,QAAO,IAAI,CAEnB;IAEF,kFAAkF;IAClF,MAAM,QAAO,IAAI,CAgBf;IAEF,sDAAsD;IACtD,aAAa,GAAI,GAAG,aAAa,KAAG,IAAI,CAKtC;IAEF,YAAY,IAAI,MAAM;IAetB,oFAAoF;IACpF,iBAAiB,IAAI,WAAW,GAAG,IAAI;IAWvC;;;OAGG;IACH,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO;IAmFtE,gEAAgE;IAChE,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAa9B,6EAA6E;IAC7E,eAAe,IAAI,IAAI;IAevB,mFAAmF;IACnF,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;CAgBvD"}
@@ -0,0 +1,64 @@
1
+ import { PlayerController, PlayerState, ThumbnailProvider } from '../../../core/src/index';
2
+
3
+ /**
4
+ * The narrow slice of the `<player-player>` element that the thumbnail cache
5
+ * reads. Deliberately not the whole element: the cache only needs the current
6
+ * player state, the headless controller (to reach the active thumbnail
7
+ * provider), and whether a vertical-feed transition is currently animating.
8
+ */
9
+ export interface ThumbnailCacheHost {
10
+ readonly playerState: PlayerState;
11
+ readonly controller: PlayerController | undefined;
12
+ readonly isVisualTransitioning: boolean;
13
+ }
14
+ /**
15
+ * The public `ThumbnailProvider` contract from `@player/core`, plus the
16
+ * implementation-detail members every concrete provider happens to expose
17
+ * (the hidden `<video>` element used for frame capture, and a one-time flag
18
+ * marking that this cache has already expanded its preload schedule) but
19
+ * which aren't part of the public interface.
20
+ */
21
+ interface CachedThumbnailProvider extends ThumbnailProvider {
22
+ video?: HTMLVideoElement | null;
23
+ _preloadedIntervalsAdded?: boolean;
24
+ }
25
+ /**
26
+ * Thumbnail provider cache + idle-callback-scheduled preloading for the
27
+ * playlist neighbours of the active item.
28
+ *
29
+ * Eviction policy (unchanged from the original inline implementation):
30
+ * - With no playlist (or a single item), every cached provider except the one
31
+ * for the active source is destroyed and dropped.
32
+ * - With a playlist, only the active / next / previous sources are kept; every
33
+ * other provider is destroyed and dropped.
34
+ * - The controller's own "main" provider is never destroyed by an eviction,
35
+ * only removed from the map.
36
+ */
37
+ export declare class ThumbnailCache {
38
+ private readonly host;
39
+ private providers;
40
+ private mainProvider;
41
+ private pendingTasks;
42
+ private activeIdleCallbackId;
43
+ constructor(host: ThumbnailCacheHost);
44
+ getProvider(url: string): CachedThumbnailProvider | undefined;
45
+ setProviderForSource(url: string, provider: CachedThumbnailProvider): void;
46
+ getMainProvider(): CachedThumbnailProvider | null;
47
+ setMainProvider(provider: CachedThumbnailProvider): void;
48
+ /**
49
+ * Best-effort poster frame for a playlist source that has already been
50
+ * preloaded, used to paint the incoming half of the transition canvas.
51
+ */
52
+ getCachedPosterForSource(url: string): string | null;
53
+ cancelPendingPreloads(): void;
54
+ /** Re-evaluates the cache against the current playlist and queues preloads. */
55
+ trigger(): void;
56
+ /** Destroys every cached provider except the controller's own main one. */
57
+ destroy(): void;
58
+ private destroyProvider;
59
+ private scheduleNextPreloadTask;
60
+ private runPreloadTask;
61
+ private expandPreloadTasksForProvider;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=ThumbnailCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThumbnailCache.d.ts","sourceRoot":"","sources":["../../../../web-components/src/player-internals/ThumbnailCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE9G;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACzC;AAED;;;;;;GAMG;AACH,UAAU,uBAAwB,SAAQ,iBAAiB;IACzD,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AASD;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,oBAAoB,CAAuB;gBAEvC,IAAI,EAAE,kBAAkB;IAIpC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAI7D,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAI1E,eAAe,IAAI,uBAAuB,GAAG,IAAI;IAIjD,eAAe,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAIxD;;;OAGG;IACH,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAwCpD,qBAAqB,IAAI,IAAI;IAY7B,+EAA+E;IAC/E,OAAO,IAAI,IAAI;IAwHf,2EAA2E;IAC3E,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,uBAAuB;YAmBjB,cAAc;IAmC5B,OAAO,CAAC,6BAA6B;CA8CtC"}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "streamit-player",
3
+ "version": "1.0.0",
4
+ "description": "Enterprise-grade HTML5 video player with adaptive streaming (HLS/DASH), multi-DRM, VAST/VMAP/SIMID advertising, and Lit web components.",
5
+ "license": "Apache-2.0",
6
+ "author": "Iqonic Design",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/iqonicdesignofficial/streamit-player.git",
10
+ "directory": "packages/streamit-player"
11
+ },
12
+ "homepage": "https://github.com/iqonicdesignofficial/streamit-player#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/iqonicdesignofficial/streamit-player/issues"
15
+ },
16
+ "keywords": [
17
+ "video",
18
+ "player",
19
+ "hls",
20
+ "dash",
21
+ "drm",
22
+ "vast",
23
+ "vmap",
24
+ "ads",
25
+ "headless",
26
+ "web-components",
27
+ "lit",
28
+ "streamit-player"
29
+ ],
30
+ "type": "module",
31
+ "main": "./dist/index.cjs",
32
+ "module": "./dist/index.js",
33
+ "types": "./dist/src/index.d.ts",
34
+ "unpkg": "./dist/streamit-player.iife.min.js",
35
+ "jsdelivr": "./dist/streamit-player.iife.min.js",
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE",
40
+ "CHANGELOG.md"
41
+ ],
42
+ "exports": {
43
+ ".": {
44
+ "types": "./dist/src/index.d.ts",
45
+ "import": "./dist/index.js",
46
+ "require": "./dist/index.cjs"
47
+ },
48
+ "./core": {
49
+ "types": "./dist/core/src/index.d.ts",
50
+ "import": "./dist/core/index.js",
51
+ "require": "./dist/core/index.cjs"
52
+ },
53
+ "./web-components": {
54
+ "types": "./dist/web-components/src/index.d.ts",
55
+ "import": "./dist/web-components/index.js",
56
+ "require": "./dist/web-components/index.cjs"
57
+ },
58
+ "./package.json": "./package.json"
59
+ },
60
+ "scripts": {
61
+ "build": "vite build && vite build --mode cdn && vite build --mode cdn-unminified",
62
+ "prepublishOnly": "npm run build && npm test",
63
+ "test": "vitest run",
64
+ "test:watch": "vitest"
65
+ },
66
+ "dependencies": {
67
+ "lit": "^3.1.2"
68
+ },
69
+ "peerDependencies": {
70
+ "dashjs": "^5.1.1",
71
+ "hls.js": "^1.5.8"
72
+ },
73
+ "devDependencies": {
74
+ "@open-wc/testing-helpers": "^3.0.1",
75
+ "@vitest/coverage-v8": "^4.1.11",
76
+ "dashjs": "^5.1.1",
77
+ "esbuild": "^0.21.5",
78
+ "hls.js": "^1.5.8",
79
+ "jsdom": "^27.0.1",
80
+ "vite": "^5.2.11",
81
+ "vite-plugin-dts": "^3.9.1",
82
+ "vitest": "^4.1.11"
83
+ }
84
+ }