From 984881911e08c89d2008a63690b3da6f57cb6ff4 Mon Sep 17 00:00:00 2001 From: aka paul <50n50@noreply.localhost> Date: Sat, 14 Feb 2026 17:46:48 +0000 Subject: [PATCH] Update yummyanime/yummyanime.js --- yummyanime/yummyanime.js | 46 ++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/yummyanime/yummyanime.js b/yummyanime/yummyanime.js index 39e9f4a..0450646 100644 --- a/yummyanime/yummyanime.js +++ b/yummyanime/yummyanime.js @@ -49,13 +49,14 @@ function _dubbingRank(name) { const order = [ "anilibria", - "ani libria", + "aniliberty", "jam", "anidub", - "ani dub", "shiza", "studio band", + "studioband", "dream cast", + "dreamcast", "crunchyroll", "sub", "субтит" @@ -178,7 +179,7 @@ async function extractEpisodes(animeIdOrUrl) { }); // Group by episode number - const byNum = new Map(); // num -> { num, options: [...], opening?, ending?, duration? } + const byNum = new Map(); // num -> { num, options: [...], opening?, ending?, duration?, skips? } for (const v of kodikVids) { const num = parseFloat(v?.number) || 0; @@ -204,10 +205,30 @@ async function extractEpisodes(animeIdOrUrl) { ? { start: v.skips.ending.time, stop: v.skips.ending.time + v.skips.ending.length } : undefined; + // raw timecode format (time + length) + const skips = + (v?.skips?.opening && Number.isFinite(v.skips.opening.time) && Number.isFinite(v.skips.opening.length)) || + (v?.skips?.ending && Number.isFinite(v.skips.ending.time) && Number.isFinite(v.skips.ending.length)) + ? { + opening: + v?.skips?.opening && + Number.isFinite(v.skips.opening.time) && + Number.isFinite(v.skips.opening.length) + ? { time: v.skips.opening.time, length: v.skips.opening.length } + : null, + ending: + v?.skips?.ending && + Number.isFinite(v.skips.ending.time) && + Number.isFinite(v.skips.ending.length) + ? { time: v.skips.ending.time, length: v.skips.ending.length } + : null + } + : undefined; + const duration = Number.isFinite(v?.duration) && v.duration > 0 ? v.duration : undefined; if (!byNum.has(num)) { - byNum.set(num, { num, options: [], opening, ending, duration }); + byNum.set(num, { num, options: [], opening, ending, duration, skips }); } const ep = byNum.get(num); @@ -217,10 +238,15 @@ async function extractEpisodes(animeIdOrUrl) { if (!ep.ending && ending) ep.ending = ending; if (!ep.duration && duration) ep.duration = duration; + // keep first raw skips object if present + if (!ep.skips && skips) ep.skips = skips; + ep.options.push({ dubbing, player, - iframe_url: iframeUrl + iframe_url: iframeUrl, + opening, + ending }); } @@ -242,8 +268,14 @@ async function extractEpisodes(animeIdOrUrl) { title: `Episode ${ep.num}` }; - if (ep.opening) item.opening = ep.opening; - if (ep.ending) item.ending = ep.ending; + // Use skips from the first (sorted) voiceover option + const primary = ep.options[0]; + if (primary?.opening) item.opening = primary.opening; + if (primary?.ending) item.ending = primary.ending; + + // raw timecodes (time + length) + if (ep.skips) item.skips = ep.skips; + if (ep.duration) item.duration = ep.duration; return item;