From a769cf0ac5c20a2f4b4cb72bab3ed438480d9a98 Mon Sep 17 00:00:00 2001 From: salmonik Date: Sat, 16 May 2026 18:07:07 +0200 Subject: fix naming not resolving things like %20 Signed-off-by: salmonik --- TODO.md | 9 +++++++-- cogs/compression.py | 1 + cogs/conversion.py | 1 + cogs/music/play_commands.py | 24 ++++++++---------------- cogs/uploader.py | 1 + tests/cogs/test_music_external_play.py | 21 +++++++-------------- 6 files changed, 25 insertions(+), 32 deletions(-) diff --git a/TODO.md b/TODO.md index 36584a7..25f87e8 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,10 @@ +# NEAR FUTURE +## repetition count to @cogs/cron.py + after X repetitions of a cronjob, it will be deleted from db + defaults to 0, which is infinite + # WILL DO SOMEDAY ## userbot features - why not make the bot allow users to benefit from it outside of the server? + why not make the bot allow users to benefit from it outside of the server? - for example, let's allow the user to download, search the copyparty instance or compress in DMs/other servers + for example, let's allow the user to download, search the copyparty instance or compress in DMs/other servers diff --git a/cogs/compression.py b/cogs/compression.py index 7171abb..71348dc 100644 --- a/cogs/compression.py +++ b/cogs/compression.py @@ -62,6 +62,7 @@ class Compression(commands.Cog): return None filename = url.split('/')[-1].split('?')[0] + filename = urllib.parse.unquote(filename) file_path = os.path.join(self.temp_dir, filename) async with aiofiles.open(file_path, 'wb') as f: diff --git a/cogs/conversion.py b/cogs/conversion.py index 455bfde..f9e4c84 100644 --- a/cogs/conversion.py +++ b/cogs/conversion.py @@ -63,6 +63,7 @@ class Conversion(commands.Cog): return None filename = url.split('/')[-1].split('?')[0] + filename = urllib.parse.unquote(filename) file_path = os.path.join(self.temp_dir, filename) async with aiofiles.open(file_path, 'wb') as f: diff --git a/cogs/music/play_commands.py b/cogs/music/play_commands.py index bdb021d..80a30ef 100644 --- a/cogs/music/play_commands.py +++ b/cogs/music/play_commands.py @@ -10,6 +10,7 @@ import asyncio from os import PathLike from typing import Awaitable, Callable, List, Tuple import re +import requests from yt_dlp import YoutubeDL import discord @@ -228,8 +229,6 @@ class PlayCommands(commands.Cog): async def _upload_to_copyparty_async(self, file_path: str) -> None: """Upload file to copyparty asynchronously (fire and forget).""" - import aiohttp - try: logger.info(f"Starting async upload: {file_path}") baseurl = get_uploadurl() @@ -243,25 +242,18 @@ class PlayCommands(commands.Cog): with open(file_path, "rb") as f: content = f.read() - files = aiohttp.FormData() - files.add_field( - "f", - content, - filename=os.path.basename(file_path), - content_type="application/octet-stream", - ) + files = {"f": (os.path.basename(file_path), content, "application/octet-stream")} headers = {"Cookie": f"cppwd={password}"} params = {"j": "1", "ck": "b2"} logger.info(f"Posting to {baseurl}") - async with aiohttp.ClientSession() as session: - async with session.post(baseurl, data=files, headers=headers, params=params) as response: - text = await response.text() - logger.info(f"Upload response: {response.status} - {text[:200] if text else 'empty'}") + response = requests.post(baseurl, files=files, headers=headers, params=params) + text = response.text + logger.info(f"Upload response: {response.status_code} - {text[:200] if text else 'empty'}") - if response.status in [200, 201]: - result = await response.json() - logger.info(f"Uploaded to copyparty: {result.get('fileurl')}") + if response.status_code in [200, 201]: + result = response.json() + logger.info(f"Uploaded to copyparty: {result.get('fileurl')}") except Exception as e: logger.error(f"Async upload failed: {e}", exc_info=True) diff --git a/cogs/uploader.py b/cogs/uploader.py index df6908e..a5d0e05 100644 --- a/cogs/uploader.py +++ b/cogs/uploader.py @@ -48,6 +48,7 @@ class Uploader(commands.Cog): return None filename = url.split('/')[-1].split('?')[0] + filename = urllib.parse.unquote(filename) file_path = os.path.join(self.temp_dir, filename) async with aiofiles.open(file_path, 'wb') as f: diff --git a/tests/cogs/test_music_external_play.py b/tests/cogs/test_music_external_play.py index 2e9c5b1..8e19423 100644 --- a/tests/cogs/test_music_external_play.py +++ b/tests/cogs/test_music_external_play.py @@ -99,18 +99,11 @@ async def test_upload_to_copyparty_async(play_commands_cog, temp_mp3_file, monke monkeypatch.setenv("COPYPARTY_URL_UPLOAD", "https://catbox.2137697.xyz/sperma/") monkeypatch.setenv("COPYPARTY_PASSWORD", "testpassword") - mock_response = AsyncMock() - mock_response.status = 200 - mock_response.text = AsyncMock(return_value="") - mock_response.json = AsyncMock(return_value={"fileurl": "https://example.com/file.mp3"}) - mock_response.__aenter__ = AsyncMock(return_value=mock_response) - mock_response.__aexit__ = AsyncMock() - - mock_session_context = AsyncMock() - mock_session_context.__aenter__ = AsyncMock(return_value=mock_session_context) - mock_session_context.__aexit__ = AsyncMock() - mock_session_context.post = MagicMock(return_value=mock_response) - - with patch('aiohttp.ClientSession', return_value=mock_session_context): + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.text = '{"fileurl": "https://example.com/file.mp3"}' + mock_response.json = MagicMock(return_value={"fileurl": "https://example.com/file.mp3"}) + + with patch('cogs.music.play_commands.requests.post', return_value=mock_response) as mock_post: await play_commands_cog._upload_to_copyparty_async(temp_mp3_file) - mock_session_context.post.assert_called_once() + mock_post.assert_called_once() -- cgit v1.2.3