mirror of
https://github.com/YuzuZensai/NekoMelody.git
synced 2026-01-31 14:57:58 +00:00
✨ feat: Speed optimization
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
|
import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
|
||||||
import playwright, { Browser } from "playwright";
|
import playwright, { Browser } from "playwright";
|
||||||
|
|
||||||
let browser: Browser | null = null;
|
let lastUpdate: Date | null = null;
|
||||||
let globalHeaders: Record<string, string> = {};
|
let globalHeaders: Record<string, string> = {};
|
||||||
let globalCookies: string = "";
|
let globalCookies: string = "";
|
||||||
|
|
||||||
@@ -63,8 +63,15 @@ export async function getStream(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function getYouTubeFormats(id: string) {
|
export async function getYouTubeFormats(id: string) {
|
||||||
if (!browser) {
|
let body;
|
||||||
browser = await playwright["chromium"].launch({
|
if (
|
||||||
|
!globalCookies ||
|
||||||
|
!globalHeaders ||
|
||||||
|
!lastUpdate ||
|
||||||
|
lastUpdate < new Date(Date.now() - 30 * 60 * 1000)
|
||||||
|
) {
|
||||||
|
console.debug("Using playwright");
|
||||||
|
const browser = await playwright["chromium"].launch({
|
||||||
headless: true,
|
headless: true,
|
||||||
args: [
|
args: [
|
||||||
"--disable-gpu",
|
"--disable-gpu",
|
||||||
@@ -80,30 +87,45 @@ export async function getYouTubeFormats(id: string) {
|
|||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
browser.once("disconnected", () => {
|
const page = await browser.newPage();
|
||||||
browser = null;
|
|
||||||
|
page.once("request", (request) => {
|
||||||
|
globalHeaders = request.headers();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await page.goto(
|
||||||
|
`https://www.youtube.com/watch?v=${id}&has_verified=1`,
|
||||||
|
{
|
||||||
|
waitUntil: "domcontentloaded",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
body = await page.evaluate(() => document.body.innerHTML);
|
||||||
|
|
||||||
|
const cookies = await page.context().cookies();
|
||||||
|
|
||||||
|
globalCookies = cookies
|
||||||
|
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
||||||
|
.join("; ");
|
||||||
|
|
||||||
|
await page.close();
|
||||||
|
await browser.close();
|
||||||
|
|
||||||
|
lastUpdate = new Date();
|
||||||
|
} else {
|
||||||
|
console.debug("Using axios");
|
||||||
|
const response = await axios.get(
|
||||||
|
`https://www.youtube.com/watch?v=${id}&has_verified=1`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
...globalHeaders,
|
||||||
|
Cookie: globalCookies,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
body = response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
const page = await browser.newPage();
|
|
||||||
|
|
||||||
page.once("request", (request) => {
|
|
||||||
globalHeaders = request.headers();
|
|
||||||
});
|
|
||||||
|
|
||||||
await page.goto(`https://www.youtube.com/watch?v=${id}&has_verified=1`, {
|
|
||||||
waitUntil: "domcontentloaded",
|
|
||||||
});
|
|
||||||
const body = await page.evaluate(() => document.body.innerHTML);
|
|
||||||
const cookies = await page.context().cookies();
|
|
||||||
|
|
||||||
globalCookies = cookies
|
|
||||||
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
|
||||||
.join("; ");
|
|
||||||
|
|
||||||
await page.close();
|
|
||||||
await browser.close();
|
|
||||||
|
|
||||||
const match = body.match(
|
const match = body.match(
|
||||||
/var ytInitialPlayerResponse = (.*?)(?=;\s*<\/script>)/,
|
/var ytInitialPlayerResponse = (.*?)(?=;\s*<\/script>)/,
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user