prismcast 1.7.0 → 1.9.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 (208) hide show
  1. package/README.md +6 -6
  2. package/dist/app.js +24 -13
  3. package/dist/app.js.map +1 -1
  4. package/dist/browser/cdp.d.ts +4 -6
  5. package/dist/browser/cdp.js +13 -17
  6. package/dist/browser/cdp.js.map +1 -1
  7. package/dist/browser/index.js +3 -3
  8. package/dist/browser/index.js.map +1 -1
  9. package/dist/browser/login.js +11 -8
  10. package/dist/browser/login.js.map +1 -1
  11. package/dist/browser/precaching.d.ts +1 -1
  12. package/dist/browser/precaching.js +23 -23
  13. package/dist/browser/precaching.js.map +1 -1
  14. package/dist/browser/tuning/directv.js +4 -7
  15. package/dist/browser/tuning/directv.js.map +1 -1
  16. package/dist/browser/tuning/fox.js +1 -1
  17. package/dist/browser/tuning/fox.js.map +1 -1
  18. package/dist/browser/tuning/hbo.js +1 -1
  19. package/dist/browser/tuning/hbo.js.map +1 -1
  20. package/dist/browser/tuning/hulu.js +3 -3
  21. package/dist/browser/tuning/hulu.js.map +1 -1
  22. package/dist/browser/tuning/sling.js +2 -2
  23. package/dist/browser/tuning/sling.js.map +1 -1
  24. package/dist/channels/index.d.ts +2 -0
  25. package/dist/channels/index.js +438 -252
  26. package/dist/channels/index.js.map +1 -1
  27. package/dist/config/health.d.ts +3 -3
  28. package/dist/config/health.js +13 -18
  29. package/dist/config/health.js.map +1 -1
  30. package/dist/config/index.js +11 -2
  31. package/dist/config/index.js.map +1 -1
  32. package/dist/config/persistence.d.ts +59 -0
  33. package/dist/config/persistence.js +127 -0
  34. package/dist/config/persistence.js.map +1 -0
  35. package/dist/config/profiles.js +10 -10
  36. package/dist/config/profiles.js.map +1 -1
  37. package/dist/config/servicePacks.d.ts +46 -0
  38. package/dist/config/{providerPacks.js → servicePacks.js} +28 -31
  39. package/dist/config/servicePacks.js.map +1 -0
  40. package/dist/config/services.d.ts +202 -0
  41. package/dist/config/services.js +758 -0
  42. package/dist/config/services.js.map +1 -0
  43. package/dist/config/sites.js +61 -61
  44. package/dist/config/sites.js.map +1 -1
  45. package/dist/config/userChannels.d.ts +89 -27
  46. package/dist/config/userChannels.js +400 -184
  47. package/dist/config/userChannels.js.map +1 -1
  48. package/dist/config/userConfig.d.ts +13 -9
  49. package/dist/config/userConfig.js +78 -60
  50. package/dist/config/userConfig.js.map +1 -1
  51. package/dist/config/userProfiles.d.ts +31 -15
  52. package/dist/config/userProfiles.js +154 -123
  53. package/dist/config/userProfiles.js.map +1 -1
  54. package/dist/hdhr/channelMap.d.ts +1 -1
  55. package/dist/hdhr/channelMap.js +4 -7
  56. package/dist/hdhr/channelMap.js.map +1 -1
  57. package/dist/hdhr/discover.js +7 -15
  58. package/dist/hdhr/discover.js.map +1 -1
  59. package/dist/hdhr/index.js +6 -9
  60. package/dist/hdhr/index.js.map +1 -1
  61. package/dist/native/index.d.ts +2 -2
  62. package/dist/native/index.js +17 -27
  63. package/dist/native/index.js.map +1 -1
  64. package/dist/native/intercept.js +86 -89
  65. package/dist/native/intercept.js.map +1 -1
  66. package/dist/native/probe.js +2 -2
  67. package/dist/native/probe.js.map +1 -1
  68. package/dist/native/proxy.d.ts +2 -2
  69. package/dist/native/proxy.js +4 -4
  70. package/dist/native/proxy.js.map +1 -1
  71. package/dist/routes/assets.js +29 -51
  72. package/dist/routes/assets.js.map +1 -1
  73. package/dist/routes/auth.js +3 -3
  74. package/dist/routes/auth.js.map +1 -1
  75. package/dist/routes/channels.js +5 -11
  76. package/dist/routes/channels.js.map +1 -1
  77. package/dist/routes/components.d.ts +0 -8
  78. package/dist/routes/components.js +0 -19
  79. package/dist/routes/components.js.map +1 -1
  80. package/dist/routes/config/channels/index.d.ts +1 -1
  81. package/dist/routes/config/channels/index.js +1 -1
  82. package/dist/routes/config/channels/index.js.map +1 -1
  83. package/dist/routes/config/channels/routes.js +748 -420
  84. package/dist/routes/config/channels/routes.js.map +1 -1
  85. package/dist/routes/config/channels/table.d.ts +21 -6
  86. package/dist/routes/config/channels/table.js +456 -193
  87. package/dist/routes/config/channels/table.js.map +1 -1
  88. package/dist/routes/config/index.d.ts +2 -2
  89. package/dist/routes/config/index.js +3 -3
  90. package/dist/routes/config/index.js.map +1 -1
  91. package/dist/routes/config/{providers.js → services.js} +47 -42
  92. package/dist/routes/config/services.js.map +1 -0
  93. package/dist/routes/config/settings.js +88 -49
  94. package/dist/routes/config/settings.js.map +1 -1
  95. package/dist/routes/debug.js +5 -7
  96. package/dist/routes/debug.js.map +1 -1
  97. package/dist/routes/health.js +1 -1
  98. package/dist/routes/health.js.map +1 -1
  99. package/dist/routes/icons.d.ts +16 -0
  100. package/dist/routes/icons.js +44 -0
  101. package/dist/routes/icons.js.map +1 -0
  102. package/dist/routes/index.js +2 -2
  103. package/dist/routes/index.js.map +1 -1
  104. package/dist/routes/logs.js +4 -4
  105. package/dist/routes/logs.js.map +1 -1
  106. package/dist/routes/playlist.d.ts +6 -4
  107. package/dist/routes/playlist.js +98 -45
  108. package/dist/routes/playlist.js.map +1 -1
  109. package/dist/routes/root/content.js +94 -55
  110. package/dist/routes/root/content.js.map +1 -1
  111. package/dist/routes/root/scripts/channels.js +620 -478
  112. package/dist/routes/root/scripts/channels.js.map +1 -1
  113. package/dist/routes/root/scripts/config.js +884 -964
  114. package/dist/routes/root/scripts/config.js.map +1 -1
  115. package/dist/routes/root/scripts/shared.js +468 -188
  116. package/dist/routes/root/scripts/shared.js.map +1 -1
  117. package/dist/routes/root/scripts/status.js +252 -207
  118. package/dist/routes/root/scripts/status.js.map +1 -1
  119. package/dist/routes/root/styles.js +57 -8
  120. package/dist/routes/root/styles.js.map +1 -1
  121. package/dist/routes/services.d.ts +6 -0
  122. package/dist/routes/{providers.js → services.js} +43 -43
  123. package/dist/routes/services.js.map +1 -0
  124. package/dist/routes/ui.d.ts +1 -1
  125. package/dist/routes/ui.js +3 -1
  126. package/dist/routes/ui.js.map +1 -1
  127. package/dist/service/commands.js +8 -43
  128. package/dist/service/commands.js.map +1 -1
  129. package/dist/service/generators.d.ts +1 -1
  130. package/dist/service/generators.js +143 -41
  131. package/dist/service/generators.js.map +1 -1
  132. package/dist/streaming/codec.d.ts +20 -0
  133. package/dist/streaming/codec.js +68 -0
  134. package/dist/streaming/codec.js.map +1 -0
  135. package/dist/streaming/fmp4Segmenter.d.ts +2 -2
  136. package/dist/streaming/fmp4Segmenter.js.map +1 -1
  137. package/dist/streaming/hls.d.ts +4 -4
  138. package/dist/streaming/hls.js +35 -29
  139. package/dist/streaming/hls.js.map +1 -1
  140. package/dist/streaming/hlsResume.js +3 -3
  141. package/dist/streaming/hlsResume.js.map +1 -1
  142. package/dist/streaming/monitor.d.ts +2 -2
  143. package/dist/streaming/monitor.js +19 -13
  144. package/dist/streaming/monitor.js.map +1 -1
  145. package/dist/streaming/preroll.d.ts +15 -14
  146. package/dist/streaming/preroll.js +32 -12
  147. package/dist/streaming/preroll.js.map +1 -1
  148. package/dist/streaming/registry.d.ts +2 -2
  149. package/dist/streaming/registry.js +4 -8
  150. package/dist/streaming/registry.js.map +1 -1
  151. package/dist/streaming/setup.d.ts +4 -4
  152. package/dist/streaming/setup.js +28 -34
  153. package/dist/streaming/setup.js.map +1 -1
  154. package/dist/streaming/showInfo.js +8 -10
  155. package/dist/streaming/showInfo.js.map +1 -1
  156. package/dist/streaming/statusEmitter.d.ts +4 -3
  157. package/dist/streaming/statusEmitter.js +3 -3
  158. package/dist/streaming/statusEmitter.js.map +1 -1
  159. package/dist/types/channels.d.ts +18 -11
  160. package/dist/types/config.d.ts +3 -2
  161. package/dist/types/index.d.ts +4 -3
  162. package/dist/types/index.js +1 -0
  163. package/dist/types/index.js.map +1 -1
  164. package/dist/types/profiles.d.ts +9 -9
  165. package/dist/types/selection.d.ts +1 -1
  166. package/dist/types/shared.d.ts +1 -1
  167. package/dist/types/streaming.d.ts +8 -16
  168. package/dist/types/streaming.js +5 -1
  169. package/dist/types/streaming.js.map +1 -1
  170. package/dist/upgrade/commands.js +1 -16
  171. package/dist/upgrade/commands.js.map +1 -1
  172. package/dist/utils/chromeFetch.js +1 -1
  173. package/dist/utils/cliOutput.d.ts +10 -0
  174. package/dist/utils/cliOutput.js +17 -0
  175. package/dist/utils/cliOutput.js.map +1 -0
  176. package/dist/utils/debugFilter.js +3 -3
  177. package/dist/utils/debugFilter.js.map +1 -1
  178. package/dist/utils/fileLogger.js +4 -3
  179. package/dist/utils/fileLogger.js.map +1 -1
  180. package/dist/utils/format.d.ts +21 -4
  181. package/dist/utils/format.js +45 -7
  182. package/dist/utils/format.js.map +1 -1
  183. package/dist/utils/index.d.ts +1 -0
  184. package/dist/utils/index.js +1 -0
  185. package/dist/utils/index.js.map +1 -1
  186. package/dist/utils/logger.js +17 -27
  187. package/dist/utils/logger.js.map +1 -1
  188. package/dist/utils/morganStream.js +2 -2
  189. package/dist/utils/morganStream.js.map +1 -1
  190. package/dist/utils/platform.js +3 -2
  191. package/dist/utils/platform.js.map +1 -1
  192. package/dist/utils/retry.js +2 -4
  193. package/dist/utils/retry.js.map +1 -1
  194. package/dist/utils/streamContext.d.ts +7 -0
  195. package/dist/utils/streamContext.js +10 -1
  196. package/dist/utils/streamContext.js.map +1 -1
  197. package/dist/utils/version.js +4 -4
  198. package/dist/utils/version.js.map +1 -1
  199. package/package.json +5 -7
  200. package/dist/config/providerPacks.d.ts +0 -46
  201. package/dist/config/providerPacks.js.map +0 -1
  202. package/dist/config/providers.d.ts +0 -175
  203. package/dist/config/providers.js +0 -678
  204. package/dist/config/providers.js.map +0 -1
  205. package/dist/routes/config/providers.js.map +0 -1
  206. package/dist/routes/providers.d.ts +0 -6
  207. package/dist/routes/providers.js.map +0 -1
  208. /package/dist/routes/config/{providers.d.ts → services.d.ts} +0 -0
@@ -4,10 +4,9 @@
4
4
  */
5
5
  import { DOMAIN_CONFIG, SITE_PROFILES, getBuiltinProfile, isProviderProfile } from "./sites.js";
6
6
  import { LOG, containsNonPrintable } from "../utils/index.js";
7
- import { getDataDir, getProfilesFilePath } from "./paths.js";
7
+ import { createFileStore } from "./persistence.js";
8
8
  import { extractDomain } from "../utils/format.js";
9
- import fs from "node:fs";
10
- const { promises: fsPromises } = fs;
9
+ import { getProfilesFilePath } from "./paths.js";
11
10
  /* PrismCast allows users to define custom site profiles and domain mappings in profiles.json inside the data directory. User profiles extend built-in profiles and
12
11
  * are merged at runtime, with user domain mappings taking precedence over built-in mappings for domain conflicts. This module handles persistence, validation, and
13
12
  * cache management for user-defined profiles and domains.
@@ -18,17 +17,59 @@ const { promises: fsPromises } = fs;
18
17
  *
19
18
  * User profiles cannot extend other user profiles — only built-in profiles. This prevents cascading breakage when a referenced user profile is deleted.
20
19
  */
20
+ // Legacy profile flag names that have been renamed. Keys are the old names, values are the current names. Used by initializeUserProfiles() and service pack import to
21
+ // silently normalize persisted and imported profiles at the boundary where external data enters the system.
22
+ const LEGACY_PROFILE_FLAGS = { noVideo: "staticCapture" };
21
23
  // Valid SiteProfile behavior flag names that users can set. Metadata fields (category, description, extends, summary) are handled separately.
22
24
  const VALID_PROFILE_FLAGS = new Set([
23
25
  "channelSelector", "clickSelector", "clickToPlay", "dismissSelector", "fullscreenKey", "fullscreenSelector", "hideSelector", "lockVolumeProperties",
24
- "needsIframeHandling", "noVideo", "selectReadyVideo", "useRequestFullscreen", "waitForNetworkIdle"
26
+ "needsIframeHandling", "selectReadyVideo", "staticCapture", "useRequestFullscreen", "waitForNetworkIdle"
25
27
  ]);
26
- // Generic strategies available for user profiles. Provider-specific strategies are built-in implementations and cannot be used by user profiles.
28
+ // Generic strategies available for user profiles. Service-specific strategies are built-in implementations and cannot be used by user profiles.
27
29
  const GENERIC_STRATEGIES = new Set(["none", "thumbnailRow", "tileClick"]);
28
- // All recognized strategy names (generic + provider-specific). Used for validation error messages.
30
+ // All recognized strategy names (generic + service-specific). Used for validation error messages.
29
31
  const ALL_STRATEGIES = new Set(["foxGrid", "guideGrid", "hboGrid", "none", "slingGrid", "thumbnailRow", "tileClick", "youtubeGrid"]);
30
32
  // Strategies that require a matchSelector to identify channel elements.
31
33
  const STRATEGIES_REQUIRING_MATCH_SELECTOR = new Set(["thumbnailRow", "tileClick"]);
34
+ /**
35
+ * Extracts a typed record from an unknown parsed value. Validates that the value is a plain object (not null, not an array) and that each entry is also a plain
36
+ * object. Non-object entries are silently skipped.
37
+ * @param raw - The raw parsed value to extract from.
38
+ * @returns A record of valid object entries.
39
+ */
40
+ function extractObjectMap(raw) {
41
+ const result = {};
42
+ if ((typeof raw === "object") && (raw !== null) && !Array.isArray(raw)) {
43
+ for (const [key, value] of Object.entries(raw)) {
44
+ if ((typeof value === "object") && (value !== null) && !Array.isArray(value)) {
45
+ result[key] = value;
46
+ }
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ /**
52
+ * Normalizes legacy field names in a set of profiles. Renames any fields listed in LEGACY_PROFILE_FLAGS to their current names in-place. When a profile already
53
+ * contains the current field name, the current value is preserved and the legacy field is deleted without overwriting.
54
+ * @param profiles - The profile records to normalize.
55
+ * @returns True if any field was renamed or removed.
56
+ */
57
+ export function normalizeLegacyProfileFlags(profiles) {
58
+ let changed = false;
59
+ for (const profile of Object.values(profiles)) {
60
+ for (const [oldName, newName] of Object.entries(LEGACY_PROFILE_FLAGS)) {
61
+ if (oldName in profile) {
62
+ // Only copy the legacy value if the current field name is not already present. If both exist (e.g., hand-edited JSON), the current name takes precedence.
63
+ if (!(newName in profile)) {
64
+ profile[newName] = profile[oldName];
65
+ }
66
+ Reflect.deleteProperty(profile, oldName);
67
+ changed = true;
68
+ }
69
+ }
70
+ }
71
+ return changed;
72
+ }
32
73
  // Module-level storage for loaded user profiles and domains. Populated at startup and updated on save.
33
74
  let loadedUserProfiles = {};
34
75
  let loadedUserDomains = {};
@@ -63,137 +104,127 @@ export function getUserDomains() {
63
104
  return { ...loadedUserDomains };
64
105
  }
65
106
  /**
66
- * Loads user profiles and domain mappings from the profiles file. Returns empty objects if the file doesn't exist, and sets parseError if the file exists but
67
- * contains invalid JSON.
68
- * @returns The loaded profiles and domains with parse status.
107
+ * Parses raw profiles.json content into the compound data type.
108
+ * @param raw - The raw JSON string from the file.
109
+ * @returns The parsed compound data.
69
110
  */
70
- export async function loadUserProfiles() {
71
- try {
72
- const content = await fsPromises.readFile(getProfilesFilePath(), "utf-8");
73
- try {
74
- // Parse as an untyped record to manually validate structure before assigning to typed interfaces.
75
- const parsed = JSON.parse(content);
76
- const profiles = {};
77
- const domains = {};
78
- // Extract profiles if present and valid.
79
- const rawProfiles = parsed.profiles;
80
- if ((typeof rawProfiles === "object") && (rawProfiles !== null) && !Array.isArray(rawProfiles)) {
81
- for (const [key, value] of Object.entries(rawProfiles)) {
82
- if ((typeof value === "object") && (value !== null) && !Array.isArray(value)) {
83
- profiles[key] = value;
84
- }
85
- }
86
- }
87
- // Extract domains if present and valid.
88
- const rawDomains = parsed.domains;
89
- if ((typeof rawDomains === "object") && (rawDomains !== null) && !Array.isArray(rawDomains)) {
90
- for (const [key, value] of Object.entries(rawDomains)) {
91
- if ((typeof value === "object") && (value !== null) && !Array.isArray(value)) {
92
- domains[key] = value;
93
- }
94
- }
95
- }
96
- return { domains, parseError: false, profiles };
97
- }
98
- catch (parseError) {
99
- const message = (parseError instanceof Error) ? parseError.message : String(parseError);
100
- LOG.warn("Invalid JSON in profiles file %s: %s. Skipping user profiles.", getProfilesFilePath(), message);
101
- return { domains: {}, parseError: true, parseErrorMessage: message, profiles: {} };
102
- }
111
+ function parseProfilesFile(raw) {
112
+ const parsed = JSON.parse(raw);
113
+ return {
114
+ domains: extractObjectMap(parsed.domains),
115
+ profiles: extractObjectMap(parsed.profiles)
116
+ };
117
+ }
118
+ /**
119
+ * Prepares profiles data for writing to disk. Conditionally includes top-level keys only when they have entries.
120
+ * @param data - The compound profiles data.
121
+ * @returns The serializable output.
122
+ */
123
+ function prepareProfilesForWrite(data) {
124
+ const file = {};
125
+ if (Object.keys(data.domains).length > 0) {
126
+ file.domains = data.domains;
103
127
  }
104
- catch (error) {
105
- // File doesn't exist — this is normal, no user profiles defined.
106
- if (error.code === "ENOENT") {
107
- return { domains: {}, parseError: false, profiles: {} };
108
- }
109
- // Other read errors — log and skip user profiles.
110
- LOG.warn("Failed to read profiles file %s: %s. Skipping user profiles.", getProfilesFilePath(), (error instanceof Error) ? error.message : String(error));
111
- return { domains: {}, parseError: false, profiles: {} };
128
+ if (Object.keys(data.profiles).length > 0) {
129
+ file.profiles = data.profiles;
112
130
  }
131
+ return file;
113
132
  }
133
+ // Transactional store instance for profiles.json.
134
+ const profilesStore = createFileStore({
135
+ beforeWrite: prepareProfilesForWrite,
136
+ defaultValue: () => ({ domains: {}, profiles: {} }),
137
+ label: "profiles",
138
+ parse: parseProfilesFile,
139
+ path: getProfilesFilePath
140
+ });
114
141
  /**
115
- * Saves user profiles and domain mappings to the profiles file and updates the in-memory cache. Creates the data directory if it doesn't exist. Keys are sorted
116
- * for consistent output.
117
- * @param profiles - The profiles to save.
118
- * @param domains - The domain mappings to save.
119
- * @throws If the file cannot be written.
142
+ * Reads the current profiles from disk without acquiring the serialization lock. Returns the parsed profiles and domains with parse status. Use this for
143
+ * read-only access and startup initialization. For modifications, use mutateProfiles() instead.
144
+ * @returns The loaded profiles and domains with parse status.
120
145
  */
121
- export async function saveUserProfiles(profiles, domains) {
122
- // Ensure data directory exists.
123
- await fsPromises.mkdir(getDataDir(), { recursive: true });
124
- // Build the file contents with sorted keys for consistent output.
125
- const file = {};
126
- // Only include sections that have entries.
127
- const sortedDomainKeys = Object.keys(domains).sort();
128
- const sortedProfileKeys = Object.keys(profiles).sort();
129
- if (sortedDomainKeys.length > 0) {
130
- const sortedDomains = {};
131
- for (const key of sortedDomainKeys) {
132
- sortedDomains[key] = domains[key];
133
- }
134
- file.domains = sortedDomains;
146
+ export async function readProfiles() {
147
+ const result = await profilesStore.read();
148
+ return {
149
+ domains: result.data.domains,
150
+ parseError: result.parseError,
151
+ parseErrorMessage: result.parseErrorMessage,
152
+ profiles: result.data.profiles
153
+ };
154
+ }
155
+ /**
156
+ * Serialized read-modify-write operation on profiles.json. The mutation function receives the current profiles and domains as a compound object and can modify
157
+ * them in place. The store handles atomicity, serialization, corruption guard, and backup. After a successful write, the in-memory cache is updated.
158
+ * @param fn - Mutation function. Receives current `{ profiles, domains }`. Modify in place (void return).
159
+ * @throws FileStoreParseError if profiles.json contains invalid JSON.
160
+ */
161
+ export async function mutateProfiles(fn) {
162
+ let finalData;
163
+ await profilesStore.mutate((data) => {
164
+ fn(data);
165
+ finalData = data;
166
+ });
167
+ // Side effects after successful write.
168
+ if (finalData) {
169
+ loadedUserProfiles = { ...finalData.profiles };
170
+ loadedUserDomains = { ...finalData.domains };
171
+ userProfilesParseError = false;
172
+ userProfilesParseErrorMessage = undefined;
135
173
  }
136
- if (sortedProfileKeys.length > 0) {
137
- const sortedProfiles = {};
138
- for (const key of sortedProfileKeys) {
139
- sortedProfiles[key] = profiles[key];
140
- }
141
- file.profiles = sortedProfiles;
142
- }
143
- // Write with pretty formatting for readability.
144
- const content = JSON.stringify(file, null, 2);
145
- await fsPromises.writeFile(getProfilesFilePath(), content + "\n", "utf-8");
146
- // Update in-memory cache.
147
- loadedUserProfiles = { ...profiles };
148
- loadedUserDomains = { ...domains };
149
- // Clear any previous parse error.
150
- userProfilesParseError = false;
151
- userProfilesParseErrorMessage = undefined;
152
174
  }
153
175
  /**
154
- * Deletes a user profile by key and removes any domain mappings that reference it. Reloads the file from disk before modifying to avoid data loss.
176
+ * Deletes a user profile by key and removes any domain mappings that reference it.
155
177
  * @param key - The profile key to delete.
156
- * @throws If the file cannot be read or written.
178
+ * @throws FileStoreParseError if the profiles file contains invalid JSON.
179
+ * @throws If the file cannot be written.
157
180
  */
158
181
  export async function deleteUserProfile(key) {
159
- const result = await loadUserProfiles();
160
- if (result.parseError) {
161
- throw new Error("Cannot delete profile: profiles file contains invalid JSON.");
162
- }
163
- // Remove the profile.
164
- Reflect.deleteProperty(result.profiles, key);
165
- // Remove any domain mappings that reference this profile.
166
- for (const [domain, config] of Object.entries(result.domains)) {
167
- if (config.profile === key) {
168
- Reflect.deleteProperty(result.domains, domain);
182
+ await mutateProfiles((data) => {
183
+ Reflect.deleteProperty(data.profiles, key);
184
+ // Remove any domain mappings that reference this profile.
185
+ for (const [domain, config] of Object.entries(data.domains)) {
186
+ if (config.profile === key) {
187
+ Reflect.deleteProperty(data.domains, domain);
188
+ }
169
189
  }
170
- }
171
- await saveUserProfiles(result.profiles, result.domains);
190
+ });
172
191
  LOG.info("User profile '%s' deleted.", key);
173
192
  }
174
193
  /**
175
- * Deletes a single user domain mapping. Reloads the file from disk before modifying to avoid data loss.
194
+ * Deletes a single user domain mapping.
176
195
  * @param domain - The domain hostname to remove.
177
- * @throws If the file cannot be read or written.
196
+ * @throws FileStoreParseError if the profiles file contains invalid JSON.
197
+ * @throws If the file cannot be written.
178
198
  */
179
199
  export async function deleteUserDomain(domain) {
180
- const result = await loadUserProfiles();
181
- if (result.parseError) {
182
- throw new Error("Cannot delete domain: profiles file contains invalid JSON.");
183
- }
184
- Reflect.deleteProperty(result.domains, domain);
185
- await saveUserProfiles(result.profiles, result.domains);
200
+ await mutateProfiles((data) => {
201
+ Reflect.deleteProperty(data.domains, domain);
202
+ });
186
203
  LOG.info("User domain mapping '%s' deleted.", domain);
187
204
  }
188
205
  /**
189
206
  * Initializes user profiles by loading them from the file. Called once at server startup before profile validation and channel loading.
190
207
  */
191
208
  export async function initializeUserProfiles() {
192
- const result = await loadUserProfiles();
209
+ const result = await readProfiles();
193
210
  loadedUserProfiles = result.profiles;
194
211
  loadedUserDomains = result.domains;
195
212
  userProfilesParseError = result.parseError;
196
213
  userProfilesParseErrorMessage = result.parseErrorMessage;
214
+ // Normalize legacy profile field names at the persistence boundary. If any fields were renamed, persist the updated file so the migration only runs once.
215
+ // The save is wrapped in its own try/catch so a write failure (disk full, permission error, parse error) is logged as a migration warning rather than
216
+ // propagated to startup. The normalized in-memory profiles are used regardless...the migration is best-effort persistence.
217
+ if (normalizeLegacyProfileFlags(loadedUserProfiles)) {
218
+ try {
219
+ await mutateProfiles((data) => {
220
+ normalizeLegacyProfileFlags(data.profiles);
221
+ });
222
+ LOG.info("Migrated legacy profile flags in user profiles file.");
223
+ }
224
+ catch (saveError) {
225
+ LOG.warn("Failed to persist migrated profile flags: %s. Migration will retry on next startup.", (saveError instanceof Error) ? saveError.message : String(saveError));
226
+ }
227
+ }
197
228
  // Check for non-printable characters in loaded profile and domain string values. These warnings are informational — loaded data is not modified.
198
229
  for (const [profileKey, profile] of Object.entries(loadedUserProfiles)) {
199
230
  for (const [field, value] of Object.entries(profile)) {
@@ -258,13 +289,13 @@ export function validateProfile(key, profile) {
258
289
  errors.push("Profile '" + key + "': extends is required. User profiles must extend a built-in profile.");
259
290
  return errors;
260
291
  }
261
- // extends must reference a built-in general profile (not another user profile or a provider profile). Provider profiles are tightly coupled to a streaming
262
- // service's DOM structure and cannot be meaningfully extended by user profiles.
292
+ // extends must reference a built-in general profile (not another user profile or a service-specific profile). Service-specific profiles are tightly coupled to
293
+ // a streaming service's DOM structure and cannot be meaningfully extended by user profiles.
263
294
  if (!getBuiltinProfile(profile.extends)) {
264
295
  errors.push("Profile '" + key + "': extends references non-existent built-in profile '" + profile.extends + "'.");
265
296
  }
266
297
  else if (isProviderProfile(profile.extends)) {
267
- errors.push("Profile '" + key + "': '" + profile.extends + "' is a provider-specific profile and cannot be extended. " +
298
+ errors.push("Profile '" + key + "': '" + profile.extends + "' is a service-specific profile and cannot be extended. " +
268
299
  "Use the predefined channels for this service instead.");
269
300
  }
270
301
  // Validate channel selection configuration if present.
@@ -274,7 +305,7 @@ export function validateProfile(key, profile) {
274
305
  errors.push("Profile '" + key + "': unrecognized channel selection strategy '" + strategy + "'.");
275
306
  }
276
307
  else if (!GENERIC_STRATEGIES.has(strategy)) {
277
- errors.push("Profile '" + key + "': strategy '" + strategy + "' is a built-in provider strategy and cannot be used by user profiles. " +
308
+ errors.push("Profile '" + key + "': strategy '" + strategy + "' is a built-in service strategy and cannot be used by user profiles. " +
278
309
  "Use 'tileClick', 'thumbnailRow', or 'none'.");
279
310
  }
280
311
  // matchSelector is required for tileClick and thumbnailRow strategies.
@@ -293,7 +324,7 @@ export function validateProfile(key, profile) {
293
324
  return errors;
294
325
  }
295
326
  /**
296
- * Validates a domain mapping. Checks hostname format, profile references, provider/providerTag strings, loginUrl format, and maxContinuousPlayback type and range.
327
+ * Validates a domain mapping. Checks hostname format, profile references, service/serviceTag strings, loginUrl format, and maxContinuousPlayback type and range.
297
328
  * @param domain - The domain hostname.
298
329
  * @param config - The domain configuration.
299
330
  * @param availableProfiles - Set of available profile names (built-in + user, including profiles in the same import batch).
@@ -310,13 +341,13 @@ export function validateDomain(domain, config, availableProfiles) {
310
341
  if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$/.test(domain)) {
311
342
  errors.push("Domain '" + domain + "': invalid hostname format.");
312
343
  }
313
- // Reject domains that collide with built-in domain mappings. User domains that shadow built-in domains cause the built-in provider to disappear from the system,
344
+ // Reject domains that collide with built-in domain mappings. User domains that shadow built-in domains cause the built-in service to disappear from the system,
314
345
  // affecting all channels on that domain. Users should set the profile field on individual channels to use a custom profile on a built-in domain instead.
315
346
  const conciseDomain = extractDomain("https://" + domain);
316
347
  const collidesWithBuiltin = DOMAIN_CONFIG[domain] ?? DOMAIN_CONFIG[conciseDomain];
317
348
  if (collidesWithBuiltin) {
318
- const builtinProvider = collidesWithBuiltin.provider ?? conciseDomain;
319
- errors.push("Domain '" + domain + "' is already mapped to built-in provider '" + builtinProvider +
349
+ const builtinService = collidesWithBuiltin.service ?? conciseDomain;
350
+ errors.push("Domain '" + domain + "' is already mapped to built-in service '" + builtinService +
320
351
  "'. Set the profile field on individual channels to use your custom profile instead.");
321
352
  }
322
353
  // dismissSelector must be a non-empty string if specified.
@@ -327,13 +358,13 @@ export function validateDomain(domain, config, availableProfiles) {
327
358
  if (config.profile && !availableProfiles.has(config.profile)) {
328
359
  errors.push("Domain '" + domain + "': references non-existent profile '" + config.profile + "'.");
329
360
  }
330
- // provider must be non-empty if specified.
331
- if ((config.provider !== undefined) && ((typeof config.provider !== "string") || (config.provider.trim() === ""))) {
332
- errors.push("Domain '" + domain + "': provider must be a non-empty string.");
361
+ // service must be non-empty if specified.
362
+ if ((config.service !== undefined) && ((typeof config.service !== "string") || (config.service.trim() === ""))) {
363
+ errors.push("Domain '" + domain + "': service must be a non-empty string.");
333
364
  }
334
- // providerTag must be non-empty if specified.
335
- if ((config.providerTag !== undefined) && ((typeof config.providerTag !== "string") || (config.providerTag.trim() === ""))) {
336
- errors.push("Domain '" + domain + "': providerTag must be a non-empty string.");
365
+ // serviceTag must be non-empty if specified.
366
+ if ((config.serviceTag !== undefined) && ((typeof config.serviceTag !== "string") || (config.serviceTag.trim() === ""))) {
367
+ errors.push("Domain '" + domain + "': serviceTag must be a non-empty string.");
337
368
  }
338
369
  // loginUrl must be a valid http/https URL if specified.
339
370
  if (config.loginUrl !== undefined) {
@@ -369,7 +400,7 @@ export function validateDomain(domain, config, availableProfiles) {
369
400
  return errors;
370
401
  }
371
402
  /**
372
- * Validates an entire import batch of profiles and domains. Returns the validated entries and any errors found. Used by both file import and provider pack import.
403
+ * Validates an entire import batch of profiles and domains. Returns the validated entries and any errors found. Used by both file import and service pack import.
373
404
  * @param data - The raw data to validate (profiles and/or domains).
374
405
  * @returns Validation result with validated entries and errors.
375
406
  */
@@ -1 +1 @@
1
- {"version":3,"file":"userProfiles.js","sourceRoot":"","sources":["../../src/config/userProfiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"userProfiles.js","sourceRoot":"","sources":["../../src/config/userProfiles.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export interface ChannelMapEntry {
10
10
  /**
11
11
  * Builds the channel number mapping from the current channel configuration. Channels with explicit channelNumber values are assigned first, then remaining
12
12
  * channels are auto-assigned sequential numbers starting from AUTO_ASSIGN_START, skipping any numbers already claimed by explicit assignments.
13
- * @returns Array of channel map entries sorted by channel number, excluding noVideo, HDHR-disabled, and disabled channels.
13
+ * @returns Array of channel map entries sorted by channel number, excluding HDHR-disabled and disabled channels.
14
14
  */
15
15
  export declare function buildChannelMap(): ChannelMapEntry[];
16
16
  /**
@@ -3,7 +3,6 @@
3
3
  * channelMap.ts: Channel key to channel number mapping for HDHomeRun emulation.
4
4
  */
5
5
  import { getAllChannels } from "../config/userChannels.js";
6
- import { resolveProfile } from "../config/profiles.js";
7
6
  /* HDHomeRun devices use numeric channel numbers (GuideNumber) for each channel. Plex requires these for EPG (electronic program guide) matching. PrismCast uses
8
7
  * string keys (e.g., "cnn", "nbc") for channels, so we need a mapping layer.
9
8
  *
@@ -19,7 +18,7 @@ const AUTO_ASSIGN_START = 1000;
19
18
  /**
20
19
  * Builds the channel number mapping from the current channel configuration. Channels with explicit channelNumber values are assigned first, then remaining
21
20
  * channels are auto-assigned sequential numbers starting from AUTO_ASSIGN_START, skipping any numbers already claimed by explicit assignments.
22
- * @returns Array of channel map entries sorted by channel number, excluding noVideo, HDHR-disabled, and disabled channels.
21
+ * @returns Array of channel map entries sorted by channel number, excluding HDHR-disabled and disabled channels.
23
22
  */
24
23
  export function buildChannelMap() {
25
24
  const channels = getAllChannels();
@@ -27,9 +26,8 @@ export function buildChannelMap() {
27
26
  // Collect all explicit channel numbers first so auto-assignment can skip them.
28
27
  const explicitNumbers = new Set();
29
28
  for (const [key, channel] of Object.entries(channels)) {
30
- // Skip non-video channels (static pages like EPGs) and channels excluded from the HDHR lineup.
31
- const profile = resolveProfile(channel.profile);
32
- if (profile.noVideo || (channel.hdhrEnabled === false)) {
29
+ // Skip channels excluded from the HDHR lineup.
30
+ if (channel.hdhrEnabled === false) {
33
31
  continue;
34
32
  }
35
33
  if ((channel.channelNumber !== undefined) && (channel.channelNumber > 0)) {
@@ -46,8 +44,7 @@ export function buildChannelMap() {
46
44
  const unassignedKeys = Object.keys(channels)
47
45
  .filter((key) => {
48
46
  const channel = channels[key];
49
- const profile = resolveProfile(channel.profile);
50
- return !profile.noVideo && (channel.hdhrEnabled !== false) && ((channel.channelNumber === undefined) || (channel.channelNumber <= 0));
47
+ return (channel.hdhrEnabled !== false) && ((channel.channelNumber === undefined) || (channel.channelNumber <= 0));
51
48
  })
52
49
  .sort();
53
50
  let nextNumber = AUTO_ASSIGN_START;
@@ -1 +1 @@
1
- {"version":3,"file":"channelMap.js","sourceRoot":"","sources":["../../src/hdhr/channelMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channelMap.js","sourceRoot":"","sources":["../../src/hdhr/channelMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAoB/B;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAE7B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,+EAA+E;IAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAI,MAAM,CAAE,GAAG,EAAE,OAAO,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEvD,+CAA+C;QAC/C,IAAG,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAEjC,SAAS;QACX,CAAC;QAED,IAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;YAExE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE3C,OAAO,CAAC,IAAI,CAAC;gBAEX,GAAG;gBACH,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG;gBACzB,MAAM,EAAE,OAAO,CAAC,aAAa;gBAC7B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,yHAAyH;IACzH,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE9B,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,IAAI,UAAU,GAAG,iBAAiB,CAAC;IAEnC,KAAI,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE9B,wDAAwD;QACxD,OAAM,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAEtC,UAAU,EAAE,CAAC;QACf,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YAEX,GAAG;YACH,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG;YACzB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IAEzD,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IAE1D,OAAO,KAAK,EAAE,GAAG,CAAC;AACpB,CAAC"}
@@ -122,27 +122,19 @@ export function setupHdhrEndpoints(app) {
122
122
  const stream = streams[i];
123
123
  const channelEntry = channelByKey.get(stream.info.storeKey);
124
124
  // Build the tuner entry. Active tuners include channel info and signal stats. Signal values are hardcoded at 100 since PrismCast streams are network-based and
125
- // either working or not — there is no analog signal quality to report.
125
+ // either working or not — there is no analog signal quality to report. Channel info is merged conditionally: prefer the channel map for VctNumber (numeric
126
+ // channel) and VctName (display name), fall back to stream.channelName for VctName if the channel was removed from the map after the stream started. Client
127
+ // address is normalized to strip IPv6-mapped IPv4 prefixes (::ffff:192.168.1.1 → 192.168.1.1).
126
128
  const tuner = {
127
129
  Frequency: 0,
128
130
  Resource: "tuner" + String(i),
129
131
  SignalQualityPercent: 100,
130
132
  SignalStrengthPercent: 100,
131
- SymbolQualityPercent: 100
133
+ SymbolQualityPercent: 100,
134
+ ...(channelEntry ? { VctName: channelEntry.name, VctNumber: String(channelEntry.number) } : {}),
135
+ ...(!channelEntry && stream.channelName ? { VctName: stream.channelName } : {}),
136
+ ...(stream.clientAddress ? { TargetIP: stream.clientAddress.startsWith("::ffff:") ? stream.clientAddress.slice(7) : stream.clientAddress } : {})
132
137
  };
133
- // Add channel info if available. Prefer the channel map for VctNumber (numeric channel) and VctName (display name). Fall back to stream.channelName for VctName
134
- // if the channel was removed from the map after the stream started.
135
- if (channelEntry) {
136
- tuner.VctName = channelEntry.name;
137
- tuner.VctNumber = String(channelEntry.number);
138
- }
139
- else if (stream.channelName) {
140
- tuner.VctName = stream.channelName;
141
- }
142
- // Add client address if known. Normalize IPv6-mapped IPv4 addresses (::ffff:192.168.1.1 → 192.168.1.1).
143
- if (stream.clientAddress) {
144
- tuner.TargetIP = stream.clientAddress.startsWith("::ffff:") ? stream.clientAddress.slice(7) : stream.clientAddress;
145
- }
146
138
  tuners.push(tuner);
147
139
  }
148
140
  // Fill remaining slots with idle tuner entries.
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/hdhr/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/hdhr/discover.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,11 @@
3
3
  * index.ts: HDHomeRun emulation server for PrismCast.
4
4
  */
5
5
  import { generateDeviceId, validateDeviceId } from "./deviceId.js";
6
- import { loadUserConfig, saveUserConfig } from "../config/userConfig.js";
7
6
  import { CONFIG } from "../config/index.js";
8
7
  import { LOG } from "../utils/index.js";
9
8
  import express from "express";
10
9
  import { formatError } from "../utils/errors.js";
10
+ import { mutateConfig } from "../config/userConfig.js";
11
11
  import { setupHdhrEndpoints } from "./discover.js";
12
12
  /* When HDHomeRun emulation is enabled, PrismCast runs a separate Express server that responds to HDHomeRun API requests from Plex. This server is intentionally
13
13
  * lightweight — it only serves device discovery and lineup metadata. All actual video streaming flows through PrismCast's main HTTP server via the HLS URLs in
@@ -34,15 +34,12 @@ export async function startHdhrServer() {
34
34
  }
35
35
  CONFIG.hdhr.deviceId = generateDeviceId();
36
36
  LOG.info("Generated HDHomeRun DeviceID: %s.", CONFIG.hdhr.deviceId.toUpperCase());
37
- // Save the generated ID to the user config so it persists across restarts. We load the current config, set the deviceId, and save to avoid overwriting other
38
- // settings.
37
+ // Save the generated ID to the user config so it persists across restarts.
39
38
  try {
40
- const result = await loadUserConfig();
41
- if (!result.parseError) {
42
- result.config.hdhr ??= {};
43
- result.config.hdhr.deviceId = CONFIG.hdhr.deviceId;
44
- await saveUserConfig(result.config);
45
- }
39
+ await mutateConfig((config) => {
40
+ config.hdhr ??= {};
41
+ config.hdhr.deviceId = CONFIG.hdhr.deviceId;
42
+ });
46
43
  }
47
44
  catch (error) {
48
45
  LOG.warn("Failed to persist HDHomeRun DeviceID: %s. A new ID will be generated on next restart.", formatError(error));