v1.1.0-beta.034 - feat(metadata/converter): series book types, dedicated series.json export job, ZIP-disguised CBR fix, configurable series-ended window
π Converter: ZIP-disguised CBRs
- Magic-byte sniffing now picks the decoder: PK-signature files extract via AdmZip directly, no external binary β extensions lie
- A successful unrar listing that comes back empty is treated as not a RAR β WinRAR's UnRAR.exe exits 0 silently on non-RAR input, so exit codes lie in both directions
- Fixes Archive contained no valid images after extraction on mislabeled CBZ-as-CBR files
π¦ series.json data quality
- comic_image prefers the remote ComicVine/Metron cover via the new Series.remoteCoverUrl column (captured on metadata sync), falls back to the locally cached cover as an absolute URL via NEXTAUTH_URL, and is null only when the series has no cover at all β never an Omnibus-local relative path
- Empty values write null instead of (publisher, descriptions, comic_image, publication_run) so Komga parses the file
- remoteCoverUrl backfills on each series' next metadata refresh β refresh the library before re-exporting to populate every file immediately
π Series book type (Print / OneShot / TPB / GN)
- New Series.bookType column populated from Metron's series_type (authoritative) or conservative ComicVine heuristics (name hints, ended single-issue volumes)
- Auto-categorization only fills blanks β manual edits via the new Book Type selector in Edit Series are never clobbered by refreshes
- series.json booktype reflects the real categorization (default Print); non-Print series show a badge on the series page
- Library page gains a Book Type filter composable with all existing filters; uncategorized series count as Print
β° Dedicated series.json export job
- New EXPORT_SERIES_JSON job with its own schedule, scoped-run support, and a skip-with-warning log when the export feature is disabled
- EMBED_METADATA is now XML-only and chains a scoped series.json export afterward β imports, edits, and bulk ops produce both files as separate logged jobs
- New Scheduled Jobs card mirrors the series.json toggle; selecting a schedule auto-enables the export feature with an explanatory toast
- Ownership tracking (Series.seriesJsonWritten): Omnibus only overwrites files it created, upgrades its own legacy Komga-format files, and skips curated/Mylar files with a logged warning
π Configurable series Ended window
- The hardcoded 1.5-year inactivity cutoff is now an admin setting (Settings β Metadata): 6β36 months or Never; the 18-month default preserves prior behavior
- Both ComicVine and Metron sync paths share the new window helper; log lines state the configured window
π¨ UI polish
- Series page badges restacked: status and book type share the top row, Monitored sits full-width below so its text never squishes
- Settings: Ended-window description spans the full card width
ποΈ Schema
- New Series columns: remoteCoverUrl, bookType, seriesJsonWritten β created automatically by prisma db push on container start (dev: npx prisma db push)
- New settings keys: series_json_schedule, series_ended_months
β Verification
- tsc clean; vitest 179/179 across 58 files
- New coverage: magic-byte ZIP routing and empty-listing fallback, EMBEDβEXPORT job chaining, export-disabled skip logging, series.json ownership protection and legacy-format upgrade, booktype/null-field/cover-fallback output shape
Addresses #163