def status(message, sender): volume = speakermanager.getVolume() bass = speakermanager.getBass() try: songName = speakermanager.getTrackInfo() except: songName = False message = """ Volume: %(volume)d Bass: %(bass)s Song: %(song)s """ bassCap = speakermanager.getBassCapabilities() if not songName: song = "None" else: song = songName[0] + " by " + songName[2] data = { "volume": volume, "bass": str(bass) + " out of " + bassCap[1], "song": song } sendtext( sender, config['DEFAULT']['ai_name'] + ": Basis Status" + message % data)
def handle(command, message, sender): """ ~ Handles the commands to the speaker ~ :param command: The command to be sent. The first word of the message Ex: BoseVolume 20 :param message: The content AFTER the commmand. Ex: Bdeezer Sandstorm is just Sanstorm for the message :param sender: The phone number it is being sent from Checks to see if command + "py" exists. Then it imports that file and invokes the method inside that file. Otherwise it sends the player a message saying the command doesn't exist. """ if static.adminnumber is None: static.adminnumber = sender # the command is handled by a file and function named after itself # BREAKS IF COMMAND IS FIRST WORD OF A POSIBLE SONG NAME keyword = config['DEFAULT']['keyword'] command = command[len(keyword):] try: target_file = os.path.join(os.path.dirname(__file__), "commands/" + command + '.py') if os.path.isfile(target_file): server.validatestatus() module = importlib.import_module(command + '') getattr(module, command)(message, sender) else: # if file doesn't exist, assume queue of song # fabricate original message #message = command + " " + message #module = importlib.import_module('song') #getattr(module, 'song')(message, sender) sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "Sorry, no such command. Please text" + "\"BHelp\"" + "for command list.") except Exception as e: print('Error handling command') print('error:') traceback.print_exc()
def clear(message, sender): if adminmode and sender == adminnumber: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + config['DEFAULT']['master_name'] + ", the system has been CLEARED.") speakermanager.clear() else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "You are not " + config['DEFAULT']['master_name'] + " ... Please have" + adminnumber[:-4] + "send this command.")
def helplist(message, sender): sendtext( sender, config['DEFAULT']['ai_name'] + ": This is a long one:" + """ To play a song: <Keyword><Source> <Song Title> by <Artist> Ex: BDeezer Call Me A Spaceman by Hardwell Note: Spotify and Deezer are the only Sources currently. Note: You do not have to include Artist but the more accurate you are the better the program will respond. """)
def helplist(message, sender): sendtext(sender, config['DEFAULT']['ai_name'] + ": This is a long one:" + """ To play a song: <Keyword><Source> <Song Title> by <Artist> Ex: BDeezer Call Me A Spaceman by Hardwell Note: Spotify and Deezer are the only Sources currently. Note: You do not have to include Artist but the more accurate you are the better the program will respond. """ )
def topclear(message, sender): party.curPlayer = 0 party.players = [] party.queues = {} party.boos = {} len = addHotList() if len > 0: sendtext(sender, config['DEFAULT']['ai_name'] + ": " "Cleared songs from hot playlist!") else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " "No songs in hot playlist :(")
def ping(message, sender): if adminmode and sender == adminnumber: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + config['DEFAULT']['master_name'][-5:] + " , I received your message." + message) else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "I received your message." + message)
def top(message, sender): len = addHotList() if len > 0: sendtext( sender, config['DEFAULT']['ai_name'] + ": " "Queued songs from hot playlist!") else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " "No songs in hot playlist :(")
def handleSongSearch(message, sender): songname = message artistname = None splitter = "by" if message.find(splitter) > -1: songname = message[:message.find(splitter)].strip() artistname = message[message.find(splitter)+len(splitter):].strip() if deezerapi.validate(songname, artistname): party.queuesong(sender, "deezer", songname, artistname) else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "Unable to find song: " + songname + "on Deezer.") sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "To send a song follow this format <Keyword><Source> <Song Title> by <Artist>" + "\n" + "For more commands please text" + "\"BHelp\"")
def system(message, sender): info = speakermanager.getSystemSettings() message = """ Name: %(name)s Type: %(type)s Software Version: %(softwareVersion)s Serial Number: %(serialNumber)s Mac Address: %(macAddress)s IP Address: %(ipAddress)s """ sendtext(sender, config['DEFAULT']['ai_name'] + ": System Info" + message%info)
def list(message, sender): if party.getQueueSize() > 0: for q in party.queues: msg = config['DEFAULT']['ai_name'] + ": " + "Songs in queue:\n" for song in party.queues[q]: if song[1] is not None: msg += song[0] + " by " + song[1] + "\n" else: msg += song[0] sendtext(sender, msg) else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "No song in queue.")
def system(message, sender): info = speakermanager.getSystemSettings() message = """ Name: %(name)s Type: %(type)s Software Version: %(softwareVersion)s Serial Number: %(serialNumber)s Mac Address: %(macAddress)s IP Address: %(ipAddress)s """ sendtext(sender, config['DEFAULT']['ai_name'] + ": System Info" + message % info)
def genre(message, sender): playlistSize = int(message) try: info = speakermanager.getTrackInfo() genre = spotifyapi.genreSearch(info[2], playlistSize) songOnly = [] for iter in genre: party.queuesong(sender, "spotify", iter[0], iter[1]) songOnly.append(iter[0]) #sendtext(sender, "Playlist that matches your song: " + ','.join(songOnly)) except: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "Cannot generate playlist, is a song playing?")
def topclear(message, sender): party.curPlayer = 0 party.players = [] party.queues = {} party.boos = {} len = addHotList() if len > 0: sendtext( sender, config['DEFAULT']['ai_name'] + ": " "Cleared songs from hot playlist!") else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " "No songs in hot playlist :(")
def playNextSong(): """ ~ Plays the next song ~ Plays the next song queued and clears the boo array and alerts the player who queued the song that his/her song will be played next """ speakermanager.playSong(getNextSong()) clearBoos() time.sleep(5) ns = acquireNextSong() if ns: sendtext(ns[0], config['DEFAULT']['ai_name'] + ": " +"Your song '" + ns[1][0] + "' will be playing next!")
def handleLyricSearch(message, sender): apiKey = config['musixmatch']['apikey'] # 2000 hits per day searchTerm = urllib.parse.quote(message) url = "http://api.musixmatch.com/ws/1.1/track.search?q_lyrics=" + searchTerm + "&apikey=" + apiKey response = urlopen(url) tracks = json.loads(response.read().decode('utf-8'))['message']['body']['track_list'] tracksFound = len(tracks) if tracksFound > 0: firstSong = tracks[0]['track'] trackName = firstSong['track_name'] artistName = firstSong['artist_name'] party.queuesong(sender, "deezer", trackName, artistName) sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "Found " + trackName + " by " + trackName + " ." ) else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "Your song" + message + "was not found!")
def genre(message, sender): playlistSize = int(message) try: info = speakermanager.getTrackInfo() genre = spotifyapi.genreSearch(info[2], playlistSize) songOnly = [] for iter in genre: party.queuesong(sender, "spotify", iter[0], iter[1]) songOnly.append(iter[0]) #sendtext(sender, "Playlist that matches your song: " + ','.join(songOnly)) except: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "Cannot generate playlist, is a song playing?")
def playNextSong(): """ ~ Plays the next song ~ Plays the next song queued and clears the boo array and alerts the player who queued the song that his/her song will be played next """ speakermanager.playSong(getNextSong()) clearBoos() time.sleep(5) ns = acquireNextSong() if ns: sendtext(ns[0], config["DEFAULT"]["ai_name"] + ": " + "Your song '" + ns[1][0] + "' will be playing next!")
def handleSongSearch(message, sender): songname = message artistname = None splitter = "by" if message.find(splitter) > -1: songname = message[:message.find(splitter)].strip() artistname = message[message.find(splitter) + len(splitter):].strip() if spotifyapi.validate(songname, artistname): party.queuesong(sender, "spotify", songname, artistname) else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "Unable to find song: " + songname + "on Spotify.") sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "To send a song follow this format <Keyword><Source> <Song Title> by <Artist>" + "\n" + "For more commands please text" + "\"BHelp\"")
def status(message, sender): volume = speakermanager.getVolume() bass = speakermanager.getBass() try: songName = speakermanager.getTrackInfo() except: songName = False message = """ Volume: %(volume)d Bass: %(bass)s Song: %(song)s """ bassCap = speakermanager.getBassCapabilities() if not songName: song = "None" else: song = songName[0] + " by " + songName[2] data = {"volume": volume, "bass": str(bass) + " out of " + bassCap[1], "song": song} sendtext(sender, config['DEFAULT']['ai_name'] + ": Basis Status" + message%data)
def handleLyricSearch(message, sender): apiKey = config['musixmatch']['apikey'] # 2000 hits per day searchTerm = urllib.parse.quote(message) url = "http://api.musixmatch.com/ws/1.1/track.search?q_lyrics=" + searchTerm + "&apikey=" + apiKey response = urlopen(url) tracks = json.loads( response.read().decode('utf-8'))['message']['body']['track_list'] tracksFound = len(tracks) if tracksFound > 0: firstSong = tracks[0]['track'] trackName = firstSong['track_name'] artistName = firstSong['artist_name'] party.queuesong(sender, "spotify", trackName, artistName) sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "Found " + trackName + " by " + trackName + " .") else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "Your song" + message + "was not found!")
def like(message, sender): try: song = speakermanager.getTrackInfo() hash = hashlib.md5((song[0] + song[2]).encode("UTF-8")).hexdigest() global curhash if curhash != hash: curhash = hash phones.clear() if sender not in phones: phones.append(sender) if hash not in hottrack: hottrack[hash] = [song[0], song[2], 0] hottrack[hash][2] += 1 sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "You liked " + song[0] + " by " + song[1] + " song!") savesongs() if hottrack[hash][2] > party.getNumPlayers() / 2: speakermanager.playSong( (speakermanager.curSource, song[0], song[2])) else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "You already liked " + song[0] + " by " + song[1] + " song!") except: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "No song is playing :(") traceback.print_exc()
def boo(message, sender): try: if party.setBoo(sender): static.booCount += 1 song = speakermanager.getTrackInfo() if static.booCount > party.getNumPlayers() / 2: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + song[0] + " by " + song[1] + " has been booed") static.booCount = 0 speakermanager.skip() else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "You already booed " + song[0] + " by " + song[1] + "." " BE NICE.") sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "You sent a boo command for " + song[0] + " by " + song[1] + ".") except: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "There's no song to boo!")
def queuesong(sender, source, songname, artistname=None): """ ~ Queues the song to be in the in the queue ~ :param sender: The speaker address :param source: The phone number that is requesting it :param songname: The name of the song to queue :param artistname: The artist of the song Queues the song which is sent from the players. If the sender is not in players, then they are placed in the player array. Will message the player back with the confirmation of it being queued. """ if sender not in players: players.append(sender) queues[sender] = collections.deque() boos[sender] = False queues[sender].append((songname, artistname, source)) message = config['DEFAULT']['ai_name'] + ": " + "Your Song has been queued, " + songname if artistname is not None: message = message + " by " + artistname sendtext(sender, message)
def queuesong(sender, source, songname, artistname=None): """ ~ Queues the song to be in the in the queue ~ :param sender: The speaker address :param source: The phone number that is requesting it :param songname: The name of the song to queue :param artistname: The artist of the song Queues the song which is sent from the players. If the sender is not in players, then they are placed in the player array. Will message the player back with the confirmation of it being queued. """ if sender not in players: players.append(sender) queues[sender] = collections.deque() boos[sender] = False queues[sender].append((songname, artistname, source)) message = config["DEFAULT"]["ai_name"] + ": " + "Your Song has been queued, " + songname if artistname is not None: message = message + " by " + artistname sendtext(sender, message)
def input(message, sender): if message.strip().upper() == "AUX": speakermanager.simulateKeyPress("AUX_INPUT") sendtext(sender, config["DEFAULT"]["ai_name"] + ": " + "You sent an Input AUX command.") if message.index("preset") > -1: if not len(message) == 8: sendtext(sender, config["DEFAULT"]["ai_name"] + ": " + "Invalid Preset, acceptable range 1-6.") else: speakermanager.simulateKeyPress(message.replace(" ", "_").upper()) sendtext(sender, message.replace(" ", "_").upper())
def skip(message, sender): try: if adminmode and sender == adminnumber: if party.getQueueSize() > 0: song = speakermanager.getTrackInfo() speakermanager.skip() sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "You sent a skip command for " + song[0] + " by " + song[2] + ".") else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "No song to skip :(") except: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "No song to skip :(")
def volume(message, number): curVol = speakermanager.getVolume() if message.isdigit(): speakermanager.setVolume(message) sendtext(number, config['DEFAULT']['ai_name'] + ": " + "Result volume: " + str(message)) elif message == "up": speakermanager.setVolume(curVol + 5) sendtext(number, config['DEFAULT']['ai_name'] + ": " + "You sent a volume up command") elif message == "down": speakermanager.setVolume(curVol - 5) sendtext(number, config['DEFAULT']['ai_name'] + ": " + "You sent a volume down command")
def input(message, sender): if message.strip().upper() == "AUX": speakermanager.simulateKeyPress("AUX_INPUT") sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "You sent an Input AUX command.") if message.index("preset") > -1: if not len(message) == 8: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "Invalid Preset, acceptable range 1-6.") else: speakermanager.simulateKeyPress(message.replace(" ", "_").upper()) sendtext(sender, message.replace(" ", "_").upper())
def volume(message, number): curVol = speakermanager.getVolume() if message.isdigit(): speakermanager.setVolume(message) sendtext( number, config['DEFAULT']['ai_name'] + ": " + "Result volume: " + str(message)) elif message == "up": speakermanager.setVolume(curVol + 5) sendtext( number, config['DEFAULT']['ai_name'] + ": " + "You sent a volume up command") elif message == "down": speakermanager.setVolume(curVol - 5) sendtext( number, config['DEFAULT']['ai_name'] + ": " + "You sent a volume down command")
def skip(message, sender): try: if adminmode and sender == adminnumber: if party.getQueueSize() > 0: song = speakermanager.getTrackInfo() speakermanager.skip() sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "You sent a skip command for " + song[0] + " by " + song[2] + ".") else: sendtext( sender, config['DEFAULT']['ai_name'] + ": " + "No song to skip :(") except: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "No song to skip :(")
def like(message, sender): try: song = speakermanager.getTrackInfo() hash = hashlib.md5((song[0] + song[2]).encode("UTF-8")).hexdigest() global curhash if curhash != hash: curhash = hash phones.clear() if sender not in phones: phones.append(sender) if hash not in hottrack: hottrack[hash] = [song[0], song[2], 0] hottrack[hash][2] += 1 sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "You liked " + song[0] + " by " + song[1] + " song!") savesongs() if hottrack[hash][2] > party.getNumPlayers() / 2: speakermanager.playSong((speakermanager.curSource, song[0], song[2])) else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "You already liked " + song[0] + " by " + song[1] + " song!") except: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "No song is playing :(") traceback.print_exc()
def activate(message, sender): speakermanager.simulateKeyPress(message.upper()) sendtext(sender, message.upper())
def power(message, sender): if static.speakerOn: speakermanager.simulateKeyPress("POWER") sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "Power") static.speakerOn = not static.speakerOn
def help(message, sender): sendtext(sender, config['DEFAULT']['ai_name'] + ": Please visit http://tinyurl.com/MusicSharecommand \n" + "or text back " + "\"BHelpList\"" + "for the complete command list texted to you." )
def ping(message, sender): if adminmode and sender == adminnumber: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + config['DEFAULT']['master_name'][-5:] + " , I received your message." + message) else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " + "I received your message." + message)
def top(message, sender): len = addHotList() if len > 0: sendtext(sender, config['DEFAULT']['ai_name'] + ": " "Queued songs from hot playlist!") else: sendtext(sender, config['DEFAULT']['ai_name'] + ": " "No songs in hot playlist :(")