From aba75b63c23fe863c52bb4e4f054a1820ec9777c Mon Sep 17 00:00:00 2001 From: salmonik Date: Mon, 20 Apr 2026 15:04:54 +0200 Subject: fix filename handling in downloader.py Signed-off-by: salmonik --- cogs/downloader.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/cogs/downloader.py b/cogs/downloader.py index 36bd723..d829ed7 100644 --- a/cogs/downloader.py +++ b/cogs/downloader.py @@ -71,7 +71,7 @@ class Downloader(commands.Cog): logger.info(f"Downloading {url} as {fformat}") with tempfile.TemporaryDirectory(delete=False) as temp_dir: - ydl_opts = Downloader._get_ydl_options(fformat, temp_dir) + ydl_opts = Downloader._get_ydl_options(filename_user, fformat, temp_dir) with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url]) @@ -87,15 +87,23 @@ class Downloader(commands.Cog): return Downloader._create_error_response("Download failed", str(e), None) @staticmethod - def _get_ydl_options(fformat: str, temp_dir: str) -> dict: + def _sanitize_filename(name: str) -> str: + invalid = '<>:"/\\|?*' + for c in invalid: + name = name.replace(c, '') + return name.strip() + + @staticmethod + def _get_ydl_options(filename: str = None, fformat: str = None, temp_dir: str = None) -> dict: + if filename: + filename = Downloader._sanitize_filename(filename)[:100] ydl_opts = { - 'outtmpl': os.path.join(temp_dir, '%(title)s.%(ext)s'), + 'outtmpl': os.path.join(temp_dir, filename if filename is not None else '%(title).100s.%(ext)s'), 'format': 'bestaudio/best' if fformat in ['mp3', 'wav', 'm4a'] else 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best', 'merge_output_format': 'mp4', 'postprocessors': [], 'remote-components': 'ejs:github', 'js-runtimes': {'deno': {'path': '/usr/bin/deno'}}, - 'o': '"%(title)s.%(ext)s"' } if fformat in ['mp3', 'wav', 'm4a']: @@ -120,10 +128,15 @@ class Downloader(commands.Cog): actual_file = os.path.join(temp_dir, files[0]) extension = actual_file.split('.')[-1] + extension = Downloader._sanitize_filename(extension) if not filename_user: filename = os.path.basename(actual_file) + filename = Downloader._sanitize_filename(filename) + if len(filename) > 100: + filename = filename[:100] else: + filename_user = Downloader._sanitize_filename(filename_user)[:100] filename = filename_user + '.' + extension actual_file = os.path.join(temp_dir, filename) -- cgit v1.2.3