@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.
@@ -29,9 +29,16 @@ import os
29
29
  import re
30
30
  import sys
31
31
 
32
- import pyatv
33
- from pyatv.const import Protocol
34
- from pyatv.interface import MediaMetadata
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:
@@ -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;
@@ -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(`[warm] starting worker: python3 ${args.join(' ')}`);
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.debug(`[warm worker] ${data.toString().trim()}`);
58
+ this.logWorkerStderr(data.toString());
55
59
  });
56
60
  this.worker.on('error', (err) => {
57
- this.logger.error(`[warm] worker spawn error: ${err}`);
61
+ this.logger.error(`Warm worker spawn error: ${err}`);
58
62
  });
59
63
  this.worker.on('exit', (code, signal) => {
60
- this.logger.warn(`[warm] worker exited code=${code} signal=${signal}`);
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(`[warm] non-JSON from worker: ${trimmed}`);
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.logger.info('[warm] worker ready (connection held warm)');
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(`[warm] play failed: ${msg.error}`);
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(`[warm] restarting worker in ${delay}ms`);
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(`[warm] play timed out for ${filePath}`);
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(`[warm] failed to write to worker: ${err}`);
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":"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"}
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"}
@@ -29,9 +29,16 @@ import os
29
29
  import re
30
30
  import sys
31
31
 
32
- import pyatv
33
- from pyatv.const import Protocol
34
- from pyatv.interface import MediaMetadata
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.9",
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",