diff --git a/src/core/providers/aniworld_provider.py b/src/core/providers/aniworld_provider.py index ad275ae..7356d78 100644 --- a/src/core/providers/aniworld_provider.py +++ b/src/core/providers/aniworld_provider.py @@ -550,8 +550,10 @@ class AniworldLoader(Loader): 'nocheckcertificate': True, 'logger': logger, 'progress_hooks': [events_progress_hook], - 'downloader': 'ffmpeg', - 'hls_use_mpegts': True, + # yt-dlp defaults to native HLS downloader which warns about + # "Live HLS streams are not supported" - disable to go + # straight to ffmpeg, avoiding the warning + 'hls_prefer_native': False, } if header: @@ -597,6 +599,40 @@ class AniworldLoader(Loader): _cleanup_temp_file(temp_path) continue except Exception as exc: + # Check if this is an HLS-related failure that might succeed + # with additional ffmpeg options + exc_str = str(exc).lower() + is_hls_related = ( + 'hls' in exc_str or + 'live' in exc_str or + 'native downloader' in exc_str + ) + if is_hls_related and 'ffmpeg' not in str(ydl_opts.get('downloader', '')): + logger.info( + "HLS stream detected, retrying with ffmpeg options: %s", + output_file + ) + # Retry with ffmpeg explicitly set + retry_opts = ydl_opts.copy() + retry_opts['downloader'] = 'ffmpeg' + retry_opts['hls_use_mpegts'] = True + try: + with YoutubeDL(retry_opts) as ydl: + info = ydl.extract_info(link, download=True) + if os.path.exists(temp_path): + shutil.copyfile(temp_path, output_path) + os.remove(temp_path) + logger.info( + "Download completed successfully (retry): %s", + output_file + ) + self.clear_cache() + return True + except Exception: + _cleanup_temp_file(temp_path) + # Continue to next provider if retry also fails + continue + logger.error( "YoutubeDL download failed with provider %s: %s: %s", provider_name, type(exc).__name__, exc