diff --git a/yad/index.html b/yad/index.html index c90a383..11c0a49 100644 --- a/yad/index.html +++ b/yad/index.html @@ -4,7 +4,7 @@ YAD: YouTube Auto Delay - + @@ -36,7 +36,7 @@

YAD: YouTube Auto Delay

id="player" width="560" height="315" - src="https://www.youtube-nocookie.com/embed/jfKfPfyJRdk?autoplay=1&enablejsapi=1&iv_load_policy=3&start=900" + src="https://www.youtube-nocookie.com/embed/jfKfPfyJRdk?autoplay=1&enablejsapi=1&iv_load_policy=3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" diff --git a/yad/script.js b/yad/script.js index 6d7fb4d..1026109 100644 --- a/yad/script.js +++ b/yad/script.js @@ -1,9 +1,24 @@ -var player; +DELAY_PARAM_NAME = 'delay'; +VIDEO_ID_PARAM_NAME = 'videoId'; +DELAY_MARGIN = 60; + +function getParameterByName(name) { + var urlParams = new URLSearchParams(window.location.search); + return urlParams.get(name); +} + +function setInputsFromUrlParams() { + videoIdParam = getParameterByName(VIDEO_ID_PARAM_NAME) || 'jfKfPfyJRdk'; + document.getElementById('videoId').value = videoIdParam; + + delayParam = getParameterByName(DELAY_PARAM_NAME) || '900'; + document.getElementById('delay').value = delayParam; +} -function configurePlayer() { - var videoId = document.getElementById('videoId').value; - var delay = document.getElementById('delay').value; - player.loadVideoById({ videoId: videoId }); +async function configurePlayer() { + videoId = document.getElementById('videoId').value; + delay = document.getElementById('delay').value; + await player.loadVideoById({ videoId: videoId }); // Update the URL without triggering a full page reload var stateObj = { videoId: videoId, delay: delay }; @@ -11,13 +26,6 @@ function configurePlayer() { window.location.href.split('?')[0] + `?videoId=${videoId}&delay=${delay}`; history.pushState(stateObj, '', newUrl); - - console.log( - 'Configuring player with Video ID:', - videoId, - 'and Delay:', - delay, - ); } function loadPlayerAPI() { @@ -37,15 +45,60 @@ function onYouTubeIframeAPIReady() { } function onPlayerReady(event) { + configurePlayer(); event.target.playVideo(); } -var done = false; +function getSystemCurrentTime() { + return Math.floor(new Date().getTime() / 1000); +} + +function isVideoCurrentTimeGood() { + var currentTime = Math.floor(player.getCurrentTime()); + var perfectTime = calculateVideoDelayedTime(); + if (perfectTime === 0) { + console.error('Invalid perfect time:', perfectTime); + } + return (currentTime - perfectTime) < DELAY_MARGIN && (currentTime - perfectTime) > -DELAY_MARGIN; +} + function onPlayerStateChange(event) { - if (event.data == YT.PlayerState.PLAYING && !done) { - setTimeout(() => player.stopVideo(), 6000); - done = true; + if (event.data == YT.PlayerState.PLAYING) { + isPlayerReady = true; + systemTimeWhenStarted = getSystemCurrentTime(); + // for live streams player.getDuration() gives a much bigger time than actual duration + durationWhenStarted = player.getDuration() - 3600; + + console.log(calculateVideoDelayedTime(), player.getCurrentTime(), !isVideoCurrentTimeGood()); + } +} + +function calculateVideoDelayedTime() { + if (!(durationWhenStarted > 0) || !(systemTimeWhenStarted > 0)) { + console.error('Invalid duration:', durationWhenStarted, 'or time:', systemTimeWhenStarted); + return 0; } + return (getSystemCurrentTime() - systemTimeWhenStarted) + (durationWhenStarted - delay); } +var player; +// duration of video when it started playing in seconds +// (it doesn't get auto updated for live streams) +var durationWhenStarted; +var systemTimeWhenStarted; // current time when video started in seconds +var intervalId = -1; +var videoId = getParameterByName(VIDEO_ID_PARAM_NAME); +var delay = getParameterByName(DELAY_PARAM_NAME); +var isPlayerReady = false; +setInputsFromUrlParams(); + loadPlayerAPI(); + +intervalId = setInterval(() => { + if (isPlayerReady && !isVideoCurrentTimeGood()) { + var perfectTime = calculateVideoDelayedTime(); + console.log('Seeking to:', perfectTime); + player.seekTo(perfectTime); + isPlayerReady = false; + } +}, 1000); \ No newline at end of file