# coding=utf-8
import logging
-import os.path
import pymumble.pymumble_py3 as pymumble
import re
import variables as var
from librb import radiobrowser
from database import SettingsDatabase, MusicDatabase
-from media.item import item_builders, item_loaders, item_id_generators, dict_to_item, dicts_to_items
-from media.playlist import get_item_wrapper_from_scrap, get_item_wrapper_by_id, get_item_wrappers_by_tags
-from media.file import FileItem
-from media.url_from_playlist import PlaylistURLItem, get_playlist_info
-from media.url import URLItem
-from media.radio import RadioItem
+from media.item import item_id_generators, dict_to_item, dicts_to_items
+from media.cache import get_cached_wrapper_from_scrap, get_cached_wrapper_by_id, get_cached_wrappers_by_tags
+from media.url_from_playlist import get_playlist_info
log = logging.getLogger("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('user_ban'), cmd_user_ban)
- bot.register_command(constants.commands('user_unban'), cmd_user_unban)
- bot.register_command(constants.commands('url_ban'), cmd_url_ban)
- bot.register_command(constants.commands('url_unban'), cmd_url_unban)
+ bot.register_command(constants.commands('user_ban'), cmd_user_ban, no_partial_match=True)
+ bot.register_command(constants.commands('user_unban'), cmd_user_unban, no_partial_match=True)
+ bot.register_command(constants.commands('url_ban_list'), cmd_url_ban_list, no_partial_match=True)
+ bot.register_command(constants.commands('url_ban'), cmd_url_ban, no_partial_match=True)
+ bot.register_command(constants.commands('url_unban'), cmd_url_unban, no_partial_match=True)
bot.register_command(constants.commands('play'), cmd_play)
bot.register_command(constants.commands('pause'), cmd_pause)
bot.register_command(constants.commands('play_file'), cmd_play_file)
bot.register_command(constants.commands('stop'), cmd_stop)
bot.register_command(constants.commands('clear'), cmd_clear)
bot.register_command(constants.commands('kill'), cmd_kill)
- bot.register_command(constants.commands('update'), cmd_update)
+ bot.register_command(constants.commands('update'), cmd_update, no_partial_match=True)
bot.register_command(constants.commands('stop_and_getout'), cmd_stop_and_getout)
bot.register_command(constants.commands('volume'), cmd_volume)
bot.register_command(constants.commands('ducking'), cmd_ducking)
bot.register_command('loop', cmd_loop_state, True)
bot.register_command('item', cmd_item, True)
+
def send_multi_lines(bot, lines, text, linebreak="<br />"):
global log
for newline in lines:
msg += br
br = linebreak
- if (len(msg) + len(newline)) > (bot.mumble.get_max_message_length() - 4) != 0: # 4 == len("<br>")
+ if bot.mumble.get_max_message_length()\
+ and (len(msg) + len(newline)) > (bot.mumble.get_max_message_length() - 4): # 4 == len("<br>")
bot.send_msg(msg, text)
msg = ""
msg += newline
bot.send_msg(msg, text)
+
# ---------------- Variables -----------------
song_shortlist = []
-# ---------------- Commands ------------------
+# ---------------- Commands ------------------
def cmd_joinme(bot, user, text, command, parameter):
global log
if bot.is_admin(user):
if parameter:
bot.mumble.users[text.actor].send_text_message(util.url_ban(util.get_url_from_input(parameter)))
+
+ id = item_id_generators['url'](url=parameter)
+ var.cache.free_and_delete(id)
+ var.playlist.remove_by_id(id)
else:
- bot.mumble.users[text.actor].send_text_message(util.get_url_ban())
+ if var.playlist.current_item() and var.playlist.current_item().type == 'url':
+ item = var.playlist.current_item().item()
+ bot.mumble.users[text.actor].send_text_message(util.url_ban(util.get_url_from_input(item.url)))
+ var.cache.free_and_delete(item.id)
+ var.playlist.remove_by_id(item.id)
+ else:
+ bot.send_msg(constants.strings('bad_parameter', command=command))
+ else:
+ bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
+ return
+
+
+def cmd_url_ban_list(bot, user, text, command, parameter):
+ if bot.is_admin(user):
+ bot.mumble.users[text.actor].send_text_message(util.get_url_ban())
else:
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
return
if len(var.playlist) > 0:
if parameter:
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"
- # point to the previous item. the loop will next to
- # the one you want
- bot.interrupt()
+ # First "-1" transfer 12345 to 01234, second "-1"
+ # point to the previous item. the loop will next to
+ # the one you want
+ var.playlist.point_to(int(parameter) - 1 - 1)
+
+ if not bot.is_pause:
+ bot.interrupt()
+ else:
+ bot.is_pause = False
else:
bot.send_msg(constants.strings('invalid_index', index=parameter), text)
if parameter.isdigit():
files = var.cache.files
if int(parameter) < len(files):
- music_wrapper = get_item_wrapper_by_id(bot, var.cache.file_id_lookup[files[int(parameter)]], user)
+ music_wrapper = get_cached_wrapper_by_id(bot, var.cache.file_id_lookup[files[int(parameter)]], user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
- bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()), text)
+ bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()))
return
# if parameter is {path}
# return
if parameter in var.cache.files:
- music_wrapper = get_item_wrapper_from_scrap(bot, type='file', path=parameter, user=user)
+ music_wrapper = get_cached_wrapper_from_scrap(bot, type='file', path=parameter, user=user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
- bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()), text)
+ bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()))
return
# if parameter is {folder}
for file in files:
count += 1
- music_wrapper = get_item_wrapper_by_id(bot, var.cache.file_id_lookup[file], user)
+ music_wrapper = get_cached_wrapper_by_id(bot, var.cache.file_id_lookup[file], user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
msgs.append("{} ({})".format(music_wrapper.item().title, music_wrapper.item().path))
if count != 0:
- send_multi_lines(bot, msgs, text)
+ send_multi_lines(bot, msgs, None)
return
else:
# try to do a partial match
files = var.cache.files
- matches = [ file for file in files if parameter.lower() in file.lower()]
+ matches = [file for file in files if parameter.lower() in file.lower()]
if len(matches) == 1:
file = matches[0]
- music_wrapper = get_item_wrapper_by_id(bot, var.cache.file_id_lookup[file], user)
+ music_wrapper = get_cached_wrapper_by_id(bot, var.cache.file_id_lookup[file], user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
- bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()), text)
+ bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()))
return
elif len(matches) > 1:
- msgs = [ constants.strings('multiple_matches') ]
+ msgs = [constants.strings('multiple_matches')]
song_shortlist = []
for index, match in enumerate(matches):
id = var.cache.file_id_lookup[match]
def cmd_play_file_match(bot, user, text, command, parameter, do_not_refresh_cache=False):
global log
- music_folder = var.music_folder
if parameter:
files = var.cache.files
- msgs = [ constants.strings('multiple_file_added') + "<ul>"]
+ msgs = [constants.strings('multiple_file_added') + "<ul>"]
count = 0
try:
music_wrappers = []
match = re.search(parameter, file)
if match and match[0]:
count += 1
- music_wrapper = get_item_wrapper_by_id(bot, var.cache.file_id_lookup[file], user)
+ music_wrapper = get_cached_wrapper_by_id(bot, var.cache.file_id_lookup[file], user)
music_wrappers.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
msgs.append("<li><b>{}</b> ({})</li>".format(music_wrapper.item().title,
- file[:match.span()[0]]
- + "<b style='color:pink'>"
- + file[match.span()[0]: match.span()[1]]
- + "</b>"
- + file[match.span()[1]:]
- ))
+ file[:match.span()[0]]
+ + "<b style='color:pink'>"
+ + file[match.span()[0]: match.span()[1]]
+ + "</b>"
+ + file[match.span()[1]:]
+ ))
if count != 0:
msgs.append("</ul>")
var.playlist.extend(music_wrappers)
- send_multi_lines(bot, msgs, text, "")
+ send_multi_lines(bot, msgs, None, "")
else:
if do_not_refresh_cache:
bot.send_msg(constants.strings("no_file"), text)
url = util.get_url_from_input(parameter)
if url:
- music_wrapper = get_item_wrapper_from_scrap(bot, type='url', url=url, user=user)
+ music_wrapper = get_cached_wrapper_from_scrap(bot, type='url', url=url, user=user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
- bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()), text)
+ bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()))
if len(var.playlist) == 2:
# If I am the second item on the playlist. (I am the next one!)
bot.async_download_next()
bot.send_msg(constants.strings('bad_parameter', command=command))
-
def cmd_play_playlist(bot, user, text, command, parameter):
global log
items = get_playlist_info(url=url, start_index=offset, user=user)
if len(items) > 0:
items = var.playlist.extend(list(map(
- lambda item: get_item_wrapper_from_scrap(bot, **item), items)))
+ lambda item: get_cached_wrapper_from_scrap(bot, **item), items)))
for music in items:
log.info("cmd: add to playlist: " + music.format_debug_string())
else:
parameter = parameter.split()[0]
url = util.get_url_from_input(parameter)
if url:
- music_wrapper = get_item_wrapper_from_scrap(bot, type='radio', url=url, user=user)
+ music_wrapper = get_cached_wrapper_from_scrap(bot, type='radio', url=url, user=user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
- bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()), text)
+ bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()))
else:
bot.send_msg(constants.strings('bad_url'))
url = radiobrowser.geturl_byid(parameter)
if url != "-1":
log.info('cmd: Found url: ' + url)
- music_wrapper = get_item_wrapper_from_scrap(bot, type='radio', url=url, name=stationname, user=user)
+ music_wrapper = get_cached_wrapper_from_scrap(bot, type='radio', url=url, name=stationname, user=user)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
bot.async_download_next()
msg += "No playable url found for this station, please try another station."
bot.send_msg(msg, text)
+
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):
global log, yt_last_result, yt_last_page, song_shortlist
else:
bot.send_msg(constants.strings('bad_parameter', command=command), text)
+
def _yt_format_result(results, start, count):
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]):
def cmd_help(bot, user, text, command, parameter):
global log
-
bot.send_msg(constants.strings('help'), text)
if bot.is_admin(user):
bot.send_msg(constants.strings('admin_help'), text)
global log
bot.stop()
+ if var.playlist.mode == "one-shot":
+ var.playlist.clear()
+
if bot.channel:
bot.mumble.channels.find_by_name(bot.channel).move_in()
if parameter and parameter.isdigit() and 0 <= int(parameter) <= 100:
bot.volume_set = float(float(parameter) / 100)
bot.send_msg(constants.strings('change_volume',
- volume=int(bot.volume_set * 100), user=bot.mumble.users[text.actor]['name']), text)
+ volume=int(bot.volume_set * 100), user=bot.mumble.users[text.actor]['name']))
var.db.set('bot', 'volume', str(bot.volume_set))
log.info('cmd: volume set to %d' % (bot.volume_set * 100))
else:
if parameter and parameter.isdigit() and 0 <= int(parameter) <= 100:
bot.ducking_volume = float(float(parameter) / 100)
bot.send_msg(constants.strings('change_ducking_volume',
- volume=int(bot.ducking_volume * 100), user=bot.mumble.users[text.actor]['name']), text)
+ volume=int(bot.ducking_volume * 100), user=bot.mumble.users[text.actor]['name']), text)
# var.db.set('bot', 'volume', str(bot.volume_set))
var.db.set('bot', 'ducking_volume', str(bot.ducking_volume))
log.info('cmd: volume on ducking set to %d' % (bot.ducking_volume * 100))
def cmd_current_music(bot, user, text, command, parameter):
global log
- reply = ""
if len(var.playlist) > 0:
- bot.send_msg(var.playlist.current_item().format_current_playing())
+ bot.send_msg(var.playlist.current_item().format_current_playing(), text)
else:
- reply = constants.strings('not_playing')
- bot.send_msg(reply, text)
+ bot.send_msg(constants.strings('not_playing'), text)
def cmd_skip(bot, user, text, command, parameter):
global log
# Allow to remove specific music into the queue with a number
- if parameter and parameter.isdigit() and int(parameter) > 0 \
- and int(parameter) <= len(var.playlist):
+ if parameter and parameter.isdigit() and 0 < int(parameter) <= len(var.playlist):
index = int(parameter) - 1
- removed = None
if index == var.playlist.current_index:
- removed = var.playlist.remove(index)
+ removed = var.playlist[index]
+ bot.send_msg(constants.strings('removing_item',
+ item=removed.format_short_string()), text)
+ log.info("cmd: delete from playlist: " + removed.format_debug_string())
+
+ var.playlist.remove(index)
if index < len(var.playlist):
if not bot.is_pause:
var.playlist.current_index -= 1
# then the bot will move to next item
- else: # if item deleted is the last item of the queue
+ else: # if item deleted is the last item of the queue
var.playlist.current_index -= 1
if not bot.is_pause:
bot.interrupt()
else:
- removed = var.playlist.remove(index)
-
- bot.send_msg(constants.strings('removing_item',
- item=removed.format_short_string()), text)
+ var.playlist.remove(index)
- log.info("cmd: delete from playlist: " + removed.format_debug_string())
else:
- bot.send_msg(constants.strings('bad_parameter', command=command))
+ bot.send_msg(constants.strings('bad_parameter', command=command), text)
def cmd_list_file(bot, user, text, command, parameter):
global log
files = var.cache.files
- msgs = [ constants.strings("multiple_file_found") ]
+ msgs = [constants.strings("multiple_file_found")]
try:
count = 0
for index, file in enumerate(files):
msg = constants.strings('queue_empty')
bot.send_msg(msg, text)
else:
- msgs = [ constants.strings('queue_contents')]
+ msgs = [constants.strings('queue_contents')]
for i, music in enumerate(var.playlist):
- newline = ''
tags = ''
if len(music.item().tags) > 0:
tags = "<sup>{}</sup>".format(", ".join(music.item().tags))
if i == var.playlist.current_index:
newline = "<b style='color:orange'>{} ({}) {} </b> {}".format(i + 1, music.display_type(),
- music.format_short_string(), tags)
+ music.format_short_string(), tags)
else:
newline = '<b>{}</b> ({}) {} {}'.format(i + 1, music.display_type(),
- music.format_short_string(), tags)
+ music.format_short_string(), tags)
msgs.append(newline)
send_multi_lines(bot, msgs, text)
+
def cmd_random(bot, user, text, command, parameter):
global log
bot.interrupt()
var.playlist.randomize()
+
def cmd_repeat(bot, user, text, command, parameter):
global log
bot.send_msg(constants.strings("repeat", song=music.format_song_string(), n=str(repeat)), text)
+
def cmd_mode(bot, user, text, command, parameter):
global log
if not parameter:
bot.send_msg(constants.strings("current_mode", mode=var.playlist.mode), text)
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)
else:
var.db.set('playlist', 'playback_mode', parameter)
bot.interrupt()
bot.launch_music()
+
def cmd_play_tags(bot, user, text, command, parameter):
if not parameter:
- bot.send_msg(constants.strings('bad_parameter', command=command))
+ bot.send_msg(constants.strings('bad_parameter', command=command), text)
return
msgs = [constants.strings('multiple_file_added') + "<ul>"]
tags = parameter.split(",")
tags = list(map(lambda t: t.strip(), tags))
- music_wrappers = get_item_wrappers_by_tags(bot, tags, user)
+ music_wrappers = get_cached_wrappers_by_tags(bot, tags, user)
for music_wrapper in music_wrappers:
count += 1
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)))
-
if count != 0:
msgs.append("</ul>")
var.playlist.extend(music_wrappers)
- send_multi_lines(bot, msgs, text, "")
+ send_multi_lines(bot, msgs, None, "")
else:
bot.send_msg(constants.strings("no_file"), text)
global log
params = parameter.split()
- index = ""
- tags = []
if len(params) == 2:
index = params[0]
tags = list(map(lambda t: t.strip(), params[1].split(",")))
params = parameter.split()
- index = ""
- tags = []
if len(params) == 2:
index = params[0]
tags = list(map(lambda t: t.strip(), params[1].split(",")))
if tags[0] != "*":
var.playlist[int(index) - 1].remove_tags(tags)
log.info("cmd: remove tags %s from song %s" % (", ".join(tags),
- var.playlist[int(index) - 1].format_debug_string()))
+ var.playlist[int(index) - 1].format_debug_string()))
bot.send_msg(constants.strings("removed_tags",
tags=", ".join(tags),
song=var.playlist[int(index) - 1].format_short_string()), text)
for item in var.playlist:
item.remove_tags(tags)
log.info("cmd: remove tags %s from song %s" % (", ".join(tags),
- item.format_debug_string()))
+ item.format_debug_string()))
bot.send_msg(constants.strings("removed_tags_from_all", tags=", ".join(tags)), text)
return
else:
bot.send_msg(constants.strings('bad_parameter', command=command), text)
+
def cmd_find_tagged(bot, user, text, command, parameter):
global song_shortlist
if not parameter:
- bot.send_msg(constants.strings('bad_parameter', command=command))
+ bot.send_msg(constants.strings('bad_parameter', command=command), text)
return
msgs = [constants.strings('multiple_file_found') + "<ul>"]
else:
bot.send_msg(constants.strings("no_file"), text)
+
def cmd_search_library(bot, user, text, command, parameter):
global song_shortlist
if not parameter:
- bot.send_msg(constants.strings('bad_parameter', command=command))
+ bot.send_msg(constants.strings('bad_parameter', command=command), text)
return
msgs = [constants.strings('multiple_file_found') + "<ul>"]
def cmd_shortlist(bot, user, text, command, parameter):
global song_shortlist, log
- indexes = []
try:
- indexes = [ int(i) for i in parameter.split(" ") ]
+ indexes = [int(i) for i in parameter.split(" ")]
except ValueError:
bot.send_msg(constants.strings('bad_parameter', command=command), text)
return
if 1 <= index <= len(song_shortlist):
kwargs = song_shortlist[index - 1]
kwargs['user'] = user
- music_wrapper = get_item_wrapper_from_scrap(bot, **kwargs)
+ music_wrapper = get_cached_wrapper_from_scrap(bot, **kwargs)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
msgs.append("<li>[{}] <b>{}</b></li>".format(music_wrapper.item().type, music_wrapper.item().title))
return
msgs.append("</ul>")
- send_multi_lines(bot, msgs, text, "")
+ send_multi_lines(bot, msgs, None, "")
return
elif len(indexes) == 1:
index = indexes[0]
if 1 <= index <= len(song_shortlist):
kwargs = song_shortlist[index - 1]
kwargs['user'] = user
- music_wrapper = get_item_wrapper_from_scrap(bot, **kwargs)
+ music_wrapper = get_cached_wrapper_from_scrap(bot, **kwargs)
var.playlist.append(music_wrapper)
log.info("cmd: add to playlist: " + music_wrapper.format_debug_string())
- bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()), text)
+ bot.send_msg(constants.strings('file_added', item=music_wrapper.format_song_string()))
return
bot.send_msg(constants.strings('bad_parameter', command=command), text)
def cmd_delete_from_library(bot, user, text, command, parameter):
global song_shortlist, log
- indexes = []
try:
- indexes = [ int(i) for i in parameter.split(" ") ]
+ indexes = [int(i) for i in parameter.split(" ")]
except ValueError:
bot.send_msg(constants.strings('bad_parameter', command=command), text)
return
if 1 <= index <= len(song_shortlist):
music_dict = song_shortlist[index - 1]
if 'id' in music_dict:
- music_wrapper = get_item_wrapper_by_id(bot, music_dict['id'], user)
+ music_wrapper = get_cached_wrapper_by_id(bot, music_dict['id'], user)
log.info("cmd: remove from library: " + music_wrapper.format_debug_string())
- msgs.append("<li>[{}] <b>{}</b></li>".format(music_wrapper.item().type ,music_wrapper.item().title))
+ msgs.append("<li>[{}] <b>{}</b></li>".format(music_wrapper.item().type, music_wrapper.item().title))
var.playlist.remove_by_id(music_dict['id'])
var.cache.free_and_delete(music_dict['id'])
count += 1
return
msgs.append("</ul>")
- send_multi_lines(bot, msgs, text, "")
+ send_multi_lines(bot, msgs, None, "")
return
elif len(indexes) == 1:
index = indexes[0]
if 1 <= index <= len(song_shortlist):
music_dict = song_shortlist[index - 1]
if 'id' in music_dict:
- music_wrapper = get_item_wrapper_by_id(bot, music_dict['id'], user)
+ music_wrapper = get_cached_wrapper_by_id(bot, music_dict['id'], user)
bot.send_msg(constants.strings('file_deleted', item=music_wrapper.format_song_string()), text)
log.info("cmd: remove from library: " + music_wrapper.format_debug_string())
var.playlist.remove_by_id(music_dict['id'])
bot.send_msg(constants.strings('bad_parameter', command=command), text)
+
def cmd_drop_database(bot, user, text, command, parameter):
global log
else:
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
+
def cmd_refresh_cache(bot, user, text, command, parameter):
global log
if bot.is_admin(user):
else:
bot.mumble.users[text.actor].send_text_message(constants.strings('not_admin'))
+
# Just for debug use
def cmd_real_time_rms(bot, user, text, command, parameter):
bot._display_rms = not bot._display_rms
+
def cmd_loop_state(bot, user, text, command, parameter):
print(bot._loop_status)
+
def cmd_item(bot, user, text, command, parameter):
print(bot.wait_for_downloading)
print(var.playlist.current_item().to_dict())