26
									
								
								interface.py
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								interface.py
									
									
									
									
									
								
							@@ -69,7 +69,7 @@ def index():
 | 
				
			|||||||
    if request.method == 'POST':
 | 
					    if request.method == 'POST':
 | 
				
			||||||
        print(request.form)
 | 
					        print(request.form)
 | 
				
			||||||
        if 'add_file' in request.form and ".." not in request.form['add_file']:
 | 
					        if 'add_file' in request.form and ".." not in request.form['add_file']:
 | 
				
			||||||
            item = ('file', request.form['add_file'], datetime.now().timestamp())
 | 
					            item = ('file', request.form['add_file'], 'Web')
 | 
				
			||||||
            var.playlist.append(item)
 | 
					            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']):
 | 
					        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']):
 | 
				
			||||||
@@ -86,15 +86,15 @@ def index():
 | 
				
			|||||||
                files = music_library.get_files_recursively(folder)
 | 
					                files = music_library.get_files_recursively(folder)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                files = music_library.get_files(folder)
 | 
					                files = music_library.get_files(folder)
 | 
				
			||||||
            files = list(map(lambda file: ('file', os.path.join(folder, file), datetime.now().timestamp()), files))
 | 
					            files = list(map(lambda file: ('file', os.path.join(folder, file), 'Web'), files))
 | 
				
			||||||
            print('Adding to playlist: ', files)
 | 
					            print('Adding to playlist: ', files)
 | 
				
			||||||
            var.playlist.extend(files)
 | 
					            var.playlist.extend(files)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif 'add_url' in request.form:
 | 
					        elif 'add_url' in request.form:
 | 
				
			||||||
            var.playlist.append(['url', request.form['add_url']])
 | 
					            var.playlist.append(['url', request.form['add_url'], "Web"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif 'add_radio' in request.form:
 | 
					        elif 'add_radio' in request.form:
 | 
				
			||||||
            var.playlist.append(['radio', request.form['add_radio']])
 | 
					            var.playlist.append(['radio', request.form['add_radio'], "Web"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif 'delete_music' in request.form:
 | 
					        elif 'delete_music' in request.form:
 | 
				
			||||||
            for item in var.playlist:
 | 
					            for item in var.playlist:
 | 
				
			||||||
@@ -107,32 +107,32 @@ def index():
 | 
				
			|||||||
                random.shuffle(var.playlist)
 | 
					                random.shuffle(var.playlist)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if var.current_music:
 | 
					    if var.current_music:
 | 
				
			||||||
        source = var.current_music[0]
 | 
					        source = var.current_music['type']
 | 
				
			||||||
        # format for current_music below:
 | 
					        # format for current_music below:
 | 
				
			||||||
        # (sourcetype, title, url or None)
 | 
					        # (sourcetype, title, url or None)
 | 
				
			||||||
        if source == "radio":
 | 
					        if source == "radio":
 | 
				
			||||||
            current_music = (
 | 
					            current_music = (
 | 
				
			||||||
                "[radio]",
 | 
					                "[radio]",
 | 
				
			||||||
                media.get_radio_title(var.current_music[1]),
 | 
					                media.get_radio_title(var.current_music['path']),
 | 
				
			||||||
                var.current_music[2]
 | 
					                var.current_music['title']
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        elif source == "url":
 | 
					        elif source == "url":
 | 
				
			||||||
            current_music = (
 | 
					            current_music = (
 | 
				
			||||||
                "[url]",
 | 
					                "[url]",
 | 
				
			||||||
                var.current_music[2],
 | 
					                var.current_music['title'],
 | 
				
			||||||
                var.current_music[1]
 | 
					                var.current_music['path']
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        elif source == "file":
 | 
					        elif source == "file":
 | 
				
			||||||
            current_music = (
 | 
					            current_music = (
 | 
				
			||||||
                "[file]",
 | 
					                "[file]",
 | 
				
			||||||
                var.current_music[2],
 | 
					                var.current_music['title'],
 | 
				
			||||||
                None
 | 
					                None
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            current_music = (
 | 
					            current_music = (
 | 
				
			||||||
                "(??)[" + var.current_music[0] + "]",
 | 
					                "(??)[" + var.current_music['type'] + "]",
 | 
				
			||||||
                var.current_music[1],
 | 
					                var.current_music['path'],
 | 
				
			||||||
                var.current_music[2],
 | 
					                var.current_music['title'],
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        current_music = None
 | 
					        current_music = None
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										88
									
								
								mumbleBot.py
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								mumbleBot.py
									
									
									
									
									
								
							@@ -28,7 +28,7 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.volume = var.config.getfloat('bot', 'volume')
 | 
					        self.volume = var.config.getfloat('bot', 'volume')
 | 
				
			||||||
        self.channel = args.channel
 | 
					        self.channel = args.channel
 | 
				
			||||||
        var.current_music = None
 | 
					        var.current_music = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        FORMAT = '%(asctime)s: %(message)s'
 | 
					        FORMAT = '%(asctime)s: %(message)s'
 | 
				
			||||||
        if args.quiet:
 | 
					        if args.quiet:
 | 
				
			||||||
@@ -38,18 +38,20 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        ######
 | 
					        ######
 | 
				
			||||||
        ## Format of the Playlist :
 | 
					        ## Format of the Playlist :
 | 
				
			||||||
        ## [("<type>","<path>")]
 | 
					        ## [("<type>","<path/url>")]
 | 
				
			||||||
        ## [("<radio>","<luna>"), ("<youtube>","<url>")]
 | 
					 | 
				
			||||||
        ## types : file, radio, url
 | 
					        ## types : file, radio, url
 | 
				
			||||||
        ######
 | 
					        ######
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ######
 | 
					        ######
 | 
				
			||||||
        ## Format of the current_music variable
 | 
					        ## Format of the current_music variable
 | 
				
			||||||
 | 
					        # var.current_music = { "type" : str,
 | 
				
			||||||
 | 
					        #                        "path" : str,
 | 
				
			||||||
 | 
					        #                        "title" : str,
 | 
				
			||||||
 | 
					        #                        "user" : str }
 | 
				
			||||||
        # len(var.current_music) = 4
 | 
					        # len(var.current_music) = 4
 | 
				
			||||||
        # var.current_music[0] = <Type>
 | 
					        # var.current_music["type"] = <Type>
 | 
				
			||||||
        # var.current_music[1] = <url> if url of radio
 | 
					        # var.current_music["path"] = <url> if youtube/radio, <path> if file
 | 
				
			||||||
        # var.current_music[2] = <title>
 | 
					        # var.current_music["title"] = <title>
 | 
				
			||||||
        # var.current_music[3] = <path> if url or file
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var.playlist = []
 | 
					        var.playlist = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,6 +115,7 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def message_received(self, text):
 | 
					    def message_received(self, text):
 | 
				
			||||||
        message = text.message.strip()
 | 
					        message = text.message.strip()
 | 
				
			||||||
 | 
					        user = self.mumble.users[text.actor]['name']
 | 
				
			||||||
        if message[0] == '!':
 | 
					        if message[0] == '!':
 | 
				
			||||||
            message = message[1:].split(' ', 1)
 | 
					            message = message[1:].split(' ', 1)
 | 
				
			||||||
            if len(message) > 0:
 | 
					            if len(message) > 0:
 | 
				
			||||||
@@ -123,7 +126,7 @@ class MumbleBot:
 | 
				
			|||||||
            else:
 | 
					            else:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            logging.info(command + ' - ' + parameter + ' by ' + self.mumble.users[text.actor]['name'])
 | 
					            logging.info(command + ' - ' + parameter + ' by ' + user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if command == var.config.get('command', 'play_file') and parameter:
 | 
					            if command == var.config.get('command', 'play_file') and parameter:
 | 
				
			||||||
                music_folder = var.config.get('bot', 'music_folder')
 | 
					                music_folder = var.config.get('bot', 'music_folder')
 | 
				
			||||||
@@ -132,14 +135,14 @@ class MumbleBot:
 | 
				
			|||||||
                if path.startswith(music_folder):
 | 
					                if path.startswith(music_folder):
 | 
				
			||||||
                    if os.path.isfile(path):
 | 
					                    if os.path.isfile(path):
 | 
				
			||||||
                        filename = path.replace(music_folder, '')
 | 
					                        filename = path.replace(music_folder, '')
 | 
				
			||||||
                        var.playlist.append(["file", filename])
 | 
					                        var.playlist.append(["file", filename, user])
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        # try to do a partial match
 | 
					                        # try to do a partial match
 | 
				
			||||||
                        matches = [file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower()]
 | 
					                        matches = [file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower()]
 | 
				
			||||||
                        if len(matches) == 0:
 | 
					                        if len(matches) == 0:
 | 
				
			||||||
                            self.mumble.users[text.actor].send_message(var.config.get('strings', 'no_file'))
 | 
					                            self.mumble.users[text.actor].send_message(var.config.get('strings', 'no_file'))
 | 
				
			||||||
                        elif len(matches) == 1:
 | 
					                        elif len(matches) == 1:
 | 
				
			||||||
                            var.playlist.append(["file", matches[0]])
 | 
					                            var.playlist.append(["file", matches[0], user])
 | 
				
			||||||
                        else:
 | 
					                        else:
 | 
				
			||||||
                            msg = var.config.get('strings', 'multiple_matches') + '<br />'
 | 
					                            msg = var.config.get('strings', 'multiple_matches') + '<br />'
 | 
				
			||||||
                            msg += '<br />'.join(matches)
 | 
					                            msg += '<br />'.join(matches)
 | 
				
			||||||
@@ -148,12 +151,12 @@ class MumbleBot:
 | 
				
			|||||||
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_file'))
 | 
					                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_file'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            elif command == var.config.get('command', 'play_url') and parameter:
 | 
					            elif command == var.config.get('command', 'play_url') and parameter:
 | 
				
			||||||
                var.playlist.append(["url", parameter])
 | 
					                var.playlist.append(["url", parameter, user])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            elif command == var.config.get('command', 'play_radio') and parameter:
 | 
					            elif command == var.config.get('command', 'play_radio') and parameter:
 | 
				
			||||||
                if var.config.has_option('radio', parameter):
 | 
					                if var.config.has_option('radio', parameter):
 | 
				
			||||||
                    parameter = var.config.get('radio', parameter)
 | 
					                    parameter = var.config.get('radio', parameter)
 | 
				
			||||||
                var.playlist.append(["radio", parameter])
 | 
					                var.playlist.append(["radio", parameter, user])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            elif command == var.config.get('command', 'help'):
 | 
					            elif command == var.config.get('command', 'help'):
 | 
				
			||||||
                self.send_msg_channel(var.config.get('strings', 'help'))
 | 
					                self.send_msg_channel(var.config.get('strings', 'help'))
 | 
				
			||||||
@@ -186,24 +189,29 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            elif command == var.config.get('command', 'current_music'):
 | 
					            elif command == var.config.get('command', 'current_music'):
 | 
				
			||||||
                if var.current_music:
 | 
					                if var.current_music:
 | 
				
			||||||
                    source = var.current_music[0]
 | 
					                    source = var.current_music["type"]
 | 
				
			||||||
                    if source == "radio":
 | 
					                    if source == "radio":
 | 
				
			||||||
                        reply = "[radio] {title} sur {url}".format(
 | 
					                        reply = "[radio] {title} on {url} by {user}".format(
 | 
				
			||||||
                            title=media.get_radio_title(var.current_music[1]),
 | 
					                            title=media.get_radio_title(var.current_music["path"]),
 | 
				
			||||||
                            url=var.current_music[2]
 | 
					                            url=var.current_music["title"],
 | 
				
			||||||
 | 
					                            user=var.current_music["user"]
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                    elif source == "url":
 | 
					                    elif source == "url":
 | 
				
			||||||
                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>)".format(
 | 
					                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format(
 | 
				
			||||||
                            title=var.current_music[2],
 | 
					                            title=var.current_music["title"],
 | 
				
			||||||
                            url=var.current_music[1]
 | 
					                            url=var.current_music["path"],
 | 
				
			||||||
 | 
					                            user=var.current_music["user"]
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                    elif source == "file":
 | 
					                    elif source == "file":
 | 
				
			||||||
                        reply = "[file] {title}".format(title=var.current_music[2])
 | 
					                        reply = "[file] {title} by {user}".format(
 | 
				
			||||||
 | 
					                            title=var.current_music["title"],
 | 
				
			||||||
 | 
					                            user=var.current_music["user"])
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        reply = "(?)[{}] {} {}".format(
 | 
					                        reply = "(?)[{}] {} {} by {}".format(
 | 
				
			||||||
                            var.current_music[0],
 | 
					                            var.current_music["type"],
 | 
				
			||||||
                            var.current_music[1],
 | 
					                            var.current_music["path"],
 | 
				
			||||||
                            var.current_music[2],
 | 
					                            var.current_music["title"],
 | 
				
			||||||
 | 
					                            var.current_music["user"]
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    reply = var.config.get('strings', 'not_playing')
 | 
					                    reply = var.config.get('strings', 'not_playing')
 | 
				
			||||||
@@ -212,7 +220,10 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            elif command == var.config.get('command', 'next'):
 | 
					            elif command == var.config.get('command', 'next'):
 | 
				
			||||||
                if var.playlist:
 | 
					                if var.playlist:
 | 
				
			||||||
                    var.current_music = [var.playlist[0][0], var.playlist[0][1], None, None]
 | 
					                    var.current_music = {'type': var.playlist[0][0],
 | 
				
			||||||
 | 
					                                         'path': var.playlist[0][1],
 | 
				
			||||||
 | 
					                                         'title': None,
 | 
				
			||||||
 | 
					                                         'user': var.playlist[0][2]}
 | 
				
			||||||
                    var.playlist.pop(0)
 | 
					                    var.playlist.pop(0)
 | 
				
			||||||
                    self.launch_next()
 | 
					                    self.launch_next()
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
@@ -237,6 +248,10 @@ class MumbleBot:
 | 
				
			|||||||
                        msg += '({}) {}<br />'.format(type, path)
 | 
					                        msg += '({}) {}<br />'.format(type, path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                self.send_msg_channel(msg)
 | 
					                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:
 | 
					            else:
 | 
				
			||||||
                self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_command'))
 | 
					                self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_command'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -261,13 +276,13 @@ class MumbleBot:
 | 
				
			|||||||
    def launch_next(self):
 | 
					    def launch_next(self):
 | 
				
			||||||
        path = ""
 | 
					        path = ""
 | 
				
			||||||
        title = ""
 | 
					        title = ""
 | 
				
			||||||
        if var.current_music[0] == "url":
 | 
					        if var.current_music["type"] == "url":
 | 
				
			||||||
            url = media.get_url(var.current_music[1])
 | 
					            url = media.get_url(var.current_music["path"])
 | 
				
			||||||
            if not url:
 | 
					            if not url:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            media.clear_tmp_folder(var.config.get('bot', 'tmp_folder'), var.config.getint('bot', 'tmp_folder_max_size'))
 | 
					            media.clear_tmp_folder(var.config.get('bot', 'tmp_folder'), var.config.getint('bot', 'tmp_folder_max_size'))
 | 
				
			||||||
            path, title = self.download_music(url)
 | 
					            path, title = self.download_music(url)
 | 
				
			||||||
            var.current_music[1] = url
 | 
					            var.current_music["path"] = url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            path_thumbnail = var.config.get('bot', 'tmp_folder') + hashlib.md5(url.encode()).hexdigest() + '.jpg'
 | 
					            path_thumbnail = var.config.get('bot', 'tmp_folder') + hashlib.md5(url.encode()).hexdigest() + '.jpg'
 | 
				
			||||||
            thumbnail_html = ""
 | 
					            thumbnail_html = ""
 | 
				
			||||||
@@ -282,15 +297,15 @@ class MumbleBot:
 | 
				
			|||||||
            logging.debug(thumbnail_html)
 | 
					            logging.debug(thumbnail_html)
 | 
				
			||||||
            self.send_msg_channel(var.config.get('strings', 'now_playing') % (title, thumbnail_html))
 | 
					            self.send_msg_channel(var.config.get('strings', 'now_playing') % (title, thumbnail_html))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif var.current_music[0] == "file":
 | 
					        elif var.current_music["type"] == "file":
 | 
				
			||||||
            path = var.config.get('bot', 'music_folder') + var.current_music[1]
 | 
					            path = var.config.get('bot', 'music_folder') + var.current_music["path"]
 | 
				
			||||||
            title = var.current_music[1]
 | 
					            title = var.current_music["path"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif var.current_music[0] == "radio":
 | 
					        elif var.current_music["type"] == "radio":
 | 
				
			||||||
            url = media.get_url(var.current_music[1])
 | 
					            url = media.get_url(var.current_music["path"])
 | 
				
			||||||
            if not url:
 | 
					            if not url:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            var.current_music[1] = url
 | 
					            var.current_music["path"] = url
 | 
				
			||||||
            path = url
 | 
					            path = url
 | 
				
			||||||
            title = media.get_radio_server_description(url)
 | 
					            title = media.get_radio_server_description(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -301,8 +316,7 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        command = ["ffmpeg", '-v', ffmpeg_debug, '-nostdin', '-i', path, '-ac', '1', '-f', 's16le', '-ar', '48000', '-']
 | 
					        command = ["ffmpeg", '-v', ffmpeg_debug, '-nostdin', '-i', path, '-ac', '1', '-f', 's16le', '-ar', '48000', '-']
 | 
				
			||||||
        self.thread = sp.Popen(command, stdout=sp.PIPE, bufsize=480)
 | 
					        self.thread = sp.Popen(command, stdout=sp.PIPE, bufsize=480)
 | 
				
			||||||
        var.current_music[2] = title
 | 
					        var.current_music["title"] = title
 | 
				
			||||||
        var.current_music[3] = path
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def download_music(self, url):
 | 
					    def download_music(self, url):
 | 
				
			||||||
        url_hash = hashlib.md5(url.encode()).hexdigest()
 | 
					        url_hash = hashlib.md5(url.encode()).hexdigest()
 | 
				
			||||||
@@ -348,7 +362,7 @@ class MumbleBot:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            if self.thread is None or not raw_music:
 | 
					            if self.thread is None or not raw_music:
 | 
				
			||||||
                if len(var.playlist) != 0:
 | 
					                if len(var.playlist) != 0:
 | 
				
			||||||
                    var.current_music = [var.playlist[0][0], var.playlist[0][1], None, None]
 | 
					                    var.current_music = {'type': var.playlist[0][0], 'path': var.playlist[0][1], 'user': var.playlist[0][2]}
 | 
				
			||||||
                    var.playlist.pop(0)
 | 
					                    var.playlist.pop(0)
 | 
				
			||||||
                    self.launch_next()
 | 
					                    self.launch_next()
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
current_music = ("", "")
 | 
					current_music = None
 | 
				
			||||||
playlist = []
 | 
					playlist = []
 | 
				
			||||||
user = ""
 | 
					user = ""
 | 
				
			||||||
music_folder = ""
 | 
					music_folder = ""
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user