diff --git a/server.js b/server.js index cf43e1a..837dd4a 100644 --- a/server.js +++ b/server.js @@ -23,8 +23,8 @@ fastify.register(require('@fastify/static'), { }); fastify.register(require('@fastify/static'), { - root: path.join(__dirname, 'src'), - prefix: '/src/', + root: path.join(__dirname, 'src', 'scripts'), + prefix: '/src/scripts/', decorateReply: false }); diff --git a/src/scripts/anime/anime.js b/src/scripts/anime/anime.js index 29878ff..f41e2b1 100644 --- a/src/scripts/anime/anime.js +++ b/src/scripts/anime/anime.js @@ -20,35 +20,70 @@ async function loadAnime() { return; } - const title = data.title.english || data.title.romaji; + const title = data.title?.english || data.title?.romaji || "Unknown Title"; document.title = `${title} | WaifuBoard`; document.getElementById('title').innerText = title; - document.getElementById('poster').src = data.coverImage.extraLarge; + if (data.coverImage?.extraLarge) { + document.getElementById('poster').src = data.coverImage.extraLarge; + } const rawDesc = data.description || "No description available."; handleDescription(rawDesc); document.getElementById('score').innerText = (data.averageScore || '?') + '% Score'; - document.getElementById('year').innerText = data.seasonYear || '????'; - document.getElementById('genres').innerText = data.genres ? data.genres.slice(0, 3).join(' • ') : ''; - + document.getElementById('year').innerText = 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('episodes').innerText = data.episodes || '?'; document.getElementById('status').innerText = data.status || 'Unknown'; - document.getElementById('season').innerText = `${data.season || ''} ${data.seasonYear || ''}`; - if (data.studios && data.studios.nodes.length > 0) { - document.getElementById('studio').innerText = data.studios.nodes[0].name; + 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(); + } + 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 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 (data.characters && data.characters.nodes) { - const charContainer = document.getElementById('char-list'); - data.characters.nodes.slice(0, 5).forEach(char => { - charContainer.innerHTML += ` -
-
${char.name.full} -
`; + if (characters.length > 0) { + characters.forEach(char => { + if (char?.name?.full) { + charContainer.innerHTML += ` +
+
${char.name.full} +
`; + } }); + } else { + charContainer.innerHTML = ` +
+ No character data available +
`; } document.getElementById('watch-btn').onclick = () => { @@ -70,23 +105,28 @@ async function loadAnime() { }); }; } else { - const banner = data.bannerImage || data.coverImage.extraLarge; - document.querySelector('.video-background').innerHTML = ``; + const banner = data.bannerImage || data.coverImage?.extraLarge || ''; + if (banner) { + document.querySelector('.video-background').innerHTML = ``; + } } - - if (data.nextAiringEpisode) { + if (data.episodes) { + totalEpisodes = data.episodes; + } else if (data.nextAiringEpisode?.episode) { totalEpisodes = data.nextAiringEpisode.episode - 1; } else { - totalEpisodes = data.episodes || 12; + totalEpisodes = 12; } totalEpisodes = Math.min(Math.max(totalEpisodes, 1), 5000); + document.getElementById('episodes').innerText = totalEpisodes; renderEpisodes(); } catch (err) { - console.error(err); + console.error('Error loading anime:', err); + document.getElementById('title').innerText = "Error loading anime"; } } diff --git a/src/scripts/books/book.js b/src/scripts/books/book.js index 2c9264e..7e2d3a3 100644 --- a/src/scripts/books/book.js +++ b/src/scripts/books/book.js @@ -8,6 +8,7 @@ async function init() { try { const res = await fetch(`/api/book/${bookId}`); const data = await res.json(); + console.log(data) if (data.error) { const titleEl = document.getElementById('title'); diff --git a/src/scripts/books/reader.js b/src/scripts/books/reader.js index ea62049..5755039 100644 --- a/src/scripts/books/reader.js +++ b/src/scripts/books/reader.js @@ -448,12 +448,16 @@ document.querySelectorAll('[data-direction]').forEach(btn => { }); prevBtn.addEventListener('click', () => { - const newChapter = String(parseInt(chapter) - 1); + const current = parseInt(chapter); + if (current <= 0) return; + + const newChapter = String(current - 1); updateURL(newChapter); window.scrollTo(0, 0); loadChapter(); }); + nextBtn.addEventListener('click', () => { const newChapter = String(parseInt(chapter) + 1); updateURL(newChapter);