Warning: fopen(/www/sites/update.greasyfork.icu/index/store/temp/1620069e12828baecbae5b978529c9e2.js): failed to open stream: No space left on device in /www/sites/update.greasyfork.icu/index/scriptControl.php on line 65
// ==UserScript==
// @name Kick.com Video Resume
// @namespace https://greasyfork.org/users/1370822
// @version 1.0
// @description Automatically bookmarks Kick.com videos and resumes where you left off.
// @author HANT3R
// @license MIT
// @match https://kick.com/*
// @grant none
// @downloadURL https://update.greasyfork.icu/scripts/509462/Kickcom%20Video%20Resume.user.js
// @updateURL https://update.greasyfork.icu/scripts/509462/Kickcom%20Video%20Resume.meta.js
// ==/UserScript==
(function() {
'use strict';
let saveInterval = null;
let lastSavedTime = 0;
// Function to save video time to local storage every 5 seconds
function saveVideoTime(video) {
const videoId = window.location.pathname; // Get unique video URL or ID
const currentTime = Math.floor(video.currentTime); // Round off to avoid excessive changes
if (currentTime !== lastSavedTime) {
localStorage.setItem(`kick_video_time_${videoId}`, currentTime);
lastSavedTime = currentTime;
}
}
// Function to load video time from local storage
function loadVideoTime(video) {
const videoId = window.location.pathname;
const savedTime = localStorage.getItem(`kick_video_time_${videoId}`);
if (savedTime) {
video.currentTime = parseFloat(savedTime);
console.log(`Resuming video from ${savedTime} seconds`);
}
}
// Initialize video resume functionality
function initVideoResume(video) {
loadVideoTime(video);
// Set an interval to save the video time every 5 seconds
saveInterval = setInterval(() => saveVideoTime(video), 5000);
// Also save when the video is paused
video.addEventListener('pause', () => saveVideoTime(video));
// Cleanup when video ends or is no longer available
video.addEventListener('ended', () => clearInterval(saveInterval));
}
// Wait for the video element to load
function onVideoLoad() {
const video = document.querySelector('video');
if (video && !video.hasAttribute('data-resume-init')) {
video.setAttribute('data-resume-init', 'true'); // Prevent reinitialization
video.addEventListener('loadeddata', () => initVideoResume(video), { once: true });
}
}
// Observe DOM changes to detect when a new video loads
const observer = new MutationObserver(onVideoLoad);
observer.observe(document.body, { childList: true, subtree: true });
})();