matrix-music-bot

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 123ad0c4a4672fa340326e10dbb4d4bdd89abea3
parent 4c42df81816cb81ae2896a26ad5f26c9c85290e0
Author: John <mail@johnkubach.com>
Date:   Wed, 19 Oct 2022 21:38:14 -0400

Add Ability to Query For Song

Instead of copy & pasting a youtube url, a message can be prefixed with
!song to pull the first result off of youtube of a given query.

Diffstat:
Mfunctions/extract_info.py | 26+++++++++++++++++---------
Mmusic.py | 49++++++++++++++++++++++++++++++++++++-------------
2 files changed, 53 insertions(+), 22 deletions(-)

diff --git a/functions/extract_info.py b/functions/extract_info.py @@ -3,21 +3,29 @@ import pylast from youtube_title_parse import get_artist_title from functions.lastfm_init import lastfm_network -def get_video_info(url): - artist = None - Song = None +def get_video_info(url, isUrl=True): ytdl_opts = {'source_address': '0.0.0.0'} ydl = yt_dlp.YoutubeDL(ytdl_opts) with ydl: - video = ydl.extract_info(url, download=False) + if isUrl: + video = ydl.extract_info(url, download=False) + else: + video = ydl.extract_info(f"ytsearch:{url}", download=False)['entries'][0] + title = video['title'] description = video['description'] - if video['artist']: - artist = video['artist'] - if video['track']: - song = video['track'] + weburl = video['webpage_url'] + + try: + if video['artist']: + artist = video['artist'] + if video['track']: + song = video['track'] + except KeyError as e: + artist = None + song = None - return (title, description, artist, song) + return (title, description, weburl, artist, song) def get_artist_song(title): try: diff --git a/music.py b/music.py @@ -29,31 +29,49 @@ def parse_config(): return host, user, password, room_id -def youtube(event): +def process_url(event): message = event['content']['body'] message = message.split() url = message[0] - - title, desc, artist, song = get_video_info(url) + return url + + +def music_command(message): + if message.startswith('!song '): + query = message.replace("!song ","") + return query + + +def youtube(url, isUrl=True): + if isUrl: + title, desc, weburl, artist, song = get_video_info(url) + else: + title, desc, weburl, artist, song = get_video_info(url, False) + song_info = [title] + if artist is None: + artist, song = get_artist_song(title) - if artist and song: + if artist is not None: fulltitle = artist + " - " + song + song_info = [fulltitle] + + if not isUrl: + song_info.append("URL: " + weburl) + tags = get_tags(artist) bio = get_artist_info(artist) similar_artists = get_similar_artists(artist) - song_info = [fulltitle] - if tags and bio: - song_info.append("Genre: " + tags) - song_info.append("Similar Artists: " + similar_artists) - song_info.append(re.sub('<.*?>', '', bio)) - else: - artist, song = get_artist_song(title) - if artist == None: + elif artist is None: song_info.append(desc) + if tags and bio: + song_info.append("Genre: " + tags) + song_info.append("Similar Artists: " + similar_artists) + song_info.append(re.sub('<.*?>', '', bio)) + return song_info @@ -66,7 +84,12 @@ def on_message(room, event): if event['type'] == 'm.room.message': if event['content']['msgtype'] == "m.text": if event['content']['body'].startswith('https://youtu') or event['content']['body'].startswith('https://www.youtu'): - message = youtube(event) + url = process_url(event) + message = youtube(url) + send_message(room, message) + elif event['content']['body'].startswith('!'): + query = music_command(event['content']['body']) + message = youtube(query, False) send_message(room, message)