#!/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/", 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)