python-3.xyoutubediscord.py

Searching Youtube videos using youtube-dl


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)

Solution

  • 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'],
    }