Background playback for Via Browser

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

  1. // ==UserScript==
  2. // @name Background playback for Via Browser
  3. // @namespace Violentmonkey Scripts
  4. // @match https://*.youtube.com/*
  5. // @match https://*.youtube.com/
  6. // @match https://m.youtube.com/*
  7. // @match https://m.youtube.com/
  8. // @match https://*.youtube-nocookie.com/*
  9. // @match *://*.youtube.com/*
  10. // @match *://*.youtube-nocookie.com/*
  11. // @grant none
  12. // @version 1.2 beta
  13. // @author Johnny Inc.
  14. // @description 11/2/2023, 4:29:15 PM
  15. // ==/UserScript==
  16. 'use strict';
  17.  
  18. const lactRefreshInterval = 5 * 60 * 1000; // 5 phút (mili giây)
  19. const initialLactDelay = 1000; // 1 giây (độ trễ ban đầu trước khi kiểm tra _lact)
  20.  
  21. console.log("Bắt đầu script giữ tab hoạt động nền...");
  22.  
  23. // --- Cố gắng ép buộc trạng thái "visible" bằng Page Visibility API ---
  24. try {
  25. Object.defineProperties(document, {
  26. 'hidden': { value: false },
  27. 'visibilityState': { value: 'visible' }
  28. });
  29. window.addEventListener('visibilitychange', e => e.stopImmediatePropagation(), true);
  30. console.log("Thao tác Page Visibility API thành công.");
  31. } catch (error) {
  32. 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);
  33. }
  34.  
  35. // --- Hàm chờ _lact và sau đó cập nhật định kỳ ---
  36. function waitForYoutubeLactInit(delay = initialLactDelay) {
  37. if (typeof window !== 'undefined' && window && window.hasOwnProperty('_lact')) {
  38. console.log("_lact đã được tìm thấy. Bắt đầu cập nhật định kỳ.");
  39. window.setInterval(() => {
  40. try {
  41. if (typeof window !== 'undefined' && window) {
  42. window._lact = Date.now();
  43. // console.debug("_lact đã được cập nhật:", window._lact); // Gỡ lỗi tùy chọn - có thể gây tràn console
  44. } else {
  45. console.warn("Đối tượng window không còn khả dụng trong interval. Dừng cập nhật lact.");
  46. 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)
  47. }
  48. } catch (error) {
  49. console.error("Lỗi trong interval cập nhật _lact:", error); // Xử lý lỗi trong interval
  50. clearInterval(this); // Dừng interval nếu có lỗi liên tục
  51. }
  52. }, lactRefreshInterval);
  53. } else {
  54. console.debug("_lact chưa được tìm thấy. Thử lại sau", delay, "ms");
  55. window.setTimeout(() => waitForYoutubeLactInit(delay * 2), delay); // Backoff độ trễ theo cấp số nhân
  56. }
  57. }
  58.  
  59. // --- Bắt đầu quá trình ---
  60. if (typeof window !== 'undefined' && window) {
  61. waitForYoutubeLactInit();
  62. console.log("waitForYoutubeLactInit đã được khởi động.");
  63. } else {
  64. console.warn("Script không chạy trong môi trường trình duyệt có đối tượng 'window'.");
  65. }
  66.  
  67. // --- Metadata Userscript (nếu cần cho trình quản lý userscript) ---
  68. // ==UserScript==
  69. // @name Giữ Tab Hoạt Động Nền (Lact Keep-Alive)
  70. // @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.
  71. // @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ể */
  72. // @run-at document-start /* Hoặc document-idle nếu document-start quá sớm */
  73. // @grant none
  74. // @all-frames true
  75. // ==/UserScript==

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址