diff --git a/play b/play new file mode 100644 index 0000000..7639782 --- /dev/null +++ b/play @@ -0,0 +1,169 @@ +#!/usr/bin/env python +import pathlib +from pathlib import Path +from urllib import parse +import subprocess +import sys +import random +from os.path import exists + +''' +A sorting method for songs. It works by pushing file names with more matches up higher. +''' +def valOfResult(song): + val = 0 + lowerSong = song.lower() + for arg in sys.argv[1:]: + # Removes the playlist extension for this case + if arg.endswith(".m3u"): + arg = arg[:-4] + argLen = len(arg) + lowerArg = arg.lower() + lastIndex = 0 + while lowerArg in lowerSong[lastIndex:]: + val -= 1 + #print('\t' + lowerSong[0:lastIndex] + lowerSong.upper()[lastIndex:lastIndex + argLen] + lowerSong[lastIndex + argLen:]) + lastIndex += lowerSong[lastIndex:].index(lowerArg) + argLen + #print("%s got %d hits" % (song, val)) + return val + +''' +Compiles all arguments in the argument list into a Unix Find search term +''' +def appendSearchArguments(argList, args): + notArgs = [] + playlistArgs=[] + if len(args) > 0: + argList.append("(") + argList.append("(") + for arg in args: + if arg.startswith("!"): + notArgs.append(arg[1:]) + elif arg.endswith(".m3u"): + playlistArgs.append(arg[:-4]) + elif arg == "AND" or arg == "and" or arg == "-and" or arg == "-a" or arg =="--and" or arg == "&&": + argList.pop() + argList.append("-and") + else: + argList.append("-ipath") + if arg.endswith(".m3u"): + argList.append("*" + arg[:-4] + "*.m3u") + else: + argList.append("*" + arg + "*") + argList.append("-or") + if argList[len(argList) - 1] == "-or": + argList.pop() + argList.append(")") + if len(notArgs) > 0: + argList.append("-and") + argList.append("(") + for arg in notArgs: + argList.append("-not") + argList.append("-ipath") + argList.append("*" + arg + "*") + argList.append("-and") + argList.pop() + argList.append(")") + + argList.append("-and") + appendFileTypes(argList) + argList.append(")") + + if len(playlistArgs) > 0: + argList.append("-or") + argList.append("(") + + for playlist in playlistArgs: + argList.append("-ipath") + argList.append("*" + playlist + "*") + argList.append("-or") + argList.pop() + + argList.append(")") + argList.append("-and") + argList.append("-iname") + argList.append("*.m3u") + +''' +Adds information about what files are supported +''' +def appendFileTypes(argList): + types = ["mp3", "flac", "ogg", "wav", "m4a"] + if len(types) <= 0: + return + argList.append("(") + for fileType in types: + argList.append("-iname") + argList.append("*." + fileType) + argList.append("-or") + argList.pop() + argList.append(")") + +''' +Merges certain words into one. This is helpful for voice commands +''' +def mergeWords(argList): + i = 0 + quoting = False + while i < len(argList): + # Merge underscore for handling later + if quoting: + if argList[i] != "unquote": + argList[i - 1] = argList[i - 1] + " " + argList[i] + else: + quoting = False + del argList[i] + i -= 1 + elif argList[i] == "quote": + quoting = True + del argList[i] + elif i < len(argList) - 1 and argList[i] == "under" and argList[i + 1] == "score": + argList[i] = "underscore" + del argList[i + 1] + if argList[i] == "dot": + argList[i - 1] = argList[i - 1] + "." + del argList[i] + i -= 1 + elif argList[i] == "underscore": + argList[i - 1] = argList[i - 1] + "_" + del argList[i] + i -= 1 + elif argList[i - 1].endswith(".") or argList[i - 1].endswith("_"): + argList[i - 1] = argList[i - 1] + argList[i] + del argList[i] + i -= 1 + i += 1 + + return argList + +if __name__ == "__main__": + # Checks if VLC is installed + exists = subprocess.call("command -v vlc >> /dev/null", shell=True) + if exists: + print("VLC Media Player is not installed", file=sys.stderr) + exit(1) + + mergeWords(sys.argv) + findArgs = ["find", "./"] + appendSearchArguments(findArgs, sys.argv[1:]) + print(" ".join(findArgs)) + print() + process = subprocess.Popen(findArgs, stdout=subprocess.PIPE) + output, error = process.communicate() + files = output.decode().split("\n") + # Remove any empty things + while "" in files: + files.remove("") + if len(files) == 0: + print("No files found", file=sys.stderr) + exit(1) + random.shuffle(files) + files.sort(key=valOfResult) + for song in files: + print(song) + + vlcArgs = ["cvlc"] + vlcArgs += files + #print(" ".join(vlcArgs)) + print() + subprocess.call(vlcArgs)