Commit Graph

99 Commits

Author SHA1 Message Date
Maximilian Dorninger
f5253990e0 switch from APScheduler to Taskiq (#461)
This PR replaces the APScheduler lib with the Taskiq task queuing lib. 

# why

APScheduler doesn't support FastAPI's DI in tasks, this makes them quite
cumbersome to read and write since DB, Repositories and Services all
need to be instanciated manually.

Moreover, Taskiq makes it easier to start background tasks from FastAPI
requests. This enables MM to move to a more event-based architecture.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* App now uses an orchestrated async startup/shutdown and runs
background scheduling via a database-backed task queue; startup enqueues
pre-load/import/update tasks.

* **Bug Fixes**
* Improved torrent client handling with clearer conflict messages and
guidance for manual resolution.
* Enhanced logging around season, episode and metadata update
operations; minor regex/behaviour formatting preserved.

* **Chores**
* Updated dependencies to support the new task queue and connection
pooling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-26 21:23:24 +01:00
Juan David Bermudez Celedon
cbd70bd6f3 Fix scoring rules keyword matching (#473)
Fixs for #460 

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **Improvements**
* Refined keyword matching in indexer queries with case-insensitive,
word-boundary-aware search for more accurate results.

* **Bug Fixes**
  * Corrected torrent URL redirect resolution logic.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-26 16:37:29 +01:00
GokuPlay609
c2645000e5 fix: improve quality detection regex to match 2160p, UHD, FullHD and other keywords (#450)
## What

Two-line fix to the quality detection regex in
`media_manager/indexer/schemas.py`.

**UHD pattern**: `\b(4k)\b` → `\b(4k|2160p|uhd)\b`  
**FullHD pattern**: `\b(1080p)\b` → `\b(1080p|fullhd|full\s*hd)\b`

## Why

The UHD regex only matched the literal keyword `4k`. Torrent titles
containing `2160p` or `UHD` (but not `4k`) were classified as
`Quality.unknown` (value 5) instead of `Quality.uhd` (value 1). Since
sorting uses quality as the primary key, these 4K releases ended up at
the bottom of search results.

### Example

| Title | Before | After |
|---|---|---|
| `Movie.2013.4K.HDR.2160p.x265` |  `Quality.uhd` |  `Quality.uhd` |
| `Movie.2013.UHD.BluRay.2160p.HDR10.x265` |  `Quality.unknown` | 
`Quality.uhd` |
| `Movie.2013.2160p.WEBRip.DDP5.1.x264` |  `Quality.unknown` | 
`Quality.uhd` |

All patterns already use `re.IGNORECASE`, so case variants are handled.

Fixes #449

---------

Co-authored-by: GokuPlay609 <GokuPlay609@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: maxid <97409287+maxdorninger@users.noreply.github.com>
2026-02-22 16:25:36 +01:00
natarelli22
d8a0ec66c3 Support for handling Single Episode Torrents (#331)
**Description**
As explained on #322, MediaManager currently only matches torrents that
represent full seasons or season packs.
As a result, valid episode-based releases — commonly returned by
indexers such as EZTV — are filtered out during scoring and never
considered for download.

Initial changes to the season parsing logic allow these torrents to be
discovered.
However, additional changes are required beyond season parsing to
properly support single-episode imports.

This PR is intended as a work-in-progress / RFC to discuss the required
changes and align on the correct approach before completing the
implementation.

**Things planned to do**
[X] Update Web UI to better display episode-level details
[ ] Update TV show import logic to handle single episode files, instead
of assuming full season files (to avoid integrity errors when episodes
are missing)
[ ] Create episode file tables to store episode-level data, similar to
season files
[ ] Implement fetching and downloading logic for single-episode torrents

**Notes / current limitations**
At the moment, the database and import logic assume one file per season
per quality, which works for season packs but not for episode-based
releases.

These changes are intentionally not completed yet and are part of the
discussion this PR aims to start.

**Request for feedback**
This represents a significant change in how TV content is handled in
MediaManager.
Before proceeding further, feedback from @maxdorninger on the overall
direction and next steps would be greatly appreciated.

Once aligned, the remaining tasks can be implemented incrementally.

---------

Co-authored-by: Maximilian Dorninger <97409287+maxdorninger@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-22 15:21:19 +01:00
maxid
d029177fc0 hot fix: fix search tag name for episode in jackett 2026-02-04 23:52:07 +01:00
maxid
12854ff661 format files 2026-02-04 21:34:37 +01:00
maxid
3d52a87302 add id search capabilities to jackett 2026-02-04 21:34:31 +01:00
Juan David Bermudez Celedon
a1f3f92c10 Enhance size validation for indexer results 2026-02-01 22:14:04 -05:00
Juan David Bermudez Celedon
caaa08fbf4 Fix typo in Jackett log for search_movie 2026-02-01 22:01:42 -05:00
Juan David Bermudez Celedon
5db60141bb Fix bug by typo in jackett log message (#387)
fix typo in the `search_season` function log, which causes an error when searching for torrents.
2026-02-01 18:09:18 +01:00
Marcel Hellwig
96b84d45db Adding some more new lints (#393)
Enable `UP` and `TRY` lint
2026-02-01 18:04:15 +01:00
Maximilian Dorninger
a39e0d204a Ruff enable type annotations rule (#362)
This PR enables the ruff rule for return type annotations (ANN), and
adds the ty package for type checking.
2026-01-06 17:07:19 +01:00
Renan Greca
dd0b439bbe Fix logging bug in jackett indexer (#360)
fix MM trying to access non-existent attribute
2026-01-06 14:49:06 +01:00
Marcel Hellwig
75406cbc64 ruff: add RET lint
lints about assign and immediatly returning a variable
2026-01-05 19:30:42 +01:00
Marcel Hellwig
7182344036 create list from range directly instead of using append 2026-01-05 19:30:42 +01:00
Marcel Hellwig
a34b0f11a6 use single s since we're ignoring cases anyway 2026-01-05 19:30:42 +01:00
Marcel Hellwig
40812c6040 omit return_type in computed field
it's calculated from the functions return type, so there's no need to
specifify it
2026-01-05 19:30:42 +01:00
Marcel Hellwig
5368cad77a ruff: add S linter
this mostly adds a timeout=60 to all requests

this does mainly wants a timeout to all requests functions, since when
left out they hang infinitly.
I added a timeout of 60s, which is probably way too high, but since
before this there was none, I guess it's an improvement?
2026-01-05 19:30:42 +01:00
Marcel Hellwig
1857cf501c ruff: enable RUF lint 2026-01-05 19:30:42 +01:00
Marcel Hellwig
ff013ac76e ruff: enable I lint 2026-01-05 19:30:42 +01:00
Marcel Hellwig
97cb3b5c1e ruff: enable EM lint 2026-01-05 19:30:42 +01:00
Marcel Hellwig
7ef4e52c81 ruff: enable C4 lint 2026-01-05 19:30:42 +01:00
Maximilian Dorninger
21495653d2 Include show year in season search query 2026-01-04 14:20:38 +01:00
maxid
40130c6a37 refactor: rename AllEncompassingConfig to MediaManagerConfig 2025-12-29 23:38:17 +01:00
maxid
1f53f51be7 remove reject_torrents_on_url_error and follow_redirects setting from configuration files 2025-12-29 00:04:48 +01:00
maxid
4f74a5bee6 improve logging of evaluation of IndexerQueryResults 2025-12-28 23:41:41 +01:00
maxid
733c7f78de refactor indexers: add TorznabMixin for improved search result processing and use Torznab Prowlarr endpoint 2025-12-28 23:24:53 +01:00
maxid
0da3e53bcb fix api client context manager 2025-12-28 14:01:54 +01:00
maxid
6993ec8752 fix: use name attribute instead of title 2025-12-28 13:42:21 +01:00
maxid
a29e53bbe5 enhance Prowlarr indexer: add query and type parameters for TV and movie searches 2025-12-28 11:12:26 +01:00
maxid
db54f3b2f2 indexer service: add movie and season search methods 2025-12-28 11:12:13 +01:00
maxid
0a3e7a973f increase max limit of search results 2025-12-27 22:24:46 +01:00
maxid
09cad60673 format files 2025-12-27 22:22:32 +01:00
maxid
b510b1a6e4 enhance Prowlarr indexer: use tmdb, imdb, tvdb id, and season number for searches 2025-12-27 22:22:19 +01:00
maxid
edb6aab77d add abstract search methods for movies and seasons to generic indexer class 2025-12-27 19:59:53 +01:00
maxid
1cfc90e4ac fix typo 2025-12-19 19:06:49 +01:00
maxid
2e95798e04 add configuration option to enable following redirects in prowlarr 2025-12-19 19:06:49 +01:00
maxid
dda9be13bb fix typos 2025-12-10 18:12:05 +01:00
maxid
fe3b77a889 add a config variable for jackett and prowlarr to change timeout time 2025-12-10 17:13:24 +01:00
maxid
643d2448b1 reduce logs 2025-12-08 00:30:59 +01:00
maxid
751c4558a2 refactor and improve prowlarr search result processing 2025-12-06 15:57:51 +01:00
maxid
d8948e4462 make jackett torrent search more error resistant 2025-12-06 15:48:50 +01:00
maxid
0554fee85f make prowlarr torrent search more error resistant 2025-12-06 15:48:50 +01:00
maxDorninger
8346ed9fa5 add config option to accept/reject torrents from prowlarr with a possibly broken url 2025-10-30 18:20:57 +01:00
maxDorninger
571dcd1cf8 rework follow_redirects_to_final_torrent_url(); prevent infinite, or at least very long, loops by setting a max redirect count of 10 2025-10-30 18:05:52 +01:00
maxDorninger
d460bc10c8 improve prowlarr logging 2025-10-30 18:04:47 +01:00
maxDorninger
68bb500fe7 increase max connections of requests.Session() from 10 to 100 2025-10-30 17:48:43 +01:00
maxDorninger
bbebbe92d9 format schemas.py 2025-10-30 16:20:20 +01:00
maxDorninger
790eca9858 speed up torrent searching by multithreading it and using the same requests session everywhere 2025-10-30 16:20:06 +01:00
Maximilian Dorninger
1a1d38aa29 Update media_manager/indexer/schemas.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-29 16:17:20 +01:00