web.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env python3
  2. import logging
  3. import os
  4. from flask import Flask, request, render_template, redirect, url_for, session, send_file
  5. from download_utils import APK, BadPackageNameException
  6. from subprocess import CalledProcessError
  7. if "LOG_LEVEL" in os.environ:
  8. log_level = os.environ["LOG_LEVEL"]
  9. else:
  10. log_level = logging.INFO
  11. # Logging configuration.
  12. logger = logging.getLogger(__name__)
  13. logging.basicConfig(
  14. format="%(asctime)s> [%(levelname)s] %(message)s",
  15. datefmt="%d/%m/%Y %H:%M:%S",
  16. level=log_level,
  17. )
  18. logging.getLogger("werkzeug").disabled = True
  19. if os.environ.get('CONF_FOLDER') is None:
  20. logger.error("No conf folder available")
  21. exit(1)
  22. TOKEN = None
  23. with open(os.path.join(os.environ['CONF_FOLDER'], 'web.token')) as f:
  24. TOKEN = f.read().strip()
  25. CONF = {
  26. 'yes': True,
  27. 'verbose': False,
  28. 'tokencachefile': os.path.join(os.environ['CONF_FOLDER'], 'token.cache'),
  29. }
  30. CONF_FILE = os.path.join(os.environ['CONF_FOLDER'], 'gplaycli.conf')
  31. app = Flask(__name__)
  32. app.secret_key = TOKEN
  33. @app.errorhandler(400)
  34. @app.errorhandler(404)
  35. @app.errorhandler(500)
  36. def application_error(error):
  37. logger.error(error)
  38. return render_template('error.html', code=error.code, error=str(error)), error.code
  39. @app.route("/return-file/")
  40. def return_file():
  41. package_name = session.get("package_name")
  42. filename = f"{package_name}.apk"
  43. location = session.get("filename", '')
  44. if location != '':
  45. location = os.path.join('/bot', location)
  46. logging.info(f"sending {location}")
  47. return send_file(location, attachment_filename=filename, as_attachment=True)
  48. @app.route("/download/<package_name>", methods=["GET"])
  49. def get_download(package_name):
  50. return download(package_name)
  51. @app.route("/download/", methods=["POST"])
  52. def post_download():
  53. package_name = request.form.get('package_name', '').strip()
  54. return download(package_name)
  55. def download(package_name):
  56. logger.info("downloading {} ...".format(package_name))
  57. apk = APK(package_name, conf=CONF, conf_file=CONF_FILE)
  58. try:
  59. apk.download()
  60. with apk.send(split=False, remove=False) as files:
  61. for f in files:
  62. session['package_name'] = package_name
  63. session['filename'] = f
  64. except BadPackageNameException as e:
  65. logger.error("Bad package name: {}".format(e))
  66. return render_template('error.html', code=500, error="Bad package name: {}".format(e)), 500
  67. except CalledProcessError:
  68. logger.error("Failed to send APK file")
  69. return render_template('error.html', code=500, error="Failed to send APK file"), 500
  70. return redirect(url_for("return_file"))
  71. @app.route("/", methods=["GET"], strict_slashes=False)
  72. def home():
  73. return render_template('home.html')
  74. if __name__ == "__main__":
  75. app.run(host="0.0.0.0", port=5000)