googlevideo 3.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 (175) hide show
  1. package/README.md +93 -45
  2. package/dist/protos/generated/misc/common.d.ts +180 -6
  3. package/dist/protos/generated/misc/common.js +282 -19
  4. package/dist/protos/generated/misc/common.js.map +1 -0
  5. package/dist/protos/generated/video_streaming/buffered_range.d.ts +10 -10
  6. package/dist/protos/generated/video_streaming/buffered_range.js +20 -19
  7. package/dist/protos/generated/video_streaming/buffered_range.js.map +1 -0
  8. package/dist/protos/generated/video_streaming/client_abr_state.d.ts +22 -11
  9. package/dist/protos/generated/video_streaming/client_abr_state.js +133 -50
  10. package/dist/protos/generated/video_streaming/client_abr_state.js.map +1 -0
  11. package/dist/protos/generated/video_streaming/crypto_params.d.ts +2 -7
  12. package/dist/protos/generated/video_streaming/crypto_params.js +1 -7
  13. package/dist/protos/generated/video_streaming/crypto_params.js.map +1 -0
  14. package/dist/protos/generated/video_streaming/format_initialization_metadata.d.ts +6 -6
  15. package/dist/protos/generated/video_streaming/format_initialization_metadata.js +32 -21
  16. package/dist/protos/generated/video_streaming/format_initialization_metadata.js.map +1 -0
  17. package/dist/protos/generated/video_streaming/format_selection_config.d.ts +12 -0
  18. package/dist/protos/generated/video_streaming/format_selection_config.js +68 -0
  19. package/dist/protos/generated/video_streaming/format_selection_config.js.map +1 -0
  20. package/dist/protos/generated/video_streaming/{encrypted_player_request.d.ts → innertube_request.d.ts} +11 -6
  21. package/dist/protos/generated/video_streaming/{encrypted_player_request.js → innertube_request.js} +64 -20
  22. package/dist/protos/generated/video_streaming/innertube_request.js.map +1 -0
  23. package/dist/protos/generated/video_streaming/live_metadata.d.ts +8 -5
  24. package/dist/protos/generated/video_streaming/live_metadata.js +57 -26
  25. package/dist/protos/generated/video_streaming/live_metadata.js.map +1 -0
  26. package/dist/protos/generated/video_streaming/media_capabilities.js +1 -0
  27. package/dist/protos/generated/video_streaming/media_capabilities.js.map +1 -0
  28. package/dist/protos/generated/video_streaming/media_header.d.ts +5 -10
  29. package/dist/protos/generated/video_streaming/media_header.js +27 -23
  30. package/dist/protos/generated/video_streaming/media_header.js.map +1 -0
  31. package/dist/protos/generated/video_streaming/next_request_policy.d.ts +3 -0
  32. package/dist/protos/generated/video_streaming/next_request_policy.js +31 -0
  33. package/dist/protos/generated/video_streaming/next_request_policy.js.map +1 -0
  34. package/dist/protos/generated/video_streaming/onesie_header.d.ts +7 -7
  35. package/dist/protos/generated/video_streaming/onesie_header.js +15 -14
  36. package/dist/protos/generated/video_streaming/onesie_header.js.map +1 -0
  37. package/dist/protos/generated/video_streaming/onesie_header_type.d.ts +9 -23
  38. package/dist/protos/generated/video_streaming/onesie_header_type.js +16 -30
  39. package/dist/protos/generated/video_streaming/onesie_header_type.js.map +1 -0
  40. package/dist/protos/generated/video_streaming/{onesie_player_request.d.ts → onesie_innertube_request.d.ts} +2 -2
  41. package/dist/protos/generated/video_streaming/{onesie_player_request.js → onesie_innertube_request.js} +5 -4
  42. package/dist/protos/generated/video_streaming/onesie_innertube_request.js.map +1 -0
  43. package/dist/protos/generated/video_streaming/onesie_innertube_response.d.ts +15 -0
  44. package/dist/protos/generated/video_streaming/{onesie_player_response.js → onesie_innertube_response.js} +5 -22
  45. package/dist/protos/generated/video_streaming/onesie_innertube_response.js.map +1 -0
  46. package/dist/protos/generated/video_streaming/onesie_proxy_status.d.ts +18 -0
  47. package/dist/protos/generated/video_streaming/onesie_proxy_status.js +25 -0
  48. package/dist/protos/generated/video_streaming/onesie_proxy_status.js.map +1 -0
  49. package/dist/protos/generated/video_streaming/onesie_request.d.ts +6 -3
  50. package/dist/protos/generated/video_streaming/onesie_request.js +17 -5
  51. package/dist/protos/generated/video_streaming/onesie_request.js.map +1 -0
  52. package/dist/protos/generated/video_streaming/playback_cookie.d.ts +2 -2
  53. package/dist/protos/generated/video_streaming/playback_cookie.js +5 -4
  54. package/dist/protos/generated/video_streaming/playback_cookie.js.map +1 -0
  55. package/dist/protos/generated/video_streaming/playback_start_policy.js +1 -0
  56. package/dist/protos/generated/video_streaming/playback_start_policy.js.map +1 -0
  57. package/dist/protos/generated/video_streaming/reload_player_response.d.ts +14 -0
  58. package/dist/protos/generated/video_streaming/reload_player_response.js +73 -0
  59. package/dist/protos/generated/video_streaming/reload_player_response.js.map +1 -0
  60. package/dist/protos/generated/video_streaming/request_cancellation_policy.js +1 -0
  61. package/dist/protos/generated/video_streaming/request_cancellation_policy.js.map +1 -0
  62. package/dist/protos/generated/video_streaming/request_identifier.d.ts +10 -0
  63. package/dist/protos/generated/video_streaming/request_identifier.js +41 -0
  64. package/dist/protos/generated/video_streaming/request_identifier.js.map +1 -0
  65. package/dist/protos/generated/video_streaming/sabr_context_sending_policy.d.ts +12 -0
  66. package/dist/protos/generated/video_streaming/sabr_context_sending_policy.js +86 -0
  67. package/dist/protos/generated/video_streaming/sabr_context_sending_policy.js.map +1 -0
  68. package/dist/protos/generated/video_streaming/sabr_context_update.d.ts +48 -0
  69. package/dist/protos/generated/video_streaming/sabr_context_update.js +242 -0
  70. package/dist/protos/generated/video_streaming/sabr_context_update.js.map +1 -0
  71. package/dist/protos/generated/video_streaming/sabr_error.js +1 -0
  72. package/dist/protos/generated/video_streaming/sabr_error.js.map +1 -0
  73. package/dist/protos/generated/video_streaming/sabr_redirect.js +1 -0
  74. package/dist/protos/generated/video_streaming/sabr_redirect.js.map +1 -0
  75. package/dist/protos/generated/video_streaming/snackbar_message.d.ts +10 -0
  76. package/dist/protos/generated/video_streaming/snackbar_message.js +41 -0
  77. package/dist/protos/generated/video_streaming/snackbar_message.js.map +1 -0
  78. package/dist/protos/generated/video_streaming/stream_protection_status.d.ts +1 -1
  79. package/dist/protos/generated/video_streaming/stream_protection_status.js +5 -4
  80. package/dist/protos/generated/video_streaming/stream_protection_status.js.map +1 -0
  81. package/dist/protos/generated/video_streaming/streamer_context.d.ts +11 -11
  82. package/dist/protos/generated/video_streaming/streamer_context.js +32 -32
  83. package/dist/protos/generated/video_streaming/streamer_context.js.map +1 -0
  84. package/dist/protos/generated/video_streaming/time_range.d.ts +2 -2
  85. package/dist/protos/generated/video_streaming/time_range.js +8 -7
  86. package/dist/protos/generated/video_streaming/time_range.js.map +1 -0
  87. package/dist/protos/generated/video_streaming/ump_part_id.d.ts +58 -0
  88. package/dist/protos/generated/video_streaming/ump_part_id.js +89 -0
  89. package/dist/protos/generated/video_streaming/ump_part_id.js.map +1 -0
  90. package/dist/protos/generated/video_streaming/video_playback_abr_request.d.ts +20 -21
  91. package/dist/protos/generated/video_streaming/video_playback_abr_request.js +48 -86
  92. package/dist/protos/generated/video_streaming/video_playback_abr_request.js.map +1 -0
  93. package/dist/src/core/{ChunkedDataBuffer.d.ts → CompositeBuffer.d.ts} +8 -8
  94. package/dist/src/core/{ChunkedDataBuffer.js → CompositeBuffer.js} +32 -27
  95. package/dist/src/core/CompositeBuffer.js.map +1 -0
  96. package/dist/src/core/SabrStream.d.ts +356 -0
  97. package/dist/src/core/SabrStream.js +958 -0
  98. package/dist/src/core/SabrStream.js.map +1 -0
  99. package/dist/src/core/SabrStreamingAdapter.d.ts +158 -0
  100. package/dist/src/core/SabrStreamingAdapter.js +496 -0
  101. package/dist/src/core/SabrStreamingAdapter.js.map +1 -0
  102. package/dist/src/core/SabrUmpProcessor.d.ts +53 -0
  103. package/dist/src/core/SabrUmpProcessor.js +234 -0
  104. package/dist/src/core/SabrUmpProcessor.js.map +1 -0
  105. package/dist/src/core/{UMP.d.ts → UmpReader.d.ts} +6 -10
  106. package/dist/src/core/{UMP.js → UmpReader.js} +33 -36
  107. package/dist/src/core/UmpReader.js.map +1 -0
  108. package/dist/src/core/UmpWriter.d.ts +16 -0
  109. package/dist/src/core/UmpWriter.js +56 -0
  110. package/dist/src/core/UmpWriter.js.map +1 -0
  111. package/dist/src/exports/protos.d.ts +1 -0
  112. package/dist/src/exports/protos.js +2 -0
  113. package/dist/src/exports/protos.js.map +1 -0
  114. package/dist/src/exports/sabr-stream.d.ts +2 -0
  115. package/dist/src/exports/sabr-stream.js +2 -0
  116. package/dist/src/exports/sabr-stream.js.map +1 -0
  117. package/dist/src/exports/sabr-streaming-adapter.d.ts +3 -0
  118. package/dist/src/exports/sabr-streaming-adapter.js +3 -0
  119. package/dist/src/exports/sabr-streaming-adapter.js.map +1 -0
  120. package/dist/src/exports/ump.d.ts +3 -0
  121. package/dist/src/exports/ump.js +4 -0
  122. package/dist/src/exports/ump.js.map +1 -0
  123. package/dist/src/exports/utils.d.ts +1 -0
  124. package/dist/src/exports/utils.js +2 -0
  125. package/dist/src/exports/utils.js.map +1 -0
  126. package/dist/src/types/sabrStreamTypes.d.ts +102 -0
  127. package/dist/src/types/sabrStreamTypes.js +2 -0
  128. package/dist/src/types/sabrStreamTypes.js.map +1 -0
  129. package/dist/src/types/sabrStreamingAdapterTypes.d.ts +93 -0
  130. package/dist/src/types/sabrStreamingAdapterTypes.js +2 -0
  131. package/dist/src/types/sabrStreamingAdapterTypes.js.map +1 -0
  132. package/dist/src/types/shared.d.ts +64 -0
  133. package/dist/src/types/shared.js +2 -0
  134. package/dist/src/types/shared.js.map +1 -0
  135. package/dist/src/utils/CacheManager.d.ts +32 -0
  136. package/dist/src/utils/CacheManager.js +131 -0
  137. package/dist/src/utils/CacheManager.js.map +1 -0
  138. package/dist/src/utils/EventEmitterLike.d.ts +5 -0
  139. package/dist/src/utils/EventEmitterLike.js +51 -10
  140. package/dist/src/utils/EventEmitterLike.js.map +1 -0
  141. package/dist/src/utils/Logger.d.ts +30 -0
  142. package/dist/src/utils/Logger.js +80 -0
  143. package/dist/src/utils/Logger.js.map +1 -0
  144. package/dist/src/utils/Protos.d.ts +20 -13
  145. package/dist/src/utils/Protos.js +21 -13
  146. package/dist/src/utils/Protos.js.map +1 -0
  147. package/dist/src/utils/RequestMetadataManager.d.ts +15 -0
  148. package/dist/src/utils/RequestMetadataManager.js +48 -0
  149. package/dist/src/utils/RequestMetadataManager.js.map +1 -0
  150. package/dist/src/utils/formatKeyUtils.d.ts +45 -0
  151. package/dist/src/utils/formatKeyUtils.js +77 -0
  152. package/dist/src/utils/formatKeyUtils.js.map +1 -0
  153. package/dist/src/utils/index.d.ts +5 -3
  154. package/dist/src/utils/index.js +6 -2
  155. package/dist/src/utils/index.js.map +1 -0
  156. package/dist/src/utils/sabrStreamUtils.d.ts +28 -0
  157. package/dist/src/utils/sabrStreamUtils.js +76 -0
  158. package/dist/src/utils/sabrStreamUtils.js.map +1 -0
  159. package/dist/src/utils/shared.d.ts +43 -0
  160. package/dist/src/utils/shared.js +108 -0
  161. package/dist/src/utils/shared.js.map +1 -0
  162. package/package.json +40 -12
  163. package/dist/protos/generated/video_streaming/onesie_player_response.d.ts +0 -31
  164. package/dist/protos/generated/video_streaming/proxy_status.d.ts +0 -14
  165. package/dist/protos/generated/video_streaming/proxy_status.js +0 -21
  166. package/dist/src/core/ServerAbrStream.d.ts +0 -39
  167. package/dist/src/core/ServerAbrStream.js +0 -259
  168. package/dist/src/core/index.d.ts +0 -3
  169. package/dist/src/core/index.js +0 -3
  170. package/dist/src/index.d.ts +0 -4
  171. package/dist/src/index.js +0 -4
  172. package/dist/src/utils/helpers.d.ts +0 -63
  173. package/dist/src/utils/helpers.js +0 -101
  174. package/dist/src/utils/types.d.ts +0 -65
  175. package/dist/src/utils/types.js +0 -1
@@ -0,0 +1,80 @@
1
+ export const LogLevel = {
2
+ NONE: 0, 0: "NONE",
3
+ ERROR: 1, 1: "ERROR",
4
+ WARN: 2, 2: "WARN",
5
+ INFO: 3, 3: "INFO",
6
+ DEBUG: 4, 4: "DEBUG",
7
+ ALL: 99, 99: "ALL"
8
+ };
9
+ export class Logger {
10
+ constructor() {
11
+ this.currentLogLevels = new Set([LogLevel.INFO, LogLevel.ERROR]);
12
+ }
13
+ static getInstance() {
14
+ if (!Logger.instance) {
15
+ Logger.instance = new Logger();
16
+ }
17
+ return Logger.instance;
18
+ }
19
+ /**
20
+ * Sets the active log levels.
21
+ * Call with LogLevel.NONE or no arguments to turn off all logging.
22
+ * Otherwise, specify one or more log levels to be active.
23
+ * Use LogLevel.ALL to enable all log levels.
24
+ */
25
+ setLogLevels(...levels) {
26
+ if (levels.length === 0 || levels.includes(LogLevel.NONE)) {
27
+ this.currentLogLevels = new Set(); // Turn off logging
28
+ }
29
+ else if (levels.includes(LogLevel.ALL)) {
30
+ this.currentLogLevels = new Set([
31
+ LogLevel.ERROR,
32
+ LogLevel.WARN,
33
+ LogLevel.INFO,
34
+ LogLevel.DEBUG
35
+ ]);
36
+ }
37
+ else {
38
+ this.currentLogLevels = new Set(levels.filter((level) => level !== LogLevel.NONE && level !== LogLevel.ALL));
39
+ }
40
+ }
41
+ /**
42
+ * Gets the current set of active log levels.
43
+ * @returns A new Set containing the active LogLevel enums.
44
+ */
45
+ getLogLevels() {
46
+ return new Set(this.currentLogLevels);
47
+ }
48
+ log(level, tag, ...messages) {
49
+ if (level !== LogLevel.NONE && this.currentLogLevels.has(level)) {
50
+ const prefix = `[${LogLevel[level]}] [${tag}]`;
51
+ switch (level) {
52
+ case LogLevel.ERROR:
53
+ console.error(prefix, ...messages);
54
+ break;
55
+ case LogLevel.WARN:
56
+ console.warn(prefix, ...messages);
57
+ break;
58
+ case LogLevel.INFO:
59
+ console.info(prefix, ...messages);
60
+ break;
61
+ case LogLevel.DEBUG:
62
+ console.debug(prefix, ...messages);
63
+ break;
64
+ }
65
+ }
66
+ }
67
+ error(tag, ...messages) {
68
+ this.log(LogLevel.ERROR, tag, ...messages);
69
+ }
70
+ warn(tag, ...messages) {
71
+ this.log(LogLevel.WARN, tag, ...messages);
72
+ }
73
+ info(tag, ...messages) {
74
+ this.log(LogLevel.INFO, tag, ...messages);
75
+ }
76
+ debug(tag, ...messages) {
77
+ this.log(LogLevel.DEBUG, tag, ...messages);
78
+ }
79
+ }
80
+ //# sourceMappingURL=Logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../src/utils/Logger.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,31 @@
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, OnesieProxyStatus } 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';
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';
23
26
  export { LiveMetadata } from '../../protos/generated/video_streaming/live_metadata.js';
24
- export { FormatId, KeyValuePair, InitRange, IndexRange, HttpHeader } from '../../protos/generated/misc/common.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';
@@ -1,24 +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, OnesieProxyStatus } 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';
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';
23
26
  export { LiveMetadata } from '../../protos/generated/video_streaming/live_metadata.js';
24
- export { FormatId, KeyValuePair, InitRange, IndexRange, HttpHeader } from '../../protos/generated/misc/common.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 {};