mirror of
https://github.com/maxdorninger/MediaManager.git
synced 2026-04-18 07:33:24 +02:00
73 lines
2.9 KiB
Python
73 lines
2.9 KiB
Python
import logging
|
|
|
|
from media_manager.config import AllEncompassingConfig
|
|
from media_manager.indexer.indexers.generic import GenericIndexer
|
|
from media_manager.indexer.indexers.jackett import Jackett
|
|
from media_manager.indexer.indexers.prowlarr import Prowlarr
|
|
from media_manager.indexer.schemas import IndexerQueryResultId, IndexerQueryResult
|
|
from media_manager.indexer.repository import IndexerRepository
|
|
from media_manager.notification.manager import notification_manager
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class IndexerService:
|
|
def __init__(self, indexer_repository: IndexerRepository):
|
|
config = AllEncompassingConfig()
|
|
self.repository = indexer_repository
|
|
self.indexers: list[GenericIndexer] = []
|
|
|
|
if config.indexers.prowlarr.enabled:
|
|
self.indexers.append(Prowlarr())
|
|
if config.indexers.jackett.enabled:
|
|
self.indexers.append(Jackett())
|
|
|
|
def get_result(self, result_id: IndexerQueryResultId) -> IndexerQueryResult:
|
|
return self.repository.get_result(result_id=result_id)
|
|
|
|
def search(self, query: str, is_tv: bool) -> list[IndexerQueryResult]:
|
|
"""
|
|
Search for results using the indexers based on a query.
|
|
|
|
:param is_tv: Whether the search is for TV shows or movies.
|
|
:param query: The search query.
|
|
:param db: The database session.
|
|
:return: A list of search results.
|
|
"""
|
|
log.debug(f"Searching for: {query}")
|
|
results = []
|
|
failed_indexers = []
|
|
|
|
for indexer in self.indexers:
|
|
try:
|
|
indexer_results = indexer.search(query, is_tv=is_tv)
|
|
results.extend(indexer_results)
|
|
log.debug(
|
|
f"Indexer {indexer.__class__.__name__} returned {len(indexer_results)} results for query: {query}"
|
|
)
|
|
except Exception as e:
|
|
failed_indexers.append(indexer.__class__.__name__)
|
|
log.error(
|
|
f"Indexer {indexer.__class__.__name__} failed for query '{query}': {e}"
|
|
)
|
|
|
|
# Send notification if indexers failed
|
|
if failed_indexers and notification_manager.is_configured():
|
|
notification_manager.send_notification(
|
|
title="Indexer Failure",
|
|
message=f"The following indexers failed for query '{query}': {', '.join(failed_indexers)}. Check indexer configuration and connectivity.",
|
|
)
|
|
|
|
# Send notification if no results found from any indexer
|
|
if not results and notification_manager.is_configured():
|
|
notification_manager.send_notification(
|
|
title="No Search Results",
|
|
message=f"No torrents found for query '{query}' from any configured indexer. Consider checking the search terms or indexer availability.",
|
|
)
|
|
|
|
for result in results:
|
|
self.repository.save_result(result=result)
|
|
|
|
log.debug(f"Found torrents: {results}")
|
|
return results
|