add(metadata): request a whole ebook series from hardcover
This commit is contained in:
+20
-10
@@ -239,7 +239,9 @@ $("#search-form").addEventListener("submit", async (e) => {
|
||||
)
|
||||
.join("");
|
||||
box.querySelectorAll("[data-series]").forEach((btn) =>
|
||||
btn.addEventListener("click", () => openSeriesDialog(results[btn.dataset.series]))
|
||||
btn.addEventListener("click", () =>
|
||||
openSeriesDialog(results[btn.dataset.series], type, language)
|
||||
)
|
||||
);
|
||||
box.querySelectorAll("[data-req]").forEach((btn) =>
|
||||
btn.addEventListener("click", async () => {
|
||||
@@ -274,6 +276,7 @@ $("#search-form").addEventListener("submit", async (e) => {
|
||||
|
||||
// ---- request a whole series ----
|
||||
let seriesEpisodes = [];
|
||||
let seriesType = "audiobook";
|
||||
|
||||
function renderSeriesList() {
|
||||
const from = parseInt($("#series-from").value);
|
||||
@@ -288,7 +291,9 @@ function renderSeriesList() {
|
||||
let gap = "";
|
||||
if (e.volume != null && previous != null && e.volume > previous + 1) {
|
||||
const missing = e.volume - previous - 1;
|
||||
gap = `<div class="gap">… ${missing} Folge${missing > 1 ? "n" : ""} nicht bei Audible gefunden (${previous + 1}–${e.volume - 1})</div>`;
|
||||
const ebook = seriesType === "ebook";
|
||||
const unit = ebook ? (missing > 1 ? "Bände" : "Band") : `Folge${missing > 1 ? "n" : ""}`;
|
||||
gap = `<div class="gap">… ${missing} ${unit} nicht ${ebook ? "bei Hardcover" : "bei Audible"} gefunden (${previous + 1}–${e.volume - 1})</div>`;
|
||||
}
|
||||
if (e.volume != null) previous = e.volume;
|
||||
return `${gap}<label>
|
||||
@@ -314,20 +319,23 @@ function updateSeriesCount() {
|
||||
btn.disabled = n === 0;
|
||||
}
|
||||
|
||||
async function openSeriesDialog(result) {
|
||||
async function openSeriesDialog(result, type = "audiobook", language = "") {
|
||||
const dlg = $("#series-dialog");
|
||||
seriesType = type;
|
||||
const unit = type === "ebook" ? "Bände" : "Folgen";
|
||||
$("#series-title").textContent = result.series || "Serie";
|
||||
$("#series-info").innerHTML = '<span class="spinner"></span> Folgen werden gesucht…';
|
||||
$("#series-info").innerHTML = `<span class="spinner"></span> ${unit} werden gesucht…`;
|
||||
$("#series-list").innerHTML = "";
|
||||
$("#series-from").value = "";
|
||||
$("#series-to").value = "";
|
||||
$("#series-library").innerHTML = libOptions("audiobook") || "<option value=''>— keine Library —</option>";
|
||||
$("#series-library").innerHTML = libOptions(type) || "<option value=''>— keine Library —</option>";
|
||||
$("#series-submit").disabled = true;
|
||||
dlg.showModal();
|
||||
try {
|
||||
seriesEpisodes = await api(
|
||||
`/api/search/series?series_id=${encodeURIComponent(result.series_id)}` +
|
||||
`&title=${encodeURIComponent(result.series || result.title)}`
|
||||
`&title=${encodeURIComponent(result.series || result.title)}` +
|
||||
`&media_type=${type}&language=${encodeURIComponent(language)}`
|
||||
);
|
||||
} catch (err) {
|
||||
$("#series-info").textContent = err.message;
|
||||
@@ -335,9 +343,11 @@ async function openSeriesDialog(result) {
|
||||
}
|
||||
const numbered = seriesEpisodes.filter((e) => e.volume != null);
|
||||
$("#series-info").textContent =
|
||||
`${seriesEpisodes.length} Folgen gefunden` +
|
||||
`${seriesEpisodes.length} ${unit} gefunden` +
|
||||
(numbered.length ? ` (Nr. ${numbered[0].volume}–${numbered[numbered.length - 1].volume})` : "") +
|
||||
". Audible hat keine Serien-Abfrage — einzelne Folgen können fehlen.";
|
||||
(type === "ebook"
|
||||
? ". Bände ohne Ausgabe in der gewählten Sprache stehen mit ihrem Originaltitel da."
|
||||
: ". Audible hat keine Serien-Abfrage — einzelne Folgen können fehlen.");
|
||||
renderSeriesList();
|
||||
}
|
||||
|
||||
@@ -356,7 +366,7 @@ $("#series-cancel").addEventListener("click", () => $("#series-dialog").close())
|
||||
|
||||
$("#series-submit").addEventListener("click", async () => {
|
||||
const libId = $("#series-library").value;
|
||||
if (!libId) { toast("Erst eine Audiobook-Library anlegen (Tab Libraries)", true); return; }
|
||||
if (!libId) { toast(`Erst eine ${seriesType === "ebook" ? "Ebook" : "Audiobook"}-Library anlegen (Tab Libraries)`, true); return; }
|
||||
const items = seriesChecked().map((e) => ({
|
||||
title: e.title, authors: e.authors, narrator: e.narrator || "",
|
||||
external_id: e.external_id, year: e.year, series: e.series,
|
||||
@@ -370,7 +380,7 @@ $("#series-submit").addEventListener("click", async () => {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ library_id: parseInt(libId), items }),
|
||||
});
|
||||
setLastLib("audiobook", libId);
|
||||
setLastLib(seriesType, libId);
|
||||
toast(
|
||||
`${res.created.length} Anfragen angelegt` +
|
||||
(res.skipped ? `, ${res.skipped} bereits vorhanden` : "")
|
||||
|
||||
Reference in New Issue
Block a user