Updated run_program and torrent_processor to fix issue with multiple … - #443
Open
zab1996 wants to merge 223 commits into
Open
Updated run_program and torrent_processor to fix issue with multiple …#443zab1996 wants to merge 223 commits into
zab1996 wants to merge 223 commits into
Conversation
Removed help section for setup and configuration.
- Color-code enabled/disabled scrapers and content sources in settings - Add configurable display limits for recently added/upgraded items - Add date range controls for upcoming releases - Reorganize debug page with tabs (Database, Library, Symlink, Monitoring) - Fix manual blacklist integer/string type errors - Fix UFC scraping queue handling - Improve TMDB/IMDb ID validation and error messages
UI improvements and bug fixes
…de enabled/disabled scrapers and content sources in settings, Add configurable display limits for recently added/upgraded items, Add date range controls for upcoming releases, Reorganize debug page with tabs (Database, Library, Symlink, Monitoring), Fix manual blacklist integer/string type errors, Fix UFC scraping queue handling, Improve TMDB/IMDb ID validation and error messages
…de enabled/disabled scrapers and content sources in settings, Add configurable display limits for recently added/upgraded items, Add date range controls for upcoming releases, Reorganize debug page with tabs (Database, Library, Symlink, Monitoring), Fix manual blacklist integer/string type errors, Fix UFC scraping queue handling, Improve TMDB/IMDb ID validation and error messages
bug fix for time format parameter list
- Season packs now prefill with "Seasons" selection type and the specific season selected - Individual episodes now prefill with "Episode" selection type, season, and episode selected - Add prefill_episode parameter support to magnet routes and template - Use the actual scrape version instead of reading from dropdown - Fix magnet fields not showing on initial load for episode prefills 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix magnet assigner prefill for season packs and individual episodes
0.7.24 - Add Tangerine theme and theme switcher, Add AIOStreams scraper support, Add loading overlay during settings save operation, Fixed bug with user-configurable date/time format, Centralize loading overlay styles in theme-specific CSS files, Extract inline CSS from templates to dedicated CSS files, Add Flask-Compress for compression of responses, Added cache-control headers for static assets, Add ETag support for better browser caching validation, Move all page-specific styles tags to external CSS files, Consolidate duplicate CSS across templates, Configure special CSS caching to support theme switching
…er support, Add loading overlay during settings save operation, Fixed bug with user-configurable date/time format, Centralize loading overlay styles in theme-specific CSS files, Extract inline CSS from templates to dedicated CSS files, Add Flask-Compress for compression of responses, Added cache-control headers for static assets, Add ETag support for better browser caching validation, Move all page-specific styles tags to external CSS files, Consolidate duplicate CSS across templates, Configure special CSS caching to support theme switching 0.7.24 - Add Tangerine theme and theme switcher, Add AIOStreams scraper support, Add loading overlay during settings save operation, Fixed bug with user-configurable date/time format, Centralize loading overlay styles in theme-specific CSS files, Extract inline CSS from templates to dedicated CSS files, Add Flask-Compress for compression of responses, Added cache-control headers for static assets, Add ETag support for better browser caching validation, Move all page-specific styles tags to external CSS files, Consolidate duplicate CSS across templates, Configure special CSS caching to support theme switching
…OStreams Turned off caching for settings page and added additional info for AIOStreams
Turned off caching for settings page and added additional info for AIOStreams
Implements AllDebrid as an alternative debrid provider alongside RealDebrid: - Add AllDebridProvider class with full API client implementation - Support for cache checking, torrent management, and file operations - API key validation in settings - Rate limiting and retry logic for API calls - Provider selection in onboarding and settings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Normalize status field in get_torrent_info to match Real-Debrid format (statusCode 4 or upload ready=true -> 'downloaded') - Use upload response 'ready' field as authoritative cache indicator - Return False (uncached) instead of None when torrent is processing but files aren't available yet, fixing N/A display in frontend - Store upload ready status in _upload_ready_status dict for lookup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add AllDebrid provider support
…ebrid provider support (godver), Implemented AIOStreams API scraper with authentication, Improved Trakt API rate limiting with smart caching, Implemented IMDB to Trakt ID cache system, Added Plex labels automatic application feature, Added Overseerr requester tracking in content source, Added scraper priority scoring and reordering, Fixed database lock issues during post processing, Implemented staggered Trakt task startup delays, Added Not Contains filter operator to database, Added column resizing in desktop mode to database, Fixed form field accessibility with IDs and labels, Improved mobile navigation for Tangerine theme, Implemented web caching toggle in UI settings, Added source badge visual display in scraper, Fixed shows library status page, Fixed content source enabled field preservation, Added database indexes for performance optimization, Implemented background settings reinitialization, Added supervisord state checking before operations, Fixed apostrophe handling in Plex title searches, General ui and css improvments
…ry Movie detail page with file management, Added Library Show detail page with episode management, Added DeletionManager unified deletion utility class, Added content source removal on item deletion, Added Trakt list permission check before removal, Added batch SQL delete for 89% faster performance, Added queue pause/resume during deletions, Added database lock detection with retry mechanism, Fixed symlink mode deletion to match database route, Fixed blocking psutil.cpu_percent calls causing spikes, Fixed duplicate code in run_program queue processing, Fixed asyncio event loop bug in web scraper, Fixed pause/resume throttling causing CPU load, Fixed N+1 database query in scraper search, Added batch database status lookup for searches, Added TMDB cache utility for search results, Optimized scraper page with server-side rendering, Added schema consolidation for missing columns, Added duplicates filter for mixed-state items, Added size column display in database viewer, Added path truncation for long file paths, Added backfill function in Debug, Added multi-version file tracking for episodes, Fixed mobile responsive sidebar margins, Fixed manual blacklist mobile styling, Added instant search feedback indicator, Added Library help documentation pages, Fixed dynamic routes for help content, And various fixes here and there
scraper tester bug fix
Optimized Plex/debrid deletion with content-level API calls and torrent deduplication
…g to reduce Plex API calls, Add cache-busting and defensive guards for Loading.js in database page, Fix CPU always 0% by priming psutil baseline on performance dash, Fix duplicate logs and reduce streaming CPU usage in log viewer
Add 5-minute debounce for Plex recent scans, Add show metadata caching to reduce Plex API calls, Add cache-busting and defensive guards for Loading.js in database page, Fix CPU always 0% by priming psutil baseline on performance dash, Fix duplicate logs and reduce streaming CPU usage in log viewer
improve plex functions
Fix for symlinks pointing to the last episode in season packs
Fixes and Improvements
- NzbDAV support: full multi-provider usenet architecture with factory pattern routing; NzbDAV client, setup wizard, and migration utility from Decypharr included - NZB repair engine: automated broken-item detection with exponential backoff (1h→2h→4h, 24h cap), replacement NZB submission, and Plex deletion ordering before Decypharr deletion - Debrid file naming: optional structured folder rename in Decypharr DFS mount using CLI name format; configurable include/exclude of version and content source; async retry up to 20 attempts at 30s intervals - Trakt collection pagination: full collection now fetched using 1000-item pages; fixes truncation at 100-item default limit for large collections - Filter source targeting: per-filter source dropdown (Both / NZB / Debrid) allows applying filter_in and filter_out patterns selectively by provider type - Debrid file selection: size-based extras filtering drops files under 5% of largest to prevent trailers and bonus content from being selected alongside main feature - Content source tags: per-source tag assignment with tags_exclusive toggle; virtual Decypharr folder generation from tag patterns via new API endpoint - Battery alias enrichment: TMDB alternative titles merged into show/movie alias list after Trakt/TVDB data fetch for improved title matching - Audio/subtitle track metadata: language track extraction for Plex and Jellyfin stored as ISO codes; audio_channels overlay asset directory removed in favour of dynamic track fields - NZB deduplication: DB-level segment ID guard prevents re-submission of identical NZBs across indexers; duplicate episode guard blocks second NZB when same episode+version already in Adding or Checking - Statistics page: stats_provider_priority setting (auto/debrid/usenet) replaces hard-coded debrid logic for installations using usenet as primary provider - Subtitle upload: Plex API upload path for read-only debrid mounts; rating_key and name_hint parameters added to subtitle download function - Battery title search fix: DirectAPI.search_media tuple unpacking corrected in plex_functions.py; IMDb fallback lookup now resolves correctly for items without embedded Plex metadata - APScheduler watchdog: detects and reschedules critical queue tasks dropped by scheduler saturation - Genre filtering: case-insensitive matching in both batch and full-scan modes - Checking queue: provider-agnostic via get_usenet_client(); duplicate Plex scan prevention guard added - Various fixes and improvements
0.7.44 - NzbDAV support: full multi-provider usenet architecture with factory pattern routing; NzbDAV client, setup wizard, and migration utility from Decypharr included - NZB repair engine: automated broken-item detection with exponential backoff (1h→2h→4h, 24h cap), replacement NZB submission, and Plex deletion ordering before Decypharr deletion - Debrid file naming: optional structured folder rename in Decypharr DFS mount using CLI name format; configurable include/exclude of version and content source; async retry up to 20 attempts at 30s intervals - Trakt collection pagination: full collection now fetched using 1000-item pages; fixes truncation at 100-item default limit for large collections - Filter source targeting: per-filter source dropdown (Both / NZB / Debrid) allows applying filter_in and filter_out patterns selectively by provider type - Debrid file selection: size-based extras filtering drops files under 5% of largest to prevent trailers and bonus content from being selected alongside main feature - Content source tags: per-source tag assignment with tags_exclusive toggle; virtual Decypharr folder generation from tag patterns via new API endpoint - Battery alias enrichment: TMDB alternative titles merged into show/movie alias list after Trakt/TVDB data fetch for improved title matching - Audio/subtitle track metadata: language track extraction for Plex and Jellyfin stored as ISO codes; audio_channels overlay asset directory removed in favour of dynamic track fields - NZB deduplication: DB-level segment ID guard prevents re-submission of identical NZBs across indexers; duplicate episode guard blocks second NZB when same episode+version already in Adding or Checking - Statistics page: stats_provider_priority setting (auto/debrid/usenet) replaces hard-coded debrid logic for installations using usenet as primary provider - Subtitle upload: Plex API upload path for read-only debrid mounts; rating_key and name_hint parameters added to subtitle download function - Battery title search fix: DirectAPI.search_media tuple unpacking corrected in plex_functions.py; IMDb fallback lookup now resolves correctly for items without embedded Plex metadata - APScheduler watchdog: detects and reschedules critical queue tasks dropped by scheduler saturation - Genre filtering: case-insensitive matching in both batch and full-scan modes - Checking queue: provider-agnostic via get_usenet_client(); duplicate Plex scan prevention guard added - Various fixes and improvements
The NzbDAV submit-router, the in-app setup helper's required-category list, and the repair/health owned-set were three independent hard-coded category lists. They had drifted: the router emits movies_1080p / movies_2160p / *_remux / anime_*, while the setup helper + NZBDAV_REQUIRED_CATEGORIES create movies_1080p_264 / shows_1080p_264. A user who follows the in-app setup creates categories the router never uses and is missing the ones it does -> uploads land in categories with no Plex section -> items are invisible and loop in Wanted (NzbDAV does no post-categorisation, unlike Decypharr). Make all three derive from one place: the taxonomy in nzbdav_client plus an optional 'Usenet Provider.nzbdav_category_map' (comma-separated bucket=name pairs). Unmapped buckets fall back along a specificity ladder (movies_2160p_remux -> movies_2160p -> movies), so the router can never emit a category the instance doesn't manage. Empty map = identity routing over the stock taxonomy, so existing setups are unaffected. - nzbdav_client.py: _parse_category_map / _resolve_category / managed_categories + _route_category; owned-set derives from managed_categories. - program_operation_routes.py: _nzbdav_required_categories derives from the map. - web_server.py: inject_nzbdav_categories context processor for the helper. - _nzbdav_setup_helper.html: scaffold generator uses the managed list. - settings_schema.py: nzbdav_category_map key. - tests/test_nzbdav_categories.py: parsing, ladder fallback, and the no-invisible-category invariant.
remove_nzb only deleted by nzo_id. For a library item migrated between providers via provider_transfer, filled_by_torrent_id still holds the OLD provider's id, which is not a live nzbdav nzo_id — so delete-by-id silently no-ops, the file stays in nzbdav, Plex re-imports it, and cli-debrid writes the item back (delete-from-library doesn't stick). Add a fallback: when delete-by-id doesn't confirm AND the id is genuinely absent from history (not 'present but errored'), match the history entry by EXACT, full normalised name (basename, video-ext stripped, non-alphanumerics removed). Never a substring — a 1080p release must not resolve to its 2160p sibling — and if more than one entry normalises equal, REFUSE rather than guess. An id that IS in history but failed to delete is treated as a hard failure (no name guessing). deletion_manager passes location_basename (the scene release name, which equals the nzbdav history entry name and carries quality/codec) as the match key instead of filled_by_file, which is often an opaque blob name. Tests: tests/test_nzbdav_remove.py covers native delete, migrated-id fallback, full-name (not substring) matching, ambiguity refusal, and the present-but-errored no-guess path.
…back nzbdav: exact-name fallback in remove_nzb so library-delete of migrated items sticks
…tegories nzbdav: configurable category map (fix submit/setup taxonomy drift → invisible items)
The repair engine's guard before it deletes + re-scrapes a provider-flagged item is _verify_file_readable: True (readable) skips it as a false positive, False permits deletion. It read the first 1MB via 'dd ... count=1'. On lazy debrid/FUSE mounts that is unreliable; the dangerous direction is a false NEGATIVE — a momentary mount hiccup makes the single read fail, the file is judged dead, and a good file is deleted + re-scraped. A provider health flag plus one flaky read is how a server blip becomes a wave of deletions. Reading only the first block also passes files whose header is cached but body is dead. Changes: - Validate with ffprobe, reading one real packet via -read_intervals at a RANDOM 20-80% point of the file's duration (deep, past the cached header, away from end padding; varied across runs so partial rot is eventually sampled). The offset is proportional to each file's own duration, so short files are handled; unknown duration / no ffprobe falls back to a start or dd first-block read. ffmpeg/ffprobe already ships in the image. - Conservative retry: succeed on any attempt -> readable; conclude unreadable ONLY when every attempt fails cleanly; any inconclusive (timeout/error) attempt -> assume readable. The offset is fixed per call so retries probe the same spot (transient-blip tolerance, not moving goalposts). Subprocess + hard timeout (D-state safety on hung FUSE reads) preserved. Tests: tests/test_repair_readcheck.py — success short-circuit, clean-fail = unreadable, transient-then-success, 'any inconclusive -> keep', offset is a 20-80% fraction constant across retries, and unknown-duration start fallback.
…readcheck nzbdav repair: ffprobe canonical read-check + conservative retry (prevent false-positive deletions)
The dashboard renders download stats and debrid subscription status server-side. Both fetched the debrid provider synchronously on the request thread, and that call can take ~90s when the provider is down (3 retries x 30s timeout). So a down/slow debrid provider hung the whole dashboard render for up to ~90s — for a couple of non-critical widgets. Make get_cached_download_stats and get_cached_subscription_status resilient (stale-while-revalidate): - Refresh runs on a background thread; the request always returns the current cached value immediately and never blocks on provider I/O. - Stale-if-error: a failed refresh keeps the last good value instead of replacing it with an error state. - Cold start (no value yet) waits a short bounded time (3s) for the first result, then returns a non-blocking placeholder. The page renders stats server-side without polling, so a brief wait lets a healthy first load show real data; a down provider costs at most 3s, not ~90s. - Background refreshes are coalesced (one at a time) and throttled (>=30s) so a failing provider isn't hammered. Scope: only the two server-rendered dashboard helpers. Action endpoints (POST) and XHR data endpoints are intentionally left as-is. Tests: tests/test_stats_resilience.py — fresh short-circuit, serve-stale without blocking, cold-start placeholder, refresh coalescing, and the same for subscription (7 tests).
stats: non-blocking dashboard stats (stale-while-revalidate) so a down debrid provider can't hang the dashboard
bug fix and improvements
… key, usenet-only None guards, rename capability guard
All changes are strictly provider-agnostic — debrid and decypharr behaviour is
unchanged; guards are inert whenever a debrid provider exists.
A) Tag-exclusive category misroute (nzbdav). _resolve_category sent a
tags_exclusive tag to the catch-all whenever a custom nzbdav_category_map was
set (the tag has no parent in the structural ladder). Return the tag verbatim
when the bucket is not a structural category. usenet/nzbdav_client.py + test.
B) Add the 'Usenet Provider.provider' schema key (string, default 'decypharr',
choices decypharr|nzbdav). It was read by code but absent from the schema
(survived only via deep-merge). The schema-default merge is key-existence
guarded, so a saved 'nzbdav' is never reset. utilities/settings_schema.py.
C) Usenet-only (no debrid key) crash safety — additive None/empty guards:
- debrid/__init__.py: never put None in the providers chain ([] not [None]).
- queues/torrent_processor.py: check_cache_status returns (False,'no_provider')
when no provider; skip the parallel cache-check when providers is empty
(avoids ThreadPoolExecutor max_workers=0).
- utilities/web_scraper.py + routes/scraper_routes.py: guard providers[0]
indexing so a torrent result in a usenet-only setup degrades cleanly instead
of IndexError.
F) DebridNaming rename under nzbdav. Three sites call <usenet_client>.rename_nzb;
the factory returns NzbdavClient (no rename_nzb) under provider=nzbdav -> the
hasattr guard skips it before the retry loop instead of AttributeError + idle
spinning. torrent_processor.py, pending_uncached_queue.py, run_program.py.
Audit + verified plan: cli_debrid_nzbdav_patch/v0744/NZBDAV_SETTINGS_AUDIT.md
…presence net, reverse-parser source scope, label clarity All strictly provider-agnostic; debrid/decypharr behaviour unchanged. G1 (StuckPlex source delete): run_program.py inlined Decypharr DELETE /api/torrents for nzb: items -> silent no-op under nzbdav -> orphaned job + Plex re-import (the repair-orphan purge only covers Failed items, not stuck-Completed ones). Route via get_usenet_client().remove_nzb (exists on both clients; decypharr issues the same delete). Provider-agnostic. §4 (library-maintenance presence net): run_plex_library_maintenance checked a Collected item's file only under Plex.mounted_file_location. An nzbdav-only box at the debrid default would find nzb: files missing -> wrongly re-grab / DB-remove / Plex-remove good items. Add a READ-ONLY fallback that also checks the Usenet Provider mount for nzb: items before declaring missing. It can only flip missing->present (behind 'if not exists'), so it can never cause a delete; debrid/ decypharr items skip the branch. H (reverse-parser source scope): _calculate_match_score / parse_filename_for_version now honor the per-term filter source (both|nzb|debrid) during version assignment, matching filter_results, via a new is_nzb param (default False / 'both' -> byte- identical for existing configs). Threaded is_nzb at the DB version-reparse sites via the nzb: prefix. + test. D (label clarity): document uncached_content_handling as DEBRID-only (no effect on usenet) and that 'Hybrid' is a virtual UI value backed by hybrid_mode; comment warns against naively 'fixing' the schema/UI mismatch. No logic change. G2 (backfill hygiene): task_backfill_nzb_torrent_ids now skips cleanly when the active usenet provider isn't decypharr (it's a Decypharr-only migration) — avoids failed /api/torrents requests + a misleading log. Tests: tests/test_reverse_parser_source_scope.py (5) + existing suites green. Audit + per-item decision maps: cli_debrid_nzbdav_patch/v0744/NZBDAV_SETTINGS_AUDIT.md
… count The NZB season-pack guard rejects a pack when result['nzb_files'] is less than the expected episode count — including the nzb_files == 0 case. But 0 means the INDEXER DIDN'T REPORT a count (the newznab 'files' attr is optional and Prowlarr never populates it), not that the pack has zero files. So this drops ~100% of NZB season packs on a Prowlarr-fed setup, including complete ones. Real-world: on a Prowlarr+NzbDAV instance this rejected ~141 packs across the logs, e.g. legitimate full-season releases like 'The.Audacity.S01...HEVC-Vyndros' (16 eps) and 'Your.Friends.&Neighbors.S02.2160p...Vyndros' (20 eps). Fix: when nzb_files == 0 (unknown), don't reject here — fall through to the SAME per-episode size heuristic torrent packs already use (total size / expected episodes vs the version's min_size_gb), with cli-debrid's per-file episode matching re-acquiring any genuinely-missing episodes via the normal Wanted→Scraping flow. Keep the hard reject for the case the file count IS reported and is short (nzb_files > 0 and < expected) — that signal is valid when present. Nothing NZB-specific is invented; count-less NZB packs are simply no longer treated differently from every other result. Both the size heuristic (filter_results.py: total_size_gb / num_episodes_in_pack from season_episode_counts/title, vs version min_size_gb) and the per-file reacquisition (checking_queue.py 'match each item to its episode file' + adding_queue.py 'related episodes matching parsed files') use protocol- independent signals already available for NZB — verified. Alternative if strict-by-default is preferred: gate this behind a new 'allow unverifiable NZB packs' setting (default off). Happy to switch to that.
nzbdav parity fixes (Batch 1): tag-exclusive routing, provider schema key, usenet-only guards, rename guard
nzbdav parity fixes (Batch 2): StuckPlex usenet routing, maintenance presence net, reverse-parser source scope, label clarity
…euristic scraper: don't drop NZB season packs when the indexer reports no file count (Prowlarr never sends one)
repair engine bug fix
- cli_mount rename: all Decypharr references replaced with cli_mount throughout; DecypharrClient renamed to CliMountClient; one-time settings migration from [Decypharr] config section to [cli_mount] on first load - Active files widget: real-time display of currently streaming files from cli_mount in debrid manager; shows source, duration, size, cli_debrid IDs; delete resets item to Wanted and removes from Plex via location_on_disk; season pack delete resets all siblings; rclone transfers hidden (already shown via DFS/NZB stream) - Scraper circuit breaker: per-instance timeout counter backs off scrapers after 3 timeouts in 120s for 600s; prevents a single slow indexer from blocking the full scrape batch and causing multi-minute queue hangs - Scraping queue stuck detector: heartbeat watchdog force-syncs in-memory Scraping queue from DB when stuck at ≥100 items for 10+ minutes; releases Wanted queue throttle without restart - cli_mount sync queue pause: queue pauses automatically during initial full sync on first setup and when manual full sync triggered; prevents DB lock contention; resumes automatically on completion - DB lock log level: RETRY_DEBUG CRITICAL entries downgraded to DEBUG; transient lock retries no longer appear as critical errors - Share logs in cli_mount: Share Logs button compresses and uploads climount.log to paste.c-net.org returning a shareable URL - cli_mount log rename: log files renamed from decypharr.log to climount.log - cli_debrid_ids active streams: cli_mount attaches cli_debrid_ids to active streams at TrackStream time; works for both NZB and debrid - Full sync cli_debrid_ids fix: sync queries siblings by filled_by_torrent_id using filled_by_file; resolves season packs registering only one episode ID - NZB starvation fix: failed NZB items rotated to end of adding queue so other items are not blocked - NZB missing-segment detection: exhausted NZB candidates with expired segments move to Sleeping instead of Blacklist - Debrid folder naming: async rename threads for cli_mount DFS folders with up to 100 retries; cli_debrid IDs registered for all siblings after rename - Orphan sync pass: second pass after cli_mount sync matches Collected items missing torrent_id by folder name; NAS-path items excluded - nzbdav maintenance safety net: before marking a collected NZB item as missing, also checks the usenet provider mount; prevents false re-grabs on nzbdav-only setups - nzbdav health scan scoping: when debrid file naming is enabled, health and repair scans restricted to NZB protocol entries only; prevents false positives from renamed debrid torrents - NzbDAV category taxonomy: single source-of-truth category hierarchy with optional per-user remapping via config; setup helper, submit router, and repair scope all derive from same definition - Filter source targeting: filter_in and filter_out terms now respect protocol scope (both/NZB/debrid); prevents cross-protocol term misapplication in reverse parser and version matching - NZB season pack rejection fix: packs with nzb_files=0 (indexer did not report count) no longer rejected; falls back to size heuristic matching torrent pack behaviour - Statistics dashboard: download stats refresh asynchronously in background; slow or unreachable debrid providers no longer block the dashboard for up to 90 seconds - Overlay regeneration: dropdown menu replaces single button offering granular regeneration choices (all, movies, shows) - Plex ms_item_id backfill task: new maintenance task triggers Plex section scans then populates missing ms_item_id rating keys in two phases - Bazarr spoofing fix: null checks added for debrid provider capability flags; usenet-only setups no longer crash when checking cache support - Deletion manager: NZB removal now uses location_basename as fallback match key instead of filled_by_file for more reliable matching on migrated items - Config backup on save: settings.py creates backup before every write and restores on failure - Unit tests: new test coverage for NzbDAV categories, removal logic, repair readability checks, stats resilience, and filter source scoping
0.7.45 - cli_mount rename: all Decypharr references replaced with cli_mount throughout; DecypharrClient renamed to CliMountClient; one-time settings migration from [Decypharr] config section to [cli_mount] on first load - Active files widget: real-time display of currently streaming files from cli_mount in debrid manager; shows source, duration, size, cli_debrid IDs; delete resets item to Wanted and removes from Plex via location_on_disk; season pack delete resets all siblings; rclone transfers hidden (already shown via DFS/NZB stream) - Scraper circuit breaker: per-instance timeout counter backs off scrapers after 3 timeouts in 120s for 600s; prevents a single slow indexer from blocking the full scrape batch and causing multi-minute queue hangs - Scraping queue stuck detector: heartbeat watchdog force-syncs in-memory Scraping queue from DB when stuck at ≥100 items for 10+ minutes; releases Wanted queue throttle without restart - cli_mount sync queue pause: queue pauses automatically during initial full sync on first setup and when manual full sync triggered; prevents DB lock contention; resumes automatically on completion - DB lock log level: RETRY_DEBUG CRITICAL entries downgraded to DEBUG; transient lock retries no longer appear as critical errors - Share logs in cli_mount: Share Logs button compresses and uploads climount.log to paste.c-net.org returning a shareable URL - cli_mount log rename: log files renamed from decypharr.log to climount.log - cli_debrid_ids active streams: cli_mount attaches cli_debrid_ids to active streams at TrackStream time; works for both NZB and debrid - Full sync cli_debrid_ids fix: sync queries siblings by filled_by_torrent_id using filled_by_file; resolves season packs registering only one episode ID - NZB starvation fix: failed NZB items rotated to end of adding queue so other items are not blocked - NZB missing-segment detection: exhausted NZB candidates with expired segments move to Sleeping instead of Blacklist - Debrid folder naming: async rename threads for cli_mount DFS folders with up to 100 retries; cli_debrid IDs registered for all siblings after rename - Orphan sync pass: second pass after cli_mount sync matches Collected items missing torrent_id by folder name; NAS-path items excluded - nzbdav maintenance safety net: before marking a collected NZB item as missing, also checks the usenet provider mount; prevents false re-grabs on nzbdav-only setups - nzbdav health scan scoping: when debrid file naming is enabled, health and repair scans restricted to NZB protocol entries only; prevents false positives from renamed debrid torrents - NzbDAV category taxonomy: single source-of-truth category hierarchy with optional per-user remapping via config; setup helper, submit router, and repair scope all derive from same definition - Filter source targeting: filter_in and filter_out terms now respect protocol scope (both/NZB/debrid); prevents cross-protocol term misapplication in reverse parser and version matching - NZB season pack rejection fix: packs with nzb_files=0 (indexer did not report count) no longer rejected; falls back to size heuristic matching torrent pack behaviour - Statistics dashboard: download stats refresh asynchronously in background; slow or unreachable debrid providers no longer block the dashboard for up to 90 seconds - Overlay regeneration: dropdown menu replaces single button offering granular regeneration choices (all, movies, shows) - Plex ms_item_id backfill task: new maintenance task triggers Plex section scans then populates missing ms_item_id rating keys in two phases - Bazarr spoofing fix: null checks added for debrid provider capability flags; usenet-only setups no longer crash when checking cache support - Deletion manager: NZB removal now uses location_basename as fallback match key instead of filled_by_file for more reliable matching on migrated items - Config backup on save: settings.py creates backup before every write and restores on failure - Unit tests: new test coverage for NzbDAV categories, removal logic, repair readability checks, stats resilience, and filter source scoping
bug fixes and improvements
…version requesting deleting 1 version
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fix: Updated torrent_processor and run_program to solve an issue related to multiple versions being requested and one of those versions being automatically deleted.