@homebridge-plugins/homebridge-homepod-radio 3.2.9 → 3.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/warm-worker.py +15 -3
- package/dist/lib/warmPlayer.d.ts +4 -0
- package/dist/lib/warmPlayer.js +56 -11
- package/dist/lib/warmPlayer.js.map +1 -1
- package/dist/warm-worker.py +15 -3
- package/package.json +1 -1
package/bin/warm-worker.py
CHANGED
|
@@ -29,9 +29,16 @@ import os
|
|
|
29
29
|
import re
|
|
30
30
|
import sys
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
from pyatv.
|
|
32
|
+
try:
|
|
33
|
+
import pyatv
|
|
34
|
+
from pyatv.const import Protocol
|
|
35
|
+
from pyatv.interface import MediaMetadata
|
|
36
|
+
_PYATV_IMPORT_ERROR = None
|
|
37
|
+
except ImportError as ex:
|
|
38
|
+
pyatv = None
|
|
39
|
+
Protocol = None
|
|
40
|
+
MediaMetadata = None
|
|
41
|
+
_PYATV_IMPORT_ERROR = ex
|
|
35
42
|
|
|
36
43
|
|
|
37
44
|
_LOGGER = logging.getLogger("warm-worker")
|
|
@@ -198,6 +205,11 @@ def main() -> None:
|
|
|
198
205
|
format="%(asctime)s %(levelname)s [%(name)s]: %(message)s",
|
|
199
206
|
)
|
|
200
207
|
|
|
208
|
+
if _PYATV_IMPORT_ERROR is not None:
|
|
209
|
+
_LOGGER.error("Required dependency 'pyatv' was not found. Install it with: pip3 install pyatv")
|
|
210
|
+
_LOGGER.error("Import error: %s", _PYATV_IMPORT_ERROR)
|
|
211
|
+
sys.exit(1)
|
|
212
|
+
|
|
201
213
|
try:
|
|
202
214
|
asyncio.run(main_async(args.id))
|
|
203
215
|
except KeyboardInterrupt:
|
package/dist/lib/warmPlayer.d.ts
CHANGED
|
@@ -18,8 +18,11 @@ export declare class WarmPlayer {
|
|
|
18
18
|
private rl;
|
|
19
19
|
private ready;
|
|
20
20
|
private stopped;
|
|
21
|
+
private restartDisabled;
|
|
21
22
|
private restartDelay;
|
|
22
23
|
private readonly MAX_RESTART_DELAY;
|
|
24
|
+
private startAttempts;
|
|
25
|
+
private readonly MAX_START_ATTEMPTS;
|
|
23
26
|
private readonly PLAY_TIMEOUT_MS;
|
|
24
27
|
private nextId;
|
|
25
28
|
private readonly pending;
|
|
@@ -27,6 +30,7 @@ export declare class WarmPlayer {
|
|
|
27
30
|
private readonly debug;
|
|
28
31
|
constructor(homepodId: string, logger: Logger, verboseMode: boolean);
|
|
29
32
|
start(): void;
|
|
33
|
+
private logWorkerStderr;
|
|
30
34
|
private handleLine;
|
|
31
35
|
private scheduleRestart;
|
|
32
36
|
private failAllPending;
|
package/dist/lib/warmPlayer.js
CHANGED
|
@@ -22,8 +22,11 @@ export class WarmPlayer {
|
|
|
22
22
|
rl;
|
|
23
23
|
ready = false;
|
|
24
24
|
stopped = false;
|
|
25
|
+
restartDisabled = false;
|
|
25
26
|
restartDelay = 1000;
|
|
26
27
|
MAX_RESTART_DELAY = 30000;
|
|
28
|
+
startAttempts = 0;
|
|
29
|
+
MAX_START_ATTEMPTS = 3;
|
|
27
30
|
PLAY_TIMEOUT_MS = 60000;
|
|
28
31
|
nextId = 1;
|
|
29
32
|
pending = new Map();
|
|
@@ -39,25 +42,26 @@ export class WarmPlayer {
|
|
|
39
42
|
this.scriptPath = path.resolve(path.dirname(__filename), '..', 'warm-worker.py');
|
|
40
43
|
}
|
|
41
44
|
start() {
|
|
42
|
-
if (this.stopped || this.worker) {
|
|
45
|
+
if (this.stopped || this.restartDisabled || this.worker) {
|
|
43
46
|
return;
|
|
44
47
|
}
|
|
48
|
+
this.startAttempts += 1;
|
|
45
49
|
const args = ['-u', this.scriptPath, '--id', this.homepodId];
|
|
46
50
|
if (this.verboseMode) {
|
|
47
51
|
args.push('--verbose');
|
|
48
52
|
}
|
|
49
|
-
this.logger.info(`
|
|
53
|
+
this.logger.info(`Starting warm worker (attempt ${this.startAttempts}/${this.MAX_START_ATTEMPTS}): python3 ${args.join(' ')}`);
|
|
50
54
|
this.worker = child.spawn('python3', args, { env: { ...process.env } });
|
|
51
55
|
this.rl = readline.createInterface({ input: this.worker.stdout });
|
|
52
56
|
this.rl.on('line', (line) => this.handleLine(line));
|
|
53
57
|
this.worker.stderr.on('data', (data) => {
|
|
54
|
-
this.
|
|
58
|
+
this.logWorkerStderr(data.toString());
|
|
55
59
|
});
|
|
56
60
|
this.worker.on('error', (err) => {
|
|
57
|
-
this.logger.error(`
|
|
61
|
+
this.logger.error(`Warm worker spawn error: ${err}`);
|
|
58
62
|
});
|
|
59
63
|
this.worker.on('exit', (code, signal) => {
|
|
60
|
-
this.logger.warn(`
|
|
64
|
+
this.logger.warn(`Warm worker exited code=${code} signal=${signal}`);
|
|
61
65
|
this.ready = false;
|
|
62
66
|
this.rl?.close();
|
|
63
67
|
this.rl = undefined;
|
|
@@ -66,6 +70,40 @@ export class WarmPlayer {
|
|
|
66
70
|
this.scheduleRestart();
|
|
67
71
|
});
|
|
68
72
|
}
|
|
73
|
+
logWorkerStderr(output) {
|
|
74
|
+
const lines = output
|
|
75
|
+
.split(/\r?\n/)
|
|
76
|
+
.map((line) => line.trim())
|
|
77
|
+
.filter((line) => line.length > 0);
|
|
78
|
+
// The worker logs to stderr as "<date> <time> <LEVEL> [warm-worker]: <message>".
|
|
79
|
+
// Strip that prefix so Homebridge doesn't double-stamp it, and route by the
|
|
80
|
+
// worker's own level instead of guessing from keywords.
|
|
81
|
+
const prefix = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\s+(DEBUG|INFO|WARNING|ERROR|CRITICAL)\s+\[[^\]]*\]:\s*(.*)$/;
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
const match = prefix.exec(line);
|
|
84
|
+
if (match) {
|
|
85
|
+
const [, level, message] = match;
|
|
86
|
+
if (level === 'ERROR' || level === 'CRITICAL') {
|
|
87
|
+
this.logger.error(`Warm worker: ${message}`);
|
|
88
|
+
}
|
|
89
|
+
else if (level === 'WARNING') {
|
|
90
|
+
this.logger.warn(`Warm worker: ${message}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.debug(`Warm worker: ${message}`);
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// Lines without the worker's standard prefix (e.g. raw traceback
|
|
98
|
+
// continuation lines): fall back to a keyword heuristic.
|
|
99
|
+
if (/traceback|error|exception|module not found/i.test(line)) {
|
|
100
|
+
this.logger.error(`Warm worker: ${line}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this.logger.warn(`Warm worker: ${line}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
69
107
|
handleLine(line) {
|
|
70
108
|
const trimmed = line.trim();
|
|
71
109
|
if (!trimmed) {
|
|
@@ -77,13 +115,14 @@ export class WarmPlayer {
|
|
|
77
115
|
msg = JSON.parse(trimmed);
|
|
78
116
|
}
|
|
79
117
|
catch {
|
|
80
|
-
this.debug(`
|
|
118
|
+
this.debug(`Warm worker non-JSON output: ${trimmed}`);
|
|
81
119
|
return;
|
|
82
120
|
}
|
|
83
121
|
if (msg.event === 'ready') {
|
|
84
122
|
this.ready = true;
|
|
85
123
|
this.restartDelay = 1000; // healthy start resets backoff
|
|
86
|
-
this.
|
|
124
|
+
this.startAttempts = 0;
|
|
125
|
+
this.logger.info('Warm worker ready (connection held warm)');
|
|
87
126
|
return;
|
|
88
127
|
}
|
|
89
128
|
if (msg.id !== undefined && msg.id !== null) {
|
|
@@ -93,7 +132,7 @@ export class WarmPlayer {
|
|
|
93
132
|
clearTimeout(pending.timer);
|
|
94
133
|
this.pending.delete(key);
|
|
95
134
|
if (msg.ok === false && msg.error) {
|
|
96
|
-
this.logger.warn(`
|
|
135
|
+
this.logger.warn(`Warm play failed: ${msg.error}`);
|
|
97
136
|
}
|
|
98
137
|
pending.resolve(msg.ok === true);
|
|
99
138
|
}
|
|
@@ -103,9 +142,15 @@ export class WarmPlayer {
|
|
|
103
142
|
if (this.stopped) {
|
|
104
143
|
return;
|
|
105
144
|
}
|
|
145
|
+
const nextAttempt = this.startAttempts + 1;
|
|
146
|
+
if (nextAttempt > this.MAX_START_ATTEMPTS) {
|
|
147
|
+
this.restartDisabled = true;
|
|
148
|
+
this.logger.error(`Warm worker failed to start after ${this.MAX_START_ATTEMPTS} attempts; disabling warm connection until Homebridge restarts`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
106
151
|
const delay = this.restartDelay;
|
|
107
152
|
this.restartDelay = Math.min(this.restartDelay * 2, this.MAX_RESTART_DELAY);
|
|
108
|
-
this.logger.info(`
|
|
153
|
+
this.logger.info(`Restarting warm worker in ${delay}ms (attempt ${nextAttempt}/${this.MAX_START_ATTEMPTS})`);
|
|
109
154
|
setTimeout(() => this.start(), delay);
|
|
110
155
|
}
|
|
111
156
|
failAllPending() {
|
|
@@ -132,7 +177,7 @@ export class WarmPlayer {
|
|
|
132
177
|
return new Promise((resolve) => {
|
|
133
178
|
const timer = setTimeout(() => {
|
|
134
179
|
this.pending.delete(id);
|
|
135
|
-
this.logger.warn(`
|
|
180
|
+
this.logger.warn(`Warm play timed out for ${filePath}`);
|
|
136
181
|
resolve(false);
|
|
137
182
|
}, this.PLAY_TIMEOUT_MS);
|
|
138
183
|
this.pending.set(id, { resolve, timer });
|
|
@@ -142,7 +187,7 @@ export class WarmPlayer {
|
|
|
142
187
|
catch (err) {
|
|
143
188
|
clearTimeout(timer);
|
|
144
189
|
this.pending.delete(id);
|
|
145
|
-
this.logger.warn(`
|
|
190
|
+
this.logger.warn(`Failed to write to warm worker: ${err}`);
|
|
146
191
|
resolve(false);
|
|
147
192
|
}
|
|
148
193
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warmPlayer.js","sourceRoot":"","sources":["../../src/lib/warmPlayer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAOlD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"warmPlayer.js","sourceRoot":"","sources":["../../src/lib/warmPlayer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAOlD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAU;IAqBE;IACA;IACA;IAtBb,MAAM,CAAiC;IACvC,EAAE,CAAiC;IACnC,KAAK,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,KAAK,CAAC;IAChB,eAAe,GAAG,KAAK,CAAC;IAExB,YAAY,GAAG,IAAI,CAAC;IACX,iBAAiB,GAAG,KAAK,CAAC;IACnC,aAAa,GAAG,CAAC,CAAC;IACT,kBAAkB,GAAG,CAAC,CAAC;IACvB,eAAe,GAAG,KAAK,CAAC;IAEjC,MAAM,GAAG,CAAC,CAAC;IACF,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE5C,UAAU,CAAS;IACpC,8DAA8D;IAC7C,KAAK,CAAkD;IAExE,YACqB,SAAiB,EACjB,MAAc,EACd,WAAoB;QAFpB,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAS;QAErC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzG,qEAAqE;QACrE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACrF,CAAC;IAEM,KAAK;QACR,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QAExB,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,iCAAiC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,kBAAkB,cAAc,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC/G,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAExE,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAO,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,WAAW,MAAM,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,eAAe,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,MAAM;aACf,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,iFAAiF;QACjF,4EAA4E;QAC5E,wDAAwD;QACxD,MAAM,MAAM,GACR,kGAAkG,CAAC;QAEvG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;gBACjC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;gBAChD,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;gBAC1C,CAAC;gBACD,SAAS;YACb,CAAC;YAED,iEAAiE;YACjE,yDAAyD;YACzD,IAAI,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,IAAY;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QACD,8DAA8D;QAC9D,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO;QACX,CAAC;QAED,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,+BAA+B;YACzD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC7D,OAAO;QACX,CAAC;QAED,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,OAAO,EAAE,CAAC;gBACV,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;gBACvD,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YACrC,CAAC;QACL,CAAC;IACL,CAAC;IAEO,eAAe;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAC3C,IAAI,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,qCAAqC,IAAI,CAAC,kBAAkB,gEAAgE,CAC/H,CAAC;YACF,OAAO;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,6BAA6B,KAAK,eAAe,WAAW,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAC7F,CAAC;QACF,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAEO,cAAc;QAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAa;QAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QAE1F,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAEzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEzC,IAAI,CAAC;gBACD,IAAI,CAAC,MAAO,CAAC,KAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,IAAI;QACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,IAAI,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;IACxB,CAAC;CACJ"}
|
package/dist/warm-worker.py
CHANGED
|
@@ -29,9 +29,16 @@ import os
|
|
|
29
29
|
import re
|
|
30
30
|
import sys
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
from pyatv.
|
|
32
|
+
try:
|
|
33
|
+
import pyatv
|
|
34
|
+
from pyatv.const import Protocol
|
|
35
|
+
from pyatv.interface import MediaMetadata
|
|
36
|
+
_PYATV_IMPORT_ERROR = None
|
|
37
|
+
except ImportError as ex:
|
|
38
|
+
pyatv = None
|
|
39
|
+
Protocol = None
|
|
40
|
+
MediaMetadata = None
|
|
41
|
+
_PYATV_IMPORT_ERROR = ex
|
|
35
42
|
|
|
36
43
|
|
|
37
44
|
_LOGGER = logging.getLogger("warm-worker")
|
|
@@ -198,6 +205,11 @@ def main() -> None:
|
|
|
198
205
|
format="%(asctime)s %(levelname)s [%(name)s]: %(message)s",
|
|
199
206
|
)
|
|
200
207
|
|
|
208
|
+
if _PYATV_IMPORT_ERROR is not None:
|
|
209
|
+
_LOGGER.error("Required dependency 'pyatv' was not found. Install it with: pip3 install pyatv")
|
|
210
|
+
_LOGGER.error("Import error: %s", _PYATV_IMPORT_ERROR)
|
|
211
|
+
sys.exit(1)
|
|
212
|
+
|
|
201
213
|
try:
|
|
202
214
|
asyncio.run(main_async(args.id))
|
|
203
215
|
except KeyboardInterrupt:
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@homebridge-plugins/homebridge-homepod-radio",
|
|
3
3
|
"displayName": "Homepod Mini Radio",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "3.2.
|
|
5
|
+
"version": "3.2.11",
|
|
6
6
|
"description": "Homebridge accessory for streaming radio to Homepod Mini and Apple TV",
|
|
7
7
|
"author": "Petro Kushchak",
|
|
8
8
|
"license": "MIT",
|