PEP8
This commit is contained in:
+24
-5
@@ -19,6 +19,7 @@ from media.radio import RadioItem
|
|||||||
|
|
||||||
log = logging.getLogger("bot")
|
log = logging.getLogger("bot")
|
||||||
|
|
||||||
|
|
||||||
def register_all_commands(bot):
|
def register_all_commands(bot):
|
||||||
bot.register_command(constants.commands('joinme'), cmd_joinme, no_partial_match=False, access_outside_channel=True)
|
bot.register_command(constants.commands('joinme'), cmd_joinme, no_partial_match=False, access_outside_channel=True)
|
||||||
bot.register_command(constants.commands('user_ban'), cmd_user_ban, no_partial_match=True)
|
bot.register_command(constants.commands('user_ban'), cmd_user_ban, no_partial_match=True)
|
||||||
@@ -71,6 +72,7 @@ def register_all_commands(bot):
|
|||||||
bot.register_command('loop', cmd_loop_state, True)
|
bot.register_command('loop', cmd_loop_state, True)
|
||||||
bot.register_command('item', cmd_item, True)
|
bot.register_command('item', cmd_item, True)
|
||||||
|
|
||||||
|
|
||||||
def send_multi_lines(bot, lines, text, linebreak="<br />"):
|
def send_multi_lines(bot, lines, text, linebreak="<br />"):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
@@ -86,12 +88,13 @@ def send_multi_lines(bot, lines, text, linebreak="<br />"):
|
|||||||
|
|
||||||
bot.send_msg(msg, text)
|
bot.send_msg(msg, text)
|
||||||
|
|
||||||
|
|
||||||
# ---------------- Variables -----------------
|
# ---------------- Variables -----------------
|
||||||
|
|
||||||
song_shortlist = []
|
song_shortlist = []
|
||||||
|
|
||||||
# ---------------- Commands ------------------
|
|
||||||
|
|
||||||
|
# ---------------- Commands ------------------
|
||||||
|
|
||||||
def cmd_joinme(bot, user, text, command, parameter):
|
def cmd_joinme(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
@@ -146,6 +149,7 @@ def cmd_url_ban(bot, user, text, command, parameter):
|
|||||||
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def cmd_url_ban_list(bot, user, text, command, parameter):
|
def cmd_url_ban_list(bot, user, text, command, parameter):
|
||||||
if bot.is_admin(user):
|
if bot.is_admin(user):
|
||||||
bot.mumble.users[text.actor].send_text_message(util.get_url_ban())
|
bot.mumble.users[text.actor].send_text_message(util.get_url_ban())
|
||||||
@@ -153,6 +157,7 @@ def cmd_url_ban_list(bot, user, text, command, parameter):
|
|||||||
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def cmd_url_unban(bot, user, text, command, parameter):
|
def cmd_url_unban(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
@@ -170,9 +175,11 @@ def cmd_play(bot, user, text, command, parameter):
|
|||||||
if len(var.playlist) > 0:
|
if len(var.playlist) > 0:
|
||||||
if parameter:
|
if parameter:
|
||||||
if parameter.isdigit() and 1 <= int(parameter) <= len(var.playlist):
|
if parameter.isdigit() and 1 <= int(parameter) <= len(var.playlist):
|
||||||
var.playlist.point_to(int(parameter) - 1 - 1) # First "-1" transfer 12345 to 01234, second "-1"
|
# First "-1" transfer 12345 to 01234, second "-1"
|
||||||
# point to the previous item. the loop will next to
|
# point to the previous item. the loop will next to
|
||||||
# the one you want
|
# the one you want
|
||||||
|
var.playlist.point_to(int(parameter) - 1 - 1)
|
||||||
|
|
||||||
bot.interrupt()
|
bot.interrupt()
|
||||||
else:
|
else:
|
||||||
bot.send_msg(constants.strings('invalid_index', index=parameter), text)
|
bot.send_msg(constants.strings('invalid_index', index=parameter), text)
|
||||||
@@ -331,7 +338,6 @@ def cmd_play_url(bot, user, text, command, parameter):
|
|||||||
bot.send_msg(constants.strings('bad_parameter', command=command))
|
bot.send_msg(constants.strings('bad_parameter', command=command))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def cmd_play_playlist(bot, user, text, command, parameter):
|
def cmd_play_playlist(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
@@ -480,9 +486,11 @@ def cmd_rb_play(bot, user, text, command, parameter):
|
|||||||
msg += "No playable url found for this station, please try another station."
|
msg += "No playable url found for this station, please try another station."
|
||||||
bot.send_msg(msg, text)
|
bot.send_msg(msg, text)
|
||||||
|
|
||||||
|
|
||||||
yt_last_result = []
|
yt_last_result = []
|
||||||
yt_last_page = 0 # TODO: if we keep adding global variables, we need to consider sealing all commands up into classes.
|
yt_last_page = 0 # TODO: if we keep adding global variables, we need to consider sealing all commands up into classes.
|
||||||
|
|
||||||
|
|
||||||
def cmd_yt_search(bot, user, text, command, parameter):
|
def cmd_yt_search(bot, user, text, command, parameter):
|
||||||
global log, yt_last_result, yt_last_page, song_shortlist
|
global log, yt_last_result, yt_last_page, song_shortlist
|
||||||
item_per_page = 5
|
item_per_page = 5
|
||||||
@@ -516,6 +524,7 @@ def cmd_yt_search(bot, user, text, command, parameter):
|
|||||||
else:
|
else:
|
||||||
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
||||||
|
|
||||||
|
|
||||||
def _yt_format_result(results, start, count):
|
def _yt_format_result(results, start, count):
|
||||||
msg = '<table><tr><th width="10%">Index</th><th>Title</th><th width="20%">Uploader</th></tr>'
|
msg = '<table><tr><th width="10%">Index</th><th>Title</th><th width="20%">Uploader</th></tr>'
|
||||||
for index, item in enumerate(results[start:start+count]):
|
for index, item in enumerate(results[start:start+count]):
|
||||||
@@ -772,12 +781,14 @@ def cmd_queue(bot, user, text, command, parameter):
|
|||||||
|
|
||||||
send_multi_lines(bot, msgs, text)
|
send_multi_lines(bot, msgs, text)
|
||||||
|
|
||||||
|
|
||||||
def cmd_random(bot, user, text, command, parameter):
|
def cmd_random(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
bot.interrupt()
|
bot.interrupt()
|
||||||
var.playlist.randomize()
|
var.playlist.randomize()
|
||||||
|
|
||||||
|
|
||||||
def cmd_repeat(bot, user, text, command, parameter):
|
def cmd_repeat(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
@@ -795,13 +806,14 @@ def cmd_repeat(bot, user, text, command, parameter):
|
|||||||
|
|
||||||
bot.send_msg(constants.strings("repeat", song=music.format_song_string(), n=str(repeat)), text)
|
bot.send_msg(constants.strings("repeat", song=music.format_song_string(), n=str(repeat)), text)
|
||||||
|
|
||||||
|
|
||||||
def cmd_mode(bot, user, text, command, parameter):
|
def cmd_mode(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
if not parameter:
|
if not parameter:
|
||||||
bot.send_msg(constants.strings("current_mode", mode=var.playlist.mode), text)
|
bot.send_msg(constants.strings("current_mode", mode=var.playlist.mode), text)
|
||||||
return
|
return
|
||||||
if not parameter in ["one-shot", "repeat", "random", "autoplay"]:
|
if parameter not in ["one-shot", "repeat", "random", "autoplay"]:
|
||||||
bot.send_msg(constants.strings('unknown_mode', mode=parameter), text)
|
bot.send_msg(constants.strings('unknown_mode', mode=parameter), text)
|
||||||
else:
|
else:
|
||||||
var.db.set('playlist', 'playback_mode', parameter)
|
var.db.set('playlist', 'playback_mode', parameter)
|
||||||
@@ -813,6 +825,7 @@ def cmd_mode(bot, user, text, command, parameter):
|
|||||||
bot.interrupt()
|
bot.interrupt()
|
||||||
bot.launch_music()
|
bot.launch_music()
|
||||||
|
|
||||||
|
|
||||||
def cmd_play_tags(bot, user, text, command, parameter):
|
def cmd_play_tags(bot, user, text, command, parameter):
|
||||||
if not parameter:
|
if not parameter:
|
||||||
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
||||||
@@ -829,7 +842,6 @@ def cmd_play_tags(bot, user, text, command, parameter):
|
|||||||
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
|
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
|
||||||
msgs.append("<li><b>{}</b> (<i>{}</i>)</li>".format(music_wrapper.item().title, ", ".join(music_wrapper.item().tags)))
|
msgs.append("<li><b>{}</b> (<i>{}</i>)</li>".format(music_wrapper.item().title, ", ".join(music_wrapper.item().tags)))
|
||||||
|
|
||||||
|
|
||||||
if count != 0:
|
if count != 0:
|
||||||
msgs.append("</ul>")
|
msgs.append("</ul>")
|
||||||
var.playlist.extend(music_wrappers)
|
var.playlist.extend(music_wrappers)
|
||||||
@@ -926,6 +938,7 @@ def cmd_remove_tag(bot, user, text, command, parameter):
|
|||||||
|
|
||||||
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
||||||
|
|
||||||
|
|
||||||
def cmd_find_tagged(bot, user, text, command, parameter):
|
def cmd_find_tagged(bot, user, text, command, parameter):
|
||||||
global song_shortlist
|
global song_shortlist
|
||||||
|
|
||||||
@@ -954,6 +967,7 @@ def cmd_find_tagged(bot, user, text, command, parameter):
|
|||||||
else:
|
else:
|
||||||
bot.send_msg(constants.strings("no_file"), text)
|
bot.send_msg(constants.strings("no_file"), text)
|
||||||
|
|
||||||
|
|
||||||
def cmd_search_library(bot, user, text, command, parameter):
|
def cmd_search_library(bot, user, text, command, parameter):
|
||||||
global song_shortlist
|
global song_shortlist
|
||||||
if not parameter:
|
if not parameter:
|
||||||
@@ -1078,6 +1092,7 @@ def cmd_delete_from_library(bot, user, text, command, parameter):
|
|||||||
|
|
||||||
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
bot.send_msg(constants.strings('bad_parameter', command=command), text)
|
||||||
|
|
||||||
|
|
||||||
def cmd_drop_database(bot, user, text, command, parameter):
|
def cmd_drop_database(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
@@ -1091,6 +1106,7 @@ def cmd_drop_database(bot, user, text, command, parameter):
|
|||||||
else:
|
else:
|
||||||
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
||||||
|
|
||||||
|
|
||||||
def cmd_refresh_cache(bot, user, text, command, parameter):
|
def cmd_refresh_cache(bot, user, text, command, parameter):
|
||||||
global log
|
global log
|
||||||
if bot.is_admin(user):
|
if bot.is_admin(user):
|
||||||
@@ -1100,13 +1116,16 @@ def cmd_refresh_cache(bot, user, text, command, parameter):
|
|||||||
else:
|
else:
|
||||||
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
|
||||||
|
|
||||||
|
|
||||||
# Just for debug use
|
# Just for debug use
|
||||||
def cmd_real_time_rms(bot, user, text, command, parameter):
|
def cmd_real_time_rms(bot, user, text, command, parameter):
|
||||||
bot._display_rms = not bot._display_rms
|
bot._display_rms = not bot._display_rms
|
||||||
|
|
||||||
|
|
||||||
def cmd_loop_state(bot, user, text, command, parameter):
|
def cmd_loop_state(bot, user, text, command, parameter):
|
||||||
print(bot._loop_status)
|
print(bot._loop_status)
|
||||||
|
|
||||||
|
|
||||||
def cmd_item(bot, user, text, command, parameter):
|
def cmd_item(bot, user, text, command, parameter):
|
||||||
print(bot.wait_for_downloading)
|
print(bot.wait_for_downloading)
|
||||||
print(var.playlist.current_item().to_dict())
|
print(var.playlist.current_item().to_dict())
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import variables as var
|
import variables as var
|
||||||
|
|
||||||
|
|
||||||
def strings(option, *argv, **kwargs):
|
def strings(option, *argv, **kwargs):
|
||||||
string = ""
|
string = ""
|
||||||
try:
|
try:
|
||||||
@@ -22,6 +23,7 @@ def strings(option, *argv, **kwargs):
|
|||||||
else:
|
else:
|
||||||
return string
|
return string
|
||||||
|
|
||||||
|
|
||||||
def commands(command):
|
def commands(command):
|
||||||
string = ""
|
string = ""
|
||||||
try:
|
try:
|
||||||
|
|||||||
+3
-4
@@ -2,11 +2,14 @@ import sqlite3
|
|||||||
import json
|
import json
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
class DatabaseError(Exception):
|
class DatabaseError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SettingsDatabase:
|
class SettingsDatabase:
|
||||||
version = 1
|
version = 1
|
||||||
|
|
||||||
def __init__(self, db_path):
|
def __init__(self, db_path):
|
||||||
self.db_path = db_path
|
self.db_path = db_path
|
||||||
|
|
||||||
@@ -227,7 +230,6 @@ class MusicDatabase:
|
|||||||
condition.append('LOWER(title) LIKE ?')
|
condition.append('LOWER(title) LIKE ?')
|
||||||
filler.append("%{:s}%".format(keyword.lower()))
|
filler.append("%{:s}%".format(keyword.lower()))
|
||||||
|
|
||||||
|
|
||||||
condition_str = " AND ".join(condition)
|
condition_str = " AND ".join(condition)
|
||||||
|
|
||||||
conn = sqlite3.connect(self.db_path)
|
conn = sqlite3.connect(self.db_path)
|
||||||
@@ -246,7 +248,6 @@ class MusicDatabase:
|
|||||||
condition.append('LOWER(tags) LIKE ?')
|
condition.append('LOWER(tags) LIKE ?')
|
||||||
filler.append("%{:s},%".format(tag.lower()))
|
filler.append("%{:s},%".format(tag.lower()))
|
||||||
|
|
||||||
|
|
||||||
condition_str = " AND ".join(condition)
|
condition_str = " AND ".join(condition)
|
||||||
|
|
||||||
conn = sqlite3.connect(self.db_path)
|
conn = sqlite3.connect(self.db_path)
|
||||||
@@ -284,7 +285,6 @@ class MusicDatabase:
|
|||||||
|
|
||||||
return self._result_to_dict(results)
|
return self._result_to_dict(results)
|
||||||
|
|
||||||
|
|
||||||
def _result_to_dict(self, results):
|
def _result_to_dict(self, results):
|
||||||
if len(results) > 0:
|
if len(results) > 0:
|
||||||
music_dicts = []
|
music_dicts = []
|
||||||
@@ -324,7 +324,6 @@ class MusicDatabase:
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
def drop_table(self):
|
def drop_table(self):
|
||||||
conn = sqlite3.connect(self.db_path)
|
conn = sqlite3.connect(self.db_path)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|||||||
+14
-7
@@ -57,6 +57,7 @@ web = Flask(__name__)
|
|||||||
log = logging.getLogger("bot")
|
log = logging.getLogger("bot")
|
||||||
user = 'Remote Control'
|
user = 'Remote Control'
|
||||||
|
|
||||||
|
|
||||||
def init_proxy():
|
def init_proxy():
|
||||||
global web
|
global web
|
||||||
if var.is_proxified:
|
if var.is_proxified:
|
||||||
@@ -64,20 +65,22 @@ def init_proxy():
|
|||||||
|
|
||||||
# https://stackoverflow.com/questions/29725217/password-protect-one-webpage-in-flask-app
|
# https://stackoverflow.com/questions/29725217/password-protect-one-webpage-in-flask-app
|
||||||
|
|
||||||
|
|
||||||
def check_auth(username, password):
|
def check_auth(username, password):
|
||||||
"""This function is called to check if a username /
|
"""This function is called to check if a username /
|
||||||
password combination is valid.
|
password combination is valid.
|
||||||
"""
|
"""
|
||||||
return username == var.config.get("webinterface", "user") and password == var.config.get("webinterface", "password")
|
return username == var.config.get("webinterface", "user") and password == var.config.get("webinterface", "password")
|
||||||
|
|
||||||
|
|
||||||
def authenticate():
|
def authenticate():
|
||||||
"""Sends a 401 response that enables basic auth"""
|
"""Sends a 401 response that enables basic auth"""
|
||||||
global log
|
global log
|
||||||
return Response(
|
return Response('Could not verify your access level for that URL.\n'
|
||||||
'Could not verify your access level for that URL.\n'
|
|
||||||
'You have to login with proper credentials', 401,
|
'You have to login with proper credentials', 401,
|
||||||
{'WWW-Authenticate': 'Basic realm="Login Required"'})
|
{'WWW-Authenticate': 'Basic realm="Login Required"'})
|
||||||
|
|
||||||
|
|
||||||
def requires_auth(f):
|
def requires_auth(f):
|
||||||
@wraps(f)
|
@wraps(f)
|
||||||
def decorated(*args, **kwargs):
|
def decorated(*args, **kwargs):
|
||||||
@@ -90,6 +93,7 @@ def requires_auth(f):
|
|||||||
return f(*args, **kwargs)
|
return f(*args, **kwargs)
|
||||||
return decorated
|
return decorated
|
||||||
|
|
||||||
|
|
||||||
def tag_color(tag):
|
def tag_color(tag):
|
||||||
num = hash(tag) % 8
|
num = hash(tag) % 8
|
||||||
if num == 0:
|
if num == 0:
|
||||||
@@ -109,14 +113,15 @@ def tag_color(tag):
|
|||||||
elif num == 7:
|
elif num == 7:
|
||||||
return "dark"
|
return "dark"
|
||||||
|
|
||||||
|
|
||||||
def build_tags_color_lookup():
|
def build_tags_color_lookup():
|
||||||
color_lookup = {}
|
color_lookup = {}
|
||||||
for tag in var.music_db.query_all_tags():
|
for tag in var.music_db.query_all_tags():
|
||||||
color_lookup[tag] = tag_color(tag)
|
color_lookup[tag] = tag_color(tag)
|
||||||
|
|
||||||
|
|
||||||
return color_lookup
|
return color_lookup
|
||||||
|
|
||||||
|
|
||||||
def build_path_tags_lookup():
|
def build_path_tags_lookup():
|
||||||
path_tags_lookup = {}
|
path_tags_lookup = {}
|
||||||
ids = list(var.cache.file_id_lookup.values())
|
ids = list(var.cache.file_id_lookup.values())
|
||||||
@@ -128,11 +133,13 @@ def build_path_tags_lookup():
|
|||||||
|
|
||||||
return path_tags_lookup
|
return path_tags_lookup
|
||||||
|
|
||||||
|
|
||||||
def recur_dir(dirobj):
|
def recur_dir(dirobj):
|
||||||
for name, dir in dirobj.get_subdirs().items():
|
for name, dir in dirobj.get_subdirs().items():
|
||||||
print(dirobj.fullpath + "/" + name)
|
print(dirobj.fullpath + "/" + name)
|
||||||
recur_dir(dir)
|
recur_dir(dir)
|
||||||
|
|
||||||
|
|
||||||
@web.route("/", methods=['GET'])
|
@web.route("/", methods=['GET'])
|
||||||
@requires_auth
|
@requires_auth
|
||||||
def index():
|
def index():
|
||||||
@@ -153,6 +160,7 @@ def index():
|
|||||||
paused=var.bot.is_pause,
|
paused=var.bot.is_pause,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@web.route("/playlist", methods=['GET'])
|
@web.route("/playlist", methods=['GET'])
|
||||||
@requires_auth
|
@requires_auth
|
||||||
def playlist():
|
def playlist():
|
||||||
@@ -177,6 +185,7 @@ def playlist():
|
|||||||
|
|
||||||
return jsonify({'items': items})
|
return jsonify({'items': items})
|
||||||
|
|
||||||
|
|
||||||
def status():
|
def status():
|
||||||
if len(var.playlist) > 0:
|
if len(var.playlist) > 0:
|
||||||
return jsonify({'ver': var.playlist.version,
|
return jsonify({'ver': var.playlist.version,
|
||||||
@@ -231,15 +240,13 @@ def post():
|
|||||||
|
|
||||||
music_wrappers = list(map(
|
music_wrappers = list(map(
|
||||||
lambda file:
|
lambda file:
|
||||||
get_cached_wrapper_by_id(var.bot, var.cache.file_id_lookup[folder + file], user),
|
get_cached_wrapper_by_id(var.bot, var.cache.file_id_lookup[folder + file], user), files))
|
||||||
files))
|
|
||||||
|
|
||||||
var.playlist.extend(music_wrappers)
|
var.playlist.extend(music_wrappers)
|
||||||
|
|
||||||
for music_wrapper in music_wrappers:
|
for music_wrapper in music_wrappers:
|
||||||
log.info('web: add to playlist: ' + music_wrapper.format_debug_string())
|
log.info('web: add to playlist: ' + music_wrapper.format_debug_string())
|
||||||
|
|
||||||
|
|
||||||
elif 'add_url' in request.form:
|
elif 'add_url' in request.form:
|
||||||
music_wrapper = get_cached_wrapper_from_scrap(var.bot, type='url', url=request.form['add_url'], user=user)
|
music_wrapper = get_cached_wrapper_from_scrap(var.bot, type='url', url=request.form['add_url'], user=user)
|
||||||
var.playlist.append(music_wrapper)
|
var.playlist.append(music_wrapper)
|
||||||
@@ -279,7 +286,6 @@ def post():
|
|||||||
else:
|
else:
|
||||||
var.playlist.remove(index)
|
var.playlist.remove(index)
|
||||||
|
|
||||||
|
|
||||||
elif 'play_music' in request.form:
|
elif 'play_music' in request.form:
|
||||||
music_wrapper = var.playlist[int(request.form['play_music'])]
|
music_wrapper = var.playlist[int(request.form['play_music'])]
|
||||||
log.info("web: jump to: " + music_wrapper.format_debug_string())
|
log.info("web: jump to: " + music_wrapper.format_debug_string())
|
||||||
@@ -358,6 +364,7 @@ def post():
|
|||||||
|
|
||||||
return status()
|
return status()
|
||||||
|
|
||||||
|
|
||||||
@web.route('/upload', methods=["POST"])
|
@web.route('/upload', methods=["POST"])
|
||||||
def upload():
|
def upload():
|
||||||
global log
|
global log
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from librb.rbRadios import RadioBrowser
|
|||||||
|
|
||||||
rb = RadioBrowser()
|
rb = RadioBrowser()
|
||||||
|
|
||||||
|
|
||||||
def getstations_byname(query):
|
def getstations_byname(query):
|
||||||
results = rb.stations_byname(query)
|
results = rb.stations_byname(query)
|
||||||
stations = []
|
stations = []
|
||||||
@@ -13,16 +14,19 @@ def getstations_byname(query):
|
|||||||
pass
|
pass
|
||||||
return stations
|
return stations
|
||||||
|
|
||||||
|
|
||||||
def geturl_byid(id):
|
def geturl_byid(id):
|
||||||
url = rb.playable_station(id)['url']
|
url = rb.playable_station(id)['url']
|
||||||
if url != None:
|
if url is not None:
|
||||||
return url
|
return url
|
||||||
else:
|
else:
|
||||||
return "-1"
|
return "-1"
|
||||||
|
|
||||||
|
|
||||||
def getstationname_byid(id):
|
def getstationname_byid(id):
|
||||||
return rb.stations_byid(id)
|
return rb.stations_byid(id)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
r = getstations_byname('r.sh')
|
r = getstations_byname('r.sh')
|
||||||
stationinfo = getstationname_byid(96748)
|
stationinfo = getstationname_byid(96748)
|
||||||
|
|||||||
@@ -180,4 +180,3 @@ class RadioBrowser:
|
|||||||
kwargs["params"] = params
|
kwargs["params"] = params
|
||||||
endpoint = self.builder.produce_endpoint(endpoint="station_search")
|
endpoint = self.builder.produce_endpoint(endpoint="station_search")
|
||||||
return request(endpoint, **kwargs)
|
return request(endpoint, **kwargs)
|
||||||
|
|
||||||
@@ -35,7 +35,6 @@ class MusicCache(dict):
|
|||||||
# print(id)
|
# print(id)
|
||||||
# raise KeyError("Unable to fetch item from the database! Please try to refresh the cache by !recache.")
|
# raise KeyError("Unable to fetch item from the database! Please try to refresh the cache by !recache.")
|
||||||
|
|
||||||
|
|
||||||
def get_item(self, bot, **kwargs):
|
def get_item(self, bot, **kwargs):
|
||||||
# kwargs should provide type and id, and parameters to build the item if not existed in the library.
|
# kwargs should provide type and id, and parameters to build the item if not existed in the library.
|
||||||
# if cached
|
# if cached
|
||||||
|
|||||||
@@ -24,15 +24,19 @@ type : file
|
|||||||
user
|
user
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
def file_item_builder(bot, **kwargs):
|
def file_item_builder(bot, **kwargs):
|
||||||
return FileItem(bot, kwargs['path'])
|
return FileItem(bot, kwargs['path'])
|
||||||
|
|
||||||
|
|
||||||
def file_item_loader(bot, _dict):
|
def file_item_loader(bot, _dict):
|
||||||
return FileItem(bot, "", _dict)
|
return FileItem(bot, "", _dict)
|
||||||
|
|
||||||
|
|
||||||
def file_item_id_generator(**kwargs):
|
def file_item_id_generator(**kwargs):
|
||||||
return hashlib.md5(kwargs['path'].encode()).hexdigest()
|
return hashlib.md5(kwargs['path'].encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
item_builders['file'] = file_item_builder
|
item_builders['file'] = file_item_builder
|
||||||
item_loaders['file'] = file_item_loader
|
item_loaders['file'] = file_item_loader
|
||||||
item_id_generators['file'] = file_item_id_generator
|
item_id_generators['file'] = file_item_id_generator
|
||||||
|
|||||||
@@ -15,19 +15,24 @@ item_builders = {}
|
|||||||
item_loaders = {}
|
item_loaders = {}
|
||||||
item_id_generators = {}
|
item_id_generators = {}
|
||||||
|
|
||||||
|
|
||||||
def example_builder(bot, **kwargs):
|
def example_builder(bot, **kwargs):
|
||||||
return BaseItem(bot)
|
return BaseItem(bot)
|
||||||
|
|
||||||
|
|
||||||
def example_loader(bot, _dict):
|
def example_loader(bot, _dict):
|
||||||
return BaseItem(bot, from_dict=_dict)
|
return BaseItem(bot, from_dict=_dict)
|
||||||
|
|
||||||
|
|
||||||
def example_id_generator(**kwargs):
|
def example_id_generator(**kwargs):
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
item_builders['base'] = example_builder
|
item_builders['base'] = example_builder
|
||||||
item_loaders['base'] = example_loader
|
item_loaders['base'] = example_loader
|
||||||
item_id_generators['base'] = example_id_generator
|
item_id_generators['base'] = example_id_generator
|
||||||
|
|
||||||
|
|
||||||
def dicts_to_items(bot, music_dicts):
|
def dicts_to_items(bot, music_dicts):
|
||||||
items = []
|
items = []
|
||||||
for music_dict in music_dicts:
|
for music_dict in music_dicts:
|
||||||
@@ -35,6 +40,7 @@ def dicts_to_items(bot, music_dicts):
|
|||||||
items.append(item_loaders[type](bot, music_dict))
|
items.append(item_loaders[type](bot, music_dict))
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
|
||||||
def dict_to_item(bot, music_dict):
|
def dict_to_item(bot, music_dict):
|
||||||
type = music_dict['type']
|
type = music_dict['type']
|
||||||
return item_loaders[type](bot, music_dict)
|
return item_loaders[type](bot, music_dict)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import constants
|
|||||||
|
|
||||||
log = logging.getLogger("bot")
|
log = logging.getLogger("bot")
|
||||||
|
|
||||||
|
|
||||||
def get_radio_server_description(url):
|
def get_radio_server_description(url):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
@@ -92,12 +93,15 @@ def radio_item_builder(bot, **kwargs):
|
|||||||
else:
|
else:
|
||||||
return RadioItem(bot, kwargs['url'], '')
|
return RadioItem(bot, kwargs['url'], '')
|
||||||
|
|
||||||
|
|
||||||
def radio_item_loader(bot, _dict):
|
def radio_item_loader(bot, _dict):
|
||||||
return RadioItem(bot, "", "", _dict)
|
return RadioItem(bot, "", "", _dict)
|
||||||
|
|
||||||
|
|
||||||
def radio_item_id_generator(**kwargs):
|
def radio_item_id_generator(**kwargs):
|
||||||
return hashlib.md5(kwargs['url'].encode()).hexdigest()
|
return hashlib.md5(kwargs['url'].encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
item_builders['radio'] = radio_item_builder
|
item_builders['radio'] = radio_item_builder
|
||||||
item_loaders['radio'] = radio_item_loader
|
item_loaders['radio'] = radio_item_loader
|
||||||
item_id_generators['radio'] = radio_item_id_generator
|
item_id_generators['radio'] = radio_item_id_generator
|
||||||
|
|||||||
+4
-1
@@ -17,15 +17,19 @@ import media.system
|
|||||||
|
|
||||||
log = logging.getLogger("bot")
|
log = logging.getLogger("bot")
|
||||||
|
|
||||||
|
|
||||||
def url_item_builder(bot, **kwargs):
|
def url_item_builder(bot, **kwargs):
|
||||||
return URLItem(bot, kwargs['url'])
|
return URLItem(bot, kwargs['url'])
|
||||||
|
|
||||||
|
|
||||||
def url_item_loader(bot, _dict):
|
def url_item_loader(bot, _dict):
|
||||||
return URLItem(bot, "", _dict)
|
return URLItem(bot, "", _dict)
|
||||||
|
|
||||||
|
|
||||||
def url_item_id_generator(**kwargs):
|
def url_item_id_generator(**kwargs):
|
||||||
return hashlib.md5(kwargs['url'].encode()).hexdigest()
|
return hashlib.md5(kwargs['url'].encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
item_builders['url'] = url_item_builder
|
item_builders['url'] = url_item_builder
|
||||||
item_loaders['url'] = url_item_loader
|
item_loaders['url'] = url_item_loader
|
||||||
item_id_generators['url'] = url_item_id_generator
|
item_id_generators['url'] = url_item_id_generator
|
||||||
@@ -214,7 +218,6 @@ class URLItem(BaseItem):
|
|||||||
|
|
||||||
return dict
|
return dict
|
||||||
|
|
||||||
|
|
||||||
def format_debug_string(self):
|
def format_debug_string(self):
|
||||||
return "[url] {title} ({url})".format(
|
return "[url] {title} ({url})".format(
|
||||||
title=self.title,
|
title=self.title,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import hashlib
|
|||||||
from media.item import item_builders, item_loaders, item_id_generators
|
from media.item import item_builders, item_loaders, item_id_generators
|
||||||
from media.url import URLItem, url_item_id_generator
|
from media.url import URLItem, url_item_id_generator
|
||||||
|
|
||||||
|
|
||||||
def get_playlist_info(url, start_index=0, user=""):
|
def get_playlist_info(url, start_index=0, user=""):
|
||||||
items = []
|
items = []
|
||||||
ydl_opts = {
|
ydl_opts = {
|
||||||
@@ -63,6 +64,7 @@ def playlist_url_item_builder(bot, **kwargs):
|
|||||||
def playlist_url_item_loader(bot, _dict):
|
def playlist_url_item_loader(bot, _dict):
|
||||||
return PlaylistURLItem(bot, "", "", "", "", _dict)
|
return PlaylistURLItem(bot, "", "", "", "", _dict)
|
||||||
|
|
||||||
|
|
||||||
item_builders['url_from_playlist'] = playlist_url_item_builder
|
item_builders['url_from_playlist'] = playlist_url_item_builder
|
||||||
item_loaders['url_from_playlist'] = playlist_url_item_loader
|
item_loaders['url_from_playlist'] = playlist_url_item_loader
|
||||||
item_id_generators['url_from_playlist'] = url_item_id_generator
|
item_id_generators['url_from_playlist'] = url_item_id_generator
|
||||||
|
|||||||
+3
-8
@@ -151,7 +151,7 @@ class MumbleBot:
|
|||||||
self.ducking_volume = var.db.getfloat("bot", "ducking_volume", fallback=self.ducking_volume)
|
self.ducking_volume = var.db.getfloat("bot", "ducking_volume", fallback=self.ducking_volume)
|
||||||
self.ducking_threshold = var.config.getfloat("bot", "ducking_threshold", fallback=5000)
|
self.ducking_threshold = var.config.getfloat("bot", "ducking_threshold", fallback=5000)
|
||||||
self.ducking_threshold = var.db.getfloat("bot", "ducking_threshold", fallback=self.ducking_threshold)
|
self.ducking_threshold = var.db.getfloat("bot", "ducking_threshold", fallback=self.ducking_threshold)
|
||||||
self.mumble.callbacks.set_callback(pymumble.constants.PYMUMBLE_CLBK_SOUNDRECEIVED, \
|
self.mumble.callbacks.set_callback(pymumble.constants.PYMUMBLE_CLBK_SOUNDRECEIVED,
|
||||||
self.ducking_sound_received)
|
self.ducking_sound_received)
|
||||||
self.mumble.set_receive_sound(True)
|
self.mumble.set_receive_sound(True)
|
||||||
|
|
||||||
@@ -247,7 +247,6 @@ class MumbleBot:
|
|||||||
constants.strings('url_ban'))
|
constants.strings('url_ban'))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
command_exc = ""
|
command_exc = ""
|
||||||
try:
|
try:
|
||||||
if command in self.cmd_handle:
|
if command in self.cmd_handle:
|
||||||
@@ -319,7 +318,7 @@ class MumbleBot:
|
|||||||
def launch_music(self):
|
def launch_music(self):
|
||||||
if var.playlist.is_empty():
|
if var.playlist.is_empty():
|
||||||
return
|
return
|
||||||
assert self.wait_for_downloading == False
|
assert self.wait_for_downloading is False
|
||||||
|
|
||||||
music_wrapper = var.playlist.current_item()
|
music_wrapper = var.playlist.current_item()
|
||||||
uri = music_wrapper.uri()
|
uri = music_wrapper.uri()
|
||||||
@@ -367,7 +366,6 @@ class MumbleBot:
|
|||||||
var.playlist.remove_by_id(next.id)
|
var.playlist.remove_by_id(next.id)
|
||||||
var.cache.free_and_delete(next.id)
|
var.cache.free_and_delete(next.id)
|
||||||
|
|
||||||
|
|
||||||
# =======================
|
# =======================
|
||||||
# Loop
|
# Loop
|
||||||
# =======================
|
# =======================
|
||||||
@@ -490,7 +488,7 @@ class MumbleBot:
|
|||||||
if rms < self.ducking_threshold:
|
if rms < self.ducking_threshold:
|
||||||
print('%6d/%6d ' % (rms, self._max_rms) + '-'*int(rms/200), end='\r')
|
print('%6d/%6d ' % (rms, self._max_rms) + '-'*int(rms/200), end='\r')
|
||||||
else:
|
else:
|
||||||
print('%6d/%6d ' % (rms, self._max_rms) + '-'*int(self.ducking_threshold/200) \
|
print('%6d/%6d ' % (rms, self._max_rms) + '-'*int(self.ducking_threshold/200)
|
||||||
+ '+'*int((rms - self.ducking_threshold)/200), end='\r')
|
+ '+'*int((rms - self.ducking_threshold)/200), end='\r')
|
||||||
|
|
||||||
if rms > self.ducking_threshold:
|
if rms > self.ducking_threshold:
|
||||||
@@ -558,7 +556,6 @@ class MumbleBot:
|
|||||||
command = ("ffmpeg", '-v', ffmpeg_debug, '-nostdin', '-ss', "%f" % self.playhead, '-i',
|
command = ("ffmpeg", '-v', ffmpeg_debug, '-nostdin', '-ss', "%f" % self.playhead, '-i',
|
||||||
uri, '-ac', '1', '-f', 's16le', '-ar', '48000', '-')
|
uri, '-ac', '1', '-f', 's16le', '-ar', '48000', '-')
|
||||||
|
|
||||||
|
|
||||||
if var.config.getboolean('bot', 'announce_current_music'):
|
if var.config.getboolean('bot', 'announce_current_music'):
|
||||||
self.send_msg(var.playlist.current_item().format_current_playing())
|
self.send_msg(var.playlist.current_item().format_current_playing())
|
||||||
|
|
||||||
@@ -572,7 +569,6 @@ class MumbleBot:
|
|||||||
self.last_volume_cycle_time = time.time()
|
self.last_volume_cycle_time = time.time()
|
||||||
self.pause_at_id = ""
|
self.pause_at_id = ""
|
||||||
|
|
||||||
|
|
||||||
# TODO: this is a temporary workaround for issue #44 of pymumble.
|
# TODO: this is a temporary workaround for issue #44 of pymumble.
|
||||||
def _clear_pymumble_soundqueue(self):
|
def _clear_pymumble_soundqueue(self):
|
||||||
for id, user in self.mumble.users.items():
|
for id, user in self.mumble.users.items():
|
||||||
@@ -582,7 +578,6 @@ class MumbleBot:
|
|||||||
self.log.debug("bot: pymumble soundqueue cleared.")
|
self.log.debug("bot: pymumble soundqueue cleared.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def start_web_interface(addr, port):
|
def start_web_interface(addr, port):
|
||||||
global formatter
|
global formatter
|
||||||
import interface
|
import interface
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ from PIL import Image
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from sys import platform
|
from sys import platform
|
||||||
import traceback
|
import traceback
|
||||||
import urllib.parse, urllib.request, urllib.error
|
import urllib.request
|
||||||
import base64
|
import base64
|
||||||
import media
|
import media
|
||||||
import media.radio
|
import media.radio
|
||||||
@@ -65,6 +65,7 @@ def get_recursive_file_list_sorted(path):
|
|||||||
filelist.sort()
|
filelist.sort()
|
||||||
return filelist
|
return filelist
|
||||||
|
|
||||||
|
|
||||||
# - zips all files of the given zippath (must be a directory)
|
# - zips all files of the given zippath (must be a directory)
|
||||||
# - returns the absolute path of the created zip file
|
# - returns the absolute path of the created zip file
|
||||||
# - zip file will be in the applications tmp folder (according to configuration)
|
# - zip file will be in the applications tmp folder (according to configuration)
|
||||||
@@ -309,6 +310,7 @@ def get_url_from_input(string):
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def youtube_search(query):
|
def youtube_search(query):
|
||||||
global log
|
global log
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user