import os import re from contextlib import suppress from urllib.parse import urlparse, parse_qs import discord from discord.ext import commands intents = discord.Intents.default() intents.members = True intents.message_content = True bot = commands.Bot(command_prefix='?', intents=intents) PIPED_URL = os.getenv('PIPED_URL') DISCORD_TOKEN = os.getenv('DISCORD_TOKEN') @bot.event async def on_ready(): print("Ready!") @bot.event async def on_message(message): regex = re.compile( r'https://(music\.)?(www\.)?youtu(be)?\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)') result = regex.search(message.content) if result is not None: youtube_url = result.group(0) video_id = await get_youtube_id(youtube_url) if video_id is not None: await message.reply(f"I think you meant {PIPED_URL}{video_id}.", mention_author=False) async def get_youtube_id(url: str, ignore_playlist=True) -> str: query = urlparse(url) if query.hostname == 'youtu.be': return query.path[1:] if query.hostname in {'www.youtube.com', 'youtube.com', 'music.youtube.com'}: if not ignore_playlist: # use case: get playlist id not current video in playlist with suppress(KeyError): return parse_qs(query.query)['list'][0] if query.path == '/watch': return parse_qs(query.query)['v'][0] if query.path[:7] == '/watch/': return query.path.split('/')[1] if query.path[:7] == '/embed/': return query.path.split('/')[2] if query.path[:3] == '/v/': return query.path.split('/')[2] if query.path[:8] == '/shorts/': return query.path.split('/')[1] bot.run(DISCORD_TOKEN)