prismcast 1.4.2 → 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 (178) 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 +442 -168
  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 +36 -3
  54. package/dist/config/providers.js +168 -8
  55. package/dist/config/providers.js.map +1 -1
  56. package/dist/config/sites.d.ts +1 -12
  57. package/dist/config/sites.js +38 -5
  58. package/dist/config/sites.js.map +1 -1
  59. package/dist/config/userChannels.d.ts +12 -0
  60. package/dist/config/userChannels.js +81 -14
  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/ui.js +8 -3
  116. package/dist/routes/ui.js.map +1 -1
  117. package/dist/service/commands.d.ts +5 -3
  118. package/dist/service/commands.js +117 -33
  119. package/dist/service/commands.js.map +1 -1
  120. package/dist/service/generators.d.ts +27 -0
  121. package/dist/service/generators.js +97 -6
  122. package/dist/service/generators.js.map +1 -1
  123. package/dist/streaming/hls.js +18 -1
  124. package/dist/streaming/hls.js.map +1 -1
  125. package/dist/streaming/lifecycle.js +1 -1
  126. package/dist/streaming/lifecycle.js.map +1 -1
  127. package/dist/streaming/monitor.d.ts +1 -38
  128. package/dist/streaming/monitor.js +2 -289
  129. package/dist/streaming/monitor.js.map +1 -1
  130. package/dist/streaming/recovery.d.ts +143 -0
  131. package/dist/streaming/recovery.js +286 -0
  132. package/dist/streaming/recovery.js.map +1 -0
  133. package/dist/streaming/registry.d.ts +1 -1
  134. package/dist/streaming/setup.d.ts +1 -1
  135. package/dist/streaming/setup.js +3 -1
  136. package/dist/streaming/setup.js.map +1 -1
  137. package/dist/streaming/statusEmitter.d.ts +4 -2
  138. package/dist/streaming/statusEmitter.js +5 -0
  139. package/dist/streaming/statusEmitter.js.map +1 -1
  140. package/dist/types/channels.d.ts +68 -0
  141. package/dist/types/channels.js +2 -0
  142. package/dist/types/channels.js.map +1 -0
  143. package/dist/types/config.d.ts +127 -0
  144. package/dist/types/config.js +2 -0
  145. package/dist/types/config.js.map +1 -0
  146. package/dist/types/index.d.ts +7 -429
  147. package/dist/types/index.js +1 -5
  148. package/dist/types/index.js.map +1 -1
  149. package/dist/types/profiles.d.ts +141 -0
  150. package/dist/types/profiles.js +2 -0
  151. package/dist/types/profiles.js.map +1 -0
  152. package/dist/types/selection.d.ts +101 -0
  153. package/dist/types/selection.js +6 -0
  154. package/dist/types/selection.js.map +1 -0
  155. package/dist/types/shared.d.ts +7 -0
  156. package/dist/types/shared.js +6 -0
  157. package/dist/types/shared.js.map +1 -0
  158. package/dist/types/streaming.d.ts +96 -0
  159. package/dist/types/streaming.js +2 -0
  160. package/dist/types/streaming.js.map +1 -0
  161. package/dist/utils/debugFilter.js +3 -1
  162. package/dist/utils/debugFilter.js.map +1 -1
  163. package/dist/utils/format.d.ts +7 -0
  164. package/dist/utils/format.js +22 -0
  165. package/dist/utils/format.js.map +1 -1
  166. package/dist/utils/index.d.ts +1 -0
  167. package/dist/utils/index.js +1 -0
  168. package/dist/utils/index.js.map +1 -1
  169. package/dist/utils/sanitize.d.ts +14 -0
  170. package/dist/utils/sanitize.js +37 -0
  171. package/dist/utils/sanitize.js.map +1 -0
  172. package/package.json +5 -3
  173. package/dist/routes/config.d.ts +0 -76
  174. package/dist/routes/config.js +0 -2187
  175. package/dist/routes/config.js.map +0 -1
  176. package/dist/routes/root.js +0 -3158
  177. package/dist/routes/root.js.map +0 -1
  178. /package/dist/routes/{root.d.ts → root/index.d.ts} +0 -0
@@ -3,7 +3,9 @@
3
3
  * profiles.ts: Site profile resolution and validation for PrismCast.
4
4
  */
5
5
  import { DEFAULT_SITE_PROFILE, DOMAIN_CONFIG, SITE_PROFILES, getDomainConfig } from "./sites.js";
6
+ import { getUserDomains, getUserProfiles, validateDomain, validateProfile } from "./userProfiles.js";
6
7
  import { CHANNELS } from "../channels/index.js";
8
+ import { LOG } from "../utils/index.js";
7
9
  import { extractDomain } from "../utils/index.js";
8
10
  // Re-export site data so existing consumers can import from either module.
9
11
  export { DEFAULT_SITE_PROFILE, DOMAIN_CONFIG, SITE_PROFILES, getDomainConfig };
@@ -46,9 +48,9 @@ export function resolveProfile(profileName) {
46
48
  if (!profileName) {
47
49
  return { ...DEFAULT_SITE_PROFILE };
48
50
  }
49
- // The conditional below guards against runtime scenarios where profileName is not in SITE_PROFILES, even though TypeScript's Record type doesn't capture this.
50
- // This can happen if a channel references a typo'd profile name or if profiles are modified at runtime.
51
- const profile = SITE_PROFILES[profileName];
51
+ // Check built-in profiles first, then user-defined profiles. User profiles are stored separately and can only extend built-in profiles (not other user profiles),
52
+ // so the resolution chain always terminates at a built-in profile.
53
+ const profile = SITE_PROFILES[profileName] ?? getUserProfiles()[profileName];
52
54
  if (!profile) {
53
55
  return { ...DEFAULT_SITE_PROFILE };
54
56
  }
@@ -148,11 +150,23 @@ export function getProfileForChannel(channel) {
148
150
  profile = { ...profile, maxContinuousPlayback: domainConfig.maxContinuousPlayback };
149
151
  }
150
152
  }
151
- // Merge channel-specific properties into the profile. Currently only channelSelector is supported, which specifies a CSS selector for the channel button in
152
- // multi-channel player pages. The channelSelector on the channel overrides any channelSelector from the profile.
153
+ // Merge channel-specific properties into the profile. The channelSelector on the channel overrides any channelSelector from the profile. Channel-level scroll
154
+ // overrides (scrollSelector, scrollTarget, scrollToBottom) are merged into the profile's channelSelection config, allowing individual channels to customize
155
+ // scroll behavior without changing the shared profile definition.
153
156
  if (channel.channelSelector) {
154
157
  profile = { ...profile, channelSelector: channel.channelSelector };
155
158
  }
159
+ if ((channel.scrollSelector !== undefined) || (channel.scrollTarget !== undefined) || (channel.scrollToBottom !== undefined)) {
160
+ profile = {
161
+ ...profile,
162
+ channelSelection: {
163
+ ...profile.channelSelection,
164
+ ...(channel.scrollSelector !== undefined ? { scrollSelector: channel.scrollSelector } : {}),
165
+ ...(channel.scrollTarget !== undefined ? { scrollTarget: channel.scrollTarget } : {}),
166
+ ...(channel.scrollToBottom !== undefined ? { scrollToBottom: channel.scrollToBottom } : {})
167
+ }
168
+ };
169
+ }
156
170
  return { profile, profileName };
157
171
  }
158
172
  /* Before starting the server, we validate all profile configurations to catch errors early. Invalid configurations would cause runtime failures that are difficult
@@ -213,33 +227,70 @@ export function validateProfiles() {
213
227
  }
214
228
  }
215
229
  }
216
- // Validate all channel profile references point to existing profiles. This catches typos in channel definitions.
230
+ // Validate all channel profile references point to existing profiles (built-in or user). This catches typos in channel definitions.
231
+ const userProfiles = getUserProfiles();
217
232
  for (const [channelName, channel] of Object.entries(CHANNELS)) {
218
233
  const channelProfile = channel.profile;
219
234
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
220
- if ((channelProfile !== undefined) && (channelProfile !== "auto") && !SITE_PROFILES[channelProfile]) {
235
+ if ((channelProfile !== undefined) && (channelProfile !== "auto") && !SITE_PROFILES[channelProfile] && !(channelProfile in userProfiles)) {
221
236
  errors.push(["Channel ", channelName, " references non-existent profile: ", channelProfile].join(""));
222
237
  }
223
238
  }
224
- // If any errors were found, throw with all error messages for comprehensive feedback.
239
+ // If any built-in configuration errors were found, throw with all error messages for comprehensive feedback.
225
240
  if (errors.length > 0) {
226
241
  throw new Error(["Profile validation failed:\n ", errors.join("\n ")].join(""));
227
242
  }
243
+ // Validate user-defined profiles and domain mappings. These are warnings, not fatal errors — broken user profiles should not prevent the server from starting.
244
+ // The user can fix them via the web UI.
245
+ const userWarnings = [];
246
+ const allProfileNames = new Set([...Object.keys(SITE_PROFILES), ...Object.keys(userProfiles)]);
247
+ for (const [key, profile] of Object.entries(userProfiles)) {
248
+ const profileErrors = validateProfile(key, profile);
249
+ userWarnings.push(...profileErrors);
250
+ }
251
+ const userDomains = getUserDomains();
252
+ for (const [domain, config] of Object.entries(userDomains)) {
253
+ const domainErrors = validateDomain(domain, config, allProfileNames);
254
+ userWarnings.push(...domainErrors);
255
+ }
256
+ if (userWarnings.length > 0) {
257
+ for (const warning of userWarnings) {
258
+ LOG.warn("User profile validation: %s", warning);
259
+ }
260
+ }
228
261
  }
229
262
  /**
230
- * Returns all profiles with their descriptions, categories, and summaries, sorted alphabetically by name. Used by the channel configuration UI to populate the
231
- * profile dropdown with tooltips and the profile reference section.
263
+ * Returns all profiles (built-in and user-defined) with their descriptions, categories, summaries, and source tags, sorted alphabetically by name. Used by the
264
+ * channel configuration UI to populate the profile dropdown with tooltips and the profile reference section.
232
265
  * @returns Array of profile info objects.
233
266
  */
234
267
  export function getProfiles() {
235
- return Object.keys(SITE_PROFILES).sort().map((name) => {
268
+ const result = [];
269
+ // Add built-in profiles.
270
+ for (const name of Object.keys(SITE_PROFILES).sort()) {
236
271
  const profile = SITE_PROFILES[name];
237
- return {
272
+ result.push({
238
273
  category: profile.category ?? "special",
239
274
  description: profile.description ?? "",
240
275
  name,
276
+ source: "builtin",
241
277
  summary: profile.summary ?? profile.description ?? ""
242
- };
243
- });
278
+ });
279
+ }
280
+ // Add user-defined profiles. User profiles default to the "custom" category unless they explicitly specify a different category.
281
+ const userProfiles = getUserProfiles();
282
+ for (const name of Object.keys(userProfiles).sort()) {
283
+ const profile = userProfiles[name];
284
+ result.push({
285
+ category: profile.category ?? "custom",
286
+ description: profile.description ?? "",
287
+ name,
288
+ source: "user",
289
+ summary: profile.summary ?? profile.description ?? ""
290
+ });
291
+ }
292
+ // Sort all profiles alphabetically by name.
293
+ result.sort((a, b) => a.name.localeCompare(b.name));
294
+ return result;
244
295
  }
245
296
  //# sourceMappingURL=profiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { ProviderPack } from "../types/index.js";
2
+ /**
3
+ * Result of parsing a provider pack.
4
+ */
5
+ export interface ParseResult {
6
+ errors: string[];
7
+ pack?: ProviderPack;
8
+ }
9
+ /**
10
+ * Summary of what was imported from a provider pack. The primary import (profiles and domains) is tracked separately from the secondary channel import so that
11
+ * callers can report partial success accurately — profiles may save while channels fail.
12
+ */
13
+ export interface ImportSummary {
14
+ channelsAdded: number;
15
+ domainsAdded: number;
16
+ errors: string[];
17
+ profilesAdded: number;
18
+ success: boolean;
19
+ }
20
+ /**
21
+ * Parses and validates a raw provider pack import. Checks the version field, validates profiles and domains via the userProfiles validation functions.
22
+ * @param data - The raw JSON data to parse.
23
+ * @returns Parse result with validated pack or errors.
24
+ */
25
+ export declare function parseProviderPack(data: unknown): ParseResult;
26
+ /**
27
+ * Imports a validated provider pack by writing its contents to profiles.json and optionally channels.json. Returns a summary of what was added.
28
+ * @param pack - The validated provider pack to import.
29
+ * @param options - Import options. Set skipChannels to true to skip importing channels even if the pack contains them.
30
+ * @returns Summary of what was imported.
31
+ */
32
+ export declare function importProviderPack(pack: ProviderPack, options?: {
33
+ skipChannels?: boolean;
34
+ }): Promise<ImportSummary>;
35
+ /**
36
+ * Exports one or more user profiles and their associated domain mappings as a provider pack JSON object. Optionally includes channels that reference the
37
+ * selected profiles.
38
+ * @param profileKeys - Array of user profile keys to export.
39
+ * @param options - Export options controlling what to include.
40
+ * @returns The provider pack object, or null if none of the requested profiles exist.
41
+ */
42
+ export declare function exportProviderPack(profileKeys: string[], options?: {
43
+ includeChannels?: boolean;
44
+ includeDomains?: boolean;
45
+ name?: string;
46
+ }): ProviderPack | null;
@@ -0,0 +1,200 @@
1
+ import { getChannelListing, loadUserChannels, saveUserChannels } from "./userChannels.js";
2
+ import { getUserDomains, getUserProfiles, saveUserProfiles, validateImportedProfiles } from "./userProfiles.js";
3
+ import { sanitizeString } from "../utils/index.js";
4
+ /* Provider packs bundle a profile, domain mapping(s), and optionally channels into a single JSON file for distribution. On import, the contents are validated
5
+ * and split into profiles.json and channels.json. On export, a user profile and its associated domain mappings and channels are packaged for sharing.
6
+ */
7
+ // Current provider pack format version.
8
+ const CURRENT_VERSION = 1;
9
+ /**
10
+ * Parses and validates a raw provider pack import. Checks the version field, validates profiles and domains via the userProfiles validation functions.
11
+ * @param data - The raw JSON data to parse.
12
+ * @returns Parse result with validated pack or errors.
13
+ */
14
+ export function parseProviderPack(data) {
15
+ const errors = [];
16
+ if ((typeof data !== "object") || (data === null) || Array.isArray(data)) {
17
+ return { errors: ["Invalid format: expected a JSON object."] };
18
+ }
19
+ const raw = data;
20
+ // Validate required fields. Sanitize the pack name after the type check.
21
+ if ((typeof raw.name !== "string") || (raw.name.trim() === "")) {
22
+ errors.push("Missing or empty 'name' field.");
23
+ }
24
+ else {
25
+ raw.name = sanitizeString(raw.name);
26
+ }
27
+ if ((typeof raw.version !== "number") || !Number.isInteger(raw.version)) {
28
+ errors.push("Missing or invalid 'version' field (must be an integer).");
29
+ }
30
+ else if (raw.version > CURRENT_VERSION) {
31
+ errors.push("Unsupported version " + String(raw.version) + ". This version of PrismCast supports up to version " + String(CURRENT_VERSION) + ".");
32
+ }
33
+ if (!raw.profiles || (typeof raw.profiles !== "object") || Array.isArray(raw.profiles) || (Object.keys(raw.profiles).length === 0)) {
34
+ errors.push("Missing or empty 'profiles' field (at least one profile is required).");
35
+ }
36
+ // If basic structure checks failed, return early.
37
+ if (errors.length > 0) {
38
+ return { errors };
39
+ }
40
+ // Validate the profiles and domains using the shared validation pipeline.
41
+ const validationResult = validateImportedProfiles({
42
+ domains: raw.domains,
43
+ profiles: raw.profiles
44
+ });
45
+ if (!validationResult.valid) {
46
+ return { errors: validationResult.errors };
47
+ }
48
+ // Validate channels if present using basic checks (full channel validation happens on import).
49
+ const channels = {};
50
+ if (raw.channels) {
51
+ if ((typeof raw.channels !== "object") || Array.isArray(raw.channels)) {
52
+ errors.push("Invalid 'channels' field: expected an object.");
53
+ }
54
+ else {
55
+ // Basic channel structure validation — detailed validation happens during importProviderPack.
56
+ for (const [key, value] of Object.entries(raw.channels)) {
57
+ if ((typeof value === "object") && (value !== null) && !Array.isArray(value)) {
58
+ const ch = value;
59
+ if ((typeof ch.url === "string") && (typeof ch.name === "string")) {
60
+ // Sanitize channel string fields to strip non-printable characters before storing.
61
+ ch.name = sanitizeString(ch.name);
62
+ ch.url = sanitizeString(ch.url);
63
+ if (typeof ch.channelSelector === "string") {
64
+ ch.channelSelector = sanitizeString(ch.channelSelector);
65
+ }
66
+ if (typeof ch.stationId === "string") {
67
+ ch.stationId = sanitizeString(ch.stationId);
68
+ }
69
+ if (typeof ch.profile === "string") {
70
+ ch.profile = sanitizeString(ch.profile);
71
+ }
72
+ channels[key] = value;
73
+ }
74
+ else {
75
+ errors.push("Channel '" + key + "': requires 'name' and 'url' fields.");
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ if (errors.length > 0) {
82
+ return { errors };
83
+ }
84
+ const pack = {
85
+ name: raw.name,
86
+ profiles: validationResult.profiles,
87
+ version: raw.version
88
+ };
89
+ if (Object.keys(validationResult.domains).length > 0) {
90
+ pack.domains = validationResult.domains;
91
+ }
92
+ if (Object.keys(channels).length > 0) {
93
+ pack.channels = channels;
94
+ }
95
+ return { errors: [], pack };
96
+ }
97
+ /**
98
+ * Imports a validated provider pack by writing its contents to profiles.json and optionally channels.json. Returns a summary of what was added.
99
+ * @param pack - The validated provider pack to import.
100
+ * @param options - Import options. Set skipChannels to true to skip importing channels even if the pack contains them.
101
+ * @returns Summary of what was imported.
102
+ */
103
+ export async function importProviderPack(pack, options = {}) {
104
+ const errors = [];
105
+ // Merge profiles: add pack profiles to existing user profiles.
106
+ const existingProfiles = getUserProfiles();
107
+ const existingDomains = getUserDomains();
108
+ const mergedProfiles = { ...existingProfiles, ...pack.profiles };
109
+ const mergedDomains = { ...existingDomains, ...(pack.domains ?? {}) };
110
+ const profilesAdded = Object.keys(pack.profiles).length;
111
+ const domainsAdded = Object.keys(pack.domains ?? {}).length;
112
+ try {
113
+ await saveUserProfiles(mergedProfiles, mergedDomains);
114
+ }
115
+ catch (error) {
116
+ errors.push("Failed to save profiles: " + ((error instanceof Error) ? error.message : String(error)));
117
+ return { channelsAdded: 0, domainsAdded: 0, errors, profilesAdded: 0, success: false };
118
+ }
119
+ // Import channels if present and not skipped. Channel import is secondary — failures here produce warnings but do not mark the overall import as failed since
120
+ // profiles and domains were already saved successfully above.
121
+ let channelsAdded = 0;
122
+ if (!options.skipChannels && pack.channels && (Object.keys(pack.channels).length > 0)) {
123
+ try {
124
+ const result = await loadUserChannels();
125
+ if (result.parseError) {
126
+ errors.push("Cannot import channels: channels file contains invalid JSON.");
127
+ }
128
+ else {
129
+ const mergedChannels = { ...result.channels, ...pack.channels };
130
+ await saveUserChannels(mergedChannels);
131
+ channelsAdded = Object.keys(pack.channels).length;
132
+ }
133
+ }
134
+ catch (error) {
135
+ errors.push("Failed to save channels: " + ((error instanceof Error) ? error.message : String(error)));
136
+ }
137
+ }
138
+ return {
139
+ channelsAdded,
140
+ domainsAdded,
141
+ errors,
142
+ profilesAdded,
143
+ success: true
144
+ };
145
+ }
146
+ /**
147
+ * Exports one or more user profiles and their associated domain mappings as a provider pack JSON object. Optionally includes channels that reference the
148
+ * selected profiles.
149
+ * @param profileKeys - Array of user profile keys to export.
150
+ * @param options - Export options controlling what to include.
151
+ * @returns The provider pack object, or null if none of the requested profiles exist.
152
+ */
153
+ export function exportProviderPack(profileKeys, options = {}) {
154
+ const userProfiles = getUserProfiles();
155
+ const matchedProfiles = {};
156
+ for (const key of profileKeys) {
157
+ const profile = userProfiles[key];
158
+ if (profile) {
159
+ matchedProfiles[key] = profile;
160
+ }
161
+ }
162
+ // Return null if none of the requested profiles exist.
163
+ if (Object.keys(matchedProfiles).length === 0) {
164
+ return null;
165
+ }
166
+ const keySet = new Set(Object.keys(matchedProfiles));
167
+ const pack = {
168
+ name: options.name ?? profileKeys.join(", "),
169
+ profiles: matchedProfiles,
170
+ version: CURRENT_VERSION
171
+ };
172
+ // Include domain mappings that reference any of the selected profiles.
173
+ if (options.includeDomains !== false) {
174
+ const userDomains = getUserDomains();
175
+ const matchingDomains = {};
176
+ for (const [domain, config] of Object.entries(userDomains)) {
177
+ if (config.profile && keySet.has(config.profile)) {
178
+ matchingDomains[domain] = config;
179
+ }
180
+ }
181
+ if (Object.keys(matchingDomains).length > 0) {
182
+ pack.domains = matchingDomains;
183
+ }
184
+ }
185
+ // Include channels that reference any of the selected profiles.
186
+ if (options.includeChannels) {
187
+ const listing = getChannelListing();
188
+ const channels = {};
189
+ for (const entry of listing) {
190
+ if (entry.channel.profile && keySet.has(entry.channel.profile)) {
191
+ channels[entry.key] = entry.channel;
192
+ }
193
+ }
194
+ if (Object.keys(channels).length > 0) {
195
+ pack.channels = channels;
196
+ }
197
+ }
198
+ return pack;
199
+ }
200
+ //# sourceMappingURL=providerPacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPacks.js","sourceRoot":"","sources":["../../src/config/providerPacks.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Channel, ChannelMap, ProviderGroup } from "../types/index.js";
1
+ import type { Channel, ChannelMap, ChannelSortField, ProviderGroup, SortDirection } from "../types/index.js";
2
2
  /**
3
3
  * Gets the provider tag for a channel key. For variant keys (e.g., "espn-hulu"), extracts the suffix after the canonical prefix (e.g., "hulu"). For canonical keys,
4
4
  * looks up the URL domain via getDomainConfig() and reads the providerTag field, falling back to "direct" if not found.
@@ -50,12 +50,45 @@ export declare function isChannelAvailableByProvider(canonicalKey: string): bool
50
50
  */
51
51
  export declare function buildProviderGroups(channels: ChannelMap): void;
52
52
  /**
53
- * Resolves a URL to a friendly provider display name. Checks DOMAIN_CONFIG via getDomainConfig() for a provider name, trying the full hostname first for
54
- * subdomain-specific overrides before falling back to the concise domain. Returns the raw domain string if no provider name is configured.
53
+ * Resolves a URL to a friendly provider display name. Checks built-in DOMAIN_CONFIG first for a stable, well-known provider name, then falls back to
54
+ * getDomainConfig() which includes user domain mappings. This ordering prevents user domain overrides from corrupting display labels for predefined channel
55
+ * variants — a user mapping a built-in domain to a custom profile should not rename every provider dropdown entry that uses that domain.
55
56
  * @param url - The URL to resolve a provider display name for.
56
57
  * @returns The provider display name, or the concise domain if no provider name is configured.
57
58
  */
58
59
  export declare function getProviderDisplayName(url: string): string;
60
+ /**
61
+ * Resolves the provider display label for a channel. Checks in order: explicit `provider` field on the channel, the channel's explicit profile resolved via
62
+ * user domain mappings, then URL-based built-in display name. This ensures channels assigned to user-defined profiles show the profile's provider name rather
63
+ * than the built-in name for the URL domain.
64
+ * @param channel - The channel to resolve a label for.
65
+ * @returns The provider display label.
66
+ */
67
+ export declare function getChannelProviderLabel(channel: Channel): string;
68
+ export declare const VALID_SORT_FIELDS: Set<ChannelSortField>;
69
+ /**
70
+ * Extracts a sortable string value from a channel for the specified sort field. Channel numbers are zero-padded to 6 digits for correct numeric ordering within a
71
+ * string comparison. Provider values use the display label for human-meaningful sort order. This is the single source of truth for channel sort key extraction,
72
+ * shared by both the server-side table renderer and the M3U playlist generator.
73
+ * @param channel - The channel definition.
74
+ * @param key - The channel key (used for key-based and name-fallback sorting).
75
+ * @param field - The sort field to extract.
76
+ * @returns A lowercase string suitable for comparison-based sorting.
77
+ */
78
+ export declare function getChannelSortKey(channel: Channel, key: string, field: ChannelSortField): string;
79
+ /**
80
+ * Compares two channels for sorting by the specified field and direction with a built-in channel name tiebreaker. The tiebreaker is always ascending so that rows
81
+ * within each group maintain a consistent alphabetical order regardless of the primary sort direction. This is the single comparator for all sort sites — server HTML
82
+ * render, client re-sort, and M3U playlist — to prevent ordering divergence.
83
+ * @param channelA - First channel definition.
84
+ * @param keyA - First channel key.
85
+ * @param channelB - Second channel definition.
86
+ * @param keyB - Second channel key.
87
+ * @param field - The sort field to compare.
88
+ * @param direction - Sort direction for the primary field.
89
+ * @returns A negative, zero, or positive number for sort ordering.
90
+ */
91
+ export declare function compareChannelSort(channelA: Channel, keyA: string, channelB: Channel, keyB: string, field: ChannelSortField, direction: SortDirection): number;
59
92
  /**
60
93
  * Gets the provider group for a channel key. Works with both canonical and variant keys.
61
94
  * @param key - Any channel key in the group.