+
{j.movieTitle}
{j.movieYear ? ` (${j.movieYear})` : ""}
diff --git a/apps/admin-ui/src/app/globals.css b/apps/admin-ui/src/app/globals.css
index da8b9e9..bfe4c48 100644
--- a/apps/admin-ui/src/app/globals.css
+++ b/apps/admin-ui/src/app/globals.css
@@ -779,6 +779,16 @@ tr.row-selected {
gap: 0.75rem;
}
+.list-card-title {
+ font-weight: 600;
+ color: var(--text-bright);
+ font-size: 0.92rem;
+ line-height: 1.35;
+ flex: 1;
+ min-width: 0;
+ word-break: break-word;
+}
+
.list-card-meta {
display: flex;
justify-content: space-between;
diff --git a/apps/master-api/src/synology/download-station.ts b/apps/master-api/src/synology/download-station.ts
index d20b2df..4c53899 100644
--- a/apps/master-api/src/synology/download-station.ts
+++ b/apps/master-api/src/synology/download-station.ts
@@ -246,7 +246,7 @@ export class SynologyDownloadStation {
const url = `${this.root()}/webapi/DownloadStation/task.cgi`;
const res = (await requestJson(url, { method: "POST", body })) as DsApiResponse;
if (!res.success) {
- throw new Error(`Download-taak aanmaken mislukt (code ${res.error?.code ?? "?"})`);
+ throw new Error(dsTaskError(res.error?.code, "Download-taak aanmaken mislukt"));
}
});
}
@@ -294,6 +294,24 @@ function sleep(ms: number): Promise
{
return new Promise((r) => setTimeout(r, ms));
}
+/** Human-readable Synology Download Station Task API errors. */
+function dsTaskError(code: number | undefined, prefix: string): string {
+ const hints: Record = {
+ 400: "bestand-upload mislukt",
+ 401: "maximaal aantal taken bereikt",
+ 402: "geen schrijfrecht op destination",
+ 403: "destination bestaat niet — gebruik share-relatief pad, bv. Downloads of Downloads/complete (niet /volume1/...)",
+ 404: "ongeldige task-id",
+ 405: "ongeldige actie",
+ 406: "geen default destination in Download Station",
+ 407: "destination instellen mislukt",
+ 408: "bestand bestaat niet",
+ };
+ const hint = code != null ? hints[code] : undefined;
+ if (hint) return `${prefix}: ${hint} (code ${code})`;
+ return `${prefix} (code ${code ?? "?"})`;
+}
+
/** Strip common release tags so TMDB search works better. */
export function cleanReleaseQuery(raw: string): string {
let s = raw.trim();