diff options
Diffstat (limited to 'web/js')
| -rw-r--r-- | web/js/app.js | 18 | ||||
| -rw-r--r-- | web/js/keyboard.js | 8 | ||||
| -rw-r--r-- | web/js/player.js | 38 | ||||
| -rw-r--r-- | web/js/state.js | 2 |
4 files changed, 59 insertions, 7 deletions
diff --git a/web/js/app.js b/web/js/app.js index cd5ded4..2d0e15d 100644 --- a/web/js/app.js +++ b/web/js/app.js @@ -112,6 +112,8 @@ async function initApp() { toolbar: toggleToolbar, sidebar: toggleSidebar, upload: () => showUpload(), + focusMinDuration: () => focusFilter('filter-min-duration'), + focusMaxDuration: () => focusFilter('filter-max-duration'), }); initNotes(() => toast('Note saved')); initAdmin(); @@ -129,8 +131,6 @@ async function initApp() { document.getElementById('filter-tags')?.addEventListener('change', (e) => { state.filters.tags = e.target.value; loadMedia(); }); document.getElementById('filter-min-duration')?.addEventListener('change', (e) => { state.filters.minDuration = e.target.value; loadMedia(); }); document.getElementById('filter-max-duration')?.addEventListener('change', (e) => { state.filters.maxDuration = e.target.value; loadMedia(); }); - document.getElementById('filter-min-filesize')?.addEventListener('change', (e) => { state.filters.minFilesizeMB = e.target.value; loadMedia(); }); - document.getElementById('filter-max-filesize')?.addEventListener('change', (e) => { state.filters.maxFilesizeMB = e.target.value; loadMedia(); }); document.getElementById('filter-toggle')?.addEventListener('click', () => { document.getElementById('filter-advanced')?.classList.toggle('hidden'); }); @@ -265,10 +265,8 @@ async function loadMedia() { search: state.filters.search, favorites: state.filters.favorites ? 'true' : '', tags: state.filters.tags || '', - min_duration: state.filters.minDuration || '', - max_duration: state.filters.maxDuration || '', - filesize_min: state.filters.minFilesizeMB ? String(parseInt(state.filters.minFilesizeMB, 10) << 20) : '', - filesize_max: state.filters.maxFilesizeMB ? String(parseInt(state.filters.maxFilesizeMB, 10) << 20) : '', + min_duration: state.filters.minDuration ? String(parseFloat(state.filters.minDuration) * 60) : '', + max_duration: state.filters.maxDuration ? String(parseFloat(state.filters.maxDuration) * 60) : '', sort: isShuffle() ? 'random' : 'name', limit: '200', }; @@ -539,6 +537,14 @@ function toggleSidebar() { page?.classList.toggle('has-sidebar', open); } +function focusFilter(id) { + const el = document.getElementById(id); + if (!el) return; + document.getElementById('filter-advanced')?.classList.remove('hidden'); + el.focus(); + el.select(); +} + function showSearch() { const bar = document.getElementById('search-bar'); bar?.classList.remove('hidden'); diff --git a/web/js/keyboard.js b/web/js/keyboard.js index cad695c..2a9c78e 100644 --- a/web/js/keyboard.js +++ b/web/js/keyboard.js @@ -91,6 +91,14 @@ export function initKeyboard(handlers) { e.preventDefault(); handlers.help?.(e); break; + case ',': + e.preventDefault(); + handlers.focusMinDuration?.(e); + break; + case '.': + e.preventDefault(); + handlers.focusMaxDuration?.(e); + break; } }); } diff --git a/web/js/player.js b/web/js/player.js index 88ef404..cb3ccab 100644 --- a/web/js/player.js +++ b/web/js/player.js @@ -139,6 +139,44 @@ export function selectAndPlay(media, index, resumeFrom = 0) { highlightPlayingCard(); } +export function loadMediaDirect(media, streamUrl, thumbnailUrl, resumeFrom = 0) { + const e = els(); + const isVideo = media.type === 'video'; + const src = streamUrl; + if (isVideo) { + e.video.pause(); + e.audio.pause(); e.audio.src = ''; + e.video.style.display = ''; + e.audio.style.display = 'none'; + e.coverArt?.classList.add('hidden'); + e.video.src = src; + e.video.load(); + e.video.currentTime = resumeFrom; + } else { + e.audio.pause(); + e.video.pause(); e.video.src = ''; + e.video.style.display = 'none'; + e.audio.style.display = 'none'; + e.audio.src = src; + e.audio.currentTime = resumeFrom; + if (e.coverArt) { + if (thumbnailUrl) { + e.coverArt.src = thumbnailUrl; + e.coverArt.classList.remove('hidden'); + } else { + e.coverArt.classList.add('hidden'); + e.coverArt.src = ''; + } + } + } + e.player?.classList.add('open'); + e.btnPlay.textContent = '⏸'; + e.bigPlay?.classList.add('hidden'); + e.timeTotal.textContent = fmt(media.duration ?? 0); + e.fill.style.width = '0%'; + e.thumb.style.left = '0%'; +} + function loadMedia(media, resumeFrom = 0) { const e = els(); const isVideo = media.type === 'video'; diff --git a/web/js/state.js b/web/js/state.js index a0e715b..6597c00 100644 --- a/web/js/state.js +++ b/web/js/state.js @@ -4,7 +4,7 @@ export const state = { selectedSetId: null, selectedSetIds: [], // multi-selection media: [], - filters: { type: '', search: '', favorites: false, tags: '', sort: 'name', minDuration: '', maxDuration: '', minFilesizeMB: '', maxFilesizeMB: '' }, + filters: { type: '', search: '', favorites: false, tags: '', sort: 'name', minDuration: '', maxDuration: '' }, isAdmin: false, }; |
