telegram-apk-downloader/src/web.py
2020-12-06 19:59:31 +01:00

94 lines
2.8 KiB
Python

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