youtube-alert-and-download/main.py

64 lines
2.0 KiB
Python
Raw Normal View History

2024-02-04 23:58:57 -05:00
import discord
from discord.ext import commands, tasks
import feedparser
import yt_dlp as youtube_dl
from config import DISCORD_BOT_TOKEN, DISCORD_CHANNEL_ID, YOUTUBE_CHANNEL_IDS
import os
2024-02-05 00:27:33 -05:00
import logging
logging.basicConfig(level=logging.INFO)
2024-02-04 23:58:57 -05:00
intents = discord.Intents.default()
intents.messages = True
intents.guilds = True
bot = commands.Bot(command_prefix='!', intents=intents)
download_dir = 'downloads'
os.makedirs(download_dir, exist_ok=True)
ydl_opts = {
2024-02-05 00:14:13 -05:00
'format': 'best',
2024-02-04 23:58:57 -05:00
'outtmpl': f'{download_dir}/%(title)s [%(id)s].%(ext)s',
}
downloaded_videos_file = 'downloaded_videos.txt'
2024-02-05 00:27:33 -05:00
2024-02-04 23:58:57 -05:00
def get_downloaded_videos():
if not os.path.exists(downloaded_videos_file):
return set()
with open(downloaded_videos_file, 'r') as file:
return set(file.read().splitlines())
def add_downloaded_video(video_id):
with open(downloaded_videos_file, 'a') as file:
file.write(video_id + '\n')
def get_latest_video_url(channel_id):
rss_url = f"https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"
feed = feedparser.parse(rss_url)
latest_entry = feed.entries[0] if feed.entries else None
return latest_entry.link, latest_entry.yt_videoid if latest_entry else (None, None)
@tasks.loop(minutes=10)
async def check_new_videos():
2024-02-05 00:27:33 -05:00
logging.info("Checking new videos...")
2024-02-04 23:58:57 -05:00
downloaded_videos = get_downloaded_videos()
for channel_id in YOUTUBE_CHANNEL_IDS:
2024-02-05 00:27:33 -05:00
logging.info(f"Checking channel: {channel_id}")
2024-02-04 23:58:57 -05:00
video_url, video_id = get_latest_video_url(channel_id)
if video_url and video_id not in downloaded_videos:
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([video_url])
add_downloaded_video(video_id)
channel = bot.get_channel(int(DISCORD_CHANNEL_ID))
2024-02-05 00:08:29 -05:00
await channel.send(f"@everyone New tard video dropped and has been archived: {video_url}")
2024-02-04 23:58:57 -05:00
@bot.event
async def on_ready():
print(f'{bot.user.name} has connected to Discord!')
check_new_videos.start()
bot.run(DISCORD_BOT_TOKEN)