launcher/sys.py/appinstaller.py
2019-12-07 22:48:09 +08:00

151 lines
4.4 KiB
Python

import os
import platform
import sqlite3
import json
from wicd import misc
from pyaria2_rpc.pyaria2 import Wsrpc
import libs.websocket as websocket
aria2_ws = "ws://localhost:6800/jsonrpc"
aria2_db = "aria2tasks.db"
rpc = Wsrpc('localhost',6800)
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
@misc.threaded
def game_install_thread(gid):
try:
conn = sqlite3.connect(aria2_db)
conn.row_factory = dict_factory
c = conn.cursor()
ret = c.execute("SELECT * FROM tasks WHERE gid='%s'" % gid ).fetchone()
if ret == None:
return
remote_file_url = ret["file"]
menu_file = remote_file_url.split("master")[1]
local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file )
if os.path.exists(local_menu_file) == True and "arm" not in platform.machine():
gametype = ret["type"]
if gametype == "launcher":
#tar zxvf
_cmd = "tar zxvf '%s' -C %s" % (local_menu_file, "~/apps/Menu/21_Indie\ Games/")
print(_cmd)
os.system(_cmd)
if gametype == "pico8":
_cmd="cp -rf '%s' ~/.lexaloffle/pico-8/carts/" % local_menu_file
print(_cmd)
os.system(_cmd)
if gametype == "tic80":
_cmd = "cp -rf '%s' ~/games/TIC-80/" % local_menu_file
print(_cmd)
os.system(_cmd)
conn.close()
except Exception as ex:
print("Sqlite3 error: ",ex)
def on_message(ws, message):
global rpc
print("got message ",message)
#decode json
#lookup in the sqlite db ,update the status[error,complete],
#uncompress the game into destnation folder in the game_install_thread
aria2_noti = json.loads(message)
if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadError":
gid = aria2_noti["params"][0]["gid"]
msg = rpc.tellStatus(gid)
ws.send(msg)
if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadComplete":
gid = aria2_noti["params"][0]["gid"]
#msg = rpc.tellStatus(gid)
#ws.send(msg)
game_install_thread(gid)
if "method" not in aria2_noti and "result" in aria2_noti:
if "status" in aria2_noti:
if aria2_noti["status"] == "error":
try:
print(aria2_noti["errorMessage"])
for x in aria2_noti["files"]:
os.remove(x["path"])
os.remove(x["path"]+".aria2")
except Exception as ex:
print(ex)
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
print "on open"
def create_connection(db_file):
conn = None
try:
conn = sqlite3.connect(db_file)
return conn
except Error as e:
print(e)
return conn
def create_table(conn, create_table_sql):
try:
c = conn.cursor()
c.execute(create_table_sql)
except Error as e:
print(e)
def init_sqlite3():
database = r"aria2tasks.db"
sql_create_tasks_table = """ CREATE TABLE IF NOT EXISTS tasks (
id integer PRIMARY KEY,
gid text NOT NULL,
title text NOT NULL,
file text NOT NULL,
type text NOT NULL,
status text,
totalLength text,
completedLength text,
fav text
); """
conn = create_connection(database)
if conn is not None:
create_table(conn, sql_create_tasks_table)
else:
print("Error! cannot create the database connection.")
exit()
if __name__ == "__main__":
init_sqlite3()
websocket.enableTrace(True)
ws = websocket.WebSocketApp(aria2_ws,
on_message = on_message,
on_error = on_error,
on_close = on_close)
# ws.on_open = on_open
ws.run_forever()