I am trying to build a Discord Music Bot and I need to search the YouTube using keywords given by the user. Currently I know how to play from a url.
loop = loop or asyncio.get_event_loop()
data = await loop.run_in_executor( None, lambda: ytdl.extract_info(url, download=not stream))
if "entries" in data:
data = data["entries"][0]
filename = data["url"] if stream else ytdl.prepare_filename(data)
return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)
YoutubeDL has an extract_info method that accepts URLs and search queries:
from yt_dlp import YoutubeDL
YDL_OPTIONS = {
'format': 'bestaudio',
'noplaylist':'True'
}
def yt_search(arg: str):
with YoutubeDL(YDL_OPTIONS) as ydl:
if arg.startswith("http"):
return ydl.extract_info(arg, download=False)
# Only returns the first result if arg is a search query
return ydl.extract_info(f"ytsearch:{arg}", download=False)['entries'][0]
You can keep a stripped down version of the returned data like so:
data = yt_search("30 sec video")
data = {
'channel': data['uploader'],
'channel_url': data['uploader_url'],
'title': data['title'],
'description': data['description'],
'video_url': data['webpage_url'],
'duration': data['duration'], # In seconds
'upload_date': data['upload_date'], # YYYYDDMM
'thumbnail': data['thumbnail'],
'audio_source': data['formats'][0]['url'],
'view_count': data['view_count'],
'like_count': data['like_count'],
}