From 920746ed9c306f57b556a3e2a5ff31f40a4f327b Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Fri, 22 Aug 2025 20:38:51 +0200 Subject: [PATCH 1/2] Wait for pre-roll ads to finish in /player request (#7887) --- src/renderer/helpers/api/local.js | 48 +++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index 0325a8ec5fee0..660630e4a5bb3 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -59,13 +59,49 @@ async function createInnertube({ withPlayer = false, location = undefined, safet client_type: clientType, // use browser fetch - fetch: (input, init) => { - if (input.url?.startsWith('https://www.youtube.com/youtubei/v1/player')) { - init.body = init.body.replace('"videoId":', '"params":"8AEB","videoId":') - } + fetch: !withPlayer + ? (input, init) => fetch(input, init) + : async (input, init) => { + if (input.url?.startsWith('https://www.youtube.com/youtubei/v1/player') && init?.headers?.get('X-Youtube-Client-Name') === '2') { + const response = await fetch(input, init) + + const responseText = await response.text() + + const json = JSON.parse(responseText) + + if (Array.isArray(json.adSlots)) { + let waitSeconds = 0 + + for (const adSlot of json.adSlots) { + if (adSlot.adSlotRenderer?.adSlotMetadata?.triggerEvent === 'SLOT_TRIGGER_EVENT_BEFORE_CONTENT') { + const playerVars = adSlot.adSlotRenderer.fulfillmentContent?.fulfilledLayout?.playerBytesAdLayoutRenderer + ?.renderingContent?.instreamVideoAdRenderer?.playerVars + + if (playerVars) { + const match = playerVars.match(/length_seconds=([\d.]+)/) + + if (match) { + waitSeconds += parseFloat(match[1]) + } + } + } + } + + if (waitSeconds > 0) { + await new Promise((resolve) => setTimeout(resolve, waitSeconds * 1000)) + } + } + + // Need to return a new response object, as you can only read the response body once. + return new Response(responseText, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }) + } - return fetch(input, init) - }, + return fetch(input, init) + }, cache, generate_session_locally: !!generateSessionLocally }) From e87a9b7da4970a3d215d1abb9f6ffae96f65f984 Mon Sep 17 00:00:00 2001 From: efb4f5ff-1298-471a-8973-3d47447115dc <73130443+efb4f5ff-1298-471a-8973-3d47447115dc@users.noreply.github.com> Date: Sat, 23 Aug 2025 12:06:56 +0200 Subject: [PATCH 2/2] Bump package version from 0.23.7 to 0.23.8 (#7889) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index af98af22103a0..1ba6d1530188b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "freetube", "productName": "FreeTube", "description": "A private YouTube client", - "version": "0.23.7", + "version": "0.23.8", "license": "AGPL-3.0-or-later", "main": "./dist/main.js", "private": true,