diff --git a/desktop/src/scripts/books/reader.js b/desktop/src/scripts/books/reader.js index 6d38d04..93c672e 100644 --- a/desktop/src/scripts/books/reader.js +++ b/desktop/src/scripts/books/reader.js @@ -1,7 +1,4 @@ -// reader.js refactorizado - const urlParams = new URLSearchParams(window.location.search); -const lang = urlParams.get('lang') ?? 'none'; const reader = document.getElementById('reader'); const panel = document.getElementById('settings-panel'); const overlay = document.getElementById('overlay'); @@ -14,6 +11,16 @@ const nextBtn = document.getElementById('next-chapter'); const lnSettings = document.getElementById('ln-settings'); const mangaSettings = document.getElementById('manga-settings'); + +const rawSource = urlParams.get('source') || 'anilist'; +const sourceParts = rawSource.split('?'); +const source = sourceParts[0]; + +let lang = + urlParams.get('lang') ?? + new URLSearchParams(sourceParts[1] || '').get('lang') ?? + 'none'; + const config = { ln: { fontSize: 18, @@ -123,9 +130,6 @@ function updateSettingsVisibility() { // === CAMBIO: Nueva función para traer la lista de capítulos y saber el orden === async function fetchChapterList() { - const urlParams = new URLSearchParams(window.location.search); - const source = urlParams.get('source') || 'anilist'; - try { // Reusamos el endpoint que lista capítulos const res = await fetch(`/api/book/${bookId}/chapters?source=${source}&provider=${provider}`); @@ -154,10 +158,6 @@ async function loadChapter() { `; - const urlParams = new URLSearchParams(window.location.search); - let source = urlParams.get('source'); - if (!source) source = 'anilist'; - // === CAMBIO: Si no tenemos la lista de capítulos (y no es local), la pedimos === if (provider !== 'local' && chaptersList.length === 0) { await fetchChapterList(); @@ -176,6 +176,15 @@ async function loadChapter() { const res = await fetch(newEndpoint); const data = await res.json(); + const chapterMeta = chaptersList.find( + c => String(c.id) === String(currentChapterId) + ); + + if (chapterMeta) { + chapterLabel.textContent = `Chapter ${chapterMeta.number} - ${chapterMeta.title}`; + document.title = `Chapter ${chapterMeta.number} - ${chapterMeta.title}`; + } + // Lógica específica para contenido LOCAL if (provider === 'local') { const unitIndex = Number(currentChapterId); // En local el ID suele ser el índice @@ -186,9 +195,6 @@ async function loadChapter() { return; } - chapterLabel.textContent = unit.name; - document.title = unit.name; - const manifestRes = await fetch(`/api/library/${unit.id}/manifest`); const manifest = await manifestRes.json(); @@ -215,6 +221,8 @@ async function loadChapter() { return; } } + const rawSource = urlParams.get('source') || 'anilist'; + const source = rawSource.split('?')[0]; const res2 = await fetch(`/api/book/${bookId}?source=${source}`); const data2 = await res2.json(); @@ -234,12 +242,14 @@ async function loadChapter() { return; } - if (data.title) { - chapterLabel.textContent = data.title; - document.title = data.title; - } else { - chapterLabel.textContent = `Chapter ${data.number ?? currentChapterId}`; - document.title = `Chapter ${data.number ?? currentChapterId}`; + if (!chapterMeta) { + if (data.title) { + chapterLabel.textContent = `Chapter ${data.number ?? ''} - ${data.title}`; + document.title = chapterLabel.textContent; + } else { + chapterLabel.textContent = `Chapter ${data.number ?? currentChapterId}`; + document.title = chapterLabel.textContent; + } } setupProgressTracking(data, source); @@ -339,11 +349,9 @@ function changeChapter(newId) { } function updateURL(newId) { - const urlParams = new URLSearchParams(window.location.search); - const source = urlParams.get('source') ?? 'anilist'; - // La URL ahora contiene el ID en lugar del número/índice - const newUrl = `/read/${provider}/${newId}/${bookId}?source=${source}&lang=${lang}`; + const newUrl = + `/read/${provider}/${newId}/${bookId}?source=${source}&lang=${lang}`; window.history.pushState({}, '', newUrl); } @@ -602,8 +610,6 @@ document.querySelectorAll('[data-direction]').forEach(btn => { // Botón "Atrás" document.getElementById('back-btn').addEventListener('click', () => { - const urlParams = new URLSearchParams(window.location.search); - let source = urlParams.get('source')?.split('?')[0]; if (source === 'anilist' || !source) { window.location.href = `/book/${bookId}`; diff --git a/docker/src/scripts/books/reader.js b/docker/src/scripts/books/reader.js index f7a5645..93c672e 100644 --- a/docker/src/scripts/books/reader.js +++ b/docker/src/scripts/books/reader.js @@ -1,7 +1,4 @@ -// reader.js refactorizado - const urlParams = new URLSearchParams(window.location.search); -const lang = urlParams.get('lang') ?? 'none'; const reader = document.getElementById('reader'); const panel = document.getElementById('settings-panel'); const overlay = document.getElementById('overlay'); @@ -14,6 +11,16 @@ const nextBtn = document.getElementById('next-chapter'); const lnSettings = document.getElementById('ln-settings'); const mangaSettings = document.getElementById('manga-settings'); + +const rawSource = urlParams.get('source') || 'anilist'; +const sourceParts = rawSource.split('?'); +const source = sourceParts[0]; + +let lang = + urlParams.get('lang') ?? + new URLSearchParams(sourceParts[1] || '').get('lang') ?? + 'none'; + const config = { ln: { fontSize: 18, @@ -123,9 +130,6 @@ function updateSettingsVisibility() { // === CAMBIO: Nueva función para traer la lista de capítulos y saber el orden === async function fetchChapterList() { - const urlParams = new URLSearchParams(window.location.search); - const source = urlParams.get('source') || 'anilist'; - try { // Reusamos el endpoint que lista capítulos const res = await fetch(`/api/book/${bookId}/chapters?source=${source}&provider=${provider}`); @@ -154,10 +158,6 @@ async function loadChapter() { `; - const urlParams = new URLSearchParams(window.location.search); - let source = urlParams.get('source'); - if (!source) source = 'anilist'; - // === CAMBIO: Si no tenemos la lista de capítulos (y no es local), la pedimos === if (provider !== 'local' && chaptersList.length === 0) { await fetchChapterList(); @@ -176,6 +176,15 @@ async function loadChapter() { const res = await fetch(newEndpoint); const data = await res.json(); + const chapterMeta = chaptersList.find( + c => String(c.id) === String(currentChapterId) + ); + + if (chapterMeta) { + chapterLabel.textContent = `Chapter ${chapterMeta.number} - ${chapterMeta.title}`; + document.title = `Chapter ${chapterMeta.number} - ${chapterMeta.title}`; + } + // Lógica específica para contenido LOCAL if (provider === 'local') { const unitIndex = Number(currentChapterId); // En local el ID suele ser el índice @@ -186,9 +195,6 @@ async function loadChapter() { return; } - chapterLabel.textContent = unit.name; - document.title = unit.name; - const manifestRes = await fetch(`/api/library/${unit.id}/manifest`); const manifest = await manifestRes.json(); @@ -215,19 +221,35 @@ async function loadChapter() { return; } } + const rawSource = urlParams.get('source') || 'anilist'; + const source = rawSource.split('?')[0]; + + const res2 = await fetch(`/api/book/${bookId}?source=${source}`); + const data2 = await res2.json(); + + fetch("/api/rpc", { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + details: data2.title.romaji ?? data2.title, + state: `Chapter ${data.title}`, + mode: "reading" + }) + }); - // Lógica para Extensiones / Anilist if (data.error) { reader.innerHTML = `