feat: Add support for unencrypted onesie requests & responses

Useful for those looking to skip encryption.
This commit is contained in:
Luan
2025-02-15 21:03:08 -03:00
parent 9db40aba02
commit 418898faa9
4 changed files with 31 additions and 31 deletions

View File

@@ -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)

View File

@@ -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;
},

View File

@@ -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;
},
};

View File

@@ -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;
}