diff --git a/api/modules/gamelist.py b/api/modules/gamelist.py index 8e49eab..4cdc779 100644 --- a/api/modules/gamelist.py +++ b/api/modules/gamelist.py @@ -3,7 +3,9 @@ from flask import jsonify, make_response import modules.db_connect from modules.functions import get_gamelist, set_gamelist import modules.game -from modules.gamelist_functions import get_thumbnails, update_thumbnails +from modules.gamelist_functions import ( + get_threaded_thumbnails, + update_threaded_thumbnails) import glob contentpath = modules.db_connect.contentpath() @@ -41,14 +43,14 @@ def update_gamelist(): # Fetch displayimage for all nfo-files @app.route('/gamelist/displayimage') def get_displayimages(update=False): - thumbnails = get_thumbnails() + thumbnails = get_threaded_thumbnails() if (len(thumbnails) == 0) or update: - thumbnails = update_thumbnails(True) + thumbnails = update_threaded_thumbnails(True) return jsonify(thumbnails) # Update displayimages @app.route('/gamelist/displayimage/update') def update_displayimages(): - update_thumbnails() + update_threaded_thumbnails() return make_response("

Success

", 200) diff --git a/api/modules/gamelist_functions.py b/api/modules/gamelist_functions.py index d0da7cd..d068e31 100644 --- a/api/modules/gamelist_functions.py +++ b/api/modules/gamelist_functions.py @@ -3,6 +3,9 @@ import glob import os import json from modules.functions import reduceartcv2 +import threading +from queue import Queue +import time contentpath = modules.db_connect.contentpath() nfosuffix = modules.db_connect.nfosuffix() @@ -10,12 +13,12 @@ nfosuffix = modules.db_connect.nfosuffix() global nfofiles nfofiles = [] -global thumbnails -thumbnails = [] - global thumbnails_update_status thumbnails_update_status = False +global threaded_thumbnails +threaded_thumbnails = [] + # Set nfo-files list def set_nfofiles(nfofiles_list): @@ -40,27 +43,30 @@ def update_nfofiles(return_list=False): return True -# Set thumbnails list -def set_thumbnails(thumbnails_list): - global thumbnails - thumbnails = thumbnails_list +# Set threaded_thumbnails list +def set_threaded_thumbnails(thumbnails_list): + global threaded_thumbnails + threaded_thumbnails = thumbnails_list return True -# Get thumbnails list -def get_thumbnails(): - global thumbnails - return thumbnails +# Get threaded_thumbnails list +def get_threaded_thumbnails(): + global threaded_thumbnails + return threaded_thumbnails -# Update thumbnails list -def update_thumbnails(return_list=False): - global thumbnails_update_status - thumbnails_update_status = True +# Threaded printer +def printer(queue): + while True: + message = queue.get() + print(message) + + +# Create thumbnails +def create_thumbnails(nfolist, lock, queue): + global threaded_thumbnails nfos = [] - nfolist = get_nfofiles() - if len(nfolist) == 0: - nfolist = update_nfofiles(True) j = 0 for nfopath in nfolist: nfo = json.load(open(nfopath, 'r')) @@ -80,12 +86,54 @@ def update_thumbnails(return_list=False): current_nfo['displayimage'] = reduceartcv2( artpath+art['filename'], 'thumbnail') except Exception as e: - print("Failing cover:", art['filename'], e) + queue.put(( + "Failing cover:" + + str(art['filename']) + + str(e))) nfos.append(current_nfo) - j += 1 - print("[", j, "/", len(nfofiles), "]", nfopath, "added") - set_thumbnails(nfos) - thumbnails_update_status = False - if return_list is True: - return nfos + with lock: + j += 1 + queue.put(( + "[" + + str(j) + + "/" + + str(len(nfolist)) + + "] " + + str(nfopath) + + " added")) + with lock: + set_threaded_thumbnails(get_threaded_thumbnails() + nfos) + return True + + +# Update thumbnails list, threaded +def update_threaded_thumbnails(return_list=False): + global thumbnails_update_status + nfolist = get_nfofiles() + if len(nfolist) == 0: + nfolist = update_nfofiles(True) + nl1 = nfolist[:len(nfolist)//2] + nl2 = nfolist[len(nfolist)//2:] + + lock = threading.Lock() + queue = Queue() + printer_thread = threading.Thread( + target=printer, + args=(queue,), + daemon=True, + name="Printer") + printer_thread.start() + + t1 = threading.Thread(target=create_thumbnails, args=(nl1, lock, queue)) + t2 = threading.Thread(target=create_thumbnails, args=(nl2, lock, queue)) + + start_time = time.time() + t1.start() + t2.start() + + t1.join() + t2.join() + print("Threading done! duration:", (time.time() - start_time)) + if return_list: + return get_threaded_thumbnails() return True diff --git a/site/modules/gamelist.py b/site/modules/gamelist.py index 144a978..3b6a20c 100644 --- a/site/modules/gamelist.py +++ b/site/modules/gamelist.py @@ -60,7 +60,6 @@ def gamelist(lang_code): except Exception as e: print("error type:", type(e)) - if glist is not None: return render_template('gamelist.html', gamelist=glist, **languages[lang_code], lang_code=lang_code, thumbnails=thumbnailslist)