Repository navigation
Expand file tree
/
Copy pathEmbyLoadingScreen.py
More file actions
118 lines (96 loc) · 3.9 KB
/
Copy pathEmbyLoadingScreen.py
File metadata and controls
118 lines (96 loc) · 3.9 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from math import cos, radians, sin
from pathlib import Path
from PIL import Image, ImageEnhance
from twisted.internet import threads
from enigma import eTimer
from Components.Label import Label
from Components.Pixmap import Pixmap
from Screens.Screen import Screen
from Tools.LoadPixmap import LoadPixmap
from . import _
from .Variables import EMBY_THUMB_CACHE_DIR
SPINNER_DOT_COUNT = 8
SPINNER_DOT_SIZE = 36
SPINNER_RADIUS = 90
SPINNER_CENTER = (960, 540)
SPINNER_DIM_COLOR = "#444444"
SPINNER_BRIGHT_COLOR = "#32772b"
SPINNER_INTERVAL_MS = 100
BACKDROP_DIM_FACTOR = 0.20
loadingScreenPopup = None
def _spinnerDotPosition(index):
angle = radians(360 * index / SPINNER_DOT_COUNT)
cx, cy = SPINNER_CENTER
x = int(cx + SPINNER_RADIUS * cos(angle) - SPINNER_DOT_SIZE / 2)
y = int(cy + SPINNER_RADIUS * sin(angle) - SPINNER_DOT_SIZE / 2)
return x, y
def _buildSpinnerSkin():
parts = []
for index in range(SPINNER_DOT_COUNT):
x, y = _spinnerDotPosition(index)
parts.append(
f'<eLabel backgroundColor="{SPINNER_DIM_COLOR}" position="{x},{y}" size="{SPINNER_DOT_SIZE},{SPINNER_DOT_SIZE}" '
f'cornerRadius="{SPINNER_DOT_SIZE // 2}" zPosition="2"/>'
)
parts.append(
f'<widget name="spinner_dot_{index}" backgroundColor="{SPINNER_BRIGHT_COLOR}" position="{x},{y}" size="{SPINNER_DOT_SIZE},{SPINNER_DOT_SIZE}" '
f'cornerRadius="{SPINNER_DOT_SIZE // 2}" zPosition="3"/>'
)
return "".join(parts)
class EmbyLoadingScreen(Screen):
skin = ["""<screen name="EmbyLoadingScreen" position="fill" flags="wfNoBorder" zPosition="1000" backgroundColor="#ff000000">
<widget name="backdrop" position="fill" zPosition="-5" scale="1"/>
""" + _buildSpinnerSkin() + """
<widget name="loading_label" position="810,665" size="300,60" font="Regular;35" halign="center" transparent="1" foregroundColor="#ffffff" zPosition="3"/>
</screen>"""] # noqa: E101
def __init__(self, session):
Screen.__init__(self, session)
self["backdrop"] = Pixmap()
self["loading_label"] = Label()
for index in range(SPINNER_DOT_COUNT):
self[f"spinner_dot_{index}"] = Label()
self.spinnerTimer = eTimer()
self.spinnerTimer.callback.append(self.__advanceSpinner)
self.spinnerIndex = 0
self.spinnerTick = 0
self.onShow.append(self.__startSpinner)
self.onHide.append(self.__stopSpinner)
def updateBackdrop(self):
source_path = f"/tmp{EMBY_THUMB_CACHE_DIR}/backdrop_orig.jpg"
dimmed_path = f"/tmp{EMBY_THUMB_CACHE_DIR}/backdrop_dimmed.jpg"
try:
with Image.open(source_path) as backdrop:
ImageEnhance.Brightness(backdrop.convert("RGB")).enhance(BACKDROP_DIM_FACTOR).save(dimmed_path, format="JPEG")
self["backdrop"].setPixmap(LoadPixmap(dimmed_path))
except (FileNotFoundError, OSError):
self["backdrop"].setPixmap(LoadPixmap(source_path))
def __startSpinner(self):
self.spinnerIndex = 0
self.spinnerTick = 0
for index in range(SPINNER_DOT_COUNT):
self["spinner_dot_%d" % index].hide()
self.__showSpinnerDot(self.spinnerIndex)
self["loading_label"].setText(_("Loading") + ".")
self.spinnerTimer.start(SPINNER_INTERVAL_MS, False)
def __stopSpinner(self):
self.spinnerTimer.stop()
def __advanceSpinner(self):
self["spinner_dot_%d" % self.spinnerIndex].hide()
self.spinnerIndex = (self.spinnerIndex + 1) % SPINNER_DOT_COUNT
self.__showSpinnerDot(self.spinnerIndex)
self.spinnerTick += 1
self["loading_label"].setText(_("Loading") + "." * (1 + (self.spinnerTick // 4) % 3))
def __showSpinnerDot(self, index):
self["spinner_dot_%d" % index].show()
def showLoadingScreen(session):
global loadingScreenPopup
if not loadingScreenPopup and session:
loadingScreenPopup = session.instantiateDialog(EmbyLoadingScreen)
if loadingScreenPopup:
loadingScreenPopup.updateBackdrop()
loadingScreenPopup.show()
def hideLoadingScreen():
global loadingScreenPopup
if loadingScreenPopup:
loadingScreenPopup.hide()
threads.deferToThread(Path.unlink, f"/tmp{EMBY_THUMB_CACHE_DIR}/backdrop_dimmed.jpg", missing_ok=True)