123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- 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"
- warehouse_db = "warehouse.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(aria2_result):
- try:
- #print("game_install_thread ",aria2_result)
- if "files" in aria2_result:
- if len(aria2_result["files"]) <= 0:
- return
- if "arm" not in platform.machine():
- return
- ret = aria2_result["files"][0]['uris']
- remote_file_url = ret[0]['uri']
- menu_file = remote_file_url.split("raw.githubusercontent.com")[1]
- local_menu_file = "%s/aria2download%s" % (os.path.expanduser('~'),menu_file )
- local_menu_file_path = os.path.dirname(local_menu_file)
- if os.path.exists(local_menu_file) == True:
- gametype = "launcher"
- if local_menu_file.endswith(".tar.gz"):
- gametype = "launcher"
- if local_menu_file.endswith(".p8.png"):
- gametype = "pico8"
- if local_menu_file.endswith(".tic"):
- gametype = "tic80"
- if gametype == "launcher":
- #tar zxvf
- _cmd = "tar zxvf '%s' -C %s" % (local_menu_file, local_menu_file_path)
- 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)
- except Exception as ex:
- print("app install 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:
- result = aria2_noti["result"]
- if "status" in result:
- if result["status"] == "error":
- try:
- print(result["errorMessage"])
- for x in result["files"]:
- if os.path.exists(x["path"]):
- os.remove(x["path"])
- if os.path.exists(x["path"]+".aria2"):
- os.remove(x["path"]+".aria2")
- except Exception as ex:
- print(ex)
- if result["status"] == "complete":
- game_install_thread(result)
-
- 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():
- global aria2_db
- global warehouse_db
- database = aria2_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
- ); """
- sql_create_warehouse_table = """ CREATE TABLE IF NOT EXISTS warehouse (
- id integer PRIMARY KEY,
- title text NOT NULL,
- file text NOT NULL,
- type text NOT NULL
- ); """
-
- conn = create_connection(database)
-
- if conn is not None:
- create_table(conn, sql_create_tasks_table)
- conn.close()
- else:
- print("Error! cannot create the database connection.")
- exit()
- database = warehouse_db
- conn = create_connection(database)
-
- if conn is not None:
- create_table(conn, sql_create_warehouse_table)
- conn.close()
- 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()
|