caching system + add extension entries to metadata pool
This commit is contained in:
@@ -31,26 +31,44 @@ async function loadAnime() {
|
||||
const res = await fetch(fetchUrl);
|
||||
const data = await res.json();
|
||||
|
||||
if(data.error) {
|
||||
if (data.error) {
|
||||
document.getElementById('title').innerText = "Anime Not Found";
|
||||
return;
|
||||
}
|
||||
|
||||
const title = data.title?.english || data.title?.romaji || "Unknown Title";
|
||||
const title = data.title?.english || data.title?.romaji || data.title || "Unknown Title";
|
||||
document.title = `${title} | WaifuBoard`;
|
||||
document.getElementById('title').innerText = title;
|
||||
if (data.coverImage?.extraLarge) {
|
||||
document.getElementById('poster').src = data.coverImage.extraLarge;
|
||||
|
||||
let posterUrl = '';
|
||||
|
||||
if (extensionName) {
|
||||
posterUrl = data.image || '';
|
||||
|
||||
} else {
|
||||
posterUrl = data.coverImage?.extraLarge || '';
|
||||
}
|
||||
|
||||
const rawDesc = data.description || "No description available.";
|
||||
if (posterUrl) {
|
||||
document.getElementById('poster').src = posterUrl;
|
||||
}
|
||||
|
||||
const rawDesc = data.description || data.summary || "No description available.";
|
||||
handleDescription(rawDesc);
|
||||
|
||||
document.getElementById('score').innerText = (data.averageScore || '?') + '% Score';
|
||||
document.getElementById('year').innerText = data.seasonYear || data.startDate?.year || '????';
|
||||
document.getElementById('genres').innerText = data.genres?.length > 0 ? data.genres.slice(0, 3).join(' • ') : '';
|
||||
const score = extensionName ? (data.score ? data.score * 10 : '?') : data.averageScore;
|
||||
document.getElementById('score').innerText = (score || '?') + '% Score';
|
||||
|
||||
document.getElementById('year').innerText =
|
||||
extensionName ? (data.year || '????') : (data.seasonYear || data.startDate?.year || '????');
|
||||
|
||||
document.getElementById('genres').innerText =
|
||||
data.genres?.length > 0 ? data.genres.slice(0, 3).join(' • ') : '';
|
||||
|
||||
document.getElementById('format').innerText = data.format || 'TV';
|
||||
|
||||
document.getElementById('status').innerText = data.status || 'Unknown';
|
||||
|
||||
const extensionPill = document.getElementById('extension-pill');
|
||||
if (extensionName && extensionPill) {
|
||||
extensionPill.textContent = `${extensionName.charAt(0).toUpperCase() + extensionName.slice(1).toLowerCase()}`;
|
||||
@@ -60,45 +78,53 @@ async function loadAnime() {
|
||||
}
|
||||
|
||||
let seasonText = '';
|
||||
if (data.season && data.seasonYear) {
|
||||
seasonText = `${data.season} ${data.seasonYear}`;
|
||||
} else if (data.startDate?.year) {
|
||||
const months = ['', 'Winter', 'Winter', 'Spring', 'Spring', 'Spring', 'Summer', 'Summer', 'Summer', 'Fall', 'Fall', 'Fall', 'Winter'];
|
||||
const month = data.startDate.month || 1;
|
||||
const estimatedSeason = months[month] || '';
|
||||
seasonText = `${estimatedSeason} ${data.startDate.year}`.trim();
|
||||
if (extensionName) {
|
||||
seasonText = data.season || 'Unknown';
|
||||
} else {
|
||||
if (data.season && data.seasonYear) {
|
||||
seasonText = `${data.season} ${data.seasonYear}`;
|
||||
} else if (data.startDate?.year) {
|
||||
const months = ['', 'Winter', 'Winter', 'Spring', 'Spring', 'Spring', 'Summer', 'Summer', 'Summer', 'Fall', 'Fall', 'Fall', 'Winter'];
|
||||
const month = data.startDate.month || 1;
|
||||
const estimatedSeason = months[month] || '';
|
||||
seasonText = `${estimatedSeason} ${data.startDate.year}`.trim();
|
||||
}
|
||||
}
|
||||
document.getElementById('season').innerText = seasonText || 'Unknown';
|
||||
|
||||
let studioName = 'Unknown Studio';
|
||||
if (data.studios?.nodes?.length > 0) {
|
||||
studioName = data.studios.nodes[0].name;
|
||||
} else if (data.studios?.edges?.length > 0) {
|
||||
studioName = data.studios.edges[0]?.node?.name || 'Unknown Studio';
|
||||
}
|
||||
document.getElementById('studio').innerText = studioName;
|
||||
const studio = extensionName
|
||||
? data.studio || "Unknown"
|
||||
: (data.studios?.nodes?.[0]?.name ||
|
||||
data.studios?.edges?.[0]?.node?.name ||
|
||||
'Unknown Studio');
|
||||
|
||||
document.getElementById('studio').innerText = studio;
|
||||
|
||||
const charContainer = document.getElementById('char-list');
|
||||
charContainer.innerHTML = '';
|
||||
|
||||
let characters = [];
|
||||
|
||||
if (data.characters?.nodes?.length > 0) {
|
||||
characters = data.characters.nodes.slice(0, 5);
|
||||
}
|
||||
else if (data.characters?.edges?.length > 0) {
|
||||
characters = data.characters.edges
|
||||
.filter(edge => edge?.node?.name?.full)
|
||||
.slice(0, 5)
|
||||
.map(edge => edge.node);
|
||||
if (extensionName) {
|
||||
characters = data.characters || [];
|
||||
} else {
|
||||
if (data.characters?.nodes?.length > 0) {
|
||||
characters = data.characters.nodes.slice(0, 5);
|
||||
} else if (data.characters?.edges?.length > 0) {
|
||||
characters = data.characters.edges
|
||||
.filter(edge => edge?.node?.name?.full)
|
||||
.slice(0, 5)
|
||||
.map(edge => edge.node);
|
||||
}
|
||||
}
|
||||
|
||||
if (characters.length > 0) {
|
||||
characters.forEach(char => {
|
||||
if (char?.name?.full) {
|
||||
characters.slice(0, 5).forEach(char => {
|
||||
const name = char?.name?.full || char?.name;
|
||||
if (name) {
|
||||
charContainer.innerHTML += `
|
||||
<div class="character-item">
|
||||
<div class="char-dot"></div> ${char.name.full}
|
||||
<div class="char-dot"></div> ${name}
|
||||
</div>`;
|
||||
}
|
||||
});
|
||||
@@ -120,32 +146,27 @@ async function loadAnime() {
|
||||
width: '100%',
|
||||
videoId: data.trailer.id,
|
||||
playerVars: {
|
||||
'autoplay': 1, 'controls': 0, 'mute': 1,
|
||||
'loop': 1, 'playlist': data.trailer.id,
|
||||
'showinfo': 0, 'modestbranding': 1, 'disablekb': 1
|
||||
autoplay: 1, controls: 0, mute: 1,
|
||||
loop: 1, playlist: data.trailer.id,
|
||||
showinfo: 0, modestbranding: 1, disablekb: 1
|
||||
},
|
||||
events: { 'onReady': (e) => e.target.playVideo() }
|
||||
events: { onReady: (e) => e.target.playVideo() }
|
||||
});
|
||||
};
|
||||
} else {
|
||||
const banner = data.bannerImage || data.coverImage?.extraLarge || '';
|
||||
const banner = extensionName
|
||||
? (data.image || '')
|
||||
: (data.bannerImage || data.coverImage?.extraLarge || '');
|
||||
|
||||
if (banner) {
|
||||
document.querySelector('.video-background').innerHTML = `<img src="${banner}" style="width:100%; height:100%; object-fit:cover;">`;
|
||||
document.querySelector('.video-background').innerHTML =
|
||||
`<img src="${banner}" style="width:100%; height:100%; object-fit:cover;">`;
|
||||
}
|
||||
}
|
||||
|
||||
let extensionEpisodes = [];
|
||||
|
||||
if (extensionName) {
|
||||
extensionEpisodes = await loadExtensionEpisodes(animeId, extensionName);
|
||||
|
||||
if (extensionEpisodes.length > 0) {
|
||||
totalEpisodes = extensionEpisodes.length;
|
||||
} else {
|
||||
totalEpisodes = 1;
|
||||
}
|
||||
totalEpisodes = data.episodes || 1;
|
||||
} else {
|
||||
// MODO NORMAL (AniList)
|
||||
if (data.nextAiringEpisode?.episode) {
|
||||
totalEpisodes = data.nextAiringEpisode.episode - 1;
|
||||
} else if (data.episodes) {
|
||||
@@ -166,27 +187,6 @@ async function loadAnime() {
|
||||
}
|
||||
}
|
||||
|
||||
async function loadExtensionEpisodes(animeId, extName) {
|
||||
try {
|
||||
const url = `/api/anime/${animeId}/episodes?ext=${extName}`;
|
||||
const res = await fetch(url);
|
||||
const data = await res.json();
|
||||
|
||||
if (!Array.isArray(data)) return [];
|
||||
|
||||
return data.map(ep => ({
|
||||
id: ep.id,
|
||||
number: ep.number,
|
||||
title: ep.title || `Episode ${ep.number}`,
|
||||
url: ep.url
|
||||
}));
|
||||
} catch (err) {
|
||||
console.error("Failed to fetch extension episodes:", err);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function handleDescription(text) {
|
||||
const tmp = document.createElement("DIV");
|
||||
tmp.innerHTML = text;
|
||||
|
||||
Reference in New Issue
Block a user