diff --git a/comet/api/endpoints/stream.py b/comet/api/endpoints/stream.py index e0688a4..49e3a40 100644 --- a/comet/api/endpoints/stream.py +++ b/comet/api/endpoints/stream.py @@ -193,8 +193,8 @@ async def stream( } # Check if metadata is already cached - cached_metadata = await metadata_scraper.get_cached( - id, season if "kitsu" not in media_id else 1, episode + cached_metadata = await metadata_scraper.get_from_cache_by_media_id( + media_id, id, season, episode ) # Quick check for "fresh" cached torrents to decide if we need to re-scrape. @@ -240,7 +240,7 @@ async def stream( cache_is_stale = fresh_cached_count == 0 # If both metadata and fresh torrents are cached, skip lock entirely - if cached_metadata is not None and fresh_cached_count > 0: + if cached_metadata is not None and not cache_is_stale: logger.log("SCRAPER", f"🚀 Fast path: using cached data for {media_id}") metadata, aliases = cached_metadata[0], cached_metadata[1] # Variables for fast path @@ -265,14 +265,14 @@ async def stream( waited_for_other_scrape = True # After waiting, re-check cached metadata - cached_metadata = await metadata_scraper.get_cached( - id, season if "kitsu" not in media_id else 1, episode + cached_metadata = await metadata_scraper.get_from_cache_by_media_id( + media_id, id, season, episode ) if lock_acquired: # We have the lock, scrape metadata normally metadata, aliases = await metadata_scraper.fetch_metadata_and_aliases( - media_type, media_id + media_type, media_id, id, season, episode ) elif cached_metadata is not None: # Use cached metadata after waiting @@ -280,7 +280,7 @@ async def stream( else: # No cached metadata available, fallback to scraping metadata, aliases = await metadata_scraper.fetch_metadata_and_aliases( - media_type, media_id + media_type, media_id, id, season, episode ) if metadata is None: if lock_acquired and scrape_lock: @@ -308,7 +308,6 @@ async def stream( logger.log("SCRAPER", f"🔍 Starting search for {log_title}") - id, season, episode = parse_media_id(media_type, media_id) media_only_id = id debrid_service = config["debridService"] diff --git a/comet/background_scraper/worker.py b/comet/background_scraper/worker.py index 26c6268..7210668 100644 --- a/comet/background_scraper/worker.py +++ b/comet/background_scraper/worker.py @@ -328,7 +328,7 @@ class BackgroundScraperWorker: async def _scrape_movie(self, media_id: str, title: str, year: int): metadata, aliases = await self.metadata_scraper.fetch_aliases_with_metadata( - "movie", media_id, title, year + "movie", media_id, title, year, id=media_id ) manager = TorrentManager( @@ -359,7 +359,7 @@ class BackgroundScraperWorker: series_media_id = f"{media_id}:1:1" metadata, aliases = await self.metadata_scraper.fetch_aliases_with_metadata( - "series", series_media_id, title, year, year_end + "series", series_media_id, title, year, year_end, id=media_id ) for episode in episodes: diff --git a/comet/metadata/manager.py b/comet/metadata/manager.py index 187b3d7..4d704d7 100644 --- a/comet/metadata/manager.py +++ b/comet/metadata/manager.py @@ -41,8 +41,25 @@ class MetadataScraper: else _CACHE_INSERT_POSTGRESQL ) - async def fetch_metadata_and_aliases(self, media_type: str, media_id: str): - id, season, episode = parse_media_id(media_type, media_id) + async def get_from_cache_by_media_id( + self, media_id: str, id: str, season: int | None, episode: int | None + ): + provider = self._extract_provider(media_id) + cache_id = f"{provider}:{id}" if provider else id + cache_season = 1 if provider == "kitsu" else season + + return await self.get_cached(cache_id, cache_season, episode) + + async def fetch_metadata_and_aliases( + self, + media_type: str, + media_id: str, + id: str | None = None, + season: int | None = None, + episode: int | None = None, + ): + if id is None: + id, season, episode = parse_media_id(media_type, media_id) provider = self._extract_provider(media_id) cache_id = f"{provider}:{id}" if provider else id @@ -144,12 +161,14 @@ class MetadataScraper: title: str, year: int, year_end: int = None, + id: str | None = None, ): """ Fetch only aliases for media when we already have the metadata from another source. This method will cache the provided metadata along with the scraped aliases. """ - id, _, _ = parse_media_id(media_type, media_id) + if id is None: + id, _, _ = parse_media_id(media_type, media_id) provider = self._extract_provider(media_id) cache_id = f"{provider}:{id}" if provider else id