stream-discord-bot/bot.py

90 lines
3.5 KiB
Python
Raw Permalink Normal View History

2024-05-25 16:01:04 +00:00
#!/usr/bin/env python3
2024-05-25 14:58:06 +00:00
import os
from urllib.parse import urlparse, parse_qs
2024-05-25 17:09:44 +00:00
import aiohttp
2024-05-25 14:58:06 +00:00
import discord
2024-05-25 17:09:44 +00:00
2024-05-25 14:58:06 +00:00
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
DISCORD_CHANNEL = int(os.getenv("DISCORD_CHANNEL"))
DISCORD_GUILD = int(os.getenv("DISCORD_GUILD"))
class CustomClient(discord.Client):
async def on_ready(self):
print(f"{self.user} has connected to Discord!")
async def on_message(self, message: discord.message.Message):
if (
message.channel.id == DISCORD_CHANNEL
and message.guild.id == DISCORD_GUILD
and message.author.id != self.user.id
):
url = urlparse(message.content)
if "youtu" in url.hostname:
if (
url.path.strip("/").startswith("shorts")
and len(splitted := url.path.split("/")) >= 2
):
video_id = splitted[len(splitted) - 1]
await message.reply(
content=f"https://stream.purser.it/{video_id}?provider=youtube&direct=true"
)
elif video := parse_qs(url.query).get("v"):
if isinstance(video, str):
await message.reply(
content=f"https://stream.purser.it/{video}?provider=youtube&direct=true"
)
elif isinstance(video, list):
await message.reply(
content=f"https://stream.purser.it/{video[0]}?provider=youtube&direct=true"
)
else:
video_id = url.path.strip("/")
await message.reply(
content=f"https://stream.purser.it/{video_id}?provider=youtube&direct=true"
)
2024-05-25 17:09:44 +00:00
elif "seafile" in url.hostname:
stripped = url.path.strip("/")
async with aiohttp.ClientSession(
timeout=aiohttp.ClientTimeout(total=5)
) as session:
resp = await session.head(
2024-05-25 17:57:26 +00:00
f"https://stream.purser.it/{stripped}/?provider=seafile&raw=true",
2024-05-25 17:36:05 +00:00
allow_redirects=True,
2024-05-25 17:09:44 +00:00
)
2024-05-25 18:08:06 +00:00
if (ctype := resp.headers.get("content-type")) and "image" in ctype:
await message.reply(
content=f"<https://stream.purser.it/{stripped}/?provider=seafile&raw=true>"
)
else:
await message.reply(
content=f"https://stream.purser.it/{stripped}/?provider=seafile&raw=false"
)
2024-05-25 17:09:44 +00:00
elif "twitch" in url.hostname:
stripped = url.path.strip("/")
await message.reply(
content=f"https://stream.purser.it/{stripped}?provider=twitch"
)
elif "twitter" in url.hostname:
stripped = url.path.strip("/")
await message.reply(
content=f"https://stream.purser.it/{stripped}?provider=twitter"
)
elif "x.com" in url.hostname:
stripped = url.path.strip("/")
await message.reply(
content=f"https://stream.purser.it/{stripped}?provider=twitter"
)
2024-05-25 14:58:06 +00:00
intents = discord.Intents.default()
intents.message_content = True
CustomClient(intents=intents).run(DISCORD_TOKEN)