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