Background playback for Via Browser

11/2/2023, 4:29:15 PM

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name        Background playback for Via Browser
// @namespace   Violentmonkey Scripts
// @match       https://*.youtube.com/*
// @match       https://*.youtube.com/
// @match       https://m.youtube.com/*
// @match       https://m.youtube.com/
// @match       https://*.youtube-nocookie.com/*
// @match       *://*.youtube.com/*
// @match       *://*.youtube-nocookie.com/*
// @grant       none
// @version     1.2 beta
// @author      Johnny Inc.
// @description 11/2/2023, 4:29:15 PM
// ==/UserScript==
'use strict';

const lactRefreshInterval = 5 * 60 * 1000; // 5 phút (mili giây)
const initialLactDelay = 1000; // 1 giây (độ trễ ban đầu trước khi kiểm tra _lact)

console.log("Bắt đầu script giữ tab hoạt động nền...");

// --- Cố gắng ép buộc trạng thái "visible" bằng Page Visibility API ---
try {
    Object.defineProperties(document, {
        'hidden': { value: false },
        'visibilityState': { value: 'visible' }
    });
    window.addEventListener('visibilitychange', e => e.stopImmediatePropagation(), true);
    console.log("Thao tác Page Visibility API thành công.");
} catch (error) {
    console.warn("Thao tác Page Visibility API thất bại. Hoạt động nền có thể kém tin cậy hơn.", error);
}

// --- Hàm chờ _lact và sau đó cập nhật định kỳ ---
function waitForYoutubeLactInit(delay = initialLactDelay) {
    if (typeof window !== 'undefined' && window && window.hasOwnProperty('_lact')) {
        console.log("_lact đã được tìm thấy. Bắt đầu cập nhật định kỳ.");
        window.setInterval(() => {
            try {
                if (typeof window !== 'undefined' && window) {
                    window._lact = Date.now();
                    // console.debug("_lact đã được cập nhật:", window._lact); // Gỡ lỗi tùy chọn - có thể gây tràn console
                } else {
                    console.warn("Đối tượng window không còn khả dụng trong interval. Dừng cập nhật lact.");
                    clearInterval(this); // Dừng interval nếu window biến mất (khó xảy ra trong trình duyệt, nhưng để an toàn)
                }
            } catch (error) {
                console.error("Lỗi trong interval cập nhật _lact:", error); // Xử lý lỗi trong interval
                clearInterval(this); // Dừng interval nếu có lỗi liên tục
            }
        }, lactRefreshInterval);
    } else {
        console.debug("_lact chưa được tìm thấy. Thử lại sau", delay, "ms");
        window.setTimeout(() => waitForYoutubeLactInit(delay * 2), delay); // Backoff độ trễ theo cấp số nhân
    }
}

// --- Bắt đầu quá trình ---
if (typeof window !== 'undefined' && window) {
    waitForYoutubeLactInit();
    console.log("waitForYoutubeLactInit đã được khởi động.");
} else {
    console.warn("Script không chạy trong môi trường trình duyệt có đối tượng 'window'.");
}

// --- Metadata Userscript (nếu cần cho trình quản lý userscript) ---
// ==UserScript==
// @name        Giữ Tab Hoạt Động Nền (Lact Keep-Alive)
// @description Giữ cho tab hoạt động trong nền bằng cách cập nhật _lact. Có thể cải thiện độ tin cậy khi chạy nền.
// @match       *://*/*  /* Khớp với tất cả các URL - điều chỉnh nếu cần cho các trang cụ thể */
// @run-at      document-start /* Hoặc document-idle nếu document-start quá sớm */
// @grant       none
// @all-frames  true
// ==/UserScript==