1
0
Fork 0
mirror of https://codeberg.org/ashley/poke.git synced 2024-11-17 07:14:40 -05:00
poke/css/app.js

239 lines
7 KiB
JavaScript
Raw Normal View History

2023-04-12 16:40:06 -04:00
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
// Retrieve volume from local storage or set to max if not available
const initialVolume = localStorage.getItem('playerVolume') || 1;
const video = document.getElementById('video');
video.volume = initialVolume;
// Save volume to local storage whenever it changes
video.addEventListener('volumechange', function() {
localStorage.setItem('playerVolume', this.volume);
});
// Get the progress bar and container elements
2023-06-10 04:07:07 -04:00
const progressBar = document.querySelector(".progress-bar");
const progressContainer = document.querySelector(".progress-container");
2023-04-12 16:40:06 -04:00
// Set the initial width of the progress bar to 0%
2023-06-10 04:07:07 -04:00
progressBar.style.width = "0%";
progressContainer.style.display = 'block';
2023-04-12 16:40:06 -04:00
// Attach an event listener to the window object to listen for the 'load' event
window.addEventListener("load", () => {
2023-06-10 04:07:07 -04:00
progressBar.style.width = "100%";
2023-04-12 16:40:06 -04:00
setTimeout(() => {
2023-06-10 04:07:07 -04:00
progressContainer.style.display = 'none';
2023-04-12 16:40:06 -04:00
}, 500);
});
2023-06-10 04:07:07 -04:00
// Lazy load background images
2023-04-12 16:40:06 -04:00
document.addEventListener('DOMContentLoaded', function() {
2023-06-10 04:07:07 -04:00
const bgs = document.querySelectorAll('[data-bg]');
let bgCount = bgs.length;
function loadBg(index) {
const bg = bgs[index];
const bgUrl = bg.getAttribute('data-bg');
bg.style.backgroundImage = `url(${bgUrl})`;
2023-04-12 16:40:06 -04:00
bg.removeAttribute('data-bg');
bg.classList.add('loaded');
}
function lazyLoadBg() {
for (let i = 0; i < bgCount; i++) {
2023-06-10 04:07:07 -04:00
const bg = bgs[i];
const bgRect = bg.getBoundingClientRect();
2023-04-12 16:40:06 -04:00
if (bgRect.top < window.innerHeight && bgRect.bottom > 0) {
loadBg(i);
}
}
}
2023-06-10 04:07:07 -04:00
2023-04-12 16:40:06 -04:00
lazyLoadBg();
2023-06-10 04:07:07 -04:00
2023-04-12 16:40:06 -04:00
window.addEventListener('scroll', lazyLoadBg);
window.addEventListener('resize', lazyLoadBg);
});
2023-06-10 04:07:07 -04:00
// Fade in elements on scroll or fullscreen change
function fadeInElements() {
2023-04-12 16:40:06 -04:00
const elements = document.querySelectorAll('.fade-in');
const viewportHeight = window.innerHeight;
elements.forEach(element => {
const elementTop = element.getBoundingClientRect().top;
const elementBottom = element.getBoundingClientRect().bottom;
const isVisible = (elementTop < viewportHeight && elementBottom > 0);
if (isVisible || document.fullscreenElement) {
element.classList.add('fade-in-active');
}
});
2023-06-10 04:07:07 -04:00
}
2023-04-12 16:40:06 -04:00
window.addEventListener('scroll', fadeInElements);
2023-06-10 04:07:07 -04:00
document.addEventListener('fullscreenchange', fadeInElements);
2023-04-12 16:40:06 -04:00
setInterval(fadeInElements, 500);
2023-06-18 12:13:15 -04:00
2023-06-10 10:44:04 -04:00
function jumpToTime(e) {
e.preventDefault();
const link = e.target;
const video = document.getElementById('video');
const time = link.dataset.jumpTime;
video.currentTime = time;
window.location.hash = 'top'; // Add #video to the URL
setTimeout(() => {
history.replaceState(null, null, ' '); // Remove #video after 1 second
}, 250);
}
2023-06-10 04:07:07 -04:00
// Handle click events for time-based links
const timeLinks = document.querySelectorAll('a[data-onclick="jump_to_time"]');
timeLinks.forEach(link => {
2023-04-12 16:40:06 -04:00
const href = link.getAttribute('href');
2023-06-10 04:07:07 -04:00
if (link.dataset.jumpTime && href && href.includes('&t=')) {
2023-04-12 16:40:06 -04:00
const params = new URLSearchParams(href.split('?')[1]);
const time = params.get('t');
if (time) {
link.dataset.jumpTime = time;
link.addEventListener('click', jumpToTime);
link.removeAttribute('href');
}
}
});
2023-09-09 12:37:04 -04:00
2023-04-12 16:40:06 -04:00
2023-06-10 04:07:07 -04:00
// Save and resume video progress
2023-04-12 16:40:06 -04:00
const videoId = new URLSearchParams(window.location.search).get('v');
const localStorageKey = `progress-${videoId}`;
function saveProgress() {
localStorage.setItem(localStorageKey, video.currentTime);
}
function removeProgress() {
localStorage.removeItem(localStorageKey);
}
function resumeProgress() {
const progress = localStorage.getItem(localStorageKey);
if (progress) {
video.currentTime = progress;
}
}
video.addEventListener('timeupdate', () => {
2023-06-10 04:07:07 -04:00
if (Math.floor(video.currentTime) % 1 === 0) {
2023-04-12 16:40:06 -04:00
saveProgress();
}
});
video.addEventListener('ended', () => {
removeProgress();
});
window.addEventListener('load', () => {
resumeProgress();
});
2023-06-10 04:07:07 -04:00
// Adjust video element style on fullscreen change
2023-04-12 16:40:06 -04:00
const videoElement = document.getElementById("video");
videoElement.addEventListener("fullscreenchange", () => {
2023-06-10 04:07:07 -04:00
videoElement.style.borderRadius = document.fullscreenElement === videoElement ? "0em" : "16px";
});
2023-04-28 16:36:16 -04:00
2023-09-09 12:37:04 -04:00
function fetchUrls(urls) {
let fetchedCount = 0;
urls.forEach(link => {
const url = new URL(link.href);
if (url.host !== 'www.youtube.com' && url.host !== 'youtube.com' && url.host !== "redirect.poketube.fun") {
console.log(`Fetching ${url.origin}`);
fetch(url.href)
.then(response => {
if (response.status === 500) {
// do nothing
}
console.log(`Fetched ${url.origin}`);
fetchedCount++;
console.clear();
if (fetchedCount === urls.length) {
document.body.classList.remove('blur');
}
})
.catch(error => {
console.clear();
if (!(error instanceof TypeError && error.message.includes('Failed to fetch'))) {
console.error(`Error fetching ${url.origin}: ${error}`);
}
});
}
});
}
2023-06-10 04:07:07 -04:00
// Fetch channel URLs
const channelUrls = document.querySelectorAll('a[href*="/channel?id="]');
2023-09-09 12:37:04 -04:00
fetchUrls(channelUrls);
2023-04-28 16:36:16 -04:00
2023-06-10 04:07:07 -04:00
// Fetch download URLs
const downloadUrls = document.querySelectorAll('a[href*="/download?v="]');
2023-09-09 12:37:04 -04:00
fetchUrls(downloadUrls);
// fetch videos urls
const urls = document.querySelectorAll('a[href*="/watch?v="]');
fetchUrls(urls);
2023-06-18 12:13:15 -04:00
var popupMenu = document.getElementById("popupMenu");
var loopOption = document.getElementById("loopOption");
var speedOption = document.getElementById("speedOption");
video.addEventListener("contextmenu", function(event) {
event.preventDefault();
popupMenu.style.display = "block";
popupMenu.style.left = event.pageX + "px";
popupMenu.style.top = event.pageY + "px";
});
// Hide the popup menu when clicking outside of it
window.addEventListener("click", function(event) {
if (event.target !== video) {
popupMenu.style.display = "none";
}
});
loopOption.addEventListener("click", function() {
video.loop = !video.loop;
if (video.loop) {
alert("Looped!");
} else {
alert("unlooped!")
}
});
speedOption.addEventListener("click", function() {
var currentSpeed = video.playbackRate;
var newSpeed = getNextSpeed(currentSpeed);
video.playbackRate = newSpeed;
speedOption.textContent = "Speed: " + newSpeed.toFixed(2) + "x";
});
function getNextSpeed(currentSpeed) {
if (currentSpeed === 2) {
return 0.25;
} else if (currentSpeed === 0.25) {
return 0.5;
} else if (currentSpeed === 0.5) {
return 0.75;
} else if (currentSpeed === 0.75) {
return 1;
} else {
return 2;
}
}
2023-06-10 04:07:07 -04:00
// @license-end