diff --git a/dev-scripts/generate-proto.mjs b/dev-scripts/generate-proto.mjs index 4ae69e9..27dfc96 100644 --- a/dev-scripts/generate-proto.mjs +++ b/dev-scripts/generate-proto.mjs @@ -45,7 +45,7 @@ if (!protoFiles.length) { } protoFiles.forEach((file) => { - const command = `protoc --proto_path=${protoDir} --plugin=protoc-gen-ts=${protocGenTs} --ts_opt=env=browser --ts_opt=importSuffix=.js --ts_out=${outDir} --ts_opt=outputJsonMethods=false --ts_opt=outputPartialMethods=false --ts_opt=removeEnumPrefix=true ${file}`; + const command = `protoc --proto_path=${protoDir} --plugin=protoc-gen-ts=${protocGenTs} --ts_opt=env=browser --ts_opt=forceLong=string --ts_opt=importSuffix=.js --ts_out=${outDir} --ts_opt=outputJsonMethods=false --ts_opt=outputPartialMethods=false --ts_opt=removeEnumPrefix=true ${file}`; exec(command, (error, _stdout, stderr) => { if (error) { console.error(`Error compiling ${file}:`, stderr); diff --git a/protos/generated/misc/common.ts b/protos/generated/misc/common.ts index a476091..db3b062 100644 --- a/protos/generated/misc/common.ts +++ b/protos/generated/misc/common.ts @@ -185,7 +185,7 @@ export interface HttpHeader { export interface FormatId { itag?: number | undefined; - lastModified?: number | undefined; + lastModified?: string | undefined; xtags?: string | undefined; } @@ -265,7 +265,7 @@ export const HttpHeader: MessageFns = { }; function createBaseFormatId(): FormatId { - return { itag: 0, lastModified: 0, xtags: "" }; + return { itag: 0, lastModified: "0", xtags: "" }; } export const FormatId: MessageFns = { @@ -273,7 +273,7 @@ export const FormatId: MessageFns = { if (message.itag !== undefined && message.itag !== 0) { writer.uint32(8).int32(message.itag); } - if (message.lastModified !== undefined && message.lastModified !== 0) { + if (message.lastModified !== undefined && message.lastModified !== "0") { writer.uint32(16).uint64(message.lastModified); } if (message.xtags !== undefined && message.xtags !== "") { @@ -302,7 +302,7 @@ export const FormatId: MessageFns = { break; } - message.lastModified = longToNumber(reader.uint64()); + message.lastModified = reader.uint64().toString(); continue; } case 3: { @@ -585,17 +585,6 @@ export const PlaybackAuthorization: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/buffered_range.ts b/protos/generated/video_streaming/buffered_range.ts index 252107f..a303e33 100644 --- a/protos/generated/video_streaming/buffered_range.ts +++ b/protos/generated/video_streaming/buffered_range.ts @@ -13,8 +13,8 @@ export const protobufPackage = "video_streaming"; export interface BufferedRange { formatId: FormatId | undefined; - startTimeMs: number; - durationMs: number; + startTimeMs: string; + durationMs: string; startSegmentIndex: number; endSegmentIndex: number; timeRange?: TimeRange | undefined; @@ -29,7 +29,7 @@ export interface BufferedRange_UnknownMessage1 { export interface BufferedRange_UnknownMessage1_UnknownInnerMessage { videoId?: string | undefined; - lmt?: number | undefined; + lmt?: string | undefined; } export interface BufferedRange_UnknownMessage2 { @@ -41,8 +41,8 @@ export interface BufferedRange_UnknownMessage2 { function createBaseBufferedRange(): BufferedRange { return { formatId: undefined, - startTimeMs: 0, - durationMs: 0, + startTimeMs: "0", + durationMs: "0", startSegmentIndex: 0, endSegmentIndex: 0, timeRange: undefined, @@ -57,10 +57,10 @@ export const BufferedRange: MessageFns = { if (message.formatId !== undefined) { FormatId.encode(message.formatId, writer.uint32(10).fork()).join(); } - if (message.startTimeMs !== 0) { + if (message.startTimeMs !== "0") { writer.uint32(16).int64(message.startTimeMs); } - if (message.durationMs !== 0) { + if (message.durationMs !== "0") { writer.uint32(24).int64(message.durationMs); } if (message.startSegmentIndex !== 0) { @@ -104,7 +104,7 @@ export const BufferedRange: MessageFns = { break; } - message.startTimeMs = longToNumber(reader.int64()); + message.startTimeMs = reader.int64().toString(); continue; } case 3: { @@ -112,7 +112,7 @@ export const BufferedRange: MessageFns = { break; } - message.durationMs = longToNumber(reader.int64()); + message.durationMs = reader.int64().toString(); continue; } case 4: { @@ -211,7 +211,7 @@ export const BufferedRange_UnknownMessage1: MessageFns globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/client_abr_state.ts b/protos/generated/video_streaming/client_abr_state.ts index fba24cf..295c4e0 100644 --- a/protos/generated/video_streaming/client_abr_state.ts +++ b/protos/generated/video_streaming/client_abr_state.ts @@ -18,39 +18,39 @@ import { MediaCapabilities } from "./media_capabilities.js"; export const protobufPackage = "video_streaming"; export interface ClientAbrState { - timeSinceLastManualFormatSelectionMs?: number | undefined; + timeSinceLastManualFormatSelectionMs?: string | undefined; lastManualDirection?: number | undefined; lastManualSelectedResolution?: number | undefined; detailedNetworkType?: number | undefined; clientViewportWidth?: number | undefined; clientViewportHeight?: number | undefined; - clientBitrateCapBytesPerSec?: number | undefined; + clientBitrateCapBytesPerSec?: string | undefined; stickyResolution?: number | undefined; clientViewportIsFlexible?: boolean | undefined; - bandwidthEstimate?: number | undefined; + bandwidthEstimate?: string | undefined; minAudioQuality?: AudioQuality | undefined; maxAudioQuality?: AudioQuality | undefined; videoQualitySetting?: VideoQualitySetting | undefined; audioRoute?: PlaybackAudioRouteOutputType | undefined; - playerTimeMs?: number | undefined; - timeSinceLastSeek?: number | undefined; + playerTimeMs?: string | undefined; + timeSinceLastSeek?: string | undefined; dataSaverMode?: boolean | undefined; networkMeteredState?: NetworkMeteredState | undefined; visibility?: number | undefined; playbackRate?: number | undefined; - elapsedWallTimeMs?: number | undefined; + elapsedWallTimeMs?: string | undefined; mediaCapabilities?: MediaCapabilities | undefined; - timeSinceLastActionMs?: number | undefined; + timeSinceLastActionMs?: string | undefined; enabledTrackTypesBitfield?: number | undefined; maxPacingRate?: number | undefined; - playerState?: number | undefined; + playerState?: string | undefined; drcEnabled?: boolean | undefined; field48?: number | undefined; field50?: number | undefined; field51?: number | undefined; sabrReportRequestCancellationInfo?: number | undefined; disableStreamingXhr?: boolean | undefined; - field57?: number | undefined; + field57?: string | undefined; preferVp9?: | boolean | undefined; @@ -63,7 +63,7 @@ export interface ClientAbrState { allowProximaLiveLatency?: number | undefined; sabrForceProxima?: number | undefined; field67?: number | undefined; - sabrForceMaxNetworkInterruptionDurationMs?: number | undefined; + sabrForceMaxNetworkInterruptionDurationMs?: string | undefined; audioTrackId?: string | undefined; enableVoiceBoost?: boolean | undefined; playbackAuthorization?: PlaybackAuthorization | undefined; @@ -71,39 +71,39 @@ export interface ClientAbrState { function createBaseClientAbrState(): ClientAbrState { return { - timeSinceLastManualFormatSelectionMs: 0, + timeSinceLastManualFormatSelectionMs: "0", lastManualDirection: 0, lastManualSelectedResolution: 0, detailedNetworkType: 0, clientViewportWidth: 0, clientViewportHeight: 0, - clientBitrateCapBytesPerSec: 0, + clientBitrateCapBytesPerSec: "0", stickyResolution: 0, clientViewportIsFlexible: false, - bandwidthEstimate: 0, + bandwidthEstimate: "0", minAudioQuality: 0, maxAudioQuality: 0, videoQualitySetting: 0, audioRoute: 0, - playerTimeMs: 0, - timeSinceLastSeek: 0, + playerTimeMs: "0", + timeSinceLastSeek: "0", dataSaverMode: false, networkMeteredState: 0, visibility: 0, playbackRate: 0, - elapsedWallTimeMs: 0, + elapsedWallTimeMs: "0", mediaCapabilities: undefined, - timeSinceLastActionMs: 0, + timeSinceLastActionMs: "0", enabledTrackTypesBitfield: 0, maxPacingRate: 0, - playerState: 0, + playerState: "0", drcEnabled: false, field48: 0, field50: 0, field51: 0, sabrReportRequestCancellationInfo: 0, disableStreamingXhr: false, - field57: 0, + field57: "0", preferVp9: false, av1QualityThreshold: 0, field60: 0, @@ -113,7 +113,7 @@ function createBaseClientAbrState(): ClientAbrState { allowProximaLiveLatency: 0, sabrForceProxima: 0, field67: 0, - sabrForceMaxNetworkInterruptionDurationMs: 0, + sabrForceMaxNetworkInterruptionDurationMs: "0", audioTrackId: "", enableVoiceBoost: false, playbackAuthorization: undefined, @@ -123,7 +123,7 @@ function createBaseClientAbrState(): ClientAbrState { export const ClientAbrState: MessageFns = { encode(message: ClientAbrState, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if ( - message.timeSinceLastManualFormatSelectionMs !== undefined && message.timeSinceLastManualFormatSelectionMs !== 0 + message.timeSinceLastManualFormatSelectionMs !== undefined && message.timeSinceLastManualFormatSelectionMs !== "0" ) { writer.uint32(104).int64(message.timeSinceLastManualFormatSelectionMs); } @@ -142,7 +142,7 @@ export const ClientAbrState: MessageFns = { if (message.clientViewportHeight !== undefined && message.clientViewportHeight !== 0) { writer.uint32(152).int32(message.clientViewportHeight); } - if (message.clientBitrateCapBytesPerSec !== undefined && message.clientBitrateCapBytesPerSec !== 0) { + if (message.clientBitrateCapBytesPerSec !== undefined && message.clientBitrateCapBytesPerSec !== "0") { writer.uint32(160).int64(message.clientBitrateCapBytesPerSec); } if (message.stickyResolution !== undefined && message.stickyResolution !== 0) { @@ -151,7 +151,7 @@ export const ClientAbrState: MessageFns = { if (message.clientViewportIsFlexible !== undefined && message.clientViewportIsFlexible !== false) { writer.uint32(176).bool(message.clientViewportIsFlexible); } - if (message.bandwidthEstimate !== undefined && message.bandwidthEstimate !== 0) { + if (message.bandwidthEstimate !== undefined && message.bandwidthEstimate !== "0") { writer.uint32(184).int64(message.bandwidthEstimate); } if (message.minAudioQuality !== undefined && message.minAudioQuality !== 0) { @@ -166,10 +166,10 @@ export const ClientAbrState: MessageFns = { if (message.audioRoute !== undefined && message.audioRoute !== 0) { writer.uint32(216).int32(message.audioRoute); } - if (message.playerTimeMs !== undefined && message.playerTimeMs !== 0) { + if (message.playerTimeMs !== undefined && message.playerTimeMs !== "0") { writer.uint32(224).int64(message.playerTimeMs); } - if (message.timeSinceLastSeek !== undefined && message.timeSinceLastSeek !== 0) { + if (message.timeSinceLastSeek !== undefined && message.timeSinceLastSeek !== "0") { writer.uint32(232).int64(message.timeSinceLastSeek); } if (message.dataSaverMode !== undefined && message.dataSaverMode !== false) { @@ -184,13 +184,13 @@ export const ClientAbrState: MessageFns = { if (message.playbackRate !== undefined && message.playbackRate !== 0) { writer.uint32(285).float(message.playbackRate); } - if (message.elapsedWallTimeMs !== undefined && message.elapsedWallTimeMs !== 0) { + if (message.elapsedWallTimeMs !== undefined && message.elapsedWallTimeMs !== "0") { writer.uint32(288).int64(message.elapsedWallTimeMs); } if (message.mediaCapabilities !== undefined) { MediaCapabilities.encode(message.mediaCapabilities, writer.uint32(306).fork()).join(); } - if (message.timeSinceLastActionMs !== undefined && message.timeSinceLastActionMs !== 0) { + if (message.timeSinceLastActionMs !== undefined && message.timeSinceLastActionMs !== "0") { writer.uint32(312).int64(message.timeSinceLastActionMs); } if (message.enabledTrackTypesBitfield !== undefined && message.enabledTrackTypesBitfield !== 0) { @@ -199,7 +199,7 @@ export const ClientAbrState: MessageFns = { if (message.maxPacingRate !== undefined && message.maxPacingRate !== 0) { writer.uint32(344).int32(message.maxPacingRate); } - if (message.playerState !== undefined && message.playerState !== 0) { + if (message.playerState !== undefined && message.playerState !== "0") { writer.uint32(352).int64(message.playerState); } if (message.drcEnabled !== undefined && message.drcEnabled !== false) { @@ -220,7 +220,7 @@ export const ClientAbrState: MessageFns = { if (message.disableStreamingXhr !== undefined && message.disableStreamingXhr !== false) { writer.uint32(448).bool(message.disableStreamingXhr); } - if (message.field57 !== undefined && message.field57 !== 0) { + if (message.field57 !== undefined && message.field57 !== "0") { writer.uint32(456).int64(message.field57); } if (message.preferVp9 !== undefined && message.preferVp9 !== false) { @@ -252,7 +252,7 @@ export const ClientAbrState: MessageFns = { } if ( message.sabrForceMaxNetworkInterruptionDurationMs !== undefined && - message.sabrForceMaxNetworkInterruptionDurationMs !== 0 + message.sabrForceMaxNetworkInterruptionDurationMs !== "0" ) { writer.uint32(544).int64(message.sabrForceMaxNetworkInterruptionDurationMs); } @@ -280,7 +280,7 @@ export const ClientAbrState: MessageFns = { break; } - message.timeSinceLastManualFormatSelectionMs = longToNumber(reader.int64()); + message.timeSinceLastManualFormatSelectionMs = reader.int64().toString(); continue; } case 14: { @@ -328,7 +328,7 @@ export const ClientAbrState: MessageFns = { break; } - message.clientBitrateCapBytesPerSec = longToNumber(reader.int64()); + message.clientBitrateCapBytesPerSec = reader.int64().toString(); continue; } case 21: { @@ -352,7 +352,7 @@ export const ClientAbrState: MessageFns = { break; } - message.bandwidthEstimate = longToNumber(reader.int64()); + message.bandwidthEstimate = reader.int64().toString(); continue; } case 24: { @@ -392,7 +392,7 @@ export const ClientAbrState: MessageFns = { break; } - message.playerTimeMs = longToNumber(reader.int64()); + message.playerTimeMs = reader.int64().toString(); continue; } case 29: { @@ -400,7 +400,7 @@ export const ClientAbrState: MessageFns = { break; } - message.timeSinceLastSeek = longToNumber(reader.int64()); + message.timeSinceLastSeek = reader.int64().toString(); continue; } case 30: { @@ -440,7 +440,7 @@ export const ClientAbrState: MessageFns = { break; } - message.elapsedWallTimeMs = longToNumber(reader.int64()); + message.elapsedWallTimeMs = reader.int64().toString(); continue; } case 38: { @@ -456,7 +456,7 @@ export const ClientAbrState: MessageFns = { break; } - message.timeSinceLastActionMs = longToNumber(reader.int64()); + message.timeSinceLastActionMs = reader.int64().toString(); continue; } case 40: { @@ -480,7 +480,7 @@ export const ClientAbrState: MessageFns = { break; } - message.playerState = longToNumber(reader.int64()); + message.playerState = reader.int64().toString(); continue; } case 46: { @@ -536,7 +536,7 @@ export const ClientAbrState: MessageFns = { break; } - message.field57 = longToNumber(reader.int64()); + message.field57 = reader.int64().toString(); continue; } case 58: { @@ -616,7 +616,7 @@ export const ClientAbrState: MessageFns = { break; } - message.sabrForceMaxNetworkInterruptionDurationMs = longToNumber(reader.int64()); + message.sabrForceMaxNetworkInterruptionDurationMs = reader.int64().toString(); continue; } case 69: { @@ -653,17 +653,6 @@ export const ClientAbrState: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/format_initialization_metadata.ts b/protos/generated/video_streaming/format_initialization_metadata.ts index 6b8b026..be42d69 100644 --- a/protos/generated/video_streaming/format_initialization_metadata.ts +++ b/protos/generated/video_streaming/format_initialization_metadata.ts @@ -13,28 +13,28 @@ export const protobufPackage = "video_streaming"; export interface FormatInitializationMetadata { videoId?: string | undefined; formatId?: FormatId | undefined; - endTimeMs?: number | undefined; - endSegmentNumber?: number | undefined; + endTimeMs?: string | undefined; + endSegmentNumber?: string | undefined; mimeType?: string | undefined; initRange?: Range | undefined; indexRange?: Range | undefined; - field8?: number | undefined; - durationUnits?: number | undefined; - durationTimescale?: number | undefined; + field8?: string | undefined; + durationUnits?: string | undefined; + durationTimescale?: string | undefined; } function createBaseFormatInitializationMetadata(): FormatInitializationMetadata { return { videoId: "", formatId: undefined, - endTimeMs: 0, - endSegmentNumber: 0, + endTimeMs: "0", + endSegmentNumber: "0", mimeType: "", initRange: undefined, indexRange: undefined, - field8: 0, - durationUnits: 0, - durationTimescale: 0, + field8: "0", + durationUnits: "0", + durationTimescale: "0", }; } @@ -46,10 +46,10 @@ export const FormatInitializationMetadata: MessageFns globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/live_metadata.ts b/protos/generated/video_streaming/live_metadata.ts index be548f9..6760e58 100644 --- a/protos/generated/video_streaming/live_metadata.ts +++ b/protos/generated/video_streaming/live_metadata.ts @@ -11,30 +11,30 @@ export const protobufPackage = "video_streaming"; export interface LiveMetadata { broadcastId?: string | undefined; - headSequenceNumber?: number | undefined; - headTimeMs?: number | undefined; - wallTimeMs?: number | undefined; + headSequenceNumber?: string | undefined; + headTimeMs?: string | undefined; + wallTimeMs?: string | undefined; videoId?: string | undefined; postLiveDvr?: boolean | undefined; - headm?: number | undefined; - minSeekableTimeTicks?: number | undefined; + headm?: string | undefined; + minSeekableTimeTicks?: string | undefined; minSeekableTimescale?: number | undefined; - maxSeekableTimeTicks?: number | undefined; + maxSeekableTimeTicks?: string | undefined; maxSeekableTimescale?: number | undefined; } function createBaseLiveMetadata(): LiveMetadata { return { broadcastId: "", - headSequenceNumber: 0, - headTimeMs: 0, - wallTimeMs: 0, + headSequenceNumber: "0", + headTimeMs: "0", + wallTimeMs: "0", videoId: "", postLiveDvr: false, - headm: 0, - minSeekableTimeTicks: 0, + headm: "0", + minSeekableTimeTicks: "0", minSeekableTimescale: 0, - maxSeekableTimeTicks: 0, + maxSeekableTimeTicks: "0", maxSeekableTimescale: 0, }; } @@ -44,13 +44,13 @@ export const LiveMetadata: MessageFns = { if (message.broadcastId !== undefined && message.broadcastId !== "") { writer.uint32(10).string(message.broadcastId); } - if (message.headSequenceNumber !== undefined && message.headSequenceNumber !== 0) { + if (message.headSequenceNumber !== undefined && message.headSequenceNumber !== "0") { writer.uint32(24).int64(message.headSequenceNumber); } - if (message.headTimeMs !== undefined && message.headTimeMs !== 0) { + if (message.headTimeMs !== undefined && message.headTimeMs !== "0") { writer.uint32(32).int64(message.headTimeMs); } - if (message.wallTimeMs !== undefined && message.wallTimeMs !== 0) { + if (message.wallTimeMs !== undefined && message.wallTimeMs !== "0") { writer.uint32(40).int64(message.wallTimeMs); } if (message.videoId !== undefined && message.videoId !== "") { @@ -59,16 +59,16 @@ export const LiveMetadata: MessageFns = { if (message.postLiveDvr !== undefined && message.postLiveDvr !== false) { writer.uint32(64).bool(message.postLiveDvr); } - if (message.headm !== undefined && message.headm !== 0) { + if (message.headm !== undefined && message.headm !== "0") { writer.uint32(80).int64(message.headm); } - if (message.minSeekableTimeTicks !== undefined && message.minSeekableTimeTicks !== 0) { + if (message.minSeekableTimeTicks !== undefined && message.minSeekableTimeTicks !== "0") { writer.uint32(96).int64(message.minSeekableTimeTicks); } if (message.minSeekableTimescale !== undefined && message.minSeekableTimescale !== 0) { writer.uint32(104).int32(message.minSeekableTimescale); } - if (message.maxSeekableTimeTicks !== undefined && message.maxSeekableTimeTicks !== 0) { + if (message.maxSeekableTimeTicks !== undefined && message.maxSeekableTimeTicks !== "0") { writer.uint32(112).int64(message.maxSeekableTimeTicks); } if (message.maxSeekableTimescale !== undefined && message.maxSeekableTimescale !== 0) { @@ -97,7 +97,7 @@ export const LiveMetadata: MessageFns = { break; } - message.headSequenceNumber = longToNumber(reader.int64()); + message.headSequenceNumber = reader.int64().toString(); continue; } case 4: { @@ -105,7 +105,7 @@ export const LiveMetadata: MessageFns = { break; } - message.headTimeMs = longToNumber(reader.int64()); + message.headTimeMs = reader.int64().toString(); continue; } case 5: { @@ -113,7 +113,7 @@ export const LiveMetadata: MessageFns = { break; } - message.wallTimeMs = longToNumber(reader.int64()); + message.wallTimeMs = reader.int64().toString(); continue; } case 6: { @@ -137,7 +137,7 @@ export const LiveMetadata: MessageFns = { break; } - message.headm = longToNumber(reader.int64()); + message.headm = reader.int64().toString(); continue; } case 12: { @@ -145,7 +145,7 @@ export const LiveMetadata: MessageFns = { break; } - message.minSeekableTimeTicks = longToNumber(reader.int64()); + message.minSeekableTimeTicks = reader.int64().toString(); continue; } case 13: { @@ -161,7 +161,7 @@ export const LiveMetadata: MessageFns = { break; } - message.maxSeekableTimeTicks = longToNumber(reader.int64()); + message.maxSeekableTimeTicks = reader.int64().toString(); continue; } case 15: { @@ -182,17 +182,6 @@ export const LiveMetadata: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/media_header.ts b/protos/generated/video_streaming/media_header.ts index bae7490..ebf0c75 100644 --- a/protos/generated/video_streaming/media_header.ts +++ b/protos/generated/video_streaming/media_header.ts @@ -15,19 +15,19 @@ export interface MediaHeader { headerId?: number | undefined; videoId?: string | undefined; itag?: number | undefined; - lmt?: number | undefined; + lmt?: string | undefined; xtags?: string | undefined; - startRange?: number | undefined; + startRange?: string | undefined; compressionAlgorithm?: CompressionType | undefined; isInitSeg?: boolean | undefined; sequenceNumber?: number | undefined; - bitrateBps?: number | undefined; - startMs?: number | undefined; - durationMs?: number | undefined; + bitrateBps?: string | undefined; + startMs?: string | undefined; + durationMs?: string | undefined; formatId?: FormatId | undefined; - contentLength?: number | undefined; + contentLength?: string | undefined; timeRange?: TimeRange | undefined; - sequenceLmt?: number | undefined; + sequenceLmt?: string | undefined; } function createBaseMediaHeader(): MediaHeader { @@ -35,19 +35,19 @@ function createBaseMediaHeader(): MediaHeader { headerId: 0, videoId: "", itag: 0, - lmt: 0, + lmt: "0", xtags: "", - startRange: 0, + startRange: "0", compressionAlgorithm: 0, isInitSeg: false, sequenceNumber: 0, - bitrateBps: 0, - startMs: 0, - durationMs: 0, + bitrateBps: "0", + startMs: "0", + durationMs: "0", formatId: undefined, - contentLength: 0, + contentLength: "0", timeRange: undefined, - sequenceLmt: 0, + sequenceLmt: "0", }; } @@ -62,13 +62,13 @@ export const MediaHeader: MessageFns = { if (message.itag !== undefined && message.itag !== 0) { writer.uint32(24).int32(message.itag); } - if (message.lmt !== undefined && message.lmt !== 0) { + if (message.lmt !== undefined && message.lmt !== "0") { writer.uint32(32).uint64(message.lmt); } if (message.xtags !== undefined && message.xtags !== "") { writer.uint32(42).string(message.xtags); } - if (message.startRange !== undefined && message.startRange !== 0) { + if (message.startRange !== undefined && message.startRange !== "0") { writer.uint32(48).int64(message.startRange); } if (message.compressionAlgorithm !== undefined && message.compressionAlgorithm !== 0) { @@ -78,27 +78,27 @@ export const MediaHeader: MessageFns = { writer.uint32(64).bool(message.isInitSeg); } if (message.sequenceNumber !== undefined && message.sequenceNumber !== 0) { - writer.uint32(72).int64(message.sequenceNumber); + writer.uint32(72).int32(message.sequenceNumber); } - if (message.bitrateBps !== undefined && message.bitrateBps !== 0) { + if (message.bitrateBps !== undefined && message.bitrateBps !== "0") { writer.uint32(80).int64(message.bitrateBps); } - if (message.startMs !== undefined && message.startMs !== 0) { + if (message.startMs !== undefined && message.startMs !== "0") { writer.uint32(88).int64(message.startMs); } - if (message.durationMs !== undefined && message.durationMs !== 0) { + if (message.durationMs !== undefined && message.durationMs !== "0") { writer.uint32(96).int64(message.durationMs); } if (message.formatId !== undefined) { FormatId.encode(message.formatId, writer.uint32(106).fork()).join(); } - if (message.contentLength !== undefined && message.contentLength !== 0) { + if (message.contentLength !== undefined && message.contentLength !== "0") { writer.uint32(112).int64(message.contentLength); } if (message.timeRange !== undefined) { TimeRange.encode(message.timeRange, writer.uint32(122).fork()).join(); } - if (message.sequenceLmt !== undefined && message.sequenceLmt !== 0) { + if (message.sequenceLmt !== undefined && message.sequenceLmt !== "0") { writer.uint32(128).uint64(message.sequenceLmt); } return writer; @@ -140,7 +140,7 @@ export const MediaHeader: MessageFns = { break; } - message.lmt = longToNumber(reader.uint64()); + message.lmt = reader.uint64().toString(); continue; } case 5: { @@ -156,7 +156,7 @@ export const MediaHeader: MessageFns = { break; } - message.startRange = longToNumber(reader.int64()); + message.startRange = reader.int64().toString(); continue; } case 7: { @@ -180,7 +180,7 @@ export const MediaHeader: MessageFns = { break; } - message.sequenceNumber = longToNumber(reader.int64()); + message.sequenceNumber = reader.int32(); continue; } case 10: { @@ -188,7 +188,7 @@ export const MediaHeader: MessageFns = { break; } - message.bitrateBps = longToNumber(reader.int64()); + message.bitrateBps = reader.int64().toString(); continue; } case 11: { @@ -196,7 +196,7 @@ export const MediaHeader: MessageFns = { break; } - message.startMs = longToNumber(reader.int64()); + message.startMs = reader.int64().toString(); continue; } case 12: { @@ -204,7 +204,7 @@ export const MediaHeader: MessageFns = { break; } - message.durationMs = longToNumber(reader.int64()); + message.durationMs = reader.int64().toString(); continue; } case 13: { @@ -220,7 +220,7 @@ export const MediaHeader: MessageFns = { break; } - message.contentLength = longToNumber(reader.int64()); + message.contentLength = reader.int64().toString(); continue; } case 15: { @@ -236,7 +236,7 @@ export const MediaHeader: MessageFns = { break; } - message.sequenceLmt = longToNumber(reader.uint64()); + message.sequenceLmt = reader.uint64().toString(); continue; } } @@ -249,17 +249,6 @@ export const MediaHeader: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/onesie_header.ts b/protos/generated/video_streaming/onesie_header.ts index ff38fc6..88d2535 100644 --- a/protos/generated/video_streaming/onesie_header.ts +++ b/protos/generated/video_streaming/onesie_header.ts @@ -16,11 +16,11 @@ export interface OnesieHeader { videoId?: string | undefined; itag?: string | undefined; cryptoParams?: CryptoParams | undefined; - lastModified?: number | undefined; - expectedMediaSizeBytes?: number | undefined; + lastModified?: string | undefined; + expectedMediaSizeBytes?: string | undefined; restrictedFormats: string[]; xtags?: string | undefined; - sequenceNumber?: number | undefined; + sequenceNumber?: string | undefined; field23?: OnesieHeader_UnknownMessage1 | undefined; field34?: OnesieHeader_UnknownMessage2 | undefined; } @@ -39,11 +39,11 @@ function createBaseOnesieHeader(): OnesieHeader { videoId: "", itag: "", cryptoParams: undefined, - lastModified: 0, - expectedMediaSizeBytes: 0, + lastModified: "0", + expectedMediaSizeBytes: "0", restrictedFormats: [], xtags: "", - sequenceNumber: 0, + sequenceNumber: "0", field23: undefined, field34: undefined, }; @@ -63,10 +63,10 @@ export const OnesieHeader: MessageFns = { if (message.cryptoParams !== undefined) { CryptoParams.encode(message.cryptoParams, writer.uint32(34).fork()).join(); } - if (message.lastModified !== undefined && message.lastModified !== 0) { + if (message.lastModified !== undefined && message.lastModified !== "0") { writer.uint32(40).uint64(message.lastModified); } - if (message.expectedMediaSizeBytes !== undefined && message.expectedMediaSizeBytes !== 0) { + if (message.expectedMediaSizeBytes !== undefined && message.expectedMediaSizeBytes !== "0") { writer.uint32(56).int64(message.expectedMediaSizeBytes); } for (const v of message.restrictedFormats) { @@ -75,7 +75,7 @@ export const OnesieHeader: MessageFns = { if (message.xtags !== undefined && message.xtags !== "") { writer.uint32(122).string(message.xtags); } - if (message.sequenceNumber !== undefined && message.sequenceNumber !== 0) { + if (message.sequenceNumber !== undefined && message.sequenceNumber !== "0") { writer.uint32(144).int64(message.sequenceNumber); } if (message.field23 !== undefined) { @@ -131,7 +131,7 @@ export const OnesieHeader: MessageFns = { break; } - message.lastModified = longToNumber(reader.uint64()); + message.lastModified = reader.uint64().toString(); continue; } case 7: { @@ -139,7 +139,7 @@ export const OnesieHeader: MessageFns = { break; } - message.expectedMediaSizeBytes = longToNumber(reader.int64()); + message.expectedMediaSizeBytes = reader.int64().toString(); continue; } case 11: { @@ -163,7 +163,7 @@ export const OnesieHeader: MessageFns = { break; } - message.sequenceNumber = longToNumber(reader.int64()); + message.sequenceNumber = reader.int64().toString(); continue; } case 23: { @@ -266,17 +266,6 @@ export const OnesieHeader_UnknownMessage2: MessageFns globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/sabr_context_update.ts b/protos/generated/video_streaming/sabr_context_update.ts index 8933716..e1297b2 100644 --- a/protos/generated/video_streaming/sabr_context_update.ts +++ b/protos/generated/video_streaming/sabr_context_update.ts @@ -50,7 +50,7 @@ export interface SabrContextValue_ContentInfo { } export interface SabrContextValue_TimingInfo { - timestampMs?: number | undefined; + timestampMs?: string | undefined; durationMs?: number | undefined; content?: SabrContextValue_ContentInfo | undefined; } @@ -244,12 +244,12 @@ export const SabrContextValue_ContentInfo: MessageFns = { encode(message: SabrContextValue_TimingInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.timestampMs !== undefined && message.timestampMs !== 0) { + if (message.timestampMs !== undefined && message.timestampMs !== "0") { writer.uint32(8).int64(message.timestampMs); } if (message.durationMs !== undefined && message.durationMs !== 0) { @@ -273,7 +273,7 @@ export const SabrContextValue_TimingInfo: MessageFns globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/sabr_seek.ts b/protos/generated/video_streaming/sabr_seek.ts index c3a635f..d5e47b5 100644 --- a/protos/generated/video_streaming/sabr_seek.ts +++ b/protos/generated/video_streaming/sabr_seek.ts @@ -11,18 +11,18 @@ import { SeekSource } from "../misc/common.js"; export const protobufPackage = "video_streaming"; export interface SabrSeek { - seekMediaTime?: number | undefined; + seekMediaTime?: string | undefined; seekMediaTimescale?: number | undefined; seekSource?: SeekSource | undefined; } function createBaseSabrSeek(): SabrSeek { - return { seekMediaTime: 0, seekMediaTimescale: 0, seekSource: 0 }; + return { seekMediaTime: "0", seekMediaTimescale: 0, seekSource: 0 }; } export const SabrSeek: MessageFns = { encode(message: SabrSeek, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.seekMediaTime !== undefined && message.seekMediaTime !== 0) { + if (message.seekMediaTime !== undefined && message.seekMediaTime !== "0") { writer.uint32(8).int64(message.seekMediaTime); } if (message.seekMediaTimescale !== undefined && message.seekMediaTimescale !== 0) { @@ -46,7 +46,7 @@ export const SabrSeek: MessageFns = { break; } - message.seekMediaTime = longToNumber(reader.int64()); + message.seekMediaTime = reader.int64().toString(); continue; } case 2: { @@ -75,17 +75,6 @@ export const SabrSeek: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/streamer_context.ts b/protos/generated/video_streaming/streamer_context.ts index 6639422..93da17a 100644 --- a/protos/generated/video_streaming/streamer_context.ts +++ b/protos/generated/video_streaming/streamer_context.ts @@ -50,7 +50,7 @@ export interface StreamerContext_ClientInfo { windowHeightPoints?: number | undefined; androidSdkVersion?: number | undefined; screenDensityFloat?: number | undefined; - utcOffsetMinutes?: number | undefined; + utcOffsetMinutes?: string | undefined; timeZone?: | string | undefined; @@ -236,7 +236,7 @@ function createBaseStreamerContext_ClientInfo(): StreamerContext_ClientInfo { windowHeightPoints: 0, androidSdkVersion: 0, screenDensityFloat: 0, - utcOffsetMinutes: 0, + utcOffsetMinutes: "0", timeZone: "", chipset: "", glDeviceInfo: undefined, @@ -302,7 +302,7 @@ export const StreamerContext_ClientInfo: MessageFns if (message.screenDensityFloat !== undefined && message.screenDensityFloat !== 0) { writer.uint32(525).float(message.screenDensityFloat); } - if (message.utcOffsetMinutes !== undefined && message.utcOffsetMinutes !== 0) { + if (message.utcOffsetMinutes !== undefined && message.utcOffsetMinutes !== "0") { writer.uint32(536).int64(message.utcOffsetMinutes); } if (message.timeZone !== undefined && message.timeZone !== "") { @@ -481,7 +481,7 @@ export const StreamerContext_ClientInfo: MessageFns break; } - message.utcOffsetMinutes = longToNumber(reader.int64()); + message.utcOffsetMinutes = reader.int64().toString(); continue; } case 80: { @@ -726,17 +726,6 @@ export const StreamerContext_UnknownMessage1_UnknownInnerMessage1: MessageFns< }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/time_range.ts b/protos/generated/video_streaming/time_range.ts index 046ca0c..71b5e7d 100644 --- a/protos/generated/video_streaming/time_range.ts +++ b/protos/generated/video_streaming/time_range.ts @@ -10,21 +10,21 @@ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; export const protobufPackage = "video_streaming"; export interface TimeRange { - startTicks?: number | undefined; - durationTicks?: number | undefined; + startTicks?: string | undefined; + durationTicks?: string | undefined; timescale?: number | undefined; } function createBaseTimeRange(): TimeRange { - return { startTicks: 0, durationTicks: 0, timescale: 0 }; + return { startTicks: "0", durationTicks: "0", timescale: 0 }; } export const TimeRange: MessageFns = { encode(message: TimeRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.startTicks !== undefined && message.startTicks !== 0) { + if (message.startTicks !== undefined && message.startTicks !== "0") { writer.uint32(8).int64(message.startTicks); } - if (message.durationTicks !== undefined && message.durationTicks !== 0) { + if (message.durationTicks !== undefined && message.durationTicks !== "0") { writer.uint32(16).int64(message.durationTicks); } if (message.timescale !== undefined && message.timescale !== 0) { @@ -45,7 +45,7 @@ export const TimeRange: MessageFns = { break; } - message.startTicks = longToNumber(reader.int64()); + message.startTicks = reader.int64().toString(); continue; } case 2: { @@ -53,7 +53,7 @@ export const TimeRange: MessageFns = { break; } - message.durationTicks = longToNumber(reader.int64()); + message.durationTicks = reader.int64().toString(); continue; } case 3: { @@ -74,17 +74,6 @@ export const TimeRange: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/generated/video_streaming/video_playback_abr_request.ts b/protos/generated/video_streaming/video_playback_abr_request.ts index fa9f3cb..c86ddec 100644 --- a/protos/generated/video_streaming/video_playback_abr_request.ts +++ b/protos/generated/video_streaming/video_playback_abr_request.ts @@ -19,7 +19,7 @@ export interface VideoPlaybackAbrRequest { selectedFormatIds: FormatId[]; bufferedRanges: BufferedRange[]; /** `osts` (Onesie Start Time Seconds) param on Onesie requests. */ - playerTimeMs?: number | undefined; + playerTimeMs?: string | undefined; videoPlaybackUstreamerConfig?: Uint8Array | undefined; field6?: | UnknownMessage1 @@ -38,7 +38,7 @@ export interface VideoPlaybackAbrRequest { export interface UnknownMessage1 { formatId?: FormatId | undefined; - lmt?: number | undefined; + lmt?: string | undefined; sequenceNumber?: number | undefined; timeRange?: TimeRange | undefined; field5?: number | undefined; @@ -64,7 +64,7 @@ function createBaseVideoPlaybackAbrRequest(): VideoPlaybackAbrRequest { clientAbrState: undefined, selectedFormatIds: [], bufferedRanges: [], - playerTimeMs: 0, + playerTimeMs: "0", videoPlaybackUstreamerConfig: new Uint8Array(0), field6: undefined, preferredAudioFormatIds: [], @@ -89,7 +89,7 @@ export const VideoPlaybackAbrRequest: MessageFns = { for (const v of message.bufferedRanges) { BufferedRange.encode(v!, writer.uint32(26).fork()).join(); } - if (message.playerTimeMs !== undefined && message.playerTimeMs !== 0) { + if (message.playerTimeMs !== undefined && message.playerTimeMs !== "0") { writer.uint32(32).int64(message.playerTimeMs); } if (message.videoPlaybackUstreamerConfig !== undefined && message.videoPlaybackUstreamerConfig.length !== 0) { @@ -161,7 +161,7 @@ export const VideoPlaybackAbrRequest: MessageFns = { break; } - message.playerTimeMs = longToNumber(reader.int64()); + message.playerTimeMs = reader.int64().toString(); continue; } case 5: { @@ -255,7 +255,7 @@ export const VideoPlaybackAbrRequest: MessageFns = { }; function createBaseUnknownMessage1(): UnknownMessage1 { - return { formatId: undefined, lmt: 0, sequenceNumber: 0, timeRange: undefined, field5: 0 }; + return { formatId: undefined, lmt: "0", sequenceNumber: 0, timeRange: undefined, field5: 0 }; } export const UnknownMessage1: MessageFns = { @@ -263,7 +263,7 @@ export const UnknownMessage1: MessageFns = { if (message.formatId !== undefined) { FormatId.encode(message.formatId, writer.uint32(10).fork()).join(); } - if (message.lmt !== undefined && message.lmt !== 0) { + if (message.lmt !== undefined && message.lmt !== "0") { writer.uint32(16).sint64(message.lmt); } if (message.sequenceNumber !== undefined && message.sequenceNumber !== 0) { @@ -298,7 +298,7 @@ export const UnknownMessage1: MessageFns = { break; } - message.lmt = longToNumber(reader.sint64()); + message.lmt = reader.sint64().toString(); continue; } case 3: { @@ -486,17 +486,6 @@ export const UnknownMessage3: MessageFns = { }, }; -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - export interface MessageFns { encode(message: T, writer?: BinaryWriter): BinaryWriter; decode(input: BinaryReader | Uint8Array, length?: number): T; diff --git a/protos/video_streaming/media_header.proto b/protos/video_streaming/media_header.proto index 9be1719..17831f0 100644 --- a/protos/video_streaming/media_header.proto +++ b/protos/video_streaming/media_header.proto @@ -13,7 +13,7 @@ message MediaHeader { optional int64 start_range = 6; optional .misc.CompressionType compression_algorithm = 7; optional bool is_init_seg = 8; - optional int64 sequence_number = 9; + optional int32 sequence_number = 9; optional int64 bitrate_bps = 10; optional int64 start_ms = 11; optional int64 duration_ms = 12; diff --git a/src/core/SabrStream.ts b/src/core/SabrStream.ts index 875d18d..be04f4f 100644 --- a/src/core/SabrStream.ts +++ b/src/core/SabrStream.ts @@ -85,7 +85,7 @@ interface SelectedFormats { interface Segment { formatIdKey: string; segmentNumber: number; - durationMs?: number; + durationMs?: string; mediaHeader: MediaHeader; bufferedChunks: Uint8Array[]; } @@ -367,7 +367,7 @@ export class SabrStream extends EventEmitterLike { const maxRetries = options.maxRetries !== undefined ? options.maxRetries : DEFAULT_MAX_RETRIES; const enabledTrackTypesBitfield = options.enabledTrackTypes ?? EnabledTrackTypes.VIDEO_AND_AUDIO; - const abrState = { + const abrState: Record = { playerTimeMs, audioTrackId: audioFormat.audioTrackId, playbackRate: 1, @@ -385,7 +385,7 @@ export class SabrStream extends EventEmitterLike { FormatKeyUtils.fromFormat(audioFormat); } - while (abrState.playerTimeMs < this.durationMs) { + while (parseInt(abrState.playerTimeMs) < this.durationMs) { if (this._aborted) { this.logger.debug(TAG, 'Download process aborted, exiting streaming loop.'); break; @@ -410,6 +410,9 @@ export class SabrStream extends EventEmitterLike { if (shouldStop) break; + // Needed for the pb library. + abrState.playerTimeMs = abrState.playerTimeMs.toString(); + const success = await this.executeWithRetry( () => this.fetchAndProcessSegments( abrState, @@ -528,7 +531,7 @@ export class SabrStream extends EventEmitterLike { if (downloadedDurationCloseness < 5000) { this.logger.warn(TAG, 'Stream is close to completion, but stalled. Checking if we have the last segment.'); - const endSegmentNumber = this.mainFormat?.formatInitializationMetadata.endSegmentNumber || -1; + const endSegmentNumber = parseInt(this.mainFormat?.formatInitializationMetadata.endSegmentNumber || '0') || -1; const lastSegment = this.mainFormat?.downloadedSegments.get(endSegmentNumber); if (lastSegment && lastSegment.segmentNumber === endSegmentNumber) { @@ -651,16 +654,16 @@ export class SabrStream extends EventEmitterLike { } const mediaHeaders = initializedFormat.lastMediaHeaders; - const durationMs = mediaHeaders.reduce((sum, header) => sum + (header.durationMs || 0), 0); + const durationMs = mediaHeaders.reduce((sum, header) => sum + (parseInt(header.durationMs || '0')), 0); bufferedRanges.push({ - durationMs, + durationMs: durationMs.toString(), formatId: initializedFormat.formatInitializationMetadata.formatId, - startTimeMs: mediaHeaders[0].startMs || 0, + startTimeMs: String(mediaHeaders[0].startMs || '0'), startSegmentIndex: mediaHeaders[0].sequenceNumber || 1, endSegmentIndex: mediaHeaders[mediaHeaders.length - 1].sequenceNumber || 1, timeRange: { - durationTicks: durationMs, + durationTicks: durationMs.toString(), startTicks: mediaHeaders[0].startMs, timescale: mediaHeaders[0].timeRange?.timescale } @@ -761,12 +764,12 @@ export class SabrStream extends EventEmitterLike { updatedBufferedRanges.push({ formatId: format, durationMs: MAX_INT32_VALUE, - startTimeMs: 0, - startSegmentIndex: MAX_INT32_VALUE, - endSegmentIndex: MAX_INT32_VALUE, + startTimeMs: String(0), + startSegmentIndex: parseInt(MAX_INT32_VALUE), + endSegmentIndex: parseInt(MAX_INT32_VALUE), timeRange: { durationTicks: MAX_INT32_VALUE, - startTicks: 0, + startTicks: '0', timescale: 1000 } }); @@ -1108,8 +1111,8 @@ export class SabrStream extends EventEmitterLike { const headerId = mediaHeader.headerId || 0; const formatIdKey = FormatKeyUtils.fromMediaHeader(mediaHeader); - const segmentNumber = mediaHeader.isInitSeg ? 0 : mediaHeader.sequenceNumber!; - const durationMs = mediaHeader.durationMs || Math.ceil(((mediaHeader.timeRange?.durationTicks || 0) / (mediaHeader.timeRange?.timescale || 0)) * 1000); + const segmentNumber = mediaHeader.isInitSeg ? 0 : mediaHeader.sequenceNumber || 0; + const durationMs = mediaHeader.durationMs || Math.ceil((parseInt(mediaHeader.timeRange?.durationTicks || '0') / (mediaHeader.timeRange?.timescale || 0)) * 1000).toString(); const initializedFormat = this.initializedFormatsMap.get(formatIdKey); if (!initializedFormat) { @@ -1179,7 +1182,7 @@ export class SabrStream extends EventEmitterLike { const loadedBytes = segment.bufferedChunks.reduce((sum, chunk) => sum + chunk.length, 0); - if (loadedBytes !== segment.mediaHeader.contentLength) { + if (loadedBytes !== parseInt(segment.mediaHeader.contentLength || '0')) { this.logger.warn(TAG, `Content length mismatch for segment ${segment.segmentNumber} (Header ID: ${headerId}, key: ${segment.formatIdKey}, expected: ${segment.mediaHeader.contentLength}, received: ${loadedBytes})`); this.partialSegmentQueue.delete(headerId); return; @@ -1220,8 +1223,8 @@ export class SabrStream extends EventEmitterLike { * @private */ private validateAndCorrectDuration(formatInitializationMetadata: FormatInitializationMetadata): void { - const durationUnits = formatInitializationMetadata.durationUnits || 0; - const durationTimescale = formatInitializationMetadata.durationTimescale || 0; + const durationUnits = parseInt(formatInitializationMetadata.durationUnits || '0'); + const durationTimescale = parseInt(formatInitializationMetadata.durationTimescale || '0'); if (durationTimescale === 0) { this.logger.warn(TAG, 'Invalid timescale (0) in format initialization metadata'); @@ -1249,8 +1252,8 @@ export class SabrStream extends EventEmitterLike { } const totalDuration = getTotalDownloadedDuration(initializedFormat); - const durationUnits = initializedFormat.formatInitializationMetadata.durationUnits || 0; - const durationTimescale = initializedFormat.formatInitializationMetadata.durationTimescale || 0; + const durationUnits = parseInt(initializedFormat.formatInitializationMetadata.durationUnits || '0'); + const durationTimescale = parseInt(initializedFormat.formatInitializationMetadata.durationTimescale || '0'); const expectedDuration = durationTimescale ? durationUnits / (durationTimescale / 1000) : 0; const durationMismatch = Math.abs(totalDuration - expectedDuration); @@ -1264,7 +1267,7 @@ export class SabrStream extends EventEmitterLike { segments.sort(([ numA ], [ numB ]) => numA - numB); - const expectedSegmentCount = initializedFormat.formatInitializationMetadata.endSegmentNumber!; + const expectedSegmentCount = parseInt(initializedFormat.formatInitializationMetadata.endSegmentNumber || '0'); const missingSegments = []; // Find all missing segments in the expected range. diff --git a/src/core/SabrStreamingAdapter.ts b/src/core/SabrStreamingAdapter.ts index 0ad39d4..21b8979 100644 --- a/src/core/SabrStreamingAdapter.ts +++ b/src/core/SabrStreamingAdapter.ts @@ -34,8 +34,8 @@ interface InitializedFormat { formatId: FormatId; startSequenceNumber: number; endSequenceNumber: number; - startTimeMs: number; - durationMs: number; + startTimeMs: string; + durationMs: string; timescale: number; }; } @@ -349,10 +349,9 @@ export class SabrStreamingAdapter { return { clientAbrState: { playbackRate: this.playerAdapter.getPlaybackRate(), - playerTimeMs: Math.round((request.segment.getStartTime() ?? this.lastPlayerTimeSecs) * 1000), - timeSinceLastManualFormatSelectionMs: 0, + playerTimeMs: Math.round((request.segment.getStartTime() ?? this.lastPlayerTimeSecs) * 1000).toString(), clientViewportIsFlexible: false, - bandwidthEstimate: Math.round(this.playerAdapter.getBandwidthEstimate() || 0), + bandwidthEstimate: Math.round(this.playerAdapter.getBandwidthEstimate() || 0).toString(), drcEnabled: currentFormat?.isDrc ?? false, enabledTrackTypesBitfield: currentFormat.width ? EnabledTrackTypes.VIDEO_ONLY : EnabledTrackTypes.AUDIO_ONLY, audioTrackId: currentFormat.audioTrackId @@ -428,12 +427,12 @@ export class SabrStreamingAdapter { return { formatId: format, durationMs: MAX_INT32_VALUE, - startTimeMs: 0, - startSegmentIndex: MAX_INT32_VALUE, - endSegmentIndex: MAX_INT32_VALUE, + startTimeMs: '0', + startSegmentIndex: Number(MAX_INT32_VALUE), + endSegmentIndex: Number(MAX_INT32_VALUE), timeRange: { durationTicks: MAX_INT32_VALUE, - startTicks: 0, + startTicks: '0', timescale: 1000 } }; @@ -454,11 +453,11 @@ export class SabrStreamingAdapter { formatId, startSegmentIndex: startSequenceNumber, durationMs, - startTimeMs: 0, + startTimeMs: '0', endSegmentIndex: endSequenceNumber, timeRange: { timescale, - startTicks: 0, + startTicks: '0', durationTicks: durationMs } }; @@ -581,8 +580,8 @@ export class SabrStreamingAdapter { formatId: streamInfo.mediaHeader.formatId!, startSequenceNumber: streamInfo.mediaHeader.sequenceNumber || 1, endSequenceNumber: streamInfo.mediaHeader.sequenceNumber || 1, - startTimeMs: streamInfo.mediaHeader.startMs || 0, - durationMs: streamInfo.mediaHeader.durationMs || 0, + startTimeMs: streamInfo.mediaHeader.startMs || '0', + durationMs: streamInfo.mediaHeader.durationMs || '0', timescale: streamInfo.mediaHeader.timeRange?.timescale || 1000 }; diff --git a/src/types/shared.ts b/src/types/shared.ts index 78dbc26..e643650 100644 --- a/src/types/shared.ts +++ b/src/types/shared.ts @@ -13,7 +13,7 @@ export type Part = { export interface SabrFormat { itag: number; - lastModified: number; + lastModified: string; xtags?: string; width?: number; height?: number; diff --git a/src/utils/formatKeyUtils.ts b/src/utils/formatKeyUtils.ts index 5a2831f..2c0f479 100644 --- a/src/utils/formatKeyUtils.ts +++ b/src/utils/formatKeyUtils.ts @@ -67,7 +67,7 @@ export function createSegmentCacheKeyFromMetadata( const pseudoMediaHeader = { itag: requestMetadata.format.itag, xtags: requestMetadata.format.xtags || '', - startRange: requestMetadata.byteRange.start, + startRange: requestMetadata.byteRange.start.toString(), isInitSeg: requestMetadata.isInit }; diff --git a/src/utils/sabrStreamUtils.ts b/src/utils/sabrStreamUtils.ts index 7c351af..f68b4af 100644 --- a/src/utils/sabrStreamUtils.ts +++ b/src/utils/sabrStreamUtils.ts @@ -17,7 +17,7 @@ export function getTotalDownloadedDuration( initializedFormat: InitializedFormat ): number { return Array.from(initializedFormat.downloadedSegments.values()) - .reduce((sum, segment) => sum + (segment.durationMs || 0), 0); + .reduce((sum, segment) => sum + (parseInt(segment.durationMs || '0')), 0); } /** diff --git a/src/utils/shared.ts b/src/utils/shared.ts index 4873aea..8f05a25 100644 --- a/src/utils/shared.ts +++ b/src/utils/shared.ts @@ -1,6 +1,6 @@ import type { FormatStream, SabrFormat } from '../types/shared.js'; -export const MAX_INT32_VALUE = 2147483647; +export const MAX_INT32_VALUE = '2147483647'; export enum EnabledTrackTypes { VIDEO_AND_AUDIO = 0, @@ -104,7 +104,7 @@ export function concatenateChunks(chunks: Uint8Array[]): Uint8Array { export function buildSabrFormat(formatStream: FormatStream): SabrFormat { return { itag: formatStream.itag, - lastModified: parseInt(formatStream.last_modified_ms || formatStream.lastModified || '0'), + lastModified: formatStream.last_modified_ms || formatStream.lastModified || '0', xtags: formatStream.xtags, width: formatStream.width, height: formatStream.height,