From fadbf9c6c934d1be09343175c060bcdeda74ab69 Mon Sep 17 00:00:00 2001 From: Dan Collins Date: Sun, 19 Jan 2025 23:09:01 -0500 Subject: [PATCH] Preview transitions in a popup --- restreamer/restreamer/main.py | 5 ++ thrimbletrimmer/scripts/edit.js | 71 +++++++++++++++++++++- thrimbletrimmer/styles/thrimbletrimmer.css | 6 ++ 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/restreamer/restreamer/main.py b/restreamer/restreamer/main.py index a198831..04c77df 100644 --- a/restreamer/restreamer/main.py +++ b/restreamer/restreamer/main.py @@ -411,6 +411,11 @@ def cut(channel, quality): stream, muxer, mimetype = (True, 'mpegts', 'video/MP2T') if type == 'mpegts' else (False, 'mp4', 'video/mp4') encoding_args = ['-c:v', 'libx264', '-preset', 'ultrafast', '-crf', '0', '-f', muxer] return Response(full_cut_segments(segment_ranges, ranges, transitions, encoding_args, stream=stream), mimetype=mimetype) + elif type == 'webm': + # Basic webm settings to work in Firefox and Chrome. + stream, muxer, mimetype = (True, 'webm', 'video/webm') + encoding_args = ['-c:v', 'libvpx-vp9', '-c:a', 'libopus', '-f', muxer] + return Response(full_cut_segments(segment_ranges, ranges, transitions, encoding_args, stream=stream), mimetype=mimetype) else: return "Unknown type {!r}".format(type), 400 diff --git a/thrimbletrimmer/scripts/edit.js b/thrimbletrimmer/scripts/edit.js index 5e976cf..99944db 100644 --- a/thrimbletrimmer/scripts/edit.js +++ b/thrimbletrimmer/scripts/edit.js @@ -1655,6 +1655,43 @@ function updateDownloadLink() { videoInfo.video_quality, ); document.getElementById("download-link").href = downloadURL; + + // Create preview links for each transition + const transitionPreviewPaddingSeconds = 5; + const transitionLinks = document.getElementsByClassName("range-transition-preview-button"); + for (let i=0; i { + const videoUrl = event.target.dataset.videoSource; + + // Pop up a new window to contain the video preview. + // These dimensions aren't quite right because if I make them exact for 480p, + // firefox creates an unnecessary scroll bar. + const newWindow = window.open("", "_blank", "width=845,height=480"); + // Very basic video player wrapper + newWindow.document.write(` + + + + Thrimbletrimmer Transition Preview + + + + + + `); + newWindow.document.close(); + }); + transitionPreviewSection.append(transitionPreviewButton); + transitionContainer.append("Transition: ", transitionType, transitionDurationSection, transitionPreviewSection); const rangeTimesContainer = makeElement("div", ["range-definition-times"]); const rangeStart = makeElement("input", ["range-definition-start"], { type: "text" }); diff --git a/thrimbletrimmer/styles/thrimbletrimmer.css b/thrimbletrimmer/styles/thrimbletrimmer.css index 005381a..f3e0c1b 100644 --- a/thrimbletrimmer/styles/thrimbletrimmer.css +++ b/thrimbletrimmer/styles/thrimbletrimmer.css @@ -248,12 +248,18 @@ a.click { .range-transition-duration-section { display: inline-block; + padding-left: 0.5em; } .range-transition-duration { width: 50px; } +.range-transition-preview-section { + display: inline-block; + padding-left: 0.5em; +} + .range-definition-times { display: flex; align-items: center;