From dbe317bf31607f1b60851a903d95bf4ea3e19c92 Mon Sep 17 00:00:00 2001 From: Terry Geng Date: Mon, 2 Mar 2020 19:19:13 +0800 Subject: [PATCH] feat: beautified current song string, fix ytplay index problem --- command.py | 8 +++++-- configuration.default.ini | 5 +++- interface.py | 6 ++++- media/url.py | 1 - mumbleBot.py | 9 +++---- util.py | 50 +++++++++++++++++++-------------------- 6 files changed, 44 insertions(+), 35 deletions(-) diff --git a/command.py b/command.py index c9b2473..a807df7 100644 --- a/command.py +++ b/command.py @@ -330,6 +330,10 @@ def cmd_play_radio(bot, user, text, command, parameter): music = {'type': 'radio', 'url': url, 'user': user} + + log.info("bot: fetching radio server description") + music["name"] = media.radio.get_radio_server_description(url) + var.playlist.append(music) log.info("cmd: add to playlist: " + util.format_debug_song_string(music)) bot.async_download_next() @@ -429,7 +433,7 @@ def cmd_rb_play(bot, user, text, command, parameter): if url != "-1": log.info('cmd: Found url: ' + url) music = {'type': 'radio', - 'title': stationname, + 'name': stationname, 'artist': homepage, 'url': url, 'user': user} @@ -484,7 +488,7 @@ def _yt_format_result(results, start, count): def cmd_yt_play(bot, user, text, command, parameter): global log, yt_last_result - if parameter and parameter.isdigit() and 0 < int(parameter) - 1 < len(yt_last_result): + if parameter and parameter.isdigit() and 0 <= int(parameter) - 1 < len(yt_last_result): url = "https://www.youtube.com/watch?v=" + yt_last_result[int(parameter) - 1][0] cmd_play_url(bot, user, text, command, url) else: diff --git a/configuration.default.ini b/configuration.default.ini index bc4859d..8e4d1d4 100644 --- a/configuration.default.ini +++ b/configuration.default.ini @@ -181,7 +181,10 @@ multiple_matches = Track not found! Possible candidates: queue_contents = Items on the playlist: queue_empty = Playlist is empty! invalid_index = Invalid index {index}. Use '!queue' to see your playlist. -now_playing = Now playing {item}
{thumb} +now_playing_radio = Now Playing Radio:
{title} from {name} added by {user} +now_playing_file = Now Playing File:
{artist} - {title} added by {user} +now_playing_from_playlist = Now Playing URL:
{title} from playlist {playlist} added by {user} +now_playing_url = Now Playing URL:
{title} added by {user} not_in_my_channel = You're not in my channel, command refused! pm_not_allowed = Private message aren't allowed. too_long = This music is too long, skip! diff --git a/interface.py b/interface.py index 2bfbc2c..da868e7 100644 --- a/interface.py +++ b/interface.py @@ -12,6 +12,7 @@ import random from werkzeug.utils import secure_filename import errno import media +import media.radio import logging import time import constants @@ -226,9 +227,12 @@ def post(): var.botamusique.async_download_next() elif 'add_radio' in request.form: + url = request.form['add_radio'] music = var.playlist.append({'type': 'radio', - 'path': request.form['add_radio'], + 'url': url, 'user': "Remote Control"}) + log.info("web: fetching radio server description") + music["name"] = media.radio.get_radio_server_description(url) log.info("web: add to playlist: " + util.format_debug_song_string(music)) elif 'delete_music' in request.form: diff --git a/media/url.py b/media/url.py index a3512e9..830a313 100644 --- a/media/url.py +++ b/media/url.py @@ -10,7 +10,6 @@ def get_url_info(music): with youtube_dl.YoutubeDL(ydl_opts) as ydl: for i in range(2): try: - print(var.playlist) info = ydl.extract_info(music['url'], download=False) music['duration'] = info['duration'] / 60 music['title'] = info['title'] diff --git a/mumbleBot.py b/mumbleBot.py index 7d96ca8..4ca7a3d 100644 --- a/mumbleBot.py +++ b/mumbleBot.py @@ -285,7 +285,7 @@ class MumbleBot: if len(matches) == 1: self.log.info("bot: {:s} matches {:s}".format(command, matches[0])) command_exc = matches[0] - self.cmd_handle[matches[0]](self, user, text, command, parameter) + self.cmd_handle[command_exc](self, user, text, command_exc, parameter) elif len(matches) > 1: self.mumble.users[text.actor].send_text_message( constants.strings('which_command', commands="
".join(matches))) @@ -354,10 +354,10 @@ class MumbleBot: elif music["type"] == "radio": uri = music["url"] - if 'title' not in music: + if 'name' not in music: self.log.info("bot: fetching radio server description") title = media.radio.get_radio_server_description(uri) - music["title"] = title + music["name"] = title if var.config.getboolean('bot', 'announce_current_music'): self.send_msg(util.format_current_playing()) @@ -469,7 +469,8 @@ class MumbleBot: break except: error_traceback = traceback.format_exc().split("During")[0] - self.log.error("bot: download failed with error:\n %s" % error_traceback) + error = error_traceback.rstrip().split("\n")[-1] + self.log.error("bot: download failed with error:\n %s" % error) if not download_succeed: for f in [mp3, path.replace(".%(ext)s", ".jpg"), path.replace(".%(ext)s", ".m4a")]: diff --git a/util.py b/util.py index 7fe18b1..0cde66b 100644 --- a/util.py +++ b/util.py @@ -8,7 +8,7 @@ import sys import variables as var import constants import zipfile -import urllib.request +import requests import mutagen import re import subprocess as sp @@ -149,29 +149,30 @@ def format_song_string(music): artist = music["artist"] if "artist" in music else "Unknown artist" if source == "radio": - display = "[radio] {title} from {url} by {user}".format( - title=media.radio.get_radio_title(music["url"]), + display = constants.strings("now_playing_radio", url=music["url"], + title=media.radio.get_radio_title(music["url"]), + name=music["name"], user=music["user"] ) elif source == "url" and 'from_playlist' in music: - display = "[url] {title} (from playlist {playlist}) by {user}".format( - title=title, - url=music["playlist_url"], - playlist=music["playlist_title"], - user=music["user"] + display = constants.strings("now_playing_from_playlist", + title=title, + url=music["playlist_url"], + playlist=music["playlist_title"], + user=music["user"] ) elif source == "url": - display = "[url] {title} by {user}".format( - title=title, - url=music["url"], - user=music["user"] + display = constants.strings("now_playing_url", + title=title, + url=music["url"], + user=music["user"] ) elif source == "file": - display = "[file] {artist} - {title} by {user}".format( - title=title, - artist=artist, - user=music["user"] + display = constants.strings("now_playing_file", + title=title, + artist=artist, + user=music["user"] ) return display @@ -184,7 +185,8 @@ def format_debug_song_string(music): artist = music["artist"] if "artist" in music else "??" if source == "radio": - display = "[radio] {url} by {user}".format( + display = "[radio] {name} ({url}) by {user}".format( + name=music["name"], url=music["url"], user=music["user"] ) @@ -216,12 +218,10 @@ def format_current_playing(): music = var.playlist.current_item() display = format_song_string(music) - thumbnail_html = '' if 'thumbnail' in music: thumbnail_html = '' - - display = (constants.strings('now_playing', item=display, thumb=thumbnail_html)) + return display + "
" + thumbnail_html return display @@ -473,17 +473,15 @@ def get_url_from_input(string): def youtube_search(query): global log - query_url = "https://www.youtube.com/results?search_query=" + urllib.parse.quote(query, safe="") - try: - request = urllib.request.Request(query_url) - response = urllib.request.urlopen(request).read().decode("utf-8") + r = requests.get("https://www.youtube.com/results", params={'search_query': query}, timeout=5) results = re.findall("watch\?v=(.*?)\".*?title=\"(.*?)\".*?" - "(?:user|channel).*?>(.*?)<", response) # (id, title, uploader) + "(?:user|channel).*?>(.*?)<", r.text) # (id, title, uploader) if len(results) > 0: return results - except: + + except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError, requests.exceptions.Timeout) as e: error_traceback = traceback.format_exc().split("During")[0] log.error("util: youtube query failed with error:\n %s" % error_traceback) return False