]> git.0d.be Git - botaradio.git/commitdiff
feat: beautified current song string, fix ytplay index problem
authorTerry Geng <gengyanda@gmail.com>
Mon, 2 Mar 2020 11:19:13 +0000 (19:19 +0800)
committerTerry Geng <gengyanda@gmail.com>
Mon, 2 Mar 2020 11:19:13 +0000 (19:19 +0800)
command.py
configuration.default.ini
interface.py
media/url.py
mumbleBot.py
util.py

index c9b2473b6707201f1fa6fe17298b16adbf36c55a..a807df71a368ad54fd3415b67a6fc88e8cd12c3d 100644 (file)
@@ -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:
index bc4859d978aabdbd86419798c8dac88973734f18..8e4d1d46448576a8189281d1660a216d9b352786 100644 (file)
@@ -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 <i>{index}</i>. Use '!queue' to see your playlist.
-now_playing = Now playing {item}<br />{thumb}
+now_playing_radio = Now Playing Radio: <br /> <a href="{url}">{title}</a> <i>from</i> {name} <i>added by</i> {user}
+now_playing_file = Now Playing File:<br /> {artist} - {title} <i>added by</i> {user}
+now_playing_from_playlist = Now Playing URL:<br /> {title} <i>from playlist</i> <a href="{url}">{playlist}</a> <i>added by</i> {user}
+now_playing_url = Now Playing URL: <br /> <a href="{url}">{title}</a> <i>added by</i> {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!
index 2bfbc2c45fd7e0faaee91164200646c04edd5732..da868e7456d246824cc57c2acecd3dee796b0add 100644 (file)
@@ -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:
index a3512e97950ad00a35ba640470d605bea1d4173d..830a313f4082c3776646411b118446eb223626bd 100644 (file)
@@ -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']
index 7d96ca83ec9131e436a7d35074ba1c8042136b54..4ca7a3dcb51c68d599d26e5c4563ac1da1638fa2 100644 (file)
@@ -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="<br>".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 7fe18b1ed3a7e96abd4b526e21c18ed859c863f0..0cde66b8f45a649e61e4ed4c4993d69d57baf87e 100644 (file)
--- 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 <a href=\"{url}\">{playlist}</a>) 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] <a href=\"{url}\">{title}</a> 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 = '<img width="80" src="data:image/jpge;base64,' + \
                          music['thumbnail'] + '"/>'
-
-    display = (constants.strings('now_playing', item=display, thumb=thumbnail_html))
+        return display + "<br />" + 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