def cmd_play_file_match(bot, user, text, command, parameter): music_folder = var.config.get('bot', 'music_folder') if parameter is not None: files = util.get_recursive_filelist_sorted(music_folder) msgs = [ var.config.get('strings', 'file_added') ] count = 0 try: for file in files: match = re.search(parameter, file) if match: count += 1 music = {'type': 'file', 'path': file, 'user': user} logging.info("cmd: add to playlist: " + file) music = var.playlist.append(music) msgs.append("{} ({})".format(music['title'], music['path'])) if count != 0: send_multi_lines(bot, msgs, text) else: bot.send_msg(var.config.get('strings', 'no_file'), text) except re.error as e: msg = var.config.get('strings', 'wrong_pattern') % str(e) bot.send_msg(msg, text) else: bot.send_msg(var.config.get('strings', 'bad_parameter') % command)
def download(): if 'file' in request.args: requested_file = request.args['file'] if '../' not in requested_file: folder_path = var.music_folder files = util.get_recursive_filelist_sorted(var.music_folder) if requested_file in files: filepath = os.path.join(folder_path, requested_file) try: return send_file(filepath, as_attachment=True) except Exception as e: self.log.exception(e) self.Error(400) elif 'directory' in request.args: requested_dir = request.args['directory'] folder_path = var.music_folder requested_dir_fullpath = os.path.abspath( os.path.join(folder_path, requested_dir)) + '/' if requested_dir_fullpath.startswith(folder_path): if os.path.samefile(requested_dir_fullpath, folder_path): prefix = 'all' else: prefix = secure_filename( os.path.relpath(requested_dir_fullpath, folder_path)) zipfile = util.zipdir(requested_dir_fullpath, prefix) try: return send_file(zipfile, as_attachment=True) except Exception as e: self.log.exception(e) self.Error(400) return redirect("./", code=400)
def index(): folder_path = var.music_folder files = util.get_recursive_filelist_sorted(var.music_folder) music_library = util.Dir(folder_path) for file in files: music_library.add_file(file) return render_template('index.html', all_files=files, music_library=music_library, os=os, playlist=var.playlist, user=var.user, paused=var.botamusique.is_pause)
def cmd_list_file(bot, user, text, command, parameter): folder_path = var.config.get('bot', 'music_folder') files = util.get_recursive_filelist_sorted(folder_path) msgs = [ "<br> <b>Files available:</b>" if not parameter else "<br> <b>Matched files:</b>" ] try: count = 0 for index, file in enumerate(files): if parameter: match = re.search(parameter, file) if not match: continue count += 1 msgs.append("<b>{:0>3d}</b> - {:s}".format(index, file)) if count != 0: send_multi_lines(bot, msgs, text) else: bot.send_msg(var.config.get('strings', 'no_file'), text) except re.error as e: msg = var.config.get('strings', 'wrong_pattern') % str(e) bot.send_msg(msg, text)
def message_received(self, text): message = text.message.strip() user = self.mumble.users[text.actor]['name'] if var.config.getboolean('command', 'split_username_at_space'): # in can you use https://github.com/Natenom/mumblemoderator-module-collection/tree/master/os-suffixes , you want to split the username user = user.split()[0] if message[0] == var.config.get('command', 'command_symbol'): # remove the symbol from the message message = message[1:].split(' ', 1) # use the first word as a command, the others one as parameters if len(message) > 0: command = message[0] parameter = '' if len(message) > 1: parameter = message[1] else: return logging.info(command + ' - ' + parameter + ' by ' + user) if command == var.config.get('command', 'joinme'): self.mumble.users.myself.move_in(self.mumble.users[text.actor]['channel_id'], token=parameter) return # Anti stupid guy function if not self.is_admin(user) and not var.config.getboolean('bot', 'allow_other_channel_message') and self.mumble.users[text.actor]['channel_id'] != self.mumble.users.myself['channel_id']: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_in_my_channel')) return if not self.is_admin(user) and not var.config.getboolean('bot', 'allow_private_message') and text.session: self.mumble.users[text.actor].send_message(var.config.get('strings', 'pm_not_allowed')) return ### # Admin command ### for i in var.db.items("user_ban"): if user.lower() == i[0]: self.mumble.users[text.actor].send_message(var.config.get('strings', 'user_ban')) return if command == var.config.get('command', 'user_ban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message(util.user_ban(parameter)) else: self.mumble.users[text.actor].send_message(util.get_user_ban()) else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'user_unban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message(util.user_unban(parameter)) else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'url_ban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message(util.url_ban(self.get_url_from_input(parameter))) else: self.mumble.users[text.actor].send_message(util.get_url_ban()) else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'url_unban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message(util.url_unban(self.get_url_from_input(parameter))) else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin')) return if parameter: for i in var.db.items("url_ban"): if self.get_url_from_input(parameter.lower()) == i[0]: self.mumble.users[text.actor].send_message(var.config.get('strings', 'url_ban')) return ### # everyday commands ### if command == var.config.get('command', 'play_file') and parameter: music_folder = var.config.get('bot', 'music_folder') # sanitize "../" and so on path = os.path.abspath(os.path.join(music_folder, parameter)) if path.startswith(music_folder): if os.path.isfile(path): filename = path.replace(music_folder, '') music = {'type': 'file', 'path': filename, 'user': user} var.playlist.append(music) else: # try to do a partial match matches = [file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower()] if len(matches) == 0: self.send_msg(var.config.get('strings', 'no_file'), text) elif len(matches) == 1: music = {'type': 'file', 'path': matches[0], 'user': user} var.playlist.append(music) else: msg = var.config.get('strings', 'multiple_matches') + '<br />' msg += '<br />'.join(matches) self.send_msg(msg, text) else: self.send_msg(var.config.get('strings', 'bad_file'), text) self.async_download_next() elif command == var.config.get('command', 'play_url') and parameter: music = {'type': 'url', 'url': self.get_url_from_input(parameter), # grab the real URL 'user': user, 'ready': 'validation'} var.playlist.append(music) if media.url.get_url_info(): if var.playlist[-1]['duration'] > var.config.getint('bot', 'max_track_duration'): var.playlist.pop() self.send_msg(var.config.get('strings', 'too_long'), text) else: for i in var.db.options("url_ban"): if var.playlist[-1]['url'] == i: self.mumble.users[text.actor].send_message(var.config.get('strings', 'url_ban')) var.playlist.pop() return var.playlist[-1]['ready'] = "no" self.async_download_next() else: var.playlist.pop() self.send_msg(var.config.get('strings', 'unable_download'), text) elif command == var.config.get('command', 'play_playlist') and parameter: offset = 1 # if you want to start the playlist at a specific index try: offset = int(parameter.split(" ")[-1]) except ValueError: pass if media.playlist.get_playlist_info(url=self.get_url_from_input(parameter), start_index=offset, user=user): self.async_download_next() elif command == var.config.get('command', 'play_radio') and parameter: if var.config.has_option('radio', parameter): parameter = var.config.get('radio', parameter) music = {'type': 'radio', 'url': self.get_url_from_input(parameter), 'user': user} var.playlist.append(music) self.async_download_next() elif command == var.config.get('command', 'help'): self.send_msg(var.config.get('strings', 'help'), text) elif command == var.config.get('command', 'stop'): self.stop() elif command == var.config.get('command', 'kill'): if self.is_admin(user): self.stop() self.exit = True else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'update'): if self.is_admin(user): self.mumble.users[text.actor].send_message("Starting the update") # Need to be improved tp = sp.check_output([var.config.get('bot', 'pip3_path'), 'install', '--upgrade', 'youtube-dl']).decode() msg = "" if "Requirement already up-to-date" in tp: msg += "Youtube-dl is up-to-date" else: msg += "Update done : " + tp.split('Successfully installed')[1] if 'up-to-date' not in sp.check_output(['/usr/bin/env', 'git', 'pull']).decode(): # Need to change it with release tag msg += "<br /> I'm up-to-date" else: msg += "<br /> I have available updates, need to do it manually" self.mumble.users[text.actor].send_message(msg) else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'stop_and_getout'): self.stop() if self.channel: self.mumble.channels.find_by_name(self.channel).move_in() elif command == var.config.get('command', 'volume'): # The volume is a percentage if parameter is not None and parameter.isdigit() and 0 <= int(parameter) <= 100: self.volume = float(float(parameter) / 100) self.send_msg(var.config.get('strings', 'change_volume') % ( int(self.volume * 100), self.mumble.users[text.actor]['name']), text) var.db.set('bot', 'volume', str(self.volume)) else: self.send_msg(var.config.get('strings', 'current_volume') % int(self.volume * 100), text) elif command == var.config.get('command', 'current_music'): if len(var.playlist) > 0: source = var.playlist[0]["type"] if source == "radio": reply = "[radio] {title} on {url} by {user}".format( title=media.radio.get_radio_title(var.playlist[0]["url"]), url=var.playlist[0]["title"], user=var.playlist[0]["user"] ) elif source == "url" and 'from_playlist' in var.playlist[0]: reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format( title=var.playlist[0]["title"], url=var.playlist[0]["playlist_url"], playlist=var.playlist[0]["playlist_title"], user=var.playlist[0]["user"] ) elif source == "url": reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format( title=var.playlist[0]["title"], url=var.playlist[0]["url"], user=var.playlist[0]["user"] ) elif source == "file": reply = "[file] {title} by {user}".format( title=var.playlist[0]["title"], user=var.playlist[0]["user"]) else: reply = "ERROR" logging.error(var.playlist) else: reply = var.config.get('strings', 'not_playing') self.send_msg(reply, text) elif command == var.config.get('command', 'skip'): if parameter is not None and parameter.isdigit() and int(parameter) > 0: # Allow to remove specific music into the queue with a number if int(parameter) < len(var.playlist): removed = var.playlist.pop(int(parameter)) # the Title isn't here if the music wasn't downloaded self.send_msg(var.config.get('strings', 'removing_item') % (removed['title'] if 'title' in removed else removed['url']), text) else: self.send_msg(var.config.get('strings', 'no_possible'), text) elif self.next(): # Is no number send, just skip the current music self.launch_music() self.async_download_next() else: self.send_msg(var.config.get('strings', 'queue_empty'), text) self.stop() elif command == var.config.get('command', 'list'): folder_path = var.config.get('bot', 'music_folder') files = util.get_recursive_filelist_sorted(folder_path) if files: self.send_msg('<br>'.join(files), text) else: self.send_msg(var.config.get('strings', 'no_file'), text) elif command == var.config.get('command', 'queue'): if len(var.playlist) <= 1: msg = var.config.get('strings', 'queue_empty') else: msg = var.config.get('strings', 'queue_contents') + '<br />' i = 1 for value in var.playlist[1:]: msg += '[{}] ({}) {}<br />'.format(i, value['type'], value['title'] if 'title' in value else value['url']) i += 1 self.send_msg(msg, text) elif command == var.config.get('command', 'repeat'): var.playlist.append(var.playlist[0]) else: self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_command'))
def message_received(self, text): message = text.message.strip() user = self.mumble.users[text.actor]['name'] if message[0] == '!': message = message[1:].split(' ', 1) if len(message) > 0: command = message[0] parameter = '' if len(message) > 1: parameter = message[1] else: return logging.info(command + ' - ' + parameter + ' by ' + user) if command == var.config.get('command', 'joinme'): self.mumble.users.myself.move_in( self.mumble.users[text.actor]['channel_id']) return if not self.is_admin(user) and not var.config.getboolean( 'bot', 'allow_other_channel_message' ) and self.mumble.users[text.actor][ 'channel_id'] != self.mumble.users.myself['channel_id']: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_in_my_channel')) return if not self.is_admin(user) and not var.config.getboolean( 'bot', 'allow_private_message') and text.session: self.mumble.users[text.actor].send_message( var.config.get('strings', 'pm_not_allowed')) return if command == var.config.get('command', 'play_file') and parameter: music_folder = var.config.get('bot', 'music_folder') # sanitize "../" and so on path = os.path.abspath(os.path.join(music_folder, parameter)) if path.startswith(music_folder): if os.path.isfile(path): filename = path.replace(music_folder, '') var.playlist.append(["file", filename, user]) else: # try to do a partial match matches = [ file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower() ] if len(matches) == 0: self.mumble.users[text.actor].send_message( var.config.get('strings', 'no_file')) elif len(matches) == 1: var.playlist.append(["file", matches[0], user]) else: msg = var.config.get('strings', 'multiple_matches') + '<br />' msg += '<br />'.join(matches) self.mumble.users[text.actor].send_message(msg) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'bad_file')) self.async_download_next() elif command == var.config.get('command', 'play_url') and parameter: var.playlist.append(["url", parameter, user]) self.async_download_next() elif command == var.config.get('command', 'play_playlist') and parameter: offset = 1 try: offset = int(parameter.split(" ")[-1]) except ValueError: pass var.playlist.append([ "playlist", parameter, user, var.config.getint('bot', 'max_track_playlist'), offset ]) self.async_download_next() elif command == var.config.get('command', 'play_radio') and parameter: if var.config.has_option('radio', parameter): parameter = var.config.get('radio', parameter) var.playlist.append(["radio", parameter, user]) self.async_download_next() elif command == var.config.get('command', 'help'): self.send_msg_channel(var.config.get('strings', 'help')) elif command == var.config.get('command', 'stop'): self.stop() elif command == var.config.get('command', 'kill'): if self.is_admin(user): self.stop() self.exit = True else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'update'): if not self.is_admin(user): self.mumble.users[text.actor].send_message( "Starting the update") tp = sp.check_output([ var.config.get('bot', 'pip3_path'), 'install', '--upgrade', 'youtube-dl' ]).decode() msg = "" if "Requirement already up-to-date" in tp: msg += "Youtube-dl is up-to-date" else: msg += "Update done : " + tp.split( 'Successfully installed')[1] if 'Your branch is up-to-date' in sp.check_output( ['/usr/bin/env', 'git', 'status']).decode(): msg += "<br /> Botamusique is up-to-date" else: msg += "<br /> Botamusique have available update" self.mumble.users[text.actor].send_message(msg) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'stop_and_getout'): self.stop() if self.channel: self.mumble.channels.find_by_name(self.channel).move_in() elif command == var.config.get('command', 'volume'): if parameter is not None and parameter.isdigit( ) and 0 <= int(parameter) <= 100: self.volume = float(float(parameter) / 100) self.send_msg_channel( var.config.get('strings', 'change_volume') % (int(self.volume * 100), self.mumble.users[text.actor]['name'])) var.db.set('bot', 'volume', str(self.volume)) else: self.send_msg_channel( var.config.get('strings', 'current_volume') % int(self.volume * 100)) elif command == var.config.get('command', 'current_music'): if var.current_music: source = var.current_music["type"] if source == "radio": reply = "[radio] {title} on {url} by {user}".format( title=media.get_radio_title( var.current_music["path"]), url=var.current_music["title"], user=var.current_music["user"]) elif source == "url": reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format( title=var.current_music["title"], url=var.current_music["path"], user=var.current_music["user"]) elif source == "file": reply = "[file] {title} by {user}".format( title=var.current_music["title"], user=var.current_music["user"]) elif source == "playlist": reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format( title=var.current_music["title"], url=var.current_music["path"], playlist=var.current_music["playlist_title"], user=var.current_music["user"]) else: reply = "(?)[{}] {} {} by {}".format( var.current_music["type"], var.current_music["path"], var.current_music["title"], var.current_music["user"]) else: reply = var.config.get('strings', 'not_playing') self.mumble.users[text.actor].send_message(reply) elif command == var.config.get('command', 'next'): if self.get_next(): self.launch_next() self.async_download_next() else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'queue_empty')) self.stop() elif command == var.config.get('command', 'list'): folder_path = var.config.get('bot', 'music_folder') files = util.get_recursive_filelist_sorted(folder_path) if files: self.mumble.users[text.actor].send_message( '<br>'.join(files)) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'no_file')) elif command == var.config.get('command', 'queue'): if len(var.playlist) == 0: msg = var.config.get('strings', 'queue_empty') else: msg = var.config.get('strings', 'queue_contents') + '<br />' for (music_type, path, user) in var.playlist: msg += '({}) {}<br />'.format(music_type, path) self.send_msg_channel(msg) elif command == var.config.get('command', 'repeat'): var.playlist.append([ var.current_music["type"], var.current_music["path"], var.current_music["user"] ]) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'bad_command'))
def message_received(self, text): message = text.message.strip() if message[0] == '!': message = message[1:].split(' ', 1) if len(message) > 0: command = message[0] parameter = '' if len(message) > 1: parameter = message[1] else: return logging.info(command + ' - ' + parameter + ' by ' + self.mumble.users[text.actor]['name']) if command == var.config.get('command', 'play_file') and parameter: music_folder = var.config.get('bot', 'music_folder') # sanitize "../" and so on path = os.path.abspath(os.path.join(music_folder, parameter)) if path.startswith(music_folder): if os.path.isfile(path): filename = path.replace(music_folder, '') var.playlist.append(["file", filename]) else: # try to do a partial match matches = [ file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower() ] if len(matches) == 0: self.mumble.users[text.actor].send_message( var.config.get('strings', 'no_file')) elif len(matches) == 1: var.playlist.append(["file", matches[0]]) else: msg = var.config.get('strings', 'multiple_matches') + '<br />' msg += '<br />'.join(matches) self.mumble.users[text.actor].send_message(msg) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'bad_file')) elif command == var.config.get('command', 'play_url') and parameter: var.playlist.append(["url", parameter]) elif command == var.config.get('command', 'play_radio') and parameter: if var.config.has_option('radio', parameter): parameter = var.config.get('radio', parameter) var.playlist.append(["radio", parameter]) elif command == var.config.get('command', 'help'): self.send_msg_channel(var.config.get('strings', 'help')) elif command == var.config.get('command', 'stop'): self.stop() elif command == var.config.get('command', 'kill'): if self.is_admin(text.actor): self.stop() self.exit = True else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'stop_and_getout'): self.stop() if self.channel: self.mumble.channels.find_by_name(self.channel).move_in() elif command == var.config.get('command', 'joinme'): self.mumble.users.myself.move_in( self.mumble.users[text.actor]['channel_id']) elif command == var.config.get('command', 'volume'): if parameter is not None and parameter.isdigit( ) and 0 <= int(parameter) <= 100: self.volume = float(float(parameter) / 100) self.send_msg_channel( var.config.get('strings', 'change_volume') % (int(self.volume * 100), self.mumble.users[text.actor]['name'])) else: self.send_msg_channel( var.config.get('strings', 'current_volume') % int(self.volume * 100)) elif command == var.config.get('command', 'current_music'): if var.current_music: source = var.current_music[0] if source == "radio": reply = "[radio] {title} sur {url}".format( title=media.get_radio_title(var.current_music[1]), url=var.current_music[2]) elif source == "url": reply = "[url] {title} (<a href=\"{url}\">{url}</a>)".format( title=var.current_music[2], url=var.current_music[1]) elif source == "file": reply = "[file] {title}".format( title=var.current_music[2]) else: reply = "(?)[{}] {} {}".format( var.current_music[0], var.current_music[1], var.current_music[2], ) else: reply = var.config.get('strings', 'not_playing') self.mumble.users[text.actor].send_message(reply) elif command == var.config.get('command', 'next'): if var.playlist: var.current_music = [ var.playlist[0][0], var.playlist[0][1], None, None ] var.playlist.pop(0) self.launch_next() else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'queue_empty')) self.stop() elif command == var.config.get('command', 'list'): folder_path = var.config.get('bot', 'music_folder') files = util.get_recursive_filelist_sorted(folder_path) if files: self.mumble.users[text.actor].send_message( '<br>'.join(files)) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'no_file')) elif command == var.config.get('command', 'queue'): if len(var.playlist) == 0: msg = var.config.get('strings', 'queue_empty') else: msg = var.config.get('strings', 'queue_contents') + '<br />' for (type, path) in var.playlist: msg += '({}) {}<br />'.format(type, path) self.send_msg_channel(msg) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'bad_command'))
def post(): folder_path = var.music_folder if request.method == 'POST': logging.debug("Post request: " + str(request.form)) if 'add_file_bottom' in request.form and ".." not in request.form[ 'add_file_bottom']: path = var.config.get( 'bot', 'music_folder') + request.form['add_file_bottom'] if os.path.isfile(path): item = { 'type': 'file', 'path': request.form['add_file_bottom'], 'title': '', 'user': '******' } var.playlist.append(util.get_music_tag_info(item)) logging.info('web: add to playlist(bottom): ' + item['path']) elif 'add_file_next' in request.form and ".." not in request.form[ 'add_file_next']: path = var.config.get( 'bot', 'music_folder') + request.form['add_file_next'] if os.path.isfile(path): item = { 'type': 'file', 'path': request.form['add_file_next'], 'title': '', 'user': '******' } var.playlist.insert(var.playlist.current_index + 1, util.get_music_tag_info(item)) logging.info('web: add to playlist(next): ' + item['path']) elif ('add_folder' in request.form and ".." not in request.form['add_folder']) or ( 'add_folder_recursively' in request.form and ".." not in request.form['add_folder_recursively']): try: folder = request.form['add_folder'] except: folder = request.form['add_folder_recursively'] if not folder.endswith('/'): folder += '/' print('folder:', folder) if os.path.isdir(var.config.get('bot', 'music_folder') + folder): files = util.get_recursive_filelist_sorted(var.music_folder) music_library = util.Dir(folder_path) for file in files: music_library.add_file(file) if 'add_folder_recursively' in request.form: files = music_library.get_files_recursively(folder) else: files = music_library.get_files(folder) files = list( map( lambda file: util.get_music_tag_info( { 'type': 'file', 'path': os.path.join(folder, file), 'user': '******' }), files)) for file in files: logging.info("web: add to playlist: %s" % file['path']) var.playlist.extend(files) elif 'add_url' in request.form: music = { 'type': 'url', 'url': request.form['add_url'], 'user': '******', 'ready': 'validation' } media.url.get_url_info(music) var.playlist.append(music) logging.info("web: add to playlist: " + request.form['add_url']) var.playlist.playlist[-1]['ready'] = "no" elif 'add_radio' in request.form: var.playlist.append({ 'type': 'radio', 'path': request.form['add_radio'], 'user': "******" }) logging.info("web: add to playlist: " + request.form['add_radio']) elif 'delete_music' in request.form: music = var.playlist.playlist[int(request.form['delete_music'])] logging.info( "web: delete from playlist: " + str(music['path'] if 'path' in music else music['url'])) if var.playlist.length() >= int(request.form['delete_music']): if int(request.form['delete_music'] ) == var.playlist.current_index: var.playlist.remove(int(request.form['delete_music'])) var.botamusique.stop() var.botamusique.launch_music( int(request.form['delete_music'])) else: var.playlist.remove(int(request.form['delete_music'])) elif 'play_music' in request.form: music = var.playlist.playlist[int(request.form['play_music'])] logging.info( "web: jump to: " + str(music['path'] if 'path' in music else music['url'])) if len(var.playlist.playlist) >= int(request.form['play_music']): var.botamusique.stop() var.botamusique.launch_music(int(request.form['play_music'])) elif 'delete_music_file' in request.form and ".." not in request.form[ 'delete_music_file']: path = var.config.get( 'bot', 'music_folder') + request.form['delete_music_file'] if os.path.isfile(path): logging.info("web: delete file " + path) os.remove(path) elif 'delete_folder' in request.form and ".." not in request.form[ 'delete_folder']: path = var.config.get( 'bot', 'music_folder') + request.form['delete_folder'] if os.path.isdir(path): logging.info("web: delete folder " + path) shutil.rmtree(path) time.sleep(0.1) elif 'action' in request.form: action = request.form['action'] if action == "randomize": var.botamusique.stop() var.playlist.randomize() var.botamusique.resume() elif action == "stop": var.botamusique.stop() elif action == "pause": var.botamusique.pause() elif action == "resume": var.botamusique.resume() elif action == "clear": var.botamusique.clear() elif action == "volume_up": if var.botamusique.volume_set + 0.03 < 1.0: var.botamusique.volume_set = var.botamusique.volume_set + 0.03 else: var.botamusique.volume_set = 1.0 logging.info("web: volume up to %d" % (var.botamusique.volume_set * 100)) elif action == "volume_down": if var.botamusique.volume_set - 0.03 > 0: var.botamusique.volume_set = var.botamusique.volume_set - 0.03 else: var.botamusique.volume_set = 0 logging.info("web: volume up to %d" % (var.botamusique.volume_set * 100)) if (var.playlist.length() > 0): return jsonify({ 'ver': var.playlist.version, 'empty': False, 'play': not var.botamusique.is_pause }) else: return jsonify({ 'ver': var.playlist.version, 'empty': True, 'play': False })
def message_received(self, text): message = text.message.strip() user = self.mumble.users[text.actor]['name'] if var.config.getboolean('command', 'split_username_at_space'): user = user.split()[0] if message[0] == var.config.get('command', 'command_symbol'): message = message[1:].split(' ', 1) if len(message) > 0: command = message[0] parameter = '' if len(message) > 1: parameter = message[1] else: return logging.info(command + ' - ' + parameter + ' by ' + user) if command == var.config.get('command', 'joinme'): self.mumble.users.myself.move_in( self.mumble.users[text.actor]['channel_id']) return if not self.is_admin(user) and not var.config.getboolean( 'bot', 'allow_other_channel_message' ) and self.mumble.users[text.actor][ 'channel_id'] != self.mumble.users.myself['channel_id']: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_in_my_channel')) return if not self.is_admin(user) and not var.config.getboolean( 'bot', 'allow_private_message') and text.session: self.mumble.users[text.actor].send_message( var.config.get('strings', 'pm_not_allowed')) return for i in var.db.items("user_ban"): if user.lower() == i[0]: self.mumble.users[text.actor].send_message( var.config.get('strings', 'user_ban')) return if command == var.config.get('command', 'user_ban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message( util.user_ban(parameter)) else: self.mumble.users[text.actor].send_message( util.get_user_ban()) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'user_unban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message( util.user_unban(parameter)) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'url_ban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message( util.url_ban(self.get_url_from_input(parameter))) else: self.mumble.users[text.actor].send_message( util.get_url_ban()) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'url_unban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_message( util.url_unban(self.get_url_from_input(parameter))) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) return if parameter: for i in var.db.items("url_ban"): if self.get_url_from_input(parameter.lower()) == i[0]: self.mumble.users[text.actor].send_message( var.config.get('strings', 'url_ban')) return if command == var.config.get('command', 'play_file') and parameter: music_folder = var.config.get('bot', 'music_folder') # sanitize "../" and so on path = os.path.abspath(os.path.join(music_folder, parameter)) if path.startswith(music_folder): if os.path.isfile(path): filename = path.replace(music_folder, '') music = { 'type': 'file', 'path': filename, 'user': user } var.playlist.append(music) else: # try to do a partial match matches = [ file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower() ] if len(matches) == 0: self.send_msg(var.config.get('strings', 'no_file'), text) elif len(matches) == 1: music = { 'type': 'file', 'path': matches[0], 'user': user } var.playlist.append(music) else: messages = var.config.get( 'strings', 'multiple_matches') + '<br />' messages += '<br />'.join(matches) self.send_msg(messages, text) else: self.send_msg(var.config.get('strings', 'bad_file'), text) self.async_download_next() elif command in [ var.config.get('command', 'play_url'), var.config.get('command', 'play_search') ] and parameter: if command == var.config.get('command', 'play_search'): parameter = media.url.search_youtube_url(parameter) if not parameter: self.send_msg( var.config.get('strings', 'unable_download'), text) return music = { 'type': 'url', 'url': self.get_url_from_input(parameter), 'user': user, 'ready': 'validation' } var.playlist.append(music) if media.url.get_url_info(): if var.playlist[-1]['duration'] > var.config.getint( 'bot', 'max_track_duration'): var.playlist.pop() self.send_msg(var.config.get('strings', 'too_long'), text) else: for i in var.db.options("url_ban"): print(i, ' -> ', {var.playlist[-1]["url"]}) if var.playlist[-1]['url'] == i: self.mumble.users[text.actor].send_message( var.config.get('strings', 'url_ban')) var.playlist.pop() return var.playlist[-1]['ready'] = "no" self.async_download_next() else: var.playlist.pop() self.send_msg(var.config.get('strings', 'unable_download'), text) elif command == var.config.get('command', 'play_playlist') and parameter: offset = 0 try: offset = int(parameter.split(" ")[-1]) except ValueError: pass if media.playlist.get_playlist_info( url=self.get_url_from_input(parameter), start_index=offset, user=user): self.async_download_next() elif command == var.config.get('command', 'play_autoplay') and parameter: parameter = media.url.search_youtube_url(parameter) music = { 'type': 'url', 'url': self.get_url_from_input(parameter), 'user': user, 'ready': 'validation' } var.playlist.append(music) for i in range(var.config.getint('bot', 'max_track_playlist')): if media.url.get_url_info(): if var.playlist[-1]['duration'] > var.config.getint( 'bot', 'max_track_duration'): var.playlist.pop() self.send_msg( var.config.get('strings', 'too_long'), text) else: for i in var.db.options("url_ban"): print(i, ' -> ', {var.playlist[-1]["url"]}) if var.playlist[-1]['url'] == i: self.mumble.users[text.actor].send_message( var.config.get('strings', 'url_ban')) var.playlist.pop() return var.playlist[-1]['ready'] = "no" self.async_download_next() parameter = media.url.get_youtube_recommendation( parameter) music = { 'type': 'url', 'url': self.get_url_from_input(parameter), 'user': user, 'ready': 'validation' } var.playlist.append(music) else: var.playlist.pop() self.send_msg( var.config.get('strings', 'unable_download'), text) elif command == var.config.get('command', 'play_radio') and parameter: if var.config.has_option('radio', parameter): parameter = var.config.get('radio', parameter) music = { 'type': 'radio', 'url': self.get_url_from_input(parameter), 'user': user } var.playlist.append(music) self.async_download_next() elif command == var.config.get('command', 'help'): self.send_msg(var.config.get('strings', 'help'), text) elif command == var.config.get('command', 'stop'): self.stop() elif command == var.config.get('command', 'kill'): if self.is_admin(user): self.stop() self.exit = True else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'update'): if self.is_admin(user): self.mumble.users[text.actor].send_message( "Starting the update") tp = sp.check_output([ var.config.get('bot', 'pip3_path'), 'install', '--upgrade', 'youtube-dl' ]).decode() messages = [] need_restart = False if "Requirement already up-to-date" in tp: messages.append("Youtube-dl is up-to-date") else: messages.append("Update done : " + tp.split('Successfully installed')[1]) if 'up to date' in sp.check_output( ['/usr/bin/git', 'pull']).decode(): messages.append("I'm up-to-date") else: messages.append("Updated source code, restarting..") need_restart = True self.mumble.users[text.actor].send_message( '<br>'.join(messages)) if need_restart: sp.check_output([ var.config.get('bot', 'pip3_path'), 'install', '-r', 'requirements.txt' ]).decode() os.execv(sys.executable, ['python'] + sys.argv) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'stop_and_getout'): self.stop() if self.channel: self.mumble.channels.find_by_name(self.channel).move_in() elif command == var.config.get('command', 'volume'): if parameter is not None and parameter.isdigit( ) and 0 <= int(parameter) <= 100: self.volume = float(float(parameter) / 100) self.send_msg( var.config.get('strings', 'change_volume') % (int(self.volume * 100), self.mumble.users[text.actor]['name']), text) var.db.set('bot', 'volume', str(self.volume)) else: self.send_msg( var.config.get('strings', 'current_volume') % int(self.volume * 100), text) elif command == var.config.get('command', 'current_music'): if len(var.playlist) > 0: source = var.playlist[0]["type"] if source == "radio": reply = "[radio] {title} on {url} by {user}".format( title=media.radio.get_radio_title( var.playlist[0]["url"]), url=var.playlist[0]["title"], user=var.playlist[0]["user"]) elif source == "url" and 'from_playlist' in var.playlist[0]: reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format( title=var.playlist[0]["title"], url=var.playlist[0]["playlist_url"], playlist=var.playlist[0]["playlist_title"], user=var.playlist[0]["user"]) elif source == "url": reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format( title=var.playlist[0]["title"], url=var.playlist[0]["url"], user=var.playlist[0]["user"]) elif source == "file": reply = "[file] {title} by {user}".format( title=var.playlist[0]["title"], user=var.playlist[0]["user"]) else: reply = "ERROR" logging.error(var.playlist) else: reply = var.config.get('strings', 'not_playing') self.send_msg(reply, text) elif command == var.config.get('command', 'skip'): if parameter == '': parameter = 0 elif parameter.isdigit(): parameter = int(parameter) else: self.send_msg(var.config.get('strings', 'no_possible'), text) return if len(var.playlist) > 0: removed = var.playlist.pop(parameter) removed = removed.get('title', removed['url']) self.send_msg( var.config.get('strings', 'removing_item') % removed, text) if len(var.playlist) == 0: self.stop() else: self.launch_music() self.async_download_next() if len(var.playlist) == 0: self.send_msg(var.config.get('strings', 'queue_empty'), text) elif command == var.config.get('command', 'list'): folder_path = var.config.get('bot', 'music_folder') files = util.get_recursive_filelist_sorted(folder_path) if files: self.send_msg('<br>'.join(files), text) else: self.send_msg(var.config.get('strings', 'no_file'), text) elif command == var.config.get('command', 'queue'): if len(var.playlist) <= 1: messages = var.config.get('strings', 'queue_empty') else: messages = var.config.get('strings', 'queue_contents') + '<br />' i = 1 for value in var.playlist[1:]: messages += '[{}] ({}) {}<br />'.format( i, value['type'], value['title'] if 'title' in value else value['url']) i += 1 self.send_msg(messages, text) elif command == var.config.get('command', 'repeat'): var.playlist.append(var.playlist[0]) else: self.mumble.users[text.actor].send_message( var.config.get('strings', 'bad_command'))
def index(): folder_path = var.music_folder files = util.get_recursive_filelist_sorted(var.music_folder) music_library = util.Dir(folder_path) for file in files: music_library.add_file(file) if request.method == 'POST': print(request.form) if 'add_file' in request.form and ".." not in request.form['add_file']: item = {'type': 'file', 'path' : request.form['add_file'], 'user' : 'Web'} var.playlist.append(item) elif ('add_folder' in request.form and ".." not in request.form['add_folder']) or ('add_folder_recursively' in request.form and ".." not in request.form['add_folder_recursively']): try: folder = request.form['add_folder'] except: folder = request.form['add_folder_recursively'] if not folder.endswith('/'): folder += '/' print('folder:', folder) if 'add_folder_recursively' in request.form: files = music_library.get_files_recursively(folder) else: files = music_library.get_files(folder) files = list(map(lambda file: {'type':'file','path': os.path.join(folder, file), 'user':'******'}, files)) print('Adding to playlist: ', files) var.playlist.extend(files) elif 'add_url' in request.form: var.playlist.append({'type':'url', 'url': request.form['add_url'], 'user': '******', 'ready': 'validation'}) media.url.get_url_info() var.playlist[-1]['ready'] = "no" elif 'add_radio' in request.form: var.playlist.append({'type': 'radio', 'path': request.form['add_radio'], 'user': "******"}) elif 'delete_music' in request.form: if len(var.playlist) >= request.form['delete_music']: var.playlist.pop(request.form['delete_music']) elif 'action' in request.form: action = request.form['action'] if action == "randomize": random.shuffle(var.playlist) return render_template('index.html', all_files=files, music_library=music_library, os=os, playlist=var.playlist, user=var.user)
def cmd_play_file(bot, user, text, command, parameter): music_folder = var.config.get('bot', 'music_folder') # if parameter is {index} if parameter.isdigit(): files = util.get_recursive_filelist_sorted(music_folder) if int(parameter) < len(files): filename = files[int(parameter)].replace(music_folder, '') music = {'type': 'file', 'path': filename, 'user': user} logging.info("cmd: add to playlist: " + filename) var.playlist.append(music) bot.send_msg(var.config.get('strings', 'file_added') + music['title'], text) # if parameter is {path} else: # sanitize "../" and so on path = os.path.abspath(os.path.join(music_folder, parameter)) if not path.startswith(os.path.abspath(music_folder)): bot.send_msg(var.config.get('strings', 'no_file'), text) return if os.path.isfile(path): music = {'type': 'file', 'path': parameter, 'user': user} logging.info("cmd: add to playlist: " + parameter) music = var.playlist.append(music) bot.send_msg(var.config.get('strings', 'file_added') + music['title'], text) return # if parameter is {folder} elif os.path.isdir(path): if parameter != '.' and parameter != './': if not parameter.endswith("/"): parameter += "/" else: parameter = "" files = util.get_recursive_filelist_sorted(music_folder) music_library = util.Dir(music_folder) for file in files: music_library.add_file(file) files = music_library.get_files(parameter) msgs = [var.config.get('strings', 'file_added')] count = 0 for file in files: count += 1 music = {'type': 'file', 'path': file, 'user': user} logging.info("cmd: add to playlist: " + file) music = var.playlist.append(music) msgs.append("{} ({})".format(music['title'], music['path'])) if count != 0: send_multi_lines(bot, msgs, text) else: bot.send_msg(var.config.get('strings', 'no_file'), text) else: # try to do a partial match files = util.get_recursive_filelist_sorted(music_folder) matches = [(index, file) for index, file in enumerate(files) if parameter.lower() in file.lower()] if len(matches) == 0: bot.send_msg(var.config.get( 'strings', 'no_file'), text) elif len(matches) == 1: music = {'type': 'file', 'path': matches[0][1], 'user': user} logging.info("cmd: add to playlist: " + matches[0][1]) music = var.playlist.append(music) bot.send_msg(var.config.get( 'strings', 'file_added') + "{} ({})".format(music['title'], music['path']), text) else: msgs = [ var.config.get('strings', 'multiple_matches') ] for match in matches: msgs.append("<b>{:0>3d}</b> - {:s}".format(match[0], match[1])) send_multi_lines(bot, msgs, text)
def message_received(self, text): message = text.message.strip() user = self.mumble.users[text.actor]['name'] if var.config.getboolean('command', 'split_username_at_space'): # in can you use https://github.com/Natenom/mumblemoderator-module-collection/tree/master/os-suffixes , you want to split the username user = user.split()[0] if message[0] == var.config.get('command', 'command_symbol'): # remove the symbol from the message message = message[1:].split(' ', 1) # use the first word as a command, the others one as parameters if len(message) > 0: command = message[0] parameter = '' if len(message) > 1: parameter = message[1] else: return logging.info(command + ' - ' + parameter + ' by ' + user) if command == var.config.get('command', 'joinme'): self.mumble.users.myself.move_in( self.mumble.users[text.actor]['channel_id'], token=parameter) return # Anti stupid guy function if not self.is_admin(user) and not var.config.getboolean( 'bot', 'allow_other_channel_message' ) and self.mumble.users[text.actor][ 'channel_id'] != self.mumble.users.myself['channel_id']: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_in_my_channel')) return if not self.is_admin(user) and not var.config.getboolean( 'bot', 'allow_private_message') and text.session: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'pm_not_allowed')) return ### # Admin command ### for i in var.db.items("user_ban"): if user.lower() == i[0]: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'user_ban')) return if command == var.config.get('command', 'user_ban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_text_message( util.user_ban(parameter)) else: self.mumble.users[text.actor].send_text_message( util.get_user_ban()) else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'user_unban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_text_message( util.user_unban(parameter)) else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'url_ban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_text_message( util.url_ban(self.get_url_from_input(parameter))) else: self.mumble.users[text.actor].send_text_message( util.get_url_ban()) else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_admin')) return elif command == var.config.get('command', 'url_unban'): if self.is_admin(user): if parameter: self.mumble.users[text.actor].send_text_message( util.url_unban(self.get_url_from_input(parameter))) else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_admin')) return if parameter: for i in var.db.items("url_ban"): if self.get_url_from_input(parameter.lower()) == i[0]: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'url_ban')) return ### # everyday commands ### if command == var.config.get('command', 'play_file') and parameter: music_folder = var.config.get('bot', 'music_folder') # sanitize "../" and so on path = os.path.abspath(os.path.join(music_folder, parameter)) if path.startswith(music_folder): if os.path.isfile(path): filename = path.replace(music_folder, '') music = { 'type': 'file', 'path': filename, 'user': user } var.playlist.append(music) else: # try to do a partial match matches = [ file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower() ] if len(matches) == 0: self.send_msg(var.config.get('strings', 'no_file'), text) elif len(matches) == 1: music = { 'type': 'file', 'path': matches[0], 'user': user } var.playlist.append(music) else: msg = var.config.get('strings', 'multiple_matches') + '<br />' msg += '<br />'.join(matches) self.send_msg(msg, text) else: self.send_msg(var.config.get('strings', 'bad_file'), text) self.async_download_next() elif command == var.config.get('command', 'play_url') and parameter: music = { 'type': 'url', # grab the real URL 'url': self.get_url_from_input(parameter), 'user': user, 'ready': 'validation' } var.playlist.append(music) if media.url.get_url_info(): if var.playlist[-1]['duration'] > var.config.getint( 'bot', 'max_track_duration'): var.playlist.pop() self.send_msg(var.config.get('strings', 'too_long'), text) else: for i in var.db.options("url_ban"): if var.playlist[-1]['url'] == i: self.mumble.users[ text.actor].send_text_message( var.config.get('strings', 'url_ban')) var.playlist.pop() return var.playlist[-1]['ready'] = "no" self.async_download_next() else: var.playlist.pop() self.send_msg(var.config.get('strings', 'unable_download'), text) elif command == var.config.get('command', 'play_playlist') and parameter: offset = 1 # if you want to start the playlist at a specific index try: offset = int(parameter.split(" ")[-1]) except ValueError: pass if media.playlist.get_playlist_info( url=self.get_url_from_input(parameter), start_index=offset, user=user): self.async_download_next() elif command == var.config.get('command', 'play_radio'): if not parameter: all_radio = var.config.items('radio') msg = var.config.get('strings', 'preconfigurated_radio') + " :" for i in all_radio: comment = "" if len(i[1].split(maxsplit=1)) == 2: comment = " - " + i[1].split(maxsplit=1)[1] msg += "<br />" + i[0] + comment self.send_msg(msg, text) else: if var.config.has_option('radio', parameter): parameter = var.config.get('radio', parameter) parameter = parameter.split()[0] url = self.get_url_from_input(parameter) if url: music = {'type': 'radio', 'url': url, 'user': user} var.playlist.append(music) self.async_download_next() else: self.send_msg(var.config.get('strings', 'bad_url')) # query http://www.radio-browser.info API for a radio station elif command == var.config.get('command', 'rb_query'): logging.info('Querying radio stations') if not parameter: logging.debug('rbquery without parameter') msg += 'You have to add a query text to search for a matching radio stations.' self.send_msg(msg, text) else: logging.debug('Found query parameter: ' + parameter) # self.send_msg('Searching for stations - this may take some seconds...', text) rb_stations = radiobrowser.getstations_byname(parameter) msg = var.config.get('strings', 'rbqueryresult') + " :" msg += '\n<table><tr><th>!rbplay ID</th><th>Station Name</th><th>Genre</th><th>Codec/Bitrate</th><th>Country</th></tr>' if not rb_stations: logging.debug('No matches found for rbquery ' + parameter) self.send_msg( 'Radio-Browser found no matches for ' + parameter, text) else: for s in rb_stations: stationid = s['id'] stationname = s['stationname'] country = s['country'] codec = s['codec'] bitrate = s['bitrate'] genre = s['genre'] # msg += f'<tr><td>{stationid}</td><td>{stationname}</td><td>{genre}</td><td>{codec}/{bitrate}</td><td>{country}</td></tr>' msg += '<tr><td>%s</td><td>%s</td><td>%s</td><td>%s/%s</td><td>%s</td></tr>' % ( stationid, stationname, genre, codec, bitrate, country) msg += '</table>' # Full message as html table if len(msg) <= 5000: self.send_msg(msg, text) # Shorten message if message too long (stage I) else: logging.debug('Result too long stage I') msg = var.config.get( 'strings', 'rbqueryresult') + " :" + ' (shortened L1)' msg += '\n<table><tr><th>!rbplay ID</th><th>Station Name</th></tr>' for s in rb_stations: stationid = s['id'] stationname = s['stationname'] # msg += f'<tr><td>{stationid}</td><td>{stationname}</td>' msg += '<tr><td>%s</td><td>%s</td>' % ( stationid, stationname) msg += '</table>' if len(msg) <= 5000: self.send_msg(msg, text) # Shorten message if message too long (stage II) else: logging.debug('Result too long stage II') msg = var.config.get( 'strings', 'rbqueryresult') + " :" + ' (shortened L2)' msg += '!rbplay ID - Station Name' for s in rb_stations: stationid = s['id'] stationname = s['stationname'][:12] # msg += f'{stationid} - {stationname}' msg += '%s - %s' % (stationid, stationname) if len(msg) <= 5000: self.send_msg(msg, text) # Message still too long else: self.send_msg( 'Query result too long to post (> 5000 characters), please try another query.', text) # Play a secific station (by id) from http://www.radio-browser.info API elif command == var.config.get('command', 'rb_play'): logging.debug('Play a station by ID') if not parameter: logging.debug('rbplay without parameter') msg += 'Please enter a station ID from rbquery. Example: !rbplay 96748' self.send_msg(msg, text) else: logging.debug('Retreiving url for station ID ' + parameter) rstation = radiobrowser.getstationname_byid(parameter) stationname = rstation[0]['name'] country = rstation[0]['country'] codec = rstation[0]['codec'] bitrate = rstation[0]['bitrate'] genre = rstation[0]['tags'] homepage = rstation[0]['homepage'] msg = 'Radio station added to playlist:' # msg += '<table><tr><th>ID</th><th>Station Name</th><th>Genre</th><th>Codec/Bitrate</th><th>Country</th><th>Homepage</th></tr>' + \ # f'<tr><td>{parameter}</td><td>{stationname}</td><td>{genre}</td><td>{codec}/{bitrate}</td><td>{country}</td><td>{homepage}</td></tr></table>' msg += '<table><tr><th>ID</th><th>Station Name</th><th>Genre</th><th>Codec/Bitrate</th><th>Country</th><th>Homepage</th></tr>' + \ '<tr><td>%s</td><td>%s</td><td>%s</td><td>%s/%s</td><td>%s</td><td>%s</td></tr></table>' \ % (parameter, stationname, genre, codec, bitrate, country, homepage) logging.debug('Added station to playlist %s' % stationname) self.send_msg(msg, text) url = radiobrowser.geturl_byid(parameter) if url != "-1": logging.info('Found url: ' + url) music = {'type': 'radio', 'url': url, 'user': user} var.playlist.append(music) self.async_download_next() else: logging.info('No playable url found.') msg += "No playable url found for this station, please try another station." self.send_msg(msg, text) elif command == var.config.get('command', 'help'): self.send_msg(var.config.get('strings', 'help'), text) if self.is_admin(user): self.send_msg(var.config.get('strings', 'admin_help'), text) elif command == var.config.get('command', 'stop'): self.stop() elif command == var.config.get('command', 'kill'): if self.is_admin(user): self.stop() self.exit = True else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'update'): if self.is_admin(user): self.mumble.users[text.actor].send_text_message( "Starting the update") # Need to be improved msg = util.update(version) self.mumble.users[text.actor].send_text_message(msg) else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'not_admin')) elif command == var.config.get('command', 'stop_and_getout'): self.stop() if self.channel: self.mumble.channels.find_by_name(self.channel).move_in() elif command == var.config.get('command', 'volume'): # The volume is a percentage if parameter is not None and parameter.isdigit( ) and 0 <= int(parameter) <= 100: self.volume = float(float(parameter) / 100) self.send_msg( var.config.get('strings', 'change_volume') % (int(self.volume * 100), self.mumble.users[text.actor]['name']), text) var.db.set('bot', 'volume', str(self.volume)) else: self.send_msg( var.config.get('strings', 'current_volume') % int(self.volume * 100), text) elif command == var.config.get('command', 'current_music'): if len(var.playlist) > 0: source = var.playlist[0]["type"] if source == "radio": reply = "[radio] {title} on {url} by {user}".format( title=media.radio.get_radio_title( var.playlist[0]["url"]), url=var.playlist[0]["title"], user=var.playlist[0]["user"]) elif source == "url" and 'from_playlist' in var.playlist[0]: reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format( title=var.playlist[0]["title"], url=var.playlist[0]["playlist_url"], playlist=var.playlist[0]["playlist_title"], user=var.playlist[0]["user"]) elif source == "url": reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format( title=var.playlist[0]["title"], url=var.playlist[0]["url"], user=var.playlist[0]["user"]) elif source == "file": reply = "[file] {title} by {user}".format( title=var.playlist[0]["title"], user=var.playlist[0]["user"]) else: reply = "ERROR" logging.error(var.playlist) else: reply = var.config.get('strings', 'not_playing') self.send_msg(reply, text) elif command == var.config.get('command', 'skip'): # Allow to remove specific music into the queue with a number if parameter is not None and parameter.isdigit( ) and int(parameter) > 0: if int(parameter) < len(var.playlist): removed = var.playlist.pop(int(parameter)) # the Title isn't here if the music wasn't downloaded self.send_msg( var.config.get('strings', 'removing_item') % (removed['title'] if 'title' in removed else removed['url']), text) else: self.send_msg(var.config.get('strings', 'no_possible'), text) elif self.next( ): # Is no number send, just skip the current music self.launch_music() self.async_download_next() else: self.send_msg(var.config.get('strings', 'queue_empty'), text) self.stop() elif command == var.config.get('command', 'list'): folder_path = var.config.get('bot', 'music_folder') files = util.get_recursive_filelist_sorted(folder_path) if files: self.send_msg('<br>'.join(files), text) else: self.send_msg(var.config.get('strings', 'no_file'), text) elif command == var.config.get('command', 'queue'): if len(var.playlist) <= 1: msg = var.config.get('strings', 'queue_empty') else: msg = var.config.get('strings', 'queue_contents') + '<br />' i = 1 for value in var.playlist[1:]: msg += '[{}] ({}) {}<br />'.format( i, value['type'], value['title'] if 'title' in value else value['url']) i += 1 self.send_msg(msg, text) elif command == var.config.get('command', 'repeat'): var.playlist.append(var.playlist[0]) else: self.mumble.users[text.actor].send_text_message( var.config.get('strings', 'bad_command'))