@rixl/media-core 1.0.1 → 1.1.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 (173) hide show
  1. package/README.md +74 -84
  2. package/dist/chunks/B-QvSqjj.js +1 -0
  3. package/dist/chunks/B2DDE32u.js +1 -0
  4. package/dist/chunks/BZFoe94X.js +1 -0
  5. package/dist/chunks/DMkwQjgA.js +1 -0
  6. package/dist/index.d.ts +2005 -82
  7. package/dist/index.js +6 -73
  8. package/package.json +13 -6
  9. package/dist/api/analytics.d.ts +0 -16
  10. package/dist/api/analytics.js +0 -227
  11. package/dist/api/feed.js +0 -52
  12. package/dist/api/heatmap.d.ts +0 -6
  13. package/dist/api/heatmap.js +0 -28
  14. package/dist/api/hot-segments.d.ts +0 -7
  15. package/dist/api/hot-segments.js +0 -20
  16. package/dist/api/image.js +0 -11
  17. package/dist/api/rixl-client.d.ts +0 -3
  18. package/dist/api/rixl-client.js +0 -14
  19. package/dist/api/upload.d.ts +0 -76
  20. package/dist/api/upload.js +0 -150
  21. package/dist/api/video.js +0 -11
  22. package/dist/lib/analytics-builders.d.ts +0 -59
  23. package/dist/lib/analytics-builders.js +0 -88
  24. package/dist/lib/analytics-initialize.d.ts +0 -1
  25. package/dist/lib/analytics-initialize.js +0 -59
  26. package/dist/lib/analytics-utils.d.ts +0 -43
  27. package/dist/lib/analytics-utils.js +0 -85
  28. package/dist/lib/analytics-wire.js +0 -153
  29. package/dist/lib/buffer-progress.d.ts +0 -20
  30. package/dist/lib/buffer-progress.js +0 -37
  31. package/dist/lib/caption-styles.d.ts +0 -20
  32. package/dist/lib/caption-styles.js +0 -56
  33. package/dist/lib/caption-utils.d.ts +0 -80
  34. package/dist/lib/caption-utils.js +0 -111
  35. package/dist/lib/chapter-utils.d.ts +0 -102
  36. package/dist/lib/chapter-utils.js +0 -147
  37. package/dist/lib/click-disambiguation.d.ts +0 -44
  38. package/dist/lib/click-disambiguation.js +0 -80
  39. package/dist/lib/click-outside.d.ts +0 -68
  40. package/dist/lib/click-outside.js +0 -64
  41. package/dist/lib/colors.d.ts +0 -6
  42. package/dist/lib/colors.js +0 -16
  43. package/dist/lib/content-analytics.d.ts +0 -27
  44. package/dist/lib/content-analytics.js +0 -38
  45. package/dist/lib/environment-effects.d.ts +0 -89
  46. package/dist/lib/environment-effects.js +0 -139
  47. package/dist/lib/feed-autoscroll.d.ts +0 -10
  48. package/dist/lib/feed-autoscroll.js +0 -13
  49. package/dist/lib/feed-container-height.d.ts +0 -7
  50. package/dist/lib/feed-container-height.js +0 -11
  51. package/dist/lib/feed-description-overflow.d.ts +0 -1
  52. package/dist/lib/feed-description-overflow.js +0 -9
  53. package/dist/lib/feed-dwell.d.ts +0 -2
  54. package/dist/lib/feed-dwell.js +0 -8
  55. package/dist/lib/feed-loop.d.ts +0 -10
  56. package/dist/lib/feed-loop.js +0 -21
  57. package/dist/lib/feed-scroll.d.ts +0 -11
  58. package/dist/lib/feed-scroll.js +0 -19
  59. package/dist/lib/feed-transforms.d.ts +0 -5
  60. package/dist/lib/feed-transforms.js +0 -30
  61. package/dist/lib/filter-undefined.js +0 -11
  62. package/dist/lib/fullscreen-utils.d.ts +0 -1
  63. package/dist/lib/fullscreen-utils.js +0 -7
  64. package/dist/lib/hls-buffer-flush.js +0 -46
  65. package/dist/lib/hls-error-recovery.d.ts +0 -35
  66. package/dist/lib/hls-error-recovery.js +0 -75
  67. package/dist/lib/hls-event-handlers.js +0 -61
  68. package/dist/lib/hls-loader.js +0 -23
  69. package/dist/lib/hls-setup.d.ts +0 -72
  70. package/dist/lib/hls-setup.js +0 -144
  71. package/dist/lib/hls-utils.d.ts +0 -31
  72. package/dist/lib/hls-utils.js +0 -34
  73. package/dist/lib/image-render.d.ts +0 -29
  74. package/dist/lib/image-render.js +0 -63
  75. package/dist/lib/keyboard-config.d.ts +0 -66
  76. package/dist/lib/keyboard-config.js +0 -127
  77. package/dist/lib/keyboard-utils.d.ts +0 -4
  78. package/dist/lib/keyboard-utils.js +0 -11
  79. package/dist/lib/lifecycle-effects.d.ts +0 -67
  80. package/dist/lib/lifecycle-effects.js +0 -78
  81. package/dist/lib/loading-debounce.d.ts +0 -26
  82. package/dist/lib/loading-debounce.js +0 -38
  83. package/dist/lib/numbers.d.ts +0 -6
  84. package/dist/lib/numbers.js +0 -36
  85. package/dist/lib/pip-utils.d.ts +0 -16
  86. package/dist/lib/pip-utils.js +0 -32
  87. package/dist/lib/playback-handlers.d.ts +0 -33
  88. package/dist/lib/playback-handlers.js +0 -51
  89. package/dist/lib/playback-slider.d.ts +0 -23
  90. package/dist/lib/playback-slider.js +0 -24
  91. package/dist/lib/player-labels.d.ts +0 -23
  92. package/dist/lib/player-labels.js +0 -132
  93. package/dist/lib/player-menu-labels.d.ts +0 -80
  94. package/dist/lib/player-menu-labels.js +0 -829
  95. package/dist/lib/player-ui-actions.d.ts +0 -10
  96. package/dist/lib/player-ui-actions.js +0 -58
  97. package/dist/lib/progress-fraction.d.ts +0 -11
  98. package/dist/lib/progress-fraction.js +0 -20
  99. package/dist/lib/progress-persist.d.ts +0 -28
  100. package/dist/lib/progress-persist.js +0 -54
  101. package/dist/lib/segment-analytics.d.ts +0 -20
  102. package/dist/lib/segment-analytics.js +0 -29
  103. package/dist/lib/subtitle-logic.d.ts +0 -31
  104. package/dist/lib/subtitle-logic.js +0 -75
  105. package/dist/lib/subtitle-utils.d.ts +0 -16
  106. package/dist/lib/subtitle-utils.js +0 -37
  107. package/dist/lib/time.d.ts +0 -1
  108. package/dist/lib/time.js +0 -17
  109. package/dist/lib/track-persistence.d.ts +0 -4
  110. package/dist/lib/track-persistence.js +0 -35
  111. package/dist/lib/video-preload-config.d.ts +0 -34
  112. package/dist/lib/video-preload-config.js +0 -41
  113. package/dist/lib/video-spinner.d.ts +0 -25
  114. package/dist/lib/video-spinner.js +0 -35
  115. package/dist/lib/video-stats.d.ts +0 -28
  116. package/dist/lib/video-stats.js +0 -44
  117. package/dist/lib/volume-utils.d.ts +0 -59
  118. package/dist/lib/volume-utils.js +0 -55
  119. package/dist/progressbar.d.ts +0 -10
  120. package/dist/progressbar.js +0 -123
  121. package/dist/store/analytics-context-store.d.ts +0 -4
  122. package/dist/store/analytics-context-store.js +0 -13
  123. package/dist/store/analytics-device-store.d.ts +0 -8
  124. package/dist/store/analytics-device-store.js +0 -44
  125. package/dist/store/analytics-session-store.d.ts +0 -8
  126. package/dist/store/analytics-session-store.js +0 -40
  127. package/dist/store/analytics-store.d.ts +0 -30
  128. package/dist/store/analytics-store.js +0 -88
  129. package/dist/store/controls-store.d.ts +0 -16
  130. package/dist/store/controls-store.js +0 -53
  131. package/dist/store/feed-cache-store.d.ts +0 -24
  132. package/dist/store/feed-cache-store.js +0 -165
  133. package/dist/store/feed-interaction-store.d.ts +0 -17
  134. package/dist/store/feed-interaction-store.js +0 -32
  135. package/dist/store/feed-store.d.ts +0 -16
  136. package/dist/store/feed-store.js +0 -38
  137. package/dist/store/generic-store.js +0 -24
  138. package/dist/store/image-store.d.ts +0 -2
  139. package/dist/store/image-store.js +0 -8
  140. package/dist/store/player-container-element-store.d.ts +0 -10
  141. package/dist/store/player-container-element-store.js +0 -38
  142. package/dist/store/player-global-actions.js +0 -53
  143. package/dist/store/player-media-element-store.d.ts +0 -10
  144. package/dist/store/player-media-element-store.js +0 -38
  145. package/dist/store/player-store-actions.js +0 -197
  146. package/dist/store/player-store.d.ts +0 -94
  147. package/dist/store/player-store.js +0 -127
  148. package/dist/store/player-track-actions.js +0 -44
  149. package/dist/store/postStore.d.ts +0 -20
  150. package/dist/store/postStore.js +0 -112
  151. package/dist/store/settings/constants.d.ts +0 -15
  152. package/dist/store/settings/constants.js +0 -47
  153. package/dist/store/settings/defaults.d.ts +0 -2
  154. package/dist/store/settings/defaults.js +0 -24
  155. package/dist/store/settings/storage.d.ts +0 -3
  156. package/dist/store/settings/storage.js +0 -28
  157. package/dist/store/settings/store.d.ts +0 -32
  158. package/dist/store/settings/store.js +0 -59
  159. package/dist/store/settings/types.d.ts +0 -27
  160. package/dist/store/settings/validation.d.ts +0 -7
  161. package/dist/store/settings/validation.js +0 -55
  162. package/dist/store/settings-menu-store.d.ts +0 -19
  163. package/dist/store/settings-menu-store.js +0 -30
  164. package/dist/store/video-store.d.ts +0 -2
  165. package/dist/store/video-store.js +0 -8
  166. package/dist/types/analytics.d.ts +0 -113
  167. package/dist/types/feed.d.ts +0 -21
  168. package/dist/types/file.d.ts +0 -12
  169. package/dist/types/heatmap.d.ts +0 -5
  170. package/dist/types/hot-segments.d.ts +0 -9
  171. package/dist/types/image.d.ts +0 -9
  172. package/dist/types/uuid.d.ts +0 -1
  173. package/dist/types/video.d.ts +0 -22
package/dist/index.js CHANGED
@@ -1,73 +1,6 @@
1
- import { initProgressBar } from "./progressbar.js";
2
- import { getFeedPost, getFeedPosts } from "./store/feed-store.js";
3
- import { getImage } from "./store/image-store.js";
4
- import { getVideo } from "./store/video-store.js";
5
- import { formatTime } from "./lib/time.js";
6
- import { clamp, formatNumber, formatNumberSm } from "./lib/numbers.js";
7
- import { DEFAULT_IMAGE_ASPECT_RATIO, IMAGE_ASPECT_RATIO_THRESHOLD, getImageAspectRatio, getImageContainerStyle, getImageStyle, imageRenderReducer, initialImageRenderState } from "./lib/image-render.js";
8
- import { hexToRGB, hexToRGBAString } from "./lib/colors.js";
9
- import { shouldIgnoreKeyboardEvent } from "./lib/keyboard-utils.js";
10
- import { PLAYER_LANGUAGES, getPlayerControlLabels, resolvePlayerLanguage } from "./lib/player-labels.js";
11
- import { PLAY_PAUSE_KEYS, SEEK_LARGE_SECONDS, SEEK_SMALL_SECONDS, SHORTCUTS_CONFIG, ShortcutAction, VOLUME_DELTA, executeShortcutAction, getSeekAmount, getSeekPercent, getVolumeDelta, resolveShortcutAction } from "./lib/keyboard-config.js";
12
- import { calculateVolumeToSet, clampVolume, getPointerClientX, getRestoredVolume, getVolumeFromPointer, isEffectivelyMuted, shouldBeMuted } from "./lib/volume-utils.js";
13
- import { getCaptionTextStyle, getCaptionWindowStyle, getSmartCaptionPosition } from "./lib/caption-styles.js";
14
- import { isDocumentFullscreen } from "./lib/fullscreen-utils.js";
15
- import { isVideoPictureInPicture, togglePictureInPicture } from "./lib/pip-utils.js";
16
- import { PERSIST_INTERVAL_MS, RESUME_MIN_POSITION_SECONDS, RESUME_MIN_REMAINING_SECONDS, getPersistedProgress, persistProgress, shouldPersistProgress, shouldResumeFromPosition } from "./lib/progress-persist.js";
17
- import { PRELOAD_RANGE, UNLOAD_DISTANCE, VideoLoadState, getVideoLoadState } from "./lib/video-preload-config.js";
18
- import { LOADING_SPINNER_DELAY_MS, cleanupLoadingDebounce, createLoadingDebounceState, updateLoadingState } from "./lib/loading-debounce.js";
19
- import { calculateAspectRatio, handleVideoError, handleVideoPause, handleVideoPlay, handleVideoRateChange, updatePlayerLoadingState } from "./lib/playback-handlers.js";
20
- import { DOUBLE_CLICK_THRESHOLD_MS, SINGLE_CLICK_DELAY_MS, cleanupClickDisambiguation, createClickDisambiguationState, handleClick, handleDoubleClick } from "./lib/click-disambiguation.js";
21
- import { bindFullscreenChangeListener, bindPictureInPictureChangeListener, bindPipVisibilityReentry, deriveVolumeSync, observeViewport, shouldReenterPictureInPicture } from "./lib/environment-effects.js";
22
- import { bindEndedListener, bindPlaybackRateSync, getAspectRatioFromPoster, getFeedPlaybackAction, getPreloadAttribute } from "./lib/lifecycle-effects.js";
23
- import { bindClickOutside, bindDocumentHidden, isClickOutside, isInsideExcludedElement } from "./lib/click-outside.js";
24
- import { shouldShowSpinner } from "./lib/video-spinner.js";
25
- import { createHlsConfig, setupHls } from "./lib/hls-setup.js";
26
- import { generateLevelName, getQualityLabel, isHlsStream, sortLevelsByQuality } from "./lib/hls-utils.js";
27
- import { getPersistedAudioTrack, getPersistedSubtitleTrack, persistAudioTrack, persistSubtitleTrack } from "./lib/track-persistence.js";
28
- import { analyticsStore, analyticsStoreActions } from "./store/analytics-store.js";
29
- import { endSegment, restartSegmentIfPlaying, startSegment } from "./lib/segment-analytics.js";
30
- import { controlsStore } from "./store/controls-store.js";
31
- import { feedCacheAtom, feedCacheStore } from "./store/feed-cache-store.js";
32
- import { postStore, postStoreActions } from "./store/postStore.js";
33
- import { FEED_COMPONENTS_COUNT, FEED_TRANSITION_THRESHOLD, feedStore, initializeVideo, setHasInteracted } from "./store/feed-interaction-store.js";
34
- import { playerContainerElementStore } from "./store/player-container-element-store.js";
35
- import { playerMediaElementStore } from "./store/player-media-element-store.js";
36
- import { MAX_MEDIA_RECOVERIES, MAX_NETWORK_RETRIES, createHlsErrorRecoveryState, decideHlsErrorAction } from "./lib/hls-error-recovery.js";
37
- import { defaultSettings } from "./store/settings/defaults.js";
38
- import { COLORS, EDGE_STYLES, FONT_FAMILIES, FONT_SIZES, LANG_TYPES, PLAYBACK_SPEEDS } from "./store/settings/constants.js";
39
- import { validateSettings } from "./store/settings/validation.js";
40
- import { loadSettings, saveSettings } from "./store/settings/storage.js";
41
- import { settingsStore } from "./store/settings/store.js";
42
- import { activeMenu, menuStack, navigationDirection, popMenu, pushMenu, resetMenu } from "./store/settings-menu-store.js";
43
- import { computePlaybackFillPercentage, computePlaybackValueFromPointer } from "./lib/playback-slider.js";
44
- import { getPlayerMenuLabels } from "./lib/player-menu-labels.js";
45
- import { playerStateStore } from "./store/player-store.js";
46
- import { hidePlayerControls, showPlayerControls, togglePlayerFullscreen, togglePlayerPictureInPicture } from "./lib/player-ui-actions.js";
47
- import { clearSubtitles, handleCueChange, handleLoadedMetadata } from "./lib/subtitle-utils.js";
48
- import { computeBufferRanges, computeBufferedAhead } from "./lib/buffer-progress.js";
49
- import { computeProgressFraction } from "./lib/progress-fraction.js";
50
- import { buildVideoAnalyticsPayload, postContentEvent } from "./lib/content-analytics.js";
51
- import { analyticsContextStore, setAnalyticsContext } from "./store/analytics-context-store.js";
52
- import { analyticsDeviceStore, getOrCreateDeviceId, setDeviceId } from "./store/analytics-device-store.js";
53
- import { analyticsSessionStore, getOrCreateSessionId } from "./store/analytics-session-store.js";
54
- import { initializeAnalyticsContext } from "./lib/analytics-initialize.js";
55
- import { BOTTOM_OFFSET_CONTROLS_HIDDEN, BOTTOM_OFFSET_CONTROLS_VISIBLE, BOTTOM_SNAP_THRESHOLD, CAPTION_WIDTH_RATIO, DEFAULT_CAPTION_FONT_SIZE, DEFAULT_FONT_SIZE, FONT_SIZE_RATIO, FONT_SIZE_VIEWPORT_RATIO, MAX_FONT_SIZE, MIN_FONT_SIZE, SAFE_ZONE_MARGIN, calculateDragPosition, calculateFontSize, calculateSafeViewport, constrainPercentagePosition, getPointerOffsets, getTextShadowValue, pixelsToPercentage, shouldPinToBottom } from "./lib/caption-utils.js";
56
- import { buildContentViewEvent, calculateWatchDuration, getEffectivePage, msToSeconds, roundMs, secondsToMs, shouldIncludeSegments } from "./lib/analytics-utils.js";
57
- import { calculateChaptersWithEnd, calculateFlexGrow, calculateGlobalMax, calculateHeatmapSlices, calculateSegmentBufferRanges, calculateSegmentProgress, findHoveredSegmentIndex, getCurrentPosition, getNextChapterStart, getPrevChapterTarget, isChapterWithinDuration, sliceHeatmapData, validateChapters } from "./lib/chapter-utils.js";
58
- import { calculateSmoothedEndTime, extractSubtitleTracks, findNextCue, getCleanCueText, processCues, stripHtmlTags } from "./lib/subtitle-logic.js";
59
- import { flushAnalytics, postAnalytics, postEngagement, postError, postInteraction } from "./api/analytics.js";
60
- import { getVideoHeatmap } from "./api/heatmap.js";
61
- import { getHotSegments } from "./api/hot-segments.js";
62
- import { collectVideoStats, getBufferHealth, getDroppedFrames } from "./lib/video-stats.js";
63
- import { LOOP_REBASE_BASE_MULTIPLIER, LOOP_REBASE_THRESHOLD_MULTIPLIER, buildTransforms, calcShiftCountArray, shiftArray } from "./lib/feed-transforms.js";
64
- import { computeScrollIndex, isAtEndOfFeed, isFeedExhausted, shouldFetchMore } from "./lib/feed-scroll.js";
65
- import { getLoopRebaseThreshold, getRebasedLoopIndex, resolvePostIndex, shouldRebaseLoopIndex } from "./lib/feed-loop.js";
66
- import { IMAGE_DWELL_MS, shouldDwellAdvance } from "./lib/feed-dwell.js";
67
- import { gateVideoEnded, shouldAutoAdvance } from "./lib/feed-autoscroll.js";
68
- import { getViewportFallbackHeight, resolveContainerHeight } from "./lib/feed-container-height.js";
69
- import { checkIsCut } from "./lib/feed-description-overflow.js";
70
- import { connect } from "./api/rixl-client.js";
71
- import { createAudioTrackUpload, createImageUpload, createPostUpload, createSubtitleUpload, createVideoUpload, uploadImage, uploadPost, uploadVideo } from "./api/upload.js";
72
-
73
- export { BOTTOM_OFFSET_CONTROLS_HIDDEN, BOTTOM_OFFSET_CONTROLS_VISIBLE, BOTTOM_SNAP_THRESHOLD, CAPTION_WIDTH_RATIO, COLORS, DEFAULT_CAPTION_FONT_SIZE, DEFAULT_FONT_SIZE, DEFAULT_IMAGE_ASPECT_RATIO, DOUBLE_CLICK_THRESHOLD_MS, EDGE_STYLES, FEED_COMPONENTS_COUNT, FEED_TRANSITION_THRESHOLD, FONT_FAMILIES, FONT_SIZES, FONT_SIZE_RATIO, FONT_SIZE_VIEWPORT_RATIO, IMAGE_ASPECT_RATIO_THRESHOLD, IMAGE_DWELL_MS, LANG_TYPES, LOADING_SPINNER_DELAY_MS, LOOP_REBASE_BASE_MULTIPLIER, LOOP_REBASE_THRESHOLD_MULTIPLIER, MAX_FONT_SIZE, MAX_MEDIA_RECOVERIES, MAX_NETWORK_RETRIES, MIN_FONT_SIZE, PERSIST_INTERVAL_MS, PLAYBACK_SPEEDS, PLAYER_LANGUAGES, PLAY_PAUSE_KEYS, PRELOAD_RANGE, RESUME_MIN_POSITION_SECONDS, RESUME_MIN_REMAINING_SECONDS, SAFE_ZONE_MARGIN, SEEK_LARGE_SECONDS, SEEK_SMALL_SECONDS, SHORTCUTS_CONFIG, SINGLE_CLICK_DELAY_MS, ShortcutAction, UNLOAD_DISTANCE, VOLUME_DELTA, VideoLoadState, activeMenu, analyticsContextStore, analyticsDeviceStore, analyticsSessionStore, analyticsStore, analyticsStoreActions, bindClickOutside, bindDocumentHidden, bindEndedListener, bindFullscreenChangeListener, bindPictureInPictureChangeListener, bindPipVisibilityReentry, bindPlaybackRateSync, buildContentViewEvent, buildTransforms, buildVideoAnalyticsPayload, calcShiftCountArray, calculateAspectRatio, calculateChaptersWithEnd, calculateDragPosition, calculateFlexGrow, calculateFontSize, calculateGlobalMax, calculateHeatmapSlices, calculateSafeViewport, calculateSegmentBufferRanges, calculateSegmentProgress, calculateSmoothedEndTime, calculateVolumeToSet, calculateWatchDuration, checkIsCut, clamp, clampVolume, cleanupClickDisambiguation, cleanupLoadingDebounce, clearSubtitles, collectVideoStats, computeBufferRanges, computeBufferedAhead, computePlaybackFillPercentage, computePlaybackValueFromPointer, computeProgressFraction, computeScrollIndex, connect, constrainPercentagePosition, controlsStore, createAudioTrackUpload, createClickDisambiguationState, createHlsConfig, createHlsErrorRecoveryState, createImageUpload, createLoadingDebounceState, createPostUpload, createSubtitleUpload, createVideoUpload, decideHlsErrorAction, defaultSettings, deriveVolumeSync, endSegment, executeShortcutAction, extractSubtitleTracks, feedCacheAtom, feedCacheStore, feedStore, findHoveredSegmentIndex, findNextCue, flushAnalytics, formatNumber, formatNumberSm, formatTime, gateVideoEnded, generateLevelName, getAspectRatioFromPoster, getBufferHealth, getCaptionTextStyle, getCaptionWindowStyle, getCleanCueText, getCurrentPosition, getDroppedFrames, getEffectivePage, getFeedPlaybackAction, getFeedPost, getFeedPosts, getHotSegments, getImage, getImageAspectRatio, getImageContainerStyle, getImageStyle, getLoopRebaseThreshold, getNextChapterStart, getOrCreateDeviceId, getOrCreateSessionId, getPersistedAudioTrack, getPersistedProgress, getPersistedSubtitleTrack, getPlayerControlLabels, getPlayerMenuLabels, getPointerClientX, getPointerOffsets, getPreloadAttribute, getPrevChapterTarget, getQualityLabel, getRebasedLoopIndex, getRestoredVolume, getSeekAmount, getSeekPercent, getSmartCaptionPosition, getTextShadowValue, getVideo, getVideoHeatmap, getVideoLoadState, getViewportFallbackHeight, getVolumeDelta, getVolumeFromPointer, handleClick, handleCueChange, handleDoubleClick, handleLoadedMetadata, handleVideoError, handleVideoPause, handleVideoPlay, handleVideoRateChange, hexToRGB, hexToRGBAString, hidePlayerControls, imageRenderReducer, initProgressBar, initialImageRenderState, initializeAnalyticsContext, initializeVideo, isAtEndOfFeed, isChapterWithinDuration, isClickOutside, isDocumentFullscreen, isEffectivelyMuted, isFeedExhausted, isHlsStream, isInsideExcludedElement, isVideoPictureInPicture, loadSettings, menuStack, msToSeconds, navigationDirection, observeViewport, persistAudioTrack, persistProgress, persistSubtitleTrack, pixelsToPercentage, playerContainerElementStore, playerMediaElementStore, playerStateStore, popMenu, postAnalytics, postContentEvent, postEngagement, postError, postInteraction, postStore, postStoreActions, processCues, pushMenu, resetMenu, resolveContainerHeight, resolvePlayerLanguage, resolvePostIndex, resolveShortcutAction, restartSegmentIfPlaying, roundMs, saveSettings, secondsToMs, setAnalyticsContext, setDeviceId, setHasInteracted, settingsStore, setupHls, shiftArray, shouldAutoAdvance, shouldBeMuted, shouldDwellAdvance, shouldFetchMore, shouldIgnoreKeyboardEvent, shouldIncludeSegments, shouldPersistProgress, shouldPinToBottom, shouldRebaseLoopIndex, shouldReenterPictureInPicture, shouldResumeFromPosition, shouldShowSpinner, showPlayerControls, sliceHeatmapData, sortLevelsByQuality, startSegment, stripHtmlTags, togglePictureInPicture, togglePlayerFullscreen, togglePlayerPictureInPicture, updateLoadingState, updatePlayerLoadingState, uploadImage, uploadPost, uploadVideo, validateChapters, validateSettings };
1
+ import{A as e,C as t,D as n,E as r,M as i,O as a,S as o,T as s,_ as c,a as l,b as u,c as d,d as ee,f as te,g as ne,h as re,i as ie,j as ae,k as oe,l as se,m as ce,n as le,o as ue,p as de,r as fe,s as pe,t as me,u as he,v as ge,w as _e,x as ve,y as ye}from"./chunks/BZFoe94X.js";import{a as be,c as xe,d as Se,f as Ce,g as we,h as Te,i as Ee,l as De,m as f,n as p,o as Oe,p as ke,r as Ae,s as je,t as Me,u as Ne}from"./chunks/DMkwQjgA.js";import{a as Pe,c as Fe,d as Ie,f as Le,i as Re,l as ze,n as Be,o as Ve,r as He,s as Ue,t as We,u as Ge}from"./chunks/B2DDE32u.js";import{_ as Ke,a as qe,c as m,d as Je,f as Ye,g as Xe,h as Ze,i as Qe,l as $e,m as et,n as tt,o as nt,p as rt,r as it,s as at,t as ot,u as st,v as ct}from"./chunks/B-QvSqjj.js";import{analyticsV1EventsServiceTrackEvents as lt,analyticsV1HeatmapServiceGetHotSegments as ut,analyticsV1HeatmapServiceGetVideoHeatmap as dt,client as ft,connect as pt,imagesV1ImageServiceCreateImageUpload as mt,imagesV1ImageServiceGetImage as ht,postsV1PostServiceCreatePostUpload as gt,user as _t,videosV1AudioTrackServiceCreateAudioTrackUpload as vt,videosV1SubtitleServiceCreateSubtitleUpload as yt,videosV1VideoServiceCreateVideoUpload as bt,videosV1VideoServiceGetVideo as xt}from"@rixl/sdk";import{atom as h,computed as St,map as Ct}from"nanostores";const g=(e,t,n)=>t.forEach(t=>window[`${e}EventListener`](t,n)),wt=e=>Math.min(Math.max(e,0),1),Tt=e=>`touches`in e?e.touches[0]?.clientX??e.changedTouches?.[0]?.clientX??0:e.clientX,Et=e=>({isDragging:!1,progress:Number.isFinite(e.duration)&&e.duration>0?e.currentTime/e.duration:0,initialRect:null,initialClientX:null,initialProgress:0,startTime:0,hasMoved:!1}),_=(e,t,n)=>{e.progress=Number(t.toFixed(6)),n?.(e.progress)},Dt=(e,t,n)=>{e.isDragging=t,n?.(t)},Ot=(e,t)=>{if(e.initialClientX===null)return!1;let n=Math.abs(t-e.initialClientX),r=Date.now()-e.startTime;return n>=15||r>=200},kt=(e,t,n)=>{e.hasMoved=!0,Dt(e,!0,n),e.initialClientX=t,e.initialProgress=e.progress},At=(e,t)=>{if(!e.initialRect)return null;let n=(t-(e.initialClientX??e.initialRect.left))/e.initialRect.width,r=e.initialClientX?e.initialProgress:0;return wt(n+r)},jt=e=>!e.initialRect||e.initialClientX===null?null:wt((e.initialClientX-e.initialRect.left)/e.initialRect.width),Mt=(e,t)=>{Dt(e,!1,t),e.hasMoved=!1,e.initialRect=null,e.initialClientX=null},Nt=(e,t,n)=>()=>{if(e.isDragging)return;let r=Number.isFinite(t.duration)&&t.duration>0?t.currentTime/t.duration:0;_(e,r,n)},Pt=(e,t,n)=>r=>{let i=Tt(r);if(!e.isDragging){if(!Ot(e,i))return;kt(e,i,t)}let a=At(e,i);a!==null&&_(e,a,n)},Ft=({state:e,video:t,onDraggingChange:n,onProgressChange:r,removeListeners:i})=>()=>{let a=e.hasMoved?null:jt(e),o=Number.isFinite(t.duration)&&t.duration>0;a===null?e.isDragging&&o&&(t.currentTime=e.progress*t.duration):(_(e,a,r),o&&(t.currentTime=a*t.duration)),Mt(e,n),i()},It=(e,t,n)=>r=>{e.initialRect=r.currentTarget.getBoundingClientRect(),e.startTime=Date.now(),e.hasMoved=!1,e.initialClientX=Tt(r),g(`add`,[`mousemove`,`touchmove`],t),g(`add`,[`mouseup`,`touchend`,`blur`],n)},Lt=({video:e,onDraggingChange:t,onProgressChange:n})=>{let r=Et(e);t?.(!1),n?.(r.progress);let i=Nt(r,e,n),a=Pt(r,t,n),o;o=Ft({state:r,video:e,onDraggingChange:t,onProgressChange:n,removeListeners:()=>{g(`remove`,[`mousemove`,`touchmove`],a),g(`remove`,[`mouseup`,`touchend`,`blur`],o)}});let s=It(r,a,o);return e.addEventListener(`timeupdate`,i),{handleDragStart:s,destroy:()=>{o(),e.removeEventListener(`timeupdate`,i)}}},Rt=async e=>{let{data:t,error:n,response:r}=await ht({path:{image_id:e}});if(n)throw Error(`HTTP error! status: ${r?.status??500}`);if(!t?.image)throw Error(`HTTP error! status: 404`);return t.image},zt=i(),Bt=e=>zt.get(e,Rt),Vt=async e=>{let{data:t,error:n,response:r}=await xt({path:{video_id:e}});if(n)throw Error(`HTTP error! status: ${r?.status??500}`);if(!t?.video)throw Error(`HTTP error! status: 404`);return t.video},Ht=i(),Ut=e=>Ht.get(e,Vt);function v(e){let t=e.toString();return e<10&&(t=`0`+t),t}const Wt=e=>{if(isNaN(e)||e<0)return`00:00`;let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%60),i=`${v(n)}:${v(r)}`;return t>0?`${v(t)}:${i}`:i};function y(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}const Gt=.5,Kt=.7,qt={isLoading:!0,isVisible:!1,aspectRatio:Gt};function Jt(e,t){switch(t.type){case`reset`:return{isLoading:!0,isVisible:!1,aspectRatio:t.aspectRatio??e.aspectRatio};case`loaded`:return{...e,isLoading:!1};case`visible`:return{...e,isVisible:!0};case`set_aspect_ratio`:return{...e,aspectRatio:t.aspectRatio};default:return e}}function Yt(e,t){if(e&&t)return e/t}function Xt({aspectRatio:e,isVisible:t,thumbhashUrl:n}){let r={display:`block`,width:`100%`,aspectRatio:e,position:`relative`};return t||(r.backgroundImage=`url(${n})`,r.backgroundSize=e>=.7?`contain`:`cover`,r.backgroundPosition=`center`,r.backgroundRepeat=`no-repeat`),r}function Zt(e,t){return{position:`absolute`,top:0,left:0,width:`100%`,height:`100%`,objectFit:e>=.7?`contain`:`cover`,opacity:+!t,transition:`opacity 300ms ease`}}function Qt(e){return e=e.replace(`#`,``),{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}}function b(e,t=100){let{r:n,g:r,b:i}=Qt(e);return t/=100,`rgba(${n}, ${r}, ${i}, ${t})`}const $t=[`en`,`de`,`es`,`fr`,`it`,`pl`,`ru`,`tr`,`uk`],en={en:{play:`Play (k)`,pause:`Pause (k)`,replay:`Replay`,mute:`Mute (m)`,unmute:`Unmute (m)`,volume:`Volume`,settings:`Settings`,pip:`Miniplayer (i)`,fullScreen:`Full screen (f)`,captionsToggle:`Subtitles/close captions (c)`},de:{play:`Wiedergabe (k)`,pause:`Pause (k)`,replay:`Wiederholen`,mute:`Stummschalten (m)`,unmute:`Stummschaltung aufheben (m)`,volume:`Lautstärke`,settings:`Einstellungen`,pip:`Bild-im-Bild (i)`,fullScreen:`Vollbild (f)`,captionsToggle:`Untertitel/CC (c)`},es:{play:`Reproducir (k)`,pause:`Pausar (k)`,replay:`Repetir`,mute:`Silenciar (m)`,unmute:`Reactivar sonido (m)`,volume:`Volumen`,settings:`Configuración`,pip:`Minirreproductor (i)`,fullScreen:`Pantalla completa (f)`,captionsToggle:`Subtítulos (c)`},fr:{play:`Lire (k)`,pause:`Pause (k)`,replay:`Rejouer`,mute:`Muet (m)`,unmute:`Réactiver le son (m)`,volume:`Volume`,settings:`Paramètres`,pip:`Mini-lecteur (i)`,fullScreen:`Plein écran (f)`,captionsToggle:`Sous-titres/CC (c)`},it:{play:`Riproduci (k)`,pause:`Pausa (k)`,replay:`Rivedi`,mute:`Disattiva audio (m)`,unmute:`Riattiva audio (m)`,volume:`Volume`,settings:`Impostazioni`,pip:`Miniplayer (i)`,fullScreen:`Schermo intero (f)`,captionsToggle:`Sottotitoli (c)`},pl:{play:`Odtwórz (k)`,pause:`Pauza (k)`,replay:`Odtwórz ponownie`,mute:`Wycisz (m)`,unmute:`Wyłącz wyciszenie (m)`,volume:`Głośność`,settings:`Ustawienia`,pip:`Mini-odtwarzacz (i)`,fullScreen:`Pełny ekran (f)`,captionsToggle:`Napisy (c)`},ru:{play:`Воспроизвести (k)`,pause:`Пауза (k)`,replay:`Воспроизвести снова`,mute:`Выключить звук (m)`,unmute:`Включить звук (m)`,volume:`Громкость`,settings:`Настройки`,pip:`Мини-плеер (i)`,fullScreen:`Во весь экран (f)`,captionsToggle:`Субтитры (c)`},tr:{play:`Oynat (k)`,pause:`Duraklat (k)`,replay:`Tekrar oyna`,mute:`Sessize al (m)`,unmute:`Sesi aç (m)`,volume:`Ses düzeyi`,settings:`Ayarlar`,pip:`Mini oynatıcı (i)`,fullScreen:`Tam ekran (f)`,captionsToggle:`Altyazılar (c)`},uk:{play:`Відтворити (k)`,pause:`Пауза (k)`,replay:`Повторити`,mute:`Вимкнути звук (m)`,unmute:`Увімкнути звук (m)`,volume:`Гучність`,settings:`Налаштування`,pip:`Міні-плеєр (i)`,fullScreen:`На весь екран (f)`,captionsToggle:`Субтитри (c)`}};function x(e){let t=(e??``).toLowerCase();return $t.find(e=>e===t)??`en`}function tn(e){return en[x(e)]}const nn=16,rn=12,an=120,on=.03,sn=.07,cn=100,ln=8,S=.6,un=85,dn=80,fn=24,pn=(e,t)=>{if(!e.width)return 16;let n=e.width*on,r=Math.max(.1,t/100),i=n*(1+.5*Math.log2(r)),a=Math.min(120,e.width*sn);return f(i,12,a)},mn=(e,t=.6)=>{let n=t*100,r=Math.max(0,100-n);return{x:f(e.x,0,r),y:f(e.y,0,100)}},hn=(e,t,n)=>!n.width||!n.height?{x:0,y:0}:{x:e/n.width*100,y:t/n.height*100};function gn(e){let{containerRect:t,elementRect:n,clientX:r,clientY:i}=e;return{clickXRelative:r-t.left,clickYRelative:i-t.top,currentVisualX:n.left-t.left,currentVisualY:n.top-t.top}}function _n(e){let{startPositionPixels:t,startX:n,startY:r,currentXRelative:i,currentYRelative:a,viewport:o}=e,s=i-n,c=a-r,l=t.x+s,u=t.y+c,d=hn(l,u,o);return mn(d,S)}function vn(e){return{width:e.width-16,height:e.height-16}}function yn(e,t){return!t&&e>85}function bn(e,t){let n=Math.max(1,t*.06);switch(e){case`drop-shadow`:return`${n}px ${n}px ${n}px rgba(0, 0, 0, 0.75)`;case`raised`:return`${n}px ${n}px 0 rgba(0, 0, 0, 0.5), -${n*.5}px -${n*.5}px 0 rgba(255, 255, 255, 0.25)`;case`depressed`:return`-${n}px -${n}px 0 rgba(0, 0, 0, 0.5), ${n*.5}px ${n*.5}px 0 rgba(255, 255, 255, 0.25)`;case`outline`:return`
2
+ -${n}px -${n}px 0 #000,
3
+ ${n}px -${n}px 0 #000,
4
+ -${n}px ${n}px 0 #000,
5
+ ${n}px ${n}px 0 #000
6
+ `;default:return`none`}}function xn({position:e,isDragging:t,controlsVisible:n}){let r=t?`none`:`all 300ms ease`;if(yn(e.y,t)){let t=n?80:24;return{left:`${e.x}%`,top:`calc(100% - ${t}px)`,bottom:`auto`,transform:`translateY(-100%)`,transition:r}}return{left:`${e.x}%`,top:`${e.y}%`,bottom:`auto`,transform:`translateY(0)`,transition:r}}function Sn(e,t,n){let r=(t||300)*S,i=e.captionWindowOpacity>0?b(e.captionWindowColor,e.captionWindowOpacity):`transparent`;return{width:`${r}px`,backgroundColor:i,cursor:n?`grabbing`:`grab`,touchAction:`none`}}function Cn(e,t){let n=m[e.captionFontFamily]||m.proportional_sans;return{fontSize:`${t}px`,fontFamily:n,color:b(e.captionFontColor,e.captionFontOpacity),backgroundColor:e.captionBGOpacity>0?b(e.captionBGColor,e.captionBGOpacity):`transparent`,textShadow:bn(e.captionCharacterEdgeStyle,t),userSelect:`none`,touchAction:`none`}}function C(){let e=document;return!!(e.fullscreenElement||e.webkitFullscreenElement||e.mozFullScreenElement||e.msFullscreenElement)}function w(e){if(!e)return!1;if(document.pictureInPictureElement===e)return!0;let t=e.getRootNode();return t instanceof ShadowRoot&&t.pictureInPictureElement===e}async function wn(e){if(e)try{w(e)?await document.exitPictureInPicture():await e.requestPictureInPicture()}catch(e){console.error(`Error toggling PIP:`,e)}}const T=`videosdk_progress_map`,Tn=5,En=5,Dn=2e3,On=e=>{if(typeof window>`u`)return 0;try{let t=window.localStorage.getItem(T);if(!t)return 0;let n=JSON.parse(t);return Math.max(0,Math.floor(n[e]??0))}catch{return 0}},kn=(e,t)=>{if(typeof window<`u`)try{let n=window.localStorage.getItem(T),r=n?JSON.parse(n):{};r[e]=Math.max(0,Math.floor(t)),window.localStorage.setItem(T,JSON.stringify(r))}catch{}};function An(e,t){return e>5&&e<t-5}function jn(e,t){return t-e>Dn}const E={BEFORE:0,AFTER:1},Mn=5,D={UNLOADED:`unloaded`,IDLE:`idle`,PRELOADING:`preloading`,PLAYING:`playing`};function Nn(e,t,n){if(n)return D.PLAYING;let r=e-t;return Math.abs(r)>5?D.UNLOADED:r<0&&r>=-E.BEFORE||r>0&&r<=E.AFTER?D.PRELOADING:D.IDLE}const Pn=300;function Fn(){return{timerId:null}}function In(e){let{state:t,shouldShow:n,onShow:r,onHide:i}=e;t.timerId!==null&&(clearTimeout(t.timerId),t.timerId=null),n?t.timerId=setTimeout(()=>{t.timerId=null,r()},300):i()}function Ln(e){e.timerId!==null&&(clearTimeout(e.timerId),e.timerId=null)}function Rn(e,t){if(e&&t&&e.videoWidth!==0&&e.videoHeight!==0)return e.videoWidth/e.videoHeight}function zn(e,t){p.setPaused(e,!1),p.setEnded(e,!1),t.onSegmentStart()}function Bn(e,t){p.setPaused(e,!0),t.onSegmentEnd()}function Vn(e,t,n){let r=t?.playbackRate;typeof r==`number`&&p.setPlaybackRate(e,r),n.onRestartSegment()}function Hn(e,t){p.setPaused(e,!0),p.setLoading(e,!1),t.onShowSpinner(!1)}function Un(e,t){p.setLoading(e,t)}const Wn=250,Gn=400;function Kn(){return{singleClickTimerId:null,lastClickTime:0}}function O(e){e.singleClickTimerId!==null&&(clearTimeout(e.singleClickTimerId),e.singleClickTimerId=null)}function qn(e,t){O(e),e.singleClickTimerId=setTimeout(()=>{t(),e.singleClickTimerId=null},250)}function Jn(e){let{state:t,hideUI:n,allowFullscreen:r,isExcludedTarget:i,onTogglePlay:a}=e;if(n||i)return!1;let o=Date.now(),s=o-t.lastClickTime;return t.lastClickTime=o,s>0&&s<400?(O(t),!0):r?(qn(t,a),!0):(a(),!0)}function Yn(e){let{state:t,allowFullscreen:n,isExcludedTarget:r,onToggleFullscreen:i}=e;return!n||r?!1:(O(t),t.lastClickTime=0,i(),!0)}function Xn(e){O(e)}function Zn(e){let t=()=>e(C());return document.addEventListener(`fullscreenchange`,t),()=>document.removeEventListener(`fullscreenchange`,t)}function Qn(e,t){if(!e)return()=>void 0;let n=()=>t(w(e));return e.addEventListener(`enterpictureinpicture`,n),e.addEventListener(`leavepictureinpicture`,n),()=>{e.removeEventListener(`enterpictureinpicture`,n),e.removeEventListener(`leavepictureinpicture`,n)}}function $n({videoElement:e,isCurrentlyInPip:t}){return!(typeof document>`u`||document.visibilityState!==`hidden`||!t||!e||w(e))}function er(e,t=e=>console.error(`Error maintaining PIP mode:`,e)){let n=()=>{let n=e();$n(n)&&n.videoElement.requestPictureInPicture().catch(t)};return document.addEventListener(`visibilitychange`,n),()=>document.removeEventListener(`visibilitychange`,n)}function tr({forcedMuted:e,playerMuted:t,playerInteracted:n,playerVolume:r,playerPreviousVolume:i}){if(e)return null;if(ct({playerMuted:t,playerInteracted:n}))return{muted:!0,volume:null,storeVolumeUpdate:null};let a=Ze(r,i);return{muted:!1,volume:a,storeVolumeUpdate:r===0?a:null}}function nr(e,t){if(!e)return()=>void 0;let n=()=>{t({width:e.clientWidth,height:e.clientHeight})};n();let r=new ResizeObserver(n);r.observe(e);let i=null,a=()=>{i===null&&(i=requestAnimationFrame(()=>{i=null,n()}))};return window.addEventListener(`resize`,a),()=>{r.disconnect(),window.removeEventListener(`resize`,a),i!==null&&cancelAnimationFrame(i)}}function rr(e){switch(e){case D.UNLOADED:return`none`;case D.IDLE:return`metadata`;case D.PRELOADING:case D.PLAYING:return`auto`}}function ir(e,t){if(!e)return()=>void 0;e.playbackRate=t;let n=()=>{e.playbackRate=t};return e.addEventListener(`loadeddata`,n),()=>e.removeEventListener(`loadeddata`,n)}function ar(e,t){return e?(e.addEventListener(`ended`,t),()=>e.removeEventListener(`ended`,t)):()=>void 0}function or(e){return!e?.width||!e?.height?null:e.width/e.height}function sr({isFeed:e,isCurrent:t,loadState:n,showSpinner:r,videoReadyState:i}){return e?t?n!==D.PLAYING||r||i<2?`none`:`play`:`pause`:`none`}function cr(e,t){return!t||!(e instanceof Node)?!1:!!document.querySelector(`[${t}]`)?.contains(e)}function lr(e,t,n){if(!t)return!1;let r=e.target;if(!(r instanceof Node))return!1;let i=e.composedPath();return!(i.includes(t)||t.contains(r)||n&&i.some(e=>e instanceof Element&&e.hasAttribute(n))||cr(r,n))}function ur({getContainer:e,excludeAttribute:t,onOutsideClick:n}){let r=r=>{lr(r,e(),t)&&n(r)};return document.addEventListener(`mousedown`,r),()=>document.removeEventListener(`mousedown`,r)}function dr(e){let t=()=>{document.visibilityState===`hidden`&&e()};return document.addEventListener(`visibilitychange`,t),()=>document.removeEventListener(`visibilitychange`,t)}function fr(e){if(!e)return!1;if(!e.paused&&e.currentTime>0){let t=e.buffered;for(let n=0;n<t.length;n++)if(e.currentTime>=t.start(n)&&e.currentTime<t.end(n))return!1}return e.readyState<3&&(e.seeking||e.readyState===2)}const pr=e=>[...e].sort((e,t)=>e.height>0&&t.height>0?t.height-e.height:e.height>0?-1:t.height>0?1:t.bitrate-e.bitrate),k=e=>e.includes(`.m3u8`)||e.includes(`application/vnd.apple.mpegurl`)||e.includes(`manifest(format=m3u8`)||e.toLowerCase().includes(`m3u8`),A=e=>{if(e.height>0&&e.width>0)return`${Math.min(e.height,e.width)}p`;if(e.height>0)return`${e.height}p`;if(e.width>0)return`${e.width}p`;{let t=Math.round(e.bitrate/1e3);return t>=3e3?`1080p`:t>=2e3?`720p`:t>=1e3?`480p`:t>=500?`360p`:t>=250?`240p`:`144p`}},mr=({resolution:e,levels:t,currentLevel:n,autoText:r})=>{let i=e===-1;return i&&t.length>0&&n>=0&&t[n]?`${r} (${t[n].name})`:!i&&e>=0&&t[e]?t[e].name:r},hr=3,gr=1;function _r(){return{networkRetries:0,mediaRecoveries:0}}function vr(e,t){return e.fatal?e.type===`networkError`?t.networkRetries<3?(t.networkRetries+=1,{kind:`retry-network`,attempt:t.networkRetries}):{kind:`give-up`,payload:{error:e.type,code:e.details}}:e.type===`mediaError`&&t.mediaRecoveries<1?(t.mediaRecoveries+=1,{kind:`recover-media`,attempt:t.mediaRecoveries}):{kind:`give-up`,payload:{error:e.type,code:e.details}}:null}let j=null;function yr(){return j??=import(`hls.js`).then(e=>e.default,e=>{throw j=null,e}),j}function br(e){return(t,n)=>{if(!n.audioTracks||n.audioTracks.length<=1)return;let r=n.audioTracks.map((e,t)=>({index:t,label:e.name||e.lang||`Audio Track ${t+1}`,language:e.lang||`unknown`,kind:`main`,track:e}));p.setAvailableAudioTracks(e,r)}}function xr(e,t,n){let r=p.get(e).get();r.audioTrack!==n.id&&(p.get(e).set({...r,audioTrack:n.id}),Oe(n.id))}function Sr(e,t){t(e.levels.map((e,t)=>({height:e.height,width:e.width,bitrate:e.bitrate,name:A(e),index:t})))}function Cr(e){let{hlsInstance:t,events:n,playerId:r,videoUrl:i,onLevelsChange:a,onLevelSwitch:o}=e,s=br(r),c=(e,t)=>xr(r,e,t),l=()=>Sr(t,a);t.on(n.MEDIA_ATTACHED,()=>{t.loadSource(i)}),t.on(n.AUDIO_TRACKS_UPDATED,s),t.on(n.AUDIO_TRACK_SWITCHED,c),t.on(n.LEVELS_UPDATED,l),t.on(n.MANIFEST_PARSED,l),t.on(n.LEVEL_SWITCHED,(e,t)=>o(t.level))}function wr({hlsInstance:e,events:t,videoElement:n},r){for(let i=0;i<n.buffered.length;i++){let a=n.buffered.start(i),o=n.buffered.end(i);(a<r-30||o>r+30)&&e.trigger(t.BUFFER_FLUSHING,{startOffset:a,endOffset:o,type:`video`})}}function Tr(e,t){for(let n=0;n<e.buffered.length;n++){let r=e.buffered.start(n),i=e.buffered.end(n);if(t>=r-5&&t<=i+5)return!0}return!1}function Er(e){let{hlsInstance:t,videoElement:n}=e;return()=>{let r=n.currentTime;Tr(n,r)||(t.config.maxBufferLength=30,wr(e,r))}}function Dr(e){return{debug:!1,enableWorker:!0,lowLatencyMode:!1,backBufferLength:10,maxBufferLength:e?10:30,maxMaxBufferLength:e?20:60,maxBufferSize:6e7,maxBufferHole:.3,manifestLoadingTimeOut:1e4,fragLoadingTimeOut:2e4,startFragPrefetch:!0,highBufferWatchdogPeriod:2,nudgeOffset:.2,nudgeMaxRetry:5,testBandwidth:!0,progressive:!1,abrEwmaDefaultEstimate:5e6,abrMaxWithRealBitrate:!0}}function Or(e,t,n){return!e.isSupported()&&t.canPlayType(`application/vnd.apple.mpegurl`)?(t.src=n,!0):!1}function kr(e,t,n){let r=_r();e.on(t.ERROR,(t,i)=>{let a=vr(i,r);if(a)switch(a.kind){case`retry-network`:e.startLoad();return;case`recover-media`:e.recoverMediaError();return;case`give-up`:n?.(a.payload);return}})}function Ar(e){let{hlsInstance:t,videoElement:n,playerId:r,handleSeeking:i,state:a}=e;return{hls:t,get levels(){return a.levels},get currentLevel(){return a.currentLevel},get isAuto(){return a.isAuto},setQuality:e=>{e===-1?(t.loadLevel=-1,a.isAuto=!0):(t.loadLevel=e,a.isAuto=!1)},destroy:()=>{n.removeEventListener(`seeking`,i),t.destroy(),p.setHlsInstance(r,null)}}}async function jr(e){let{videoElement:t,videoUrl:n,playerId:r,isPreloading:i,onError:a,onLevelsChange:o,onLevelSwitch:s}=e;if(!k(n))return t.src=n,null;let c=await yr();if(Or(c,t,n))return null;let l=new c(Dr(i)),u={levels:[],currentLevel:-1,isAuto:!0},d=Er({hlsInstance:l,events:c.Events,videoElement:t});return t.addEventListener(`seeking`,d),p.setHlsInstance(r,l),l.attachMedia(t),Cr({hlsInstance:l,events:c.Events,playerId:r,videoUrl:n,onLevelsChange:e=>{u.levels=e,o?.(e)},onLevelSwitch:e=>{u.currentLevel=e,s?.(e)}}),kr(l,c.Events,a),Ar({hlsInstance:l,videoElement:t,playerId:r,handleSeeking:d,state:u})}const M=h({segments:/* @__PURE__ */ new Map,currentSegment:/* @__PURE__ */ new Map}),N={startSegment(e,t,n){M.get().currentSegment.get(e)&&this.endSegment(e,t);let r=M.get(),i=new Map(r.currentSegment);i.set(e,{start_ms:t,speed:n}),M.set({...r,currentSegment:i})},endSegment(e,t){let n=M.get(),r=n.currentSegment.get(e);if(r){if(t-r.start_ms>100){let i={start_ms:Math.round(r.start_ms),end_ms:Math.round(t),speed:r.speed},a=new Map(n.segments),o=a.get(e)||[];a.set(e,[...o,i]);let s=new Map(n.currentSegment);s.set(e,null),M.set({...n,segments:a,currentSegment:s})}else{let t=new Map(n.currentSegment);t.set(e,null),M.set({...n,currentSegment:t})}}},getSegmentsWithCurrent(e,t){let n=M.get(),r=[...n.segments.get(e)||[]],i=n.currentSegment.get(e);return i&&t-i.start_ms>100&&r.push({start_ms:Math.round(i.start_ms),end_ms:Math.round(t),speed:i.speed}),r},clearSegments(e){let t=M.get(),n=new Map(t.segments);n.delete(e);let r=new Map(t.currentSegment);r.delete(e),M.set({...t,segments:n,currentSegment:r})}};function Mr(e){let{playerId:t,currentTimeMs:n,playbackRate:r}=e;N.startSegment(t,n,r)}function Nr(e){let{playerId:t,currentTimeMs:n}=e;N.endSegment(t,n)}function Pr(e){let{playerId:t,currentTimeMs:n,playbackRate:r,isPaused:i}=e;i||(N.endSegment(t,n),N.startSegment(t,n,r))}const Fr={visible:!1,hideTimeout:null},P={state:/* @__PURE__ */ new Map,get:e=>{let t=P.state.get(e);return t||(t=Ct({...Fr}),P.state.set(e,t)),t},deleteControls:e=>{let t=P.state.get(e);if(t){let e=t.get();e.hideTimeout&&clearTimeout(e.hideTimeout)}P.state.delete(e)},setVisible:(e,t)=>{let n=P.get(e),r=n.get();r.hideTimeout&&clearTimeout(r.hideTimeout),n.setKey(`visible`,t),n.setKey(`hideTimeout`,null)},showControls:(e,t)=>{let n=P.get(e),r=n.get();r.hideTimeout&&clearTimeout(r.hideTimeout);let i=null;t!==void 0&&t>0&&(i=setTimeout(()=>{P.setVisible(e,!1)},t)),n.setKey(`visible`,!0),n.setKey(`hideTimeout`,i)},hideControls:e=>{let t=P.get(e),n=t.get();n.hideTimeout&&clearTimeout(n.hideTimeout),t.setKey(`visible`,!1),t.setKey(`hideTimeout`,null)}},F=h([`main`]),I=h(`forward`),Ir=St(F,e=>e[e.length-1]),Lr=e=>{let t=F.get();t[t.length-1]!==e&&(I.set(`forward`),F.set([...t,e]))},Rr=()=>{let e=F.get();e.length<=1||(I.set(`back`),F.set(e.slice(0,-1)))},zr=()=>{I.set(`back`),F.set([`main`])};function Br(e,t,n){return e>=1?50+(e-1)/(n-1)*50:(e-t)/(1-t)*50}function Vr({rect:e,clientX:t,min:n,max:r,step:i}){let a=n+f((t-e.left)/e.width,0,1)*(r-n),o=Math.round(a/i)*i;return Number(f(o,n,r).toFixed(2))}const Hr={en:{quality:{title:`Quality`,auto:`Auto`},audio:{title:`Audio Tracks`,noTracks:`No audio tracks`},playback:{speed:`Playback speed`,custom:`Custom`,normal:`Normal`},captions:{title:`Subtitles/CC`,off:`Off`,style:`Caption Style`,font:`Font`,background:`Background`,window:`Window`,resetAll:`Reset all`,edgeStyle:{title:`Edge style`,options:{none:`None`,"drop-shadow":`Drop shadow`,raised:`Raised`,depressed:`Depressed`,outline:`Outline`}},fontFamilies:{monospace_serif:`Monospace Serif`,proportional_serif:`Proportional Serif`,monospace_sans:`Monospace Sans-Serif`,proportional_sans:`Proportional Sans-Serif`,casual:`Casual`,cursive:`Cursive`,small_caps:`Small Capitals`}},stats:{title:`Stats for nerds`,copyDebug:`Copy debug info`,videoId:`Video ID`,playerId:`Player ID`,viewport:`Viewport / Frames`,dropped:`dropped`,resolution:`Current / Optimal Res`,volume:`Volume / Normalized`,codecs:`Codecs`,color:`Color`,connectionSpeed:`Connection Speed`,bufferHealth:`Buffer Health`},shortcuts:{title:`Keyboard shortcuts`,playPause:`Play / Pause`,seek10s:`Seek 10s backward / forward`,seek5s:`Seek 5s backward / forward`,pip:`Miniplayer`,fullscreen:`Full screen`,mute:`Mute / Unmute`,volume:`Volume Up / Down`},colors:{white:`White`,yellow:`Yellow`,green:`Green`,cyan:`Cyan`,blue:`Blue`,magenta:`Magenta`,red:`Red`,black:`Black`},common:{back:`Back`,family:`Family`,more:`more`,less:`less`,settings:`Settings`,size:`Size`,opacity:`Opacity`,color:`Color`,reset:`Reset`,custom:`Custom`,options:`Options`,off:`Off`}},de:{quality:{title:`Qualität`,auto:`Automatisch`},audio:{title:`Audiospur`,noTracks:`Keine Audiospuren`},playback:{speed:`Wiedergabegeschwindigkeit`,custom:`Benutzerdefiniert`,normal:`Normal`},captions:{title:`Untertitel/CC`,off:`Aus`,style:`Untertitelstil`,font:`Schriftart`,background:`Hintergrund`,window:`Fenster`,resetAll:`Alles zurücksetzen`,edgeStyle:{title:`Schriftkante`,options:{none:`Keine`,"drop-shadow":`Schlagschatten`,raised:`Erhöht`,depressed:`Vertieft`,outline:`Kontur`}},fontFamilies:{monospace_serif:`Monospace-Serif`,proportional_serif:`Proportional-Serif`,monospace_sans:`Monospace-Sans-Serif`,proportional_sans:`Proportional-Sans-Serif`,casual:`Locker`,cursive:`Kursiv`,small_caps:`Kapitälchen`}},stats:{title:`Statistiken für Nerds`,copyDebug:`Debug-Informationen kopieren`,videoId:`Video-ID`,playerId:`Player-ID`,viewport:`Ansichtsfenster / Bilder`,dropped:`verloren`,resolution:`Aktuell / Optimale Aufl.`,volume:`Lautstärke / Normalisiert`,codecs:`Codecs`,color:`Farbe`,connectionSpeed:`Verbindungsgeschwindigkeit`,bufferHealth:`Pufferzustand`},shortcuts:{title:`Tastaturkürzel`,playPause:`Wiedergabe / Pause`,seek10s:`10s zurück / vor`,seek5s:`5s zurück / vor`,pip:`Bild-im-Bild`,fullscreen:`Vollbild`,mute:`Stumm / Laut`,volume:`Lautstärke auf / ab`},colors:{white:`Weiß`,yellow:`Gelb`,green:`Grün`,cyan:`Cyan`,blue:`Blau`,magenta:`Magenta`,red:`Rot`,black:`Schwarz`},common:{back:`Zurück`,family:`Schriftart`,more:`mehr`,less:`weniger`,settings:`Einstellungen`,size:`Schriftgröße`,opacity:`Deckkraft`,color:`Farbe`,reset:`Zurücksetzen`,custom:`Benutzerdefiniert`,options:`Optionen`,off:`Aus`}},es:{quality:{title:`Calidad`,auto:`Automática`},audio:{title:`Pista de audio`,noTracks:`Sin pistas de audio`},playback:{speed:`Velocidad de reproducción`,custom:`Personalizado`,normal:`Normal`},captions:{title:`Subtítulos/CC`,off:`Desactivados`,style:`Estilo de subtítulos`,font:`Fuente`,background:`Fondo`,window:`Ventana`,resetAll:`Restablecer todo`,edgeStyle:{title:`Estilo de borde`,options:{none:`Ninguno`,"drop-shadow":`Sombra paralela`,raised:`Elevado`,depressed:`Hundido`,outline:`Contorno`}},fontFamilies:{monospace_serif:`Serif monoespaciada`,proportional_serif:`Serif proporcional`,monospace_sans:`Sans monoespaciada`,proportional_sans:`Sans proporcional`,casual:`Informal`,cursive:`Cursiva`,small_caps:`Versalitas`}},stats:{title:`Estadísticas técnicas`,copyDebug:`Copiar información de depuración`,videoId:`ID del video`,playerId:`ID del reproductor`,viewport:`Ventana gráfica / Fotogramas`,dropped:`perdidos`,resolution:`Resolución actual / óptima`,volume:`Volumen / normalizado`,codecs:`Códecs`,color:`Color`,connectionSpeed:`Velocidad de conexión`,bufferHealth:`Estado del búfer`},shortcuts:{title:`Atajos de teclado`,playPause:`Reproducir / Pausa`,seek10s:`Retroceder / Avanzar 10s`,seek5s:`Retroceder / Avanzar 5s`,pip:`Minirreproductor`,fullscreen:`Pantalla completa`,mute:`Silenciar / Activar sonido`,volume:`Subir / Bajar volumen`},colors:{white:`Blanco`,yellow:`Amarillo`,green:`Verde`,cyan:`Cian`,blue:`Azul`,magenta:`Magenta`,red:`Rojo`,black:`Negro`},common:{back:`Atrás`,family:`Familia`,more:`más`,less:`menos`,settings:`Ajustes`,size:`Tamaño`,opacity:`Opacidad`,color:`Color`,reset:`Restablecer`,custom:`Personalizado`,options:`Opciones`,off:`Desactivados`}},fr:{quality:{title:`Qualité`,auto:`Automatique`},audio:{title:`Piste audio`,noTracks:`Aucune piste audio`},playback:{speed:`Vitesse de lecture`,custom:`Personnalisé`,normal:`Normal`},captions:{title:`Sous-titres/CC`,off:`Désactivé`,style:`Style des sous-titres`,font:`Police`,background:`Arrière-plan`,window:`Fenêtre`,resetAll:`Tout réinitialiser`,edgeStyle:{title:`Style de bordure`,options:{none:`Aucun`,"drop-shadow":`Ombre portée`,raised:`Relief`,depressed:`Enfoncé`,outline:`Contour`}},fontFamilies:{monospace_serif:`Serif mono-espacé`,proportional_serif:`Serif proportionnel`,monospace_sans:`Sans mono-espacé`,proportional_sans:`Sans proportionnel`,casual:`Décontractée`,cursive:`Cursive`,small_caps:`Petites capitales`}},stats:{title:`Statistiques avancées`,copyDebug:`Copier les infos de débogage`,videoId:`ID de la vidéo`,playerId:`ID du lecteur`,viewport:`Fenêtre / Images`,dropped:`perdues`,resolution:`Rés. actuelle / optimale`,volume:`Volume / normalisé`,codecs:`Codecs`,color:`Couleur`,connectionSpeed:`Vitesse de connexion`,bufferHealth:`État du tampon`},shortcuts:{title:`Raccourcis clavier`,playPause:`Lecture / Pause`,seek10s:`Reculer / Avancer de 10s`,seek5s:`Reculer / Avancer de 5s`,pip:`Mini-lecteur`,fullscreen:`Plein écran`,mute:`Muet / Son`,volume:`Volume haut / bas`},colors:{white:`Blanc`,yellow:`Jaune`,green:`Vert`,cyan:`Cyan`,blue:`Bleu`,magenta:`Magenta`,red:`Rouge`,black:`Noir`},common:{back:`Retour`,family:`Famille`,more:`plus`,less:`moins`,settings:`Paramètres`,size:`Taille`,opacity:`Opacité`,color:`Couleur`,reset:`Réinitialiser`,custom:`Personnalisé`,options:`Options`,off:`Désactivé`}},it:{quality:{title:`Qualità`,auto:`Automatico`},audio:{title:`Traccia audio`,noTracks:`Nessuna traccia audio`},playback:{speed:`Velocità di riproduzione`,custom:`Personalizzato`,normal:`Normale`},captions:{title:`Sottotitoli/CC`,off:`Disattivati`,style:`Stile sottotitoli`,font:`Carattere`,background:`Sfondo`,window:`Finestra`,resetAll:`Ripristina tutto`,edgeStyle:{title:`Bordo carattere`,options:{none:`Nessuno`,"drop-shadow":`Ombra esterna`,raised:`Rilievo`,depressed:`Incavato`,outline:`Contorno`}},fontFamilies:{monospace_serif:`Serif a spaziatura fissa`,proportional_serif:`Serif proporzionale`,monospace_sans:`Sans a spaziatura fissa`,proportional_sans:`Sans proporzionale`,casual:`Casual`,cursive:`Corsivo`,small_caps:`Maiuscoletto`}},stats:{title:`Statistiche avanzate`,copyDebug:`Copia info di debug`,videoId:`ID video`,playerId:`ID lettore`,viewport:`Area visibile / Fotogrammi`,dropped:`persi`,resolution:`Risoluzione attuale / ottimale`,volume:`Volume / normalizzato`,codecs:`Codec`,color:`Colore`,connectionSpeed:`Velocità di connessione`,bufferHealth:`Stato del buffer`},shortcuts:{title:`Scorciatoie da tastiera`,playPause:`Riproduci / Pausa`,seek10s:`Indietro / Avanti 10s`,seek5s:`Indietro / Avanti 5s`,pip:`Miniplayer`,fullscreen:`Schermo intero`,mute:`Muto / Attiva audio`,volume:`Volume su / giù`},colors:{white:`Bianco`,yellow:`Giallo`,green:`Verde`,cyan:`Ciano`,blue:`Blu`,magenta:`Magenta`,red:`Rosso`,black:`Nero`},common:{back:`Indietro`,family:`Famiglia`,more:`altro`,less:`meno`,settings:`Impostazioni`,size:`Dimensione`,opacity:`Opacità`,color:`Colore`,reset:`Ripristina`,custom:`Personalizzato`,options:`Opzioni`,off:`Disattivati`}},pl:{quality:{title:`Jakość`,auto:`Automatyczna`},audio:{title:`Ścieżka audio`,noTracks:`Brak ścieżek audio`},playback:{speed:`Prędkość odtwarzania`,custom:`Niestandardowa`,normal:`Normalna`},captions:{title:`Napisy`,off:`Wyłączone`,style:`Styl napisów`,font:`Czcionka`,background:`Tło`,window:`Okno`,resetAll:`Resetuj wszystko`,edgeStyle:{title:`Krawędź`,options:{none:`Brak`,"drop-shadow":`Cień`,raised:`Wypukły`,depressed:`Wklęsły`,outline:`Kontur`}},fontFamilies:{monospace_serif:`Szeryfowa o stałej szerokości`,proportional_serif:`Szeryfowa proporcjonalna`,monospace_sans:`Bezszeryfowa o stałej szerokości`,proportional_sans:`Bezszeryfowa proporcjonalna`,casual:`Swobodna`,cursive:`Pisanka`,small_caps:`Kapitaliki`}},stats:{title:`Statystyki techniczne`,copyDebug:`Kopiuj informacje debugowania`,videoId:`ID wideo`,playerId:`ID odtwarzacza`,viewport:`Widok / Klatki`,dropped:`zgubione`,resolution:`Aktualna / optymalna rozdz.`,volume:`Głośność / znormalizowana`,codecs:`Kodeki`,color:`Kolor`,connectionSpeed:`Prędkość połączenia`,bufferHealth:`Stan bufora`},shortcuts:{title:`Skróty klawiszowe`,playPause:`Odtwórz / Pauza`,seek10s:`10s wstecz / do przodu`,seek5s:`5s wstecz / do przodu`,pip:`Odtwarzacz w oknie`,fullscreen:`Pełny ekran`,mute:`Wycisz / Wyłącz wyciszenie`,volume:`Głośność w górę / w dół`},colors:{white:`Biały`,yellow:`Żółty`,green:`Zielony`,cyan:`Cyjan`,blue:`Niebieski`,magenta:`Magenta`,red:`Czerwony`,black:`Czarny`},common:{back:`Wstecz`,family:`Krój`,more:`więcej`,less:`mniej`,settings:`Ustawienia`,size:`Rozmiar`,opacity:`Przezroczystość`,color:`Kolor`,reset:`Resetuj`,custom:`Niestandardowe`,options:`Opcje`,off:`Wyłączone`}},ru:{quality:{title:`Качество`,auto:`Авто`},audio:{title:`Аудиодорожки`,noTracks:`Нет аудиодорожек`},playback:{speed:`Скорость воспроизведения`,custom:`Произвольно`,normal:`Обычная`},captions:{title:`Субтитры`,off:`Выкл.`,style:`Стиль субтитров`,font:`Шрифт`,background:`Фон`,window:`Окно`,resetAll:`Сбросить всё`,edgeStyle:{title:`Стиль обводки`,options:{none:`Нет`,"drop-shadow":`Тень`,raised:`Приподнятая`,depressed:`Утопленная`,outline:`Контур`}},fontFamilies:{monospace_serif:`Моноширинный с засечками`,proportional_serif:`Пропорциональный с засечками`,monospace_sans:`Моноширинный без засечек`,proportional_sans:`Пропорциональный без засечек`,casual:`Неформальный`,cursive:`Курсив`,small_caps:`Капители`}},stats:{title:`Статистика для сисадминов`,copyDebug:`Копировать отладочную информацию`,videoId:`ID видео`,playerId:`ID плеера`,viewport:`Окно просмотра / Кадры`,dropped:`пропусков`,resolution:`Текущ. / оптим. разр.`,volume:`Громкость / нормал.`,codecs:`Кодеки`,color:`Цвет`,connectionSpeed:`Скорость соединения`,bufferHealth:`Состояние буфера`},shortcuts:{title:`Сочетания клавиш`,playPause:`Воспроизведение / Пауза`,seek10s:`10с назад / вперед`,seek5s:`5с назад / вперед`,pip:`Мини-плеер`,fullscreen:`Полноэкранный режим`,mute:`Вкл. / Выкл. звук`,volume:`Громче / тише`},colors:{white:`Белый`,yellow:`Жёлтый`,green:`Зелёный`,cyan:`Циан`,blue:`Синий`,magenta:`Маджента`,red:`Красный`,black:`Чёрный`},common:{back:`Назад`,family:`Гарнитура`,more:`ещё`,less:`меньше`,settings:`Настройки`,size:`Размер`,opacity:`Прозрачность`,color:`Цвет`,reset:`Сбросить`,custom:`Пользовательский`,options:`Параметры`,off:`Выкл.`}},tr:{quality:{title:`Kalite`,auto:`Otomatik`},audio:{title:`Ses parçası`,noTracks:`Ses parçası yok`},playback:{speed:`Oynatma hızı`,custom:`Özel`,normal:`Normal`},captions:{title:`Altyazılar`,off:`Kapalı`,style:`Altyazı Stili`,font:`Yazı tipi`,background:`Arka plan`,window:`Pencere`,resetAll:`Tümünü sıfırla`,edgeStyle:{title:`Kenar stili`,options:{none:`Yok`,"drop-shadow":`Gölge`,raised:`Kabartma`,depressed:`Çökük`,outline:`Dış çizgi`}},fontFamilies:{monospace_serif:`Sabit aralıklı serif`,proportional_serif:`Orantılı serif`,monospace_sans:`Sabit aralıklı sans`,proportional_sans:`Orantılı sans`,casual:`Gündelik`,cursive:`El yazısı`,small_caps:`Küçük büyük harf`}},stats:{title:`Gelişmiş istatistikler`,copyDebug:`Hata ayıklama bilgisini kopyala`,videoId:`Video kimliği`,playerId:`Oynatıcı kimliği`,viewport:`Görüntü alanı / Kareler`,dropped:`düşen`,resolution:`Geçerli / optimal çöz.`,volume:`Ses düzeyi / normalize`,codecs:`Kodekler`,color:`Renk`,connectionSpeed:`Bağlantı hızı`,bufferHealth:`Arabellek durumu`},shortcuts:{title:`Klavye kısayolları`,playPause:`Oynat / Duraklat`,seek10s:`10sn Geri / İleri`,seek5s:`5sn Geri / İleri`,pip:`Mini oynatıcı`,fullscreen:`Tam ekran`,mute:`Sesi Aç / Kapat`,volume:`Ses Aç / Kıs`},colors:{white:`Beyaz`,yellow:`Sarı`,green:`Yeşil`,cyan:`Camgöbeği`,blue:`Mavi`,magenta:`Eflatun`,red:`Kırmızı`,black:`Siyah`},common:{back:`Geri`,family:`Aile`,more:`daha fazla`,less:`daha az`,settings:`Ayarlar`,size:`Boyut`,opacity:`Opaklık`,color:`Renk`,reset:`Sıfırla`,custom:`Özel`,options:`Seçenekler`,off:`Kapalı`}},uk:{quality:{title:`Якість`,auto:`Автоматично`},audio:{title:`Аудіодоріжки`,noTracks:`Немає аудіодоріжок`},playback:{speed:`Швидкість відтворення`,custom:`Власна`,normal:`Звичайна`},captions:{title:`Субтитри`,off:`Вимкнено`,style:`Стиль субтитрів`,font:`Шрифт`,background:`Фон`,window:`Вікно`,resetAll:`Скинути все`,edgeStyle:{title:`Стиль обведення`,options:{none:`Немає`,"drop-shadow":`Тінь`,raised:`Піднятий`,depressed:`Втоплений`,outline:`Контур`}},fontFamilies:{monospace_serif:`Моноширинний з зарубками`,proportional_serif:`Пропорційний з зарубками`,monospace_sans:`Моноширинний без зарубок`,proportional_sans:`Пропорційний без зарубок`,casual:`Неформальний`,cursive:`Курсив`,small_caps:`Капітелі`}},stats:{title:`Статистика для сисадмінів`,copyDebug:`Копіювати налагоджувальну інформацію`,videoId:`ID відео`,playerId:`ID програвача`,viewport:`Область перегляду / Кадри`,dropped:`пропусків`,resolution:`Поточна / оптим. розд.`,volume:`Гучність / нормаліз.`,codecs:`Кодеки`,color:`Колір`,connectionSpeed:`Швидкість з'єднання`,bufferHealth:`Стан буфера`},shortcuts:{title:`Комбінації клавіш`,playPause:`Відтворення / Пауза`,seek10s:`10с назад / уперед`,seek5s:`5с назад / уперед`,pip:`Міні-плеєр`,fullscreen:`Повноекранний режим`,mute:`Увімк. / Вимк. звук`,volume:`Гучніше / тихіше`},colors:{white:`Білий`,yellow:`Жовтий`,green:`Зелений`,cyan:`Ціан`,blue:`Синій`,magenta:`Маджента`,red:`Червоний`,black:`Чорний`},common:{back:`Назад`,family:`Гарнітура`,more:`ще`,less:`менше`,settings:`Налаштування`,size:`Розмір`,opacity:`Прозорість`,color:`Колір`,reset:`Скинути`,custom:`Користувацький`,options:`Параметри`,off:`Вимкнено`}}};function Ur(e){return Hr[x(e)]}function Wr(e,t){return{container:t?.container??Me.get(e),video:t?.video??Ae.get(e)}}function Gr(e){return p.get(e).get().isFullscreen||C()}async function Kr(e,t){try{if(C()&&document.exitFullscreen)await document.exitFullscreen();else if(t&&typeof t.webkitExitFullscreen==`function`)t.webkitExitFullscreen();else return;p.setFullscreen(e,!1)}catch{}}async function qr(e,t,n){try{if(t?.requestFullscreen)await t.requestFullscreen();else if(n?.requestFullscreen)await n.requestFullscreen();else if(n&&typeof n.webkitEnterFullscreen==`function`)n.webkitEnterFullscreen();else return;p.setFullscreen(e,!0)}catch{}}function Jr(e){P.setVisible(e,!0)}function Yr(e){P.hideControls(e)}async function Xr(e,t){let{container:n,video:r}=Wr(e,t);(n||r)&&(Gr(e)?await Kr(e,r):await qr(e,n,r))}async function Zr(e,t){let{video:n}=Wr(e,t);if(!n)return;let r=!p.get(e).get().isPictureInPicture;await wn(n),p.setPictureInPicture(e,r)}const Qr=(e,t)=>{let n=De(e.textTracks);p.setAvailableSubtitleTracks(t,n)},$r=e=>{p.setCurrentSubtitleText(e,``)},ei=(e,t)=>{if(!t.current)return;let n=p.get(e).get(),r=n.subtitleTrack;if(r<0||r>=n.availableSubtitleTracks.length){n.currentSubtitleText!==``&&$r(e);return}let i=n.availableSubtitleTracks[r].track;if(i.mode!==`showing`)return;let a=i.activeCues;if(!a||a.length===0){n.currentSubtitleText!==``&&p.setCurrentSubtitleText(e,``);return}Ce(a,i.cues);let o=a[a.length-1],s=Se(o);s!==n.currentSubtitleText&&p.setCurrentSubtitleText(e,s)},ti=(e,t)=>{if(!e||!t||!Number.isFinite(t)||t<=0)return[];let n=[];try{for(let r=0;r<e.length;r++){let i=e.end(r)/t*100;n.push({start:0,end:Math.min(100,i)})}}catch{return[]}return n},ni=(e,t,n)=>{if(!e.length||!n||!Number.isFinite(n)||n<=0)return 0;let r=t/n*100,i=0;return e.forEach(e=>{e.end>r&&e.start<=r+.1&&(i=Math.max(i,e.end-r))}),i};function ri(e,t){return!Number.isFinite(t)||t<=0||!Number.isFinite(e)||e<=0?0:e>=t?1:e/t}function ii(e,t,n){t&&(e.feed_id=t),n&&(e.post_id=n)}function ai({event:e,contentType:t,videoPositionMs:n,videoTotalDurationMs:r}){t===`video`&&(n!==void 0&&(e.video_position_ms=Math.round(n)),r!==void 0&&(e.video_total_duration_ms=Math.round(r)))}function oi({event:e,contentType:t,viewType:n,segments:r}){t===`video`&&L(n)&&r&&r.length!==0&&(e.segments=r)}function si(e){let{contentId:t,contentType:n,viewType:r,watchDurationMs:i,page:a,feedId:o,postId:s,videoPositionMs:c,videoTotalDurationMs:l,segments:u}=e,d={_type:`content_views`,timestamp:Date.now()/1e3,content_id:t,content_type:n,view_type:r,watch_duration_ms:i,page:o?`feed`:a};return ii(d,o,s),ai({event:d,contentType:n,videoPositionMs:c,videoTotalDurationMs:l}),oi({event:d,contentType:n,viewType:r,segments:u}),d}function ci(e){return e===null?0:Date.now()-e}function li(e,t){return t?`feed`:e}function L(e){return e===`watch`||e===`end`}function ui(e){return Math.round(e)}function R(e){return e*1e3}function di(e){return e/1e3}const z=h({});function B(e){z.set({...z.get(),...e})}const fi=`rixl_analytics_device_id`,V=h({deviceId:void 0});function pi(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():`${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}function mi(){if(typeof localStorage<`u`&&localStorage)try{return localStorage.getItem(fi)??void 0}catch{return}}function hi(e){if(typeof localStorage<`u`&&localStorage)try{localStorage.setItem(fi,e)}catch{}}function H(){let e=V.get();if(e.deviceId)return e.deviceId;let t=mi();if(t)return V.set({deviceId:t}),t;let n=pi();return hi(n),V.set({deviceId:n}),n}function gi(e){hi(e),V.set({deviceId:e})}const U=h({sessionId:void 0,started:!1});function _i(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():`s-${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}function vi(){let e=U.get();if(e.sessionId)return e.sessionId;let t=_i();return U.set({...e,sessionId:t}),t}function yi(){return U.get().started}function bi(){U.set({...U.get(),started:!0})}function xi(){U.set({sessionId:void 0,started:!1})}function Si(e){return{_type:`engagement`,timestamp:Date.now()/1e3,engagement_type:e.engagementType,...y({resource_type:e.resourceType,resource_id:e.resourceId,page:e.page,comment_text:e.commentText,share_platform:e.sharePlatform,country:e.country,device_type:e.deviceType,session_id:e.sessionId})}}function Ci(e){return{_type:`interaction`,timestamp:Date.now()/1e3,interaction_type:e.interactionType,...y({element_type:e.elementType,element_id:e.elementId,session_id:e.sessionId,page:e.page,page_url:e.pageUrl,scroll_depth:e.scrollDepth,search_query:e.searchQuery,click_x:e.clickX,click_y:e.clickY,device_type:e.deviceType,browser:e.browser,resource_id:e.resourceId,resource_type:e.resourceType,feed_id:e.feedId,post_id:e.postId,content_id:e.contentId})}}function wi(e){return{_type:`error`,timestamp:Date.now()/1e3,error_type:e.errorType,...y({error_code:e.errorCode,error_message:e.errorMessage,stack_trace:e.stackTrace,resource_type:e.resourceType,resource_id:e.resourceId,endpoint:e.endpoint,session_id:e.sessionId,device_type:e.deviceType,browser:e.browser,os:e.os})}}function Ti(e){return{_type:`session_start`,timestamp:Date.now()/1e3,...y({utm_source:e.utmSource,utm_campaign:e.utmCampaign,browser:e.browser,language:e.language,screen_resolution:e.screenResolution,platform:e.platform,tg_platform:e.tgPlatform,tg_version:e.tgVersion,timezone:e.timezone,timezone_offset:e.timezoneOffset,color_depth:e.colorDepth,touch_support:e.touchSupport,country:e.country,user_id:e.userId})}}function W(e){let t=e/1e3;return`${Number(t.toFixed(3))}s`}function Ei(e){return e===`video`?`MEDIA_TYPE_VIDEO`:`MEDIA_TYPE_IMAGE`}function Di(e){return{start_ms:W(e.start_ms),end_ms:W(e.end_ms),speed:e.speed}}function Oi(e,{context:t,deviceId:n}){let r={content_id:e.content_id,content_type:Ei(e.content_type),view_type:e.view_type,watch_duration_ms:W(e.watch_duration_ms),page:e.page,device_id:e.device_id??n,...y({feed_id:e.feed_id,post_id:e.post_id,video_position_ms:e.video_position_ms===void 0?void 0:W(e.video_position_ms),video_total_duration_ms:e.video_total_duration_ms===void 0?void 0:W(e.video_total_duration_ms),segments:e.segments!==void 0&&e.segments.length>0?e.segments.map(Di):void 0})},i=e.country??t.country;return i!==void 0&&(r.country=i),r}function ki(e,{context:t,sessionId:n}){let r={engagement_type:e.engagement_type,session_id:e.session_id??n,...y({resource_type:e.resource_type,resource_id:e.resource_id,page:e.page,comment_text:e.comment_text,share_platform:e.share_platform})},i=e.country??t.country;i!==void 0&&(r.country=i);let a=e.device_type??t.device;return a!==void 0&&(r.device_type=a),r}function Ai(e,{context:t,sessionId:n}){let r={interaction_type:e.interaction_type,session_id:e.session_id??n,...y({element_type:e.element_type,element_id:e.element_id,page:e.page,page_url:e.page_url,scroll_depth:e.scroll_depth,search_query:e.search_query,click_x:e.click_x,click_y:e.click_y,resource_id:e.resource_id,resource_type:e.resource_type,feed_id:e.feed_id,post_id:e.post_id,content_id:e.content_id,device_type:e.device_type,browser:e.browser})},i=r.device_type??t.device;i!==void 0&&(r.device_type=i);let a=r.browser??t.browser;return a!==void 0&&(r.browser=a),r}function ji(e,{context:t,sessionId:n}){let r={error_type:e.error_type,session_id:e.session_id??n,...y({error_code:e.error_code,error_message:e.error_message,stack_trace:e.stack_trace,resource_type:e.resource_type,resource_id:e.resource_id,endpoint:e.endpoint,device_type:e.device_type,browser:e.browser,os:e.os})},i=r.device_type??t.device;i!==void 0&&(r.device_type=i);let a=r.browser??t.browser;a!==void 0&&(r.browser=a);let o=r.os??t.os;return o!==void 0&&(r.os=o),r}function Mi(e){return{...y({utm_source:e.utm_source,utm_campaign:e.utm_campaign,browser:e.browser,language:e.language,screen_resolution:e.screen_resolution,platform:e.platform,tg_platform:e.tg_platform,tg_version:e.tg_version,timezone:e.timezone,timezone_offset:e.timezone_offset,color_depth:e.color_depth,touch_support:e.touch_support,country:e.country,user_id:e.user_id})}}function Ni(e,t){t!==void 0&&(e.timestamp=(/* @__PURE__ */ new Date(t*1e3)).toISOString())}function Pi(e,t){let n;switch(e._type){case`content_views`:n={content_view:Oi(e,t)};break;case`engagement`:n={engagement:ki(e,t)};break;case`interaction`:n={interaction:Ai(e,t)};break;case`error`:n={error:ji(e,t)};break;case`session_start`:n={session_start:Mi(e)};break;default:throw Error(`Unsupported analytics event type: ${e._type}`)}return Ni(n,e.timestamp),n}const Fi=/* @__PURE__ */ new Set([408,425,429]);function Ii(e){return e>=500||Fi.has(e)}function Li(e,t){return Object.assign(Error(e),{retryable:t})}function Ri(e){return e instanceof Error&&`retryable`in e?e.retryable:!0}let G=[],K=!1,q=null,J=null,Y=null;function zi(){let e=()=>{};return{promise:new Promise(t=>{e=t}),resolve:e}}function Bi(){let e=Y;Y=null,e?.resolve()}function Vi(){return Y??=zi(),q===null&&!K&&(q=setTimeout(()=>{q=null,Hi()},0)),Y.promise}function Hi(){if(K)return J??Promise.resolve();if(G.length===0)return Promise.resolve();let e=Ui().finally(()=>{J===e&&(J=null)});return J=e,e}async function Ui(){K=!0,q&&=(clearTimeout(q),null);try{for(;G.length>0;){let e=G;G=[];let t=Y;Y=null;try{await Gi(e)}catch(n){Wi(e,n),t?.resolve(),Bi();return}t?.resolve()}}finally{K=!1}}function Wi(e,t){console.error(`[Analytics] Failed to flush queue:`,t),Ri(t)&&G.unshift(...e)}async function Gi(e){let t={context:z.get(),deviceId:H(),sessionId:vi()},n=!yi();await Ji(qi(Ki(e,t.context,n),t)),n&&bi()}function Ki(e,t,n){let r=[];return n&&r.push(Xi(t)),r.push(...e),r}function qi(e,t){let n=y({user_id:t.context.user_id,country:t.context.country,city:t.context.city,region:t.context.region,device:t.context.device,os:t.context.os,os_version:t.context.os_version,language:t.context.language,browser:t.context.browser});return{events:e.map(e=>Pi(e,t)),...n}}async function Ji(e){let t;for(let n=0;n<3;n++)try{await Yi(e);return}catch(e){if(t=e,!Ri(e))break}throw t}async function Yi(e){let{response:t}=await lt({body:e});if(t&&!t.ok)throw console.error(`[Analytics] Failed to post events: ${t.status} ${t.statusText}`),Li(`Analytics request failed with ${t.status}`,Ii(t.status))}function Xi(e){return Ti({browser:e.browser,language:e.language,screenResolution:e.screen_resolution,platform:e.platform,tgPlatform:e.tg_platform,tgVersion:e.tg_version,timezone:e.timezone,timezoneOffset:e.timezone_offset,colorDepth:e.color_depth,touchSupport:e.touch_support,country:e.country,userId:e.user_id,utmSource:e.utm_source,utmCampaign:e.utm_campaign})}async function X(e){if(e.length!==0)return G.push(...e),Vi()}function Zi(e){X([Si(e)])}function Qi(e){X([Ci(e)])}function $i(e){X([wi(e)])}async function ea(){return Hi()}function ta(e){X([si(e)])}function na({contentType:e,viewType:t,video:n,playerId:r}){if(e!==`video`||!n)return{};let i=R(n.currentTime),a=R(n.duration),o=r&&L(t)?N.getSegmentsWithCurrent(r,i):void 0;return{videoPositionMs:i,videoTotalDurationMs:a,segments:o&&o.length>0?o:void 0}}function ra(){let e=typeof navigator<`u`?navigator.userAgent:``;return e?/iPad|Tablet|PlayBook|Silk|Android(?!.*Mobile)/i.test(e)?`tablet`:/Mobile|Android|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e)?`mobile`:`desktop`:`desktop`}function ia(){if(typeof screen<`u`)return`${screen.width}x${screen.height}`}function aa(){if(typeof Intl<`u`)try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function oa(){return(/* @__PURE__ */ new Date()).getTimezoneOffset()*-1}function sa(){return typeof window<`u`&&`ontouchstart`in window}function ca(){let e=typeof navigator<`u`?navigator:void 0;return{device:ra(),os:e?.platform,language:e?.language,browser:e?.userAgent,screen_resolution:ia(),platform:e?.platform,timezone:aa(),timezone_offset:oa(),color_depth:typeof screen<`u`?screen.colorDepth:void 0,touch_support:sa()}}function la(e){let t={user_id:e?.id};e?.language_code&&(t.language=e.language_code),B(t)}function ua(){H(),xi(),B(ca()),_t.subscribe(la)}function da(e,t,n=1){return e.start_time_sec<=t+n&&e.end_time_sec<=t+n}function fa(e,t,n=1){return!e||e.length<=1||t<=0?!1:e.every(e=>da(e,t,n))}function pa(e,t){return e.map((n,r)=>{let i=e[r+1],a=i?i.start_time_sec:t;return{...n,endTime:a,durationSec:a-n.start_time_sec}})}function Z({heatmapData:e,chapterStartTime:t,chapterEndTime:n,videoDuration:r}){if(!e?.length||r<=0)return[];let i=t/r,a=n/r,o=Math.floor(i*e.length),s=Math.ceil(a*e.length);return e.slice(o,Math.max(o+1,s))}function ma(e,t,n){return e?.length?t.map(t=>Z({heatmapData:e,chapterStartTime:t.start_time_sec,chapterEndTime:t.endTime,videoDuration:n})):t.map(()=>[])}function ha(e){return e?.length?Math.max(...e):0}function ga(e,t,n){return e<=t?0:e>=n?100:(e-t)/(n-t)*100}function _a({globalBufferRanges:e,chapterStart:t,chapterEnd:n,videoDuration:r}){if(n-t<=0||r<=0)return[];let i=t/r*100,a=n/r*100;return e.map(e=>{if(e.end<=i||e.start>=a)return null;let t=Math.max(e.start,i),n=Math.min(e.end,a);return{start:(t-i)/(a-i)*100,end:(n-i)/(a-i)*100}}).filter(e=>e!==null)}function va(e,t){return t<=0?0:e/t}function ya({isDragging:e,progress:t,duration:n,currentTime:r}){return e?t*n:r}function ba(e,t){for(let n=0;n<e.length;n++){let r=e[n];if(!r)continue;let i=r.getBoundingClientRect();if(t>=i.left&&t<=i.right)return n}return null}function xa(e,t){if(!e?.length)return null;let n=e.find(e=>e.start_time_sec>t);return n?n.start_time_sec:null}function Sa(e,t){if(!e?.length)return null;let n=-1;for(let r=e.length-1;r>=0;r--)if(e[r].start_time_sec<=t){n=r;break}if(n<0)return null;let r=e[n];return t-r.start_time_sec>3||n===0?r.start_time_sec:e[n-1].start_time_sec}function Ca(e){return e===void 0?0:typeof e==`number`?e:Number(e)}function wa(e){return{video_id:e.video_id??``,total_duration_ms:Ca(e.total_duration_ms),data:e.data??[]}}async function Ta({videoId:e,buckets:t=101}){try{let{data:n,error:r}=await dt({path:{video_id:e},query:{buckets:t}});return r||!n?null:wa(n)}catch{return null}}async function Ea({videoId:e,startDate:t,endDate:n}){try{let r={};t&&(r[`range.start`]=t),n&&(r[`range.end`]=n);let{data:i,error:a}=await ut({path:{video_id:e},query:Object.keys(r).length>0?r:void 0});return a?[]:i?.segments??[]}catch{return[]}}function Da(e){return`getVideoPlaybackQuality`in e?e.getVideoPlaybackQuality().droppedVideoFrames:0}function Oa(e){if(e.buffered.length===0)return 0;let t=e.currentTime;for(let n=0;n<e.buffered.length;n++)if(e.buffered.start(n)<=t&&e.buffered.end(n)>=t)return Math.max(0,e.buffered.end(n)-t);return 0}function ka(e){let t=e.hlsAutoLevelEnabled?e.hlsAutoLevelCapping:e.hlsCurrentLevel;if(t<0||t>=e.hlsLevels.length)return null;let n=e.hlsLevels[t];return n?{width:n.width,height:n.height}:null}function Aa(e){let{video:t}=e;return t?{droppedFrames:Da(t),volume:Math.round(t.volume*100),networkSpeed:e.hlsBandwidthEstimate??0,bufferHealth:Oa(t),currentRes:t.videoWidth>0?{width:t.videoWidth,height:t.videoHeight}:null,optimalRes:ka(e)}:{droppedFrames:0,volume:0,networkSpeed:0,bufferHealth:0,currentRes:null,optimalRes:null}}function Q(){return ft}async function ja(e){let t=await pt(e);return ua(),t}async function $(e,t){let n=await fetch(e,{method:`PUT`,body:t});if(!n.ok)throw Error(`PUT to presigned URL failed: ${n.status} ${n.statusText}`)}async function Ma(e){let t=Q(),n=await mt({client:t,path:{project_id:e.projectId},body:{project_id:e.projectId,org_id:e.orgId,name:e.name}});if(n.error)throw n.error;let r=n.data;return{imageId:r.image_id,uploadUrl:r.upload_url}}async function Na(e,t){let n=await Ma(t);return await $(n.uploadUrl,e),n}async function Pa(e){let t=Q(),n=await bt({client:t,path:{project_id:e.projectId},body:{project_id:e.projectId,org_id:e.orgId,name:e.name,video_quality:e.videoQuality}});if(n.error)throw n.error;let r=n.data;return{videoId:r.video_id,posterId:r.poster_id,videoUploadUrl:r.video_upload_url,posterUploadUrl:r.poster_upload_url}}async function Fa(e,t,n){let r=await Pa(n);return await Promise.all([$(r.videoUploadUrl,e),$(r.posterUploadUrl,t)]),r}async function Ia(e,t,n){let r=Q(),i=await vt({client:r,path:{project_id:e,video_id:t},body:{project_id:e,video_id:t,items:n.map(e=>({language_code:e.languageCode,label:e.label,file_name:e.fileName,format:e.format,...e.size===void 0?{}:{size:e.size}}))}});if(i.error)throw i.error;return{targets:(i.data.targets??[]).map(e=>({id:e.id,languageCode:e.language_code,uploadUrl:e.upload_url}))}}async function La(e,t,n){let r=Q(),i=await yt({client:r,path:{project_id:e,video_id:t},body:{project_id:e,video_id:t,items:n.map(e=>({language_code:e.languageCode,label:e.label,file_name:e.fileName,format:e.format,...e.size===void 0?{}:{size:e.size}}))}});if(i.error)throw i.error;return{targets:(i.data.targets??[]).map(e=>({id:e.id,languageCode:e.language_code,uploadUrl:e.upload_url}))}}async function Ra(e,t,n){let r=await za(n);return await Promise.all([$(r.contentUploadUrl,e),$(r.posterUploadUrl,t)]),r}async function za(e){let t=Q(),n=await gt({client:t,path:{project_id:e.projectId,feed_id:e.feedId},body:{project_id:e.projectId,feed_id:e.feedId,org_id:e.orgId,creator_id:e.creatorId,description:e.description,content_type:e.contentType,file_name:e.fileName,video_quality:e.videoQuality}});if(n.error)throw n.error;let r=n.data;return{postId:r.post_id,contentId:r.content_id,posterId:r.poster_id,contentUploadUrl:r.content_upload_url,posterUploadUrl:r.poster_upload_url}}export{fn as BOTTOM_OFFSET_CONTROLS_HIDDEN,dn as BOTTOM_OFFSET_CONTROLS_VISIBLE,un as BOTTOM_SNAP_THRESHOLD,S as CAPTION_WIDTH_RATIO,nt as COLORS,cn as DEFAULT_CAPTION_FONT_SIZE,nn as DEFAULT_FONT_SIZE,Gt as DEFAULT_IMAGE_ASPECT_RATIO,Gn as DOUBLE_CLICK_THRESHOLD_MS,at as EDGE_STYLES,ve as FEED_COMPONENTS_COUNT,o as FEED_TRANSITION_THRESHOLD,m as FONT_FAMILIES,$e as FONT_SIZES,on as FONT_SIZE_RATIO,sn as FONT_SIZE_VIEWPORT_RATIO,Kt as IMAGE_ASPECT_RATIO_THRESHOLD,ue as IMAGE_DWELL_MS,st as LANG_TYPES,Pn as LOADING_SPINNER_DELAY_MS,ne as LOOP_REBASE_BASE_MULTIPLIER,c as LOOP_REBASE_THRESHOLD_MULTIPLIER,an as MAX_FONT_SIZE,gr as MAX_MEDIA_RECOVERIES,hr as MAX_NETWORK_RETRIES,rn as MIN_FONT_SIZE,Dn as PERSIST_INTERVAL_MS,Je as PLAYBACK_SPEEDS,$t as PLAYER_LANGUAGES,We as PLAY_PAUSE_KEYS,E as PRELOAD_RANGE,Tn as RESUME_MIN_POSITION_SECONDS,En as RESUME_MIN_REMAINING_SECONDS,ln as SAFE_ZONE_MARGIN,Be as SEEK_LARGE_SECONDS,He as SEEK_SMALL_SECONDS,Re as SHORTCUTS_CONFIG,Wn as SINGLE_CLICK_DELAY_MS,Pe as ShortcutAction,Mn as UNLOAD_DISTANCE,Ve as VOLUME_DELTA,D as VideoLoadState,Ir as activeMenu,z as analyticsContextStore,V as analyticsDeviceStore,U as analyticsSessionStore,M as analyticsStore,N as analyticsStoreActions,ur as bindClickOutside,dr as bindDocumentHidden,ar as bindEndedListener,Zn as bindFullscreenChangeListener,Qn as bindPictureInPictureChangeListener,er as bindPipVisibilityReentry,ir as bindPlaybackRateSync,si as buildContentViewEvent,ge as buildTransforms,na as buildVideoAnalyticsPayload,ye as calcShiftCountArray,Rn as calculateAspectRatio,pa as calculateChaptersWithEnd,_n as calculateDragPosition,va as calculateFlexGrow,pn as calculateFontSize,ha as calculateGlobalMax,ma as calculateHeatmapSlices,vn as calculateSafeViewport,_a as calculateSegmentBufferRanges,ga as calculateSegmentProgress,xe as calculateSmoothedEndTime,Ye as calculateVolumeToSet,ci as calculateWatchDuration,me as checkIsCut,f as clamp,rt as clampVolume,Xn as cleanupClickDisambiguation,Ln as cleanupLoadingDebounce,$r as clearSubtitles,Aa as collectVideoStats,ti as computeBufferRanges,ni as computeBufferedAhead,Br as computePlaybackFillPercentage,Vr as computePlaybackValueFromPointer,ri as computeProgressFraction,te as computeScrollIndex,ja as connect,mn as constrainPercentagePosition,P as controlsStore,Ia as createAudioTrackUpload,Kn as createClickDisambiguationState,Dr as createHlsConfig,_r as createHlsErrorRecoveryState,Ma as createImageUpload,Fn as createLoadingDebounceState,za as createPostUpload,La as createSubtitleUpload,Pa as createVideoUpload,vr as decideHlsErrorAction,qe as defaultSettings,tr as deriveVolumeSync,Nr as endSegment,Ue as executeShortcutAction,De as extractSubtitleTracks,a as feedCacheAtom,oe as feedCacheStore,t as feedStore,y as filterUndefined,ba as findHoveredSegmentIndex,Ne as findNextCue,ea as flushAnalytics,Te as formatNumber,we as formatNumberSm,Wt as formatTime,ie as gateVideoEnded,A as generateLevelName,or as getAspectRatioFromPoster,Oa as getBufferHealth,Cn as getCaptionTextStyle,Sn as getCaptionWindowStyle,Se as getCleanCueText,ya as getCurrentPosition,Da as getDroppedFrames,li as getEffectivePage,sr as getFeedPlaybackAction,e as getFeedPost,ae as getFeedPosts,Ea as getHotSegments,Bt as getImage,Yt as getImageAspectRatio,Xt as getImageContainerStyle,Zt as getImageStyle,d as getLoopRebaseThreshold,xa as getNextChapterStart,H as getOrCreateDeviceId,vi as getOrCreateSessionId,Ee as getPersistedAudioTrack,On as getPersistedProgress,be as getPersistedSubtitleTrack,tn as getPlayerControlLabels,Ur as getPlayerMenuLabels,et as getPointerClientX,gn as getPointerOffsets,rr as getPreloadAttribute,Sa as getPrevChapterTarget,mr as getQualityLabel,se as getRebasedLoopIndex,Ze as getRestoredVolume,Fe as getSeekAmount,ze as getSeekPercent,xn as getSmartCaptionPosition,bn as getTextShadowValue,Ut as getVideo,Ta as getVideoHeatmap,Nn as getVideoLoadState,le as getViewportFallbackHeight,Ge as getVolumeDelta,Xe as getVolumeFromPointer,Jn as handleClick,ei as handleCueChange,Yn as handleDoubleClick,Qr as handleLoadedMetadata,Hn as handleVideoError,Bn as handleVideoPause,zn as handleVideoPlay,Vn as handleVideoRateChange,Qt as hexToRGB,b as hexToRGBAString,Yr as hidePlayerControls,Jt as imageRenderReducer,Lt as initProgressBar,qt as initialImageRenderState,ua as initializeAnalyticsContext,_e as initializeVideo,de as isAtEndOfFeed,da as isChapterWithinDuration,lr as isClickOutside,C as isDocumentFullscreen,Ke as isEffectivelyMuted,ce as isFeedExhausted,k as isHlsStream,cr as isInsideExcludedElement,w as isVideoPictureInPicture,tt as loadSettings,F as menuStack,di as msToSeconds,I as navigationDirection,nr as observeViewport,Oe as persistAudioTrack,kn as persistProgress,je as persistSubtitleTrack,hn as pixelsToPercentage,Me as playerContainerElementStore,Ae as playerMediaElementStore,p as playerStateStore,Rr as popMenu,X as postAnalytics,ta as postContentEvent,Zi as postEngagement,$i as postError,Qi as postInteraction,r as postStore,n as postStoreActions,Ce as processCues,Lr as pushMenu,zr as resetMenu,fe as resolveContainerHeight,x as resolvePlayerLanguage,he as resolvePostIndex,Ie as resolveShortcutAction,Pr as restartSegmentIfPlaying,ui as roundMs,it as saveSettings,R as secondsToMs,B as setAnalyticsContext,gi as setDeviceId,s as setHasInteracted,ot as settingsStore,jr as setupHls,u as shiftArray,l as shouldAutoAdvance,ct as shouldBeMuted,pe as shouldDwellAdvance,re as shouldFetchMore,Le as shouldIgnoreKeyboardEvent,L as shouldIncludeSegments,jn as shouldPersistProgress,yn as shouldPinToBottom,ee as shouldRebaseLoopIndex,$n as shouldReenterPictureInPicture,An as shouldResumeFromPosition,fr as shouldShowSpinner,Jr as showPlayerControls,Z as sliceHeatmapData,pr as sortLevelsByQuality,Mr as startSegment,ke as stripHtmlTags,wn as togglePictureInPicture,Xr as togglePlayerFullscreen,Zr as togglePlayerPictureInPicture,In as updateLoadingState,Un as updatePlayerLoadingState,Na as uploadImage,Ra as uploadPost,Fa as uploadVideo,fa as validateChapters,Qe as validateSettings};
package/package.json CHANGED
@@ -1,14 +1,21 @@
1
1
  {
2
2
  "name": "@rixl/media-core",
3
- "version": "1.0.1",
4
- "description": "Headless core, stores, and upload client for Rixl Media SDK — use @rixl/media-react, -vue, -svelte, -angular, -astro, or -lit for UI components.",
3
+ "version": "1.1.0",
4
+ "description": "Headless TypeScript media SDK for Rixl: media fetching, uploads, player state, HLS utilities, captions, and analytics.",
5
5
  "keywords": [
6
+ "analytics",
7
+ "feed",
8
+ "headless",
9
+ "hls",
10
+ "image",
11
+ "media-sdk",
12
+ "nanostores",
6
13
  "rixl",
7
- "sdk",
8
- "video",
9
- "web"
14
+ "typescript",
15
+ "upload",
16
+ "video"
10
17
  ],
11
- "homepage": "https://rixl.com",
18
+ "homepage": "https://developers.rixl.com/en/sdk/media-core",
12
19
  "license": "SEE LICENSE IN LICENSE.md",
13
20
  "author": "Rixl Inc.",
14
21
  "repository": {
@@ -1,16 +0,0 @@
1
- import { BuildEngagementParams, BuildErrorParams, BuildInteractionParams } from "../lib/analytics-builders.js";
2
- import { AnalyticsEvent } from "../types/analytics.js";
3
- export declare function postAnalytics(events: AnalyticsEvent[]): Promise<void>;
4
- export declare function postEngagement(params: BuildEngagementParams): void;
5
- export declare function postInteraction(params: BuildInteractionParams): void;
6
- export declare function postError(params: BuildErrorParams): void;
7
- /**
8
- * Resolves once the events outstanding at call time have been sent, rather than
9
- * once a flush has merely been started. Two paths used to return early: a call
10
- * during an active flush reported a drain that had not happened, and a call
11
- * while the only outstanding batch was already in flight (so the queue looked
12
- * empty) returned before that request finished. Delegating to flushQueue makes
13
- * it wait for whichever drain covers the outstanding work — starting one now,
14
- * bypassing the timer, when nothing is running yet.
15
- */
16
- export declare function flushAnalytics(): Promise<void>;
@@ -1,227 +0,0 @@
1
- import { analyticsContextStore } from "../store/analytics-context-store.js";
2
- import { getOrCreateDeviceId } from "../store/analytics-device-store.js";
3
- import { getOrCreateSessionId, hasSessionStarted, markSessionStarted } from "../store/analytics-session-store.js";
4
- import { buildEngagementEvent, buildErrorEvent, buildInteractionEvent, buildSessionStartEvent } from "../lib/analytics-builders.js";
5
- import { filterUndefined } from "../lib/filter-undefined.js";
6
- import { toWireEvent } from "../lib/analytics-wire.js";
7
- import { analyticsV1EventsServiceTrackEvents } from "@rixl/sdk";
8
-
9
- // src/api/analytics.ts
10
- const MAX_RETRIES = 3;
11
- /**
12
- * Statuses worth sending again. 5xx and these are transient by definition;
13
- * every other 4xx means the endpoint understood the payload and rejected it,
14
- * so repeating it only wastes attempts and holds up the queue behind a batch
15
- * that can never drain.
16
- */
17
- const SERVER_ERROR_MIN_STATUS = 500;
18
- const RETRYABLE_CLIENT_STATUSES = /* @__PURE__ */ new Set([
19
- 408,
20
- 425,
21
- 429
22
- ]);
23
- function isRetryableStatus(status) {
24
- return status >= SERVER_ERROR_MIN_STATUS || RETRYABLE_CLIENT_STATUSES.has(status);
25
- }
26
- function deliveryError(message, retryable) {
27
- return Object.assign(new Error(message), { retryable });
28
- }
29
- /**
30
- * Anything that is not a classified delivery failure — a thrown network error,
31
- * an aborted request — has no response behind it and is assumed transient, so
32
- * events are kept rather than discarded on an unknown fault.
33
- */
34
- function isRetryableError(error) {
35
- return error instanceof Error && "retryable" in error ? error.retryable : true;
36
- }
37
- let queue = [];
38
- let isFlushing = false;
39
- let flushTimer = null;
40
- /**
41
- * The drain in progress, or null when none is running. flushAnalytics awaits
42
- * it so an explicit flush resolves only once the outstanding request finishes,
43
- * not the moment the queue looks empty because its batch is already in flight.
44
- */
45
- let flushing = null;
46
- /**
47
- * Callers waiting on the events currently queued but not yet handed to a
48
- * request. One deferred covers the whole queue: a batch is taken and its
49
- * waiters settled together, and anything enqueued afterwards starts a new one.
50
- */
51
- let pending = null;
52
- function createDeferred() {
53
- let resolve = () => {};
54
- return {
55
- promise: new Promise((res) => {
56
- resolve = res;
57
- }),
58
- resolve
59
- };
60
- }
61
- /** Settles and clears the current deferred, if any. */
62
- function settlePending() {
63
- const waiting = pending;
64
- pending = null;
65
- waiting?.resolve();
66
- }
67
- /**
68
- * No timer is armed while a flush is running. The running flush drains what
69
- * arrives during its own request, so arming one here would let it fire mid
70
- * request, find `isFlushing` set, and return having abandoned its waiters.
71
- */
72
- function scheduleFlush() {
73
- pending ??= createDeferred();
74
- if (flushTimer === null && !isFlushing) flushTimer = setTimeout(() => {
75
- flushTimer = null;
76
- flushQueue();
77
- }, 0);
78
- return pending.promise;
79
- }
80
- /**
81
- * Starts a drain unless one is already running, and hands back a promise that
82
- * settles when the whole cycle finishes — the request in flight included, not
83
- * just the events still waiting in the queue. Nudge callers `void` it; only
84
- * flushAnalytics awaits it, so an explicit flush cannot resolve early while a
85
- * request it should cover is still outstanding.
86
- */
87
- function flushQueue() {
88
- if (isFlushing) return flushing ?? Promise.resolve();
89
- if (queue.length === 0) return Promise.resolve();
90
- const run = drainQueue().finally(() => {
91
- if (flushing === run) flushing = null;
92
- });
93
- flushing = run;
94
- return run;
95
- }
96
- async function drainQueue() {
97
- isFlushing = true;
98
- if (flushTimer) {
99
- clearTimeout(flushTimer);
100
- flushTimer = null;
101
- }
102
- try {
103
- while (queue.length > 0) {
104
- const batch = queue;
105
- queue = [];
106
- const waiters = pending;
107
- pending = null;
108
- try {
109
- await performFlush(batch);
110
- } catch (error) {
111
- handleFailedBatch(batch, error);
112
- waiters?.resolve();
113
- settlePending();
114
- return;
115
- }
116
- waiters?.resolve();
117
- }
118
- } finally {
119
- isFlushing = false;
120
- }
121
- }
122
- /**
123
- * Transient failures keep their events for a later flush; a rejected payload is
124
- * dropped, since requeueing it would block everything behind a batch the
125
- * endpoint will refuse again.
126
- */
127
- function handleFailedBatch(batch, error) {
128
- console.error("[Analytics] Failed to flush queue:", error);
129
- if (isRetryableError(error)) queue.unshift(...batch);
130
- }
131
- async function performFlush(events) {
132
- const options = {
133
- context: analyticsContextStore.get(),
134
- deviceId: getOrCreateDeviceId(),
135
- sessionId: getOrCreateSessionId()
136
- };
137
- const carriesSessionStart = !hasSessionStarted();
138
- await sendWithRetry(buildTrackRequest(buildPayloadEvents(events, options.context, carriesSessionStart), options));
139
- if (carriesSessionStart) markSessionStarted();
140
- }
141
- function buildPayloadEvents(events, context, withSessionStart) {
142
- const payloadEvents = [];
143
- if (withSessionStart) payloadEvents.push(buildSessionStartEventFromContext(context));
144
- payloadEvents.push(...events);
145
- return payloadEvents;
146
- }
147
- function buildTrackRequest(events, options) {
148
- const metadata = filterUndefined({
149
- user_id: options.context.user_id,
150
- country: options.context.country,
151
- city: options.context.city,
152
- region: options.context.region,
153
- device: options.context.device,
154
- os: options.context.os,
155
- os_version: options.context.os_version,
156
- language: options.context.language,
157
- browser: options.context.browser
158
- });
159
- return {
160
- events: events.map((event) => toWireEvent(event, options)),
161
- ...metadata
162
- };
163
- }
164
- async function sendWithRetry(request) {
165
- let lastError;
166
- for (let attempt = 0; attempt < MAX_RETRIES; attempt++) try {
167
- await sendEvents(request);
168
- return;
169
- } catch (error) {
170
- lastError = error;
171
- if (!isRetryableError(error)) break;
172
- }
173
- throw lastError;
174
- }
175
- async function sendEvents(request) {
176
- const { response } = await analyticsV1EventsServiceTrackEvents({ body: request });
177
- if (response && !response.ok) {
178
- console.error(`[Analytics] Failed to post events: ${response.status} ${response.statusText}`);
179
- throw deliveryError(`Analytics request failed with ${response.status}`, isRetryableStatus(response.status));
180
- }
181
- }
182
- function buildSessionStartEventFromContext(context) {
183
- return buildSessionStartEvent({
184
- browser: context.browser,
185
- language: context.language,
186
- screenResolution: context.screen_resolution,
187
- platform: context.platform,
188
- tgPlatform: context.tg_platform,
189
- tgVersion: context.tg_version,
190
- timezone: context.timezone,
191
- timezoneOffset: context.timezone_offset,
192
- colorDepth: context.color_depth,
193
- touchSupport: context.touch_support,
194
- country: context.country,
195
- userId: context.user_id,
196
- utmSource: context.utm_source,
197
- utmCampaign: context.utm_campaign
198
- });
199
- }
200
- async function postAnalytics(events) {
201
- if (events.length === 0) return;
202
- queue.push(...events);
203
- return scheduleFlush();
204
- }
205
- function postEngagement(params) {
206
- postAnalytics([buildEngagementEvent(params)]);
207
- }
208
- function postInteraction(params) {
209
- postAnalytics([buildInteractionEvent(params)]);
210
- }
211
- function postError(params) {
212
- postAnalytics([buildErrorEvent(params)]);
213
- }
214
- /**
215
- * Resolves once the events outstanding at call time have been sent, rather than
216
- * once a flush has merely been started. Two paths used to return early: a call
217
- * during an active flush reported a drain that had not happened, and a call
218
- * while the only outstanding batch was already in flight (so the queue looked
219
- * empty) returned before that request finished. Delegating to flushQueue makes
220
- * it wait for whichever drain covers the outstanding work — starting one now,
221
- * bypassing the timer, when nothing is running yet.
222
- */
223
- async function flushAnalytics() {
224
- return flushQueue();
225
- }
226
-
227
- export { flushAnalytics, postAnalytics, postEngagement, postError, postInteraction };
package/dist/api/feed.js DELETED
@@ -1,52 +0,0 @@
1
- import { postsV1PostServiceGetPost3, postsV1PostServiceListPosts3 } from "@rixl/sdk";
2
-
3
- // src/api/feed.ts
4
- function toType(type) {
5
- if (type === "MEDIA_TYPE_IMAGE") return "image";
6
- if (type === "MEDIA_TYPE_VIDEO") return "video";
7
- return "image";
8
- }
9
- function toFeedPost(post) {
10
- const withMedia = post;
11
- return {
12
- id: post.id ?? "",
13
- feedId: post.feed_id ?? "",
14
- creatorId: post.creator_id ?? "",
15
- type: toType(post.type),
16
- description: post.description ?? "",
17
- createdAt: post.created_at ?? "",
18
- image: withMedia.image,
19
- video: withMedia.video
20
- };
21
- }
22
- function toFeedPostsResponse(data, offset, limit) {
23
- const rawTotal = data.total ?? 0;
24
- return {
25
- posts: (data.posts ?? []).map(toFeedPost),
26
- total: typeof rawTotal === "number" ? rawTotal : Number(rawTotal),
27
- offset: data.offset ?? offset,
28
- limit: data.limit ?? limit
29
- };
30
- }
31
- const fetchFeedPosts = async (feedId, offset = 0, limit = 10) => {
32
- const { data, error, response } = await postsV1PostServiceListPosts3({
33
- path: { feed_id: feedId },
34
- query: {
35
- "pagination.offset": offset,
36
- "pagination.limit": limit
37
- }
38
- });
39
- if (error || !data) throw new Error(`HTTP error! status: ${response?.status ?? 500}`);
40
- return toFeedPostsResponse(data, offset, limit);
41
- };
42
- const fetchFeedPost = async (feedId, postId) => {
43
- const { data, error, response } = await postsV1PostServiceGetPost3({ path: {
44
- feed_id: feedId,
45
- post_id: postId
46
- } });
47
- if (error) throw new Error(`HTTP error! status: ${response?.status ?? 500}`);
48
- if (!data?.post) throw new Error(`HTTP error! status: 404`);
49
- return toFeedPost(data.post);
50
- };
51
-
52
- export { fetchFeedPost, fetchFeedPosts };
@@ -1,6 +0,0 @@
1
- import { VideoHeatmap } from "../types/heatmap.js";
2
- export interface GetVideoHeatmapOptions {
3
- videoId: string;
4
- buckets?: number;
5
- }
6
- export declare function getVideoHeatmap({ videoId, buckets }: GetVideoHeatmapOptions): Promise<VideoHeatmap | null>;
@@ -1,28 +0,0 @@
1
- import { analyticsV1HeatmapServiceGetVideoHeatmap } from "@rixl/sdk";
2
-
3
- // src/api/heatmap.ts
4
- function toNumber(value) {
5
- if (value === void 0) return 0;
6
- return typeof value === "number" ? value : Number(value);
7
- }
8
- function toDomainHeatmap(data) {
9
- return {
10
- video_id: data.video_id ?? "",
11
- total_duration_ms: toNumber(data.total_duration_ms),
12
- data: data.data ?? []
13
- };
14
- }
15
- async function getVideoHeatmap({ videoId, buckets = 101 }) {
16
- try {
17
- const { data, error } = await analyticsV1HeatmapServiceGetVideoHeatmap({
18
- path: { video_id: videoId },
19
- query: { buckets }
20
- });
21
- if (error || !data) return null;
22
- return toDomainHeatmap(data);
23
- } catch {
24
- return null;
25
- }
26
- }
27
-
28
- export { getVideoHeatmap };
@@ -1,7 +0,0 @@
1
- import { HotSegment } from "../types/hot-segments.js";
2
- export interface GetHotSegmentsOptions {
3
- videoId: string;
4
- startDate?: string;
5
- endDate?: string;
6
- }
7
- export declare function getHotSegments({ videoId, startDate, endDate }: GetHotSegmentsOptions): Promise<HotSegment[]>;
@@ -1,20 +0,0 @@
1
- import { analyticsV1HeatmapServiceGetHotSegments } from "@rixl/sdk";
2
-
3
- // src/api/hot-segments.ts
4
- async function getHotSegments({ videoId, startDate, endDate }) {
5
- try {
6
- const query = {};
7
- if (startDate) query["range.start"] = startDate;
8
- if (endDate) query["range.end"] = endDate;
9
- const { data, error } = await analyticsV1HeatmapServiceGetHotSegments({
10
- path: { video_id: videoId },
11
- query: Object.keys(query).length > 0 ? query : void 0
12
- });
13
- if (error) return [];
14
- return data?.segments ?? [];
15
- } catch {
16
- return [];
17
- }
18
- }
19
-
20
- export { getHotSegments };
package/dist/api/image.js DELETED
@@ -1,11 +0,0 @@
1
- import { imagesV1ImageServiceGetImage } from "@rixl/sdk";
2
-
3
- // src/api/image.ts
4
- const fetchImage = async (imageId) => {
5
- const { data, error, response } = await imagesV1ImageServiceGetImage({ path: { image_id: imageId } });
6
- if (error) throw new Error(`HTTP error! status: ${response?.status ?? 500}`);
7
- if (!data?.image) throw new Error(`HTTP error! status: 404`);
8
- return data.image;
9
- };
10
-
11
- export { fetchImage };