mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
fix(music-together): modernize code
This commit is contained in:
@ -1,15 +1,12 @@
|
|||||||
import { SHA1Hash } from './sha1hash';
|
import { SHA1Hash } from './sha1hash';
|
||||||
|
|
||||||
export const extractToken = (cookie = document.cookie) => cookie.match(/SAPISID=([^;]+);/)?.[1] ?? cookie.match(/__Secure\-3PAPISID=([^;]+);/)?.[1];
|
export const extractToken = (cookie = document.cookie) => cookie.match(/SAPISID=([^;]+);/)?.[1] ?? cookie.match(/__Secure-3PAPISID=([^;]+);/)?.[1];
|
||||||
|
|
||||||
export const getHash = (papisid: string, millis = Date.now(), origin: string = 'https://music.youtube.com') => {
|
export const getHash = async (papisid: string, millis = Date.now(), origin: string = 'https://music.youtube.com') =>
|
||||||
const hash = SHA1Hash();
|
(await SHA1Hash(`${millis} ${papisid} ${origin}`)).toLowerCase();
|
||||||
hash.update(`${millis} ${papisid} ${origin}`);
|
|
||||||
return hash.digestString().toLowerCase();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getAuthorizationHeader = (papisid: string, millis = Date.now(), origin: string = 'https://music.youtube.com') => {
|
export const getAuthorizationHeader = async (papisid: string, millis = Date.now(), origin: string = 'https://music.youtube.com') => {
|
||||||
return `SAPISIDHASH ${millis}_${getHash(papisid, millis, origin)}`;
|
return `SAPISIDHASH ${millis}_${await getHash(papisid, millis, origin)}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getClient = () => {
|
export const getClient = () => {
|
||||||
|
|||||||
@ -1,129 +1,7 @@
|
|||||||
export function SHA1Hash(): {
|
export const SHA1Hash = async (str: string) => {
|
||||||
reset: () => void,
|
const enc = new TextEncoder();
|
||||||
update: (message: string | number[], length?: number) => void,
|
const hash = await crypto.subtle.digest('SHA-1', enc.encode(str));
|
||||||
digest: () => number[],
|
return Array.from(new Uint8Array(hash))
|
||||||
digestString: () => string
|
.map((v) => v.toString(16).padStart(2, '0'))
|
||||||
} {
|
.join('');
|
||||||
let hash: number[];
|
};
|
||||||
|
|
||||||
function initialize(): void {
|
|
||||||
hash = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
|
|
||||||
totalLength = currentLength = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function processBlock(block: number[]): void {
|
|
||||||
const words: number[] = [];
|
|
||||||
for (let i = 0; i < 64; i += 4) {
|
|
||||||
words[i / 4] = (block[i] << 24) | (block[i + 1] << 16) | (block[i + 2] << 8) | block[i + 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 16; i < 80; i++) {
|
|
||||||
const temp = words[i - 3] ^ words[i - 8] ^ words[i - 14] ^ words[i - 16];
|
|
||||||
words[i] = ((temp << 1) | (temp >>> 31)) & 4294967295;
|
|
||||||
}
|
|
||||||
|
|
||||||
let a = hash[0],
|
|
||||||
b = hash[1],
|
|
||||||
c = hash[2],
|
|
||||||
d = hash[3],
|
|
||||||
e = hash[4];
|
|
||||||
for (let i = 0; i < 80; i++) {
|
|
||||||
let f, k;
|
|
||||||
if (i < 20) {
|
|
||||||
f = d ^ (b & (c ^ d));
|
|
||||||
k = 1518500249;
|
|
||||||
} else if (i < 40) {
|
|
||||||
f = b ^ c ^ d;
|
|
||||||
k = 1859775393;
|
|
||||||
} else if (i < 60) {
|
|
||||||
f = (b & c) | (d & (b | c));
|
|
||||||
k = 2400959708;
|
|
||||||
} else {
|
|
||||||
f = b ^ c ^ d;
|
|
||||||
k = 3395469782;
|
|
||||||
}
|
|
||||||
const temp = (((a << 5) | (a >>> 27)) & 4294967295) + f + e + k + words[i] & 4294967295;
|
|
||||||
e = d;
|
|
||||||
d = c;
|
|
||||||
c = ((b << 30) | (b >>> 2)) & 4294967295;
|
|
||||||
b = a;
|
|
||||||
a = temp;
|
|
||||||
}
|
|
||||||
hash[0] = hash[0] + a & 4294967295;
|
|
||||||
hash[1] = hash[1] + b & 4294967295;
|
|
||||||
hash[2] = hash[2] + c & 4294967295;
|
|
||||||
hash[3] = hash[3] + d & 4294967295;
|
|
||||||
hash[4] = hash[4] + e & 4294967295;
|
|
||||||
}
|
|
||||||
|
|
||||||
function update(message: string | number[], length?: number): void {
|
|
||||||
if ('string' === typeof message) {
|
|
||||||
// HACK: to decode UTF-8
|
|
||||||
message = unescape(encodeURIComponent(message));
|
|
||||||
const bytes: number[] = [];
|
|
||||||
for (let i = 0, len = message.length; i < len; ++i)
|
|
||||||
bytes.push(message.charCodeAt(i));
|
|
||||||
message = bytes;
|
|
||||||
}
|
|
||||||
length || (length = message.length);
|
|
||||||
let i = 0;
|
|
||||||
if (0 == currentLength)
|
|
||||||
for (; i + 64 < length;) {
|
|
||||||
processBlock(message.slice(i, i + 64));
|
|
||||||
i += 64;
|
|
||||||
totalLength += 64;
|
|
||||||
}
|
|
||||||
for (; i < length;) {
|
|
||||||
if (buffer[currentLength++] = message[i++], totalLength++, 64 == currentLength)
|
|
||||||
for (currentLength = 0, processBlock(buffer); i + 64 < length;) {
|
|
||||||
processBlock(message.slice(i, i + 64));
|
|
||||||
i += 64;
|
|
||||||
totalLength += 64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function finalize(): number[] {
|
|
||||||
const result: number[] = [];
|
|
||||||
let bits = 8 * totalLength;
|
|
||||||
if (currentLength < 56) {
|
|
||||||
update(padding, 56 - currentLength);
|
|
||||||
} else {
|
|
||||||
update(padding, 64 - (currentLength - 56));
|
|
||||||
}
|
|
||||||
for (let i = 63; i >= 56; i--) {
|
|
||||||
buffer[i] = bits & 255;
|
|
||||||
bits >>>= 8;
|
|
||||||
}
|
|
||||||
processBlock(buffer);
|
|
||||||
for (let i = 0; i < 5; i++) {
|
|
||||||
for (let j = 24; j >= 0; j -= 8) {
|
|
||||||
result.push((hash[i] >> j) & 255);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
const buffer: number[] = [];
|
|
||||||
const padding: number[] = [128];
|
|
||||||
let totalLength: number;
|
|
||||||
let currentLength: number;
|
|
||||||
|
|
||||||
for (let i = 1; i < 64; ++i) {
|
|
||||||
padding[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
initialize();
|
|
||||||
return {
|
|
||||||
reset: initialize,
|
|
||||||
update: update,
|
|
||||||
digest: finalize,
|
|
||||||
digestString: function(): string {
|
|
||||||
const hash = finalize();
|
|
||||||
let hex = '';
|
|
||||||
for (let i = 0; i < hash.length; i++)
|
|
||||||
hex += '0123456789ABCDEF'.charAt(Math.floor(hash[i] / 16)) + '0123456789ABCDEF'.charAt(hash[i] % 16);
|
|
||||||
return hex;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|||||||
@ -33,8 +33,8 @@ export const getMusicQueueRenderer = async (videoIds: string[]): Promise<QueueRe
|
|||||||
}),
|
}),
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
Origin: 'https://music.youtube.com',
|
'Origin': 'https://music.youtube.com',
|
||||||
Authorization: getAuthorizationHeader(token)
|
'Authorization': await getAuthorizationHeader(token),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user