@rixl/media-core 1.0.2 → 1.1.1

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 (172) 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/DMkwQjgA.js +1 -0
  5. package/dist/index.d.ts +1906 -82
  6. package/dist/index.js +6 -73
  7. package/package.json +13 -6
  8. package/dist/api/analytics.d.ts +0 -16
  9. package/dist/api/analytics.js +0 -227
  10. package/dist/api/feed.js +0 -52
  11. package/dist/api/heatmap.d.ts +0 -6
  12. package/dist/api/heatmap.js +0 -28
  13. package/dist/api/hot-segments.d.ts +0 -7
  14. package/dist/api/hot-segments.js +0 -20
  15. package/dist/api/image.js +0 -11
  16. package/dist/api/rixl-client.d.ts +0 -3
  17. package/dist/api/rixl-client.js +0 -14
  18. package/dist/api/upload.d.ts +0 -76
  19. package/dist/api/upload.js +0 -150
  20. package/dist/api/video.js +0 -11
  21. package/dist/lib/analytics-builders.d.ts +0 -59
  22. package/dist/lib/analytics-builders.js +0 -88
  23. package/dist/lib/analytics-initialize.d.ts +0 -1
  24. package/dist/lib/analytics-initialize.js +0 -59
  25. package/dist/lib/analytics-utils.d.ts +0 -43
  26. package/dist/lib/analytics-utils.js +0 -85
  27. package/dist/lib/analytics-wire.js +0 -153
  28. package/dist/lib/buffer-progress.d.ts +0 -20
  29. package/dist/lib/buffer-progress.js +0 -37
  30. package/dist/lib/caption-styles.d.ts +0 -20
  31. package/dist/lib/caption-styles.js +0 -56
  32. package/dist/lib/caption-utils.d.ts +0 -80
  33. package/dist/lib/caption-utils.js +0 -111
  34. package/dist/lib/chapter-utils.d.ts +0 -102
  35. package/dist/lib/chapter-utils.js +0 -147
  36. package/dist/lib/click-disambiguation.d.ts +0 -44
  37. package/dist/lib/click-disambiguation.js +0 -80
  38. package/dist/lib/click-outside.d.ts +0 -68
  39. package/dist/lib/click-outside.js +0 -64
  40. package/dist/lib/colors.d.ts +0 -6
  41. package/dist/lib/colors.js +0 -16
  42. package/dist/lib/content-analytics.d.ts +0 -27
  43. package/dist/lib/content-analytics.js +0 -38
  44. package/dist/lib/environment-effects.d.ts +0 -89
  45. package/dist/lib/environment-effects.js +0 -139
  46. package/dist/lib/feed-autoscroll.d.ts +0 -10
  47. package/dist/lib/feed-autoscroll.js +0 -13
  48. package/dist/lib/feed-container-height.d.ts +0 -7
  49. package/dist/lib/feed-container-height.js +0 -11
  50. package/dist/lib/feed-description-overflow.d.ts +0 -1
  51. package/dist/lib/feed-description-overflow.js +0 -9
  52. package/dist/lib/feed-dwell.d.ts +0 -2
  53. package/dist/lib/feed-dwell.js +0 -8
  54. package/dist/lib/feed-loop.d.ts +0 -10
  55. package/dist/lib/feed-loop.js +0 -21
  56. package/dist/lib/feed-scroll.d.ts +0 -11
  57. package/dist/lib/feed-scroll.js +0 -19
  58. package/dist/lib/feed-transforms.d.ts +0 -5
  59. package/dist/lib/feed-transforms.js +0 -30
  60. package/dist/lib/filter-undefined.js +0 -11
  61. package/dist/lib/fullscreen-utils.d.ts +0 -1
  62. package/dist/lib/fullscreen-utils.js +0 -7
  63. package/dist/lib/hls-buffer-flush.js +0 -46
  64. package/dist/lib/hls-error-recovery.d.ts +0 -35
  65. package/dist/lib/hls-error-recovery.js +0 -75
  66. package/dist/lib/hls-event-handlers.js +0 -61
  67. package/dist/lib/hls-loader.js +0 -23
  68. package/dist/lib/hls-setup.d.ts +0 -72
  69. package/dist/lib/hls-setup.js +0 -144
  70. package/dist/lib/hls-utils.d.ts +0 -31
  71. package/dist/lib/hls-utils.js +0 -34
  72. package/dist/lib/image-render.d.ts +0 -29
  73. package/dist/lib/image-render.js +0 -63
  74. package/dist/lib/keyboard-config.d.ts +0 -66
  75. package/dist/lib/keyboard-config.js +0 -127
  76. package/dist/lib/keyboard-utils.d.ts +0 -4
  77. package/dist/lib/keyboard-utils.js +0 -11
  78. package/dist/lib/lifecycle-effects.d.ts +0 -67
  79. package/dist/lib/lifecycle-effects.js +0 -78
  80. package/dist/lib/loading-debounce.d.ts +0 -26
  81. package/dist/lib/loading-debounce.js +0 -38
  82. package/dist/lib/numbers.d.ts +0 -6
  83. package/dist/lib/numbers.js +0 -36
  84. package/dist/lib/pip-utils.d.ts +0 -16
  85. package/dist/lib/pip-utils.js +0 -32
  86. package/dist/lib/playback-handlers.d.ts +0 -33
  87. package/dist/lib/playback-handlers.js +0 -51
  88. package/dist/lib/playback-slider.d.ts +0 -23
  89. package/dist/lib/playback-slider.js +0 -24
  90. package/dist/lib/player-labels.d.ts +0 -23
  91. package/dist/lib/player-labels.js +0 -132
  92. package/dist/lib/player-menu-labels.d.ts +0 -80
  93. package/dist/lib/player-menu-labels.js +0 -829
  94. package/dist/lib/player-ui-actions.d.ts +0 -10
  95. package/dist/lib/player-ui-actions.js +0 -58
  96. package/dist/lib/progress-fraction.d.ts +0 -11
  97. package/dist/lib/progress-fraction.js +0 -20
  98. package/dist/lib/progress-persist.d.ts +0 -28
  99. package/dist/lib/progress-persist.js +0 -54
  100. package/dist/lib/segment-analytics.d.ts +0 -20
  101. package/dist/lib/segment-analytics.js +0 -29
  102. package/dist/lib/subtitle-logic.d.ts +0 -31
  103. package/dist/lib/subtitle-logic.js +0 -75
  104. package/dist/lib/subtitle-utils.d.ts +0 -16
  105. package/dist/lib/subtitle-utils.js +0 -37
  106. package/dist/lib/time.d.ts +0 -1
  107. package/dist/lib/time.js +0 -17
  108. package/dist/lib/track-persistence.d.ts +0 -4
  109. package/dist/lib/track-persistence.js +0 -35
  110. package/dist/lib/video-preload-config.d.ts +0 -34
  111. package/dist/lib/video-preload-config.js +0 -41
  112. package/dist/lib/video-spinner.d.ts +0 -25
  113. package/dist/lib/video-spinner.js +0 -35
  114. package/dist/lib/video-stats.d.ts +0 -28
  115. package/dist/lib/video-stats.js +0 -44
  116. package/dist/lib/volume-utils.d.ts +0 -59
  117. package/dist/lib/volume-utils.js +0 -55
  118. package/dist/progressbar.d.ts +0 -10
  119. package/dist/progressbar.js +0 -125
  120. package/dist/store/analytics-context-store.d.ts +0 -4
  121. package/dist/store/analytics-context-store.js +0 -13
  122. package/dist/store/analytics-device-store.d.ts +0 -8
  123. package/dist/store/analytics-device-store.js +0 -44
  124. package/dist/store/analytics-session-store.d.ts +0 -8
  125. package/dist/store/analytics-session-store.js +0 -40
  126. package/dist/store/analytics-store.d.ts +0 -30
  127. package/dist/store/analytics-store.js +0 -88
  128. package/dist/store/controls-store.d.ts +0 -16
  129. package/dist/store/controls-store.js +0 -53
  130. package/dist/store/feed-cache-store.d.ts +0 -24
  131. package/dist/store/feed-cache-store.js +0 -165
  132. package/dist/store/feed-interaction-store.d.ts +0 -17
  133. package/dist/store/feed-interaction-store.js +0 -32
  134. package/dist/store/feed-store.d.ts +0 -16
  135. package/dist/store/feed-store.js +0 -38
  136. package/dist/store/generic-store.js +0 -24
  137. package/dist/store/image-store.d.ts +0 -2
  138. package/dist/store/image-store.js +0 -8
  139. package/dist/store/player-container-element-store.d.ts +0 -10
  140. package/dist/store/player-container-element-store.js +0 -38
  141. package/dist/store/player-global-actions.js +0 -53
  142. package/dist/store/player-media-element-store.d.ts +0 -10
  143. package/dist/store/player-media-element-store.js +0 -38
  144. package/dist/store/player-store-actions.js +0 -197
  145. package/dist/store/player-store.d.ts +0 -94
  146. package/dist/store/player-store.js +0 -127
  147. package/dist/store/player-track-actions.js +0 -44
  148. package/dist/store/postStore.d.ts +0 -20
  149. package/dist/store/postStore.js +0 -112
  150. package/dist/store/settings/constants.d.ts +0 -15
  151. package/dist/store/settings/constants.js +0 -47
  152. package/dist/store/settings/defaults.d.ts +0 -2
  153. package/dist/store/settings/defaults.js +0 -24
  154. package/dist/store/settings/storage.d.ts +0 -3
  155. package/dist/store/settings/storage.js +0 -28
  156. package/dist/store/settings/store.d.ts +0 -32
  157. package/dist/store/settings/store.js +0 -59
  158. package/dist/store/settings/types.d.ts +0 -27
  159. package/dist/store/settings/validation.d.ts +0 -7
  160. package/dist/store/settings/validation.js +0 -55
  161. package/dist/store/settings-menu-store.d.ts +0 -19
  162. package/dist/store/settings-menu-store.js +0 -30
  163. package/dist/store/video-store.d.ts +0 -2
  164. package/dist/store/video-store.js +0 -8
  165. package/dist/types/analytics.d.ts +0 -113
  166. package/dist/types/feed.d.ts +0 -21
  167. package/dist/types/file.d.ts +0 -12
  168. package/dist/types/heatmap.d.ts +0 -5
  169. package/dist/types/hot-segments.d.ts +0 -9
  170. package/dist/types/image.d.ts +0 -9
  171. package/dist/types/uuid.d.ts +0 -1
  172. 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,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as ee,t as te,u as ne}from"./chunks/DMkwQjgA.js";import{a as re,c as ie,d as ae,f as oe,i as se,l as ce,n as le,o as ue,r as de,s as fe,t as pe,u as me}from"./chunks/B2DDE32u.js";import{_ as he,a as ge,c as p,d as _e,f as ve,g as ye,h as be,i as xe,l as Se,m as Ce,n as we,o as Te,p as Ee,r as De,s as Oe,t as ke,u as Ae,v as je}from"./chunks/B-QvSqjj.js";import{analyticsV1EventsServiceTrackEvents as Me,analyticsV1HeatmapServiceGetHotSegments as Ne,analyticsV1HeatmapServiceGetVideoHeatmap as Pe,client as Fe,connect as Ie,imagesV1ImageServiceCreateImageUpload as Le,imagesV1ImageServiceGetImage as Re,postsV1PostServiceCreatePostUpload as ze,postsV1PostServiceGetPost3 as Be,postsV1PostServiceListPosts3 as Ve,user as He,videosV1AudioTrackServiceCreateAudioTrackUpload as Ue,videosV1SubtitleServiceCreateSubtitleUpload as We,videosV1VideoServiceCreateVideoUpload as Ge,videosV1VideoServiceGetVideo as Ke}from"@rixl/sdk";import{atom as m,computed as qe,map as Je}from"nanostores";const h=(e,t,n)=>t.forEach(t=>window[`${e}EventListener`](t,n)),g=e=>Math.min(Math.max(e,0),1),Ye=e=>`touches`in e?e.touches[0]?.clientX??e.changedTouches?.[0]?.clientX??0:e.clientX,Xe=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)},Ze=(e,t,n)=>{e.isDragging=t,n?.(t)},Qe=(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},$e=(e,t,n)=>{e.hasMoved=!0,Ze(e,!0,n),e.initialClientX=t,e.initialProgress=e.progress},et=(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 g(n+r)},tt=e=>!e.initialRect||e.initialClientX===null?null:g((e.initialClientX-e.initialRect.left)/e.initialRect.width),nt=(e,t)=>{Ze(e,!1,t),e.hasMoved=!1,e.initialRect=null,e.initialClientX=null},rt=(e,t,n)=>()=>{if(e.isDragging)return;let r=Number.isFinite(t.duration)&&t.duration>0?t.currentTime/t.duration:0;_(e,r,n)},it=(e,t,n)=>r=>{let i=Ye(r);if(!e.isDragging){if(!Qe(e,i))return;$e(e,i,t)}let a=et(e,i);a!==null&&_(e,a,n)},at=({state:e,video:t,onDraggingChange:n,onProgressChange:r,removeListeners:i})=>()=>{let a=e.hasMoved?null:tt(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)),nt(e,n),i()},ot=(e,t,n)=>r=>{e.initialRect=r.currentTarget.getBoundingClientRect(),e.startTime=Date.now(),e.hasMoved=!1,e.initialClientX=Ye(r),h(`add`,[`mousemove`,`touchmove`],t),h(`add`,[`mouseup`,`touchend`,`blur`],n)},st=({video:e,onDraggingChange:t,onProgressChange:n})=>{let r=Xe(e);t?.(!1),n?.(r.progress);let i=rt(r,e,n),a=it(r,t,n),o;o=at({state:r,video:e,onDraggingChange:t,onProgressChange:n,removeListeners:()=>{h(`remove`,[`mousemove`,`touchmove`],a),h(`remove`,[`mouseup`,`touchend`,`blur`],o)}});let s=ot(r,a,o);return e.addEventListener(`timeupdate`,i),{handleDragStart:s,destroy:()=>{o(),e.removeEventListener(`timeupdate`,i)}}};function ct(e){return e===`MEDIA_TYPE_IMAGE`?`image`:e===`MEDIA_TYPE_VIDEO`?`video`:`image`}function lt(e){let t=e;return{id:e.id??``,feedId:e.feed_id??``,creatorId:e.creator_id??``,type:ct(e.type),description:e.description??``,createdAt:e.created_at??``,image:t.image,video:t.video}}function ut(e,t,n){let r=e.total??0;return{posts:(e.posts??[]).map(lt),total:typeof r==`number`?r:Number(r),offset:e.offset??t,limit:e.limit??n}}const dt=async(e,t=0,n=10)=>{let{data:r,error:i,response:a}=await Ve({path:{feed_id:e},query:{"pagination.offset":t,"pagination.limit":n}});if(i||!r)throw Error(`HTTP error! status: ${a?.status??500}`);return ut(r,t,n)},ft=async(e,t)=>{let{data:n,error:r,response:i}=await Be({path:{feed_id:e,post_id:t}});if(r)throw Error(`HTTP error! status: ${i?.status??500}`);if(!n?.post)throw Error(`HTTP error! status: 404`);return lt(n.post)},v=()=>{let e=/* @__PURE__ */ new Map,t=/* @__PURE__ */ new Map;return{get:async(n,r)=>{let i=e.get(n);if(i)return i;let a=t.get(n);if(a)return a;let o=r(n).then(r=>(e.set(n,r),t.delete(n),r)).catch(e=>{throw t.delete(n),e});return t.set(n,o),o}}},pt=v(),mt=/* @__PURE__ */ new Map,ht=async(e,t)=>{let n=`${e}:${t}`;return pt.get(n,()=>ft(e,t))},gt=async(e,t=0,n=10)=>{if(t>0)return dt(e,t,n);let r=`feed:${e}`,i=mt.get(r);if(i)return i;let a=await dt(e,t,n);return mt.set(r,a),a.posts.forEach(t=>{let n=`${e}:${t.id}`;pt.get(n,()=>Promise.resolve(t))}),a},_t=async e=>{let{data:t,error:n,response:r}=await Re({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},vt=v(),yt=e=>vt.get(e,_t),bt=async e=>{let{data:t,error:n,response:r}=await Ke({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},xt=v(),St=e=>xt.get(e,bt);function y(e){let t=e.toString();return e<10&&(t=`0`+t),t}const Ct=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=`${y(n)}:${y(r)}`;return t>0?`${y(t)}:${i}`:i};function b(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}const wt=.5,Tt=.7,Et={isLoading:!0,isVisible:!1,aspectRatio:wt};function Dt(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 Ot(e,t){if(e&&t)return e/t}function kt({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 At(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 jt(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 x(e,t=100){let{r:n,g:r,b:i}=jt(e);return t/=100,`rgba(${n}, ${r}, ${i}, ${t})`}const Mt=[`en`,`de`,`es`,`fr`,`it`,`pl`,`ru`,`tr`,`uk`],Nt={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 S(e){let t=(e??``).toLowerCase();return Mt.find(e=>e===t)??`en`}function Pt(e){return Nt[S(e)]}const Ft=16,It=12,Lt=120,Rt=.03,zt=.07,Bt=100,Vt=8,C=.6,Ht=85,Ut=80,Wt=24,Gt=(e,t)=>{if(!e.width)return 16;let n=e.width*Rt,r=Math.max(.1,t/100),i=n*(1+.5*Math.log2(r)),a=Math.min(120,e.width*zt);return c(i,12,a)},Kt=(e,t=.6)=>{let n=t*100,r=Math.max(0,100-n);return{x:c(e.x,0,r),y:c(e.y,0,100)}},qt=(e,t,n)=>!n.width||!n.height?{x:0,y:0}:{x:e/n.width*100,y:t/n.height*100};function Jt(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 Yt(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=qt(l,u,o);return Kt(d,C)}function Xt(e){return{width:e.width-16,height:e.height-16}}function Zt(e,t){return!t&&e>85}function Qt(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 $t({position:e,isDragging:t,controlsVisible:n}){let r=t?`none`:`all 300ms ease`;if(Zt(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 en(e,t,n){let r=(t||300)*C,i=e.captionWindowOpacity>0?x(e.captionWindowColor,e.captionWindowOpacity):`transparent`;return{width:`${r}px`,backgroundColor:i,cursor:n?`grabbing`:`grab`,touchAction:`none`}}function tn(e,t){let n=p[e.captionFontFamily]||p.proportional_sans;return{fontSize:`${t}px`,fontFamily:n,color:x(e.captionFontColor,e.captionFontOpacity),backgroundColor:e.captionBGOpacity>0?x(e.captionBGColor,e.captionBGOpacity):`transparent`,textShadow:Qt(e.captionCharacterEdgeStyle,t),userSelect:`none`,touchAction:`none`}}function w(){let e=document;return!!(e.fullscreenElement||e.webkitFullscreenElement||e.mozFullScreenElement||e.msFullscreenElement)}function T(e){if(!e)return!1;if(document.pictureInPictureElement===e)return!0;let t=e.getRootNode();return t instanceof ShadowRoot&&t.pictureInPictureElement===e}async function nn(e){if(e)try{T(e)?await document.exitPictureInPicture():await e.requestPictureInPicture()}catch(e){console.error(`Error toggling PIP:`,e)}}const E=`videosdk_progress_map`,rn=5,an=5,on=2e3,sn=e=>{if(typeof window>`u`)return 0;try{let t=window.localStorage.getItem(E);if(!t)return 0;let n=JSON.parse(t);return Math.max(0,Math.floor(n[e]??0))}catch{return 0}},cn=(e,t)=>{if(typeof window<`u`)try{let n=window.localStorage.getItem(E),r=n?JSON.parse(n):{};r[e]=Math.max(0,Math.floor(t)),window.localStorage.setItem(E,JSON.stringify(r))}catch{}};function ln(e,t){return e>5&&e<t-5}function un(e,t){return t-e>on}const D={BEFORE:0,AFTER:1},dn=5,O={UNLOADED:`unloaded`,IDLE:`idle`,PRELOADING:`preloading`,PLAYING:`playing`};function fn(e,t,n){if(n)return O.PLAYING;let r=e-t;return Math.abs(r)>5?O.UNLOADED:r<0&&r>=-D.BEFORE||r>0&&r<=D.AFTER?O.PRELOADING:O.IDLE}const pn=300;function mn(){return{timerId:null}}function hn(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 gn(e){e.timerId!==null&&(clearTimeout(e.timerId),e.timerId=null)}function _n(e,t){if(e&&t&&e.videoWidth!==0&&e.videoHeight!==0)return e.videoWidth/e.videoHeight}function vn(e,t){l.setPaused(e,!1),l.setEnded(e,!1),t.onSegmentStart()}function yn(e,t){l.setPaused(e,!0),t.onSegmentEnd()}function bn(e,t,n){let r=t?.playbackRate;typeof r==`number`&&l.setPlaybackRate(e,r),n.onRestartSegment()}function xn(e,t){l.setPaused(e,!0),l.setLoading(e,!1),t.onShowSpinner(!1)}function Sn(e,t){l.setLoading(e,t)}const Cn=250,wn=400;function Tn(){return{singleClickTimerId:null,lastClickTime:0}}function k(e){e.singleClickTimerId!==null&&(clearTimeout(e.singleClickTimerId),e.singleClickTimerId=null)}function En(e,t){k(e),e.singleClickTimerId=setTimeout(()=>{t(),e.singleClickTimerId=null},250)}function Dn(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?(k(t),!0):r?(En(t,a),!0):(a(),!0)}function On(e){let{state:t,allowFullscreen:n,isExcludedTarget:r,onToggleFullscreen:i}=e;return!n||r?!1:(k(t),t.lastClickTime=0,i(),!0)}function kn(e){k(e)}function An(e){let t=()=>e(w());return document.addEventListener(`fullscreenchange`,t),()=>document.removeEventListener(`fullscreenchange`,t)}function jn(e,t){if(!e)return()=>void 0;let n=()=>t(T(e));return e.addEventListener(`enterpictureinpicture`,n),e.addEventListener(`leavepictureinpicture`,n),()=>{e.removeEventListener(`enterpictureinpicture`,n),e.removeEventListener(`leavepictureinpicture`,n)}}function Mn({videoElement:e,isCurrentlyInPip:t}){return!(typeof document>`u`||document.visibilityState!==`hidden`||!t||!e||T(e))}function Nn(e,t=e=>console.error(`Error maintaining PIP mode:`,e)){let n=()=>{let n=e();Mn(n)&&n.videoElement.requestPictureInPicture().catch(t)};return document.addEventListener(`visibilitychange`,n),()=>document.removeEventListener(`visibilitychange`,n)}function Pn({forcedMuted:e,playerMuted:t,playerInteracted:n,playerVolume:r,playerPreviousVolume:i}){if(e)return null;if(je({playerMuted:t,playerInteracted:n}))return{muted:!0,volume:null,storeVolumeUpdate:null};let a=be(r,i);return{muted:!1,volume:a,storeVolumeUpdate:r===0?a:null}}function Fn(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 In(e){switch(e){case O.UNLOADED:return`none`;case O.IDLE:return`metadata`;case O.PRELOADING:case O.PLAYING:return`auto`}}function Ln(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 Rn(e,t){return e?(e.addEventListener(`ended`,t),()=>e.removeEventListener(`ended`,t)):()=>void 0}function zn(e){return!e?.width||!e?.height?null:e.width/e.height}function Bn({isFeed:e,isCurrent:t,loadState:n,showSpinner:r,videoReadyState:i}){return e?t?n!==O.PLAYING||r||i<2?`none`:`play`:`pause`:`none`}function Vn(e,t){return!t||!(e instanceof Node)?!1:!!document.querySelector(`[${t}]`)?.contains(e)}function Hn(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))||Vn(r,n))}function Un({getContainer:e,excludeAttribute:t,onOutsideClick:n}){let r=r=>{Hn(r,e(),t)&&n(r)};return document.addEventListener(`mousedown`,r),()=>document.removeEventListener(`mousedown`,r)}function Wn(e){let t=()=>{document.visibilityState===`hidden`&&e()};return document.addEventListener(`visibilitychange`,t),()=>document.removeEventListener(`visibilitychange`,t)}function Gn(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 Kn=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),qn=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`}},Jn=({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},Yn=3,Xn=1;function Zn(){return{networkRetries:0,mediaRecoveries:0}}function Qn(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 $n(){return j??=import(`hls.js`).then(e=>e.default,e=>{throw j=null,e}),j}function er(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}));l.setAvailableAudioTracks(e,r)}}function tr(e,t,n){let r=l.get(e).get();r.audioTrack!==n.id&&(l.get(e).set({...r,audioTrack:n.id}),u(n.id))}function nr(e,t){t(e.levels.map((e,t)=>({height:e.height,width:e.width,bitrate:e.bitrate,name:A(e),index:t})))}function rr(e){let{hlsInstance:t,events:n,playerId:r,videoUrl:i,onLevelsChange:a,onLevelSwitch:o}=e,s=er(r),c=(e,t)=>tr(r,e,t),l=()=>nr(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 ir({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 ar(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 or(e){let{hlsInstance:t,videoElement:n}=e;return()=>{let r=n.currentTime;ar(n,r)||(t.config.maxBufferLength=30,ir(e,r))}}function sr(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 cr(e,t,n){return!e.isSupported()&&t.canPlayType(`application/vnd.apple.mpegurl`)?(t.src=n,!0):!1}function lr(e,t,n){let r=Zn();e.on(t.ERROR,(t,i)=>{let a=Qn(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 ur(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(),l.setHlsInstance(r,null)}}}async function dr(e){let{videoElement:t,videoUrl:n,playerId:r,isPreloading:i,onError:a,onLevelsChange:o,onLevelSwitch:s}=e;if(!qn(n))return t.src=n,null;let c=await $n();if(cr(c,t,n))return null;let u=new c(sr(i)),d={levels:[],currentLevel:-1,isAuto:!0},f=or({hlsInstance:u,events:c.Events,videoElement:t});return t.addEventListener(`seeking`,f),l.setHlsInstance(r,u),u.attachMedia(t),rr({hlsInstance:u,events:c.Events,playerId:r,videoUrl:n,onLevelsChange:e=>{d.levels=e,o?.(e)},onLevelSwitch:e=>{d.currentLevel=e,s?.(e)}}),lr(u,c.Events,a),ur({hlsInstance:u,videoElement:t,playerId:r,handleSeeking:f,state:d})}const M=m({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 fr(e){let{playerId:t,currentTimeMs:n,playbackRate:r}=e;N.startSegment(t,n,r)}function pr(e){let{playerId:t,currentTimeMs:n}=e;N.endSegment(t,n)}function mr(e){let{playerId:t,currentTimeMs:n,playbackRate:r,isPaused:i}=e;i||(N.endSegment(t,n),N.startSegment(t,n,r))}const hr={visible:!1,hideTimeout:null},P={state:/* @__PURE__ */ new Map,get:e=>{let t=P.state.get(e);return t||(t=Je({...hr}),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=m([`main`]),I=m(`forward`),gr=qe(F,e=>e[e.length-1]),_r=e=>{let t=F.get();t[t.length-1]!==e&&(I.set(`forward`),F.set([...t,e]))},vr=()=>{let e=F.get();e.length<=1||(I.set(`back`),F.set(e.slice(0,-1)))},yr=()=>{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 xr({rect:e,clientX:t,min:n,max:r,step:i}){let a=n+c((t-e.left)/e.width,0,1)*(r-n),o=Math.round(a/i)*i;return Number(c(o,n,r).toFixed(2))}const Sr={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 Cr(e){return Sr[S(e)]}function wr(e,t){return{container:t?.container??te.get(e),video:t?.video??f.get(e)}}function Tr(e){return l.get(e).get().isFullscreen||w()}async function Er(e,t){try{if(w()&&document.exitFullscreen)await document.exitFullscreen();else if(t&&typeof t.webkitExitFullscreen==`function`)t.webkitExitFullscreen();else return;l.setFullscreen(e,!1)}catch{}}async function Dr(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;l.setFullscreen(e,!0)}catch{}}function Or(e){P.setVisible(e,!0)}function kr(e){P.hideControls(e)}async function Ar(e,t){let{container:n,video:r}=wr(e,t);(n||r)&&(Tr(e)?await Er(e,r):await Dr(e,n,r))}async function jr(e,t){let{video:n}=wr(e,t);if(!n)return;let r=!l.get(e).get().isPictureInPicture;await nn(n),l.setPictureInPicture(e,r)}const Mr=(e,t)=>{let n=s(e.textTracks);l.setAvailableSubtitleTracks(t,n)},Nr=e=>{l.setCurrentSubtitleText(e,``)},Pr=(e,t)=>{if(!t.current)return;let i=l.get(e).get(),a=i.subtitleTrack;if(a<0||a>=i.availableSubtitleTracks.length){i.currentSubtitleText!==``&&Nr(e);return}let o=i.availableSubtitleTracks[a].track;if(o.mode!==`showing`)return;let s=o.activeCues;if(!s||s.length===0){i.currentSubtitleText!==``&&l.setCurrentSubtitleText(e,``);return}r(s,o.cues);let c=s[s.length-1],u=n(c);u!==i.currentSubtitleText&&l.setCurrentSubtitleText(e,u)},Fr=(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},Ir=(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 Lr(e,t){return!Number.isFinite(t)||t<=0||!Number.isFinite(e)||e<=0?0:e>=t?1:e/t}function Rr(e,t,n){t&&(e.feed_id=t),n&&(e.post_id=n)}function zr({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 Br({event:e,contentType:t,viewType:n,segments:r}){t===`video`&&L(n)&&r&&r.length!==0&&(e.segments=r)}function Vr(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 Rr(d,o,s),zr({event:d,contentType:n,videoPositionMs:c,videoTotalDurationMs:l}),Br({event:d,contentType:n,viewType:r,segments:u}),d}function Hr(e){return e===null?0:Date.now()-e}function Ur(e,t){return t?`feed`:e}function L(e){return e===`watch`||e===`end`}function Wr(e){return Math.round(e)}function R(e){return e*1e3}function Gr(e){return e/1e3}const z=m({});function B(e){z.set({...z.get(),...e})}const Kr=`rixl_analytics_device_id`,V=m({deviceId:void 0});function qr(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():`${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}function Jr(){if(typeof localStorage<`u`&&localStorage)try{return localStorage.getItem(Kr)??void 0}catch{return}}function Yr(e){if(typeof localStorage<`u`&&localStorage)try{localStorage.setItem(Kr,e)}catch{}}function H(){let e=V.get();if(e.deviceId)return e.deviceId;let t=Jr();if(t)return V.set({deviceId:t}),t;let n=qr();return Yr(n),V.set({deviceId:n}),n}function Xr(e){Yr(e),V.set({deviceId:e})}const U=m({sessionId:void 0,started:!1});function Zr(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():`s-${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}function Qr(){let e=U.get();if(e.sessionId)return e.sessionId;let t=Zr();return U.set({...e,sessionId:t}),t}function $r(){return U.get().started}function ei(){U.set({...U.get(),started:!0})}function ti(){U.set({sessionId:void 0,started:!1})}function ni(e){return{_type:`engagement`,timestamp:Date.now()/1e3,engagement_type:e.engagementType,...b({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 ri(e){return{_type:`interaction`,timestamp:Date.now()/1e3,interaction_type:e.interactionType,...b({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 ii(e){return{_type:`error`,timestamp:Date.now()/1e3,error_type:e.errorType,...b({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 ai(e){return{_type:`session_start`,timestamp:Date.now()/1e3,...b({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 oi(e){return e===`video`?`MEDIA_TYPE_VIDEO`:`MEDIA_TYPE_IMAGE`}function si(e){return{start_ms:W(e.start_ms),end_ms:W(e.end_ms),speed:e.speed}}function ci(e,{context:t,deviceId:n}){let r={content_id:e.content_id,content_type:oi(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,...b({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(si):void 0})},i=e.country??t.country;return i!==void 0&&(r.country=i),r}function li(e,{context:t,sessionId:n}){let r={engagement_type:e.engagement_type,session_id:e.session_id??n,...b({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 ui(e,{context:t,sessionId:n}){let r={interaction_type:e.interaction_type,session_id:e.session_id??n,...b({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 di(e,{context:t,sessionId:n}){let r={error_type:e.error_type,session_id:e.session_id??n,...b({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 fi(e){return{...b({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 pi(e,t){t!==void 0&&(e.timestamp=(/* @__PURE__ */ new Date(t*1e3)).toISOString())}function mi(e,t){let n;switch(e._type){case`content_views`:n={content_view:ci(e,t)};break;case`engagement`:n={engagement:li(e,t)};break;case`interaction`:n={interaction:ui(e,t)};break;case`error`:n={error:di(e,t)};break;case`session_start`:n={session_start:fi(e)};break;default:throw Error(`Unsupported analytics event type: ${e._type}`)}return pi(n,e.timestamp),n}const hi=/* @__PURE__ */ new Set([408,425,429]);function gi(e){return e>=500||hi.has(e)}function _i(e,t){return Object.assign(Error(e),{retryable:t})}function vi(e){return e instanceof Error&&`retryable`in e?e.retryable:!0}let G=[],K=!1,q=null,J=null,Y=null;function yi(){let e=()=>{};return{promise:new Promise(t=>{e=t}),resolve:e}}function bi(){let e=Y;Y=null,e?.resolve()}function xi(){return Y??=yi(),q===null&&!K&&(q=setTimeout(()=>{q=null,Si()},0)),Y.promise}function Si(){if(K)return J??Promise.resolve();if(G.length===0)return Promise.resolve();let e=Ci().finally(()=>{J===e&&(J=null)});return J=e,e}async function Ci(){K=!0,q&&=(clearTimeout(q),null);try{for(;G.length>0;){let e=G;G=[];let t=Y;Y=null;try{await Ti(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),vi(t)&&G.unshift(...e)}async function Ti(e){let t={context:z.get(),deviceId:H(),sessionId:Qr()},n=!$r();await Oi(Di(Ei(e,t.context,n),t)),n&&ei()}function Ei(e,t,n){let r=[];return n&&r.push(Ai(t)),r.push(...e),r}function Di(e,t){let n=b({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=>mi(e,t)),...n}}async function Oi(e){let t;for(let n=0;n<3;n++)try{await ki(e);return}catch(e){if(t=e,!vi(e))break}throw t}async function ki(e){let{response:t}=await Me({body:e});if(t&&!t.ok)throw console.error(`[Analytics] Failed to post events: ${t.status} ${t.statusText}`),_i(`Analytics request failed with ${t.status}`,gi(t.status))}function Ai(e){return ai({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),xi()}function ji(e){X([ni(e)])}function Mi(e){X([ri(e)])}function Ni(e){X([ii(e)])}async function Pi(){return Si()}function Fi(e){X([Vr(e)])}function Ii({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 Li(){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 Ri(){if(typeof screen<`u`)return`${screen.width}x${screen.height}`}function zi(){if(typeof Intl<`u`)try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}}function Bi(){return(/* @__PURE__ */ new Date()).getTimezoneOffset()*-1}function Vi(){return typeof window<`u`&&`ontouchstart`in window}function Hi(){let e=typeof navigator<`u`?navigator:void 0;return{device:Li(),os:e?.platform,language:e?.language,browser:e?.userAgent,screen_resolution:Ri(),platform:e?.platform,timezone:zi(),timezone_offset:Bi(),color_depth:typeof screen<`u`?screen.colorDepth:void 0,touch_support:Vi()}}function Ui(e){let t={user_id:e?.id};e?.language_code&&(t.language=e.language_code),B(t)}function Wi(){H(),ti(),B(Hi()),He.subscribe(Ui)}function Gi(e,t,n=1){return e.start_time_sec<=t+n&&e.end_time_sec<=t+n}function Ki(e,t,n=1){return!e||e.length<=1||t<=0?!1:e.every(e=>Gi(e,t,n))}function qi(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 Ji(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 Yi(e){return e?.length?Math.max(...e):0}function Xi(e,t,n){return e<=t?0:e>=n?100:(e-t)/(n-t)*100}function Zi({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 Qi(e,t){return t<=0?0:e/t}function $i({isDragging:e,progress:t,duration:n,currentTime:r}){return e?t*n:r}function ea(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 ta(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 na(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 ra(e){return e===void 0?0:typeof e==`number`?e:Number(e)}function ia(e){return{video_id:e.video_id??``,total_duration_ms:ra(e.total_duration_ms),data:e.data??[]}}async function aa({videoId:e,buckets:t=101}){try{let{data:n,error:r}=await Pe({path:{video_id:e},query:{buckets:t}});return r||!n?null:ia(n)}catch{return null}}async function oa({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 Ne({path:{video_id:e},query:Object.keys(r).length>0?r:void 0});return a?[]:i?.segments??[]}catch{return[]}}function sa(e){return`getVideoPlaybackQuality`in e?e.getVideoPlaybackQuality().droppedVideoFrames:0}function ca(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 la(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 ua(e){let{video:t}=e;return t?{droppedFrames:sa(t),volume:Math.round(t.volume*100),networkSpeed:e.hlsBandwidthEstimate??0,bufferHealth:ca(t),currentRes:t.videoWidth>0?{width:t.videoWidth,height:t.videoHeight}:null,optimalRes:la(e)}:{droppedFrames:0,volume:0,networkSpeed:0,bufferHealth:0,currentRes:null,optimalRes:null}}function Q(){return Fe}async function da(e){let t=await Ie(e);return Wi(),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 fa(e){let t=Q(),n=await Le({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 pa(e,t){let n=await fa(t);return await $(n.uploadUrl,e),n}async function ma(e){let t=Q(),n=await Ge({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 ha(e,t,n){let r=await ma(n);return await Promise.all([$(r.videoUploadUrl,e),$(r.posterUploadUrl,t)]),r}async function ga(e,t,n){let r=Q(),i=await Ue({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 _a(e,t,n){let r=Q(),i=await We({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 va(e,t,n){let r=await ya(n);return await Promise.all([$(r.contentUploadUrl,e),$(r.posterUploadUrl,t)]),r}async function ya(e){let t=Q(),n=await ze({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{Wt as BOTTOM_OFFSET_CONTROLS_HIDDEN,Ut as BOTTOM_OFFSET_CONTROLS_VISIBLE,Ht as BOTTOM_SNAP_THRESHOLD,C as CAPTION_WIDTH_RATIO,Te as COLORS,Bt as DEFAULT_CAPTION_FONT_SIZE,Ft as DEFAULT_FONT_SIZE,wt as DEFAULT_IMAGE_ASPECT_RATIO,wn as DOUBLE_CLICK_THRESHOLD_MS,Oe as EDGE_STYLES,p as FONT_FAMILIES,Se as FONT_SIZES,Rt as FONT_SIZE_RATIO,zt as FONT_SIZE_VIEWPORT_RATIO,Tt as IMAGE_ASPECT_RATIO_THRESHOLD,Ae as LANG_TYPES,pn as LOADING_SPINNER_DELAY_MS,Lt as MAX_FONT_SIZE,Xn as MAX_MEDIA_RECOVERIES,Yn as MAX_NETWORK_RETRIES,It as MIN_FONT_SIZE,on as PERSIST_INTERVAL_MS,_e as PLAYBACK_SPEEDS,Mt as PLAYER_LANGUAGES,pe as PLAY_PAUSE_KEYS,D as PRELOAD_RANGE,rn as RESUME_MIN_POSITION_SECONDS,an as RESUME_MIN_REMAINING_SECONDS,Vt as SAFE_ZONE_MARGIN,le as SEEK_LARGE_SECONDS,de as SEEK_SMALL_SECONDS,se as SHORTCUTS_CONFIG,Cn as SINGLE_CLICK_DELAY_MS,re as ShortcutAction,dn as UNLOAD_DISTANCE,ue as VOLUME_DELTA,O as VideoLoadState,gr as activeMenu,z as analyticsContextStore,V as analyticsDeviceStore,U as analyticsSessionStore,M as analyticsStore,N as analyticsStoreActions,Un as bindClickOutside,Wn as bindDocumentHidden,Rn as bindEndedListener,An as bindFullscreenChangeListener,jn as bindPictureInPictureChangeListener,Nn as bindPipVisibilityReentry,Ln as bindPlaybackRateSync,Vr as buildContentViewEvent,Ii as buildVideoAnalyticsPayload,_n as calculateAspectRatio,qi as calculateChaptersWithEnd,Yt as calculateDragPosition,Qi as calculateFlexGrow,Gt as calculateFontSize,Yi as calculateGlobalMax,Ji as calculateHeatmapSlices,Xt as calculateSafeViewport,Zi as calculateSegmentBufferRanges,Xi as calculateSegmentProgress,t as calculateSmoothedEndTime,ve as calculateVolumeToSet,Hr as calculateWatchDuration,c as clamp,Ee as clampVolume,kn as cleanupClickDisambiguation,gn as cleanupLoadingDebounce,Nr as clearSubtitles,ua as collectVideoStats,Fr as computeBufferRanges,Ir as computeBufferedAhead,br as computePlaybackFillPercentage,xr as computePlaybackValueFromPointer,Lr as computeProgressFraction,da as connect,Kt as constrainPercentagePosition,P as controlsStore,ga as createAudioTrackUpload,Tn as createClickDisambiguationState,sr as createHlsConfig,Zn as createHlsErrorRecoveryState,fa as createImageUpload,mn as createLoadingDebounceState,ya as createPostUpload,_a as createSubtitleUpload,ma as createVideoUpload,Qn as decideHlsErrorAction,ge as defaultSettings,Pn as deriveVolumeSync,pr as endSegment,fe as executeShortcutAction,s as extractSubtitleTracks,b as filterUndefined,ea as findHoveredSegmentIndex,ne as findNextCue,Pi as flushAnalytics,a as formatNumber,i as formatNumberSm,Ct as formatTime,A as generateLevelName,zn as getAspectRatioFromPoster,ca as getBufferHealth,tn as getCaptionTextStyle,en as getCaptionWindowStyle,n as getCleanCueText,$i as getCurrentPosition,sa as getDroppedFrames,Ur as getEffectivePage,Bn as getFeedPlaybackAction,ht as getFeedPost,gt as getFeedPosts,oa as getHotSegments,yt as getImage,Ot as getImageAspectRatio,kt as getImageContainerStyle,At as getImageStyle,ta as getNextChapterStart,H as getOrCreateDeviceId,Qr as getOrCreateSessionId,o as getPersistedAudioTrack,sn as getPersistedProgress,e as getPersistedSubtitleTrack,Pt as getPlayerControlLabels,Cr as getPlayerMenuLabels,Ce as getPointerClientX,Jt as getPointerOffsets,In as getPreloadAttribute,na as getPrevChapterTarget,Jn as getQualityLabel,be as getRestoredVolume,ie as getSeekAmount,ce as getSeekPercent,$t as getSmartCaptionPosition,Qt as getTextShadowValue,St as getVideo,aa as getVideoHeatmap,fn as getVideoLoadState,me as getVolumeDelta,ye as getVolumeFromPointer,Dn as handleClick,Pr as handleCueChange,On as handleDoubleClick,Mr as handleLoadedMetadata,xn as handleVideoError,yn as handleVideoPause,vn as handleVideoPlay,bn as handleVideoRateChange,jt as hexToRGB,x as hexToRGBAString,kr as hidePlayerControls,Dt as imageRenderReducer,st as initProgressBar,Et as initialImageRenderState,Wi as initializeAnalyticsContext,Gi as isChapterWithinDuration,Hn as isClickOutside,w as isDocumentFullscreen,he as isEffectivelyMuted,qn as isHlsStream,Vn as isInsideExcludedElement,T as isVideoPictureInPicture,we as loadSettings,F as menuStack,Gr as msToSeconds,I as navigationDirection,Fn as observeViewport,u as persistAudioTrack,cn as persistProgress,ee as persistSubtitleTrack,qt as pixelsToPercentage,te as playerContainerElementStore,f as playerMediaElementStore,l as playerStateStore,vr as popMenu,X as postAnalytics,Fi as postContentEvent,ji as postEngagement,Ni as postError,Mi as postInteraction,r as processCues,_r as pushMenu,yr as resetMenu,S as resolvePlayerLanguage,ae as resolveShortcutAction,mr as restartSegmentIfPlaying,Wr as roundMs,De as saveSettings,R as secondsToMs,B as setAnalyticsContext,Xr as setDeviceId,ke as settingsStore,dr as setupHls,je as shouldBeMuted,oe as shouldIgnoreKeyboardEvent,L as shouldIncludeSegments,un as shouldPersistProgress,Zt as shouldPinToBottom,Mn as shouldReenterPictureInPicture,ln as shouldResumeFromPosition,Gn as shouldShowSpinner,Or as showPlayerControls,Z as sliceHeatmapData,Kn as sortLevelsByQuality,fr as startSegment,d as stripHtmlTags,nn as togglePictureInPicture,Ar as togglePlayerFullscreen,jr as togglePlayerPictureInPicture,hn as updateLoadingState,Sn as updatePlayerLoadingState,pa as uploadImage,va as uploadPost,ha as uploadVideo,Ki as validateChapters,xe as validateSettings};
package/package.json CHANGED
@@ -1,14 +1,21 @@
1
1
  {
2
2
  "name": "@rixl/media-core",
3
- "version": "1.0.2",
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.1",
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 };