1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
import os
import sys
import signal
from threading import Thread
from OpenGL.GLUT import glutLeaveMainLoop
class PixMan:
_instance = None
_initialized = False
@staticmethod
def handle_sigint(sig, frame):
try:
# Threads are started as daemons so will automatically shut down
glutLeaveMainLoop()
sys.exit(0)
except:
pass
finally:
print("Exiting...")
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
else:
assert not args and not kwargs, f"Singleton {cls.__name__} cannot be called with arguments more than once"
return cls._instance
def __init__(self):
pass
@classmethod
def initialize(cls, configfile, app, socketio, host, port):
assert not cls._initialized, "Already initialized"
if cls._initialized:
return
cls._initialized = True
self = cls()
self.app = app
self.socketio = socketio
self.immich_connector = None
self.texture_list = None
self.display = None
self.t_flask = None
self.t_idle_download = None
signal.signal(signal.SIGINT, PixMan.handle_sigint)
self.configfile = configfile
config = Config.load(self.configfile) if os.path.exists(self.configfile) else Config(file=self.configfile)
self.init_web(host, port)
self.update_config(config)
def init_web(self, host, port):
self.t_flask = Thread(target=self.app.run, kwargs={ "host": host, "port": port })
self.t_flask.start()
def init_window(self):
# Initialize immich connector
self.immich_connector = ImmichConnector()
if not self.immich_connector.validate_connection():
self.immich_connector = None
return
# Initialize texture list
change_callback = lambda d: self.socketio.emit("seek", d)
album_keys = [ "38617851-6b57-44f1-b5f7-82577606afc4" ]
self.texture_list = LazyCachingTextureList(album_keys, max_cache_items=self.config.max_cache_assets, change_callback=change_callback)
# Begin downloading images
self.t_idle_download = Thread(target=self.immich_connector.idle, daemon=True)
self.t_idle_download.start()
# Create display
self.display = PixDisplay(self.texture_list)
self.display.main({}) # TODO glut args
def update_config(self, config):
#old_config = self.config
self.config = config
# Initialize window if immich parameters are valid
if config.immich_url and config.immich_api_key and not self.display:
self.init_window()
# If all goes well
config.save(self.configfile)
return True
from lazycachelist import LazyCachingTextureList
from window import PixDisplay
from immich import ImmichConnector
from settings import Config
|