Skip to content

Commit b7cebbf

Browse files
committed
⏪️ added back content progression storage
1 parent 3010a42 commit b7cebbf

3 files changed

Lines changed: 64 additions & 2 deletions

File tree

index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ <h3 class="text-3xl font-bold flex items-center gap-3">
339339
class="absolute top-8 right-8 z-[110] text-white/50 hover:text-white transition-colors p-4 bg-black/20 rounded-full backdrop-blur-md">
340340
<i class="fas fa-times text-3xl shadow-black drop-shadow-md"></i>
341341
</button>
342-
<video id="mainPlayer" controls class="w-full h-full object-contain focus:outline-none bg-black"></video>
342+
<video id="mainPlayer" controls controlslist="nodownload noremoteplayback" disablepictureinpicture playsinline
343+
class="w-full h-full object-contain focus:outline-none bg-black"></video>
343344
</div>
344345

345346
<div id="loader"

js/main.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { fetchAllData, fetchNotifs } from './dataLoader.js';
22
import { setupHero, renderHorizontalRow, renderGrid, renderNotifs, openDetails, closeDetails, playCurrentMedia } from './display.js';
3-
import { playVideo, closeVideo, toggleNotifs, toggleMobileMenu, toggleMobileSearch, showLoader, hideLoader } from './utils.js';
3+
import { playVideo, closeVideo, toggleNotifs, toggleMobileMenu, toggleMobileSearch, showLoader, hideLoader, hardenPlayerControls, initPlayerPersistence } from './utils.js';
44

55
let appData = { films: {}, series: {} };
66
let currentView = 'home';
@@ -17,6 +17,9 @@ window.toggleMobileMenu = toggleMobileMenu;
1717
document.addEventListener('DOMContentLoaded', async () => {
1818
showLoader();
1919

20+
hardenPlayerControls();
21+
initPlayerPersistence();
22+
2023
document.getElementById('mobileMenuBtn').addEventListener('click', toggleMobileMenu);
2124
document.getElementById('mobileSearchBtn').addEventListener('click', toggleMobileSearch);
2225

js/utils.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,34 @@
1+
const PROGRESS_PREFIX = 'streamit:progress:';
2+
let currentVideoSrc = '';
3+
4+
function progressKey(src) {
5+
return `${PROGRESS_PREFIX}${src}`;
6+
}
7+
8+
function restoreProgress(player, src) {
9+
const saved = parseFloat(localStorage.getItem(progressKey(src)) || '');
10+
if (Number.isNaN(saved)) return;
11+
12+
const applyTime = () => {
13+
const nearEnd = player.duration && saved >= player.duration - 1;
14+
if (!nearEnd) player.currentTime = saved;
15+
player.removeEventListener('loadedmetadata', applyTime);
16+
};
17+
18+
if (player.readyState >= 1) applyTime();
19+
else player.addEventListener('loadedmetadata', applyTime);
20+
}
21+
22+
function persistProgress(player) {
23+
if (!currentVideoSrc) return;
24+
const key = progressKey(currentVideoSrc);
25+
const t = player.currentTime || 0;
26+
const nearEnd = player.duration && t >= player.duration - 1;
27+
28+
if (nearEnd) localStorage.removeItem(key);
29+
else localStorage.setItem(key, String(t));
30+
}
31+
132
export function playVideo(src) {
233
const overlay = document.getElementById('videoOverlay');
334
const player = document.getElementById('mainPlayer');
@@ -7,7 +38,10 @@ export function playVideo(src) {
738
return;
839
}
940

41+
currentVideoSrc = src;
1042
player.src = src;
43+
restoreProgress(player, src);
44+
1145
overlay.classList.remove('hidden');
1246
setTimeout(() => {
1347
player.play().catch(e => console.log("Autoplay bloqué par le navigateur", e));
@@ -19,6 +53,7 @@ export function closeVideo() {
1953
const player = document.getElementById('mainPlayer');
2054
player.pause();
2155
player.src = "";
56+
currentVideoSrc = '';
2257
overlay.classList.add('hidden');
2358
}
2459

@@ -62,4 +97,27 @@ export function hideLoader() {
6297
const loader = document.getElementById('loader');
6398
loader.style.opacity = '0';
6499
setTimeout(() => loader.classList.add('hidden'), 700);
100+
}
101+
102+
export function hardenPlayerControls() {
103+
const player = document.getElementById('mainPlayer');
104+
if (!player) return;
105+
106+
player.setAttribute('controlsList', 'nodownload noremoteplayback');
107+
player.setAttribute('disablepictureinpicture', '');
108+
player.setAttribute('playsinline', '');
109+
player.addEventListener('contextmenu', (e) => e.preventDefault());
110+
}
111+
112+
export function initPlayerPersistence() {
113+
const player = document.getElementById('mainPlayer');
114+
if (!player) return;
115+
116+
const save = () => persistProgress(player);
117+
player.addEventListener('timeupdate', save);
118+
player.addEventListener('pause', save);
119+
player.addEventListener('ended', () => {
120+
save();
121+
currentVideoSrc = '';
122+
});
65123
}

0 commit comments

Comments
 (0)