您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Lưu và khôi phục thời gian xem video từ Firebase
- // ==UserScript==
- // @name Video Time Saver (Firebase)
- // @namespace http://tampermonkey.net/
- // @version 1.0
- // @description Lưu và khôi phục thời gian xem video từ Firebase
- // @author Bui Quoc Dung
- // @match *://*/*
- // @grant GM_xmlhttpRequest
- // @run-at document-end
- // ==/UserScript==
- (function () {
- "use strict";
- // 🔹 Cấu hình Firebase
- const FIREBASE_URL = "PASTE YOUR FIREBASE LINK";
- let video = null;
- let VIDEO_ID = "";
- // 🔍 1. Hàm lấy ID video
- function getVideoID() {
- const url = new URL(window.location.href);
- if (url.hostname.includes("youtube.com")) {
- return "youtube_" + url.searchParams.get("v"); // ID video YouTube
- }
- return window.location.pathname.replace(/[^a-zA-Z0-9]/g, ""); // ID cho trang khác
- }
- // 🔍 2. Tìm video (hỗ trợ cả video chuẩn & Plyr.js)
- function findVideo() {
- video = document.querySelector("video") || findPlyrVideo();
- if (video) {
- console.log("🎥 Video found:", video);
- loadVideoTime();
- video.addEventListener("timeupdate", saveVideoTime);
- } else {
- console.log("⏳ Chờ video tải...");
- setTimeout(findVideo, 1000);
- }
- }
- // 🔍 3. Kiểm tra Plyr.js hoặc Video.js
- function findPlyrVideo() {
- if (typeof Plyr !== "undefined" && Plyr.instances.length > 0) {
- return Plyr.instances[0].elements.container.querySelector("video");
- }
- return null;
- }
- // ⬇️ 4. Lấy thời gian video từ Firebase
- function loadVideoTime() {
- GM_xmlhttpRequest({
- method: "GET",
- url: FIREBASE_URL,
- onload: function (response) {
- const data = JSON.parse(response.responseText);
- if (data && data[VIDEO_ID]) {
- const savedTime = data[VIDEO_ID].time;
- console.log("⏩ Khôi phục video tại:", savedTime);
- video.currentTime = savedTime;
- }
- },
- });
- }
- // ⬆️ 5. Lưu thời gian video lên Firebase mỗi 5 giây
- function saveVideoTime() {
- if (!video || video.paused || video.ended) return;
- const time = Math.floor(video.currentTime);
- console.log("💾 Lưu thời gian:", time);
- GM_xmlhttpRequest({
- method: "PATCH",
- url: FIREBASE_URL,
- headers: { "Content-Type": "application/json" },
- data: JSON.stringify({ [VIDEO_ID]: { time: time } }),
- });
- }
- // 🔄 6. Theo dõi thay đổi URL trên YouTube (hỗ trợ SPA)
- function observeURLChanges() {
- let lastURL = window.location.href;
- setInterval(() => {
- if (window.location.href !== lastURL) {
- console.log("🔄 URL changed, reloading script...");
- lastURL = window.location.href;
- VIDEO_ID = getVideoID();
- findVideo();
- }
- }, 1000);
- }
- // 🚀 Chạy script
- VIDEO_ID = getVideoID();
- findVideo();
- observeURLChanges(); // Theo dõi sự thay đổi URL trên YouTube
- })();