Initial Commit

Initial Commit
This commit is contained in:
Markil3
2021-07-14 23:09:06 -06:00
committed by GitHub
parent 78a900487a
commit 150fc2c738

169
play Normal file
View 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)