summaryrefslogtreecommitdiff
path: root/web/js
diff options
context:
space:
mode:
Diffstat (limited to 'web/js')
-rw-r--r--web/js/app.js18
-rw-r--r--web/js/keyboard.js8
-rw-r--r--web/js/player.js38
-rw-r--r--web/js/state.js2
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,
};