From 6a73278c13ad547aa6558427def0ae6520df5518 Mon Sep 17 00:00:00 2001 From: SamlonDev Date: Thu, 22 May 2025 11:42:10 +0200 Subject: easy video downloading --- cogs/downloader.py | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 1 + 2 files changed, 91 insertions(+) create mode 100644 cogs/downloader.py diff --git a/cogs/downloader.py b/cogs/downloader.py new file mode 100644 index 0000000..b992e82 --- /dev/null +++ b/cogs/downloader.py @@ -0,0 +1,90 @@ +import base64 +import os +import discord +from discord.ext import commands +import requests +import yt_dlp +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() +PIXELDRAIN_API_KEY = os.getenv('PIXELDRAIN_API_KEY') + +class Downloader(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.pixeldrain_url = "https://pixeldrain.com/api/file" + + def _get_auth_headers(self): + """Generate authentication headers for Pixeldrain API""" + if not PIXELDRAIN_API_KEY: + raise Exception("Pixeldrain API key not found in environment variables") + + auth_string = f":{PIXELDRAIN_API_KEY}" + auth_bytes = auth_string.encode('ascii') + base64_auth = base64.b64encode(auth_bytes).decode('ascii') + return {"Authorization": f"Basic {base64_auth}"} + + @commands.slash_command( + name="download", + description="download video from internet", + ) + async def download( + self, + ctx: discord.ApplicationContext, + url: discord.Option(str, "url", required=True) + ): + await ctx.defer() + try: + # pass link to yt-dlp + outtmpl = '%(title)s.%(ext)s' + ydl_opts = { + 'outtmpl': outtmpl, + 'merge_output_format': 'mp4', + } + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + info = ydl.extract_info(url, download=True) + actual_filename = ydl.prepare_filename(info) + + await ctx.followup.send("Video downloaded successfully, Uploading to pixeldrain...") + # upload to pixeldrain + try: + with open(actual_filename, 'rb') as f: + files = {'file': f} + response = requests.post( + self.pixeldrain_url, + files=files, + headers={"Authorization": f"Basic {base64.b64encode((':' + PIXELDRAIN_API_KEY).encode()).decode()}"} + ) + + try: + response_data = response.json() + print("Pixeldrain response:", response_data) # Debug log + + if response.status_code == 201: # 201 means successful upload + file_id = response_data.get('id') + if file_id: + file_link = f"https://pixeldrain.com/u/{file_id}" + await ctx.followup.send(f"oto twoje videło\n {file_link}") + else: + await ctx.followup.send(f"⚠️ Upload successful but no file ID returned. Response: {response_data}") + else: + error_msg = response_data.get('error', 'Unknown error') + if response.status_code == 401: + error_msg = "Invalid API key. Please check your PIXELDRAIN_API_KEY in .env file." + await ctx.followup.send(f"❌ Upload failed (Status {response.status_code}): {error_msg}") + except ValueError as e: + # If response is not JSON + error_msg = f"Failed to parse server response: {str(e)}" + if response.text: + error_msg += f"\nResponse: {response.text[:200]}" + await ctx.followup.send(f"❌ {error_msg}") + finally: + # Clean up the downloaded file + if os.path.exists(actual_filename): + os.remove(actual_filename) + except Exception as e: + await ctx.followup.send(f"Error: {str(e)}") + +def setup(bot): + bot.add_cog(Downloader(bot)) \ No newline at end of file diff --git a/main.py b/main.py index 7722ce4..9a9acd9 100644 --- a/main.py +++ b/main.py @@ -21,6 +21,7 @@ if __name__ == "__main__": 'cogs.tts', 'cogs.web', 'cogs.ai', + 'cogs.downloader', 'cogs.music.play', 'cogs.music.play_compressed', 'cogs.music.skip', -- cgit v1.2.3