|
@@ -0,0 +1,93 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+
|
|
|
+import logging
|
|
|
+import os
|
|
|
+
|
|
|
+from flask import Flask, request, render_template, redirect, url_for, session, send_file
|
|
|
+
|
|
|
+from download_utils import APK, BadPackageNameException
|
|
|
+from subprocess import CalledProcessError
|
|
|
+
|
|
|
+if "LOG_LEVEL" in os.environ:
|
|
|
+ log_level = os.environ["LOG_LEVEL"]
|
|
|
+else:
|
|
|
+ log_level = logging.INFO
|
|
|
+
|
|
|
+# Logging configuration.
|
|
|
+logger = logging.getLogger(__name__)
|
|
|
+logging.basicConfig(
|
|
|
+ format="%(asctime)s> [%(levelname)s] %(message)s",
|
|
|
+ datefmt="%d/%m/%Y %H:%M:%S",
|
|
|
+ level=log_level,
|
|
|
+)
|
|
|
+logging.getLogger("werkzeug").disabled = True
|
|
|
+
|
|
|
+if os.environ.get('CONF_FOLDER') is None:
|
|
|
+ logger.error("No conf folder available")
|
|
|
+ exit(1)
|
|
|
+TOKEN = None
|
|
|
+with open(os.path.join(os.environ['CONF_FOLDER'], 'web.token')) as f:
|
|
|
+ TOKEN = f.read().strip()
|
|
|
+
|
|
|
+CONF = {
|
|
|
+ 'yes': True,
|
|
|
+ 'verbose': False,
|
|
|
+ 'tokencachefile': os.path.join(os.environ['CONF_FOLDER'], 'token.cache'),
|
|
|
+}
|
|
|
+CONF_FILE = os.path.join(os.environ['CONF_FOLDER'], 'gplaycli.conf')
|
|
|
+
|
|
|
+app = Flask(__name__)
|
|
|
+app.secret_key = TOKEN
|
|
|
+
|
|
|
+@app.errorhandler(400)
|
|
|
+@app.errorhandler(404)
|
|
|
+@app.errorhandler(500)
|
|
|
+def application_error(error):
|
|
|
+ logger.error(error)
|
|
|
+ return render_template('error.html', code=error.code, error=str(error)), error.code
|
|
|
+
|
|
|
+@app.route("/return-file/")
|
|
|
+def return_file():
|
|
|
+ package_name = session.get("package_name")
|
|
|
+ filename = f"{package_name}.apk"
|
|
|
+ location = session.get("filename", '')
|
|
|
+ if location != '':
|
|
|
+ location = os.path.join('/bot', location)
|
|
|
+ logging.info(f"sending {location}")
|
|
|
+ return send_file(location, attachment_filename=filename, as_attachment=True)
|
|
|
+
|
|
|
+@app.route("/download/<package_name>", methods=["GET"])
|
|
|
+def get_download(package_name):
|
|
|
+ return download(package_name)
|
|
|
+
|
|
|
+@app.route("/download/", methods=["POST"])
|
|
|
+def post_download():
|
|
|
+ package_name = request.form.get('package_name', '').strip()
|
|
|
+ return download(package_name)
|
|
|
+
|
|
|
+def download(package_name):
|
|
|
+ logger.info("downloading {} ...".format(package_name))
|
|
|
+
|
|
|
+ apk = APK(package_name, conf=CONF, conf_file=CONF_FILE)
|
|
|
+
|
|
|
+ try:
|
|
|
+ apk.download()
|
|
|
+ with apk.send(split=False, remove=False) as files:
|
|
|
+ for f in files:
|
|
|
+ session['package_name'] = package_name
|
|
|
+ session['filename'] = f
|
|
|
+ except BadPackageNameException as e:
|
|
|
+ logger.error("Bad package name: {}".format(e))
|
|
|
+ return render_template('error.html', code=500, error="Bad package name: {}".format(e)), 500
|
|
|
+ except CalledProcessError:
|
|
|
+ logger.error("Failed to send APK file")
|
|
|
+ return render_template('error.html', code=500, error="Failed to send APK file"), 500
|
|
|
+
|
|
|
+ return redirect(url_for("return_file"))
|
|
|
+
|
|
|
+@app.route("/", methods=["GET"], strict_slashes=False)
|
|
|
+def home():
|
|
|
+ return render_template('home.html')
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ app.run(host="0.0.0.0", port=5000)
|