Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
332 commits
Select commit Hold shift + click to select a range
f5f2716
fix(ui): align BreakdownBar API with spec
Jul 1, 2026
65a1b1b
fix(storage): align attention and scan-status badges with codebase pa…
Jul 1, 2026
2b14a19
refactor(storage): extract field-extraction helpers to matchers.ts
Jul 1, 2026
9a8eb3b
feat(storage): persist total_space_bytes in RootFolderService.refresh…
Jul 1, 2026
e6045a2
feat(mediaServerStats): emit syncComplete and syncError events
Jul 1, 2026
afa9d64
feat(storage): add shared storage-domain types
Jul 1, 2026
9fe360f
test(storage): add createMediaServerItem and createStorageItem fixtures
Jul 1, 2026
edc0eb9
feat(storage): implement ReconciliationService
Jul 1, 2026
bb4a02b
feat(storage): register ReconciliationService in ServiceManager
Jul 1, 2026
bad4b1e
fix(storage): address ReconciliationService code review findings
Jul 1, 2026
705a42e
docs(storage): document ReconciliationService scaling characteristics
Jul 1, 2026
7706be6
feat(storage): emit reconcileComplete event from ReconciliationService
Jul 1, 2026
833f436
feat(storage): add insight domain types
Jul 1, 2026
9da6bcb
feat(storage): add insights upsert helper
Jul 1, 2026
834701b
feat(storage): add InsightsService skeleton
Jul 1, 2026
1a527e0
feat(storage): add MissingFromMediaServerRule
Jul 1, 2026
a32e52b
feat(storage): add UntrackedByCinephageRule
Jul 1, 2026
b7c36fe
feat(storage): add UnplayedRule
Jul 1, 2026
040a511
feat(storage): add DuplicateItemsRule
Jul 1, 2026
8887a29
feat(storage): add OrphanedFilesRule
Jul 1, 2026
02688f3
feat(storage): add HealthIssuesRule
Jul 1, 2026
e67904a
feat(storage): add QualityBelowCutoffRule
Jul 1, 2026
8eb5ea3
feat(storage): add BrokenPathsRule
Jul 1, 2026
ab0df50
test(storage): clear seeded libraries in InsightsService test
Jul 1, 2026
d68c18f
style(storage): prettier-format DuplicateItemsRule test
Jul 1, 2026
f256603
feat(api): GET /api/storage/insights
Jul 1, 2026
577e6c5
feat(api): POST /api/storage/insights/[id]/dismiss
Jul 1, 2026
24cf986
feat(api): POST /api/storage/reconcile + register InsightsService
Jul 1, 2026
0b413f6
feat(storage): load insights in status page server load
Jul 1, 2026
3d9e6d9
feat(storage): add client-side utils for storage components
Jul 1, 2026
37523aa
feat(storage): add StorageHero component
Jul 1, 2026
eaaf423
feat(storage): add MediaBreakdown component
Jul 1, 2026
885416d
feat(storage): add InsightCard component
Jul 1, 2026
b1fdc4b
feat(storage): add InsightsPanel component
Jul 1, 2026
9ac3bf4
feat(storage): add LibraryOverview component
Jul 1, 2026
882afd3
feat(storage): add RootFolderOverview component
Jul 1, 2026
8d5e84f
feat(storage): add StorageDashboard container and components barrel
Jul 1, 2026
8697cbf
feat(libraries): extract LibraryEditModal from status page
Jul 1, 2026
d2b2e79
feat(storage): rewrite status page to use StorageDashboard
Jul 1, 2026
e1d0ff2
style: apply prettier formatting to storage utils and reconciliation
Jul 1, 2026
13f620b
refactor(storage): delete 7 dead components from Phases 1-4
Jul 1, 2026
4a9b2c5
refactor(storage): consolidate storage-utils into storage/utils.ts an…
Jul 1, 2026
8af6b27
feat(storage): clickable charts deep-link to filtered media explorer
Jul 1, 2026
d62f3b8
docs(storage): write AGENTS.md + acknowledge ?source param on unmatch…
Jul 1, 2026
33c269a
feat(storage): add StorageTile component
Jul 1, 2026
05786be
refactor(storage): move shared data to status/+layout.server.ts
Jul 1, 2026
6e3749c
feat(storage): rewrite StorageDashboard as tile-based overview
Jul 1, 2026
4857a22
feat(storage): add /status/insights sub-route
Jul 1, 2026
7c0f04c
feat(storage): add /status/libraries sub-route
Jul 1, 2026
55f6bb3
feat(storage): add /status/folders sub-route
Jul 1, 2026
cb6c271
feat(storage): simplify status page — remove modal handlers
Jul 1, 2026
3c8afc4
feat(storage): dashboard charts + compact insights sidebar
Jul 1, 2026
2c50f14
feat(storage): pack dashboard with charts, lists, and disk bars
Jul 2, 2026
5cc246c
fix(ui): BreakdownBar valueFormatter prop for byte-valued charts
Jul 2, 2026
2103430
fix(mediaServer): backfill episode tmdbId from parent series in provider
Jul 2, 2026
8f9eb21
fix(storage): exclude series/season from untracked-by-cinephage count
Jul 2, 2026
3c77831
fix(storage): extend rules to episodes + add undismiss endpoint
Jul 2, 2026
f34b56c
fix(storage): revert episode duplicate count in DuplicateItemsRule
Jul 2, 2026
64d806c
fix(grab): pass release.size to grabRelease in movie and tv detail pages
keonramses Jul 1, 2026
1b44eb1
fix(serach): respect enableAutomaticSearch flag in automatic search c…
keonramses Jul 2, 2026
49f76aa
feat(quality): add delay profiles to Quality Settings and add media a…
keonramses Jul 2, 2026
3c35781
feat(quality): add required formats gate with per-profile configurati…
keonramses Jul 2, 2026
5b0f73d
feat(quality): add per-format AND/OR operator for required formats gate
keonramses Jul 2, 2026
30ebd77
fix: resolve CI lint and typecheck errors
keonramses Jul 2, 2026
023021e
fix(lint): resolve formating issues
keonramses Jul 2, 2026
3950943
fix(rename): complete safety overhaul — Radarr-parity architecture
Jul 2, 2026
be594a9
fix(downloads): forward release size in grab requests from detail pages
Jul 4, 2026
57ed216
feat(downloads): log grab rejections under downloads log domain
Jul 4, 2026
21b89a5
Merge pull request #412: Better management of stalled torrents
keonramses Jul 4, 2026
4434220
fix(migrations): correct version numbers in migrations 108 and 109 (#…
keonramses Jul 4, 2026
4547e37
fix: use TVDB dereferrer URLs for numeric series ID links
Jul 5, 2026
12d79ec
fix(library): set series type to anime on import and library scan
keonramses Jul 4, 2026
a79c9ce
fix(parser): parse episode version suffix without separator (s01e01v2)
keonramses Jul 4, 2026
7b484ec
fix(parser): recognise fansub release groups in leading brackets
keonramses Jul 4, 2026
3b1833d
fix(tv): update TVDB series links to use slug-based URL format
keonramses Jul 4, 2026
830af52
fix(logging): log grab pipeline rejections at warn level
keonramses Jul 4, 2026
5ffa881
fix(activity): resolve "Unknown" media titles in monitoring history
keonramses Jul 4, 2026
8c052df
fix(monitoring): detect and repair stale hasFile flags before missing…
keonramses Jul 4, 2026
f600f3b
fix: cascade failed queue cleanup when history is deleted
keonramses Jul 5, 2026
8c6aa0f
feat(activity): add "remove from download client" option for failed d…
keonramses Jul 5, 2026
9d7dd86
Merge origin/dev into feat/storage-overhaul-phase-1
Jul 6, 2026
b73262d
fix(lint): resolve pre-existing format + svelte reactivity lint errors
Jul 6, 2026
504d7e7
fix(typecheck): correct pre-existing insert shapes + duplicate succes…
Jul 6, 2026
9c76ed8
fix(typecheck): add missing rejectionType to MonitoringSearchService …
Jul 6, 2026
d07f392
fix(storage): stop movies splitting into multiple storage_items rows
Jul 6, 2026
8819117
feat(insights): add InsightItem resolver types
Jul 6, 2026
f62baf4
fix(insights): remove unused InsightType import from resolver types
Jul 6, 2026
05f001b
feat(insights): add resolver registry stub with getInsightItemResolver
Jul 6, 2026
fb1d012
feat(insights): add $lib/api/storage.ts with getInsightItems
Jul 6, 2026
73cbd74
feat(insights): add /api/storage/insights/[id]/items endpoint
Jul 6, 2026
75cd6c2
feat(insights): add duplicate-items resolver with pagination
Jul 6, 2026
fa910ed
feat(insights): add quality-below-cutoff resolver
Jul 6, 2026
de2babe
feat(insights): add broken-paths resolver
Jul 6, 2026
7ce81f7
feat(insights): add unplayed resolver
Jul 6, 2026
8f23f6d
feat(insights): add health-issues resolver
Jul 6, 2026
1ce911e
feat(insights): add orphaned-files resolver
Jul 6, 2026
94c22f5
feat(insights): add untracked-by-cinephage resolver
Jul 6, 2026
f59dfc6
feat(insights): add missing-from-media-server resolver and finalize r…
Jul 6, 2026
99a6baa
feat(insights): add InsightDetailModal.svelte with paginated item list
Jul 6, 2026
4f1d053
feat(insights): wire InsightDetailModal into StorageDashboard widget
Jul 6, 2026
524c3e8
feat(insights): wire modal into InsightsPanel and update InsightCard
Jul 6, 2026
3c0de27
fix: lint errors - add {#each} keys and remove unused variable
Jul 6, 2026
da80920
fix: build errors - button-in-button and deprecated svelte:component
Jul 6, 2026
3ec7db4
fix: add missing required_formats to scoring_profiles CREATE TABLE
Jul 6, 2026
8b08540
feat(insights): add SSE stream for reactive storage updates
Jul 6, 2026
64f9933
refactor(library): split layout data load per sub-tab
Jul 7, 2026
e26ca4b
fix(naming): use canonical rename route path
Jul 7, 2026
c3559c8
fix(library): make listLibraries read-only; add reconcileAll
Jul 7, 2026
06fcc7e
feat(library): register library-reconcile scheduled task
Jul 7, 2026
9b25346
fix(libraries): use invalidateAll instead of location.reload
Jul 7, 2026
30ccaf7
feat(api): add delay-profiles service module
Jul 7, 2026
44dab2b
refactor(quality): use delay-profiles service module
Jul 7, 2026
6bc0b30
refactor(filters): reframe as metadata discovery filters
Jul 7, 2026
9a61815
refactor(naming): replace confirm() with ConfirmationModal
Jul 7, 2026
04447ad
refactor(library): use shared LibraryEditModal; delete inline duplicate
Jul 7, 2026
589bb5d
i18n(quality): translate delay profiles sub-tab
Jul 7, 2026
4bafef6
style: prettier formatting + remove unused imports
Jul 7, 2026
899acdb
refactor(quality): extract DelayProfileList component
Jul 7, 2026
d5d773f
refactor(naming): extract shared types out of server bundle; batch re…
Jul 7, 2026
546577a
feat(library): surface hidden scan settings in interim UI
Jul 7, 2026
f78518f
refactor(naming): extract NamingAdvancedOptions component
Jul 7, 2026
3af4cca
refactor(naming): extract NamingReviewPanel component
Jul 7, 2026
f3fc0fb
feat(patterns): add PatternRecognitionService core with TDD
Jul 7, 2026
135e776
refactor(scanner): wire PatternRecognitionService into StreamingDiskS…
Jul 7, 2026
2d88f94
feat(patterns): consolidate EXCLUDED_FILE_PATTERNS into bonus defaults
Jul 7, 2026
4786f7c
feat(patterns): add DB schema + migration v112 for pattern recognition
Jul 7, 2026
0a6e740
feat(patterns): add PatternConfigService for config CRUD + compilation
Jul 7, 2026
d192f2e
feat(patterns): add pattern recognition settings UI
Jul 7, 2026
38d49ee
feat(resolution): add editable resolution categories
Jul 7, 2026
7521dd6
feat(quality): add DB scaffolding for quality profile system
Jul 7, 2026
99a1a46
feat(library): add per-library scan modes
Jul 7, 2026
1cca1a4
feat(history): add history retention budgets with storage forecasts
Jul 7, 2026
eacdcd6
feat(duplicates): add duplicate detection system
Jul 7, 2026
f187774
feat(library): add mixed-type library support
Jul 7, 2026
7c7e4ae
revert: remove wrongly-placed tabs and additions from Library settings
Jul 7, 2026
62e5430
refactor(status): i18n monitoring pages + add sub-navigation
Jul 7, 2026
26f4c91
refactor(history): move history retention into monitoring/status
Jul 7, 2026
bcec767
refactor(history): integrate retention into dashboard as collapsible …
Jul 7, 2026
67c2850
feat(insights): add filename-duplicate insight rule
Jul 7, 2026
b38423a
feat(libraries): show scan mode on library overview cards
Jul 7, 2026
b7023ef
fix: resolve storage-overhaul regressions — detail-page 500s, .strm n…
Jul 8, 2026
1608a4f
fix(activity): parse release group at write time instead of re-parsin…
Jul 8, 2026
3d56e3a
fix(library): make root folder the single source of truth for default…
Jul 8, 2026
384bdaa
chore: fix pre-existing lint, type, and format errors on branch
Jul 8, 2026
7bfca13
fix(db): guard migration 119 against missing release_group column
Jul 8, 2026
ad2f1de
refactor: move scan status bar to top of storage dashboard
Jul 8, 2026
1ffb263
refactor(settings): remove legacy redirect shims and fix stale nav links
Jul 8, 2026
6423082
i18n(settings): translate tab-bar aria labels and rename legacy keys
Jul 8, 2026
c8748c8
fix(import): use real library ID from import result for "View in Libr…
keonramses Jul 8, 2026
cf11d67
fix(import): lock import method selection while import is in progress
keonramses Jul 8, 2026
e952ba5
feat(indexers): migrate Prowlarr integration to native search API
keonramses Jul 8, 2026
50bdaa0
fix(indexers): complete prowlarr native search integration
keonramses Jul 8, 2026
c204831
fix(indexers): require definitionId=prowlarr for badge and management…
keonramses Jul 8, 2026
1ad2978
feat(indexers): add Prowlarr aggregate endpoint mode
keonramses Jul 8, 2026
3837be6
fix(indexers): add prowlarr XXX categories, fix open search behavior,…
keonramses Jul 8, 2026
1086ac4
fix(indexers): refresh API key from connection before testing Prowlar…
keonramses Jul 8, 2026
8c17340
fix(indexers): add lightweight connectivity test for aggregate Prowla…
keonramses Jul 8, 2026
f2168db
fix(indexers): update BitSearch links to use the correct domain
keonramses Jul 9, 2026
77bbeac
fix(import): wire preferHardlink setting into manual importer and sur…
keonramses Jul 9, 2026
4ac77c3
fix(captcha): improve Cloudflare challenge bypass reliability
keonramses Jul 9, 2026
c9063f7
Update knaben.yaml
Nerdtality Jul 10, 2026
902057b
fix(grab): drop unused quality field and return proper error codes
Jul 11, 2026
a161bf8
fix(downloads): use API magnet for public trackers instead of torrent…
Jul 11, 2026
85e3099
feat(streaming): serve mp4 sources as HLS VOD playlist with reachabil…
Jul 11, 2026
afce928
feat(indexers): filter blocklisted releases from search results
Jul 12, 2026
55aa34a
refactor(indexers): demote noisy per-request logs to debug
Jul 12, 2026
95b092b
fix(downloads): capture downloads log domain and harden monitor grace…
Jul 12, 2026
4e818d4
fix(search): clear result cache when indexer enabled state changes
keonramses Jul 11, 2026
4edf318
chore(docker): shared build-deps base stage + prune musl lightningcss
keonramses Jul 11, 2026
9a89653
fix: patch memory leak vectors found
keonramses Jul 12, 2026
8b3e35a
Fix indentation in ReconciliationService.ts
keonramses Jul 12, 2026
8dea39a
feat(captcha): cap browsers, add native Cloudflare click solver, hard…
Jul 12, 2026
2274bb5
feat(indexers): migrate Jackett to native JSON search API with IMDB I…
keonramses Jul 12, 2026
4b87ef8
fix(indexers): prevent partial updates from wiping config
Jul 13, 2026
42fd506
fix: stop retrying TMDB external ID lookup for deleted entries and hi…
keonramses Jul 14, 2026
a3e0e0f
feat: add Real-Debrid and TorBox acquisition
Jul 15, 2026
18f5588
fix(profiles): remove v114 dual-default scaffolding, restore single d…
Jul 14, 2026
4422df6
feat: per-movie multi-quality support (closes #166)
Jul 14, 2026
989a580
fix(acquisition): make movie occupancy bucket-aware for multi-quality
Jul 14, 2026
4ba336c
test(acquisition): pin null-quality download bucket-isolation behavior
Jul 14, 2026
8a6bc7e
fix(search): correct multi-quality bucket fill on add
Jul 14, 2026
ca30ab5
test(search): lock all-buckets-filled upgrade routing
Jul 14, 2026
86afcf0
test(grab): multi-quality two-bucket grab succeeds end-to-end
Jul 14, 2026
322ee56
style: prettier-format multi-quality grab integration test
Jul 14, 2026
be0de31
fix(storage): multi-quality-aware duplicate and cutoff insight rules
Jul 14, 2026
8440fb7
test(storage): cover multi-quality dup counts and cutoff best-file in…
Jul 14, 2026
b43d3f3
fix(status): aggregate multi-quality movie files to best file and sum…
Jul 14, 2026
658ac80
refactor(status): use schema-inferred types in movie aggregation
Jul 14, 2026
ec62ca7
feat(db): add subtitles.movie_file_id FK for per-file subtitles (v124)
Jul 14, 2026
8b6a3a7
feat(db): index subtitles.movie_file_id (v124)
Jul 14, 2026
32eeb3a
feat(subtitles): per-file download and sync for multi-quality movies
Jul 14, 2026
9e7cd79
fix(subtitles): validate movieFileId belongs to the movie
Jul 14, 2026
586d699
feat(subtitles): per-file search with movieFileId-tagged results
Jul 14, 2026
30c54a7
fix(subtitles): isolate per-file search failures and lock precedence
Jul 14, 2026
8e9b605
feat(subtitles): link discovered movie sidecars to their movie file
Jul 14, 2026
0ff481c
fix(subtitles): case-insensitive movie sidecar linking
Jul 14, 2026
b7afa42
fix(library): show best file quality across multi-quality movies
Jul 14, 2026
8d27b3a
feat(library): add desired qualities picker to movie add flow
Jul 14, 2026
331581b
refactor(library): type desiredQualities as DesiredQuality union, dro…
Jul 14, 2026
5156726
feat(storage): redundant-quality-tiers insight + redundantFileIds helper
Jul 15, 2026
04c7728
fix(quality): exclude unknown-resolution files from single-quality re…
Jul 15, 2026
15515c4
feat(library): opt-in removal of unwanted quality tiers on desiredQua…
Jul 15, 2026
afc67c7
fix(library): surface reconcile delete failures and harden PATCH
Jul 15, 2026
0c3b070
fix(library): honor recycleEnabled in all movie-file delete paths
Jul 15, 2026
e7f6f25
docs(library): correct deletePhysicalFile error contract + clear dele…
Jul 15, 2026
f0bbcd1
fix/feat: naming consistency, multi-episode linking, folder rename, i…
keonramses Jul 16, 2026
67b8a46
fix(library): show all root folder options in multi-file import step 3
keonramses Jul 16, 2026
7c2587f
fix(lint): resolve formatting issue in import page component
keonramses Jul 16, 2026
128c360
feat(nav): add pin button to keep sidebar submenus open
keonramses Jul 16, 2026
68c28a4
fix(rename): prevent root-folder sweep; carry only stem-matched compa…
keonramses Jul 16, 2026
4dc2def
fix(import): populate naming tokens, preserve release groups, and res…
keonramses Jul 17, 2026
caacc78
fix(scripts): repair live test harness after YamlIndexer removal
Jul 18, 2026
835f72d
feat(indexers): add TheRARBG definition
Jul 18, 2026
b61eb77
feat(indexers): add Magnetz definition
Jul 18, 2026
ec25f95
feat(indexers): add BT4G definition (RSS endpoint)
Jul 18, 2026
5f360b7
feat(indexers): add TorrentGalaxy Clone definition
Jul 18, 2026
c79cd7c
feat(indexers): add DigitalCore definition
Jul 19, 2026
0b624be
feat(indexers): add seedpool definition
Jul 19, 2026
67f6d57
chore(merge): resolve conflicts with upstream/dev
keonramses Jul 19, 2026
89dd93f
Merge pull request #425 from ppoloskov/feat/debrid-core
keonramses Jul 19, 2026
7a0423b
fix(ui): make tasks tables fully responsive
keonramses Jul 19, 2026
592d20e
fix(monitoring): promote history retention setting in storage & maint…
keonramses Jul 19, 2026
cb7f7ff
fix(monitoring): group untracked episodes insights by series name in …
keonramses Jul 19, 2026
c11a979
fix(monitoring): fix libraries-without-root-folder returning empty an…
keonramses Jul 19, 2026
33c1a82
fix(monitoring): add immediate feedback to scan and sync buttons
keonramses Jul 19, 2026
6690f54
fix: disable chokidar symlink following to prevent CPU spike on NAS
keonramses Jul 19, 2026
fb82c66
fix(server): add yield event loop in scan/match loops to keep app res…
keonramses Jul 20, 2026
42c1bab
fix(smartlists): fetch all TMDB list pages using total_pages from API…
keonramses Jul 20, 2026
167e6f4
fix(naming): add `collection` to the token picker
keonramses Jul 20, 2026
8b6ffc8
fix(naming): add warning and inline metadata refresh when {Collection…
keonramses Jul 20, 2026
a797752
feat(naming): add collection assignment to movie detail page
keonramses Jul 20, 2026
94e1fd8
feat(deploy): add Unraid Community Apps template files
Jul 24, 2026
636b190
chore: add SPDX license identifier for license detection
Jul 24, 2026
b91ada8
chore(deps): bump tailwind group (daisyui 5.5.23->5.6.3, @tailwindcss…
Jul 24, 2026
7249d2a
chore: update flake.lock
github-actions[bot] Jul 24, 2026
5bbd7af
feat(naming): add path separator hint in movie/series folder format
keonramses Jul 24, 2026
330a936
feat(library): overhaul collection section on movie detail page
keonramses Jul 25, 2026
9e9bb89
feat(library): add "Search in Discover" shortcut on library empty sea…
keonramses Jul 25, 2026
df5955b
fix(discover): prevent infinite /api/discover request loop in debug mode
keonramses Jul 25, 2026
fdfcd56
feat(logs): add clear all logs button
keonramses Jul 25, 2026
be82de5
fix(import): preserve full episode range for multi-episode files duri…
keonramses Jul 25, 2026
d52592a
fix(scan): prevent CPU lockout on NAS-backed Docker volumes during fo…
keonramses Jul 25, 2026
7759aeb
fix(search): fix multi-season pack search missing S01-S07 style releases
keonramses Jul 25, 2026
87616eb
fix: populate all MediaNamingInfo tokens at every naming call site
keonramses Jul 26, 2026
476fde7
feat: per-item metadata language overrides with refreshed edit modal …
Jul 27, 2026
3ee57a5
fix(library): resolve edit field collisions and update field title cl…
keonramses Jul 30, 2026
d2be165
fix(search): add result sort options for desktop view
keonramses Jul 30, 2026
33113a8
feat(search): improve Interactive Search mobile and landscape UX
keonramses Jul 30, 2026
20f91aa
Merge remote-tracking branch 'upstream/main' into dev
keonramses Jul 30, 2026
984e14d
fix: resolve merge artifacts and correct Renovate config
Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
21 changes: 21 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,27 @@ BETTER_AUTH_SECRET=
# Maximum log entries per worker in memory (default: 1000)
# WORKER_MAX_LOGS=1000

# =============================================================================
# CAPTCHA / CLOUDFLARE BROWSER SOLVING (Advanced)
# =============================================================================
# Cinephage solves Cloudflare/DDoS-Guard challenges with an embedded headless
# Firefox (Camoufox). Each browser is a full Firefox process (300MB-1GB+ RSS),
# so concurrency is hard-capped to avoid OOM under heavy fan-out.

# Maximum concurrent Camoufox browsers (default: 2, minimum: 1).
# Lower to 1 on memory-constrained hosts (e.g. small LXCs); raise only if you
# also raise the container's shm_size.
# CAPTCHA_MAX_BROWSERS=2

# Force-close a browser if it lives longer than this many ms (default: 120000).
# Safety net for wedged/orphaned browsers; must exceed the solve timeout.
# CAPTCHA_BROWSER_MAX_AGE_MS=120000

# NOTE on /dev/shm: headless Firefox uses shared memory. Containers default to
# 64MB which causes crashes. docker-compose.yaml sets shm_size: 256m. For
# `docker run`, add `--shm-size=256m`. On Proxmox LXC, the host's /dev/shm may
# also need raising (mount a larger tmpfs at /dev/shm inside the container).

# =============================================================================
# STREAMING CONFIGURATION (Advanced)
# =============================================================================
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ghcr-retag-latest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -205,5 +205,5 @@ jobs:
echo "- Source tag: \`${SOURCE_TAG}\`"
echo "- Source digest: \`${SOURCE_DIGEST}\`"
echo "- New latest digest: \`${NEW_LATEST_DIGEST}\`"
echo "- Result: \`latest\` now points to \`${SOURCE_TAG}\`"
echo "- Result: \`latest\` now points to \`${SOURCE_TAG}\`"
} >> "$GITHUB_STEP_SUMMARY"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ opencode
opencode.md
OPENCODE.md
AGENTS.md
HANDOVER.md

# Qwen local settings
.qwen/
Expand Down
24 changes: 13 additions & 11 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
# ==========================================
# Build Stage
# Build-deps base (shared by builder + prod-deps to avoid duplicate apt layers)
# ==========================================
FROM node:24-trixie-slim AS builder
FROM node:24-trixie-slim AS build-deps-base
WORKDIR /app

RUN apt-get update && apt-get install -y --no-install-recommends \
python3 \
make \
g++ \
&& rm -rf /var/lib/apt/lists/*

# ==========================================
# Build Stage
# ==========================================
FROM build-deps-base AS builder

COPY package*.json ./
COPY .npmrc ./

Expand All @@ -32,14 +36,7 @@ RUN npm run build
# ==========================================
# Production Dependencies Stage
# ==========================================
FROM node:24-trixie-slim AS prod-deps
WORKDIR /app

RUN apt-get update && apt-get install -y --no-install-recommends \
python3 \
make \
g++ \
&& rm -rf /var/lib/apt/lists/*
FROM build-deps-base AS prod-deps

COPY package*.json ./
COPY .npmrc ./
Expand All @@ -50,6 +47,7 @@ COPY .npmrc ./
RUN npm ci --omit=dev --no-audit --no-fund \
&& find node_modules -type f -name '*.map' -delete \
&& find node_modules -type d \( -name test -o -name tests -o -name __tests__ -o -name docs -o -name doc -o -name examples -o -name example \) -prune -exec rm -rf '{}' + \
&& find node_modules -name 'lightningcss-linux-x64-musl' -prune -exec rm -rf '{}' + \
&& find node_modules -type d -empty -delete

# ==========================================
Expand All @@ -63,6 +61,7 @@ ARG APP_SOURCE=https://github.com/MoldyTaint/Cinephage
ARG VCS_REF=unknown
ARG BUILD_CREATED=unknown
ENV APP_VERSION=${APP_VERSION}
ENV APP_COMMIT=${VCS_REF}
RUN printf '%s\n' "$APP_VERSION" > /app/version.txt

LABEL org.opencontainers.image.title='Cinephage' \
Expand Down Expand Up @@ -101,11 +100,14 @@ COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/server.js ./server.js
COPY --from=builder /app/scripts ./scripts
COPY --from=builder /app/data ./bundled-data
# Camoufox shadow-unlock addon (loaded at runtime for Cloudflare Turnstile solving)
COPY --from=builder /app/src/lib/server/captcha/browser/addon ./camoufox-addon
COPY --chmod=755 docker-entrypoint.sh /usr/local/bin/cinephage-entrypoint
COPY --chmod=755 docker-script-runner.sh /usr/local/bin/cinephage-script
RUN ln -sf /usr/local/bin/cinephage-script /usr/local/bin/cine-run

ENV NODE_ENV=production \
NODE_OPTIONS="--max-old-space-size=2048" \
HOST=0.0.0.0 \
PORT=3000 \
FFPROBE_PATH=/usr/bin/ffprobe \
Expand Down
6 changes: 5 additions & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later

GNU GENERAL PUBLIC LICENSE

Cinephage - Self-hosted Media Management
Copyright (C) 2025 Cinephage Contributors

Expand All @@ -16,7 +20,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.

--------------------------------------------------------------------------------

GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE (full text)
Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,9 @@ Dynamic content discovery with auto-add to library. Import from IMDb, Trakt, TMD
## Requirements

- **TMDB API Key** — Free at [themoviedb.org/settings/api](https://www.themoviedb.org/settings/api)
- **Download Client** (optional) — qBittorrent, SABnzbd, or NZBGet
- **Download Client** (optional) — qBittorrent, SABnzbd, NZBGet, Real-Debrid, or TorBox
- Or use streaming mode — no download client needed
- Real-Debrid and TorBox accept torrent releases, materialize ready files directly into the resolved library destination, and can optionally remove provider items after a durable import.

## Quick Start

Expand Down
108 changes: 108 additions & 0 deletions data/indexers/definitions/1337x.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
---
# 1337x Public Torrent Indexer
# Adapted for Cinephage from the Prowlarr/Jackett community definition.
# Cloudflare-protected: relies on Cinephage's built-in Camoufox captcha solver.
id: 1337x
name: 1337x
description: 1337x is a Public torrent site that offers verified torrent downloads
language: en-US
type: public
protocol: torrent
encoding: UTF-8
requestdelay: 2

links:
- https://1337x.to/
- https://1337x.st/
- https://x1337x.ws/

settings:
- name: info_flaresolverr
type: info_flaresolverr
- name: downloadlink
type: select
label: Download link
default: 'magnet:'
options:
'magnet:': Magnet
'http://itorrents.org/': iTorrents.org
- name: downloadlink2
type: select
label: Download link (fallback)
default: 'http://itorrents.org/'
options:
'http://itorrents.org/': iTorrents.org
'magnet:': Magnet

caps:
categorymappings:
- { id: 28, cat: TV/Anime, desc: 'Anime/Anime' }
- { id: 1, cat: Movies/DVD, desc: 'Movies/DVD' }
- { id: 2, cat: Movies/SD, desc: 'Movies/Divx/Xvid' }
- { id: 42, cat: Movies/HD, desc: 'Movies/HD' }
- { id: 54, cat: Movies/HD, desc: 'Movies/h.264/x264' }
- { id: 70, cat: Movies/HD, desc: 'Movies/HEVC/x265' }
- { id: 76, cat: Movies/UHD, desc: 'Movies/UHD' }
- { id: 41, cat: TV/HD, desc: 'TV/HD' }
- { id: 71, cat: TV, desc: 'TV/HEVC/x265' }
- { id: 75, cat: TV/SD, desc: 'TV/SD' }
- { id: 5, cat: TV, desc: 'TV/DVD' }

modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]

download:
# The .torrent URL and magnet URI live on the details page.
selectors:
- selector: ul li a[href^="{{ .Config.downloadlink }}"]
attribute: href
- selector: ul li a[href^="{{ .Config.downloadlink2 }}"]
attribute: href

search:
# 1337x serves a stricter Cloudflare challenge on deep links; the captcha
# solver warms up the site root first, so a simple search path is enough.
paths:
- path: 'search/{{ .Keywords }}/1/'

keywordsfilters:
- name: re_replace # daily standard S2023 > 2023
args: ['\bS(20\d{2})\b', '$1']

rows:
selector: 'tr:has(a[href^="/torrent/"])'

fields:
title:
selector: td[class^="coll-1"] a[href^="/torrent/"]
details:
selector: td[class^="coll-1"] a[href^="/torrent/"]
attribute: href
download:
selector: td[class^="coll-1"] a[href^="/torrent/"]
attribute: href
category:
selector: td[class^="coll-1"] a[href^="/sub/"]
attribute: href
optional: true
default: '42'
filters:
- name: split
args: ['/', 2]
seeders:
selector: td[class^="coll-2"]
leechers:
selector: td[class^="coll-3"]
size:
selector: td[class^="coll-4"]
date:
selector: td[class^="coll-date"]
optional: true
filters:
- name: fuzzytime
downloadvolumefactor:
text: '0'
uploadvolumefactor:
text: '1'
3 changes: 2 additions & 1 deletion data/indexers/definitions/bitsearch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ type: public
encoding: UTF-8
requestdelay: 2
links:
- https://bitsearch.to/
- https://bitsearch.eu/
- https://solidtorrents.eu/
legacylinks:
- https://bitsearch.to/
- https://bitsearch.nocensor.cloud/
- https://bitsearch.mrunblock.bond/
- https://solidtorrents.net/
Expand Down
Loading