googlevideo 3.0.0 → 4.0.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 (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} +11 -8
  94. package/dist/src/core/{ChunkedDataBuffer.js → CompositeBuffer.js} +35 -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} +9 -10
  106. package/dist/src/core/{UMP.js → UmpReader.js} +36 -36
  107. package/dist/src/core/UmpReader.js.map +1 -0
  108. package/dist/src/core/UmpWriter.d.ts +19 -0
  109. package/dist/src/core/UmpWriter.js +59 -0
  110. package/dist/src/core/UmpWriter.js.map +1 -0
  111. package/dist/src/exports/protos.d.ts +5 -0
  112. package/dist/src/exports/protos.js +6 -0
  113. package/dist/src/exports/protos.js.map +1 -0
  114. package/dist/src/exports/sabr-stream.d.ts +6 -0
  115. package/dist/src/exports/sabr-stream.js +6 -0
  116. package/dist/src/exports/sabr-stream.js.map +1 -0
  117. package/dist/src/exports/sabr-streaming-adapter.d.ts +8 -0
  118. package/dist/src/exports/sabr-streaming-adapter.js +8 -0
  119. package/dist/src/exports/sabr-streaming-adapter.js.map +1 -0
  120. package/dist/src/exports/ump.d.ts +7 -0
  121. package/dist/src/exports/ump.js +8 -0
  122. package/dist/src/exports/ump.js.map +1 -0
  123. package/dist/src/exports/utils.d.ts +5 -0
  124. package/dist/src/exports/utils.js +6 -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 +43 -0
  142. package/dist/src/utils/Logger.js +93 -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 +55 -0
  160. package/dist/src/utils/shared.js +120 -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,234 @@
1
+ import { concatenateChunks } from '../utils/index.js';
2
+ import { createSegmentCacheKey, fromFormat, fromMediaHeader } from '../utils/formatKeyUtils.js';
3
+ import { CompositeBuffer } from './CompositeBuffer.js';
4
+ import { UmpReader } from './UmpReader.js';
5
+ import { FormatInitializationMetadata, MediaHeader, NextRequestPolicy, ReloadPlaybackContext, SabrContextSendingPolicy, SabrContextUpdate, SabrError, SabrRedirect, SnackbarMessage, StreamProtectionStatus, UMPPartId } from '../utils/Protos.js';
6
+ /**
7
+ * This class is responsible for reading a UMP stream, handling different part types
8
+ * (like media headers, media data, and server directives), and populating a
9
+ * metadata object with the extracted information. It is supposed to be used
10
+ * in conjunction with a {@linkcode SabrPlayerAdapter} in video player
11
+ * implementations.
12
+ */
13
+ export class SabrUmpProcessor {
14
+ constructor(requestMetadata, cacheManager) {
15
+ this.requestMetadata = requestMetadata;
16
+ this.cacheManager = cacheManager;
17
+ this.formatInitMetadata = [];
18
+ this.partialSegments = new Map();
19
+ this.umpPartHandlers = new Map([
20
+ [UMPPartId.FORMAT_INITIALIZATION_METADATA, this.handleFormatInitMetadata.bind(this)],
21
+ [UMPPartId.NEXT_REQUEST_POLICY, this.handleNextRequestPolicy.bind(this)],
22
+ [UMPPartId.SABR_ERROR, this.handleSabrError.bind(this)],
23
+ [UMPPartId.SABR_REDIRECT, this.handleSabrRedirect.bind(this)],
24
+ [UMPPartId.SABR_CONTEXT_UPDATE, this.handleSabrContextUpdate.bind(this)],
25
+ [UMPPartId.SABR_CONTEXT_SENDING_POLICY, this.handleSabrContextSendingPolicy.bind(this)],
26
+ [UMPPartId.SNACKBAR_MESSAGE, this.handleSnackbarMessage.bind(this)],
27
+ [UMPPartId.STREAM_PROTECTION_STATUS, this.handleStreamProtectionStatus.bind(this)],
28
+ [UMPPartId.RELOAD_PLAYER_RESPONSE, this.handleReloadPlayerResponse.bind(this)],
29
+ [UMPPartId.MEDIA_HEADER, this.handleMediaHeader.bind(this)],
30
+ [UMPPartId.MEDIA, this.handleMedia.bind(this)],
31
+ [UMPPartId.MEDIA_END, this.handleMediaEnd.bind(this)]
32
+ ]);
33
+ }
34
+ /**
35
+ * Processes a chunk of data from a UMP stream and updates the request context.
36
+ * @returns A promise that resolves with a processing result if a terminal part is found (e.g., MediaEnd), or undefined otherwise.
37
+ * @param value
38
+ */
39
+ processChunk(value) {
40
+ return new Promise((resolve) => {
41
+ let chunk;
42
+ if (this.partialPart) {
43
+ chunk = this.partialPart.data;
44
+ chunk.append(value);
45
+ }
46
+ else {
47
+ chunk = new CompositeBuffer([value]);
48
+ }
49
+ const ump = new UmpReader(chunk);
50
+ this.partialPart = ump.read((part) => {
51
+ const handler = this.umpPartHandlers.get(part.type);
52
+ const result = handler?.(part);
53
+ if (result) {
54
+ this.partialPart = undefined;
55
+ this.desiredHeaderId = undefined;
56
+ this.partialSegments.clear();
57
+ resolve(result);
58
+ }
59
+ });
60
+ resolve(undefined);
61
+ });
62
+ }
63
+ getSegmentInfo() {
64
+ return this.partialSegments.get(this.desiredHeaderId || 0);
65
+ }
66
+ decodePart(part, decoder) {
67
+ if (!part.data.chunks.length)
68
+ return undefined;
69
+ try {
70
+ return decoder.decode(concatenateChunks(part.data.chunks));
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ }
76
+ handleFormatInitMetadata(part) {
77
+ const formatInitMetadata = this.decodePart(part, FormatInitializationMetadata);
78
+ if (formatInitMetadata) {
79
+ this.formatInitMetadata.push(formatInitMetadata);
80
+ }
81
+ return undefined;
82
+ }
83
+ handleNextRequestPolicy(part) {
84
+ const nextRequestPolicy = this.decodePart(part, NextRequestPolicy);
85
+ if (nextRequestPolicy) {
86
+ this.requestMetadata.streamInfo = {
87
+ ...this.requestMetadata.streamInfo,
88
+ nextRequestPolicy
89
+ };
90
+ }
91
+ return undefined;
92
+ }
93
+ handleMediaHeader(part) {
94
+ const mediaHeader = this.decodePart(part, MediaHeader);
95
+ if (!mediaHeader) {
96
+ return undefined;
97
+ }
98
+ const targetFormatKey = fromFormat(this.requestMetadata.format);
99
+ const segmentFormatKey = fromMediaHeader(mediaHeader);
100
+ if (!this.requestMetadata.isSABR || segmentFormatKey === targetFormatKey) {
101
+ const segmentObj = {
102
+ headerId: mediaHeader.headerId,
103
+ mediaHeader: mediaHeader,
104
+ bufferedChunks: [],
105
+ lastChunkSize: 0
106
+ };
107
+ if (this.desiredHeaderId === undefined) {
108
+ this.desiredHeaderId = mediaHeader.headerId;
109
+ }
110
+ this.partialSegments.set(mediaHeader.headerId, segmentObj);
111
+ }
112
+ return undefined;
113
+ }
114
+ handleMedia(part) {
115
+ const headerId = part.data.getUint8(0);
116
+ const buffer = part.data.split(1).remainingBuffer;
117
+ const segment = this.partialSegments.get(headerId);
118
+ if (segment) {
119
+ segment.lastChunkSize = buffer.getLength();
120
+ for (const chunk of buffer.chunks) {
121
+ segment.bufferedChunks.push(chunk);
122
+ }
123
+ }
124
+ return undefined;
125
+ }
126
+ handleMediaEnd(part) {
127
+ const headerId = part.data.getUint8(0);
128
+ const segment = this.partialSegments.get(headerId);
129
+ if (segment && segment.headerId === this.desiredHeaderId) {
130
+ const segmentData = concatenateChunks(segment.bufferedChunks);
131
+ this.requestMetadata.streamInfo = {
132
+ ...this.requestMetadata.streamInfo,
133
+ formatInitMetadata: this.formatInitMetadata,
134
+ mediaHeader: segment.mediaHeader
135
+ };
136
+ /**
137
+ * Cache initialization segments to optimize performance. SABR responses contain larger payloads,
138
+ * and caching the init segment reduces latency when switching between different quality levels
139
+ * or initializing new streams.
140
+ */
141
+ if (this.cacheManager && this.requestMetadata.isInit && this.requestMetadata.byteRange && this.requestMetadata.format) {
142
+ this.cacheManager.setInitSegment(createSegmentCacheKey(segment.mediaHeader, this.requestMetadata.format), segmentData);
143
+ return {
144
+ data: segmentData.slice(this.requestMetadata.byteRange.start, this.requestMetadata.byteRange.end + 1),
145
+ done: true
146
+ };
147
+ }
148
+ return {
149
+ data: segmentData,
150
+ done: true
151
+ };
152
+ }
153
+ }
154
+ handleSnackbarMessage(part) {
155
+ const snackbarMessage = this.decodePart(part, SnackbarMessage);
156
+ if (snackbarMessage) {
157
+ this.requestMetadata.streamInfo = {
158
+ ...this.requestMetadata.streamInfo,
159
+ snackbarMessage
160
+ };
161
+ }
162
+ return undefined;
163
+ }
164
+ handleSabrError(part) {
165
+ const sabrError = this.decodePart(part, SabrError);
166
+ this.requestMetadata.error = { sabrError };
167
+ return { done: true };
168
+ }
169
+ handleStreamProtectionStatus(part) {
170
+ const streamProtectionStatus = this.decodePart(part, StreamProtectionStatus);
171
+ if (!streamProtectionStatus) {
172
+ return undefined;
173
+ }
174
+ this.requestMetadata.streamInfo = {
175
+ ...this.requestMetadata.streamInfo,
176
+ streamProtectionStatus
177
+ };
178
+ if (streamProtectionStatus.status === 3) {
179
+ return {
180
+ done: true
181
+ };
182
+ }
183
+ return undefined;
184
+ }
185
+ handleReloadPlayerResponse(part) {
186
+ const reloadPlaybackContext = this.decodePart(part, ReloadPlaybackContext);
187
+ if (!reloadPlaybackContext) {
188
+ return undefined;
189
+ }
190
+ this.requestMetadata.streamInfo = {
191
+ ...this.requestMetadata.streamInfo,
192
+ reloadPlaybackContext
193
+ };
194
+ return {
195
+ done: true
196
+ };
197
+ }
198
+ handleSabrRedirect(part) {
199
+ const redirect = this.decodePart(part, SabrRedirect);
200
+ if (!redirect) {
201
+ return undefined;
202
+ }
203
+ this.requestMetadata.streamInfo = {
204
+ ...this.requestMetadata.streamInfo,
205
+ redirect
206
+ };
207
+ // With just UMP, redirects should be followed immediately.
208
+ if (this.requestMetadata.isUMP && !this.requestMetadata.isSABR) {
209
+ return { done: true };
210
+ }
211
+ return undefined;
212
+ }
213
+ handleSabrContextUpdate(part) {
214
+ const sabrContextUpdate = this.decodePart(part, SabrContextUpdate);
215
+ if (sabrContextUpdate) {
216
+ this.requestMetadata.streamInfo = {
217
+ ...this.requestMetadata.streamInfo,
218
+ sabrContextUpdate
219
+ };
220
+ }
221
+ return undefined;
222
+ }
223
+ handleSabrContextSendingPolicy(part) {
224
+ const sabrContextSendingPolicy = this.decodePart(part, SabrContextSendingPolicy);
225
+ if (sabrContextSendingPolicy) {
226
+ this.requestMetadata.streamInfo = {
227
+ ...this.requestMetadata.streamInfo,
228
+ sabrContextSendingPolicy
229
+ };
230
+ }
231
+ return undefined;
232
+ }
233
+ }
234
+ //# sourceMappingURL=SabrUmpProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SabrUmpProcessor.js","sourceRoot":"","sources":["../../../src/core/SabrUmpProcessor.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,17 @@
1
- import type { Part } from '../index.js';
2
- import type { ChunkedDataBuffer } from './ChunkedDataBuffer.js';
3
- export declare class UMP {
4
- private chunkedDataBuffer;
5
- /**
6
- * Creates a new UMP parser.
7
- * @param chunkedDataBuffer - Buffer containing UMP format data.
8
- */
9
- constructor(chunkedDataBuffer: ChunkedDataBuffer);
1
+ import type { CompositeBuffer } from './CompositeBuffer.js';
2
+ import type { Part } from '../types/shared.js';
3
+ /**
4
+ * A parser that efficiently processes chunked UMP binary data.
5
+ */
6
+ export declare class UmpReader {
7
+ private compositeBuffer;
8
+ constructor(compositeBuffer: CompositeBuffer);
10
9
  /**
11
10
  * Parses parts from the buffer and calls the handler for each complete part.
12
11
  * @param handlePart - Function called with each complete part.
13
12
  * @returns Partial part if parsing is incomplete, undefined otherwise.
14
13
  */
15
- parse(handlePart: (part: Part) => void): Part | undefined;
14
+ read(handlePart: (part: Part) => void): Part | undefined;
16
15
  /**
17
16
  * Reads a variable-length integer from the buffer.
18
17
  * @param offset - Position to start reading from.
@@ -1,17 +1,16 @@
1
- export class UMP {
2
- /**
3
- * Creates a new UMP parser.
4
- * @param chunkedDataBuffer - Buffer containing UMP format data.
5
- */
6
- constructor(chunkedDataBuffer) {
7
- this.chunkedDataBuffer = chunkedDataBuffer;
1
+ /**
2
+ * A parser that efficiently processes chunked UMP binary data.
3
+ */
4
+ export class UmpReader {
5
+ constructor(compositeBuffer) {
6
+ this.compositeBuffer = compositeBuffer;
8
7
  }
9
8
  /**
10
9
  * Parses parts from the buffer and calls the handler for each complete part.
11
10
  * @param handlePart - Function called with each complete part.
12
11
  * @returns Partial part if parsing is incomplete, undefined otherwise.
13
12
  */
14
- parse(handlePart) {
13
+ read(handlePart) {
15
14
  while (true) {
16
15
  let offset = 0;
17
16
  const [partType, newOffset] = this.readVarInt(offset);
@@ -20,23 +19,23 @@ export class UMP {
20
19
  offset = finalOffset;
21
20
  if (partType < 0 || partSize < 0)
22
21
  break;
23
- if (!this.chunkedDataBuffer.canReadBytes(offset, partSize)) {
24
- if (!this.chunkedDataBuffer.canReadBytes(offset, 1))
22
+ if (!this.compositeBuffer.canReadBytes(offset, partSize)) {
23
+ if (!this.compositeBuffer.canReadBytes(offset, 1))
25
24
  break;
26
25
  return {
27
26
  type: partType,
28
27
  size: partSize,
29
- data: this.chunkedDataBuffer
28
+ data: this.compositeBuffer
30
29
  };
31
30
  }
32
- const splitResult = this.chunkedDataBuffer.split(offset).remainingBuffer.split(partSize);
31
+ const splitResult = this.compositeBuffer.split(offset).remainingBuffer.split(partSize);
33
32
  offset = 0;
34
33
  handlePart({
35
34
  type: partType,
36
35
  size: partSize,
37
36
  data: splitResult.extractedBuffer
38
37
  });
39
- this.chunkedDataBuffer = splitResult.remainingBuffer;
38
+ this.compositeBuffer = splitResult.remainingBuffer;
40
39
  }
41
40
  }
42
41
  /**
@@ -47,54 +46,54 @@ export class UMP {
47
46
  readVarInt(offset) {
48
47
  let byteLength;
49
48
  // Determine the length of the val
50
- if (this.chunkedDataBuffer.canReadBytes(offset, 1)) {
51
- const firstByte = this.chunkedDataBuffer.getUint8(offset);
49
+ if (this.compositeBuffer.canReadBytes(offset, 1)) {
50
+ const firstByte = this.compositeBuffer.getUint8(offset);
52
51
  byteLength = firstByte < 128 ? 1 : firstByte < 192 ? 2 : firstByte < 224 ? 3 : firstByte < 240 ? 4 : 5;
53
52
  }
54
53
  else {
55
54
  byteLength = 0;
56
55
  }
57
- if (byteLength < 1 || !this.chunkedDataBuffer.canReadBytes(offset, byteLength)) {
56
+ if (byteLength < 1 || !this.compositeBuffer.canReadBytes(offset, byteLength)) {
58
57
  return [-1, offset];
59
58
  }
60
59
  let value;
61
60
  // Now read it based on the length
62
61
  switch (byteLength) {
63
62
  case 1:
64
- value = this.chunkedDataBuffer.getUint8(offset++);
63
+ value = this.compositeBuffer.getUint8(offset++);
65
64
  break;
66
65
  case 2: {
67
- const byte1 = this.chunkedDataBuffer.getUint8(offset++);
68
- const byte2 = this.chunkedDataBuffer.getUint8(offset++);
66
+ const byte1 = this.compositeBuffer.getUint8(offset++);
67
+ const byte2 = this.compositeBuffer.getUint8(offset++);
69
68
  value = (byte1 & 0x3f) + 64 * byte2;
70
69
  break;
71
70
  }
72
71
  case 3: {
73
- const byte1 = this.chunkedDataBuffer.getUint8(offset++);
74
- const byte2 = this.chunkedDataBuffer.getUint8(offset++);
75
- const byte3 = this.chunkedDataBuffer.getUint8(offset++);
72
+ const byte1 = this.compositeBuffer.getUint8(offset++);
73
+ const byte2 = this.compositeBuffer.getUint8(offset++);
74
+ const byte3 = this.compositeBuffer.getUint8(offset++);
76
75
  value = (byte1 & 0x1f) + 32 * (byte2 + 256 * byte3);
77
76
  break;
78
77
  }
79
78
  case 4: {
80
- const byte1 = this.chunkedDataBuffer.getUint8(offset++);
81
- const byte2 = this.chunkedDataBuffer.getUint8(offset++);
82
- const byte3 = this.chunkedDataBuffer.getUint8(offset++);
83
- const byte4 = this.chunkedDataBuffer.getUint8(offset++);
79
+ const byte1 = this.compositeBuffer.getUint8(offset++);
80
+ const byte2 = this.compositeBuffer.getUint8(offset++);
81
+ const byte3 = this.compositeBuffer.getUint8(offset++);
82
+ const byte4 = this.compositeBuffer.getUint8(offset++);
84
83
  value = (byte1 & 0x0f) + 16 * (byte2 + 256 * (byte3 + 256 * byte4));
85
84
  break;
86
85
  }
87
86
  default: {
88
87
  const tempOffset = offset + 1;
89
- this.chunkedDataBuffer.focus(tempOffset);
88
+ this.compositeBuffer.focus(tempOffset);
90
89
  if (this.canReadFromCurrentChunk(tempOffset, 4)) {
91
- value = this.getCurrentDataView().getUint32(tempOffset - this.chunkedDataBuffer.currentChunkOffset, true);
90
+ value = this.getCurrentDataView().getUint32(tempOffset - this.compositeBuffer.currentChunkOffset, true);
92
91
  }
93
92
  else {
94
- const byte3 = this.chunkedDataBuffer.getUint8(tempOffset + 2) + 256 * this.chunkedDataBuffer.getUint8(tempOffset + 3);
93
+ const byte3 = this.compositeBuffer.getUint8(tempOffset + 2) + 256 * this.compositeBuffer.getUint8(tempOffset + 3);
95
94
  value =
96
- this.chunkedDataBuffer.getUint8(tempOffset) +
97
- 256 * (this.chunkedDataBuffer.getUint8(tempOffset + 1) + 256 * byte3);
95
+ this.compositeBuffer.getUint8(tempOffset) +
96
+ 256 * (this.compositeBuffer.getUint8(tempOffset + 1) + 256 * byte3);
98
97
  }
99
98
  offset += 5;
100
99
  break;
@@ -109,17 +108,18 @@ export class UMP {
109
108
  * @returns True if bytes can be read from current chunk, false otherwise.
110
109
  */
111
110
  canReadFromCurrentChunk(offset, length) {
112
- return offset - this.chunkedDataBuffer.currentChunkOffset + length <= this.chunkedDataBuffer.chunks[this.chunkedDataBuffer.currentChunkIndex].length;
111
+ return offset - this.compositeBuffer.currentChunkOffset + length <= this.compositeBuffer.chunks[this.compositeBuffer.currentChunkIndex].length;
113
112
  }
114
113
  /**
115
114
  * Gets a DataView of the current chunk, creating it if necessary.
116
115
  * @returns DataView for the current chunk.
117
116
  */
118
117
  getCurrentDataView() {
119
- if (!this.chunkedDataBuffer.currentDataView) {
120
- const currentChunk = this.chunkedDataBuffer.chunks[this.chunkedDataBuffer.currentChunkIndex];
121
- this.chunkedDataBuffer.currentDataView = new DataView(currentChunk.buffer, currentChunk.byteOffset, currentChunk.length);
118
+ if (!this.compositeBuffer.currentDataView) {
119
+ const currentChunk = this.compositeBuffer.chunks[this.compositeBuffer.currentChunkIndex];
120
+ this.compositeBuffer.currentDataView = new DataView(currentChunk.buffer, currentChunk.byteOffset, currentChunk.length);
122
121
  }
123
- return this.chunkedDataBuffer.currentDataView;
122
+ return this.compositeBuffer.currentDataView;
124
123
  }
125
124
  }
125
+ //# sourceMappingURL=UmpReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UmpReader.js","sourceRoot":"","sources":["../../../src/core/UmpReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { CompositeBuffer } from './CompositeBuffer.js';
2
+ /**
3
+ * A serialization module that encodes data into the UMP binary format with proper type and size encoding.
4
+ */
5
+ export declare class UmpWriter {
6
+ private compositeBuffer;
7
+ constructor(compositeBuffer: CompositeBuffer);
8
+ /**
9
+ * Writes a part to the buffer.
10
+ * @param partType - The type of the part.
11
+ * @param partData - The data of the part.
12
+ */
13
+ write(partType: number, partData: Uint8Array): void;
14
+ /**
15
+ * Writes a variable-length integer to the buffer.
16
+ * @param value - The integer to write.
17
+ */
18
+ private writeVarInt;
19
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * A serialization module that encodes data into the UMP binary format with proper type and size encoding.
3
+ */
4
+ export class UmpWriter {
5
+ constructor(compositeBuffer) {
6
+ this.compositeBuffer = compositeBuffer;
7
+ }
8
+ /**
9
+ * Writes a part to the buffer.
10
+ * @param partType - The type of the part.
11
+ * @param partData - The data of the part.
12
+ */
13
+ write(partType, partData) {
14
+ const partSize = partData.length;
15
+ this.writeVarInt(partType);
16
+ this.writeVarInt(partSize);
17
+ this.compositeBuffer.append(partData);
18
+ }
19
+ /**
20
+ * Writes a variable-length integer to the buffer.
21
+ * @param value - The integer to write.
22
+ */
23
+ writeVarInt(value) {
24
+ if (value < 0)
25
+ throw new Error('VarInt value cannot be negative.');
26
+ if (value < 128) {
27
+ this.compositeBuffer.append(new Uint8Array([value]));
28
+ }
29
+ else if (value < 16384) {
30
+ this.compositeBuffer.append(new Uint8Array([
31
+ (value & 0x3F) | 0x80,
32
+ value >> 6
33
+ ]));
34
+ }
35
+ else if (value < 2097152) {
36
+ this.compositeBuffer.append(new Uint8Array([
37
+ (value & 0x1F) | 0xC0,
38
+ (value >> 5) & 0xFF,
39
+ value >> 13
40
+ ]));
41
+ }
42
+ else if (value < 268435456) {
43
+ this.compositeBuffer.append(new Uint8Array([
44
+ (value & 0x0F) | 0xE0,
45
+ (value >> 4) & 0xFF,
46
+ (value >> 12) & 0xFF,
47
+ value >> 20
48
+ ]));
49
+ }
50
+ else {
51
+ const data = new Uint8Array(5);
52
+ const view = new DataView(data.buffer);
53
+ data[0] = 0xF0;
54
+ view.setUint32(1, value, true);
55
+ this.compositeBuffer.append(data);
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=UmpWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UmpWriter.js","sourceRoot":"","sources":["../../../src/core/UmpWriter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,SAAS;IACpB,YACU,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;IACtC,CAAC;IAEL;;;;OAIG;IACI,KAAK,CAAC,QAAgB,EAAE,QAAoB;QACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,GAAG,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEtD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAE,KAAK,CAAE,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC;gBACzC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI;gBACrB,KAAK,IAAI,CAAC;aACX,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC;gBACzC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI;gBACrB,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI;gBACnB,KAAK,IAAI,EAAE;aACZ,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC;gBACzC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI;gBACrB,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI;gBACnB,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI;gBACpB,KAAK,IAAI,EAAE;aACZ,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This module contains protobuf definitions.
3
+ * @module
4
+ */
5
+ export * from '../utils/Protos.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This module contains protobuf definitions.
3
+ * @module
4
+ */
5
+ export * from '../utils/Protos.js';
6
+ //# sourceMappingURL=protos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protos.js","sourceRoot":"","sources":["../../../src/exports/protos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This module contains a SABR client for downloading videos.
3
+ * @module
4
+ */
5
+ export * from '../core/SabrStream.js';
6
+ export type * from '../types/sabrStreamTypes.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This module contains a SABR client for downloading videos.
3
+ * @module
4
+ */
5
+ export * from '../core/SabrStream.js';
6
+ //# sourceMappingURL=sabr-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabr-stream.js","sourceRoot":"","sources":["../../../src/exports/sabr-stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * This module contains the core classes, types, and utilities required to integrate YouTube's SABR streaming protocol
3
+ * into a media player.
4
+ * @module
5
+ */
6
+ export * from '../core/SabrStreamingAdapter.js';
7
+ export * from '../core/SabrUmpProcessor.js';
8
+ export type * from '../types/sabrStreamingAdapterTypes.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * This module contains the core classes, types, and utilities required to integrate YouTube's SABR streaming protocol
3
+ * into a media player.
4
+ * @module
5
+ */
6
+ export * from '../core/SabrStreamingAdapter.js';
7
+ export * from '../core/SabrUmpProcessor.js';
8
+ //# sourceMappingURL=sabr-streaming-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabr-streaming-adapter.js","sourceRoot":"","sources":["../../../src/exports/sabr-streaming-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * This module contains utilities for writing and reading UMP data.
3
+ * @module
4
+ */
5
+ export * from '../core/UmpReader.js';
6
+ export * from '../core/UmpWriter.js';
7
+ export * from '../core/CompositeBuffer.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * This module contains utilities for writing and reading UMP data.
3
+ * @module
4
+ */
5
+ export * from '../core/UmpReader.js';
6
+ export * from '../core/UmpWriter.js';
7
+ export * from '../core/CompositeBuffer.js';
8
+ //# sourceMappingURL=ump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ump.js","sourceRoot":"","sources":["../../../src/exports/ump.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This module contains general utilities.
3
+ * @module
4
+ */
5
+ export * from '../utils/index.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This module contains general utilities.
3
+ * @module
4
+ */
5
+ export * from '../utils/index.js';
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/exports/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC"}