mirror of
https://github.com/LuanRT/googlevideo.git
synced 2026-06-13 00:32:11 +00:00
feat: Add support for unencrypted onesie requests & responses
Useful for those looking to skip encryption.
This commit is contained in:
@@ -108,7 +108,7 @@ async function prepareOnesieRequest(args: OnesieRequestArgs): Promise<OnesieRequ
|
||||
headers,
|
||||
body: JSON.stringify(playerRequestJson),
|
||||
proxiedByTrustedBandaid: true,
|
||||
field6: false
|
||||
skipResponseEncryption: true
|
||||
}).finish();
|
||||
|
||||
const { encrypted, hmac, iv } = await encryptRequest(clientKeyData, onesieRequest);
|
||||
@@ -118,6 +118,10 @@ async function prepareOnesieRequest(args: OnesieRequestArgs): Promise<OnesieRequ
|
||||
playerRequest: {
|
||||
encryptedClientKey,
|
||||
encryptedOnesiePlayerRequest: encrypted,
|
||||
/*
|
||||
* If you want to use an unencrypted player request:
|
||||
* unencryptedOnesiePlayerRequest: onesieRequest,
|
||||
*/
|
||||
enableCompression: false,
|
||||
hmac: hmac,
|
||||
iv: iv,
|
||||
@@ -222,9 +226,9 @@ async function getBasicInfo(innertube: Innertube, videoId: string): Promise<YT.V
|
||||
|
||||
const iv = onesiePlayerResponse.cryptoParams.iv;
|
||||
const hmac = onesiePlayerResponse.cryptoParams.hmac;
|
||||
const encrypted = onesiePlayerResponse.data;
|
||||
|
||||
const decryptedData = await decryptResponse(iv, hmac, encrypted, clientConfig.clientKeyData);
|
||||
// If skipResponseEncryption is set to true in the request, the response will not be encrypted.
|
||||
const decryptedData = hmac?.length && iv?.length ? await decryptResponse(iv, hmac, onesiePlayerResponse.data, clientConfig.clientKeyData) : onesiePlayerResponse.data!;
|
||||
const response = Protos.OnesiePlayerResponse.decode(decryptedData);
|
||||
|
||||
if (response.onesieProxyStatus !== Protos.OnesieProxyStatus.ONESIE_PROXY_STATUS_OK)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
/* eslint-disable */
|
||||
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
|
||||
import { OnesiePlayerRequest } from "./onesie_player_request.js";
|
||||
|
||||
export const protobufPackage = "video_streaming";
|
||||
|
||||
@@ -21,7 +20,7 @@ export interface EncryptedPlayerRequest {
|
||||
YP?: boolean | undefined;
|
||||
pM?: boolean | undefined;
|
||||
enableCompression?: boolean | undefined;
|
||||
onesiePlayerRequest?: OnesiePlayerRequest | undefined;
|
||||
unencryptedOnesiePlayerRequest?: Uint8Array | undefined;
|
||||
TQ?: boolean | undefined;
|
||||
}
|
||||
|
||||
@@ -36,7 +35,7 @@ function createBaseEncryptedPlayerRequest(): EncryptedPlayerRequest {
|
||||
YP: false,
|
||||
pM: false,
|
||||
enableCompression: false,
|
||||
onesiePlayerRequest: undefined,
|
||||
unencryptedOnesiePlayerRequest: new Uint8Array(0),
|
||||
TQ: false,
|
||||
};
|
||||
}
|
||||
@@ -70,8 +69,8 @@ export const EncryptedPlayerRequest: MessageFns<EncryptedPlayerRequest> = {
|
||||
if (message.enableCompression !== undefined && message.enableCompression !== false) {
|
||||
writer.uint32(112).bool(message.enableCompression);
|
||||
}
|
||||
if (message.onesiePlayerRequest !== undefined) {
|
||||
OnesiePlayerRequest.encode(message.onesiePlayerRequest, writer.uint32(130).fork()).join();
|
||||
if (message.unencryptedOnesiePlayerRequest !== undefined && message.unencryptedOnesiePlayerRequest.length !== 0) {
|
||||
writer.uint32(130).bytes(message.unencryptedOnesiePlayerRequest);
|
||||
}
|
||||
if (message.TQ !== undefined && message.TQ !== false) {
|
||||
writer.uint32(136).bool(message.TQ);
|
||||
@@ -154,7 +153,7 @@ export const EncryptedPlayerRequest: MessageFns<EncryptedPlayerRequest> = {
|
||||
break;
|
||||
}
|
||||
|
||||
message.onesiePlayerRequest = OnesiePlayerRequest.decode(reader, reader.uint32());
|
||||
message.unencryptedOnesiePlayerRequest = reader.bytes();
|
||||
continue;
|
||||
case 17:
|
||||
if (tag !== 136) {
|
||||
@@ -187,9 +186,9 @@ export const EncryptedPlayerRequest: MessageFns<EncryptedPlayerRequest> = {
|
||||
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,
|
||||
onesiePlayerRequest: isSet(object.onesiePlayerRequest)
|
||||
? OnesiePlayerRequest.fromJSON(object.onesiePlayerRequest)
|
||||
: undefined,
|
||||
unencryptedOnesiePlayerRequest: isSet(object.unencryptedOnesiePlayerRequest)
|
||||
? bytesFromBase64(object.unencryptedOnesiePlayerRequest)
|
||||
: new Uint8Array(0),
|
||||
TQ: isSet(object.TQ) ? globalThis.Boolean(object.TQ) : false,
|
||||
};
|
||||
},
|
||||
@@ -223,8 +222,8 @@ export const EncryptedPlayerRequest: MessageFns<EncryptedPlayerRequest> = {
|
||||
if (message.enableCompression !== undefined && message.enableCompression !== false) {
|
||||
obj.enableCompression = message.enableCompression;
|
||||
}
|
||||
if (message.onesiePlayerRequest !== undefined) {
|
||||
obj.onesiePlayerRequest = OnesiePlayerRequest.toJSON(message.onesiePlayerRequest);
|
||||
if (message.unencryptedOnesiePlayerRequest !== undefined && message.unencryptedOnesiePlayerRequest.length !== 0) {
|
||||
obj.unencryptedOnesiePlayerRequest = base64FromBytes(message.unencryptedOnesiePlayerRequest);
|
||||
}
|
||||
if (message.TQ !== undefined && message.TQ !== false) {
|
||||
obj.TQ = message.TQ;
|
||||
@@ -246,9 +245,7 @@ export const EncryptedPlayerRequest: MessageFns<EncryptedPlayerRequest> = {
|
||||
message.YP = object.YP ?? false;
|
||||
message.pM = object.pM ?? false;
|
||||
message.enableCompression = object.enableCompression ?? false;
|
||||
message.onesiePlayerRequest = (object.onesiePlayerRequest !== undefined && object.onesiePlayerRequest !== null)
|
||||
? OnesiePlayerRequest.fromPartial(object.onesiePlayerRequest)
|
||||
: undefined;
|
||||
message.unencryptedOnesiePlayerRequest = object.unencryptedOnesiePlayerRequest ?? new Uint8Array(0);
|
||||
message.TQ = object.TQ ?? false;
|
||||
return message;
|
||||
},
|
||||
|
||||
@@ -14,15 +14,12 @@ 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;
|
||||
proxiedByTrustedBandaid?: boolean | undefined;
|
||||
skipResponseEncryption?: boolean | undefined;
|
||||
}
|
||||
|
||||
function createBaseOnesiePlayerRequest(): OnesiePlayerRequest {
|
||||
return { url: "", headers: [], body: "", proxiedByTrustedBandaid: false, field6: false };
|
||||
return { url: "", headers: [], body: "", proxiedByTrustedBandaid: false, skipResponseEncryption: false };
|
||||
}
|
||||
|
||||
export const OnesiePlayerRequest: MessageFns<OnesiePlayerRequest> = {
|
||||
@@ -39,8 +36,8 @@ export const OnesiePlayerRequest: MessageFns<OnesiePlayerRequest> = {
|
||||
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);
|
||||
if (message.skipResponseEncryption !== undefined && message.skipResponseEncryption !== false) {
|
||||
writer.uint32(48).bool(message.skipResponseEncryption);
|
||||
}
|
||||
return writer;
|
||||
},
|
||||
@@ -85,7 +82,7 @@ export const OnesiePlayerRequest: MessageFns<OnesiePlayerRequest> = {
|
||||
break;
|
||||
}
|
||||
|
||||
message.field6 = reader.bool();
|
||||
message.skipResponseEncryption = reader.bool();
|
||||
continue;
|
||||
}
|
||||
if ((tag & 7) === 4 || tag === 0) {
|
||||
@@ -104,7 +101,9 @@ export const OnesiePlayerRequest: MessageFns<OnesiePlayerRequest> = {
|
||||
proxiedByTrustedBandaid: isSet(object.proxiedByTrustedBandaid)
|
||||
? globalThis.Boolean(object.proxiedByTrustedBandaid)
|
||||
: false,
|
||||
field6: isSet(object.field6) ? globalThis.Boolean(object.field6) : false,
|
||||
skipResponseEncryption: isSet(object.skipResponseEncryption)
|
||||
? globalThis.Boolean(object.skipResponseEncryption)
|
||||
: false,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -122,8 +121,8 @@ export const OnesiePlayerRequest: MessageFns<OnesiePlayerRequest> = {
|
||||
if (message.proxiedByTrustedBandaid !== undefined && message.proxiedByTrustedBandaid !== false) {
|
||||
obj.proxiedByTrustedBandaid = message.proxiedByTrustedBandaid;
|
||||
}
|
||||
if (message.field6 !== undefined && message.field6 !== false) {
|
||||
obj.field6 = message.field6;
|
||||
if (message.skipResponseEncryption !== undefined && message.skipResponseEncryption !== false) {
|
||||
obj.skipResponseEncryption = message.skipResponseEncryption;
|
||||
}
|
||||
return obj;
|
||||
},
|
||||
@@ -137,7 +136,7 @@ export const OnesiePlayerRequest: MessageFns<OnesiePlayerRequest> = {
|
||||
message.headers = object.headers?.map((e) => HttpHeader.fromPartial(e)) || [];
|
||||
message.body = object.body ?? "";
|
||||
message.proxiedByTrustedBandaid = object.proxiedByTrustedBandaid ?? false;
|
||||
message.field6 = object.field6 ?? false;
|
||||
message.skipResponseEncryption = object.skipResponseEncryption ?? false;
|
||||
return message;
|
||||
},
|
||||
};
|
||||
|
||||
@@ -13,6 +13,6 @@ message EncryptedPlayerRequest {
|
||||
optional bool YP = 10;
|
||||
optional bool pM = 13;
|
||||
optional bool enable_compression = 14;
|
||||
optional OnesiePlayerRequest onesie_player_request = 16;
|
||||
optional bytes unencrypted_onesie_player_request = 16;
|
||||
optional bool TQ = 17;
|
||||
}
|
||||
Reference in New Issue
Block a user