diff --git a/app/downloaders/anime_sites/animesama.py b/app/downloaders/anime_sites/animesama.py index 585c7c3..94f1cc8 100644 --- a/app/downloaders/anime_sites/animesama.py +++ b/app/downloaders/anime_sites/animesama.py @@ -943,8 +943,13 @@ class AnimeSamaDownloader(BaseAnimeSite): 'url': season_url, 'episode_count': None # Will fetch later if needed } - except Exception: + except httpx.TimeoutException: + # Silent skip - season likely doesn't exist pass + except httpx.ConnectError as e: + print(f"[ANIME-SAMA] Connection error checking season {season_num}: {e}") + except Exception as e: + print(f"[ANIME-SAMA] Unexpected error checking season {season_num}: {e}") return None # Check seasons 1-10 in parallel @@ -970,8 +975,11 @@ class AnimeSamaDownloader(BaseAnimeSite): # Skip seasons with no episodes print(f"[ANIME-SAMA] Skipping Saison {season_info['season']} (no episodes)") return None - except Exception: - return None + except httpx.TimeoutException: + print(f"[ANIME-SAMA] Timeout fetching episodes for season {season_info['season']}") + except Exception as e: + print(f"[ANIME-SAMA] Error fetching episodes for season {season_info['season']}: {e}") + return None if seasons: episode_tasks = [fetch_episode_count(s) for s in seasons] @@ -999,19 +1007,20 @@ class AnimeSamaDownloader(BaseAnimeSite): # Get episode count for this season try: episodes = await self.get_episodes(season_url) - seasons.append({ - 'season': season_num, - 'title': f'Saison {season_num}', - 'url': season_url, - 'episode_count': len(episodes) if episodes else 0 - }) - except Exception: - seasons.append({ - 'season': season_num, - 'title': f'Saison {season_num}', - 'url': season_url, - 'episode_count': 0 - }) + episode_count = len(episodes) if episodes else 0 + if episode_count > 0: + seasons.append({ + 'season': season_num, + 'title': f'Saison {season_num}', + 'url': season_url, + 'episode_count': episode_count + }) + else: + print(f"[ANIME-SAMA] Skipping season {season_num} (no episodes)") + except httpx.TimeoutException: + print(f"[ANIME-SAMA] Timeout fetching episodes for season {season_num}") + except Exception as e: + print(f"[ANIME-SAMA] Error fetching episodes for season {season_num}: {e}") # Sort by season number seasons.sort(key=lambda x: x['season']) diff --git a/app/recommendations.py b/app/recommendations.py index c3cf006..3eadc94 100644 --- a/app/recommendations.py +++ b/app/recommendations.py @@ -46,6 +46,7 @@ class AnimeReleasesFetcher: continue else: logger.error("Jikan API rate limit exceeded after all retries") + raise Exception(f"Jikan API rate limit exceeded after {max_retries} retries") return response @@ -55,9 +56,10 @@ class AnimeReleasesFetcher: logger.warning(f"Request timeout, retrying in {delay}s... (attempt {attempt + 1}/{max_retries})") await asyncio.sleep(delay) else: - raise - - raise Exception("Max retries exceeded for Jikan API request") + raise Exception(f"Request timeout after {max_retries} retries") from e + except Exception as e: + # For any other exception, don't retry + raise async def _get_cached(self, key: str, fetcher): """Get cached result or fetch new data""" diff --git a/main.py b/main.py index f4222aa..a17131c 100644 --- a/main.py +++ b/main.py @@ -524,7 +524,7 @@ async def search_anime_unified(q: str, lang: str = "vostfr", include_metadata: b for provider_id in results: results[provider_id].sort(key=lambda x: ( -x.get('_relevance_boost', 0), # Exact matches first - x.get('title', '').lower().find(q.lower()) # Then by position of match + (x.get('title') or '').lower().find(q.lower()) # Then by position of match )) # Remove temporary boost field for item in results[provider_id]: diff --git a/static/js/anime.js b/static/js/anime.js index d69c620..9cdbee6 100644 --- a/static/js/anime.js +++ b/static/js/anime.js @@ -38,7 +38,9 @@ async function displaySearchResults(data, lang) { // Stagger requests: 500ms delay between each anime setTimeout(() => { // Try to load seasons first (for Anime-Sama) - loadSeasonsForAnime(providerId, encodeURIComponent(anime.url)); + if (anime.url) { + loadSeasonsForAnime(providerId, encodeURIComponent(anime.url)); + } }, 500 * index); delayCounter++; });