diff --git a/app/app.html b/app/app.html index 184e981..b034738 100644 --- a/app/app.html +++ b/app/app.html @@ -162,7 +162,6 @@
-
diff --git a/app/css2.css b/app/css2.css index e53a729..daac1b6 100644 --- a/app/css2.css +++ b/app/css2.css @@ -4,9 +4,11 @@ --volume-level: 100%; --progress: 0%; --buffer: 0%; + --height: 0; color: #b6b6b6; font-size: 62.5%; - --nav-size: 19rem + --nav-size: 19rem; + --ts: ""; } .material-icons { @@ -178,6 +180,36 @@ video[src=""] { background: linear-gradient(90deg, #e5204c var(--progress), rgba(255, 255, 255, .4) var(--progress), rgba(255, 255, 255, .4) var(--buffer), rgba(255, 255, 255, .2) var(--buffer)) } + +.controls input#prog[type=range]::after, +.controls input#prog[type=range]::before{ + pointer-events: none; + display: none; + position: absolute; + transform: translate(-50%,-100%); + font-family: Roboto, monospace; + color: #ececec; + white-space: nowrap; + align-self: center; + padding: 0 1.2rem; + left: var(--left); + font-weight: 600; +} +.controls input#prog[type=range]::after{ + width: 150px; + background: var(--background); + content: ""; + height: var(--height); + top: -2rem; +} +.controls input#prog[type=range]::before{ + top: 0rem; + content: attr(data-ts); +} +.controls input#prog[type=range]:active::after, +.controls input#prog[type=range]:active::before{ + display: block +} .controls input[type=range]:hover::-webkit-slider-thumb { height: 12px; width: 12px; diff --git a/app/playerHandler.js b/app/playerHandler.js index 1807b5c..ed28e85 100644 --- a/app/playerHandler.js +++ b/app/playerHandler.js @@ -20,14 +20,15 @@ const controls = document.getElementsByClassName('ctrl'), volume.addEventListener("input", function () { updateVolume() }); -progress.addEventListener("input", setProgress); -video.addEventListener("playing", playCheck); +progress.addEventListener("input", dragBar); +progress.addEventListener("mouseup", dragBarEnd); +progress.addEventListener("mousedown", dragBarStart); video.addEventListener("playing", resetBuffer); -video.addEventListener("canplay", updateDisplay); -video.addEventListener("loadedmetadata", setDuration); -video.addEventListener("loadedmetadata", initThumbnail); +video.addEventListener("loadeddata", initThumbnail); +video.addEventListener("loadedmetadata", updateDisplay); video.addEventListener("ended", bnext); video.addEventListener("waiting", isBuffering); +video.addEventListener("timeupdate", updateDisplay); playPause.addEventListener("click", bpp); @@ -38,28 +39,82 @@ for (let i = 0; i < controls.length; i++) { }) } +// progress bar and display + +function updateDisplay() { + let progressPercent = (video.currentTime / video.duration * 100), + bufferPercent = video.buffered.length == 0 ? 0 : video.buffered.end(video.buffered.length - 1) / video.duration * 100 + progress.style.setProperty("--buffer", bufferPercent + "%"); + updateBar(progressPercent || progress.value / 10); + createThumbnail(video); +} +function dragBar(){ + updateBar(progress.value / 10) +} +function dragBarEnd(){ + video.currentTime = currentTime || 0 + playVideo() +} +function dragBarStart(){ + video.pause() +} +let currentTime +function updateBar(progressPercent) { + currentTime = video.duration * progressPercent / 100 + progress.style.setProperty("--progress", progressPercent + "%"); + elapsed.innerHTML = toTS(currentTime); + remaining.innerHTML = toTS(video.duration - currentTime); + progress.value = progressPercent * 10 + let bg = thumbnails.length == 0 ? "" : thumbnails[Math.floor(currentTime / 5)||0] + progress.style.setProperty("--background", "url("+(bg||"")+")") + progress.style.setProperty("--left", progressPercent + "%") + progress.setAttribute("data-ts", toTS(currentTime)) +} + // dynamic thumbnails -let thumbnails, +let thumbnails = [], ratio, canvas = document.createElement("canvas"), - context = canvas.getContext('2d'); + context = canvas.getContext('2d'), + w = 150, + h + function initThumbnail() { thumbnails = [] ratio = video.videoWidth / video.videoHeight; - w = 150 h = parseInt(w / ratio) canvas.width = w; canvas.height = h; + progress.style.setProperty("--height", h + "px"); } -function createThumbnail() { - let index = Math.floor(video.currentTime / 5) - if(thumbnails[index] == undefined){ +function createThumbnail(vid) { + let index = Math.floor(vid.currentTime / 5) + if (!thumbnails[index] && h) { context.fillRect(0, 0, w, h); - context.drawImage(video, 0, 0, w, h); + context.drawImage(vid, 0, 0, w, h); thumbnails[index] = canvas.toDataURL("image/jpeg") - thumbnail.src = canvas.toDataURL("image/jpeg") } } +function finishThumbnails(){ + let thumbVid = document.createElement("video") + thumbVid.src = video.src + thumbVid.addEventListener('loadeddata', function (e) { + loadTime(); + }, false); + + thumbVid.addEventListener('seeked', function() { + createThumbnail(thumbVid); + loadTime(); + }, false); + + function loadTime() { + if (thumbVid.ended == false) { + thumbVid.currentTime = thumbVid.currentTime + 5; + } else { + thumbVid.remove() + } + }; +} //bufering spinner @@ -95,38 +150,13 @@ function resetTimer() { player.classList.remove('immersed') immerseTime = setTimeout(immersePlayer, 3000) } +let islooped; -//set duration -let duration; - -function setDuration() { - duration = video.duration; -} - -//progress - -function setProgress() { - video.currentTime = progress.value / 1000 * duration; - updateDisplay(); -} - -let progressPercent, - bufferPercent, - remainingTime - -function updateDisplay() { - progressPercent = (video.currentTime / duration * 100).toFixed(4) - bufferPercent = (video.buffered.length == 0 ? 0 : video.buffered.end(video.buffered.length - 1) / duration * 100).toFixed(4) - remainingTime = duration - video.currentTime - document.documentElement.style.setProperty("--progress", progressPercent + "%"); - document.documentElement.style.setProperty("--buffer", bufferPercent + "%"); - elapsed.innerHTML = toTS(video.currentTime); - remaining.innerHTML = toTS(remainingTime); - progress.value = Math.floor(progressPercent * 10) -} - function toTS(sec) { + if (Number.isNaN(sec)){ + return "--:--"; + } let hours = Math.floor(sec / 3600), minutes = Math.floor((sec - (hours * 3600)) / 60), seconds = Math.floor(sec - (hours * 3600) - (minutes * 60)); @@ -143,20 +173,6 @@ function toTS(sec) { } } -let islooped; - -function playCheck() { - if (!islooped && !video.paused) { - islooped = true; - updateDisplay(); - createThumbnail(); - setTimeout(function () { - islooped = false; - playCheck(); - }, 50) - } -} - //play/pause button async function playVideo() { try { diff --git a/app/torrentHandler.js b/app/torrentHandler.js index 7ae4946..f1b4474 100644 --- a/app/torrentHandler.js +++ b/app/torrentHandler.js @@ -42,8 +42,8 @@ function addTorrent(magnet) { torrent.on('download', onProgress) torrent.on('upload', onProgress) - torrent.on('warning', console.warn) // too spammy for now - torrent.on('error', console.error) + // torrent.on('warning', console.warn) // too spammy for now + // torrent.on('error', console.error) torrent.on('done', function () { setInterval(onProgress, 5000) halfmoon.initStickyAlert({ @@ -52,6 +52,7 @@ function addTorrent(magnet) { alertType: "alert-success", fillType: "" }); + finishThumbnails(); }) torrent.on('noPeers', function () { halfmoon.initStickyAlert({