homebridge-stream-triggers 1.1.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
@@ -23,7 +23,11 @@ When a switch flips on (e.g. via a "Stream Destiny" HomeKit scene):
23
23
  video id. If the channel isn't live, the launch stops there (TV awake, nothing playing).
24
24
  4. **Launch** — `atvremote launch_app=youtube://www.youtube.com/watch?v=<id>` for YouTube,
25
25
  or `launch_app=tv.twitch` for Twitch (the tvOS Twitch app has no deep links; opening
26
- the app is the intended behavior).
26
+ the app is the intended behavior). For Kick, the channel's universal link
27
+ (`https://kick.com/<user>`) is tried as a deep link — kick.com's app-site-association
28
+ claims all its URLs for the app, but tvOS handling is unverified — and if the command
29
+ is rejected the plugin falls back to just opening the Kick app (`com.kick.mobile`,
30
+ requires tvOS 18+).
27
31
 
28
32
  The switch is momentary: it auto-resets to off after `resetDelay` ms, and the launch runs
29
33
  fire-and-forget in the background. Repeat flips while a launch is in flight are ignored.
@@ -44,7 +48,8 @@ streamers skipped), so adding a streamer there is all it takes.
44
48
  The list re-syncs hourly (`channelsRefreshInterval`), so new streamers appear without a
45
49
  restart. If omni-notify is unreachable at startup, previously-known switches keep working
46
50
  from the accessory cache (the channel is stored in each accessory's context) and fetching
47
- retries every minute until it succeeds.
51
+ retries every minute until it succeeds. Setting `channelsRefreshInterval` to `0` disables
52
+ all background fetching, including that startup retry.
48
53
 
49
54
  A static list can be set instead (mainly for testing; it disables fetching entirely):
50
55
 
@@ -63,8 +68,8 @@ A static list can be set instead (mainly for testing; it disables fetching entir
63
68
  | Field | Required | Description |
64
69
  | --- | --- | --- |
65
70
  | `key` | yes | Short unique id (e.g. `destiny`). Seeds the accessory UUID, so it's stable across restarts. |
66
- | `type` | yes | `youtube` or `twitch`. |
67
- | `url` | youtube only | The channel's live page, e.g. `https://www.youtube.com/@destiny/live`. |
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). Twitch/Kick: optional; when set it is tried as a deep link, falling back to opening the app if the command is rejected. |
68
73
  | `displayName` | no | Defaults to the capitalized key. The switch is named `<displayName><suffix>` (e.g. `Destiny Trigger`). |
69
74
 
70
75
  ### Platform options
@@ -75,7 +80,7 @@ A static list can be set instead (mainly for testing; it disables fetching entir
75
80
  | `channelsRefreshInterval` | `3600000` (1h) | How often (ms) to re-fetch the list and re-sync switches. `0` disables background refresh. |
76
81
  | `credentialsDir` | `/var/lib/homebridge/appletv-enhanced` | Where homebridge-appletv-enhanced stores Apple TV pairings. |
77
82
  | `appleTvId` | auto | Apple TV identifier. Auto-discovered as the single subdirectory of `credentialsDir` containing a `credentials.txt`; set explicitly if there are multiple. |
78
- | `atvremotePath` | `<credentialsDir>/.venv/bin/atvremote` path | `atvremote` binary from appletv-enhanced's venv (that plugin keeps pyatv updated). |
83
+ | `atvremotePath` | `/var/lib/homebridge/appletv-enhanced/.venv/bin/atvremote` | `atvremote` binary from appletv-enhanced's venv (that plugin keeps pyatv updated). |
79
84
  | `ytDlpPath` | self-managed | Override for testing. By default the plugin downloads the latest standalone `yt-dlp` into Homebridge's storage dir and refreshes it when older than 30 days (stale copies break against YouTube within months). |
80
85
  | `suffix` | `" Trigger"` | Appended to switch names, avoiding collisions with the "Stream X" scene names. |
81
86
  | `resetDelay` | `2000` | How long (ms) a switch reads "on" before auto-resetting. |
@@ -18,8 +18,9 @@
18
18
  },
19
19
  "channelsRefreshInterval": {
20
20
  "title": "Channel Refresh Interval (ms)",
21
- "description": "How often to re-fetch the channel list and re-sync switches. 0 disables background refresh.",
22
- "type": "number",
21
+ "description": "How often to re-fetch the channel list and re-sync switches. 0 disables all background fetching, including the retry after a failed startup fetch.",
22
+ "type": "integer",
23
+ "minimum": 0,
23
24
  "default": 3600000
24
25
  },
25
26
  "channels": {
@@ -45,13 +46,14 @@
45
46
  "type": "string",
46
47
  "oneOf": [
47
48
  { "title": "YouTube", "enum": ["youtube"] },
48
- { "title": "Twitch", "enum": ["twitch"] }
49
+ { "title": "Twitch", "enum": ["twitch"] },
50
+ { "title": "Kick", "enum": ["kick"] }
49
51
  ],
50
52
  "required": true
51
53
  },
52
54
  "url": {
53
55
  "title": "URL",
54
- "description": "Channel live page (required for YouTube), e.g. https://www.youtube.com/@destiny/live",
56
+ "description": "YouTube: channel live page (required), e.g. https://www.youtube.com/@destiny/live. Kick: channel link (optional), e.g. https://kick.com/vinesauce, tried as a deep link.",
55
57
  "type": "string"
56
58
  }
57
59
  }
@@ -88,7 +90,8 @@
88
90
  "resetDelay": {
89
91
  "title": "Reset Delay (ms)",
90
92
  "description": "How long a switch reads \"on\" before auto-resetting to off.",
91
- "type": "number",
93
+ "type": "integer",
94
+ "minimum": 1,
92
95
  "default": 2000
93
96
  }
94
97
  }
package/lib/config.d.ts CHANGED
@@ -5,6 +5,7 @@ export declare const channelSchema: z.ZodObject<{
5
5
  type: z.ZodEnum<{
6
6
  youtube: "youtube";
7
7
  twitch: "twitch";
8
+ kick: "kick";
8
9
  }>;
9
10
  url: z.ZodOptional<z.ZodString>;
10
11
  }, z.core.$strip>;
@@ -16,11 +17,13 @@ export declare const configSchema: z.ZodObject<{
16
17
  type: z.ZodEnum<{
17
18
  youtube: "youtube";
18
19
  twitch: "twitch";
20
+ kick: "kick";
19
21
  }>;
20
22
  url: z.ZodOptional<z.ZodString>;
21
23
  }, z.core.$strip>>>;
22
24
  channelsUrl: z.ZodDefault<z.ZodString>;
23
25
  channelsRefreshInterval: z.ZodDefault<z.ZodNumber>;
26
+ channelsRetryDelay: z.ZodDefault<z.ZodNumber>;
24
27
  credentialsDir: z.ZodDefault<z.ZodString>;
25
28
  appleTvId: z.ZodOptional<z.ZodString>;
26
29
  atvremotePath: z.ZodDefault<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,aAAa;;;;;;;;iBAKxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;iBAcvB,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEhE,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAE9D;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAG7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,aAAa;;;;;;;;;iBAMxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAK1D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;iBAqBvB,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEhE,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAE9D;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAG7D"}
package/lib/config.js CHANGED
@@ -2,15 +2,25 @@ import { z } from "zod";
2
2
  export const channelSchema = z.object({
3
3
  key: z.string().min(1),
4
4
  displayName: z.string().min(1).optional(),
5
- type: z.enum(["youtube", "twitch"]),
5
+ type: z.enum(["youtube", "twitch", "kick"]),
6
+ /** youtube: live page for yt-dlp. kick: universal link tried as a deep link. */
6
7
  url: z.string().min(1).optional(),
7
8
  });
9
+ /** Node clamps larger setTimeout delays to 1ms, which would turn timers into hot loops. */
10
+ const MAX_TIMER_MS = 2_147_483_647;
8
11
  export const configSchema = z.object({
9
12
  /** Static override; when empty the list is fetched from channelsUrl. */
10
13
  channels: z.array(channelSchema).default([]),
11
14
  channelsUrl: z.string().default("http://omni.boris/api/trigger-channels"),
12
15
  /** How often to re-fetch the channel list and re-sync switches. 0 disables. */
13
- channelsRefreshInterval: z.number().int().nonnegative().default(3_600_000),
16
+ channelsRefreshInterval: z
17
+ .number()
18
+ .int()
19
+ .nonnegative()
20
+ .max(MAX_TIMER_MS)
21
+ .default(3_600_000),
22
+ /** Delay before retrying after a failed fetch. Not in the UI schema; mainly for tests. */
23
+ channelsRetryDelay: z.number().int().positive().max(MAX_TIMER_MS).default(60_000),
14
24
  credentialsDir: z.string().default("/var/lib/homebridge/appletv-enhanced"),
15
25
  appleTvId: z.string().optional(),
16
26
  atvremotePath: z
@@ -18,7 +28,7 @@ export const configSchema = z.object({
18
28
  .default("/var/lib/homebridge/appletv-enhanced/.venv/bin/atvremote"),
19
29
  ytDlpPath: z.string().optional(),
20
30
  suffix: z.string().default(" Trigger"),
21
- resetDelay: z.number().int().positive().default(2000),
31
+ resetDelay: z.number().int().positive().max(MAX_TIMER_MS).default(2000),
22
32
  });
23
33
  /** Pure parse of the raw platform config; throws ZodError on invalid input. */
24
34
  export function parseConfig(raw) {
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,wEAAwE;IACxE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC;IACzE,+EAA+E;IAC/E,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC;IAC1E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,OAAO,CAAC,0DAA0D,CAAC;IACtE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACtD,CAAC,CAAC;AAIH,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,OAAsB;IACnD,IAAI,OAAO,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC,WAAW,CAAC;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,gFAAgF;IAChF,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH,2FAA2F;AAC3F,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,wEAAwE;IACxE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC;IACzE,+EAA+E;IAC/E,uBAAuB,EAAE,CAAC;SACvB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,WAAW,EAAE;SACb,GAAG,CAAC,YAAY,CAAC;SACjB,OAAO,CAAC,SAAS,CAAC;IACrB,0FAA0F;IAC1F,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjF,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC;IAC1E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,OAAO,CAAC,0DAA0D,CAAC;IACtE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;CACxE,CAAC,CAAC;AAIH,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,OAAsB;IACnD,IAAI,OAAO,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC,WAAW,CAAC;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
package/lib/exec.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../src/exec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAY,MAAM,2BAA2B,CAAC;AAIlE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAQ7B;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAStD;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE1D;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAG3D"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../src/exec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAyB,MAAM,2BAA2B,CAAC;AAS/E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAY7B;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAStD;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE1D;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAG3D"}
package/lib/exec.js CHANGED
@@ -1,14 +1,19 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
- import { tryCatch } from "@micthiesen/mitools/async";
3
+ import { tryCatch, withTimeout } from "@micthiesen/mitools/async";
4
4
  const execFileAsync = promisify(execFile);
5
+ // execFile's own timeout only kills the child; if the child ignores the signal or a
6
+ // grandchild holds the stdio pipes open, the promise never settles. The outer
7
+ // withTimeout guarantees the caller always gets an answer (and SIGKILL can't be ignored).
8
+ const KILL_GRACE_MS = 5_000;
5
9
  /** Run a binary with a hard timeout, returning a Result instead of throwing. */
6
10
  export async function runCommand(file, args, timeoutMs) {
7
11
  return tryCatch(async () => {
8
- const { stdout, stderr } = await execFileAsync(file, args, {
12
+ const { stdout, stderr } = await withTimeout(execFileAsync(file, args, {
9
13
  timeout: timeoutMs,
14
+ killSignal: "SIGKILL",
10
15
  maxBuffer: 16 * 1024 * 1024,
11
- });
16
+ }), timeoutMs + KILL_GRACE_MS);
12
17
  return { stdout, stderr };
13
18
  });
14
19
  }
package/lib/exec.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../src/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAe,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAO1C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAAc,EACd,SAAiB;IAEjB,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;YACzD,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,MAAM,SAAS,GAAG,KAAgD,CAAC;IACnE,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,2BAA2B,CAAC;IACpE,IAAI,SAAS,CAAC,MAAM;QAClB,OAAO,6BAA6B,SAAS,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GACR,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAChF,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,KAAY;IAC/C,OAAQ,KAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../src/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAe,QAAQ,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE/E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,oFAAoF;AACpF,8EAA8E;AAC9E,0FAA0F;AAC1F,MAAM,aAAa,GAAG,KAAK,CAAC;AAO5B,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAAc,EACd,SAAiB;IAEjB,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAC1C,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;YACxB,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,EACF,SAAS,GAAG,aAAa,CAC1B,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,MAAM,SAAS,GAAG,KAAgD,CAAC;IACnE,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,2BAA2B,CAAC;IACpE,IAAI,SAAS,CAAC,MAAM;QAClB,OAAO,6BAA6B,SAAS,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GACR,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAChF,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,KAAY;IAC/C,OAAQ,KAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}
package/lib/launcher.d.ts CHANGED
@@ -2,14 +2,6 @@ import type { Logging } from "homebridge";
2
2
  import type { AppleTv } from "./atv.js";
3
3
  import type { ChannelConfig } from "./config.js";
4
4
  import type { YtDlp } from "./ytdlp.js";
5
- /**
6
- * The launch flow: wake -> app_list prime -> resolve -> launch_app.
7
- *
8
- * The app_list prime is REQUIRED: after an Apple TV reboot (e.g. a tvOS auto-update),
9
- * tvOS silently drops app-launch requests with a Companion protocol timeout until some
10
- * client has requested the app list once (documented pyatv FAQ behavior). Priming on
11
- * every launch keeps the system self-healing across tvOS updates.
12
- */
13
5
  export declare class StreamLauncher {
14
6
  private readonly log;
15
7
  private readonly atv;
@@ -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;AAExC;;;;;;;GAOG;AACH,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;YAqBrC,UAAU;CAiBzB"}
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,6 +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
+ /**
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" };
9
16
  export class StreamLauncher {
10
17
  log;
11
18
  atv;
@@ -29,8 +36,18 @@ export class StreamLauncher {
29
36
  const uri = await this.resolveUri(channel, prefix);
30
37
  if (!uri)
31
38
  return;
32
- if (!(await this.atv.run(`launch_app=${uri}`, prefix)))
39
+ if (!(await this.atv.run(`launch_app=${uri}`, 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)))
46
+ return;
47
+ this.log.info(`${prefix} Launched ${fallbackApp}`);
48
+ }
33
49
  return;
50
+ }
34
51
  this.log.info(`${prefix} Launched ${uri}`);
35
52
  }
36
53
  catch (error) {
@@ -38,9 +55,10 @@ export class StreamLauncher {
38
55
  }
39
56
  }
40
57
  async resolveUri(channel, prefix) {
41
- if (channel.type === "twitch") {
42
- // The tvOS Twitch app has no deep links; opening the app is the intended behavior.
43
- return "tv.twitch";
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];
44
62
  }
45
63
  if (!channel.url) {
46
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":"AAKA;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IAEN;IACA;IACA;IAHnB,YACmB,GAAY,EACZ,GAAY,EACZ,KAAY;QAFZ,QAAG,GAAH,GAAG,CAAS;QACZ,QAAG,GAAH,GAAG,CAAS;QACZ,UAAK,GAAL,KAAK,CAAO;IAC5B,CAAC;IAEJ,6EAA6E;IAC7E,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,sBAAsB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAE9D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO;YACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC;YAE1C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO;YACtD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC;YAE3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,GAAG;gBAAE,OAAO;YAEjB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO;YAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,gCAAgC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,OAAsB,EACtB,MAAc;QAEd,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,mFAAmF;YACnF,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,mCAAmC,CAAC,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC,CAAC,iDAAiD;QACjF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAmB,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,qCAAqC,OAAO,EAAE,CAAC;IACxD,CAAC;CACF"}
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
package/lib/platform.d.ts CHANGED
@@ -5,12 +5,14 @@ export declare class StreamTriggersPlatform implements DynamicPlatformPlugin {
5
5
  readonly Service: typeof Service;
6
6
  readonly Characteristic: typeof Characteristic;
7
7
  private readonly config;
8
+ private readonly configValid;
8
9
  private readonly accessories;
9
10
  private readonly launchesInFlight;
10
11
  private readonly ytDlp;
11
12
  private readonly launcher;
12
13
  constructor(log: Logging, rawConfig: PlatformConfig, api: API);
13
14
  private startup;
15
+ private trySync;
14
16
  /**
15
17
  * Background re-sync so channel changes in omni-notify appear without a
16
18
  * Homebridge restart. Failures retry sooner (covers omni-notify still
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,OAAO,EACP,iBAAiB,EACjB,cAAc,EACd,OAAO,EACR,MAAM,YAAY,CAAC;AAgBpB,qBAAa,sBAAuB,YAAW,qBAAqB;aAWhD,GAAG,EAAE,OAAO;aAEZ,GAAG,EAAE,GAAG;IAZ1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IAEtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IACpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;gBAGxB,GAAG,EAAE,OAAO,EAC5B,SAAS,EAAE,cAAc,EACT,GAAG,EAAE,GAAG;YAuBZ,OAAO;IAuBrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAkBvB,8EAA8E;IAC9E,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAKtD,mFAAmF;IACnF,OAAO,CAAC,eAAe;IAsCvB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,WAAW;IA2BnB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;CAiBtB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,OAAO,EACP,iBAAiB,EACjB,cAAc,EACd,OAAO,EACR,MAAM,YAAY,CAAC;AAcpB,qBAAa,sBAAuB,YAAW,qBAAqB;aAYhD,GAAG,EAAE,OAAO;aAEZ,GAAG,EAAE,GAAG;IAb1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IAEtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IACpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;gBAGxB,GAAG,EAAE,OAAO,EAC5B,SAAS,EAAE,cAAc,EACT,GAAG,EAAE,GAAG;YA2BZ,OAAO;IAqBrB,OAAO,CAAC,OAAO;IAQf;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAkBvB,8EAA8E;IAC9E,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAKtD,mFAAmF;IACnF,OAAO,CAAC,eAAe;IA4CvB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,WAAW;IAkCnB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;CAiBtB"}
package/lib/platform.js CHANGED
@@ -4,13 +4,13 @@ import { channelSchema, configSchema, displayNameFor, } from "./config.js";
4
4
  import { StreamLauncher } from "./launcher.js";
5
5
  import { PLATFORM_NAME, PLUGIN_NAME } from "./settings.js";
6
6
  import { YtDlp } from "./ytdlp.js";
7
- const REFRESH_RETRY_MS = 60_000;
8
7
  export class StreamTriggersPlatform {
9
8
  log;
10
9
  api;
11
10
  Service;
12
11
  Characteristic;
13
12
  config;
13
+ configValid;
14
14
  accessories = new Map();
15
15
  launchesInFlight = new Set();
16
16
  ytDlp;
@@ -21,11 +21,15 @@ export class StreamTriggersPlatform {
21
21
  this.Service = api.hap.Service;
22
22
  this.Characteristic = api.hap.Characteristic;
23
23
  const parsed = configSchema.safeParse(rawConfig);
24
+ this.configValid = parsed.success;
24
25
  if (parsed.success) {
25
26
  this.config = parsed.data;
26
27
  }
27
28
  else {
28
- this.log.error(`Invalid config, running with no channels: ${parsed.error.message}`);
29
+ // Going inert (not falling back to defaults) is deliberate: default paths
30
+ // could hit the wrong binaries/endpoints, and syncing with a guessed config
31
+ // could unregister working accessories. Cached accessories stay registered.
32
+ this.log.error(`Invalid config; plugin is inactive until it is fixed: ${parsed.error.message}`);
29
33
  this.config = configSchema.parse({});
30
34
  }
31
35
  this.ytDlp = new YtDlp(log, api.user.storagePath(), this.config.ytDlpPath);
@@ -35,28 +39,34 @@ export class StreamTriggersPlatform {
35
39
  });
36
40
  }
37
41
  async startup() {
38
- try {
39
- if (this.config.channels.length > 0) {
40
- // Static config override (mainly for testing); no fetching involved.
41
- this.syncAccessories(this.config.channels);
42
+ if (!this.configValid)
43
+ return;
44
+ if (this.config.channels.length > 0) {
45
+ // Static config override (mainly for testing); no fetching involved.
46
+ this.trySync(this.config.channels);
47
+ }
48
+ else {
49
+ const channels = await fetchChannels(this.config.channelsUrl, this.log);
50
+ if (channels) {
51
+ this.trySync(channels);
42
52
  }
43
53
  else {
44
- const channels = await fetchChannels(this.config.channelsUrl, this.log);
45
- if (channels) {
46
- this.syncAccessories(channels);
47
- }
48
- else {
49
- this.wireCachedAccessories();
50
- }
51
- this.scheduleRefresh(channels ? this.config.channelsRefreshInterval : REFRESH_RETRY_MS);
54
+ this.wireCachedAccessories();
52
55
  }
53
- }
54
- catch (error) {
55
- this.log.error(`Startup failed: ${String(error)}`);
56
+ // Outside any fallible region: a sync failure must not kill the refresh chain.
57
+ this.scheduleRefresh(channels ? this.config.channelsRefreshInterval : this.config.channelsRetryDelay);
56
58
  }
57
59
  // Non-blocking: download/refresh the managed yt-dlp binary in the background.
58
60
  void this.ytDlp.ensureFresh();
59
61
  }
62
+ trySync(channels) {
63
+ try {
64
+ this.syncAccessories(channels);
65
+ }
66
+ catch (error) {
67
+ this.log.error(`Failed to sync accessories: ${String(error)}`);
68
+ }
69
+ }
60
70
  /**
61
71
  * Background re-sync so channel changes in omni-notify appear without a
62
72
  * Homebridge restart. Failures retry sooner (covers omni-notify still
@@ -66,7 +76,7 @@ export class StreamTriggersPlatform {
66
76
  if (this.config.channelsRefreshInterval <= 0)
67
77
  return;
68
78
  const timer = setTimeout(async () => {
69
- let nextDelayMs = REFRESH_RETRY_MS;
79
+ let nextDelayMs = this.config.channelsRetryDelay;
70
80
  try {
71
81
  const channels = await fetchChannels(this.config.channelsUrl, this.log);
72
82
  if (channels) {
@@ -90,12 +100,15 @@ export class StreamTriggersPlatform {
90
100
  syncAccessories(channels) {
91
101
  const configuredUuids = new Set();
92
102
  for (const channel of channels) {
103
+ const uuid = this.api.hap.uuid.generate(`${PLUGIN_NAME}.${channel.key}`);
104
+ // Marked as configured even when skipped below, so a transiently broken
105
+ // channel entry never unregisters a working accessory (which would strip
106
+ // its HomeKit room/scene/automation assignments).
107
+ configuredUuids.add(uuid);
93
108
  if (channel.type === "youtube" && !channel.url) {
94
- this.log.error(`[${channel.key}] YouTube channel is missing "url"; skipping`);
109
+ this.log.error(`[${channel.key}] YouTube channel is missing "url"; skipping (existing switch retained)`);
95
110
  continue;
96
111
  }
97
- const uuid = this.api.hap.uuid.generate(`${PLUGIN_NAME}.${channel.key}`);
98
- configuredUuids.add(uuid);
99
112
  const name = `${displayNameFor(channel)}${this.config.suffix}`;
100
113
  const existing = this.accessories.get(uuid);
101
114
  if (existing) {
@@ -142,6 +155,12 @@ export class StreamTriggersPlatform {
142
155
  this.log.warn(`Channel list unavailable; running with ${wired} cached switch(es)`);
143
156
  }
144
157
  setUpSwitch(accessory, channel, name) {
158
+ accessory
159
+ .getService(this.Service.AccessoryInformation)
160
+ ?.setCharacteristic(this.Characteristic.Name, name)
161
+ .setCharacteristic(this.Characteristic.Manufacturer, "micthiesen")
162
+ .setCharacteristic(this.Characteristic.Model, "Stream Trigger")
163
+ .setCharacteristic(this.Characteristic.SerialNumber, channel.key);
145
164
  const service = accessory.getService(this.Service.Switch) ??
146
165
  accessory.addService(this.Service.Switch);
147
166
  service.setCharacteristic(this.Characteristic.Name, name);
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ytdlp.d.ts","sourceRoot":"","sources":["../src/ytdlp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAO1C,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAM,CAAC,YAA2B,GACvC,MAAM,GAAG,SAAS,CAKpB;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAmB,GAAG,OAAO,CAE5E;AAED;;;;GAIG;AACH,qBAAa,KAAK;IAKd,OAAO,CAAC,QAAQ,CAAC,GAAG;IAEpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,OAAO,CAAC,eAAe,CAA4B;gBAGhC,GAAG,EAAE,OAAO,EAC7B,WAAW,EAAE,MAAM,EACF,YAAY,EAAE,MAAM,GAAG,SAAS;IAKnD,8EAA8E;IAC9E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;;;OAIG;IACG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA+BlF,yEAAyE;YAC3D,UAAU;YAWV,OAAO;YAaP,QAAQ;CAuBvB"}
1
+ {"version":3,"file":"ytdlp.d.ts","sourceRoot":"","sources":["../src/ytdlp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAY1C,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAM,CAAC,YAA2B,GACvC,MAAM,GAAG,SAAS,CAKpB;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAmB,GAAG,OAAO,CAE5E;AAED;;;;GAIG;AACH,qBAAa,KAAK;IAKd,OAAO,CAAC,QAAQ,CAAC,GAAG;IAEpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,OAAO,CAAC,eAAe,CAA4B;gBAGhC,GAAG,EAAE,OAAO,EAC7B,WAAW,EAAE,MAAM,EACF,YAAY,EAAE,MAAM,GAAG,SAAS;IAKnD,8EAA8E;IAC9E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;;;OAIG;IACG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAkClF,yEAAyE;YAC3D,UAAU;YAWV,OAAO;YAaP,QAAQ;CAuBvB"}
package/lib/ytdlp.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { tryCatch } from "@micthiesen/mitools/async";
4
- import { describeExecError, isMissingBinaryError, runCommand } from "./exec.js";
4
+ import { describeExecError, exitCodeOf, isMissingBinaryError, runCommand, } from "./exec.js";
5
5
  const YTDLP_TIMEOUT_MS = 60_000;
6
6
  const DOWNLOAD_TIMEOUT_MS = 180_000;
7
7
  const MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
@@ -59,10 +59,14 @@ export class YtDlp {
59
59
  this.log.error(`${prefix} yt-dlp binary missing at ${binary}`);
60
60
  void this.ensureFresh();
61
61
  }
62
- else {
63
- // Non-zero exit = channel not live. Expected, not an error.
62
+ else if (exitCodeOf(result.error) !== undefined) {
63
+ // A clean non-zero exit = channel not live. Expected, not an error.
64
64
  this.log.info(`${prefix} Not live (yt-dlp: ${describeExecError(result.error)})`);
65
65
  }
66
+ else {
67
+ // Spawn failures (EACCES, ...) and timeouts are real errors.
68
+ this.log.error(`${prefix} yt-dlp failed: ${describeExecError(result.error)}`);
69
+ }
66
70
  return undefined;
67
71
  }
68
72
  const id = result.value.stdout.trim().split("\n").at(-1)?.trim();
package/lib/ytdlp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ytdlp.js","sourceRoot":"","sources":["../src/ytdlp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ytdlp.js","sourceRoot":"","sources":["../src/ytdlp.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.1.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",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "repository": {
19
19
  "type": "git",
20
- "url": "git://github.com/micthiesen/homebridge-stream-triggers.git"
20
+ "url": "git+https://github.com/micthiesen/homebridge-stream-triggers.git"
21
21
  },
22
22
  "type": "module",
23
23
  "license": "MIT",