From 3f0ddc0555da01fc0bacee541bd8f59c4cd3cc9d Mon Sep 17 00:00:00 2001 From: Luan Date: Wed, 23 Oct 2024 09:35:50 -0300 Subject: [PATCH] chore: update protos --- examples/onesie-request/main.ts | 22 +- .../video_streaming/buffered_range.ts | 494 ++++++++++++++++ ...request.ts => encrypted_player_request.ts} | 81 ++- .../onesie_innertube_request.ts | 179 ------ .../video_streaming/onesie_player_request.ts | 168 ++++++ ..._response.ts => onesie_player_response.ts} | 61 +- .../video_streaming/onesie_request.ts | 173 ++++-- .../video_playback_abr_request.ts | 531 ++---------------- protos/video_streaming/buffered_range.proto | 32 ++ ...t.proto => encrypted_player_request.proto} | 6 +- .../onesie_innertube_request.proto | 13 - .../onesie_innertube_response.proto | 12 - .../onesie_player_request.proto | 12 + .../onesie_player_response.proto | 11 + protos/video_streaming/onesie_request.proto | 18 +- .../video_playback_abr_request.proto | 36 +- src/core/ServerAbrStream.ts | 8 +- src/utils/Protos.ts | 7 +- src/utils/types.ts | 2 +- 19 files changed, 1014 insertions(+), 852 deletions(-) create mode 100644 protos/generated/video_streaming/buffered_range.ts rename protos/generated/video_streaming/{encrypted_request.ts => encrypted_player_request.ts} (68%) delete mode 100644 protos/generated/video_streaming/onesie_innertube_request.ts create mode 100644 protos/generated/video_streaming/onesie_player_request.ts rename protos/generated/video_streaming/{onesie_innertube_response.ts => onesie_player_response.ts} (65%) create mode 100644 protos/video_streaming/buffered_range.proto rename protos/video_streaming/{encrypted_request.proto => encrypted_player_request.proto} (57%) delete mode 100644 protos/video_streaming/onesie_innertube_request.proto delete mode 100644 protos/video_streaming/onesie_innertube_response.proto create mode 100644 protos/video_streaming/onesie_player_request.proto create mode 100644 protos/video_streaming/onesie_player_response.proto diff --git a/examples/onesie-request/main.ts b/examples/onesie-request/main.ts index 60ab3be..b1e5c99 100644 --- a/examples/onesie-request/main.ts +++ b/examples/onesie-request/main.ts @@ -91,20 +91,21 @@ async function prepareOnesieRequest(args: OnesieRequestArgs): Promise = { + encode(message: BufferedRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.formatId !== undefined) { + FormatId.encode(message.formatId, writer.uint32(10).fork()).join(); + } + if (message.startTimeMs !== 0) { + writer.uint32(16).int64(message.startTimeMs); + } + if (message.durationMs !== 0) { + writer.uint32(24).int64(message.durationMs); + } + if (message.startSegmentIndex !== 0) { + writer.uint32(32).int32(message.startSegmentIndex); + } + if (message.endSegmentIndex !== 0) { + writer.uint32(40).int32(message.endSegmentIndex); + } + if (message.timeRange !== undefined) { + TimeRange.encode(message.timeRange, writer.uint32(50).fork()).join(); + } + if (message.field9 !== undefined) { + Kob.encode(message.field9, writer.uint32(74).fork()).join(); + } + if (message.field11 !== undefined) { + YPa.encode(message.field11, writer.uint32(90).fork()).join(); + } + if (message.field12 !== undefined) { + YPa.encode(message.field12, writer.uint32(98).fork()).join(); + } + return writer; + }, + + 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 = createBaseBufferedRange(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.formatId = FormatId.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.startTimeMs = longToNumber(reader.int64()); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.durationMs = longToNumber(reader.int64()); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.startSegmentIndex = reader.int32(); + continue; + case 5: + if (tag !== 40) { + break; + } + + message.endSegmentIndex = reader.int32(); + continue; + case 6: + if (tag !== 50) { + break; + } + + message.timeRange = TimeRange.decode(reader, reader.uint32()); + continue; + case 9: + if (tag !== 74) { + break; + } + + message.field9 = Kob.decode(reader, reader.uint32()); + continue; + case 11: + if (tag !== 90) { + break; + } + + message.field11 = YPa.decode(reader, reader.uint32()); + continue; + case 12: + if (tag !== 98) { + break; + } + + message.field12 = YPa.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + 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, + 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, + field12: isSet(object.field12) ? YPa.fromJSON(object.field12) : undefined, + }; + }, + + toJSON(message: BufferedRange): unknown { + const obj: any = {}; + if (message.formatId !== undefined) { + obj.formatId = FormatId.toJSON(message.formatId); + } + if (message.startTimeMs !== 0) { + obj.startTimeMs = Math.round(message.startTimeMs); + } + if (message.durationMs !== 0) { + obj.durationMs = Math.round(message.durationMs); + } + if (message.startSegmentIndex !== 0) { + obj.startSegmentIndex = Math.round(message.startSegmentIndex); + } + if (message.endSegmentIndex !== 0) { + obj.endSegmentIndex = Math.round(message.endSegmentIndex); + } + if (message.timeRange !== undefined) { + obj.timeRange = TimeRange.toJSON(message.timeRange); + } + if (message.field9 !== undefined) { + obj.field9 = Kob.toJSON(message.field9); + } + if (message.field11 !== undefined) { + obj.field11 = YPa.toJSON(message.field11); + } + if (message.field12 !== undefined) { + obj.field12 = YPa.toJSON(message.field12); + } + return obj; + }, + + create, I>>(base?: I): BufferedRange { + return BufferedRange.fromPartial(base ?? ({} as any)); + }, + 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.startSegmentIndex = object.startSegmentIndex ?? 0; + message.endSegmentIndex = object.endSegmentIndex ?? 0; + message.timeRange = (object.timeRange !== undefined && object.timeRange !== null) + ? TimeRange.fromPartial(object.timeRange) + : undefined; + message.field9 = (object.field9 !== undefined && object.field9 !== null) + ? Kob.fromPartial(object.field9) + : undefined; + message.field11 = (object.field11 !== undefined && object.field11 !== null) + ? YPa.fromPartial(object.field11) + : undefined; + message.field12 = (object.field12 !== undefined && object.field12 !== null) + ? YPa.fromPartial(object.field12) + : undefined; + return message; + }, +}; + +function createBaseKob(): Kob { + return { EW: [] }; +} + +export const Kob: MessageFns = { + encode(message: Kob, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.EW) { + Kob_Pa.encode(v!, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Kob { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseKob(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.EW.push(Kob_Pa.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Kob { + return { EW: globalThis.Array.isArray(object?.EW) ? object.EW.map((e: any) => Kob_Pa.fromJSON(e)) : [] }; + }, + + toJSON(message: Kob): unknown { + const obj: any = {}; + if (message.EW?.length) { + obj.EW = message.EW.map((e) => Kob_Pa.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): Kob { + return Kob.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Kob { + const message = createBaseKob(); + message.EW = object.EW?.map((e) => Kob_Pa.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseKob_Pa(): Kob_Pa { + return { videoId: "", lmt: 0 }; +} + +export const Kob_Pa: MessageFns = { + encode(message: Kob_Pa, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.videoId !== undefined && message.videoId !== "") { + writer.uint32(10).string(message.videoId); + } + if (message.lmt !== undefined && message.lmt !== 0) { + writer.uint32(16).uint64(message.lmt); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Kob_Pa { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseKob_Pa(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.videoId = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.lmt = longToNumber(reader.uint64()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Kob_Pa { + return { + videoId: isSet(object.videoId) ? globalThis.String(object.videoId) : "", + lmt: isSet(object.lmt) ? globalThis.Number(object.lmt) : 0, + }; + }, + + toJSON(message: Kob_Pa): unknown { + const obj: any = {}; + if (message.videoId !== undefined && message.videoId !== "") { + obj.videoId = message.videoId; + } + if (message.lmt !== undefined && message.lmt !== 0) { + obj.lmt = Math.round(message.lmt); + } + return obj; + }, + + create, I>>(base?: I): Kob_Pa { + return Kob_Pa.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Kob_Pa { + const message = createBaseKob_Pa(); + message.videoId = object.videoId ?? ""; + message.lmt = object.lmt ?? 0; + return message; + }, +}; + +function createBaseYPa(): YPa { + return { field1: 0, field2: 0, field3: 0 }; +} + +export const YPa: MessageFns = { + encode(message: YPa, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.field1 !== undefined && message.field1 !== 0) { + writer.uint32(8).int32(message.field1); + } + if (message.field2 !== undefined && message.field2 !== 0) { + writer.uint32(16).int32(message.field2); + } + if (message.field3 !== undefined && message.field3 !== 0) { + writer.uint32(24).int32(message.field3); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): YPa { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseYPa(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.field1 = reader.int32(); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.field2 = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.field3 = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): YPa { + return { + field1: isSet(object.field1) ? globalThis.Number(object.field1) : 0, + field2: isSet(object.field2) ? globalThis.Number(object.field2) : 0, + field3: isSet(object.field3) ? globalThis.Number(object.field3) : 0, + }; + }, + + toJSON(message: YPa): unknown { + const obj: any = {}; + if (message.field1 !== undefined && message.field1 !== 0) { + obj.field1 = Math.round(message.field1); + } + if (message.field2 !== undefined && message.field2 !== 0) { + obj.field2 = Math.round(message.field2); + } + if (message.field3 !== undefined && message.field3 !== 0) { + obj.field3 = Math.round(message.field3); + } + return obj; + }, + + create, I>>(base?: I): YPa { + return YPa.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): YPa { + const message = createBaseYPa(); + message.field1 = object.field1 ?? 0; + message.field2 = object.field2 ?? 0; + message.field3 = object.field3 ?? 0; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +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; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/protos/generated/video_streaming/encrypted_request.ts b/protos/generated/video_streaming/encrypted_player_request.ts similarity index 68% rename from protos/generated/video_streaming/encrypted_request.ts rename to protos/generated/video_streaming/encrypted_player_request.ts index a0e85c7..8d2a581 100644 --- a/protos/generated/video_streaming/encrypted_request.ts +++ b/protos/generated/video_streaming/encrypted_player_request.ts @@ -2,30 +2,35 @@ // versions: // protoc-gen-ts_proto v2.2.0 // protoc v5.28.0 -// source: video_streaming/encrypted_request.proto +// source: video_streaming/encrypted_player_request.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; export const protobufPackage = "video_streaming"; -export interface EncryptedRequest { - encryptedOnesieRequest?: Uint8Array | undefined; +export interface EncryptedPlayerRequest { + /** InnerTubeContext proto? */ + context?: Uint8Array | undefined; + encryptedOnesiePlayerRequest?: Uint8Array | undefined; encryptedClientKey?: Uint8Array | undefined; iv?: Uint8Array | undefined; hmac?: Uint8Array | undefined; + reverseProxyConfig?: string | undefined; YP?: boolean | undefined; pM?: boolean | undefined; enableCompression?: boolean | undefined; TQ?: boolean | undefined; } -function createBaseEncryptedRequest(): EncryptedRequest { +function createBaseEncryptedPlayerRequest(): EncryptedPlayerRequest { return { - encryptedOnesieRequest: new Uint8Array(0), + context: new Uint8Array(0), + encryptedOnesiePlayerRequest: new Uint8Array(0), encryptedClientKey: new Uint8Array(0), iv: new Uint8Array(0), hmac: new Uint8Array(0), + reverseProxyConfig: "", YP: false, pM: false, enableCompression: false, @@ -33,10 +38,13 @@ function createBaseEncryptedRequest(): EncryptedRequest { }; } -export const EncryptedRequest: MessageFns = { - encode(message: EncryptedRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.encryptedOnesieRequest !== undefined && message.encryptedOnesieRequest.length !== 0) { - writer.uint32(18).bytes(message.encryptedOnesieRequest); +export const EncryptedPlayerRequest: MessageFns = { + encode(message: EncryptedPlayerRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.context !== undefined && message.context.length !== 0) { + writer.uint32(10).bytes(message.context); + } + if (message.encryptedOnesiePlayerRequest !== undefined && message.encryptedOnesiePlayerRequest.length !== 0) { + writer.uint32(18).bytes(message.encryptedOnesiePlayerRequest); } if (message.encryptedClientKey !== undefined && message.encryptedClientKey.length !== 0) { writer.uint32(42).bytes(message.encryptedClientKey); @@ -47,6 +55,9 @@ export const EncryptedRequest: MessageFns = { if (message.hmac !== undefined && message.hmac.length !== 0) { writer.uint32(58).bytes(message.hmac); } + if (message.reverseProxyConfig !== undefined && message.reverseProxyConfig !== "") { + writer.uint32(74).string(message.reverseProxyConfig); + } if (message.YP !== undefined && message.YP !== false) { writer.uint32(80).bool(message.YP); } @@ -62,19 +73,26 @@ export const EncryptedRequest: MessageFns = { return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): EncryptedRequest { + decode(input: BinaryReader | Uint8Array, length?: number): EncryptedPlayerRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEncryptedRequest(); + const message = createBaseEncryptedPlayerRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.context = reader.bytes(); + continue; case 2: if (tag !== 18) { break; } - message.encryptedOnesieRequest = reader.bytes(); + message.encryptedOnesiePlayerRequest = reader.bytes(); continue; case 5: if (tag !== 42) { @@ -97,6 +115,13 @@ export const EncryptedRequest: MessageFns = { message.hmac = reader.bytes(); continue; + case 9: + if (tag !== 74) { + break; + } + + message.reverseProxyConfig = reader.string(); + continue; case 10: if (tag !== 80) { break; @@ -134,16 +159,18 @@ export const EncryptedRequest: MessageFns = { return message; }, - fromJSON(object: any): EncryptedRequest { + fromJSON(object: any): EncryptedPlayerRequest { return { - encryptedOnesieRequest: isSet(object.encryptedOnesieRequest) - ? bytesFromBase64(object.encryptedOnesieRequest) + context: isSet(object.context) ? bytesFromBase64(object.context) : new Uint8Array(0), + encryptedOnesiePlayerRequest: isSet(object.encryptedOnesiePlayerRequest) + ? bytesFromBase64(object.encryptedOnesiePlayerRequest) : new Uint8Array(0), encryptedClientKey: isSet(object.encryptedClientKey) ? bytesFromBase64(object.encryptedClientKey) : new Uint8Array(0), iv: isSet(object.iv) ? bytesFromBase64(object.iv) : new Uint8Array(0), hmac: isSet(object.hmac) ? bytesFromBase64(object.hmac) : new Uint8Array(0), + reverseProxyConfig: isSet(object.reverseProxyConfig) ? globalThis.String(object.reverseProxyConfig) : "", YP: isSet(object.YP) ? globalThis.Boolean(object.YP) : false, pM: isSet(object.pM) ? globalThis.Boolean(object.pM) : false, enableCompression: isSet(object.enableCompression) ? globalThis.Boolean(object.enableCompression) : false, @@ -151,10 +178,13 @@ export const EncryptedRequest: MessageFns = { }; }, - toJSON(message: EncryptedRequest): unknown { + toJSON(message: EncryptedPlayerRequest): unknown { const obj: any = {}; - if (message.encryptedOnesieRequest !== undefined && message.encryptedOnesieRequest.length !== 0) { - obj.encryptedOnesieRequest = base64FromBytes(message.encryptedOnesieRequest); + if (message.context !== undefined && message.context.length !== 0) { + obj.context = base64FromBytes(message.context); + } + if (message.encryptedOnesiePlayerRequest !== undefined && message.encryptedOnesiePlayerRequest.length !== 0) { + obj.encryptedOnesiePlayerRequest = base64FromBytes(message.encryptedOnesiePlayerRequest); } if (message.encryptedClientKey !== undefined && message.encryptedClientKey.length !== 0) { obj.encryptedClientKey = base64FromBytes(message.encryptedClientKey); @@ -165,6 +195,9 @@ export const EncryptedRequest: MessageFns = { if (message.hmac !== undefined && message.hmac.length !== 0) { obj.hmac = base64FromBytes(message.hmac); } + if (message.reverseProxyConfig !== undefined && message.reverseProxyConfig !== "") { + obj.reverseProxyConfig = message.reverseProxyConfig; + } if (message.YP !== undefined && message.YP !== false) { obj.YP = message.YP; } @@ -180,15 +213,17 @@ export const EncryptedRequest: MessageFns = { return obj; }, - create, I>>(base?: I): EncryptedRequest { - return EncryptedRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): EncryptedPlayerRequest { + return EncryptedPlayerRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): EncryptedRequest { - const message = createBaseEncryptedRequest(); - message.encryptedOnesieRequest = object.encryptedOnesieRequest ?? new Uint8Array(0); + fromPartial, I>>(object: I): EncryptedPlayerRequest { + const message = createBaseEncryptedPlayerRequest(); + message.context = object.context ?? new Uint8Array(0); + message.encryptedOnesiePlayerRequest = object.encryptedOnesiePlayerRequest ?? new Uint8Array(0); message.encryptedClientKey = object.encryptedClientKey ?? new Uint8Array(0); message.iv = object.iv ?? new Uint8Array(0); message.hmac = object.hmac ?? new Uint8Array(0); + message.reverseProxyConfig = object.reverseProxyConfig ?? ""; message.YP = object.YP ?? false; message.pM = object.pM ?? false; message.enableCompression = object.enableCompression ?? false; diff --git a/protos/generated/video_streaming/onesie_innertube_request.ts b/protos/generated/video_streaming/onesie_innertube_request.ts deleted file mode 100644 index fcab964..0000000 --- a/protos/generated/video_streaming/onesie_innertube_request.ts +++ /dev/null @@ -1,179 +0,0 @@ -// Code generated by protoc-gen-ts_proto. DO NOT EDIT. -// versions: -// protoc-gen-ts_proto v2.2.0 -// protoc v5.28.0 -// source: video_streaming/onesie_innertube_request.proto - -/* eslint-disable */ -import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; -import { ClientAbrState } from "./client_abr_state.js"; -import { EncryptedRequest } from "./encrypted_request.js"; -import { StreamerContext } from "./streamer_context.js"; - -export const protobufPackage = "video_streaming"; - -export interface OnesieInnertubeRequest { - clientAbrState?: ClientAbrState | undefined; - encryptedRequest?: EncryptedRequest | undefined; - onesieUstreamerConfig?: Uint8Array | undefined; - streamerContext?: StreamerContext | undefined; -} - -function createBaseOnesieInnertubeRequest(): OnesieInnertubeRequest { - return { - clientAbrState: undefined, - encryptedRequest: undefined, - onesieUstreamerConfig: new Uint8Array(0), - streamerContext: undefined, - }; -} - -export const OnesieInnertubeRequest: MessageFns = { - encode(message: OnesieInnertubeRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.clientAbrState !== undefined) { - ClientAbrState.encode(message.clientAbrState, writer.uint32(18).fork()).join(); - } - if (message.encryptedRequest !== undefined) { - EncryptedRequest.encode(message.encryptedRequest, writer.uint32(26).fork()).join(); - } - if (message.onesieUstreamerConfig !== undefined && message.onesieUstreamerConfig.length !== 0) { - writer.uint32(34).bytes(message.onesieUstreamerConfig); - } - if (message.streamerContext !== undefined) { - StreamerContext.encode(message.streamerContext, writer.uint32(82).fork()).join(); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): OnesieInnertubeRequest { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseOnesieInnertubeRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 2: - if (tag !== 18) { - break; - } - - message.clientAbrState = ClientAbrState.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.encryptedRequest = EncryptedRequest.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.onesieUstreamerConfig = reader.bytes(); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.streamerContext = StreamerContext.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): OnesieInnertubeRequest { - return { - clientAbrState: isSet(object.clientAbrState) ? ClientAbrState.fromJSON(object.clientAbrState) : undefined, - encryptedRequest: isSet(object.encryptedRequest) ? EncryptedRequest.fromJSON(object.encryptedRequest) : undefined, - onesieUstreamerConfig: isSet(object.onesieUstreamerConfig) - ? bytesFromBase64(object.onesieUstreamerConfig) - : new Uint8Array(0), - streamerContext: isSet(object.streamerContext) ? StreamerContext.fromJSON(object.streamerContext) : undefined, - }; - }, - - toJSON(message: OnesieInnertubeRequest): unknown { - const obj: any = {}; - if (message.clientAbrState !== undefined) { - obj.clientAbrState = ClientAbrState.toJSON(message.clientAbrState); - } - if (message.encryptedRequest !== undefined) { - obj.encryptedRequest = EncryptedRequest.toJSON(message.encryptedRequest); - } - if (message.onesieUstreamerConfig !== undefined && message.onesieUstreamerConfig.length !== 0) { - obj.onesieUstreamerConfig = base64FromBytes(message.onesieUstreamerConfig); - } - if (message.streamerContext !== undefined) { - obj.streamerContext = StreamerContext.toJSON(message.streamerContext); - } - return obj; - }, - - create, I>>(base?: I): OnesieInnertubeRequest { - return OnesieInnertubeRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): OnesieInnertubeRequest { - const message = createBaseOnesieInnertubeRequest(); - message.clientAbrState = (object.clientAbrState !== undefined && object.clientAbrState !== null) - ? ClientAbrState.fromPartial(object.clientAbrState) - : undefined; - message.encryptedRequest = (object.encryptedRequest !== undefined && object.encryptedRequest !== null) - ? EncryptedRequest.fromPartial(object.encryptedRequest) - : undefined; - message.onesieUstreamerConfig = object.onesieUstreamerConfig ?? new Uint8Array(0); - message.streamerContext = (object.streamerContext !== undefined && object.streamerContext !== null) - ? StreamerContext.fromPartial(object.streamerContext) - : undefined; - return message; - }, -}; - -function bytesFromBase64(b64: string): Uint8Array { - const bin = globalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; -} - -function base64FromBytes(arr: Uint8Array): string { - const bin: string[] = []; - arr.forEach((byte) => { - bin.push(globalThis.String.fromCharCode(byte)); - }); - return globalThis.btoa(bin.join("")); -} - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} - -export interface MessageFns { - encode(message: T, writer?: BinaryWriter): BinaryWriter; - decode(input: BinaryReader | Uint8Array, length?: number): T; - fromJSON(object: any): T; - toJSON(message: T): unknown; - create, I>>(base?: I): T; - fromPartial, I>>(object: I): T; -} diff --git a/protos/generated/video_streaming/onesie_player_request.ts b/protos/generated/video_streaming/onesie_player_request.ts new file mode 100644 index 0000000..15f5153 --- /dev/null +++ b/protos/generated/video_streaming/onesie_player_request.ts @@ -0,0 +1,168 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.2.0 +// protoc v5.28.0 +// source: video_streaming/onesie_player_request.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { HttpHeader } from "../misc/common.js"; + +export const protobufPackage = "video_streaming"; + +export interface OnesiePlayerRequest { + url?: string | undefined; + headers: HttpHeader[]; + body?: string | undefined; + proxiedByTrustedBandaid?: + | boolean + | undefined; + /** Seen this on youtube.com and the YTMusic protos. Not sure what it is yet. */ + field6?: boolean | undefined; +} + +function createBaseOnesiePlayerRequest(): OnesiePlayerRequest { + return { url: "", headers: [], body: "", proxiedByTrustedBandaid: false, field6: false }; +} + +export const OnesiePlayerRequest: MessageFns = { + encode(message: OnesiePlayerRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.url !== undefined && message.url !== "") { + writer.uint32(10).string(message.url); + } + for (const v of message.headers) { + HttpHeader.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.body !== undefined && message.body !== "") { + writer.uint32(26).string(message.body); + } + if (message.proxiedByTrustedBandaid !== undefined && message.proxiedByTrustedBandaid !== false) { + writer.uint32(32).bool(message.proxiedByTrustedBandaid); + } + if (message.field6 !== undefined && message.field6 !== false) { + writer.uint32(48).bool(message.field6); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OnesiePlayerRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOnesiePlayerRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.url = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.headers.push(HttpHeader.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.body = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.proxiedByTrustedBandaid = reader.bool(); + continue; + case 6: + if (tag !== 48) { + break; + } + + message.field6 = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): OnesiePlayerRequest { + return { + url: isSet(object.url) ? globalThis.String(object.url) : "", + headers: globalThis.Array.isArray(object?.headers) ? object.headers.map((e: any) => HttpHeader.fromJSON(e)) : [], + body: isSet(object.body) ? globalThis.String(object.body) : "", + proxiedByTrustedBandaid: isSet(object.proxiedByTrustedBandaid) + ? globalThis.Boolean(object.proxiedByTrustedBandaid) + : false, + field6: isSet(object.field6) ? globalThis.Boolean(object.field6) : false, + }; + }, + + toJSON(message: OnesiePlayerRequest): unknown { + const obj: any = {}; + if (message.url !== undefined && message.url !== "") { + obj.url = message.url; + } + if (message.headers?.length) { + obj.headers = message.headers.map((e) => HttpHeader.toJSON(e)); + } + if (message.body !== undefined && message.body !== "") { + obj.body = message.body; + } + if (message.proxiedByTrustedBandaid !== undefined && message.proxiedByTrustedBandaid !== false) { + obj.proxiedByTrustedBandaid = message.proxiedByTrustedBandaid; + } + if (message.field6 !== undefined && message.field6 !== false) { + obj.field6 = message.field6; + } + return obj; + }, + + create, I>>(base?: I): OnesiePlayerRequest { + return OnesiePlayerRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): OnesiePlayerRequest { + const message = createBaseOnesiePlayerRequest(); + message.url = object.url ?? ""; + message.headers = object.headers?.map((e) => HttpHeader.fromPartial(e)) || []; + message.body = object.body ?? ""; + message.proxiedByTrustedBandaid = object.proxiedByTrustedBandaid ?? false; + message.field6 = object.field6 ?? false; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/protos/generated/video_streaming/onesie_innertube_response.ts b/protos/generated/video_streaming/onesie_player_response.ts similarity index 65% rename from protos/generated/video_streaming/onesie_innertube_response.ts rename to protos/generated/video_streaming/onesie_player_response.ts index bf4b4be..9b2347c 100644 --- a/protos/generated/video_streaming/onesie_innertube_response.ts +++ b/protos/generated/video_streaming/onesie_player_response.ts @@ -2,33 +2,32 @@ // versions: // protoc-gen-ts_proto v2.2.0 // protoc v5.28.0 -// source: video_streaming/onesie_innertube_response.proto +// source: video_streaming/onesie_player_response.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; import { HttpHeader } from "../misc/common.js"; -import { ProxyStatus, proxyStatusFromJSON, proxyStatusToJSON } from "./proxy_status.js"; export const protobufPackage = "video_streaming"; -export interface OnesieInnertubeResponse { - proxyStatus?: ProxyStatus | undefined; - status?: number | undefined; +export interface OnesiePlayerResponse { + onesieProxyStatus?: number | undefined; + httpStatus?: number | undefined; headers: HttpHeader[]; body?: Uint8Array | undefined; } -function createBaseOnesieInnertubeResponse(): OnesieInnertubeResponse { - return { proxyStatus: 0, status: 0, headers: [], body: new Uint8Array(0) }; +function createBaseOnesiePlayerResponse(): OnesiePlayerResponse { + return { onesieProxyStatus: 0, httpStatus: 0, headers: [], body: new Uint8Array(0) }; } -export const OnesieInnertubeResponse: MessageFns = { - encode(message: OnesieInnertubeResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.proxyStatus !== undefined && message.proxyStatus !== 0) { - writer.uint32(8).int32(message.proxyStatus); +export const OnesiePlayerResponse: MessageFns = { + encode(message: OnesiePlayerResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.onesieProxyStatus !== undefined && message.onesieProxyStatus !== 0) { + writer.uint32(8).int32(message.onesieProxyStatus); } - if (message.status !== undefined && message.status !== 0) { - writer.uint32(16).int32(message.status); + if (message.httpStatus !== undefined && message.httpStatus !== 0) { + writer.uint32(16).int32(message.httpStatus); } for (const v of message.headers) { HttpHeader.encode(v!, writer.uint32(26).fork()).join(); @@ -39,10 +38,10 @@ export const OnesieInnertubeResponse: MessageFns = { return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): OnesieInnertubeResponse { + decode(input: BinaryReader | Uint8Array, length?: number): OnesiePlayerResponse { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseOnesieInnertubeResponse(); + const message = createBaseOnesiePlayerResponse(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -51,14 +50,14 @@ export const OnesieInnertubeResponse: MessageFns = { break; } - message.proxyStatus = reader.int32() as any; + message.onesieProxyStatus = reader.int32(); continue; case 2: if (tag !== 16) { break; } - message.status = reader.int32(); + message.httpStatus = reader.int32(); continue; case 3: if (tag !== 26) { @@ -83,22 +82,22 @@ export const OnesieInnertubeResponse: MessageFns = { return message; }, - fromJSON(object: any): OnesieInnertubeResponse { + fromJSON(object: any): OnesiePlayerResponse { return { - proxyStatus: isSet(object.proxyStatus) ? proxyStatusFromJSON(object.proxyStatus) : 0, - status: isSet(object.status) ? globalThis.Number(object.status) : 0, + onesieProxyStatus: isSet(object.onesieProxyStatus) ? globalThis.Number(object.onesieProxyStatus) : 0, + httpStatus: isSet(object.httpStatus) ? globalThis.Number(object.httpStatus) : 0, headers: globalThis.Array.isArray(object?.headers) ? object.headers.map((e: any) => HttpHeader.fromJSON(e)) : [], body: isSet(object.body) ? bytesFromBase64(object.body) : new Uint8Array(0), }; }, - toJSON(message: OnesieInnertubeResponse): unknown { + toJSON(message: OnesiePlayerResponse): unknown { const obj: any = {}; - if (message.proxyStatus !== undefined && message.proxyStatus !== 0) { - obj.proxyStatus = proxyStatusToJSON(message.proxyStatus); + if (message.onesieProxyStatus !== undefined && message.onesieProxyStatus !== 0) { + obj.onesieProxyStatus = Math.round(message.onesieProxyStatus); } - if (message.status !== undefined && message.status !== 0) { - obj.status = Math.round(message.status); + if (message.httpStatus !== undefined && message.httpStatus !== 0) { + obj.httpStatus = Math.round(message.httpStatus); } if (message.headers?.length) { obj.headers = message.headers.map((e) => HttpHeader.toJSON(e)); @@ -109,13 +108,13 @@ export const OnesieInnertubeResponse: MessageFns = { return obj; }, - create, I>>(base?: I): OnesieInnertubeResponse { - return OnesieInnertubeResponse.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): OnesiePlayerResponse { + return OnesiePlayerResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): OnesieInnertubeResponse { - const message = createBaseOnesieInnertubeResponse(); - message.proxyStatus = object.proxyStatus ?? 0; - message.status = object.status ?? 0; + fromPartial, I>>(object: I): OnesiePlayerResponse { + const message = createBaseOnesiePlayerResponse(); + message.onesieProxyStatus = object.onesieProxyStatus ?? 0; + message.httpStatus = object.httpStatus ?? 0; message.headers = object.headers?.map((e) => HttpHeader.fromPartial(e)) || []; message.body = object.body ?? new Uint8Array(0); return message; diff --git a/protos/generated/video_streaming/onesie_request.ts b/protos/generated/video_streaming/onesie_request.ts index eab5e9d..cd0771f 100644 --- a/protos/generated/video_streaming/onesie_request.ts +++ b/protos/generated/video_streaming/onesie_request.ts @@ -6,38 +6,62 @@ /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; -import { HttpHeader } from "../misc/common.js"; +import { BufferedRange } from "./buffered_range.js"; +import { ClientAbrState } from "./client_abr_state.js"; +import { EncryptedPlayerRequest } from "./encrypted_player_request.js"; +import { StreamerContext } from "./streamer_context.js"; export const protobufPackage = "video_streaming"; export interface OnesieRequest { - url?: string | undefined; - headers: HttpHeader[]; - body?: string | undefined; - field4?: boolean | undefined; - field6?: boolean | undefined; + urls: string[]; + clientAbrState?: ClientAbrState | undefined; + playerRequest?: EncryptedPlayerRequest | undefined; + onesieUstreamerConfig?: Uint8Array | undefined; + maxVp9Height?: number | undefined; + clientDisplayHeight?: number | undefined; + streamerContext?: StreamerContext | undefined; + bufferedRanges: BufferedRange[]; } function createBaseOnesieRequest(): OnesieRequest { - return { url: "", headers: [], body: "", field4: false, field6: false }; + return { + urls: [], + clientAbrState: undefined, + playerRequest: undefined, + onesieUstreamerConfig: new Uint8Array(0), + maxVp9Height: 0, + clientDisplayHeight: 0, + streamerContext: undefined, + bufferedRanges: [], + }; } export const OnesieRequest: MessageFns = { encode(message: OnesieRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.url !== undefined && message.url !== "") { - writer.uint32(10).string(message.url); + for (const v of message.urls) { + writer.uint32(10).string(v!); } - for (const v of message.headers) { - HttpHeader.encode(v!, writer.uint32(18).fork()).join(); + if (message.clientAbrState !== undefined) { + ClientAbrState.encode(message.clientAbrState, writer.uint32(18).fork()).join(); } - if (message.body !== undefined && message.body !== "") { - writer.uint32(26).string(message.body); + if (message.playerRequest !== undefined) { + EncryptedPlayerRequest.encode(message.playerRequest, writer.uint32(26).fork()).join(); } - if (message.field4 !== undefined && message.field4 !== false) { - writer.uint32(32).bool(message.field4); + if (message.onesieUstreamerConfig !== undefined && message.onesieUstreamerConfig.length !== 0) { + writer.uint32(34).bytes(message.onesieUstreamerConfig); } - if (message.field6 !== undefined && message.field6 !== false) { - writer.uint32(48).bool(message.field6); + if (message.maxVp9Height !== undefined && message.maxVp9Height !== 0) { + writer.uint32(40).int32(message.maxVp9Height); + } + if (message.clientDisplayHeight !== undefined && message.clientDisplayHeight !== 0) { + writer.uint32(48).int32(message.clientDisplayHeight); + } + if (message.streamerContext !== undefined) { + StreamerContext.encode(message.streamerContext, writer.uint32(82).fork()).join(); + } + for (const v of message.bufferedRanges) { + BufferedRange.encode(v!, writer.uint32(114).fork()).join(); } return writer; }, @@ -54,35 +78,56 @@ export const OnesieRequest: MessageFns = { break; } - message.url = reader.string(); + message.urls.push(reader.string()); continue; case 2: if (tag !== 18) { break; } - message.headers.push(HttpHeader.decode(reader, reader.uint32())); + message.clientAbrState = ClientAbrState.decode(reader, reader.uint32()); continue; case 3: if (tag !== 26) { break; } - message.body = reader.string(); + message.playerRequest = EncryptedPlayerRequest.decode(reader, reader.uint32()); continue; case 4: - if (tag !== 32) { + if (tag !== 34) { break; } - message.field4 = reader.bool(); + message.onesieUstreamerConfig = reader.bytes(); + continue; + case 5: + if (tag !== 40) { + break; + } + + message.maxVp9Height = reader.int32(); continue; case 6: if (tag !== 48) { break; } - message.field6 = reader.bool(); + message.clientDisplayHeight = reader.int32(); + continue; + case 10: + if (tag !== 82) { + break; + } + + message.streamerContext = StreamerContext.decode(reader, reader.uint32()); + continue; + case 14: + if (tag !== 114) { + break; + } + + message.bufferedRanges.push(BufferedRange.decode(reader, reader.uint32())); continue; } if ((tag & 7) === 4 || tag === 0) { @@ -95,30 +140,46 @@ export const OnesieRequest: MessageFns = { fromJSON(object: any): OnesieRequest { return { - url: isSet(object.url) ? globalThis.String(object.url) : "", - headers: globalThis.Array.isArray(object?.headers) ? object.headers.map((e: any) => HttpHeader.fromJSON(e)) : [], - body: isSet(object.body) ? globalThis.String(object.body) : "", - field4: isSet(object.field4) ? globalThis.Boolean(object.field4) : false, - field6: isSet(object.field6) ? globalThis.Boolean(object.field6) : false, + urls: globalThis.Array.isArray(object?.urls) ? object.urls.map((e: any) => globalThis.String(e)) : [], + clientAbrState: isSet(object.clientAbrState) ? ClientAbrState.fromJSON(object.clientAbrState) : undefined, + playerRequest: isSet(object.playerRequest) ? EncryptedPlayerRequest.fromJSON(object.playerRequest) : undefined, + onesieUstreamerConfig: isSet(object.onesieUstreamerConfig) + ? bytesFromBase64(object.onesieUstreamerConfig) + : new Uint8Array(0), + maxVp9Height: isSet(object.maxVp9Height) ? globalThis.Number(object.maxVp9Height) : 0, + clientDisplayHeight: isSet(object.clientDisplayHeight) ? globalThis.Number(object.clientDisplayHeight) : 0, + streamerContext: isSet(object.streamerContext) ? StreamerContext.fromJSON(object.streamerContext) : undefined, + bufferedRanges: globalThis.Array.isArray(object?.bufferedRanges) + ? object.bufferedRanges.map((e: any) => BufferedRange.fromJSON(e)) + : [], }; }, toJSON(message: OnesieRequest): unknown { const obj: any = {}; - if (message.url !== undefined && message.url !== "") { - obj.url = message.url; + if (message.urls?.length) { + obj.urls = message.urls; } - if (message.headers?.length) { - obj.headers = message.headers.map((e) => HttpHeader.toJSON(e)); + if (message.clientAbrState !== undefined) { + obj.clientAbrState = ClientAbrState.toJSON(message.clientAbrState); } - if (message.body !== undefined && message.body !== "") { - obj.body = message.body; + if (message.playerRequest !== undefined) { + obj.playerRequest = EncryptedPlayerRequest.toJSON(message.playerRequest); } - if (message.field4 !== undefined && message.field4 !== false) { - obj.field4 = message.field4; + if (message.onesieUstreamerConfig !== undefined && message.onesieUstreamerConfig.length !== 0) { + obj.onesieUstreamerConfig = base64FromBytes(message.onesieUstreamerConfig); } - if (message.field6 !== undefined && message.field6 !== false) { - obj.field6 = message.field6; + if (message.maxVp9Height !== undefined && message.maxVp9Height !== 0) { + obj.maxVp9Height = Math.round(message.maxVp9Height); + } + if (message.clientDisplayHeight !== undefined && message.clientDisplayHeight !== 0) { + obj.clientDisplayHeight = Math.round(message.clientDisplayHeight); + } + if (message.streamerContext !== undefined) { + obj.streamerContext = StreamerContext.toJSON(message.streamerContext); + } + if (message.bufferedRanges?.length) { + obj.bufferedRanges = message.bufferedRanges.map((e) => BufferedRange.toJSON(e)); } return obj; }, @@ -128,15 +189,41 @@ export const OnesieRequest: MessageFns = { }, fromPartial, I>>(object: I): OnesieRequest { const message = createBaseOnesieRequest(); - message.url = object.url ?? ""; - message.headers = object.headers?.map((e) => HttpHeader.fromPartial(e)) || []; - message.body = object.body ?? ""; - message.field4 = object.field4 ?? false; - message.field6 = object.field6 ?? false; + message.urls = object.urls?.map((e) => e) || []; + message.clientAbrState = (object.clientAbrState !== undefined && object.clientAbrState !== null) + ? ClientAbrState.fromPartial(object.clientAbrState) + : undefined; + message.playerRequest = (object.playerRequest !== undefined && object.playerRequest !== null) + ? EncryptedPlayerRequest.fromPartial(object.playerRequest) + : undefined; + message.onesieUstreamerConfig = object.onesieUstreamerConfig ?? new Uint8Array(0); + message.maxVp9Height = object.maxVp9Height ?? 0; + message.clientDisplayHeight = object.clientDisplayHeight ?? 0; + message.streamerContext = (object.streamerContext !== undefined && object.streamerContext !== null) + ? StreamerContext.fromPartial(object.streamerContext) + : undefined; + message.bufferedRanges = object.bufferedRanges?.map((e) => BufferedRange.fromPartial(e)) || []; return message; }, }; +function bytesFromBase64(b64: string): Uint8Array { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; +} + +function base64FromBytes(arr: Uint8Array): string { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); +} + type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; export type DeepPartial = T extends Builtin ? T diff --git a/protos/generated/video_streaming/video_playback_abr_request.ts b/protos/generated/video_streaming/video_playback_abr_request.ts index 553fbc2..223cffb 100644 --- a/protos/generated/video_streaming/video_playback_abr_request.ts +++ b/protos/generated/video_streaming/video_playback_abr_request.ts @@ -7,20 +7,20 @@ /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; import { FormatId } from "../misc/common.js"; +import { BufferedRange } from "./buffered_range.js"; import { ClientAbrState } from "./client_abr_state.js"; import { StreamerContext } from "./streamer_context.js"; -import { TimeRange } from "./time_range.js"; export const protobufPackage = "video_streaming"; export interface VideoPlaybackAbrRequest { clientAbrState?: ClientAbrState | undefined; - selectedFormats: FormatId[]; - bufferedRange: BufferedRange[]; + selectedFormatIds: FormatId[]; + bufferedRanges: BufferedRange[]; videoPlaybackUstreamerConfig?: Uint8Array | undefined; lo?: Lo | undefined; - audioFormats: FormatId[]; - videoFormats: FormatId[]; + selectedAudioFormatIds: FormatId[]; + selectedVideoFormatIds: FormatId[]; streamerContext?: StreamerContext | undefined; field21?: OQa | undefined; field22?: number | undefined; @@ -42,33 +42,6 @@ export interface Lo_Field4 { field3?: number | undefined; } -export interface Kob { - EW: Kob_Pa[]; -} - -export interface Kob_Pa { - videoId?: string | undefined; - lmt?: number | undefined; -} - -export interface YPa { - field1?: number | undefined; - field2?: number | undefined; - field3?: number | undefined; -} - -export interface BufferedRange { - formatId: FormatId | undefined; - startTimeMs: number; - durationMs: number; - startSegmentIndex: number; - endSegmentIndex: number; - timeRange?: TimeRange | undefined; - field9?: Kob | undefined; - field11?: YPa | undefined; - field12?: YPa | undefined; -} - export interface OQa { field1: string[]; field2?: Uint8Array | undefined; @@ -87,12 +60,12 @@ export interface Pqa { function createBaseVideoPlaybackAbrRequest(): VideoPlaybackAbrRequest { return { clientAbrState: undefined, - selectedFormats: [], - bufferedRange: [], + selectedFormatIds: [], + bufferedRanges: [], videoPlaybackUstreamerConfig: new Uint8Array(0), lo: undefined, - audioFormats: [], - videoFormats: [], + selectedAudioFormatIds: [], + selectedVideoFormatIds: [], streamerContext: undefined, field21: undefined, field22: 0, @@ -106,10 +79,10 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.clientAbrState !== undefined) { ClientAbrState.encode(message.clientAbrState, writer.uint32(10).fork()).join(); } - for (const v of message.selectedFormats) { + for (const v of message.selectedFormatIds) { FormatId.encode(v!, writer.uint32(18).fork()).join(); } - for (const v of message.bufferedRange) { + for (const v of message.bufferedRanges) { BufferedRange.encode(v!, writer.uint32(26).fork()).join(); } if (message.videoPlaybackUstreamerConfig !== undefined && message.videoPlaybackUstreamerConfig.length !== 0) { @@ -118,10 +91,10 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.lo !== undefined) { Lo.encode(message.lo, writer.uint32(50).fork()).join(); } - for (const v of message.audioFormats) { + for (const v of message.selectedAudioFormatIds) { FormatId.encode(v!, writer.uint32(130).fork()).join(); } - for (const v of message.videoFormats) { + for (const v of message.selectedVideoFormatIds) { FormatId.encode(v!, writer.uint32(138).fork()).join(); } if (message.streamerContext !== undefined) { @@ -161,14 +134,14 @@ export const VideoPlaybackAbrRequest: MessageFns = { break; } - message.selectedFormats.push(FormatId.decode(reader, reader.uint32())); + message.selectedFormatIds.push(FormatId.decode(reader, reader.uint32())); continue; case 3: if (tag !== 26) { break; } - message.bufferedRange.push(BufferedRange.decode(reader, reader.uint32())); + message.bufferedRanges.push(BufferedRange.decode(reader, reader.uint32())); continue; case 5: if (tag !== 42) { @@ -189,14 +162,14 @@ export const VideoPlaybackAbrRequest: MessageFns = { break; } - message.audioFormats.push(FormatId.decode(reader, reader.uint32())); + message.selectedAudioFormatIds.push(FormatId.decode(reader, reader.uint32())); continue; case 17: if (tag !== 138) { break; } - message.videoFormats.push(FormatId.decode(reader, reader.uint32())); + message.selectedVideoFormatIds.push(FormatId.decode(reader, reader.uint32())); continue; case 19: if (tag !== 154) { @@ -245,21 +218,21 @@ export const VideoPlaybackAbrRequest: MessageFns = { fromJSON(object: any): VideoPlaybackAbrRequest { return { clientAbrState: isSet(object.clientAbrState) ? ClientAbrState.fromJSON(object.clientAbrState) : undefined, - selectedFormats: globalThis.Array.isArray(object?.selectedFormats) - ? object.selectedFormats.map((e: any) => FormatId.fromJSON(e)) + selectedFormatIds: globalThis.Array.isArray(object?.selectedFormatIds) + ? object.selectedFormatIds.map((e: any) => FormatId.fromJSON(e)) : [], - bufferedRange: globalThis.Array.isArray(object?.bufferedRange) - ? object.bufferedRange.map((e: any) => BufferedRange.fromJSON(e)) + bufferedRanges: globalThis.Array.isArray(object?.bufferedRanges) + ? object.bufferedRanges.map((e: any) => BufferedRange.fromJSON(e)) : [], videoPlaybackUstreamerConfig: isSet(object.videoPlaybackUstreamerConfig) ? bytesFromBase64(object.videoPlaybackUstreamerConfig) : new Uint8Array(0), lo: isSet(object.lo) ? Lo.fromJSON(object.lo) : undefined, - audioFormats: globalThis.Array.isArray(object?.audioFormats) - ? object.audioFormats.map((e: any) => FormatId.fromJSON(e)) + selectedAudioFormatIds: globalThis.Array.isArray(object?.selectedAudioFormatIds) + ? object.selectedAudioFormatIds.map((e: any) => FormatId.fromJSON(e)) : [], - videoFormats: globalThis.Array.isArray(object?.videoFormats) - ? object.videoFormats.map((e: any) => FormatId.fromJSON(e)) + selectedVideoFormatIds: globalThis.Array.isArray(object?.selectedVideoFormatIds) + ? object.selectedVideoFormatIds.map((e: any) => FormatId.fromJSON(e)) : [], streamerContext: isSet(object.streamerContext) ? StreamerContext.fromJSON(object.streamerContext) : undefined, field21: isSet(object.field21) ? OQa.fromJSON(object.field21) : undefined, @@ -274,11 +247,11 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.clientAbrState !== undefined) { obj.clientAbrState = ClientAbrState.toJSON(message.clientAbrState); } - if (message.selectedFormats?.length) { - obj.selectedFormats = message.selectedFormats.map((e) => FormatId.toJSON(e)); + if (message.selectedFormatIds?.length) { + obj.selectedFormatIds = message.selectedFormatIds.map((e) => FormatId.toJSON(e)); } - if (message.bufferedRange?.length) { - obj.bufferedRange = message.bufferedRange.map((e) => BufferedRange.toJSON(e)); + if (message.bufferedRanges?.length) { + obj.bufferedRanges = message.bufferedRanges.map((e) => BufferedRange.toJSON(e)); } if (message.videoPlaybackUstreamerConfig !== undefined && message.videoPlaybackUstreamerConfig.length !== 0) { obj.videoPlaybackUstreamerConfig = base64FromBytes(message.videoPlaybackUstreamerConfig); @@ -286,11 +259,11 @@ export const VideoPlaybackAbrRequest: MessageFns = { if (message.lo !== undefined) { obj.lo = Lo.toJSON(message.lo); } - if (message.audioFormats?.length) { - obj.audioFormats = message.audioFormats.map((e) => FormatId.toJSON(e)); + if (message.selectedAudioFormatIds?.length) { + obj.selectedAudioFormatIds = message.selectedAudioFormatIds.map((e) => FormatId.toJSON(e)); } - if (message.videoFormats?.length) { - obj.videoFormats = message.videoFormats.map((e) => FormatId.toJSON(e)); + if (message.selectedVideoFormatIds?.length) { + obj.selectedVideoFormatIds = message.selectedVideoFormatIds.map((e) => FormatId.toJSON(e)); } if (message.streamerContext !== undefined) { obj.streamerContext = StreamerContext.toJSON(message.streamerContext); @@ -318,12 +291,12 @@ export const VideoPlaybackAbrRequest: MessageFns = { message.clientAbrState = (object.clientAbrState !== undefined && object.clientAbrState !== null) ? ClientAbrState.fromPartial(object.clientAbrState) : undefined; - message.selectedFormats = object.selectedFormats?.map((e) => FormatId.fromPartial(e)) || []; - message.bufferedRange = object.bufferedRange?.map((e) => BufferedRange.fromPartial(e)) || []; + message.selectedFormatIds = object.selectedFormatIds?.map((e) => FormatId.fromPartial(e)) || []; + message.bufferedRanges = object.bufferedRanges?.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.audioFormats = object.audioFormats?.map((e) => FormatId.fromPartial(e)) || []; - message.videoFormats = object.videoFormats?.map((e) => FormatId.fromPartial(e)) || []; + message.selectedAudioFormatIds = object.selectedAudioFormatIds?.map((e) => FormatId.fromPartial(e)) || []; + message.selectedVideoFormatIds = object.selectedVideoFormatIds?.map((e) => FormatId.fromPartial(e)) || []; message.streamerContext = (object.streamerContext !== undefined && object.streamerContext !== null) ? StreamerContext.fromPartial(object.streamerContext) : undefined; @@ -549,425 +522,6 @@ export const Lo_Field4: MessageFns = { }, }; -function createBaseKob(): Kob { - return { EW: [] }; -} - -export const Kob: MessageFns = { - encode(message: Kob, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - for (const v of message.EW) { - Kob_Pa.encode(v!, writer.uint32(10).fork()).join(); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): Kob { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseKob(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.EW.push(Kob_Pa.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): Kob { - return { EW: globalThis.Array.isArray(object?.EW) ? object.EW.map((e: any) => Kob_Pa.fromJSON(e)) : [] }; - }, - - toJSON(message: Kob): unknown { - const obj: any = {}; - if (message.EW?.length) { - obj.EW = message.EW.map((e) => Kob_Pa.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): Kob { - return Kob.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Kob { - const message = createBaseKob(); - message.EW = object.EW?.map((e) => Kob_Pa.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseKob_Pa(): Kob_Pa { - return { videoId: "", lmt: 0 }; -} - -export const Kob_Pa: MessageFns = { - encode(message: Kob_Pa, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.videoId !== undefined && message.videoId !== "") { - writer.uint32(10).string(message.videoId); - } - if (message.lmt !== undefined && message.lmt !== 0) { - writer.uint32(16).uint64(message.lmt); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): Kob_Pa { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseKob_Pa(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.videoId = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.lmt = longToNumber(reader.uint64()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): Kob_Pa { - return { - videoId: isSet(object.videoId) ? globalThis.String(object.videoId) : "", - lmt: isSet(object.lmt) ? globalThis.Number(object.lmt) : 0, - }; - }, - - toJSON(message: Kob_Pa): unknown { - const obj: any = {}; - if (message.videoId !== undefined && message.videoId !== "") { - obj.videoId = message.videoId; - } - if (message.lmt !== undefined && message.lmt !== 0) { - obj.lmt = Math.round(message.lmt); - } - return obj; - }, - - create, I>>(base?: I): Kob_Pa { - return Kob_Pa.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Kob_Pa { - const message = createBaseKob_Pa(); - message.videoId = object.videoId ?? ""; - message.lmt = object.lmt ?? 0; - return message; - }, -}; - -function createBaseYPa(): YPa { - return { field1: 0, field2: 0, field3: 0 }; -} - -export const YPa: MessageFns = { - encode(message: YPa, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.field1 !== undefined && message.field1 !== 0) { - writer.uint32(8).int32(message.field1); - } - if (message.field2 !== undefined && message.field2 !== 0) { - writer.uint32(16).int32(message.field2); - } - if (message.field3 !== undefined && message.field3 !== 0) { - writer.uint32(24).int32(message.field3); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): YPa { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseYPa(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.field1 = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.field2 = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.field3 = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): YPa { - return { - field1: isSet(object.field1) ? globalThis.Number(object.field1) : 0, - field2: isSet(object.field2) ? globalThis.Number(object.field2) : 0, - field3: isSet(object.field3) ? globalThis.Number(object.field3) : 0, - }; - }, - - toJSON(message: YPa): unknown { - const obj: any = {}; - if (message.field1 !== undefined && message.field1 !== 0) { - obj.field1 = Math.round(message.field1); - } - if (message.field2 !== undefined && message.field2 !== 0) { - obj.field2 = Math.round(message.field2); - } - if (message.field3 !== undefined && message.field3 !== 0) { - obj.field3 = Math.round(message.field3); - } - return obj; - }, - - create, I>>(base?: I): YPa { - return YPa.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): YPa { - const message = createBaseYPa(); - message.field1 = object.field1 ?? 0; - message.field2 = object.field2 ?? 0; - message.field3 = object.field3 ?? 0; - return message; - }, -}; - -function createBaseBufferedRange(): BufferedRange { - return { - formatId: undefined, - startTimeMs: 0, - durationMs: 0, - startSegmentIndex: 0, - endSegmentIndex: 0, - timeRange: undefined, - field9: undefined, - field11: undefined, - field12: undefined, - }; -} - -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(); - } - if (message.startTimeMs !== 0) { - writer.uint32(16).int64(message.startTimeMs); - } - if (message.durationMs !== 0) { - writer.uint32(24).int64(message.durationMs); - } - if (message.startSegmentIndex !== 0) { - writer.uint32(32).int32(message.startSegmentIndex); - } - if (message.endSegmentIndex !== 0) { - writer.uint32(40).int32(message.endSegmentIndex); - } - if (message.timeRange !== undefined) { - TimeRange.encode(message.timeRange, writer.uint32(50).fork()).join(); - } - if (message.field9 !== undefined) { - Kob.encode(message.field9, writer.uint32(74).fork()).join(); - } - if (message.field11 !== undefined) { - YPa.encode(message.field11, writer.uint32(90).fork()).join(); - } - if (message.field12 !== undefined) { - YPa.encode(message.field12, writer.uint32(98).fork()).join(); - } - return writer; - }, - - 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 = createBaseBufferedRange(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.formatId = FormatId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.startTimeMs = longToNumber(reader.int64()); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.durationMs = longToNumber(reader.int64()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.startSegmentIndex = reader.int32(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.endSegmentIndex = reader.int32(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.timeRange = TimeRange.decode(reader, reader.uint32()); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.field9 = Kob.decode(reader, reader.uint32()); - continue; - case 11: - if (tag !== 90) { - break; - } - - message.field11 = YPa.decode(reader, reader.uint32()); - continue; - case 12: - if (tag !== 98) { - break; - } - - message.field12 = YPa.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - 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, - 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, - field12: isSet(object.field12) ? YPa.fromJSON(object.field12) : undefined, - }; - }, - - toJSON(message: BufferedRange): unknown { - const obj: any = {}; - if (message.formatId !== undefined) { - obj.formatId = FormatId.toJSON(message.formatId); - } - if (message.startTimeMs !== 0) { - obj.startTimeMs = Math.round(message.startTimeMs); - } - if (message.durationMs !== 0) { - obj.durationMs = Math.round(message.durationMs); - } - if (message.startSegmentIndex !== 0) { - obj.startSegmentIndex = Math.round(message.startSegmentIndex); - } - if (message.endSegmentIndex !== 0) { - obj.endSegmentIndex = Math.round(message.endSegmentIndex); - } - if (message.timeRange !== undefined) { - obj.timeRange = TimeRange.toJSON(message.timeRange); - } - if (message.field9 !== undefined) { - obj.field9 = Kob.toJSON(message.field9); - } - if (message.field11 !== undefined) { - obj.field11 = YPa.toJSON(message.field11); - } - if (message.field12 !== undefined) { - obj.field12 = YPa.toJSON(message.field12); - } - return obj; - }, - - create, I>>(base?: I): BufferedRange { - return BufferedRange.fromPartial(base ?? ({} as any)); - }, - 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.startSegmentIndex = object.startSegmentIndex ?? 0; - message.endSegmentIndex = object.endSegmentIndex ?? 0; - message.timeRange = (object.timeRange !== undefined && object.timeRange !== null) - ? TimeRange.fromPartial(object.timeRange) - : undefined; - message.field9 = (object.field9 !== undefined && object.field9 !== null) - ? Kob.fromPartial(object.field9) - : undefined; - message.field11 = (object.field11 !== undefined && object.field11 !== null) - ? YPa.fromPartial(object.field11) - : undefined; - message.field12 = (object.field12 !== undefined && object.field12 !== null) - ? YPa.fromPartial(object.field12) - : undefined; - return message; - }, -}; - function createBaseOQa(): OQa { return { field1: [], field2: new Uint8Array(0), field3: "", field4: 0, field5: 0, field6: "" }; } @@ -1220,17 +774,6 @@ type KeysOfUnion = T extends T ? keyof T : never; export type Exact = P extends Builtin ? P : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; -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; -} - function isSet(value: any): boolean { return value !== null && value !== undefined; } diff --git a/protos/video_streaming/buffered_range.proto b/protos/video_streaming/buffered_range.proto new file mode 100644 index 0000000..f59a2f0 --- /dev/null +++ b/protos/video_streaming/buffered_range.proto @@ -0,0 +1,32 @@ + +syntax = "proto2"; +package video_streaming; + +import "misc/common.proto"; +import "video_streaming/time_range.proto"; + +message BufferedRange { + required .misc.FormatId format_id = 1; + required int64 start_time_ms = 2; + required int64 duration_ms = 3; + 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; + optional YPa field12 = 12; +} + +message Kob { + message Pa { + optional string video_id = 1; + optional uint64 lmt = 2; + } + repeated Pa EW = 1; +} + +message YPa { + optional int32 field1 = 1; + optional int32 field2 = 2; + optional int32 field3 = 3; +} \ No newline at end of file diff --git a/protos/video_streaming/encrypted_request.proto b/protos/video_streaming/encrypted_player_request.proto similarity index 57% rename from protos/video_streaming/encrypted_request.proto rename to protos/video_streaming/encrypted_player_request.proto index b5a9ebb..3343c24 100644 --- a/protos/video_streaming/encrypted_request.proto +++ b/protos/video_streaming/encrypted_player_request.proto @@ -1,11 +1,13 @@ syntax = "proto2"; package video_streaming; -message EncryptedRequest { - optional bytes encrypted_onesie_request = 2; +message EncryptedPlayerRequest { + optional bytes context = 1; // InnerTubeContext proto? + optional bytes encrypted_onesie_player_request = 2; optional bytes encrypted_client_key = 5; optional bytes iv = 6; optional bytes hmac = 7; + optional string reverse_proxy_config = 9; optional bool YP = 10; optional bool pM = 13; optional bool enable_compression = 14; diff --git a/protos/video_streaming/onesie_innertube_request.proto b/protos/video_streaming/onesie_innertube_request.proto deleted file mode 100644 index 6f13c8f..0000000 --- a/protos/video_streaming/onesie_innertube_request.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto2"; -package video_streaming; - -import "video_streaming/client_abr_state.proto"; -import "video_streaming/encrypted_request.proto"; -import "video_streaming/streamer_context.proto"; - -message OnesieInnertubeRequest { - optional ClientAbrState client_abr_state = 2; - optional EncryptedRequest encrypted_request = 3; - optional bytes onesie_ustreamer_config = 4; - optional StreamerContext streamer_context = 10; -} \ No newline at end of file diff --git a/protos/video_streaming/onesie_innertube_response.proto b/protos/video_streaming/onesie_innertube_response.proto deleted file mode 100644 index f241b80..0000000 --- a/protos/video_streaming/onesie_innertube_response.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto2"; -package video_streaming; - -import "misc/common.proto"; -import "video_streaming/proxy_status.proto"; - -message OnesieInnertubeResponse { - optional ProxyStatus proxy_status = 1; - optional int32 status = 2; - repeated .misc.HttpHeader headers = 3; - optional bytes body = 4; -} \ No newline at end of file diff --git a/protos/video_streaming/onesie_player_request.proto b/protos/video_streaming/onesie_player_request.proto new file mode 100644 index 0000000..b6864d4 --- /dev/null +++ b/protos/video_streaming/onesie_player_request.proto @@ -0,0 +1,12 @@ +syntax = "proto2"; +package video_streaming; + +import "misc/common.proto"; + +message OnesiePlayerRequest { + optional string url = 1; + repeated misc.HttpHeader headers = 2; + optional string body = 3; + optional bool proxied_by_trusted_bandaid = 4; + optional bool field6 = 6; // Seen this on youtube.com and the YTMusic protos. Not sure what it is yet. +} \ No newline at end of file diff --git a/protos/video_streaming/onesie_player_response.proto b/protos/video_streaming/onesie_player_response.proto new file mode 100644 index 0000000..6e60cf2 --- /dev/null +++ b/protos/video_streaming/onesie_player_response.proto @@ -0,0 +1,11 @@ +syntax = "proto2"; +package video_streaming; + +import "misc/common.proto"; + +message OnesiePlayerResponse { + optional int32 onesie_proxy_status = 1; + optional int32 http_status = 2; + repeated .misc.HttpHeader headers = 3; + optional bytes body = 4; +} \ No newline at end of file diff --git a/protos/video_streaming/onesie_request.proto b/protos/video_streaming/onesie_request.proto index bea7af4..bb10932 100644 --- a/protos/video_streaming/onesie_request.proto +++ b/protos/video_streaming/onesie_request.proto @@ -1,12 +1,18 @@ syntax = "proto2"; package video_streaming; -import "misc/common.proto"; +import "video_streaming/client_abr_state.proto"; +import "video_streaming/encrypted_player_request.proto"; +import "video_streaming/streamer_context.proto"; +import "video_streaming/buffered_range.proto"; message OnesieRequest { - optional string url = 1; - repeated misc.HttpHeader headers = 2; - optional string body = 3; - optional bool field4 = 4; - optional bool field6 = 6; + repeated string urls = 1; + optional ClientAbrState client_abr_state = 2; + optional EncryptedPlayerRequest player_request = 3; + optional bytes onesie_ustreamer_config = 4; + optional int32 max_vp9_height = 5; + optional int32 client_display_height = 6; + optional StreamerContext streamer_context = 10; + repeated BufferedRange buffered_ranges = 14; } \ No newline at end of file diff --git a/protos/video_streaming/video_playback_abr_request.proto b/protos/video_streaming/video_playback_abr_request.proto index a50aae9..e24ac39 100644 --- a/protos/video_streaming/video_playback_abr_request.proto +++ b/protos/video_streaming/video_playback_abr_request.proto @@ -3,17 +3,17 @@ package video_streaming; import "misc/common.proto"; import "video_streaming/client_abr_state.proto"; -import "video_streaming/time_range.proto"; import "video_streaming/streamer_context.proto"; +import "video_streaming/buffered_range.proto"; message VideoPlaybackAbrRequest { optional ClientAbrState client_abr_state = 1; - repeated .misc.FormatId selected_formats = 2; - repeated BufferedRange buffered_range = 3; + repeated .misc.FormatId selected_format_ids = 2; + repeated BufferedRange buffered_ranges = 3; optional bytes video_playback_ustreamer_config = 5; optional Lo lo = 6; - repeated .misc.FormatId audio_formats = 16; - repeated .misc.FormatId video_formats = 17; + repeated .misc.FormatId selected_audio_format_ids = 16; + repeated .misc.FormatId selected_video_format_ids = 17; optional StreamerContext streamer_context = 19; optional OQa field21 = 21; optional int32 field22 = 22; @@ -34,32 +34,6 @@ message Lo { optional int32 MZ = 5; } -message Kob { - message Pa { - optional string video_id = 1; - optional uint64 lmt = 2; - } - repeated Pa EW = 1; -} - -message YPa { - optional int32 field1 = 1; - optional int32 field2 = 2; - optional int32 field3 = 3; -} - -message BufferedRange { - required .misc.FormatId format_id = 1; - required int64 start_time_ms = 2; - required int64 duration_ms = 3; - 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; - optional YPa field12 = 12; -} - message OQa { repeated string field1 = 1; optional bytes field2 = 2; diff --git a/src/core/ServerAbrStream.ts b/src/core/ServerAbrStream.ts index 51f04cd..269e125 100644 --- a/src/core/ServerAbrStream.ts +++ b/src/core/ServerAbrStream.ts @@ -126,9 +126,9 @@ export class ServerAbrStream extends EventEmitterLike { const body = VideoPlaybackAbrRequest.encode({ clientAbrState: clientAbrState, - audioFormats: audioFormatIds, - videoFormats: videoFormatIds, - selectedFormats: this.initializedFormats.map((fmt) => fmt.formatId), + selectedAudioFormatIds: audioFormatIds, + selectedVideoFormatIds: videoFormatIds, + selectedFormatIds: this.initializedFormats.map((fmt) => fmt.formatId), videoPlaybackUstreamerConfig: base64ToU8(this.videoPlaybackUstreamerConfig), streamerContext: { field5: [], @@ -142,7 +142,7 @@ export class ServerAbrStream extends EventEmitterLike { osVersion: '10.0' } }, - bufferedRange: this.initializedFormats.map((fmt) => fmt._state), + bufferedRanges: this.initializedFormats.map((fmt) => fmt._state), field1000: [] }).finish(); diff --git a/src/utils/Protos.ts b/src/utils/Protos.ts index 56dce49..dd50645 100644 --- a/src/utils/Protos.ts +++ b/src/utils/Protos.ts @@ -1,4 +1,5 @@ export { FormatInitializationMetadata } from '../../protos/generated/video_streaming/format_initialization_metadata.js'; +export { BufferedRange } from '../../protos/generated/video_streaming/buffered_range.js'; export { MediaHeader } from '../../protos/generated/video_streaming/media_header.js'; export { NextRequestPolicy } from '../../protos/generated/video_streaming/next_request_policy.js'; export { PlaybackCookie } from '../../protos/generated/video_streaming/playback_cookie.js'; @@ -9,11 +10,11 @@ export { SabrRedirect } from '../../protos/generated/video_streaming/sabr_redire export { StreamProtectionStatus } from '../../protos/generated/video_streaming/stream_protection_status.js'; export { VideoPlaybackAbrRequest } from '../../protos/generated/video_streaming/video_playback_abr_request.js'; export { OnesieRequest } from '../../protos/generated/video_streaming/onesie_request.js'; -export { EncryptedRequest } from '../../protos/generated/video_streaming/encrypted_request.js'; +export { EncryptedPlayerRequest } from '../../protos/generated/video_streaming/encrypted_player_request.js'; export { OnesieHeader } from '../../protos/generated/video_streaming/onesie_header.js'; export { OnesieHeaderType } from '../../protos/generated/video_streaming/onesie_header_type.js'; -export { OnesieInnertubeRequest } from '../../protos/generated/video_streaming/onesie_innertube_request.js'; -export { OnesieInnertubeResponse } from '../../protos/generated/video_streaming/onesie_innertube_response.js'; +export { OnesiePlayerRequest } from '../../protos/generated/video_streaming/onesie_player_request.js'; +export { OnesiePlayerResponse } from '../../protos/generated/video_streaming/onesie_player_response.js'; export { ClientAbrState } from '../../protos/generated/video_streaming/client_abr_state.js'; export { StreamerContext } from '../../protos/generated/video_streaming/streamer_context.js'; export { ProxyStatus } from '../../protos/generated/video_streaming/proxy_status.js'; diff --git a/src/utils/types.ts b/src/utils/types.ts index 23d2c9a..51bac60 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 { BufferedRange } from '../../protos/generated/video_streaming/video_playback_abr_request.js'; +import type { BufferedRange } from '../../protos/generated/video_streaming/buffered_range.js'; import type { ClientAbrState } from '../../protos/generated/video_streaming/client_abr_state.js'; import type { ChunkedDataBuffer } from '../core/index.js';