github MoldyTaint/Cinephage v0.17.0

3 hours ago

0.17.0 (2026-09-10)

Bug Fixes

  • api: stat files before serving and update main API key fallback to use correct permission set for verification (e751cd2)
  • build: pre-compile paraglide before vite build (8ed4fc0)
  • captcha: passive-first two-phase solving and browser-context binary downloads (40de989), closes #228
  • cinephage: preserve release version prefix (fca6dad)
  • CI: resolve typecheck errors (5adc591)
  • db: make all remaining INSERT sites idempotent with onConflictDoNothing (8e8404e)
  • db: never brick boot when startup VACUUM fails (248725a)
  • db: purge legacy orphaned unmatched_files rows (migration 131) (6009bf8)
  • discover: prevent SectionRow TMDB request loop (c3dafcd)
  • docker: add AbortSignal.timeout to healthcheck fetch (7010566)
  • docker: allow 10m startup grace for first-run camoufox download (#516) (3fdc8ba)
  • docker: chown intermediate .cache dir in shallow ownership path (f454071), closes #516
  • docker: create camoufox staging dir on non-root direct runs (#516) (08d15cb)
  • docker: exclude generated paraglide from build context (65d498c)
  • docker: measured camoufox logging, interrupted-install recovery, staging sweep (#516) (9ce5331)
  • download-clients: enforce boolean safety for sequentialDownload (bf609a2)
  • download-clients: improve error message for failed torrent addition (f78d469)
  • download-clients: prevent import-exhausted failures from being resurrected by polling (4a444c2), closes #502
  • downloadClients: fall back to get_cats for SABnzbd 5.x categories (#482) (691711d)
  • downloadClients: resolve relative SABnzbd complete_dir via local path mapping (#489) (3913630)
  • downloadClients: stalled progress timeout, blocked extensions and search cache (6f93b43)
  • downloads: prevent duplicate torrent tracking (4b3779d)
  • filesystem: cache root folder paths to prevent event-loop freeze on large directories (#495) (14e5ddd)
  • filters: let manual grabs override size validation (df959a0)
  • import: apply manual episode/season overrides when filename parses successfully during manual import (74f46f2)
  • import: copy without mode preservation to support exfat roots (#490) (74bfacb)
  • import: raise bulk job cap and request body limit, clearer payload errors (#496) (04a13e0)
  • import: respect user's default root folder setting in manual import destination (47ca9c6)
  • indexers: add kinozal.me mirror to Kinozal indexer definitions (49caba2)
  • indexers: ID-first matching, context-aware parsing and scoring hardening (df92741), closes Sonarr#7372
  • indexers: pure language boost, drop dead enhanced-path boost and seeder leak (1a96e57)
  • indexers: return first movie variant results instead of timing out (a72340c)
  • integrations: add explicit update schemas to prevent Zod v4 default injection (30cbccf)
  • integrations: review fixes for PR #484 debrid preflight (9dcb321)
  • library-watcher: harden ENOSPC handling and detect network mounts (cfd827c)
  • library-watcher: replace chokidar with @parcel/watcher to fix inotify exhaustion (0464f10)
  • library: add cancelled TV status filter with both status spellings (#494) (a8e7455)
  • library: allow debrid client to satisfy auto-search preflight (d6d0671)
  • library: canonicalize article titles and score TMDB original titles (0881514), closes #513
  • library: direct ownership handoff in LibraryOperationLock release path (27fbd52)
  • library: guard read-only root folder destinations (#529) (63bdf9b)
  • library: guard read-only root folder destinations (#529) (f5978cb)
  • library: heal failures fall back to removal; accurate heal metrics; deterministic transition order (74b93ee)
  • library: infinite loop + directory false-positives for uppercase/extension-named content (4824ea6)
  • library: keyset match paging, queued reprocess-all, self-healing job worker (c1181aa), closes #513
  • library: make poster grid breakpoints responsive (978799e)
  • library: movie detail back link restores filtered list state (#515) (a5f5e91)
  • library: never wipe tracked records when a root folder scans as empty (b16bcfe), closes #505
  • library: persist current list URL not destination in returnUrl keys (#515) (eef34bb)
  • library: persist explicit default quality profile selection (#493) (3b6c821)
  • library: persist movies return URL for back navigation (#515) (b98a7b8)
  • library: persist tv return URL for back navigation (#515) (de5f3d3)
  • library: preserve filters when returning from detail (6f7fdd9), closes MoldyTaint/Cinephage#515
  • library: prevent event loop starvation during initial folder scan on ZFS/NFS (747fc66)
  • library: refuse cross-root unmatched matches to avoid unresolvable file links (#488) (a6fbcb0)
  • library: refuse rename and move operations while a library scan is in flight (12963e2)
  • library: reject read-only root folders in reorganize and smartlist APIs (#529) (753867f)
  • library: relax write-test dir mode to avoid media-server watcher errors (eecdca6)
  • library: restore episode file links after series refresh rebuilds episodes (6bcdbbd)
  • library: series detail back link restores filtered list state (#515) (782fdc4)
  • library: stop double-resolving returnTo back links on detail pages (SSR 500) (0c89db9)
  • library: validate read-only root folders without write access (ff93d6f), closes MoldyTaint/Cinephage#522
  • library: watcher defers during rename operations and re-queues on transient errors (9fd6334)
  • license: restore canonical GPL-3.0 text for GitHub/Unraid CA detection (11762e6)
  • lint: resolve pre-existing ESLint errors from updated rule set (9f0306a)
  • media-matcher: make movie_files insert idempotent (54ec2f5)
  • media-matcher: make season/episode/episode_file inserts idempotent (34304fc)
  • media-matcher: replace try/catch UNIQUE recovery with onConflictDoNothing across all tables (b47e94e)
  • mediaServerStats: resolve Plex episodes to their parent series TMDB ID (0edff04), closes #500
  • metadata: guard against TMDB placeholder titles and honor series language in manual refresh (3f15a00), closes #509
  • monitoring: resolve default scoring profile for null-profile upgrade contexts (#492) (f39c792)
  • monitoring: resolve log freeze and add capture-level persistence (fd5a5ec)
  • monitoring: scope every log call site to a proper domain (6018f83)
  • monitoring: season-pack search fixes for torrent / non-Western trackers (63b9535), closes #504
  • monitoring: truthful history records and search-window fixes (b374f51)
  • naming: chunk rename execution in RenamePreviewModal to respect the 500-file server cap (48f6e2e)
  • naming: create nested target directories for letter-bucket renames and clean emptied parents (7b0d913)
  • naming: fall back to filename-parsed audio languages in Rename Preview (f70572e), closes #507
  • naming: map validation failures on rename execute to 400 instead of 500 (b5fc4a9)
  • naming: move renameExecuteSchema out of +server.ts — SvelteKit forbids non-handler exports (173999b)
  • naming: report rollback failure accurately in reorganize error message (c61ff39)
  • naming: reset confirm state on empty selection and refresh preview after mid-batch failure (603abad)
  • naming: resolve svelte-check type error in lock integration test (12cc4c6)
  • naming: roll back folder rename on disk when the DB path update fails (ea5a0aa)
  • naming: surface and record folder-path DB update failures instead of swallowing them (bef5a38)
  • naming: surface per-file error details in rename-failure message (i18n {errors} placeholder) (03ae6f3)
  • notifications: guard root-folder reorganize/delete, skip Plex pre-delete, cover root guards with tests (e9c0ed3)
  • parser: bracketed episode notation, same-season ranges, title hygiene (28555e4)
  • parser: don't treat episode-title tail words as release groups (186705d)
  • parser: harden episode-range detection and bare ISO 639-1 language tags (7e2cae3), closes #508 #510 #508 #510
  • parser: release-group guard handles bracketed quality blocks in generated filenames (4e12dd6)
  • parser: strip space-separated extensions in release-group guard (94d3ccd)
  • perf: eliminate remaining event-loop-blocking scans in status/logs tabs (bab3071)
  • perf: eliminate unbounded full-table scans across dashboard, library pages, monitoring, and background rules (9447bcc)
  • preserve native streaming formats (09186ad)
  • qbittorent: refactor test stubs for torrent and preferences (52f81e1)
  • qbittorrent: declare test-local hash/forceStart vars in duplicate-detection test (390972b)
  • qbittorrent: parse structured add responses (4d9daf6)
  • quality: apply default profile bounds to null-profile multi-quality buckets (36a4d7b)
  • reconciliation: fix crash, event-loop blocking, and missed triggers (f7d966d)
  • rename: add inline warning when rename button is disabled during an active scan (a128a22)
  • repair episode file links after refresh, re-link unmatched files, and fix scan toasts (a91d978)
  • resolve correlationIds in diagnostic reports to actual log record (98c7510)
  • server: add sqlite.close, fix exit codes, ensure closeDb on all paths (7536d0c)
  • server: chunk stale-item deletion media-server stats to avoid SQLite variable limit (b5cd33a)
  • settings: preserve Date columns in configuration backup round-trip (3ddb61c), closes #513
  • storage: multi-episode files no longer flagged missing from media server (#481) (06b5b8a)
  • streaming: add CORS preflight and cheap HEAD probes to session entry routes (7894946)
  • streaming: build legacy master.m3u8 redirects from the configured base URL (cec4276)
  • streaming: classify DASH sources correctly and surface upstream probe status (c7b355f), closes #503
  • unmatched: clear file selection when switching view mode on Unmatched Files page (6b1e4b3)
  • unmatched: update unmatched file count immediately after delete or match (072721a)
  • use resolveAppVersion() in pre-update backup filenames (5ff1196)
  • validation: stop mediaBrowserServerTestSchema backfilling serverType default (af9a6c6), closes #499

Features

  • activity: distinct importing status for finished transfers awaiting import (13e75af), closes #501
  • add partially monitored indicator for TV series (#514) (3d4d383)
  • api: add local library file streaming api endpoints (ac6ee11)
  • i18n: add parameterized library_backTo message (#515) (8c55ddb)
  • indexers: add native Hungarian tracker definitions (43413dd)
  • indexers: add NoNaMe Club and fix Kinozal cartoon categories (115f22a)
  • indexers: rutracker dub-studio title normalization (kinozal parity) (7639b10)
  • indexers: session cookie store, browser cookie injection, search & alternate-title improvements (fa2b6ef)
  • libraries: allow separate quality profiles per library (60a5e0f), closes #439
  • library: add LibraryOperationLock for rename/scan mutual exclusion (072a3cc)
  • library: defer library scans while rename operations hold the operation lock (a9ad2bb)
  • library: persist title search query in list URLs (#515) (f04ec7c)
  • library: reorganize operations write rename history for crash-window healing (0de08b8)
  • library: root-folder moves hold the library operation lock (683f2ce)
  • library: scan diff heals externally-renamed folders via basename+size correlation (9cc020e)
  • library: scan diff heals renamed rows from rename_history instead of deleting (efcafcf)
  • library: series-directory context matching for TV files (6d82643)
  • monitoring: add diagnostic Reports page with correlation tracing (6597fbe)
  • monitoring: add Import Failures tab to reports page (b463c3c)
  • monitoring: add Rejected Releases tab to reports page (41fa86d)
  • monitoring: add Renaming Failures tab to reports page (2366ec1)
  • naming: add preview cache and progressive streaming (09a826f)
  • naming: add Specials folder support for season 0 naming with scanner fixes (7785d36)
  • naming: batch folder reorganize holds the operation lock across all items (3028416)
  • naming: cap rename batches at 500 and reject renames during library scans (3a79b4a)
  • naming: hold operation lock during rename execution and folder reorganize (450647e)
  • naming: in-place renames carry stem-matched subtitle companions (7b3e371)
  • naming: two-step bulk rename confirmation with media-server warning and 500-item batching (65dcc87)
  • naming: whitespace-tolerant tokens, docs-name aliases, and :First first-letter spec (issue #497 stage A) (8c440ff)
  • notifications: enforce per-server event toggles, Deleted-for-old-path, pre-delete retry, move notifications (97f1be8)
  • qbittorrent: add sequential download option (4b6560d)
  • reports: add Resolve All bulk action to diagnostic report tabs (fab218b)
  • settings: surface latest release and auto-update toggle on cinephage page (1e36e19)
  • streaming: honor empty-referer contract and wire refresh=1 for gateway sources (1a9fb52)
  • streaming: remuxable .strm entry points, DASH support, self-healing gateway identity (5473ad3), closes #469 #470 #471
  • subtitles: add Super Subtitles provider (e0f9814)
  • system: add SQLite database backup feature (7fc0354)
  • unmatched: add force-match UI and overhaul unmatched files page (77d9135)
  • unraid: add ca_profile.xml at repo root for CA submission (7a1fcd8)

Performance Improvements

  • db: batch disk-scan writes in transactions and yield between chunks (1d8fb84)
  • db: run one-time VACUUM and enable incremental auto-vacuum on startup (4603050)
  • naming: chunk preview computation and cap execute concurrency (e16636a)
  • reconciliation: skip no-op DB writes on stable library, add storage_items file-id indexes (7b3c03f)

Don't miss a new Cinephage release

NewReleases is sending notifications on new releases.