homebridge-stream-triggers 1.2.0 → 1.3.0

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/README.md CHANGED
@@ -69,7 +69,7 @@ A static list can be set instead (mainly for testing; it disables fetching entir
69
69
  | --- | --- | --- |
70
70
  | `key` | yes | Short unique id (e.g. `destiny`). Seeds the accessory UUID, so it's stable across restarts. |
71
71
  | `type` | yes | `youtube`, `twitch`, or `kick`. |
72
- | `url` | youtube | YouTube: the channel's live page, e.g. `https://www.youtube.com/@destiny/live` (required). Kick: the channel link, e.g. `https://kick.com/vinesauce` (optional; tried as a deep link, falls back to opening the app). |
72
+ | `url` | youtube | YouTube: the channel's live page, e.g. `https://www.youtube.com/@destiny/live` (required). Twitch/Kick: optional; when set it is tried as a deep link, falling back to opening the app if the command is rejected. |
73
73
  | `displayName` | no | Defaults to the capitalized key. The switch is named `<displayName><suffix>` (e.g. `Destiny Trigger`). |
74
74
 
75
75
  ### Platform options
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYxC,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAFL,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK;IAG/B,6EAA6E;IACvE,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YA+BrC,UAAU;CAsBzB"}
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAkBxC,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAFL,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK;IAG/B,6EAA6E;IACvE,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAgCrC,UAAU;CAkBzB"}
package/lib/launcher.js CHANGED
@@ -6,7 +6,13 @@
6
6
  * client has requested the app list once (documented pyatv FAQ behavior). Priming on
7
7
  * every launch keeps the system self-healing across tvOS updates.
8
8
  */
9
- const KICK_APP_ID = "com.kick.mobile";
9
+ /**
10
+ * App to open when a channel has no deep-link url, and the fallback when a
11
+ * deep link is rejected. Twitch's tvOS client almost certainly ignores deep
12
+ * links (see CLAUDE.md), so omni-notify sends twitch channels without a url;
13
+ * a url can be supplied to experiment.
14
+ */
15
+ const FALLBACK_APP_IDS = { twitch: "tv.twitch", kick: "com.kick.mobile" };
10
16
  export class StreamLauncher {
11
17
  log;
12
18
  atv;
@@ -31,14 +37,14 @@ export class StreamLauncher {
31
37
  if (!uri)
32
38
  return;
33
39
  if (!(await this.atv.run(`launch_app=${uri}`, prefix))) {
34
- // The Kick deep link (https://kick.com/<user> universal link) is
35
- // unverified on tvOS; if it's rejected, opening the app still beats
36
- // doing nothing.
37
- if (channel.type === "kick" && uri !== KICK_APP_ID) {
38
- this.log.warn(`${prefix} Kick deep link rejected; opening the Kick app`);
39
- if (!(await this.atv.run(`launch_app=${KICK_APP_ID}`, prefix)))
40
+ // Twitch/Kick deep links are unverified on tvOS; if one is rejected,
41
+ // opening the app still beats doing nothing.
42
+ const fallbackApp = channel.type === "youtube" ? undefined : FALLBACK_APP_IDS[channel.type];
43
+ if (fallbackApp && uri !== fallbackApp) {
44
+ this.log.warn(`${prefix} Deep link rejected; opening the app instead`);
45
+ if (!(await this.atv.run(`launch_app=${fallbackApp}`, prefix)))
40
46
  return;
41
- this.log.info(`${prefix} Launched ${KICK_APP_ID}`);
47
+ this.log.info(`${prefix} Launched ${fallbackApp}`);
42
48
  }
43
49
  return;
44
50
  }
@@ -49,14 +55,10 @@ export class StreamLauncher {
49
55
  }
50
56
  }
51
57
  async resolveUri(channel, prefix) {
52
- if (channel.type === "twitch") {
53
- // The tvOS Twitch app has no deep links; opening the app is the intended behavior.
54
- return "tv.twitch";
55
- }
56
- if (channel.type === "kick") {
57
- // Try the universal link (kick.com's AASA claims https://kick.com/*);
58
- // without a url, just open the app.
59
- return channel.url ?? KICK_APP_ID;
58
+ if (channel.type === "twitch" || channel.type === "kick") {
59
+ // With a url, try it as a deep link (falls back to the app if rejected);
60
+ // without one, just open the app.
61
+ return channel.url ?? FALLBACK_APP_IDS[channel.type];
60
62
  }
61
63
  if (!channel.url) {
62
64
  this.log.error(`${prefix} YouTube channel is missing "url"`);
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "homebridge-stream-triggers",
3
3
  "displayName": "Homebridge Stream Triggers",
4
- "version": "1.2.0",
4
+ "version": "1.3.0",
5
5
  "description": "HomeKit switches that launch live streams (YouTube/Twitch) on an Apple TV via atvremote and yt-dlp.",
6
6
  "keywords": [
7
7
  "homebridge-plugin",