fdroid-repomaker/repomaker/gui.py

88 lines
2.2 KiB
Python

import logging
import subprocess
import time
from threading import Thread
import repomaker
import requests
import webview
URL = 'http://127.0.0.1:8000/'
WAIT_BEFORE_TASKS = 30 # number of seconds to wait before starting background tasks
logger = logging.getLogger(__name__)
# multi-thread access
task_process = None
terminate = False
def main():
# start stuff in thread
t_window = Thread(target=start)
t_window.start()
create_window()
def create_window():
global terminate # pylint: disable=global-statement
try:
webview.config["USE_QT"] = True # use Qt instead of Gtk for webview
webview.create_window("Repomaker", confirm_close=True)
terminate = True
finally:
# halt background tasks
if task_process is not None:
task_process.terminate()
def start():
global task_process # pylint: disable=global-statement
# show loading screen
webview.load_html(get_loading_screen())
double_instance = server_started()
if not double_instance:
# start web server
logger.debug("Starting server")
t = Thread(target=repomaker.runserver)
t.daemon = True
t.start()
# wait for server to start
while not server_started():
if not t.is_alive():
logging.error('Repomaker webserver could not be started.')
return
time.sleep(0.1)
# load repomaker into webview
webview.load_url(URL)
if not double_instance:
# wait and then start the background tasks
for i in range(0, WAIT_BEFORE_TASKS):
if terminate:
return
time.sleep(1)
if not terminate:
# this needs to run as its own process
task_process = subprocess.Popen(['repomaker-tasks'])
def get_loading_screen():
return """
<body>
<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;">
<h1 style="font-size:500%;font-family:Roboto;">Loading...</h1>
</div>
</body>
"""
def server_started():
try:
return requests.head(URL, timeout=60).status_code == requests.codes.OK
except Exception:
return False