Compatibilité Sonarr : flux RSS Torznab, catégories qBittorrent, save_path, TLS auto-signé
- torznab : tvsearch sans q sert les nouveautés (RSS sync + test Sonarr) au lieu d'une erreur 400 — ajoute TorznabService.latest_releases() - qbit : POST /torrents/createCategory + GET /torrents/categories stateful (Sonarr crée sa catégorie tv-sonarr puis la revérifie) - qbit : /app/preferences expose save_path=/downloads (health Sonarr) - sonarr : verify=False sur httpx — reverse proxy swizzin en certificat auto-signé (usage LAN)
This commit is contained in:
@@ -169,6 +169,31 @@ class TorznabService:
|
||||
"""Recherche libre : tous les épisodes des fiches trouvées."""
|
||||
return await self.tvsearch(q)
|
||||
|
||||
async def latest_releases(self) -> list[Release]:
|
||||
"""Flux RSS (Sonarr) : dernier épisode de chaque nouveauté du catalogue."""
|
||||
releases: list[Release] = []
|
||||
for source in await self._enabled_sources():
|
||||
try:
|
||||
latest = await asyncio.wait_for(source.latest(), timeout=_SEARCH_TIMEOUT)
|
||||
except (ScrapeError, TimeoutError) as exc:
|
||||
logger.warning("Torznab : nouveautés %s KO : %s", source.name, exc)
|
||||
continue
|
||||
for result in latest[:_MAX_SERIES_PER_SOURCE]:
|
||||
try:
|
||||
episodes = await self._episodes_of(source, result.source_id)
|
||||
except (ScrapeError, TimeoutError):
|
||||
continue
|
||||
whole = [e for e in episodes if e.number == int(e.number)]
|
||||
if not whole:
|
||||
continue
|
||||
newest = max(whole, key=lambda e: (e.season, e.number))
|
||||
releases.extend(
|
||||
self._releases_for(result.title, source, result.source_id, [newest], None, None)
|
||||
)
|
||||
if len(releases) >= _MAX_RELEASES:
|
||||
return releases[:_MAX_RELEASES]
|
||||
return releases
|
||||
|
||||
async def _search_source(self, source: SourceScraper, q: str):
|
||||
try:
|
||||
return await asyncio.wait_for(source.search(q), timeout=_SEARCH_TIMEOUT)
|
||||
|
||||
Reference in New Issue
Block a user