prismcast 1.4.1 → 1.5.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.
Files changed (182) hide show
  1. package/dist/app.js +18 -1
  2. package/dist/app.js.map +1 -1
  3. package/dist/browser/cdp.d.ts +2 -1
  4. package/dist/browser/cdp.js +44 -23
  5. package/dist/browser/cdp.js.map +1 -1
  6. package/dist/browser/channelSelection.d.ts +45 -1
  7. package/dist/browser/channelSelection.js +164 -27
  8. package/dist/browser/channelSelection.js.map +1 -1
  9. package/dist/browser/display.d.ts +0 -4
  10. package/dist/browser/display.js +0 -7
  11. package/dist/browser/display.js.map +1 -1
  12. package/dist/browser/index.d.ts +5 -0
  13. package/dist/browser/index.js +14 -0
  14. package/dist/browser/index.js.map +1 -1
  15. package/dist/browser/precaching.d.ts +5 -0
  16. package/dist/browser/precaching.js +112 -0
  17. package/dist/browser/precaching.js.map +1 -0
  18. package/dist/browser/tuning/directv.d.ts +2 -0
  19. package/dist/browser/tuning/directv.js +723 -0
  20. package/dist/browser/tuning/directv.js.map +1 -0
  21. package/dist/browser/tuning/fox.d.ts +2 -2
  22. package/dist/browser/tuning/fox.js +141 -22
  23. package/dist/browser/tuning/fox.js.map +1 -1
  24. package/dist/browser/tuning/hbo.d.ts +2 -2
  25. package/dist/browser/tuning/hbo.js +110 -41
  26. package/dist/browser/tuning/hbo.js.map +1 -1
  27. package/dist/browser/tuning/hulu.d.ts +2 -2
  28. package/dist/browser/tuning/hulu.js +537 -211
  29. package/dist/browser/tuning/hulu.js.map +1 -1
  30. package/dist/browser/tuning/sling.d.ts +2 -2
  31. package/dist/browser/tuning/sling.js +200 -56
  32. package/dist/browser/tuning/sling.js.map +1 -1
  33. package/dist/browser/tuning/youtubeTv.d.ts +2 -2
  34. package/dist/browser/tuning/youtubeTv.js +243 -57
  35. package/dist/browser/tuning/youtubeTv.js.map +1 -1
  36. package/dist/browser/video.d.ts +1 -1
  37. package/dist/browser/video.js +4 -2
  38. package/dist/browser/video.js.map +1 -1
  39. package/dist/channels/index.js +280 -34
  40. package/dist/channels/index.js.map +1 -1
  41. package/dist/config/health.d.ts +78 -0
  42. package/dist/config/health.js +202 -0
  43. package/dist/config/health.js.map +1 -0
  44. package/dist/config/paths.d.ts +10 -0
  45. package/dist/config/paths.js +14 -0
  46. package/dist/config/paths.js.map +1 -1
  47. package/dist/config/profiles.d.ts +6 -4
  48. package/dist/config/profiles.js +65 -14
  49. package/dist/config/profiles.js.map +1 -1
  50. package/dist/config/providerPacks.d.ts +46 -0
  51. package/dist/config/providerPacks.js +200 -0
  52. package/dist/config/providerPacks.js.map +1 -0
  53. package/dist/config/providers.d.ts +47 -6
  54. package/dist/config/providers.js +211 -17
  55. package/dist/config/providers.js.map +1 -1
  56. package/dist/config/sites.d.ts +1 -12
  57. package/dist/config/sites.js +40 -7
  58. package/dist/config/sites.js.map +1 -1
  59. package/dist/config/userChannels.d.ts +41 -19
  60. package/dist/config/userChannels.js +152 -35
  61. package/dist/config/userChannels.js.map +1 -1
  62. package/dist/config/userConfig.d.ts +5 -1
  63. package/dist/config/userConfig.js +58 -6
  64. package/dist/config/userConfig.js.map +1 -1
  65. package/dist/config/userProfiles.d.ts +81 -0
  66. package/dist/config/userProfiles.js +424 -0
  67. package/dist/config/userProfiles.js.map +1 -0
  68. package/dist/routes/config/channels/index.d.ts +3 -0
  69. package/dist/routes/config/channels/index.js +3 -0
  70. package/dist/routes/config/channels/index.js.map +1 -0
  71. package/dist/routes/config/channels/routes.d.ts +6 -0
  72. package/dist/routes/config/channels/routes.js +797 -0
  73. package/dist/routes/config/channels/routes.js.map +1 -0
  74. package/dist/routes/config/channels/table.d.ts +46 -0
  75. package/dist/routes/config/channels/table.js +811 -0
  76. package/dist/routes/config/channels/table.js.map +1 -0
  77. package/dist/routes/config/index.d.ts +37 -0
  78. package/dist/routes/config/index.js +81 -0
  79. package/dist/routes/config/index.js.map +1 -0
  80. package/dist/routes/config/providers.d.ts +18 -0
  81. package/dist/routes/config/providers.js +573 -0
  82. package/dist/routes/config/providers.js.map +1 -0
  83. package/dist/routes/config/settings.d.ts +39 -0
  84. package/dist/routes/config/settings.js +820 -0
  85. package/dist/routes/config/settings.js.map +1 -0
  86. package/dist/routes/index.d.ts +3 -2
  87. package/dist/routes/index.js +7 -4
  88. package/dist/routes/index.js.map +1 -1
  89. package/dist/routes/playlist.d.ts +5 -1
  90. package/dist/routes/playlist.js +32 -7
  91. package/dist/routes/playlist.js.map +1 -1
  92. package/dist/routes/providers.d.ts +6 -0
  93. package/dist/routes/providers.js +166 -0
  94. package/dist/routes/providers.js.map +1 -0
  95. package/dist/routes/root/content.d.ts +32 -0
  96. package/dist/routes/root/content.js +857 -0
  97. package/dist/routes/root/content.js.map +1 -0
  98. package/dist/routes/root/index.js +197 -0
  99. package/dist/routes/root/index.js.map +1 -0
  100. package/dist/routes/root/scripts/channels.d.ts +1 -0
  101. package/dist/routes/root/scripts/channels.js +745 -0
  102. package/dist/routes/root/scripts/channels.js.map +1 -0
  103. package/dist/routes/root/scripts/config.d.ts +1 -0
  104. package/dist/routes/root/scripts/config.js +1662 -0
  105. package/dist/routes/root/scripts/config.js.map +1 -0
  106. package/dist/routes/root/scripts/index.d.ts +3 -0
  107. package/dist/routes/root/scripts/index.js +8 -0
  108. package/dist/routes/root/scripts/index.js.map +1 -0
  109. package/dist/routes/root/scripts/status.d.ts +1 -0
  110. package/dist/routes/root/scripts/status.js +436 -0
  111. package/dist/routes/root/scripts/status.js.map +1 -0
  112. package/dist/routes/root/styles.d.ts +5 -0
  113. package/dist/routes/root/styles.js +447 -0
  114. package/dist/routes/root/styles.js.map +1 -0
  115. package/dist/routes/theme.js +7 -1
  116. package/dist/routes/theme.js.map +1 -1
  117. package/dist/routes/ui.js +8 -3
  118. package/dist/routes/ui.js.map +1 -1
  119. package/dist/service/commands.d.ts +5 -3
  120. package/dist/service/commands.js +117 -33
  121. package/dist/service/commands.js.map +1 -1
  122. package/dist/service/generators.d.ts +27 -0
  123. package/dist/service/generators.js +97 -6
  124. package/dist/service/generators.js.map +1 -1
  125. package/dist/streaming/hls.js +18 -1
  126. package/dist/streaming/hls.js.map +1 -1
  127. package/dist/streaming/lifecycle.js +1 -1
  128. package/dist/streaming/lifecycle.js.map +1 -1
  129. package/dist/streaming/monitor.d.ts +1 -38
  130. package/dist/streaming/monitor.js +2 -289
  131. package/dist/streaming/monitor.js.map +1 -1
  132. package/dist/streaming/recovery.d.ts +143 -0
  133. package/dist/streaming/recovery.js +286 -0
  134. package/dist/streaming/recovery.js.map +1 -0
  135. package/dist/streaming/registry.d.ts +1 -1
  136. package/dist/streaming/setup.d.ts +1 -1
  137. package/dist/streaming/setup.js +3 -1
  138. package/dist/streaming/setup.js.map +1 -1
  139. package/dist/streaming/showInfo.js +12 -14
  140. package/dist/streaming/showInfo.js.map +1 -1
  141. package/dist/streaming/statusEmitter.d.ts +4 -2
  142. package/dist/streaming/statusEmitter.js +5 -0
  143. package/dist/streaming/statusEmitter.js.map +1 -1
  144. package/dist/types/channels.d.ts +68 -0
  145. package/dist/types/channels.js +2 -0
  146. package/dist/types/channels.js.map +1 -0
  147. package/dist/types/config.d.ts +127 -0
  148. package/dist/types/config.js +2 -0
  149. package/dist/types/config.js.map +1 -0
  150. package/dist/types/index.d.ts +7 -406
  151. package/dist/types/index.js +1 -5
  152. package/dist/types/index.js.map +1 -1
  153. package/dist/types/profiles.d.ts +141 -0
  154. package/dist/types/profiles.js +2 -0
  155. package/dist/types/profiles.js.map +1 -0
  156. package/dist/types/selection.d.ts +101 -0
  157. package/dist/types/selection.js +6 -0
  158. package/dist/types/selection.js.map +1 -0
  159. package/dist/types/shared.d.ts +7 -0
  160. package/dist/types/shared.js +6 -0
  161. package/dist/types/shared.js.map +1 -0
  162. package/dist/types/streaming.d.ts +96 -0
  163. package/dist/types/streaming.js +2 -0
  164. package/dist/types/streaming.js.map +1 -0
  165. package/dist/utils/debugFilter.js +3 -1
  166. package/dist/utils/debugFilter.js.map +1 -1
  167. package/dist/utils/format.d.ts +7 -0
  168. package/dist/utils/format.js +22 -0
  169. package/dist/utils/format.js.map +1 -1
  170. package/dist/utils/index.d.ts +1 -0
  171. package/dist/utils/index.js +1 -0
  172. package/dist/utils/index.js.map +1 -1
  173. package/dist/utils/sanitize.d.ts +14 -0
  174. package/dist/utils/sanitize.js +37 -0
  175. package/dist/utils/sanitize.js.map +1 -0
  176. package/package.json +6 -4
  177. package/dist/routes/config.d.ts +0 -72
  178. package/dist/routes/config.js +0 -1987
  179. package/dist/routes/config.js.map +0 -1
  180. package/dist/routes/root.js +0 -2959
  181. package/dist/routes/root.js.map +0 -1
  182. /package/dist/routes/{root.d.ts → root/index.d.ts} +0 -0
@@ -1,17 +1,17 @@
1
- import type { Channel, ChannelListingEntry, ChannelMap } from "../types/index.js";
1
+ import type { Channel, ChannelListingEntry, ChannelMap, StoredChannel, StoredChannelMap } from "../types/index.js";
2
2
  /**
3
3
  * User-defined channel with all channel properties.
4
4
  */
5
5
  export type UserChannel = Channel;
6
6
  /**
7
- * Map of channel keys to user-defined channel configurations.
7
+ * Map of channel keys to stored channel data (full definitions or deltas). This is the raw file format for channels.json.
8
8
  */
9
- export type UserChannelMap = ChannelMap;
9
+ export type UserChannelMap = StoredChannelMap;
10
10
  /**
11
11
  * Result of loading user channels from the file.
12
12
  */
13
13
  export interface UserChannelsLoadResult {
14
- channels: UserChannelMap;
14
+ channels: StoredChannelMap;
15
15
  parseError: boolean;
16
16
  parseErrorMessage?: string;
17
17
  providerSelections: Record<string, string>;
@@ -39,11 +39,12 @@ export declare function getChannelsParseErrorMessage(): string | undefined;
39
39
  export declare function loadUserChannels(): Promise<UserChannelsLoadResult>;
40
40
  /**
41
41
  * Saves user channels to the channels file and updates the in-memory cache. Changes take effect immediately for new stream requests without requiring a server
42
- * restart. Creates the data directory if it doesn't exist. Provider selections are also saved if any exist.
43
- * @param channels - The channels to save.
42
+ * restart. Creates the data directory if it doesn't exist. Provider selections are also saved if any exist. Empty deltas (no overridden fields) for predefined
43
+ * channel keys are stripped before saving to avoid storing no-op entries.
44
+ * @param channels - The channels to save (full definitions or delta overrides).
44
45
  * @throws If the file cannot be written.
45
46
  */
46
- export declare function saveUserChannels(channels: UserChannelMap): Promise<void>;
47
+ export declare function saveUserChannels(channels: StoredChannelMap): Promise<void>;
47
48
  /**
48
49
  * Deletes a user channel by key.
49
50
  * @param key - The channel key to delete.
@@ -59,6 +60,15 @@ export declare function resetUserChannels(): Promise<void>;
59
60
  * Initializes user channels by loading them from the file. This should be called once at server startup. Also builds provider groups and loads provider selections.
60
61
  */
61
62
  export declare function initializeUserChannels(): Promise<void>;
63
+ /**
64
+ * Resolves a stored channel entry (full definition or delta) into a fully resolved Channel. For user-defined channels with no predefined equivalent, the stored
65
+ * entry is returned as-is (it must be a full Channel). For overrides of predefined channels, the predefined definition is used as a base and only allowlisted
66
+ * delta fields are overlaid. Fields set to null in the delta are removed from the result. Fields not in the allowlist are silently ignored.
67
+ * @param key - The channel key.
68
+ * @param stored - The stored channel data (full definition or delta).
69
+ * @returns A fully resolved Channel with all fields populated.
70
+ */
71
+ export declare function resolveStoredChannel(key: string, stored: StoredChannel): Channel;
62
72
  /**
63
73
  * Returns the full channel listing with source classification and enabled status. This is the authoritative merge point for predefined and user channels — all
64
74
  * code that needs a merged view of channels should use this function (or getAllChannels() which delegates to it).
@@ -73,8 +83,8 @@ export declare function initializeUserChannels(): Promise<void>;
73
83
  *
74
84
  * Provider variants (non-canonical keys in provider groups) are filtered out from this listing — they are accessed via the provider selection mechanism instead.
75
85
  *
76
- * IMPORTANT: This function preserves object references from PREDEFINED_CHANNELS and loadedUserChannels. The provider system (providers.ts) relies on this behavior
77
- * to detect user overrides via reference comparison. Do not clone channel objects when building the listing.
86
+ * Override entries produce a new resolved Channel object (via resolveStoredChannel()), which is a different reference from PREDEFINED_CHANNELS[key]. The provider
87
+ * system (providers.ts) relies on this reference difference to detect user overrides via isUserOverride(). Predefined-only entries preserve the original reference.
78
88
  * @returns Sorted array of channel listing entries.
79
89
  */
80
90
  export declare function getChannelListing(): ChannelListingEntry[];
@@ -85,10 +95,16 @@ export declare function getChannelListing(): ChannelListingEntry[];
85
95
  */
86
96
  export declare function getAllChannels(): ChannelMap;
87
97
  /**
88
- * Returns the loaded user channels (without predefined channels).
89
- * @returns The user channel map.
98
+ * Returns the raw stored channel data (without predefined channels). Entries may be full Channel definitions or ChannelDelta overrides.
99
+ * @returns The stored channel map.
100
+ */
101
+ export declare function getUserChannels(): StoredChannelMap;
102
+ /**
103
+ * Returns the predefined channel definition for a key.
104
+ * @param key - The channel key to look up.
105
+ * @returns The predefined channel, or undefined if the key is not predefined.
90
106
  */
91
- export declare function getUserChannels(): UserChannelMap;
107
+ export declare function getPredefinedChannel(key: string): Channel | undefined;
92
108
  /**
93
109
  * Checks if a channel key exists in the predefined channels.
94
110
  * @param key - The channel key to check.
@@ -101,12 +117,6 @@ export declare function isPredefinedChannel(key: string): boolean;
101
117
  * @returns True if the channel is user-defined.
102
118
  */
103
119
  export declare function isUserChannel(key: string): boolean;
104
- /**
105
- * Checks if a user channel overrides a predefined channel (same key exists in both).
106
- * @param key - The channel key to check.
107
- * @returns True if the user channel overrides a predefined channel.
108
- */
109
- export declare function isOverrideChannel(key: string): boolean;
110
120
  /**
111
121
  * Checks if a predefined channel is disabled.
112
122
  * @param key - The channel key to check.
@@ -123,6 +133,18 @@ export declare function getDisabledPredefinedChannels(): string[];
123
133
  * @returns The predefined channel map.
124
134
  */
125
135
  export declare function getPredefinedChannels(): ChannelMap;
136
+ /**
137
+ * Returns the keys of all predefined channels that are Pacific entries (both canonicals and provider variants). A key is Pacific if its canonical base ends
138
+ * in "p" and the East counterpart (base minus trailing "p") exists in PREDEFINED_CHANNELS.
139
+ * @returns Sorted array of Pacific predefined channel keys.
140
+ */
141
+ export declare function getPacificPredefinedKeys(): string[];
142
+ /**
143
+ * Returns the keys of all predefined East channels that have Pacific counterparts (both canonicals and provider variants). A key qualifies if its canonical
144
+ * base does NOT end in "p" and the Pacific counterpart (base plus "p") exists in PREDEFINED_CHANNELS.
145
+ * @returns Sorted array of East predefined channel keys that have Pacific counterparts.
146
+ */
147
+ export declare function getEastWithPacificPredefinedKeys(): string[];
126
148
  /**
127
149
  * Checks if a channel is available for streaming. A channel is available if it exists in the merged channel map returned by getAllChannels(), which already
128
150
  * excludes disabled predefined channels (unless overridden by a user channel).
@@ -160,7 +182,7 @@ export declare function validateChannelProfile(profile: string | undefined, vali
160
182
  * Result of validating imported channels.
161
183
  */
162
184
  export interface ChannelsValidationResult {
163
- channels: UserChannelMap;
185
+ channels: ChannelMap;
164
186
  errors: string[];
165
187
  valid: boolean;
166
188
  }
@@ -1,7 +1,7 @@
1
+ import { LOG, containsNonPrintable, sanitizeString } from "../utils/index.js";
1
2
  import { buildProviderGroups, getAllProviderTags, getProviderSelections, isChannelAvailableByProvider, isProviderVariant, setEnabledProviders, setProviderSelections } from "./providers.js";
2
3
  import { getChannelsFilePath, getDataDir } from "./paths.js";
3
4
  import { CONFIG } from "./index.js";
4
- import { LOG } from "../utils/index.js";
5
5
  import { PREDEFINED_CHANNELS } from "../channels/index.js";
6
6
  import fs from "node:fs";
7
7
  const { promises: fsPromises } = fs;
@@ -16,7 +16,8 @@ export function getUserChannelsFilePath() {
16
16
  }
17
17
  /* These functions handle reading and writing the channels file. All operations are async and handle errors gracefully.
18
18
  */
19
- // Module-level storage for loaded user channels. This is populated at startup and used by getAllChannels().
19
+ // Module-level storage for loaded user channels. This is populated at startup and used by getAllChannels(). Entries can be full Channel definitions or
20
+ // ChannelDelta overrides for predefined channels.
20
21
  let loadedUserChannels = {};
21
22
  let userChannelsParseError = false;
22
23
  let userChannelsParseErrorMessage;
@@ -59,7 +60,7 @@ export async function loadUserChannels() {
59
60
  }
60
61
  }
61
62
  else if ((typeof value === "object") && (value !== null) && !Array.isArray(value)) {
62
- // It's a channel definition.
63
+ // It's a channel definition or delta override.
63
64
  channels[key] = value;
64
65
  }
65
66
  }
@@ -83,18 +84,27 @@ export async function loadUserChannels() {
83
84
  }
84
85
  /**
85
86
  * Saves user channels to the channels file and updates the in-memory cache. Changes take effect immediately for new stream requests without requiring a server
86
- * restart. Creates the data directory if it doesn't exist. Provider selections are also saved if any exist.
87
- * @param channels - The channels to save.
87
+ * restart. Creates the data directory if it doesn't exist. Provider selections are also saved if any exist. Empty deltas (no overridden fields) for predefined
88
+ * channel keys are stripped before saving to avoid storing no-op entries.
89
+ * @param channels - The channels to save (full definitions or delta overrides).
88
90
  * @throws If the file cannot be written.
89
91
  */
90
92
  export async function saveUserChannels(channels) {
91
93
  // Ensure data directory exists.
92
94
  await fsPromises.mkdir(getDataDir(), { recursive: true });
95
+ // Strip empty deltas for predefined keys — an empty delta means no changes were made.
96
+ const filtered = {};
97
+ for (const [key, stored] of Object.entries(channels)) {
98
+ if ((key in PREDEFINED_CHANNELS) && (Object.keys(stored).length === 0)) {
99
+ continue;
100
+ }
101
+ filtered[key] = stored;
102
+ }
93
103
  // Sort channels by key for consistent output.
94
104
  const sortedChannels = {};
95
- const sortedKeys = Object.keys(channels).sort();
105
+ const sortedKeys = Object.keys(filtered).sort();
96
106
  for (const key of sortedKeys) {
97
- sortedChannels[key] = channels[key];
107
+ sortedChannels[key] = filtered[key];
98
108
  }
99
109
  // Include provider selections if any exist.
100
110
  const selections = getProviderSelections();
@@ -111,7 +121,7 @@ export async function saveUserChannels(channels) {
111
121
  const content = JSON.stringify(sortedChannels, null, 2);
112
122
  await fsPromises.writeFile(getChannelsFilePath(), content + "\n", "utf-8");
113
123
  // Update in-memory cache so changes take effect immediately for new stream requests.
114
- loadedUserChannels = { ...channels };
124
+ loadedUserChannels = { ...filtered };
115
125
  // Refresh provider groups so channelsRef reflects the new channel data. This ensures getResolvedChannel() returns correct data after modifications.
116
126
  buildProviderGroups(getMergedChannelMap());
117
127
  // Clear any previous parse error since we're writing valid data.
@@ -185,6 +195,14 @@ export async function initializeUserChannels() {
185
195
  else {
186
196
  setEnabledProviders(configuredProviders);
187
197
  }
198
+ // Check for non-printable characters in loaded channel string values. These warnings are informational — loaded data is not modified.
199
+ for (const [channelKey, stored] of Object.entries(loadedUserChannels)) {
200
+ for (const [field, value] of Object.entries(stored)) {
201
+ if ((typeof value === "string") && containsNonPrintable(value)) {
202
+ LOG.warn("User channel '%s' field '%s' contains non-printable characters. Re-save the channel to clean it.", channelKey, field);
203
+ }
204
+ }
205
+ }
188
206
  const userCount = Object.keys(loadedUserChannels).length;
189
207
  const predefinedCount = Object.keys(PREDEFINED_CHANNELS).length;
190
208
  const totalCount = userCount + predefinedCount;
@@ -195,14 +213,51 @@ export async function initializeUserChannels() {
195
213
  LOG.info("Loaded %d channels.", totalCount);
196
214
  }
197
215
  }
216
+ // Fields that users are allowed to override via delta. This allowlist prevents hand-edited channels.json from overriding fields like provider that are
217
+ // intentionally not user-editable. Matches the fields in the ChannelDelta interface.
218
+ const DELTA_ALLOWED_FIELDS = new Set(["channelNumber", "channelSelector", "name", "profile", "stationId", "tvgShift", "url"]);
219
+ /**
220
+ * Resolves a stored channel entry (full definition or delta) into a fully resolved Channel. For user-defined channels with no predefined equivalent, the stored
221
+ * entry is returned as-is (it must be a full Channel). For overrides of predefined channels, the predefined definition is used as a base and only allowlisted
222
+ * delta fields are overlaid. Fields set to null in the delta are removed from the result. Fields not in the allowlist are silently ignored.
223
+ * @param key - The channel key.
224
+ * @param stored - The stored channel data (full definition or delta).
225
+ * @returns A fully resolved Channel with all fields populated.
226
+ */
227
+ export function resolveStoredChannel(key, stored) {
228
+ const predefined = PREDEFINED_CHANNELS[key];
229
+ // No predefined equivalent — this is a user-defined channel, return as-is. The caller is responsible for ensuring it has a url field.
230
+ // Runtime check needed — TypeScript thinks Record indexing always returns a value, but the key may not exist.
231
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
232
+ if (!predefined) {
233
+ return stored;
234
+ }
235
+ // Start with a copy of the predefined definition, then overlay allowlisted non-null delta fields.
236
+ const resolved = { ...predefined };
237
+ for (const [field, value] of Object.entries(stored)) {
238
+ if (!DELTA_ALLOWED_FIELDS.has(field)) {
239
+ continue;
240
+ }
241
+ if (value === null) {
242
+ // Explicit null means "clear this field" — delete it from the resolved object.
243
+ Reflect.deleteProperty(resolved, field);
244
+ }
245
+ else if (value !== undefined) {
246
+ // Non-null, non-undefined — override the predefined value.
247
+ resolved[field] = value;
248
+ }
249
+ }
250
+ return resolved;
251
+ }
198
252
  /**
199
253
  * Returns the merged channel map (predefined + user) without filtering by enabled status or provider variants. Used internally for building provider groups.
254
+ * Resolves any delta overrides into full Channel objects so the result contains only complete definitions.
200
255
  * @returns The complete merged channel map.
201
256
  */
202
257
  function getMergedChannelMap() {
203
258
  const result = { ...PREDEFINED_CHANNELS };
204
- for (const [key, channel] of Object.entries(loadedUserChannels)) {
205
- result[key] = channel;
259
+ for (const [key, stored] of Object.entries(loadedUserChannels)) {
260
+ result[key] = resolveStoredChannel(key, stored);
206
261
  }
207
262
  return result;
208
263
  }
@@ -223,8 +278,8 @@ function getMergedChannelMap() {
223
278
  *
224
279
  * Provider variants (non-canonical keys in provider groups) are filtered out from this listing — they are accessed via the provider selection mechanism instead.
225
280
  *
226
- * IMPORTANT: This function preserves object references from PREDEFINED_CHANNELS and loadedUserChannels. The provider system (providers.ts) relies on this behavior
227
- * to detect user overrides via reference comparison. Do not clone channel objects when building the listing.
281
+ * Override entries produce a new resolved Channel object (via resolveStoredChannel()), which is a different reference from PREDEFINED_CHANNELS[key]. The provider
282
+ * system (providers.ts) relies on this reference difference to detect user overrides via isUserOverride(). Predefined-only entries preserve the original reference.
228
283
  * @returns Sorted array of channel listing entries.
229
284
  */
230
285
  export function getChannelListing() {
@@ -248,9 +303,12 @@ export function getChannelListing() {
248
303
  else {
249
304
  source = "predefined";
250
305
  }
306
+ // For user entries (including overrides), resolve the stored delta/definition into a full Channel. The resolved object is a new reference, which preserves
307
+ // the isUserOverride() contract in providers.ts (reference comparison against PREDEFINED_CHANNELS[key]).
308
+ const channel = isUser ? resolveStoredChannel(key, loadedUserChannels[key]) : PREDEFINED_CHANNELS[key];
251
309
  listing.push({
252
310
  availableByProvider: isChannelAvailableByProvider(key),
253
- channel: isUser ? loadedUserChannels[key] : PREDEFINED_CHANNELS[key],
311
+ channel,
254
312
  enabled: !isPredefinedChannelDisabled(key),
255
313
  key,
256
314
  source
@@ -275,12 +333,20 @@ export function getAllChannels() {
275
333
  return result;
276
334
  }
277
335
  /**
278
- * Returns the loaded user channels (without predefined channels).
279
- * @returns The user channel map.
336
+ * Returns the raw stored channel data (without predefined channels). Entries may be full Channel definitions or ChannelDelta overrides.
337
+ * @returns The stored channel map.
280
338
  */
281
339
  export function getUserChannels() {
282
340
  return { ...loadedUserChannels };
283
341
  }
342
+ /**
343
+ * Returns the predefined channel definition for a key.
344
+ * @param key - The channel key to look up.
345
+ * @returns The predefined channel, or undefined if the key is not predefined.
346
+ */
347
+ export function getPredefinedChannel(key) {
348
+ return PREDEFINED_CHANNELS[key];
349
+ }
284
350
  /**
285
351
  * Checks if a channel key exists in the predefined channels.
286
352
  * @param key - The channel key to check.
@@ -297,14 +363,6 @@ export function isPredefinedChannel(key) {
297
363
  export function isUserChannel(key) {
298
364
  return key in loadedUserChannels;
299
365
  }
300
- /**
301
- * Checks if a user channel overrides a predefined channel (same key exists in both).
302
- * @param key - The channel key to check.
303
- * @returns True if the user channel overrides a predefined channel.
304
- */
305
- export function isOverrideChannel(key) {
306
- return isPredefinedChannel(key) && isUserChannel(key);
307
- }
308
366
  /* Users can disable predefined channels to exclude them from the playlist and block streaming. Disabled channels appear grayed out in the UI with an option to
309
367
  * re-enable. This is useful for users who don't want certain predefined channels cluttering their channel list.
310
368
  */
@@ -338,6 +396,54 @@ export function getDisabledPredefinedChannels() {
338
396
  export function getPredefinedChannels() {
339
397
  return { ...PREDEFINED_CHANNELS };
340
398
  }
399
+ /* Pacific and East key identification share the same structural logic: iterate all predefined keys, extract the canonical base (before the first hyphen for
400
+ * provider variants, or the full key for canonicals), and test whether the base participates in the Pacific timezone naming convention. The helper below
401
+ * centralizes this so the two exported functions differ only in which side of the East/Pacific pair they select.
402
+ */
403
+ /**
404
+ * Filters predefined channel keys by their relationship to the Pacific timezone naming convention. For "pacific" mode, returns keys whose base ends in "p"
405
+ * and whose East counterpart (base minus trailing "p") exists. For "east" mode, returns keys whose base does NOT end in "p" and whose Pacific counterpart
406
+ * (base plus "p") exists. Both modes include canonicals and provider variants.
407
+ * @param side - Which side of the East/Pacific pair to select.
408
+ * @returns Sorted array of matching predefined channel keys.
409
+ */
410
+ function filterPredefinedKeysByTimezone(side) {
411
+ const keys = [];
412
+ for (const key of Object.keys(PREDEFINED_CHANNELS)) {
413
+ // Extract the canonical base: for provider variants like "animalp-hulu" the base is "animalp"; for canonicals like "animalp" the base is the full key.
414
+ const dashIndex = key.indexOf("-");
415
+ const base = (dashIndex === -1) ? key : key.substring(0, dashIndex);
416
+ if (side === "pacific") {
417
+ // Pacific: base ends in "p" and the East counterpart exists.
418
+ if (base.endsWith("p") && ((base.slice(0, -1)) in PREDEFINED_CHANNELS)) {
419
+ keys.push(key);
420
+ }
421
+ }
422
+ else {
423
+ // East: base does NOT end in "p" and the Pacific counterpart exists.
424
+ if (!base.endsWith("p") && ((base + "p") in PREDEFINED_CHANNELS)) {
425
+ keys.push(key);
426
+ }
427
+ }
428
+ }
429
+ return keys.sort();
430
+ }
431
+ /**
432
+ * Returns the keys of all predefined channels that are Pacific entries (both canonicals and provider variants). A key is Pacific if its canonical base ends
433
+ * in "p" and the East counterpart (base minus trailing "p") exists in PREDEFINED_CHANNELS.
434
+ * @returns Sorted array of Pacific predefined channel keys.
435
+ */
436
+ export function getPacificPredefinedKeys() {
437
+ return filterPredefinedKeysByTimezone("pacific");
438
+ }
439
+ /**
440
+ * Returns the keys of all predefined East channels that have Pacific counterparts (both canonicals and provider variants). A key qualifies if its canonical
441
+ * base does NOT end in "p" and the Pacific counterpart (base plus "p") exists in PREDEFINED_CHANNELS.
442
+ * @returns Sorted array of East predefined channel keys that have Pacific counterparts.
443
+ */
444
+ export function getEastWithPacificPredefinedKeys() {
445
+ return filterPredefinedKeysByTimezone("east");
446
+ }
341
447
  /**
342
448
  * Checks if a channel is available for streaming. A channel is available if it exists in the merged channel map returned by getAllChannels(), which already
343
449
  * excludes disabled predefined channels (unless overridden by a user channel).
@@ -457,47 +563,49 @@ export function validateImportedChannels(data, validProfiles) {
457
563
  continue;
458
564
  }
459
565
  const channelData = value;
460
- // Validate required name field.
566
+ // Validate required name field. Sanitize after type check to strip non-printable characters from imported data.
461
567
  if ((typeof channelData.name !== "string") || (channelData.name.trim() === "")) {
462
568
  errors.push("Channel '" + key + "': name is required.");
463
569
  continue;
464
570
  }
465
- const nameError = validateChannelName(channelData.name);
571
+ const cleanName = sanitizeString(channelData.name);
572
+ const nameError = validateChannelName(cleanName);
466
573
  if (nameError) {
467
574
  errors.push("Channel '" + key + "': " + nameError);
468
575
  continue;
469
576
  }
470
- // Validate required url field.
577
+ // Validate required url field. Sanitize after type check.
471
578
  if ((typeof channelData.url !== "string") || (channelData.url.trim() === "")) {
472
579
  errors.push("Channel '" + key + "': url is required.");
473
580
  continue;
474
581
  }
475
- const urlError = validateChannelUrl(channelData.url);
582
+ const cleanUrl = sanitizeString(channelData.url);
583
+ const urlError = validateChannelUrl(cleanUrl);
476
584
  if (urlError) {
477
585
  errors.push("Channel '" + key + "': " + urlError);
478
586
  continue;
479
587
  }
480
- // Validate optional profile field.
481
- const profile = (typeof channelData.profile === "string") ? channelData.profile : undefined;
588
+ // Validate optional profile field. Sanitize after type check.
589
+ const profile = (typeof channelData.profile === "string") ? sanitizeString(channelData.profile) : undefined;
482
590
  const profileError = validateChannelProfile(profile, validProfiles);
483
591
  if (profileError) {
484
592
  errors.push("Channel '" + key + "': " + profileError);
485
593
  continue;
486
594
  }
487
- // Build validated channel.
595
+ // Build validated channel with sanitized values.
488
596
  const channel = {
489
- name: channelData.name,
490
- url: channelData.url
597
+ name: cleanName,
598
+ url: cleanUrl
491
599
  };
492
600
  if (profile) {
493
601
  channel.profile = profile;
494
602
  }
495
- // Include optional fields if present.
603
+ // Include optional fields if present. Sanitize string values to strip non-printable characters.
496
604
  if (typeof channelData.stationId === "string") {
497
- channel.stationId = channelData.stationId;
605
+ channel.stationId = sanitizeString(channelData.stationId);
498
606
  }
499
607
  if (typeof channelData.channelSelector === "string") {
500
- channel.channelSelector = channelData.channelSelector;
608
+ channel.channelSelector = sanitizeString(channelData.channelSelector);
501
609
  }
502
610
  // Validate optional channelNumber field (range and type).
503
611
  if (channelData.channelNumber !== undefined) {
@@ -508,6 +616,15 @@ export function validateImportedChannels(data, validProfiles) {
508
616
  }
509
617
  channel.channelNumber = num;
510
618
  }
619
+ // Validate optional tvgShift field (must be a finite number). Negative values are valid (e.g., a West Coast feed viewed from the East).
620
+ if (channelData.tvgShift !== undefined) {
621
+ const shift = Number(channelData.tvgShift);
622
+ if (!Number.isFinite(shift)) {
623
+ errors.push("Channel '" + key + "': tvgShift must be a finite number.");
624
+ continue;
625
+ }
626
+ channel.tvgShift = shift;
627
+ }
511
628
  channels[key] = channel;
512
629
  }
513
630
  // Validate channelNumber uniqueness across all imported channels. We check after building the full map so that all duplicates are reported.
@@ -1 +1 @@
1
- {"version":3,"file":"userChannels.js","sourceRoot":"","sources":["../../src/config/userChannels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"userChannels.js","sourceRoot":"","sources":["../../src/config/userChannels.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export interface SettingMetadata {
16
16
  max?: number;
17
17
  min?: number;
18
18
  path: string;
19
- type: "boolean" | "float" | "host" | "integer" | "path" | "port" | "string";
19
+ type: "boolean" | "checkboxList" | "float" | "host" | "integer" | "path" | "port" | "string";
20
20
  validValues?: string[];
21
21
  unit?: string;
22
22
  }
@@ -99,8 +99,12 @@ export interface UserStreamingConfig {
99
99
  * Partial channels configuration for user config file.
100
100
  */
101
101
  export interface UserChannelsConfig {
102
+ channelSortDirection?: string;
103
+ channelSortField?: string;
102
104
  disabledPredefined?: string[];
103
105
  enabledProviders?: string[];
106
+ precacheProviders?: string[];
107
+ visibleColumns?: string[];
104
108
  }
105
109
  /**
106
110
  * Partial HDHomeRun configuration for user config file.