I’m working on a Discord Music Bot and need help with searching YouTube videos based on user input. Right now, I can only play videos from a direct URL. Here’s what I’ve got so far:
async def get_video_info(query, loop=None):
loop = loop or asyncio.get_event_loop()
extractor = YTDLExtractor()
info = await loop.run_in_executor(None, lambda: extractor.fetch_info(query, download=False))
if 'playlist' in info:
video_data = info['playlist'][0]
else:
video_data = info
source = video_data['source'] if not download else extractor.get_filename(video_data)
return VideoPlayer(discord.FFmpegPCMAudio(source, **audio_settings), data=video_data)
How can I modify this to search YouTube using keywords instead of just playing from a URL? Any help would be appreciated!
I’ve been working with Discord bots for a while, and I can share what worked for me. Instead of youtube_dl, I found the youtube_search library to be more reliable and easier to use. Here’s a snippet that might help:
from youtube_search import YoutubeSearch
async def search_youtube(query):
results = YoutubeSearch(query, max_results=1).to_dict()
if results:
video_id = results[0]['id']
return f'https://www.youtube.com/watch?v={video_id}'
return None
# Then in your get_video_info function:
url = await search_youtube(query)
if url:
# Use your existing code with the found URL
return await get_video_info(url, loop)
else:
# Handle case when no video is found
This approach is more straightforward and doesn’t require as much error handling. Just make sure to install the youtube_search package with pip. Let me know if you need any clarification!
I’ve implemented a similar feature in my Discord bot using the ‘youtube-search-python’ library. It’s quite efficient and doesn’t require an API key. Here’s a snippet that might be useful:
from youtubesearchpython import VideosSearch
async def search_youtube(query):
search = VideosSearch(query, limit=1)
results = await search.next()
if results and results['result']:
return results['result'][0]['link']
return None
# Modify your get_video_info function:
url = await search_youtube(query)
if url:
return await get_video_info(url, loop)
else:
raise ValueError('No video found')
This approach is straightforward and handles search queries well. Remember to install the library with pip. Let me know if you need any further assistance!