From 125654457e8a8e5a8992d3a1fdeb835331da22fe Mon Sep 17 00:00:00 2001 From: Luan Date: Wed, 25 Sep 2024 14:36:16 -0300 Subject: [PATCH] chore: update protos x2 --- examples/onesie-request/main.ts | 4 +- .../generated/video_streaming/media_info.ts | 181 ++++++++++-------- .../video_playback_abr_request.ts | 164 ++++++++-------- protos/video_streaming/media_info.proto | 19 +- .../video_playback_abr_request.proto | 18 +- src/core/ServerAbrStream.ts | 20 +- src/utils/types.ts | 4 +- 7 files changed, 219 insertions(+), 191 deletions(-) diff --git a/examples/onesie-request/main.ts b/examples/onesie-request/main.ts index 397d37c..c2a3e54 100644 --- a/examples/onesie-request/main.ts +++ b/examples/onesie-request/main.ts @@ -81,9 +81,7 @@ const body = Protos.OnesieInnertubeRequest.encode({ timeSinceLastManualFormatSelectionMs: 0, lastManualDirection: 0, quality: QUALITY.HD720, - maxWidth: 640, - maxHeight: 360, - iea: 720, + selectedQualityHeight: QUALITY.HD720, startTimeMs: 0, visibility: 0 }, diff --git a/protos/generated/video_streaming/media_info.ts b/protos/generated/video_streaming/media_info.ts index 588039f..73bb599 100644 --- a/protos/generated/video_streaming/media_info.ts +++ b/protos/generated/video_streaming/media_info.ts @@ -17,36 +17,37 @@ export interface MediaInfo { detailedNetworkType?: number | undefined; maxWidth?: number | undefined; maxHeight?: number | undefined; - iea?: number | undefined; + selectedQualityHeight?: number | undefined; r7?: number | undefined; startTimeMs?: number | undefined; timeSinceLastSeek?: number | undefined; visibility?: number | undefined; - d8?: number | undefined; + timeSinceLastReq?: number | undefined; mediaCapabilities?: MediaCapabilities | undefined; - lact?: + timeSinceLastAction?: | number | undefined; /** optional int32 Gw = 40; */ mediaType?: MediaInfo_MediaType | undefined; playerState?: number | undefined; - a8?: boolean | undefined; + rangeCompression?: boolean | undefined; Jda?: number | undefined; qw?: number | undefined; Ky?: number | undefined; - Eq?: number | undefined; + sabrReportRequestCancellationInfo?: number | undefined; l?: boolean | undefined; G7?: number | undefined; - No?: boolean | undefined; + preferVp9?: boolean | undefined; qj?: number | undefined; Hx?: number | undefined; isPrefetch?: boolean | undefined; - Iz?: number | undefined; + sabrSupportQualityConstraints?: number | undefined; sabrLicenseConstraint?: Uint8Array | undefined; allowProximaLiveLatency?: number | undefined; sabrForceProxima?: number | undefined; Tqb?: number | undefined; - c?: number | undefined; + sabrForceMaxNetworkInterruptionDurationMs?: number | undefined; + playbackRate?: number | undefined; } export enum MediaInfo_MediaType { @@ -102,33 +103,34 @@ function createBaseMediaInfo(): MediaInfo { detailedNetworkType: 0, maxWidth: 0, maxHeight: 0, - iea: 0, + selectedQualityHeight: 0, r7: 0, startTimeMs: 0, timeSinceLastSeek: 0, visibility: 0, - d8: 0, + timeSinceLastReq: 0, mediaCapabilities: undefined, - lact: 0, + timeSinceLastAction: 0, mediaType: 0, playerState: 0, - a8: false, + rangeCompression: false, Jda: 0, qw: 0, Ky: 0, - Eq: 0, + sabrReportRequestCancellationInfo: 0, l: false, G7: 0, - No: false, + preferVp9: false, qj: 0, Hx: 0, isPrefetch: false, - Iz: 0, + sabrSupportQualityConstraints: 0, sabrLicenseConstraint: new Uint8Array(0), allowProximaLiveLatency: 0, sabrForceProxima: 0, Tqb: 0, - c: 0, + sabrForceMaxNetworkInterruptionDurationMs: 0, + playbackRate: 0, }; } @@ -154,8 +156,8 @@ export const MediaInfo: MessageFns = { if (message.maxHeight !== undefined && message.maxHeight !== 0) { writer.uint32(152).int32(message.maxHeight); } - if (message.iea !== undefined && message.iea !== 0) { - writer.uint32(168).int32(message.iea); + if (message.selectedQualityHeight !== undefined && message.selectedQualityHeight !== 0) { + writer.uint32(168).int32(message.selectedQualityHeight); } if (message.r7 !== undefined && message.r7 !== 0) { writer.uint32(184).int32(message.r7); @@ -169,23 +171,23 @@ export const MediaInfo: MessageFns = { if (message.visibility !== undefined && message.visibility !== 0) { writer.uint32(272).int32(message.visibility); } - if (message.d8 !== undefined && message.d8 !== 0) { - writer.uint32(288).int64(message.d8); + if (message.timeSinceLastReq !== undefined && message.timeSinceLastReq !== 0) { + writer.uint32(288).int64(message.timeSinceLastReq); } if (message.mediaCapabilities !== undefined) { MediaCapabilities.encode(message.mediaCapabilities, writer.uint32(306).fork()).join(); } - if (message.lact !== undefined && message.lact !== 0) { - writer.uint32(312).int32(message.lact); + if (message.timeSinceLastAction !== undefined && message.timeSinceLastAction !== 0) { + writer.uint32(312).int64(message.timeSinceLastAction); } if (message.mediaType !== undefined && message.mediaType !== 0) { writer.uint32(320).int32(message.mediaType); } if (message.playerState !== undefined && message.playerState !== 0) { - writer.uint32(352).int32(message.playerState); + writer.uint32(352).int64(message.playerState); } - if (message.a8 !== undefined && message.a8 !== false) { - writer.uint32(368).bool(message.a8); + if (message.rangeCompression !== undefined && message.rangeCompression !== false) { + writer.uint32(368).bool(message.rangeCompression); } if (message.Jda !== undefined && message.Jda !== 0) { writer.uint32(384).int32(message.Jda); @@ -196,17 +198,17 @@ export const MediaInfo: MessageFns = { if (message.Ky !== undefined && message.Ky !== 0) { writer.uint32(408).int32(message.Ky); } - if (message.Eq !== undefined && message.Eq !== 0) { - writer.uint32(432).int32(message.Eq); + if (message.sabrReportRequestCancellationInfo !== undefined && message.sabrReportRequestCancellationInfo !== 0) { + writer.uint32(432).int32(message.sabrReportRequestCancellationInfo); } if (message.l !== undefined && message.l !== false) { writer.uint32(448).bool(message.l); } if (message.G7 !== undefined && message.G7 !== 0) { - writer.uint32(456).int32(message.G7); + writer.uint32(456).int64(message.G7); } - if (message.No !== undefined && message.No !== false) { - writer.uint32(464).bool(message.No); + if (message.preferVp9 !== undefined && message.preferVp9 !== false) { + writer.uint32(464).bool(message.preferVp9); } if (message.qj !== undefined && message.qj !== 0) { writer.uint32(472).int32(message.qj); @@ -217,8 +219,8 @@ export const MediaInfo: MessageFns = { if (message.isPrefetch !== undefined && message.isPrefetch !== false) { writer.uint32(488).bool(message.isPrefetch); } - if (message.Iz !== undefined && message.Iz !== 0) { - writer.uint32(496).int32(message.Iz); + if (message.sabrSupportQualityConstraints !== undefined && message.sabrSupportQualityConstraints !== 0) { + writer.uint32(496).int32(message.sabrSupportQualityConstraints); } if (message.sabrLicenseConstraint !== undefined && message.sabrLicenseConstraint.length !== 0) { writer.uint32(506).bytes(message.sabrLicenseConstraint); @@ -232,8 +234,14 @@ export const MediaInfo: MessageFns = { if (message.Tqb !== undefined && message.Tqb !== 0) { writer.uint32(536).int32(message.Tqb); } - if (message.c !== undefined && message.c !== 0) { - writer.uint32(544).int32(message.c); + if ( + message.sabrForceMaxNetworkInterruptionDurationMs !== undefined && + message.sabrForceMaxNetworkInterruptionDurationMs !== 0 + ) { + writer.uint32(544).int64(message.sabrForceMaxNetworkInterruptionDurationMs); + } + if (message.playbackRate !== undefined && message.playbackRate !== 0) { + writer.uint32(2285).float(message.playbackRate); } return writer; }, @@ -292,7 +300,7 @@ export const MediaInfo: MessageFns = { break; } - message.iea = reader.int32(); + message.selectedQualityHeight = reader.int32(); continue; case 23: if (tag !== 184) { @@ -327,7 +335,7 @@ export const MediaInfo: MessageFns = { break; } - message.d8 = longToNumber(reader.int64()); + message.timeSinceLastReq = longToNumber(reader.int64()); continue; case 38: if (tag !== 306) { @@ -341,7 +349,7 @@ export const MediaInfo: MessageFns = { break; } - message.lact = reader.int32(); + message.timeSinceLastAction = longToNumber(reader.int64()); continue; case 40: if (tag !== 320) { @@ -355,14 +363,14 @@ export const MediaInfo: MessageFns = { break; } - message.playerState = reader.int32(); + message.playerState = longToNumber(reader.int64()); continue; case 46: if (tag !== 368) { break; } - message.a8 = reader.bool(); + message.rangeCompression = reader.bool(); continue; case 48: if (tag !== 384) { @@ -390,7 +398,7 @@ export const MediaInfo: MessageFns = { break; } - message.Eq = reader.int32(); + message.sabrReportRequestCancellationInfo = reader.int32(); continue; case 56: if (tag !== 448) { @@ -404,14 +412,14 @@ export const MediaInfo: MessageFns = { break; } - message.G7 = reader.int32(); + message.G7 = longToNumber(reader.int64()); continue; case 58: if (tag !== 464) { break; } - message.No = reader.bool(); + message.preferVp9 = reader.bool(); continue; case 59: if (tag !== 472) { @@ -439,7 +447,7 @@ export const MediaInfo: MessageFns = { break; } - message.Iz = reader.int32(); + message.sabrSupportQualityConstraints = reader.int32(); continue; case 63: if (tag !== 506) { @@ -474,7 +482,14 @@ export const MediaInfo: MessageFns = { break; } - message.c = reader.int32(); + message.sabrForceMaxNetworkInterruptionDurationMs = longToNumber(reader.int64()); + continue; + case 285: + if (tag !== 2285) { + break; + } + + message.playbackRate = reader.float(); continue; } if ((tag & 7) === 4 || tag === 0) { @@ -495,30 +510,34 @@ export const MediaInfo: MessageFns = { detailedNetworkType: isSet(object.detailedNetworkType) ? globalThis.Number(object.detailedNetworkType) : 0, maxWidth: isSet(object.maxWidth) ? globalThis.Number(object.maxWidth) : 0, maxHeight: isSet(object.maxHeight) ? globalThis.Number(object.maxHeight) : 0, - iea: isSet(object.iea) ? globalThis.Number(object.iea) : 0, + selectedQualityHeight: isSet(object.selectedQualityHeight) ? globalThis.Number(object.selectedQualityHeight) : 0, r7: isSet(object.r7) ? globalThis.Number(object.r7) : 0, startTimeMs: isSet(object.startTimeMs) ? globalThis.Number(object.startTimeMs) : 0, timeSinceLastSeek: isSet(object.timeSinceLastSeek) ? globalThis.Number(object.timeSinceLastSeek) : 0, visibility: isSet(object.visibility) ? globalThis.Number(object.visibility) : 0, - d8: isSet(object.d8) ? globalThis.Number(object.d8) : 0, + timeSinceLastReq: isSet(object.timeSinceLastReq) ? globalThis.Number(object.timeSinceLastReq) : 0, mediaCapabilities: isSet(object.mediaCapabilities) ? MediaCapabilities.fromJSON(object.mediaCapabilities) : undefined, - lact: isSet(object.lact) ? globalThis.Number(object.lact) : 0, + timeSinceLastAction: isSet(object.timeSinceLastAction) ? globalThis.Number(object.timeSinceLastAction) : 0, mediaType: isSet(object.mediaType) ? mediaInfo_MediaTypeFromJSON(object.mediaType) : 0, playerState: isSet(object.playerState) ? globalThis.Number(object.playerState) : 0, - a8: isSet(object.a8) ? globalThis.Boolean(object.a8) : false, + rangeCompression: isSet(object.rangeCompression) ? globalThis.Boolean(object.rangeCompression) : false, Jda: isSet(object.Jda) ? globalThis.Number(object.Jda) : 0, qw: isSet(object.qw) ? globalThis.Number(object.qw) : 0, Ky: isSet(object.Ky) ? globalThis.Number(object.Ky) : 0, - Eq: isSet(object.Eq) ? globalThis.Number(object.Eq) : 0, + sabrReportRequestCancellationInfo: isSet(object.sabrReportRequestCancellationInfo) + ? globalThis.Number(object.sabrReportRequestCancellationInfo) + : 0, l: isSet(object.l) ? globalThis.Boolean(object.l) : false, G7: isSet(object.G7) ? globalThis.Number(object.G7) : 0, - No: isSet(object.No) ? globalThis.Boolean(object.No) : false, + preferVp9: isSet(object.preferVp9) ? globalThis.Boolean(object.preferVp9) : false, qj: isSet(object.qj) ? globalThis.Number(object.qj) : 0, Hx: isSet(object.Hx) ? globalThis.Number(object.Hx) : 0, isPrefetch: isSet(object.isPrefetch) ? globalThis.Boolean(object.isPrefetch) : false, - Iz: isSet(object.Iz) ? globalThis.Number(object.Iz) : 0, + sabrSupportQualityConstraints: isSet(object.sabrSupportQualityConstraints) + ? globalThis.Number(object.sabrSupportQualityConstraints) + : 0, sabrLicenseConstraint: isSet(object.sabrLicenseConstraint) ? bytesFromBase64(object.sabrLicenseConstraint) : new Uint8Array(0), @@ -527,7 +546,10 @@ export const MediaInfo: MessageFns = { : 0, sabrForceProxima: isSet(object.sabrForceProxima) ? globalThis.Number(object.sabrForceProxima) : 0, Tqb: isSet(object.Tqb) ? globalThis.Number(object.Tqb) : 0, - c: isSet(object.c) ? globalThis.Number(object.c) : 0, + sabrForceMaxNetworkInterruptionDurationMs: isSet(object.sabrForceMaxNetworkInterruptionDurationMs) + ? globalThis.Number(object.sabrForceMaxNetworkInterruptionDurationMs) + : 0, + playbackRate: isSet(object.playbackRate) ? globalThis.Number(object.playbackRate) : 0, }; }, @@ -553,8 +575,8 @@ export const MediaInfo: MessageFns = { if (message.maxHeight !== undefined && message.maxHeight !== 0) { obj.maxHeight = Math.round(message.maxHeight); } - if (message.iea !== undefined && message.iea !== 0) { - obj.iea = Math.round(message.iea); + if (message.selectedQualityHeight !== undefined && message.selectedQualityHeight !== 0) { + obj.selectedQualityHeight = Math.round(message.selectedQualityHeight); } if (message.r7 !== undefined && message.r7 !== 0) { obj.r7 = Math.round(message.r7); @@ -568,14 +590,14 @@ export const MediaInfo: MessageFns = { if (message.visibility !== undefined && message.visibility !== 0) { obj.visibility = Math.round(message.visibility); } - if (message.d8 !== undefined && message.d8 !== 0) { - obj.d8 = Math.round(message.d8); + if (message.timeSinceLastReq !== undefined && message.timeSinceLastReq !== 0) { + obj.timeSinceLastReq = Math.round(message.timeSinceLastReq); } if (message.mediaCapabilities !== undefined) { obj.mediaCapabilities = MediaCapabilities.toJSON(message.mediaCapabilities); } - if (message.lact !== undefined && message.lact !== 0) { - obj.lact = Math.round(message.lact); + if (message.timeSinceLastAction !== undefined && message.timeSinceLastAction !== 0) { + obj.timeSinceLastAction = Math.round(message.timeSinceLastAction); } if (message.mediaType !== undefined && message.mediaType !== 0) { obj.mediaType = mediaInfo_MediaTypeToJSON(message.mediaType); @@ -583,8 +605,8 @@ export const MediaInfo: MessageFns = { if (message.playerState !== undefined && message.playerState !== 0) { obj.playerState = Math.round(message.playerState); } - if (message.a8 !== undefined && message.a8 !== false) { - obj.a8 = message.a8; + if (message.rangeCompression !== undefined && message.rangeCompression !== false) { + obj.rangeCompression = message.rangeCompression; } if (message.Jda !== undefined && message.Jda !== 0) { obj.Jda = Math.round(message.Jda); @@ -595,8 +617,8 @@ export const MediaInfo: MessageFns = { if (message.Ky !== undefined && message.Ky !== 0) { obj.Ky = Math.round(message.Ky); } - if (message.Eq !== undefined && message.Eq !== 0) { - obj.Eq = Math.round(message.Eq); + if (message.sabrReportRequestCancellationInfo !== undefined && message.sabrReportRequestCancellationInfo !== 0) { + obj.sabrReportRequestCancellationInfo = Math.round(message.sabrReportRequestCancellationInfo); } if (message.l !== undefined && message.l !== false) { obj.l = message.l; @@ -604,8 +626,8 @@ export const MediaInfo: MessageFns = { if (message.G7 !== undefined && message.G7 !== 0) { obj.G7 = Math.round(message.G7); } - if (message.No !== undefined && message.No !== false) { - obj.No = message.No; + if (message.preferVp9 !== undefined && message.preferVp9 !== false) { + obj.preferVp9 = message.preferVp9; } if (message.qj !== undefined && message.qj !== 0) { obj.qj = Math.round(message.qj); @@ -616,8 +638,8 @@ export const MediaInfo: MessageFns = { if (message.isPrefetch !== undefined && message.isPrefetch !== false) { obj.isPrefetch = message.isPrefetch; } - if (message.Iz !== undefined && message.Iz !== 0) { - obj.Iz = Math.round(message.Iz); + if (message.sabrSupportQualityConstraints !== undefined && message.sabrSupportQualityConstraints !== 0) { + obj.sabrSupportQualityConstraints = Math.round(message.sabrSupportQualityConstraints); } if (message.sabrLicenseConstraint !== undefined && message.sabrLicenseConstraint.length !== 0) { obj.sabrLicenseConstraint = base64FromBytes(message.sabrLicenseConstraint); @@ -631,8 +653,14 @@ export const MediaInfo: MessageFns = { if (message.Tqb !== undefined && message.Tqb !== 0) { obj.Tqb = Math.round(message.Tqb); } - if (message.c !== undefined && message.c !== 0) { - obj.c = Math.round(message.c); + if ( + message.sabrForceMaxNetworkInterruptionDurationMs !== undefined && + message.sabrForceMaxNetworkInterruptionDurationMs !== 0 + ) { + obj.sabrForceMaxNetworkInterruptionDurationMs = Math.round(message.sabrForceMaxNetworkInterruptionDurationMs); + } + if (message.playbackRate !== undefined && message.playbackRate !== 0) { + obj.playbackRate = message.playbackRate; } return obj; }, @@ -648,35 +676,36 @@ export const MediaInfo: MessageFns = { message.detailedNetworkType = object.detailedNetworkType ?? 0; message.maxWidth = object.maxWidth ?? 0; message.maxHeight = object.maxHeight ?? 0; - message.iea = object.iea ?? 0; + message.selectedQualityHeight = object.selectedQualityHeight ?? 0; message.r7 = object.r7 ?? 0; message.startTimeMs = object.startTimeMs ?? 0; message.timeSinceLastSeek = object.timeSinceLastSeek ?? 0; message.visibility = object.visibility ?? 0; - message.d8 = object.d8 ?? 0; + message.timeSinceLastReq = object.timeSinceLastReq ?? 0; message.mediaCapabilities = (object.mediaCapabilities !== undefined && object.mediaCapabilities !== null) ? MediaCapabilities.fromPartial(object.mediaCapabilities) : undefined; - message.lact = object.lact ?? 0; + message.timeSinceLastAction = object.timeSinceLastAction ?? 0; message.mediaType = object.mediaType ?? 0; message.playerState = object.playerState ?? 0; - message.a8 = object.a8 ?? false; + message.rangeCompression = object.rangeCompression ?? false; message.Jda = object.Jda ?? 0; message.qw = object.qw ?? 0; message.Ky = object.Ky ?? 0; - message.Eq = object.Eq ?? 0; + message.sabrReportRequestCancellationInfo = object.sabrReportRequestCancellationInfo ?? 0; message.l = object.l ?? false; message.G7 = object.G7 ?? 0; - message.No = object.No ?? false; + message.preferVp9 = object.preferVp9 ?? false; message.qj = object.qj ?? 0; message.Hx = object.Hx ?? 0; message.isPrefetch = object.isPrefetch ?? false; - message.Iz = object.Iz ?? 0; + message.sabrSupportQualityConstraints = object.sabrSupportQualityConstraints ?? 0; message.sabrLicenseConstraint = object.sabrLicenseConstraint ?? new Uint8Array(0); message.allowProximaLiveLatency = object.allowProximaLiveLatency ?? 0; message.sabrForceProxima = object.sabrForceProxima ?? 0; message.Tqb = object.Tqb ?? 0; - message.c = object.c ?? 0; + message.sabrForceMaxNetworkInterruptionDurationMs = object.sabrForceMaxNetworkInterruptionDurationMs ?? 0; + message.playbackRate = object.playbackRate ?? 0; return message; }, }; diff --git a/protos/generated/video_streaming/video_playback_abr_request.ts b/protos/generated/video_streaming/video_playback_abr_request.ts index d8e0a8a..7525aa0 100644 --- a/protos/generated/video_streaming/video_playback_abr_request.ts +++ b/protos/generated/video_streaming/video_playback_abr_request.ts @@ -15,12 +15,12 @@ export const protobufPackage = "video_streaming"; export interface VideoPlaybackAbrRequest { mediaInfo?: MediaInfo | undefined; - formatIds: FormatId[]; - ud: Zpa[]; + selectedFormats: FormatId[]; + bufferedRange: BufferedRange[]; videoPlaybackUstreamerConfig?: Uint8Array | undefined; lo?: Lo | undefined; - audioFormatIds: FormatId[]; - videoFormatIds: FormatId[]; + audioFormats: FormatId[]; + videoFormats: FormatId[]; streamerContext?: StreamerContext | undefined; field21?: OQa | undefined; field22?: number | undefined; @@ -57,12 +57,12 @@ export interface YPa { field3?: number | undefined; } -export interface Zpa { +export interface BufferedRange { formatId: FormatId | undefined; startTimeMs: number; durationMs: number; - field4: number; - sequenceNumber: number; + startSegmentIndex: number; + endSegmentIndex: number; timeRange?: TimeRange | undefined; field9?: Kob | undefined; field11?: YPa | undefined; @@ -79,20 +79,20 @@ export interface OQa { } export interface Pqa { - formatIds: FormatId[]; - ud: Zpa[]; + formats: FormatId[]; + ud: BufferedRange[]; clipId?: string | undefined; } function createBaseVideoPlaybackAbrRequest(): VideoPlaybackAbrRequest { return { mediaInfo: undefined, - formatIds: [], - ud: [], + selectedFormats: [], + bufferedRange: [], videoPlaybackUstreamerConfig: new Uint8Array(0), lo: undefined, - audioFormatIds: [], - videoFormatIds: [], + audioFormats: [], + videoFormats: [], streamerContext: undefined, field21: undefined, field22: 0, @@ -106,11 +106,11 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.mediaInfo !== undefined) { MediaInfo.encode(message.mediaInfo, writer.uint32(10).fork()).join(); } - for (const v of message.formatIds) { + for (const v of message.selectedFormats) { FormatId.encode(v!, writer.uint32(18).fork()).join(); } - for (const v of message.ud) { - Zpa.encode(v!, writer.uint32(26).fork()).join(); + for (const v of message.bufferedRange) { + BufferedRange.encode(v!, writer.uint32(26).fork()).join(); } if (message.videoPlaybackUstreamerConfig !== undefined && message.videoPlaybackUstreamerConfig.length !== 0) { writer.uint32(42).bytes(message.videoPlaybackUstreamerConfig); @@ -118,10 +118,10 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.lo !== undefined) { Lo.encode(message.lo, writer.uint32(50).fork()).join(); } - for (const v of message.audioFormatIds) { + for (const v of message.audioFormats) { FormatId.encode(v!, writer.uint32(130).fork()).join(); } - for (const v of message.videoFormatIds) { + for (const v of message.videoFormats) { FormatId.encode(v!, writer.uint32(138).fork()).join(); } if (message.streamerContext !== undefined) { @@ -161,14 +161,14 @@ export const VideoPlaybackAbrRequest: MessageFns = { break; } - message.formatIds.push(FormatId.decode(reader, reader.uint32())); + message.selectedFormats.push(FormatId.decode(reader, reader.uint32())); continue; case 3: if (tag !== 26) { break; } - message.ud.push(Zpa.decode(reader, reader.uint32())); + message.bufferedRange.push(BufferedRange.decode(reader, reader.uint32())); continue; case 5: if (tag !== 42) { @@ -189,14 +189,14 @@ export const VideoPlaybackAbrRequest: MessageFns = { break; } - message.audioFormatIds.push(FormatId.decode(reader, reader.uint32())); + message.audioFormats.push(FormatId.decode(reader, reader.uint32())); continue; case 17: if (tag !== 138) { break; } - message.videoFormatIds.push(FormatId.decode(reader, reader.uint32())); + message.videoFormats.push(FormatId.decode(reader, reader.uint32())); continue; case 19: if (tag !== 154) { @@ -245,19 +245,21 @@ export const VideoPlaybackAbrRequest: MessageFns = { fromJSON(object: any): VideoPlaybackAbrRequest { return { mediaInfo: isSet(object.mediaInfo) ? MediaInfo.fromJSON(object.mediaInfo) : undefined, - formatIds: globalThis.Array.isArray(object?.formatIds) - ? object.formatIds.map((e: any) => FormatId.fromJSON(e)) + selectedFormats: globalThis.Array.isArray(object?.selectedFormats) + ? object.selectedFormats.map((e: any) => FormatId.fromJSON(e)) + : [], + bufferedRange: globalThis.Array.isArray(object?.bufferedRange) + ? object.bufferedRange.map((e: any) => BufferedRange.fromJSON(e)) : [], - ud: globalThis.Array.isArray(object?.ud) ? object.ud.map((e: any) => Zpa.fromJSON(e)) : [], videoPlaybackUstreamerConfig: isSet(object.videoPlaybackUstreamerConfig) ? bytesFromBase64(object.videoPlaybackUstreamerConfig) : new Uint8Array(0), lo: isSet(object.lo) ? Lo.fromJSON(object.lo) : undefined, - audioFormatIds: globalThis.Array.isArray(object?.audioFormatIds) - ? object.audioFormatIds.map((e: any) => FormatId.fromJSON(e)) + audioFormats: globalThis.Array.isArray(object?.audioFormats) + ? object.audioFormats.map((e: any) => FormatId.fromJSON(e)) : [], - videoFormatIds: globalThis.Array.isArray(object?.videoFormatIds) - ? object.videoFormatIds.map((e: any) => FormatId.fromJSON(e)) + videoFormats: globalThis.Array.isArray(object?.videoFormats) + ? object.videoFormats.map((e: any) => FormatId.fromJSON(e)) : [], streamerContext: isSet(object.streamerContext) ? StreamerContext.fromJSON(object.streamerContext) : undefined, field21: isSet(object.field21) ? OQa.fromJSON(object.field21) : undefined, @@ -272,11 +274,11 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.mediaInfo !== undefined) { obj.mediaInfo = MediaInfo.toJSON(message.mediaInfo); } - if (message.formatIds?.length) { - obj.formatIds = message.formatIds.map((e) => FormatId.toJSON(e)); + if (message.selectedFormats?.length) { + obj.selectedFormats = message.selectedFormats.map((e) => FormatId.toJSON(e)); } - if (message.ud?.length) { - obj.ud = message.ud.map((e) => Zpa.toJSON(e)); + if (message.bufferedRange?.length) { + obj.bufferedRange = message.bufferedRange.map((e) => BufferedRange.toJSON(e)); } if (message.videoPlaybackUstreamerConfig !== undefined && message.videoPlaybackUstreamerConfig.length !== 0) { obj.videoPlaybackUstreamerConfig = base64FromBytes(message.videoPlaybackUstreamerConfig); @@ -284,11 +286,11 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.lo !== undefined) { obj.lo = Lo.toJSON(message.lo); } - if (message.audioFormatIds?.length) { - obj.audioFormatIds = message.audioFormatIds.map((e) => FormatId.toJSON(e)); + if (message.audioFormats?.length) { + obj.audioFormats = message.audioFormats.map((e) => FormatId.toJSON(e)); } - if (message.videoFormatIds?.length) { - obj.videoFormatIds = message.videoFormatIds.map((e) => FormatId.toJSON(e)); + if (message.videoFormats?.length) { + obj.videoFormats = message.videoFormats.map((e) => FormatId.toJSON(e)); } if (message.streamerContext !== undefined) { obj.streamerContext = StreamerContext.toJSON(message.streamerContext); @@ -316,12 +318,12 @@ export const VideoPlaybackAbrRequest: MessageFns = { message.mediaInfo = (object.mediaInfo !== undefined && object.mediaInfo !== null) ? MediaInfo.fromPartial(object.mediaInfo) : undefined; - message.formatIds = object.formatIds?.map((e) => FormatId.fromPartial(e)) || []; - message.ud = object.ud?.map((e) => Zpa.fromPartial(e)) || []; + message.selectedFormats = object.selectedFormats?.map((e) => FormatId.fromPartial(e)) || []; + message.bufferedRange = object.bufferedRange?.map((e) => BufferedRange.fromPartial(e)) || []; message.videoPlaybackUstreamerConfig = object.videoPlaybackUstreamerConfig ?? new Uint8Array(0); message.lo = (object.lo !== undefined && object.lo !== null) ? Lo.fromPartial(object.lo) : undefined; - message.audioFormatIds = object.audioFormatIds?.map((e) => FormatId.fromPartial(e)) || []; - message.videoFormatIds = object.videoFormatIds?.map((e) => FormatId.fromPartial(e)) || []; + message.audioFormats = object.audioFormats?.map((e) => FormatId.fromPartial(e)) || []; + message.videoFormats = object.videoFormats?.map((e) => FormatId.fromPartial(e)) || []; message.streamerContext = (object.streamerContext !== undefined && object.streamerContext !== null) ? StreamerContext.fromPartial(object.streamerContext) : undefined; @@ -767,13 +769,13 @@ export const YPa: MessageFns = { }, }; -function createBaseZpa(): Zpa { +function createBaseBufferedRange(): BufferedRange { return { formatId: undefined, startTimeMs: 0, durationMs: 0, - field4: 0, - sequenceNumber: 0, + startSegmentIndex: 0, + endSegmentIndex: 0, timeRange: undefined, field9: undefined, field11: undefined, @@ -781,8 +783,8 @@ function createBaseZpa(): Zpa { }; } -export const Zpa: MessageFns = { - encode(message: Zpa, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { +export const BufferedRange: MessageFns = { + encode(message: BufferedRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.formatId !== undefined) { FormatId.encode(message.formatId, writer.uint32(10).fork()).join(); } @@ -792,11 +794,11 @@ export const Zpa: MessageFns = { if (message.durationMs !== 0) { writer.uint32(24).int64(message.durationMs); } - if (message.field4 !== 0) { - writer.uint32(32).int32(message.field4); + if (message.startSegmentIndex !== 0) { + writer.uint32(32).int32(message.startSegmentIndex); } - if (message.sequenceNumber !== 0) { - writer.uint32(40).int32(message.sequenceNumber); + if (message.endSegmentIndex !== 0) { + writer.uint32(40).int32(message.endSegmentIndex); } if (message.timeRange !== undefined) { TimeRange.encode(message.timeRange, writer.uint32(50).fork()).join(); @@ -813,10 +815,10 @@ export const Zpa: MessageFns = { return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): Zpa { + decode(input: BinaryReader | Uint8Array, length?: number): BufferedRange { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseZpa(); + const message = createBaseBufferedRange(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -846,14 +848,14 @@ export const Zpa: MessageFns = { break; } - message.field4 = reader.int32(); + message.startSegmentIndex = reader.int32(); continue; case 5: if (tag !== 40) { break; } - message.sequenceNumber = reader.int32(); + message.endSegmentIndex = reader.int32(); continue; case 6: if (tag !== 50) { @@ -892,13 +894,13 @@ export const Zpa: MessageFns = { return message; }, - fromJSON(object: any): Zpa { + fromJSON(object: any): BufferedRange { return { formatId: isSet(object.formatId) ? FormatId.fromJSON(object.formatId) : undefined, startTimeMs: isSet(object.startTimeMs) ? globalThis.Number(object.startTimeMs) : 0, durationMs: isSet(object.durationMs) ? globalThis.Number(object.durationMs) : 0, - field4: isSet(object.field4) ? globalThis.Number(object.field4) : 0, - sequenceNumber: isSet(object.sequenceNumber) ? globalThis.Number(object.sequenceNumber) : 0, + startSegmentIndex: isSet(object.startSegmentIndex) ? globalThis.Number(object.startSegmentIndex) : 0, + endSegmentIndex: isSet(object.endSegmentIndex) ? globalThis.Number(object.endSegmentIndex) : 0, timeRange: isSet(object.timeRange) ? TimeRange.fromJSON(object.timeRange) : undefined, field9: isSet(object.field9) ? Kob.fromJSON(object.field9) : undefined, field11: isSet(object.field11) ? YPa.fromJSON(object.field11) : undefined, @@ -906,7 +908,7 @@ export const Zpa: MessageFns = { }; }, - toJSON(message: Zpa): unknown { + toJSON(message: BufferedRange): unknown { const obj: any = {}; if (message.formatId !== undefined) { obj.formatId = FormatId.toJSON(message.formatId); @@ -917,11 +919,11 @@ export const Zpa: MessageFns = { if (message.durationMs !== 0) { obj.durationMs = Math.round(message.durationMs); } - if (message.field4 !== 0) { - obj.field4 = Math.round(message.field4); + if (message.startSegmentIndex !== 0) { + obj.startSegmentIndex = Math.round(message.startSegmentIndex); } - if (message.sequenceNumber !== 0) { - obj.sequenceNumber = Math.round(message.sequenceNumber); + if (message.endSegmentIndex !== 0) { + obj.endSegmentIndex = Math.round(message.endSegmentIndex); } if (message.timeRange !== undefined) { obj.timeRange = TimeRange.toJSON(message.timeRange); @@ -938,18 +940,18 @@ export const Zpa: MessageFns = { return obj; }, - create, I>>(base?: I): Zpa { - return Zpa.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): BufferedRange { + return BufferedRange.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): Zpa { - const message = createBaseZpa(); + fromPartial, I>>(object: I): BufferedRange { + const message = createBaseBufferedRange(); message.formatId = (object.formatId !== undefined && object.formatId !== null) ? FormatId.fromPartial(object.formatId) : undefined; message.startTimeMs = object.startTimeMs ?? 0; message.durationMs = object.durationMs ?? 0; - message.field4 = object.field4 ?? 0; - message.sequenceNumber = object.sequenceNumber ?? 0; + message.startSegmentIndex = object.startSegmentIndex ?? 0; + message.endSegmentIndex = object.endSegmentIndex ?? 0; message.timeRange = (object.timeRange !== undefined && object.timeRange !== null) ? TimeRange.fromPartial(object.timeRange) : undefined; @@ -1101,16 +1103,16 @@ export const OQa: MessageFns = { }; function createBasePqa(): Pqa { - return { formatIds: [], ud: [], clipId: "" }; + return { formats: [], ud: [], clipId: "" }; } export const Pqa: MessageFns = { encode(message: Pqa, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - for (const v of message.formatIds) { + for (const v of message.formats) { FormatId.encode(v!, writer.uint32(10).fork()).join(); } for (const v of message.ud) { - Zpa.encode(v!, writer.uint32(18).fork()).join(); + BufferedRange.encode(v!, writer.uint32(18).fork()).join(); } if (message.clipId !== undefined && message.clipId !== "") { writer.uint32(26).string(message.clipId); @@ -1130,14 +1132,14 @@ export const Pqa: MessageFns = { break; } - message.formatIds.push(FormatId.decode(reader, reader.uint32())); + message.formats.push(FormatId.decode(reader, reader.uint32())); continue; case 2: if (tag !== 18) { break; } - message.ud.push(Zpa.decode(reader, reader.uint32())); + message.ud.push(BufferedRange.decode(reader, reader.uint32())); continue; case 3: if (tag !== 26) { @@ -1157,21 +1159,19 @@ export const Pqa: MessageFns = { fromJSON(object: any): Pqa { return { - formatIds: globalThis.Array.isArray(object?.formatIds) - ? object.formatIds.map((e: any) => FormatId.fromJSON(e)) - : [], - ud: globalThis.Array.isArray(object?.ud) ? object.ud.map((e: any) => Zpa.fromJSON(e)) : [], + formats: globalThis.Array.isArray(object?.formats) ? object.formats.map((e: any) => FormatId.fromJSON(e)) : [], + ud: globalThis.Array.isArray(object?.ud) ? object.ud.map((e: any) => BufferedRange.fromJSON(e)) : [], clipId: isSet(object.clipId) ? globalThis.String(object.clipId) : "", }; }, toJSON(message: Pqa): unknown { const obj: any = {}; - if (message.formatIds?.length) { - obj.formatIds = message.formatIds.map((e) => FormatId.toJSON(e)); + if (message.formats?.length) { + obj.formats = message.formats.map((e) => FormatId.toJSON(e)); } if (message.ud?.length) { - obj.ud = message.ud.map((e) => Zpa.toJSON(e)); + obj.ud = message.ud.map((e) => BufferedRange.toJSON(e)); } if (message.clipId !== undefined && message.clipId !== "") { obj.clipId = message.clipId; @@ -1184,8 +1184,8 @@ export const Pqa: MessageFns = { }, fromPartial, I>>(object: I): Pqa { const message = createBasePqa(); - message.formatIds = object.formatIds?.map((e) => FormatId.fromPartial(e)) || []; - message.ud = object.ud?.map((e) => Zpa.fromPartial(e)) || []; + message.formats = object.formats?.map((e) => FormatId.fromPartial(e)) || []; + message.ud = object.ud?.map((e) => BufferedRange.fromPartial(e)) || []; message.clipId = object.clipId ?? ""; return message; }, diff --git a/protos/video_streaming/media_info.proto b/protos/video_streaming/media_info.proto index 15cc16c..3a2bcc5 100644 --- a/protos/video_streaming/media_info.proto +++ b/protos/video_streaming/media_info.proto @@ -10,34 +10,35 @@ message MediaInfo { optional int32 detailed_network_type = 17; optional int32 max_width = 18; optional int32 max_height = 19; - optional int32 iea = 21; + optional int32 selected_quality_height = 21; optional int32 r7 = 23; optional int64 start_time_ms = 28; optional int64 time_since_last_seek = 29; optional int32 visibility = 34; - optional int64 d8 = 36; + optional int64 time_since_last_req = 36; optional MediaCapabilities media_capabilities = 38; - optional int32 lact = 39; + optional int64 time_since_last_action = 39; // optional int32 Gw = 40; optional MediaType media_type = 40; - optional int32 player_state = 44; - optional bool a8 = 46; + optional int64 player_state = 44; + optional bool range_compression = 46; optional int32 Jda = 48; optional int32 qw = 50; optional int32 Ky = 51; - optional int32 Eq = 54; + optional int32 sabr_report_request_cancellation_info = 54; optional bool l = 56; - optional int32 G7 = 57; - optional bool No = 58; + optional int64 G7 = 57; + optional bool prefer_vp9 = 58; optional int32 qj = 59; optional int32 Hx = 60; optional bool is_prefetch = 61; - optional int32 Iz = 62; + optional int32 sabr_support_quality_constraints = 62; optional bytes sabr_license_constraint = 63; optional int32 allow_proxima_live_latency = 64; optional int32 sabr_force_proxima = 66; optional int32 Tqb = 67; optional int64 sabr_force_max_network_interruption_duration_ms = 68; + optional float playback_rate = 285; enum MediaType { MEDIA_TYPE_DEFAULT = 0; diff --git a/protos/video_streaming/video_playback_abr_request.proto b/protos/video_streaming/video_playback_abr_request.proto index cbaf12b..3763bc0 100644 --- a/protos/video_streaming/video_playback_abr_request.proto +++ b/protos/video_streaming/video_playback_abr_request.proto @@ -8,12 +8,12 @@ import "video_streaming/streamer_context.proto"; message VideoPlaybackAbrRequest { optional MediaInfo media_info = 1; - repeated .misc.FormatId format_ids = 2; - repeated Zpa ud = 3; + repeated .misc.FormatId selected_formats = 2; + repeated BufferedRange buffered_range = 3; optional bytes video_playback_ustreamer_config = 5; optional Lo lo = 6; - repeated .misc.FormatId audio_format_ids = 16; - repeated .misc.FormatId video_format_ids = 17; + repeated .misc.FormatId audio_formats = 16; + repeated .misc.FormatId video_formats = 17; optional StreamerContext streamer_context = 19; optional OQa field21 = 21; optional int32 field22 = 22; @@ -48,12 +48,12 @@ message YPa { optional int32 field3 = 3; } -message Zpa { +message BufferedRange { required .misc.FormatId format_id = 1; required int64 start_time_ms = 2; required int64 duration_ms = 3; - required int32 field4 = 4; - required int32 sequence_number = 5; + required int32 start_segment_index = 4; + required int32 end_segment_index = 5; optional TimeRange time_range = 6; optional Kob field9 = 9; optional YPa field11 = 11; @@ -70,7 +70,7 @@ message OQa { } message Pqa { - repeated .misc.FormatId format_ids = 1; - repeated Zpa ud = 2; + repeated .misc.FormatId formats = 1; + repeated BufferedRange ud = 2; optional string clip_id = 3; } \ No newline at end of file diff --git a/src/core/ServerAbrStream.ts b/src/core/ServerAbrStream.ts index 529abab..b5447e7 100644 --- a/src/core/ServerAbrStream.ts +++ b/src/core/ServerAbrStream.ts @@ -66,7 +66,7 @@ export class ServerAbrStream extends EventEmitterLike { lastManualDirection: 0, timeSinceLastManualFormatSelectionMs: 0, quality: videoFormats.length === 1 ? firstVideoFormat?.width : DEFAULT_QUALITY, - iea: videoFormats.length === 1 ? firstVideoFormat?.width : DEFAULT_QUALITY, + selectedQualityHeight: videoFormats.length === 1 ? firstVideoFormat?.width : DEFAULT_QUALITY, startTimeMs: 0, visibility: 0, mediaType: MediaInfo_MediaType.MEDIA_TYPE_DEFAULT, @@ -126,9 +126,9 @@ export class ServerAbrStream extends EventEmitterLike { const body = VideoPlaybackAbrRequest.encode({ mediaInfo: mediaInfo, - formatIds: this.initializedFormats.map((fmt) => fmt.formatId), - audioFormatIds: audioFormatIds, - videoFormatIds: videoFormatIds, + audioFormats: audioFormatIds, + videoFormats: videoFormatIds, + selectedFormats: this.initializedFormats.map((fmt) => fmt.formatId), videoPlaybackUstreamerConfig: base64ToU8(this.videoPlaybackUstreamerConfig), streamerContext: { field5: [], @@ -142,7 +142,7 @@ export class ServerAbrStream extends EventEmitterLike { osVersion: '10.0' } }, - ud: this.initializedFormats.map((fmt) => fmt._state), + bufferedRange: this.initializedFormats.map((fmt) => fmt._state), field1000: [] }).finish(); @@ -233,8 +233,8 @@ export class ServerAbrStream extends EventEmitterLike { formatId: mediaHeader.formatId, startTimeMs: 0, durationMs: 0, - field4: 1, - sequenceNumber: 0 + startSegmentIndex: 1, + endSegmentIndex: 0 } }); @@ -269,7 +269,7 @@ export class ServerAbrStream extends EventEmitterLike { if (typeof mediaHeader.sequenceNumber === 'number') { currentFormat._state.durationMs += mediaHeader.durationMs || 0; - currentFormat._state.sequenceNumber += 1; + currentFormat._state.endSegmentIndex += 1; } } } @@ -316,8 +316,8 @@ export class ServerAbrStream extends EventEmitterLike { formatId: formatInitializationMetadata.formatId, startTimeMs: 0, durationMs: 0, - field4: 1, - sequenceNumber: 0 + startSegmentIndex: 1, + endSegmentIndex: 0 } }); diff --git a/src/utils/types.ts b/src/utils/types.ts index 8855d69..f9042f3 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -3,7 +3,7 @@ import type { SabrError } from '../../protos/generated/video_streaming/sabr_erro import type { SabrRedirect } from '../../protos/generated/video_streaming/sabr_redirect.js'; import type { StreamProtectionStatus } from '../../protos/generated/video_streaming/stream_protection_status.js'; import type { TimeRange } from '../../protos/generated/video_streaming/time_range.js'; -import type { Zpa } from '../../protos/generated/video_streaming/video_playback_abr_request.js'; +import type { BufferedRange } from '../../protos/generated/video_streaming/video_playback_abr_request.js'; import type { MediaInfo } from '../../protos/generated/video_streaming/media_info.js'; import type { ChunkedDataBuffer } from '../core/index.js'; @@ -48,7 +48,7 @@ export type InitializedFormat = { sequenceCount?: number; sequenceList: Sequence[]; mediaChunks: Uint8Array[]; - _state: Zpa; + _state: BufferedRange; } export type InitOptions = {