API.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import json
  2. from yjdaemon.Database import Database as db
  3. import configparser
  4. import string
  5. """
  6. Add a key to the validAPIcalls dictionary, with a corresponding function
  7. Function should return jsonified data, so that it can then be passed on to the client.
  8. example:
  9. Add this to the dictionary
  10. "getsongs": calls.getsongs
  11. then implement this function
  12. @staticmethod
  13. def getsongs():
  14. return calls.jsonify({"song": song})
  15. And the jsonified data will be returned to the client.
  16. Every function MUST return jsonified data!
  17. """
  18. class calls:
  19. @staticmethod
  20. def APIcall(sanitizedpath):
  21. if sanitizedpath in validAPIcalls:
  22. return validAPIcalls[sanitizedpath]
  23. else:
  24. return None
  25. @staticmethod
  26. def getfromrawjson(data, param):
  27. return calls.dejsonify(data)[param]
  28. @staticmethod
  29. def jsonify(data):
  30. return json.dumps(data, sort_keys=True, indent=4).encode("utf-8")
  31. @staticmethod
  32. def dejsonify(rawdata):
  33. return json.loads(rawdata.decode("utf-8"))
  34. @staticmethod
  35. def getallsongs(args):
  36. return calls.jsonify({"songs": db.executequerystatic("SELECT * FROM tracks;"), "args": args , "result": "OK"})
  37. @staticmethod
  38. def getartists(args):
  39. return calls.jsonify({"artists": db.executequerystatic("SELECT artistName FROM tracks GROUP BY artistName;"), "args": args, "result" : "OK"})
  40. @staticmethod
  41. def getalbums(args):
  42. return calls.jsonify({"albums": db.executequerystatic("SELECT albumName FROM tracks GROUP BY albumName;"), "args": args, "result":"OK"})
  43. @staticmethod
  44. def getgenres(args):
  45. return calls.jsonify({"genres": db.executequerystatic("SELECT genre FROM tracks GROUP BY genre;"), "args": args, "result":"OK"})
  46. @staticmethod
  47. def getyears(args):
  48. return calls.jsonify({"years": db.executequerystatic("SELECT year FROM tracks GROUP BY year;"), "args": args, "result":"OK"})
  49. @staticmethod
  50. def getalbumnames(args):
  51. return calls.jsonify({"albumnames": db.executequerystatic("SELECT albumName FROM tracks GROUP BY albumName;"), "args": args})
  52. @staticmethod
  53. def search(args):
  54. data = args.split("&")
  55. genquery="""
  56. SELECT $ident FROM tracks WHERE LCASE(trackName) LIKE LCASE(\"%$trackname%\") $orgenre LCASE(genre) LIKE LCASE(\"%$genre%\") $oralbum LCASE(albumName) LIKE LCASE(\"%$album%\") $orartist LCASE(artistName) LIKE LCASE(\"%$artistname%\") $end;
  57. """
  58. query="""
  59. SELECT $ident FROM tracks WHERE ($or1 OR $or2 OR $or3 ) $and1 $and2 $and3 $end;
  60. """
  61. test = string.Template(query)
  62. genqueryres = ""
  63. arguments = []
  64. general = ""
  65. for entry in data:
  66. values = entry.split("=")
  67. values[1] = values[1].replace("%20"," ")
  68. if values[0] == "q":
  69. general = values[1]
  70. continue
  71. if values[1]:
  72. arguments.append(values)
  73. print(arguments)
  74. finalstring = "" + genquery
  75. for arg in arguments:
  76. if arg[0] == "artist":
  77. finalstring = string.Template(finalstring).safe_substitute(artistname=arg[1], orartist="AND")
  78. test = string.Template(test.safe_substitute(and1="AND LCASE(artistName) LIKE LCASE(\"%"+ arg[1] +"%\")"))
  79. elif arg[0] == "genre":
  80. finalstring = string.Template(finalstring).safe_substitute(genre=arg[1],orgenre="AND")
  81. test = string.Template(test.safe_substitute(and2="AND LCASE(genre) LIKE LCASE(\"%"+ arg[1] +"%\")"))
  82. elif arg[0] == "album":
  83. finalstring = string.Template(finalstring).safe_substitute(album=arg[1],oralbum="AND")
  84. test = string.Template(test.safe_substitute(and3="AND LCASE(albumName) LIKE LCASE(\"%"+ arg[1] +"%\")"))
  85. print(finalstring)
  86. finalstring = string.Template(finalstring).safe_substitute(genre=general,artistname=general,album=general,trackname=general)
  87. print(finalstring)
  88. test = test.safe_substitute( and1="", and2="",and3="",or1="LCASE(artistName) LIKE LCASE(\"%"+general+"%\")",or2="LCASE(genre) LIKE LCASE(\"%"+general+"%\")",or3="LCASE(albumName) LIKE LCASE(\"%"+general+"%\")")
  89. print(test)
  90. print(string.Template(test).safe_substitute(ident="*",end=""))
  91. return calls.jsonify({"result":"OK", "genres": db.executequerystatic(string.Template(test).safe_substitute(ident="genre",end="GROUP BY genre")),"artists": db.executequerystatic(string.Template(test).safe_substitute(ident="artistName",end="GROUP BY artistName")), "albums": db.executequerystatic(string.Template(test).safe_substitute(ident="albumName",end="GROUP BY albumName")), "songs" : db.executequerystatic(string.Template(test).safe_substitute(ident="*",end=""))})
  92. @staticmethod
  93. def getsongs(args):
  94. """Get song by album, genre, year, artist"""
  95. data = args.partition("?")
  96. splitstring = data[0].partition("=")
  97. name= splitstring[0]
  98. value = splitstring[2].replace("%20"," ")
  99. if name == "album":
  100. songs = db.executequerystatic("SELECT * FROM tracks WHERE albumName = \"" + value + "\"")
  101. elif name == "genre":
  102. songs = db.executequerystatic("SELECT * FROM tracks WHERE genre = \"" + value + "\"")
  103. elif name == "year":
  104. songs = db.executequerystatic("SELECT * FROM tracks WHERE year = \"" + value + "\"")
  105. elif name == "artist":
  106. songs = db.executequerystatic("SELECT * FROM tracks WHERE artistName = \"" + value + "\"")
  107. elif name == "search":
  108. songs = db.executequerystatic("SELECT * FROM tracks WHERE LCASE(trackName) LIKE LCASE(\"%"+ value + "%\") GROUP BY trackName")
  109. else:
  110. return calls.jsonify({"result":"NOK", "errormsg": "Not a valid argument"})
  111. return calls.jsonify({"result":"OK","songs":songs})
  112. @staticmethod
  113. def getsongbyid(args):
  114. config = configparser.ConfigParser()
  115. try:
  116. config.read("config.cfg")
  117. musicdir = config.get("Library","musicdir")
  118. port = config.get("HTTP","port")
  119. except:
  120. return calls.jsonify({"result" : "NOK" , "errormsg" : "I/O error while reading config."})
  121. data = args.split("&")
  122. splitsting = data[0].split("=")
  123. id = splitsting[1]
  124. file = db.executequerystatic(
  125. "SELECT SUBSTRING_INDEX(trackUrl,'" + musicdir + "',-1) as filedir FROM `tracks` WHERE id = " + id)
  126. try:
  127. url = str(file[0][0])
  128. except:
  129. return calls.jsonify({"result": "NOK", "errormsg" : "Song ID does not exist in database."})
  130. return calls.jsonify({"result": "OK", "songurl": "http://imegumii.nl:"+ "/music/English"+ url})
  131. @staticmethod
  132. def setsong(args, songname):
  133. global song
  134. song = songname
  135. return calls.jsonify({"result": "OK", "args": args})
  136. validAPIcalls = {"getallsongs": calls.getallsongs,
  137. "setsong": calls.setsong,
  138. "search": calls.search,
  139. "getsongs": calls.getsongs,
  140. "getsongbyid": calls.getsongbyid,
  141. "getartists": calls.getartists,
  142. "getalbums": calls.getalbums,
  143. "getgenres": calls.getgenres,
  144. "getyears": calls.getyears,
  145. "getalbumnames": calls.getalbumnames
  146. }