Add reveal&play button
This commit is contained in:
@@ -49,6 +49,17 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-right">
|
<div class="nav-right">
|
||||||
|
<button class="nav-btn" id="playCurrentBtn" title="Play Current (Clear on Line Start)">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" id="playCurrentIcon">
|
||||||
|
<polygon points="5 3 19 12 5 21 5 3"/>
|
||||||
|
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" fill="none" opacity="0.3"/>
|
||||||
|
</svg>
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" id="pauseCurrentIcon" style="display: none;">
|
||||||
|
<rect x="6" y="4" width="4" height="16"/>
|
||||||
|
<rect x="14" y="4" width="4" height="16"/>
|
||||||
|
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5" fill="none" opacity="0.3"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
<button class="nav-btn" id="playPauseBtn" title="Play/Pause">
|
<button class="nav-btn" id="playPauseBtn" title="Play/Pause">
|
||||||
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" id="playIcon">
|
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" id="playIcon">
|
||||||
<polygon points="5 3 19 12 5 21 5 3"/>
|
<polygon points="5 3 19 12 5 21 5 3"/>
|
||||||
@@ -131,6 +142,9 @@
|
|||||||
const playPauseBtn = document.getElementById('playPauseBtn');
|
const playPauseBtn = document.getElementById('playPauseBtn');
|
||||||
const playIcon = document.getElementById('playIcon');
|
const playIcon = document.getElementById('playIcon');
|
||||||
const pauseIcon = document.getElementById('pauseIcon');
|
const pauseIcon = document.getElementById('pauseIcon');
|
||||||
|
const playCurrentBtn = document.getElementById('playCurrentBtn');
|
||||||
|
const playCurrentIcon = document.getElementById('playCurrentIcon');
|
||||||
|
const pauseCurrentIcon = document.getElementById('pauseCurrentIcon');
|
||||||
const goToBtn = document.getElementById('goToBtn');
|
const goToBtn = document.getElementById('goToBtn');
|
||||||
const prevBtn = document.getElementById('prevBtn');
|
const prevBtn = document.getElementById('prevBtn');
|
||||||
const nextBtn = document.getElementById('nextBtn');
|
const nextBtn = document.getElementById('nextBtn');
|
||||||
@@ -140,6 +154,7 @@
|
|||||||
let selectedLine = null;
|
let selectedLine = null;
|
||||||
let expandedLine = null;
|
let expandedLine = null;
|
||||||
let isPlaying = false;
|
let isPlaying = false;
|
||||||
|
let isPlayingCurrent = false;
|
||||||
let currentTime = 0;
|
let currentTime = 0;
|
||||||
let playbackInterval = null;
|
let playbackInterval = null;
|
||||||
let currentLineIndex = 0;
|
let currentLineIndex = 0;
|
||||||
@@ -214,20 +229,29 @@
|
|||||||
|
|
||||||
// Pause playback
|
// Pause playback
|
||||||
function pausePlayback() {
|
function pausePlayback() {
|
||||||
if (!isPlaying) return;
|
if (!isPlaying && !isPlayingCurrent) return;
|
||||||
isPlaying = false;
|
isPlaying = false;
|
||||||
|
isPlayingCurrent = false;
|
||||||
clearInterval(playbackInterval);
|
clearInterval(playbackInterval);
|
||||||
playIcon.style.display = 'block';
|
playIcon.style.display = 'block';
|
||||||
pauseIcon.style.display = 'none';
|
pauseIcon.style.display = 'none';
|
||||||
|
playCurrentIcon.style.display = 'block';
|
||||||
|
pauseCurrentIcon.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resume playback
|
// Resume playback
|
||||||
function resumePlayback() {
|
function resumePlayback() {
|
||||||
if (isPlaying) return;
|
if (isPlaying) return;
|
||||||
|
// Stop play-current mode if active
|
||||||
|
if (isPlayingCurrent) {
|
||||||
|
pausePlayback();
|
||||||
|
}
|
||||||
isPlaying = true;
|
isPlaying = true;
|
||||||
lastTimestamp = Date.now();
|
lastTimestamp = Date.now();
|
||||||
playIcon.style.display = 'none';
|
playIcon.style.display = 'none';
|
||||||
pauseIcon.style.display = 'block';
|
pauseIcon.style.display = 'block';
|
||||||
|
playCurrentIcon.style.display = 'block';
|
||||||
|
pauseCurrentIcon.style.display = 'none';
|
||||||
|
|
||||||
playbackInterval = setInterval(() => {
|
playbackInterval = setInterval(() => {
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
@@ -255,6 +279,72 @@
|
|||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Resume playback in "clear on line start" mode
|
||||||
|
function resumePlaybackCurrent() {
|
||||||
|
if (isPlayingCurrent) return;
|
||||||
|
// Stop regular play mode if active
|
||||||
|
if (isPlaying) {
|
||||||
|
pausePlayback();
|
||||||
|
}
|
||||||
|
isPlayingCurrent = true;
|
||||||
|
lastTimestamp = Date.now();
|
||||||
|
playCurrentIcon.style.display = 'none';
|
||||||
|
pauseCurrentIcon.style.display = 'block';
|
||||||
|
playIcon.style.display = 'block';
|
||||||
|
pauseIcon.style.display = 'none';
|
||||||
|
|
||||||
|
playbackInterval = setInterval(() => {
|
||||||
|
const now = Date.now();
|
||||||
|
const delta = (now - lastTimestamp) / 1000;
|
||||||
|
lastTimestamp = now;
|
||||||
|
|
||||||
|
currentTime += delta;
|
||||||
|
updateTimeDisplay();
|
||||||
|
|
||||||
|
// Check if we need to advance lines - clear blur as soon as line starts
|
||||||
|
// Find the current line based on time
|
||||||
|
const newLineIndex = findCurrentLineIndex(currentTime);
|
||||||
|
if (newLineIndex !== currentLineIndex) {
|
||||||
|
// We've moved to a new line - clear blur for current line immediately
|
||||||
|
currentLineIndex = newLineIndex;
|
||||||
|
updateSelection(currentLineIndex);
|
||||||
|
// Clear blur for current line (lines before and including current are clear)
|
||||||
|
clearBlurUpToCurrent();
|
||||||
|
scrollToLine(lines[currentLineIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we've reached the end
|
||||||
|
if (currentLineIndex >= lines.length - 1) {
|
||||||
|
const lastLineTime = getLineTimeSeconds(lines[lines.length - 1]);
|
||||||
|
if (currentTime > lastLineTime + 5) {
|
||||||
|
// End of episode (5 seconds after last line)
|
||||||
|
pausePlayback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear blur for all lines up to and including current line
|
||||||
|
function clearBlurUpToCurrent() {
|
||||||
|
lines.forEach((line, index) => {
|
||||||
|
if (index <= currentLineIndex) {
|
||||||
|
// Lines up to current are clear
|
||||||
|
line.classList.remove('blurred');
|
||||||
|
line.classList.add('clear');
|
||||||
|
} else {
|
||||||
|
// Lines after current are blurred
|
||||||
|
line.classList.add('blurred');
|
||||||
|
line.classList.remove('clear');
|
||||||
|
// Reset blur overlay position when blur is reapplied
|
||||||
|
const blurOverlay = line.querySelector('.blur-overlay');
|
||||||
|
if (blurOverlay) {
|
||||||
|
blurOverlay.style.transform = '';
|
||||||
|
blurOverlay.style.opacity = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Toggle play/pause
|
// Toggle play/pause
|
||||||
function togglePlayPause() {
|
function togglePlayPause() {
|
||||||
if (isPlaying) {
|
if (isPlaying) {
|
||||||
@@ -264,6 +354,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Toggle play-current mode
|
||||||
|
function togglePlayCurrent() {
|
||||||
|
if (isPlayingCurrent) {
|
||||||
|
pausePlayback();
|
||||||
|
} else {
|
||||||
|
resumePlaybackCurrent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Go to current line's timestamp
|
// Go to current line's timestamp
|
||||||
function goToCurrentLine() {
|
function goToCurrentLine() {
|
||||||
if (selectedLine) {
|
if (selectedLine) {
|
||||||
@@ -513,6 +612,9 @@
|
|||||||
// Play/Pause button
|
// Play/Pause button
|
||||||
playPauseBtn.addEventListener('click', togglePlayPause);
|
playPauseBtn.addEventListener('click', togglePlayPause);
|
||||||
|
|
||||||
|
// Play Current button
|
||||||
|
playCurrentBtn.addEventListener('click', togglePlayCurrent);
|
||||||
|
|
||||||
// Go to button
|
// Go to button
|
||||||
goToBtn.addEventListener('click', goToCurrentLine);
|
goToBtn.addEventListener('click', goToCurrentLine);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user