googlevideo 2.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +9 -9
  2. package/README.md +127 -66
  3. package/dist/protos/generated/misc/common.d.ts +180 -21
  4. package/dist/protos/generated/misc/common.js +277 -147
  5. package/dist/protos/generated/misc/common.js.map +1 -0
  6. package/dist/protos/generated/video_streaming/buffered_range.d.ts +10 -25
  7. package/dist/protos/generated/video_streaming/buffered_range.js +21 -166
  8. package/dist/protos/generated/video_streaming/buffered_range.js.map +1 -0
  9. package/dist/protos/generated/video_streaming/client_abr_state.d.ts +34 -45
  10. package/dist/protos/generated/video_streaming/client_abr_state.js +209 -350
  11. package/dist/protos/generated/video_streaming/client_abr_state.js.map +1 -0
  12. package/dist/protos/generated/video_streaming/crypto_params.d.ts +2 -24
  13. package/dist/protos/generated/video_streaming/crypto_params.js +2 -86
  14. package/dist/protos/generated/video_streaming/crypto_params.js.map +1 -0
  15. package/dist/protos/generated/video_streaming/format_initialization_metadata.d.ts +6 -21
  16. package/dist/protos/generated/video_streaming/format_initialization_metadata.js +32 -95
  17. package/dist/protos/generated/video_streaming/format_initialization_metadata.js.map +1 -0
  18. package/dist/protos/generated/video_streaming/format_selection_config.d.ts +12 -0
  19. package/dist/protos/generated/video_streaming/format_selection_config.js +68 -0
  20. package/dist/protos/generated/video_streaming/format_selection_config.js.map +1 -0
  21. package/dist/protos/generated/video_streaming/innertube_request.d.ts +25 -0
  22. package/dist/protos/generated/video_streaming/innertube_request.js +186 -0
  23. package/dist/protos/generated/video_streaming/innertube_request.js.map +1 -0
  24. package/dist/protos/generated/video_streaming/live_metadata.d.ts +20 -0
  25. package/dist/protos/generated/video_streaming/live_metadata.js +153 -0
  26. package/dist/protos/generated/video_streaming/live_metadata.js.map +1 -0
  27. package/dist/protos/generated/video_streaming/media_capabilities.d.ts +0 -15
  28. package/dist/protos/generated/video_streaming/media_capabilities.js +2 -122
  29. package/dist/protos/generated/video_streaming/media_capabilities.js.map +1 -0
  30. package/dist/protos/generated/video_streaming/media_header.d.ts +5 -27
  31. package/dist/protos/generated/video_streaming/media_header.js +28 -151
  32. package/dist/protos/generated/video_streaming/media_header.js.map +1 -0
  33. package/dist/protos/generated/video_streaming/next_request_policy.d.ts +3 -15
  34. package/dist/protos/generated/video_streaming/next_request_policy.js +32 -50
  35. package/dist/protos/generated/video_streaming/next_request_policy.js.map +1 -0
  36. package/dist/protos/generated/video_streaming/onesie_header.d.ts +7 -22
  37. package/dist/protos/generated/video_streaming/onesie_header.js +16 -137
  38. package/dist/protos/generated/video_streaming/onesie_header.js.map +1 -0
  39. package/dist/protos/generated/video_streaming/onesie_header_type.d.ts +9 -25
  40. package/dist/protos/generated/video_streaming/onesie_header_type.js +17 -176
  41. package/dist/protos/generated/video_streaming/onesie_header_type.js.map +1 -0
  42. package/dist/protos/generated/video_streaming/onesie_innertube_request.d.ts +15 -0
  43. package/dist/protos/generated/video_streaming/{onesie_player_request.js → onesie_innertube_request.js} +10 -54
  44. package/dist/protos/generated/video_streaming/onesie_innertube_request.js.map +1 -0
  45. package/dist/protos/generated/video_streaming/onesie_innertube_response.d.ts +15 -0
  46. package/dist/protos/generated/video_streaming/{onesie_player_response.js → onesie_innertube_response.js} +6 -58
  47. package/dist/protos/generated/video_streaming/onesie_innertube_response.js.map +1 -0
  48. package/dist/protos/generated/video_streaming/onesie_proxy_status.d.ts +18 -0
  49. package/dist/protos/generated/video_streaming/onesie_proxy_status.js +25 -0
  50. package/dist/protos/generated/video_streaming/onesie_proxy_status.js.map +1 -0
  51. package/dist/protos/generated/video_streaming/onesie_request.d.ts +7 -17
  52. package/dist/protos/generated/video_streaming/onesie_request.js +28 -89
  53. package/dist/protos/generated/video_streaming/onesie_request.js.map +1 -0
  54. package/dist/protos/generated/video_streaming/playback_cookie.d.ts +2 -17
  55. package/dist/protos/generated/video_streaming/playback_cookie.js +6 -47
  56. package/dist/protos/generated/video_streaming/playback_cookie.js.map +1 -0
  57. package/dist/protos/generated/video_streaming/playback_start_policy.d.ts +0 -15
  58. package/dist/protos/generated/video_streaming/playback_start_policy.js +2 -66
  59. package/dist/protos/generated/video_streaming/playback_start_policy.js.map +1 -0
  60. package/dist/protos/generated/video_streaming/reload_player_response.d.ts +14 -0
  61. package/dist/protos/generated/video_streaming/reload_player_response.js +73 -0
  62. package/dist/protos/generated/video_streaming/reload_player_response.js.map +1 -0
  63. package/dist/protos/generated/video_streaming/request_cancellation_policy.d.ts +0 -15
  64. package/dist/protos/generated/video_streaming/request_cancellation_policy.js +2 -66
  65. package/dist/protos/generated/video_streaming/request_cancellation_policy.js.map +1 -0
  66. package/dist/protos/generated/video_streaming/request_identifier.d.ts +10 -0
  67. package/dist/protos/generated/video_streaming/request_identifier.js +41 -0
  68. package/dist/protos/generated/video_streaming/request_identifier.js.map +1 -0
  69. package/dist/protos/generated/video_streaming/sabr_context_sending_policy.d.ts +12 -0
  70. package/dist/protos/generated/video_streaming/sabr_context_sending_policy.js +86 -0
  71. package/dist/protos/generated/video_streaming/sabr_context_sending_policy.js.map +1 -0
  72. package/dist/protos/generated/video_streaming/sabr_context_update.d.ts +48 -0
  73. package/dist/protos/generated/video_streaming/sabr_context_update.js +242 -0
  74. package/dist/protos/generated/video_streaming/sabr_context_update.js.map +1 -0
  75. package/dist/protos/generated/video_streaming/sabr_error.d.ts +0 -15
  76. package/dist/protos/generated/video_streaming/sabr_error.js +2 -29
  77. package/dist/protos/generated/video_streaming/sabr_error.js.map +1 -0
  78. package/dist/protos/generated/video_streaming/sabr_redirect.d.ts +0 -15
  79. package/dist/protos/generated/video_streaming/sabr_redirect.js +2 -22
  80. package/dist/protos/generated/video_streaming/sabr_redirect.js.map +1 -0
  81. package/dist/protos/generated/video_streaming/snackbar_message.d.ts +10 -0
  82. package/dist/protos/generated/video_streaming/snackbar_message.js +41 -0
  83. package/dist/protos/generated/video_streaming/snackbar_message.js.map +1 -0
  84. package/dist/protos/generated/video_streaming/stream_protection_status.d.ts +1 -16
  85. package/dist/protos/generated/video_streaming/stream_protection_status.js +6 -33
  86. package/dist/protos/generated/video_streaming/stream_protection_status.js.map +1 -0
  87. package/dist/protos/generated/video_streaming/streamer_context.d.ts +11 -28
  88. package/dist/protos/generated/video_streaming/streamer_context.js +33 -383
  89. package/dist/protos/generated/video_streaming/streamer_context.js.map +1 -0
  90. package/dist/protos/generated/video_streaming/time_range.d.ts +2 -17
  91. package/dist/protos/generated/video_streaming/time_range.js +9 -41
  92. package/dist/protos/generated/video_streaming/time_range.js.map +1 -0
  93. package/dist/protos/generated/video_streaming/ump_part_id.d.ts +58 -0
  94. package/dist/protos/generated/video_streaming/ump_part_id.js +89 -0
  95. package/dist/protos/generated/video_streaming/ump_part_id.js.map +1 -0
  96. package/dist/protos/generated/video_streaming/video_playback_abr_request.d.ts +21 -36
  97. package/dist/protos/generated/video_streaming/video_playback_abr_request.js +67 -343
  98. package/dist/protos/generated/video_streaming/video_playback_abr_request.js.map +1 -0
  99. package/dist/src/core/{ChunkedDataBuffer.d.ts → CompositeBuffer.d.ts} +8 -8
  100. package/dist/src/core/{ChunkedDataBuffer.js → CompositeBuffer.js} +32 -27
  101. package/dist/src/core/CompositeBuffer.js.map +1 -0
  102. package/dist/src/core/SabrStream.d.ts +356 -0
  103. package/dist/src/core/SabrStream.js +958 -0
  104. package/dist/src/core/SabrStream.js.map +1 -0
  105. package/dist/src/core/SabrStreamingAdapter.d.ts +158 -0
  106. package/dist/src/core/SabrStreamingAdapter.js +496 -0
  107. package/dist/src/core/SabrStreamingAdapter.js.map +1 -0
  108. package/dist/src/core/SabrUmpProcessor.d.ts +53 -0
  109. package/dist/src/core/SabrUmpProcessor.js +234 -0
  110. package/dist/src/core/SabrUmpProcessor.js.map +1 -0
  111. package/dist/src/core/UmpReader.d.ts +30 -0
  112. package/dist/src/core/UmpReader.js +122 -0
  113. package/dist/src/core/UmpReader.js.map +1 -0
  114. package/dist/src/core/UmpWriter.d.ts +16 -0
  115. package/dist/src/core/UmpWriter.js +56 -0
  116. package/dist/src/core/UmpWriter.js.map +1 -0
  117. package/dist/src/exports/protos.d.ts +1 -0
  118. package/dist/src/exports/protos.js +2 -0
  119. package/dist/src/exports/protos.js.map +1 -0
  120. package/dist/src/exports/sabr-stream.d.ts +2 -0
  121. package/dist/src/exports/sabr-stream.js +2 -0
  122. package/dist/src/exports/sabr-stream.js.map +1 -0
  123. package/dist/src/exports/sabr-streaming-adapter.d.ts +3 -0
  124. package/dist/src/exports/sabr-streaming-adapter.js +3 -0
  125. package/dist/src/exports/sabr-streaming-adapter.js.map +1 -0
  126. package/dist/src/exports/ump.d.ts +3 -0
  127. package/dist/src/exports/ump.js +4 -0
  128. package/dist/src/exports/ump.js.map +1 -0
  129. package/dist/src/exports/utils.d.ts +1 -0
  130. package/dist/src/exports/utils.js +2 -0
  131. package/dist/src/exports/utils.js.map +1 -0
  132. package/dist/src/types/sabrStreamTypes.d.ts +102 -0
  133. package/dist/src/types/sabrStreamTypes.js +2 -0
  134. package/dist/src/types/sabrStreamTypes.js.map +1 -0
  135. package/dist/src/types/sabrStreamingAdapterTypes.d.ts +93 -0
  136. package/dist/src/types/sabrStreamingAdapterTypes.js +2 -0
  137. package/dist/src/types/sabrStreamingAdapterTypes.js.map +1 -0
  138. package/dist/src/types/shared.d.ts +64 -0
  139. package/dist/src/types/shared.js +2 -0
  140. package/dist/src/types/shared.js.map +1 -0
  141. package/dist/src/utils/CacheManager.d.ts +32 -0
  142. package/dist/src/utils/CacheManager.js +131 -0
  143. package/dist/src/utils/CacheManager.js.map +1 -0
  144. package/dist/src/utils/EventEmitterLike.d.ts +5 -0
  145. package/dist/src/utils/EventEmitterLike.js +51 -10
  146. package/dist/src/utils/EventEmitterLike.js.map +1 -0
  147. package/dist/src/utils/Logger.d.ts +30 -0
  148. package/dist/src/utils/Logger.js +80 -0
  149. package/dist/src/utils/Logger.js.map +1 -0
  150. package/dist/src/utils/Protos.d.ts +21 -13
  151. package/dist/src/utils/Protos.js +22 -13
  152. package/dist/src/utils/Protos.js.map +1 -0
  153. package/dist/src/utils/RequestMetadataManager.d.ts +15 -0
  154. package/dist/src/utils/RequestMetadataManager.js +48 -0
  155. package/dist/src/utils/RequestMetadataManager.js.map +1 -0
  156. package/dist/src/utils/formatKeyUtils.d.ts +45 -0
  157. package/dist/src/utils/formatKeyUtils.js +77 -0
  158. package/dist/src/utils/formatKeyUtils.js.map +1 -0
  159. package/dist/src/utils/index.d.ts +5 -3
  160. package/dist/src/utils/index.js +6 -2
  161. package/dist/src/utils/index.js.map +1 -0
  162. package/dist/src/utils/sabrStreamUtils.d.ts +28 -0
  163. package/dist/src/utils/sabrStreamUtils.js +76 -0
  164. package/dist/src/utils/sabrStreamUtils.js.map +1 -0
  165. package/dist/src/utils/shared.d.ts +43 -0
  166. package/dist/src/utils/shared.js +108 -0
  167. package/dist/src/utils/shared.js.map +1 -0
  168. package/package.json +88 -61
  169. package/dist/protos/generated/video_streaming/encrypted_player_request.d.ts +0 -37
  170. package/dist/protos/generated/video_streaming/encrypted_player_request.js +0 -239
  171. package/dist/protos/generated/video_streaming/onesie_player_request.d.ts +0 -31
  172. package/dist/protos/generated/video_streaming/onesie_player_response.d.ts +0 -29
  173. package/dist/protos/generated/video_streaming/proxy_status.d.ts +0 -16
  174. package/dist/protos/generated/video_streaming/proxy_status.js +0 -86
  175. package/dist/src/core/ServerAbrStream.d.ts +0 -38
  176. package/dist/src/core/ServerAbrStream.js +0 -272
  177. package/dist/src/core/UMP.d.ts +0 -10
  178. package/dist/src/core/UMP.js +0 -109
  179. package/dist/src/core/index.d.ts +0 -3
  180. package/dist/src/core/index.js +0 -3
  181. package/dist/src/index.d.ts +0 -4
  182. package/dist/src/index.js +0 -4
  183. package/dist/src/utils/helpers.d.ts +0 -63
  184. package/dist/src/utils/helpers.js +0 -101
  185. package/dist/src/utils/types.d.ts +0 -65
  186. package/dist/src/utils/types.js +0 -1
@@ -1,23 +1,32 @@
1
1
  export { FormatInitializationMetadata } from '../../protos/generated/video_streaming/format_initialization_metadata.js';
2
- export { BufferedRange } from '../../protos/generated/video_streaming/buffered_range.js';
3
2
  export { MediaHeader } from '../../protos/generated/video_streaming/media_header.js';
4
- export { NextRequestPolicy } from '../../protos/generated/video_streaming/next_request_policy.js';
3
+ export { BufferedRange } from '../../protos/generated/video_streaming/buffered_range.js';
4
+ export { MediaCapabilities } from '../../protos/generated/video_streaming/media_capabilities.js';
5
+ export { CryptoParams } from '../../protos/generated/video_streaming/crypto_params.js';
5
6
  export { PlaybackCookie } from '../../protos/generated/video_streaming/playback_cookie.js';
6
7
  export { PlaybackStartPolicy } from '../../protos/generated/video_streaming/playback_start_policy.js';
8
+ export { VideoPlaybackAbrRequest } from '../../protos/generated/video_streaming/video_playback_abr_request.js';
9
+ export { ClientAbrState } from '../../protos/generated/video_streaming/client_abr_state.js';
10
+ export { NextRequestPolicy } from '../../protos/generated/video_streaming/next_request_policy.js';
7
11
  export { RequestCancellationPolicy } from '../../protos/generated/video_streaming/request_cancellation_policy.js';
12
+ export { RequestIdentifier } from '../../protos/generated/video_streaming/request_identifier.js';
8
13
  export { SabrError } from '../../protos/generated/video_streaming/sabr_error.js';
9
14
  export { SabrRedirect } from '../../protos/generated/video_streaming/sabr_redirect.js';
10
- export { StreamProtectionStatus } from '../../protos/generated/video_streaming/stream_protection_status.js';
11
- export { VideoPlaybackAbrRequest } from '../../protos/generated/video_streaming/video_playback_abr_request.js';
12
15
  export { OnesieRequest } from '../../protos/generated/video_streaming/onesie_request.js';
13
- export { EncryptedPlayerRequest } from '../../protos/generated/video_streaming/encrypted_player_request.js';
14
16
  export { OnesieHeader } from '../../protos/generated/video_streaming/onesie_header.js';
15
17
  export { OnesieHeaderType } from '../../protos/generated/video_streaming/onesie_header_type.js';
16
- export { OnesiePlayerRequest } from '../../protos/generated/video_streaming/onesie_player_request.js';
17
- export { OnesiePlayerResponse } from '../../protos/generated/video_streaming/onesie_player_response.js';
18
- export { ClientAbrState } from '../../protos/generated/video_streaming/client_abr_state.js';
19
- export { StreamerContext } from '../../protos/generated/video_streaming/streamer_context.js';
20
- export { ProxyStatus } from '../../protos/generated/video_streaming/proxy_status.js';
21
- export { MediaCapabilities } from '../../protos/generated/video_streaming/media_capabilities.js';
22
- export { CryptoParams } from '../../protos/generated/video_streaming/crypto_params.js';
23
- export { ClientAbrState_MediaType as MediaType } from '../../protos/generated/video_streaming/client_abr_state.js';
18
+ export { OnesieInnertubeRequest } from '../../protos/generated/video_streaming/onesie_innertube_request.js';
19
+ export { OnesieInnertubeResponse } from '../../protos/generated/video_streaming/onesie_innertube_response.js';
20
+ export { OnesieProxyStatus } from '../../protos/generated/video_streaming/onesie_proxy_status.js';
21
+ export { InnertubeRequest, UstreamerFlags } from '../../protos/generated/video_streaming/innertube_request.js';
22
+ export { StreamerContext, StreamerContext_ClientInfo as ClientInfo } from '../../protos/generated/video_streaming/streamer_context.js';
23
+ export { SabrContextUpdate, SabrContextUpdate_SabrContextWritePolicy as SabrContextWritePolicy, SabrContextValue } from '../../protos/generated/video_streaming/sabr_context_update.js';
24
+ export { SabrContextSendingPolicy } from '../../protos/generated/video_streaming/sabr_context_sending_policy.js';
25
+ export { StreamProtectionStatus } from '../../protos/generated/video_streaming/stream_protection_status.js';
26
+ export { LiveMetadata } from '../../protos/generated/video_streaming/live_metadata.js';
27
+ export { SnackbarMessage } from '../../protos/generated/video_streaming/snackbar_message.js';
28
+ export { UMPPartId } from '../../protos/generated/video_streaming/ump_part_id.js';
29
+ export { ReloadPlaybackContext, ReloadPlaybackParams } from '../../protos/generated/video_streaming/reload_player_response.js';
30
+ export { FormatSelectionConfig } from '../../protos/generated/video_streaming/format_selection_config.js';
31
+ export { FormatId, KeyValuePair, Range, HttpHeader, IdentifierToken, CompressionType, OnesieRequestTarget, AuthorizedFormat, AudioQuality, PlaybackAuthorization, NetworkMeteredState, PlaybackAudioRouteOutputType, SeekSource, VideoQualitySetting } from '../../protos/generated/misc/common.js';
32
+ //# sourceMappingURL=Protos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protos.js","sourceRoot":"","sources":["../../../src/utils/Protos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,0EAA0E,CAAC;AACxH,OAAO,EAAE,WAAW,EAAE,MAAM,wDAAwD,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,0DAA0D,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,yDAAyD,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,2DAA2D,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,sEAAsE,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,4DAA4D,CAAC;AAE5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+DAA+D,CAAC;AAClG,OAAO,EAAE,yBAAyB,EAAE,MAAM,uEAAuE,CAAC;AAClH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,sDAAsD,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,yDAAyD,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,0DAA0D,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,yDAAyD,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,oEAAoE,CAAC;AAC5G,OAAO,EAAE,uBAAuB,EAAE,MAAM,qEAAqE,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,MAAM,+DAA+D,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAC/G,OAAO,EAAE,eAAe,EAAE,0BAA0B,IAAI,UAAU,EAAE,MAAM,4DAA4D,CAAC;AACvI,OAAO,EAAE,iBAAiB,EAAE,wCAAwC,IAAI,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,+DAA+D,CAAC;AACxL,OAAO,EAAE,wBAAwB,EAAE,MAAM,uEAAuE,CAAC;AAEjH,OAAO,EAAE,sBAAsB,EAAE,MAAM,oEAAoE,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,MAAM,yDAAyD,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,4DAA4D,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,uDAAuD,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kEAAkE,CAAC;AAC/H,OAAO,EAAE,qBAAqB,EAAE,MAAM,mEAAmE,CAAC;AAE1G,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,4BAA4B,EAC5B,UAAU,EACV,mBAAmB,EACpB,MAAM,uCAAuC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { SabrRequestMetadata } from '../types/sabrStreamingAdapterTypes.js';
2
+ /**
3
+ * Manages request metadata objects.
4
+ */
5
+ export declare class RequestMetadataManager {
6
+ metadataMap: Map<string, SabrRequestMetadata>;
7
+ private lastCleanup;
8
+ private readonly CLEANUP_INTERVAL;
9
+ private readonly ENTRY_EXPIRATION_TIME;
10
+ constructor();
11
+ getRequestMetadata(url: string, del?: boolean): SabrRequestMetadata | undefined;
12
+ setRequestMetadata(url: string, context: SabrRequestMetadata): void;
13
+ private conditionalCleanUp;
14
+ private cleanUp;
15
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Manages request metadata objects.
3
+ */
4
+ export class RequestMetadataManager {
5
+ constructor() {
6
+ this.CLEANUP_INTERVAL = 30000;
7
+ this.ENTRY_EXPIRATION_TIME = 1000 * 60 * 3;
8
+ this.metadataMap = new Map();
9
+ this.lastCleanup = Date.now();
10
+ }
11
+ getRequestMetadata(url, del = false) {
12
+ const requestNumber = new URL(url).searchParams.get('rn') || '';
13
+ const streamingContext = this.metadataMap.get(requestNumber);
14
+ // Check if this specific entry is expired.
15
+ if (streamingContext && Date.now() - streamingContext.timestamp > this.ENTRY_EXPIRATION_TIME) {
16
+ this.metadataMap.delete(requestNumber);
17
+ return undefined;
18
+ }
19
+ if (del) {
20
+ this.metadataMap.delete(requestNumber);
21
+ }
22
+ this.conditionalCleanUp();
23
+ return streamingContext;
24
+ }
25
+ setRequestMetadata(url, context) {
26
+ const requestNumber = new URL(url).searchParams.get('rn');
27
+ if (requestNumber) {
28
+ this.metadataMap.set(requestNumber, context);
29
+ this.conditionalCleanUp();
30
+ }
31
+ }
32
+ conditionalCleanUp() {
33
+ const now = Date.now();
34
+ if (now - this.lastCleanup > this.CLEANUP_INTERVAL) {
35
+ this.cleanUp();
36
+ this.lastCleanup = now;
37
+ }
38
+ }
39
+ cleanUp() {
40
+ // Should rarely run. This is only for requests that fail and never get handled (e.g., network errors).
41
+ for (const [key, context] of this.metadataMap.entries()) {
42
+ if (Date.now() - context.timestamp > this.ENTRY_EXPIRATION_TIME) {
43
+ this.metadataMap.delete(key);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=RequestMetadataManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestMetadataManager.js","sourceRoot":"","sources":["../../../src/utils/RequestMetadataManager.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAMjC;QAHiB,qBAAgB,GAAG,KAAK,CAAC;QACzB,0BAAqB,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QAGrD,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IAEM,kBAAkB,CAAC,GAAW,EAAE,GAAG,GAAG,KAAK;QAChD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEhE,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE7D,2CAA2C;QAC3C,IAAI,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7F,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,kBAAkB,CAAC,GAAW,EAAE,OAA4B;QACjE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,OAAO;QACb,uGAAuG;QACvG,KAAK,MAAM,CAAE,GAAG,EAAE,OAAO,CAAE,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAChE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ import type { MediaHeader } from './Protos.js';
2
+ import type { FormatInitializationMetadata } from './Protos.js';
3
+ import type { SabrFormat } from '../types/shared.js';
4
+ import type { SabrRequestMetadata } from '../types/sabrStreamingAdapterTypes.js';
5
+ /**
6
+ * Creates a format key based on itag and xtags.
7
+ * @returns A string format key.
8
+ */
9
+ export declare function createKey(itag: number | undefined, xtags: string | undefined): string;
10
+ /**
11
+ * Creates a format key from a SabrFormat object.
12
+ * @returns A string format key or undefined if format is undefined.
13
+ */
14
+ export declare function fromFormat(format?: {
15
+ itag?: number;
16
+ xtags?: string;
17
+ }): string | undefined;
18
+ /**
19
+ * Creates a format key from a MediaHeader object.
20
+ * @returns A string format key.
21
+ */
22
+ export declare function fromMediaHeader(mediaHeader: MediaHeader): string;
23
+ /**
24
+ * Creates a format key from FormatInitializationMetadata.
25
+ * @returns A string format key or undefined if formatId is undefined.
26
+ */
27
+ export declare function fromFormatInitializationMetadata(formatInitMetadata: FormatInitializationMetadata): string;
28
+ /**
29
+ * Creates a segment cache key.
30
+ * @param mediaHeader - The MediaHeader object.
31
+ * @param format - Format object (needed for init segments.)
32
+ * @returns A string key for caching segments.
33
+ */
34
+ export declare function createSegmentCacheKey(mediaHeader: MediaHeader, format?: SabrFormat): string;
35
+ /**
36
+ * Creates a cache key from request metadata.
37
+ * @returns A string key for caching segments.
38
+ */
39
+ export declare function createSegmentCacheKeyFromMetadata(requestMetadata: SabrRequestMetadata): string;
40
+ /**
41
+ * Generates a unique format ID based on the SabrFormat properties.
42
+ * @param format - The SabrFormat object.
43
+ * @returns A unique string identifier for the format.
44
+ */
45
+ export declare function getUniqueFormatId(format: SabrFormat): string;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Creates a format key based on itag and xtags.
3
+ * @returns A string format key.
4
+ */
5
+ export function createKey(itag, xtags) {
6
+ return `${itag || ''}:${xtags || ''}`;
7
+ }
8
+ /**
9
+ * Creates a format key from a SabrFormat object.
10
+ * @returns A string format key or undefined if format is undefined.
11
+ */
12
+ export function fromFormat(format) {
13
+ if (!format)
14
+ return undefined;
15
+ return createKey(format.itag, format.xtags);
16
+ }
17
+ /**
18
+ * Creates a format key from a MediaHeader object.
19
+ * @returns A string format key.
20
+ */
21
+ export function fromMediaHeader(mediaHeader) {
22
+ return createKey(mediaHeader.itag, mediaHeader.xtags);
23
+ }
24
+ /**
25
+ * Creates a format key from FormatInitializationMetadata.
26
+ * @returns A string format key or undefined if formatId is undefined.
27
+ */
28
+ export function fromFormatInitializationMetadata(formatInitMetadata) {
29
+ if (!formatInitMetadata.formatId)
30
+ return '';
31
+ return createKey(formatInitMetadata.formatId.itag, formatInitMetadata.formatId.xtags);
32
+ }
33
+ /**
34
+ * Creates a segment cache key.
35
+ * @param mediaHeader - The MediaHeader object.
36
+ * @param format - Format object (needed for init segments.)
37
+ * @returns A string key for caching segments.
38
+ */
39
+ export function createSegmentCacheKey(mediaHeader, format) {
40
+ if (mediaHeader.isInitSeg && format) {
41
+ return `${mediaHeader.itag}:${mediaHeader.xtags || ''}:${format.contentLength || ''}:${format.mimeType || ''}`;
42
+ }
43
+ return `${mediaHeader.startRange || '0'}-${mediaHeader.itag}-${mediaHeader.xtags || ''}`;
44
+ }
45
+ /**
46
+ * Creates a cache key from request metadata.
47
+ * @returns A string key for caching segments.
48
+ */
49
+ export function createSegmentCacheKeyFromMetadata(requestMetadata) {
50
+ if (!requestMetadata.byteRange || !requestMetadata.format)
51
+ throw new Error('Invalid metadata: byteRange or format is missing');
52
+ const pseudoMediaHeader = {
53
+ itag: requestMetadata.format.itag,
54
+ xtags: requestMetadata.format.xtags || '',
55
+ startRange: requestMetadata.byteRange.start,
56
+ isInitSeg: requestMetadata.isInit
57
+ };
58
+ return createSegmentCacheKey(pseudoMediaHeader, requestMetadata.isInit ? requestMetadata.format : undefined);
59
+ }
60
+ /**
61
+ * Generates a unique format ID based on the SabrFormat properties.
62
+ * @param format - The SabrFormat object.
63
+ * @returns A unique string identifier for the format.
64
+ */
65
+ export function getUniqueFormatId(format) {
66
+ if (format.width)
67
+ return format.itag.toString();
68
+ const uidParts = [format.itag.toString()];
69
+ if (format.audioTrackId) {
70
+ uidParts.push(format.audioTrackId);
71
+ }
72
+ if (format.isDrc) {
73
+ uidParts.push('drc');
74
+ }
75
+ return uidParts.join('-');
76
+ }
77
+ //# sourceMappingURL=formatKeyUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatKeyUtils.js","sourceRoot":"","sources":["../../../src/utils/formatKeyUtils.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAwB,EAAE,KAAyB;IAC3E,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAA0C;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAwB;IACtD,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC9C,kBAAgD;IAChD,IAAI,CAAC,kBAAkB,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAwB,EACxB,MAAmB;IAEnB,IAAI,WAAW,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;QACpC,OAAO,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,IAAI,EAAE,IAAI,MAAM,CAAC,aAAa,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;IACjH,CAAC;IACD,OAAO,GAAG,WAAW,CAAC,UAAU,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAC/C,eAAoC;IAEpC,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,MAAM;QACvD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAEtE,MAAM,iBAAiB,GAAG;QACxB,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;QACjC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACzC,UAAU,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK;QAC3C,SAAS,EAAE,eAAe,CAAC,MAAM;KAClC,CAAC;IAEF,OAAO,qBAAqB,CAC1B,iBAAiB,EACjB,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC5D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,IAAI,MAAM,CAAC,KAAK;QACd,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,CAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAE,CAAC;IAE5C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
@@ -1,4 +1,6 @@
1
- export * from './helpers.js';
1
+ export * from './Logger.js';
2
+ export * from './shared.js';
3
+ export * from './CacheManager.js';
2
4
  export * from './EventEmitterLike.js';
3
- export * as Protos from './Protos.js';
4
- export type * from './types.js';
5
+ export * from './RequestMetadataManager.js';
6
+ export * as FormatKeyUtils from './formatKeyUtils.js';
@@ -1,3 +1,7 @@
1
- export * from './helpers.js';
1
+ export * from './Logger.js';
2
+ export * from './shared.js';
3
+ export * from './CacheManager.js';
2
4
  export * from './EventEmitterLike.js';
3
- export * as Protos from './Protos.js';
5
+ export * from './RequestMetadataManager.js';
6
+ export * as FormatKeyUtils from './formatKeyUtils.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { InitializedFormat } from '../core/SabrStream.js';
2
+ import type { SabrFormat } from '../types/shared.js';
3
+ /**
4
+ * Determines the media type (video or audio) based on the format initialization metadata.
5
+ * @param initializedFormat
6
+ */
7
+ export declare function getMediaType(initializedFormat: InitializedFormat): 'video' | 'audio';
8
+ /**
9
+ * Calculates the total duration of downloaded segments in milliseconds.
10
+ * @param initializedFormat
11
+ */
12
+ export declare function getTotalDownloadedDuration(initializedFormat: InitializedFormat): number;
13
+ /**
14
+ * Filters formats by media type (audio or video)
15
+ */
16
+ export declare function filterFormatsByType(formats: SabrFormat[], isAudio: boolean): SabrFormat[];
17
+ /**
18
+ * Choose the best format based on options
19
+ */
20
+ export declare function chooseFormat(formats: SabrFormat[], formatOption: number | SabrFormat | ((formats: SabrFormat[]) => SabrFormat | undefined) | undefined, preferences: {
21
+ quality?: string;
22
+ language?: string;
23
+ preferWebM?: boolean;
24
+ preferMP4?: boolean;
25
+ preferH264?: boolean;
26
+ preferOpus?: boolean;
27
+ isAudio: boolean;
28
+ }): SabrFormat | undefined;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Determines the media type (video or audio) based on the format initialization metadata.
3
+ * @param initializedFormat
4
+ */
5
+ export function getMediaType(initializedFormat) {
6
+ return initializedFormat.formatInitializationMetadata?.mimeType?.includes('video') ? 'video' : 'audio';
7
+ }
8
+ /**
9
+ * Calculates the total duration of downloaded segments in milliseconds.
10
+ * @param initializedFormat
11
+ */
12
+ export function getTotalDownloadedDuration(initializedFormat) {
13
+ return Array.from(initializedFormat.downloadedSegments.values())
14
+ .reduce((sum, segment) => sum + (segment.durationMs || 0), 0);
15
+ }
16
+ /**
17
+ * Filters formats by media type (audio or video)
18
+ */
19
+ export function filterFormatsByType(formats, isAudio) {
20
+ return formats.filter((format) => {
21
+ if (!format.mimeType)
22
+ return false;
23
+ return isAudio
24
+ ? format.mimeType.includes('audio')
25
+ : format.mimeType.includes('video');
26
+ });
27
+ }
28
+ /**
29
+ * Choose the best format based on options
30
+ */
31
+ export function chooseFormat(formats, formatOption, preferences) {
32
+ if (!formats.length)
33
+ return undefined;
34
+ const typeFormats = filterFormatsByType(formats, preferences.isAudio);
35
+ if (!typeFormats.length)
36
+ return undefined;
37
+ if (typeof formatOption === 'number') {
38
+ return typeFormats.find((format) => format.itag === formatOption);
39
+ }
40
+ if (formatOption && typeof formatOption !== 'function') {
41
+ return formatOption;
42
+ }
43
+ if (typeof formatOption === 'function') {
44
+ return formatOption(typeFormats);
45
+ }
46
+ let filteredFormats = typeFormats;
47
+ if (preferences.language) {
48
+ filteredFormats = filteredFormats.filter((format) => format.language === preferences.language);
49
+ }
50
+ if (preferences.quality) {
51
+ filteredFormats = filteredFormats.filter((format) => preferences.isAudio
52
+ ? !!format.audioQuality?.toLowerCase().includes(preferences.quality?.toLowerCase() || '')
53
+ : !!format.qualityLabel?.toLowerCase().includes(preferences.quality?.toLowerCase() || ''));
54
+ }
55
+ if (preferences.isAudio) {
56
+ if (preferences.preferOpus) {
57
+ filteredFormats = applyMimeTypeFilter(filteredFormats, 'opus');
58
+ }
59
+ }
60
+ else if (preferences.preferH264) {
61
+ filteredFormats = filteredFormats.filter((format) => !!format.mimeType && format.mimeType.includes('mp4') && format.mimeType.includes('avc'));
62
+ }
63
+ if (preferences.preferWebM) {
64
+ filteredFormats = applyMimeTypeFilter(filteredFormats, 'webm');
65
+ }
66
+ else if (preferences.preferMP4) {
67
+ filteredFormats = applyMimeTypeFilter(filteredFormats, 'mp4');
68
+ }
69
+ return preferences.isAudio
70
+ ? filteredFormats.sort((a, b) => (b.bitrate || 0) - (a.bitrate || 0))[0]
71
+ : filteredFormats.sort((a, b) => (b.height || 0) - (a.height || 0))[0];
72
+ }
73
+ function applyMimeTypeFilter(formats, mimeTypePart) {
74
+ return formats.filter((format) => format.mimeType?.includes(mimeTypePart));
75
+ }
76
+ //# sourceMappingURL=sabrStreamUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabrStreamUtils.js","sourceRoot":"","sources":["../../../src/utils/sabrStreamUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { FormatStream, SabrFormat } from '../types/shared.js';
2
+ export declare const MAX_INT32_VALUE = 2147483647;
3
+ export declare enum EnabledTrackTypes {
4
+ VIDEO_AND_AUDIO = 0,
5
+ AUDIO_ONLY = 1,
6
+ VIDEO_ONLY = 2
7
+ }
8
+ export declare function isGoogleVideoURL(url: string): boolean;
9
+ interface Range {
10
+ start: number;
11
+ end: number;
12
+ }
13
+ /**
14
+ * Parses the Range header value to extract the start and end byte positions.
15
+ * @param rangeHeaderValue
16
+ */
17
+ export declare function parseRangeHeader(rangeHeaderValue: string | undefined): Range | undefined;
18
+ /**
19
+ * Converts a Uint8Array to a Base64 string.
20
+ * @param u8
21
+ */
22
+ export declare function u8ToBase64(u8: Uint8Array): string;
23
+ /**
24
+ * Converts a Base64 string to a Uint8Array.
25
+ * @param base64
26
+ */
27
+ export declare function base64ToU8(base64: string): Uint8Array;
28
+ /**
29
+ * Concatenates multiple Uint8Array chunks into a single Uint8Array.
30
+ * @param chunks
31
+ */
32
+ export declare function concatenateChunks(chunks: Uint8Array[]): Uint8Array;
33
+ /**
34
+ * Converts a FormatStream object to a SabrFormat object.
35
+ * @param formatStream
36
+ */
37
+ export declare function buildSabrFormat(formatStream: FormatStream): SabrFormat;
38
+ /**
39
+ * Returns a promise that resolves after a specified number of milliseconds.
40
+ * @param ms - The number of milliseconds to wait.
41
+ */
42
+ export declare function wait(ms: number): Promise<void>;
43
+ export {};
@@ -0,0 +1,108 @@
1
+ export const MAX_INT32_VALUE = 2147483647;
2
+ export const EnabledTrackTypes = {
3
+ VIDEO_AND_AUDIO: 0, 0: "VIDEO_AND_AUDIO",
4
+ AUDIO_ONLY: 1, 1: "AUDIO_ONLY",
5
+ VIDEO_ONLY: 2, 2: "VIDEO_ONLY"
6
+ };
7
+ export function isGoogleVideoURL(url) {
8
+ if (url.startsWith('sabr://')) {
9
+ return true;
10
+ }
11
+ const urlParts = url.split('?');
12
+ const urlPart = urlParts[0];
13
+ const queryPart = urlParts[1] || '';
14
+ if (urlPart.endsWith('/videoplayback')) {
15
+ const params = new URLSearchParams(queryPart);
16
+ if (params.get('source') === 'youtube' || params.has('sabr') || params.has('lsig') || params.has('expire')) {
17
+ return true;
18
+ }
19
+ }
20
+ else if (urlPart.includes('/videoplayback/')) { // For live content, post-live, etc.
21
+ const pathParts = urlPart.split('/');
22
+ return ['videoplayback', 'sabr', 'lsig', 'expire'].some((part) => pathParts.includes(part));
23
+ }
24
+ return false;
25
+ }
26
+ /**
27
+ * Parses the Range header value to extract the start and end byte positions.
28
+ * @param rangeHeaderValue
29
+ */
30
+ export function parseRangeHeader(rangeHeaderValue) {
31
+ if (!rangeHeaderValue)
32
+ return undefined;
33
+ const parts = rangeHeaderValue.split('=')[1]?.split('-');
34
+ if (parts?.length) {
35
+ const start = Number(parts[0]);
36
+ const end = Number(parts[1]);
37
+ return { start, end };
38
+ }
39
+ return undefined;
40
+ }
41
+ /**
42
+ * Converts a Uint8Array to a Base64 string.
43
+ * @param u8
44
+ */
45
+ export function u8ToBase64(u8) {
46
+ return btoa(String.fromCharCode.apply(null, Array.from(u8)));
47
+ }
48
+ /**
49
+ * Converts a Base64 string to a Uint8Array.
50
+ * @param base64
51
+ */
52
+ export function base64ToU8(base64) {
53
+ const standard_base64 = base64.replace(/-/g, '+').replace(/_/g, '/');
54
+ const padded_base64 = standard_base64.padEnd(standard_base64.length + (4 - standard_base64.length % 4) % 4, '=');
55
+ return new Uint8Array(atob(padded_base64).split('').map((char) => char.charCodeAt(0)));
56
+ }
57
+ /**
58
+ * Concatenates multiple Uint8Array chunks into a single Uint8Array.
59
+ * @param chunks
60
+ */
61
+ export function concatenateChunks(chunks) {
62
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
63
+ const result = new Uint8Array(totalLength);
64
+ let offset = 0;
65
+ for (const chunk of chunks) {
66
+ result.set(chunk, offset);
67
+ offset += chunk.length;
68
+ }
69
+ return result;
70
+ }
71
+ /**
72
+ * Converts a FormatStream object to a SabrFormat object.
73
+ * @param formatStream
74
+ */
75
+ export function buildSabrFormat(formatStream) {
76
+ return {
77
+ itag: formatStream.itag,
78
+ lastModified: parseInt(formatStream.last_modified_ms || formatStream.lastModified || '0'),
79
+ xtags: formatStream.xtags,
80
+ width: formatStream.width,
81
+ height: formatStream.height,
82
+ mimeType: formatStream.mime_type || formatStream.mimeType,
83
+ audioQuality: formatStream.audio_quality || formatStream.audioQuality,
84
+ bitrate: formatStream.bitrate,
85
+ averageBitrate: formatStream.average_bitrate || formatStream.averageBitrate,
86
+ quality: formatStream.quality,
87
+ qualityLabel: formatStream.quality_label || formatStream.qualityLabel,
88
+ audioTrackId: formatStream.audio_track?.id || formatStream.audioTrackId,
89
+ approxDurationMs: formatStream.approx_duration_ms || parseInt(formatStream.approxDurationMs || '0'),
90
+ contentLength: parseInt(formatStream.contentLength || '0') || formatStream.content_length,
91
+ // YouTube.js-specific properties.
92
+ isDrc: formatStream.is_drc,
93
+ isAutoDubbed: formatStream.is_auto_dubbed,
94
+ isDescriptive: formatStream.is_descriptive,
95
+ isDubbed: formatStream.is_dubbed,
96
+ language: formatStream.language,
97
+ isOriginal: formatStream.is_original,
98
+ isSecondary: formatStream.is_secondary
99
+ };
100
+ }
101
+ /**
102
+ * Returns a promise that resolves after a specified number of milliseconds.
103
+ * @param ms - The number of milliseconds to wait.
104
+ */
105
+ export function wait(ms) {
106
+ return new Promise((resolve) => setTimeout(resolve, ms));
107
+ }
108
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/utils/shared.ts"],"names":[],"mappings":"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"}