From 977cab8ad2759067d13c9ed837454753480ea89c Mon Sep 17 00:00:00 2001 From: Kibi Kelburton Date: Sun, 21 Jun 2026 20:26:44 +0200 Subject: [PATCH] adding working metadata extract butto for yt embeds --- public/s/js/f0ckm.js | 36 +++++++++++++++++++++++++++------- src/inc/routes/ajax.mjs | 2 +- src/inc/routes/index.mjs | 3 ++- src/inc/routes/user_halls.mjs | 2 +- views/item-partial-legacy.html | 2 +- views/item-partial-modern.html | 2 +- 6 files changed, 35 insertions(+), 12 deletions(-) diff --git a/public/s/js/f0ckm.js b/public/s/js/f0ckm.js index c992bf5..1967c80 100644 --- a/public/s/js/f0ckm.js +++ b/public/s/js/f0ckm.js @@ -9662,6 +9662,7 @@ document.addEventListener('click', (e) => { if (metaBtn) { e.preventDefault(); const itemid = metaBtn.dataset.itemId; + const ytSrc = metaBtn.dataset.src || null; // Set for YouTube items const modal = document.getElementById('metadata-modal'); if (!modal) return; @@ -9705,7 +9706,7 @@ document.addEventListener('click', (e) => { // Find the new item's metadata button const newMetaBtn = document.getElementById('a_metadata'); if (!newMetaBtn) { - // New item doesn't support metadata extraction (YouTube, Flash, etc.) + // New item doesn't support metadata extraction (Flash, etc.) // Keep modal open but show a friendly message instead of closing loading.style.display = 'none'; resultsCont.style.display = 'none'; @@ -9715,13 +9716,24 @@ document.addEventListener('click', (e) => { window.addEventListener('pjax:start', onNav); return; } - const newItemId = newMetaBtn.dataset.itemId; + const newItemId = newMetaBtn.dataset.itemId; + const newYtSrc = newMetaBtn.dataset.src || null; // Re-attach nav listener for subsequent navigations window.addEventListener('pjax:start', onNav); - // Fetch metadata for the new item + // Fetch metadata for the new item (YouTube → oEmbed URL fetch, others → file extract) try { - const resp = await fetch(`/api/v2/meta/extract/item/${newItemId}`); - const data = await resp.json(); + let resp, data; + if (newYtSrc) { + resp = await fetch(`/api/v2/meta/fetch?url=${encodeURIComponent(newYtSrc)}`); + const raw = await resp.json(); + // Normalise oEmbed response into the same {success, fields} shape + data = raw.success + ? { success: true, fields: [raw.meta.title, raw.meta.author].filter(Boolean) } + : raw; + } else { + resp = await fetch(`/api/v2/meta/extract/item/${newItemId}`); + data = await resp.json(); + } loading.style.display = 'none'; if (data.success && data.fields && data.fields.length > 0) { resultsCont.style.display = 'block'; @@ -9814,8 +9826,18 @@ document.addEventListener('click', (e) => { document.addEventListener('metadata-modal-close', close, { once: true }); try { - const resp = await fetch(`/api/v2/meta/extract/item/${itemid}`); - const data = await resp.json(); + let resp, data; + if (ytSrc) { + // YouTube item: use oEmbed via the URL-based fetch endpoint + resp = await fetch(`/api/v2/meta/fetch?url=${encodeURIComponent(ytSrc)}`); + const raw = await resp.json(); + data = raw.success + ? { success: true, fields: [raw.meta.title, raw.meta.author].filter(Boolean) } + : raw; + } else { + resp = await fetch(`/api/v2/meta/extract/item/${itemid}`); + data = await resp.json(); + } loading.style.display = 'none'; if (data.success && data.fields && data.fields.length > 0) { diff --git a/src/inc/routes/ajax.mjs b/src/inc/routes/ajax.mjs index c911f37..dd79586 100644 --- a/src/inc/routes/ajax.mjs +++ b/src/inc/routes/ajax.mjs @@ -129,7 +129,7 @@ export default (router, tpl) => { const item = data.item; data.is_mod_or_admin = !!(session && (session.admin || session.is_moderator)); data.can_manage_item = !!(session && (session.admin || session.is_moderator || session.user === item.username)); - data.can_extract_meta = !!(item.mime && item.mime.indexOf('flash') === -1 && item.mime.indexOf('youtube') === -1); + data.can_extract_meta = !!(item.mime && item.mime.indexOf('flash') === -1); data.user_has_favorited = !!(session && Array.isArray(item.favorites) && item.favorites.some(f => f.user === session.user)); data.halls_slugs = Array.isArray(item.halls) ? item.halls.map(h => h.slug).join(',') : ''; data.user_halls_slugs = Array.isArray(item.user_halls) ? item.user_halls.map(h => h.slug).join(',') : ''; diff --git a/src/inc/routes/index.mjs b/src/inc/routes/index.mjs index 107ea0c..ecfc4d0 100644 --- a/src/inc/routes/index.mjs +++ b/src/inc/routes/index.mjs @@ -347,7 +347,8 @@ export default (router, tpl) => { // Can the current user manage this item (owner, admin, or mod)? data.can_manage_item = !!(session && (session.admin || session.is_moderator || session.user === item.username)); // Is the item's MIME type suitable for metadata extraction? - data.can_extract_meta = !!(item.mime && item.mime.indexOf('flash') === -1 && item.mime.indexOf('youtube') === -1); + // YouTube items use oEmbed via /meta/fetch; all non-flash MIME types are eligible. + data.can_extract_meta = !!(item.mime && item.mime.indexOf('flash') === -1); // Has the current user favorited this item? data.user_has_favorited = !!(session && Array.isArray(item.favorites) && item.favorites.some(f => f.user === session.user)); // Hall columns for display diff --git a/src/inc/routes/user_halls.mjs b/src/inc/routes/user_halls.mjs index 893b40a..08beb7e 100644 --- a/src/inc/routes/user_halls.mjs +++ b/src/inc/routes/user_halls.mjs @@ -163,7 +163,7 @@ export default (router, tpl) => { const item = data.item; data.is_mod_or_admin = !!(session && (session.admin || session.is_moderator)); data.can_manage_item = !!(session && (session.admin || session.is_moderator || session.user === item.username)); - data.can_extract_meta = !!(item.mime && item.mime.indexOf('flash') === -1 && item.mime.indexOf('youtube') === -1); + data.can_extract_meta = !!(item.mime && item.mime.indexOf('flash') === -1); data.user_has_favorited = !!(session && Array.isArray(item.favorites) && item.favorites.some(f => f.user === session.user)); data.halls_slugs = Array.isArray(item.halls) ? item.halls.map(h => h.slug).join(',') : ''; data.user_halls_slugs = Array.isArray(item.user_halls) ? item.user_halls.map(h => h.slug).join(',') : ''; diff --git a/views/item-partial-legacy.html b/views/item-partial-legacy.html index 918939d..f8d05b7 100644 --- a/views/item-partial-legacy.html +++ b/views/item-partial-legacy.html @@ -141,7 +141,7 @@ @if(can_manage_item) @if(can_extract_meta) - + @endif @if(item.mime === 'application/x-shockwave-flash' || item.mime === 'application/vnd.adobe.flash.movie') diff --git a/views/item-partial-modern.html b/views/item-partial-modern.html index 750f6cd..7d5c13c 100644 --- a/views/item-partial-modern.html +++ b/views/item-partial-modern.html @@ -140,7 +140,7 @@ @if(can_manage_item) - + @if(is_flash_item) @endif