Initial Commit
Initial Commit
This commit is contained in:
169
play
Normal file
169
play
Normal file
@@ -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)
|
||||
Reference in New Issue
Block a user