web.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/env python3
  2. import os
  3. import json
  4. from http.server import BaseHTTPRequestHandler, HTTPServer
  5. from qmanager import qManager
  6. import urllib
  7. #import urllib.parse
  8. # Port on which server will run.
  9. PORT = 8080
  10. BASE_PATH="/backend/" #changes based on webserver
  11. FILE_PATH="/tmp/"
  12. class HTTPRequestHandler(BaseHTTPRequestHandler):
  13. q = qManager()
  14. def do_GET(self):
  15. if self.path==BASE_PATH+"SEARCH":
  16. self.send_200()
  17. out=json.dumps(self.q.search_status())
  18. self.wfile.write(bytes(out,"utf-8")) #fileHandle.read().encode()
  19. return
  20. if self.path==BASE_PATH+"list":
  21. self.send_response(200)
  22. mime="text/html"
  23. self.send_header('Content-type', mime)
  24. self.end_headers()
  25. out = []
  26. for book in self.q.books_status():
  27. if 'OUT' not in book:
  28. continue
  29. if len(book['OUT']) == 0:
  30. continue
  31. out.append("<li><a href='%s'>%s</a>" % (urllib.parse.quote(book['OUT'][0]), book['QUERY']))
  32. self.wfile.write(bytes("".join(out),"utf-8")) #fileHandle.read().encode()
  33. return
  34. if self.path==BASE_PATH+"RESULTS":
  35. self.send_200()
  36. out=json.dumps(self.q.books_status())
  37. self.wfile.write(bytes(out,"utf-8")) #fileHandle.read().encode()
  38. return
  39. if self.path==BASE_PATH:
  40. self.send_200()
  41. out=json.dumps(self.q.task_status())
  42. self.wfile.write(bytes(out,"utf-8")) #fileHandle.read().encode()
  43. return
  44. p=urllib.parse.unquote(self.path.replace(BASE_PATH,""))
  45. path=FILE_PATH+p
  46. #mime=mimetypes.guess_type(path) #fails on mobi, epub
  47. mime=""
  48. if p.endswith("mobi"):
  49. mime="application/x-mobipocket-ebook"
  50. if p.endswith("epub"):
  51. mime="application/epub+zip"
  52. if p.endswith("pdf"):
  53. mime="application/pdf"
  54. if p.endswith("html"):
  55. mime="text/html"
  56. self.send_response(200)
  57. self.send_header('Content-type', mime)
  58. self.send_header('Content-Disposition', 'attachment;filename="%s"'%p)
  59. self.end_headers()
  60. fp = open(path,'rb')
  61. while True:
  62. b = fp.read(8192)
  63. if b:
  64. self.wfile.write(b) #fileHandle.read().encode()
  65. else:
  66. break
  67. def send_400(self):
  68. self.send_response(400, 'NOT OK')
  69. self.send_header('Content-type', 'text/json')
  70. self.end_headers()
  71. def send_200(self):
  72. self.send_response(200)
  73. self.send_header('Content-type', 'text/json')
  74. self.end_headers()
  75. def do_POST(self):
  76. # Check if path is there.
  77. if self.path:
  78. length = self.headers['content-length']
  79. if length is None:
  80. self.send_400()
  81. return
  82. data = self.rfile.read(int(length))
  83. data = data.decode("utf-8")
  84. try:
  85. d=json.loads(data)
  86. except:
  87. print("no json")
  88. self.send_400()
  89. return
  90. if not "type" in d or not "book" in d:
  91. self.send_400()
  92. return
  93. if d["type"].upper()=="SEARCH":
  94. self.q.new_search(d["book"],d["extension"])
  95. self.send_200()
  96. return
  97. if d["type"]=="BOOK":
  98. self.q.new_dl(d["book"])
  99. self.send_200()
  100. return
  101. if __name__ == '__main__':
  102. HTTPDeamon = HTTPServer(('', PORT), HTTPRequestHandler)
  103. print("Listening at port", PORT)
  104. try:
  105. HTTPDeamon.serve_forever()
  106. except KeyboardInterrupt:
  107. pass
  108. HTTPDeamon.server_close()
  109. print("Server stopped")