prismcast 1.8.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 (168) hide show
  1. package/README.md +6 -6
  2. package/dist/app.js +15 -5
  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/precaching.d.ts +1 -1
  10. package/dist/browser/precaching.js +23 -23
  11. package/dist/browser/precaching.js.map +1 -1
  12. package/dist/browser/tuning/directv.js +4 -7
  13. package/dist/browser/tuning/directv.js.map +1 -1
  14. package/dist/browser/tuning/fox.js +1 -1
  15. package/dist/browser/tuning/fox.js.map +1 -1
  16. package/dist/browser/tuning/hbo.js +1 -1
  17. package/dist/browser/tuning/hbo.js.map +1 -1
  18. package/dist/browser/tuning/hulu.js +3 -3
  19. package/dist/browser/tuning/hulu.js.map +1 -1
  20. package/dist/browser/tuning/sling.js +2 -2
  21. package/dist/browser/tuning/sling.js.map +1 -1
  22. package/dist/channels/index.d.ts +1 -1
  23. package/dist/channels/index.js +416 -416
  24. package/dist/channels/index.js.map +1 -1
  25. package/dist/config/health.d.ts +3 -3
  26. package/dist/config/health.js +3 -3
  27. package/dist/config/index.js +2 -2
  28. package/dist/config/index.js.map +1 -1
  29. package/dist/config/persistence.d.ts +59 -0
  30. package/dist/config/persistence.js +127 -0
  31. package/dist/config/persistence.js.map +1 -0
  32. package/dist/config/servicePacks.d.ts +46 -0
  33. package/dist/config/{providerPacks.js → servicePacks.js} +28 -31
  34. package/dist/config/servicePacks.js.map +1 -0
  35. package/dist/config/services.d.ts +202 -0
  36. package/dist/config/{providers.js → services.js} +277 -210
  37. package/dist/config/services.js.map +1 -0
  38. package/dist/config/sites.js +61 -61
  39. package/dist/config/sites.js.map +1 -1
  40. package/dist/config/userChannels.d.ts +36 -27
  41. package/dist/config/userChannels.js +300 -212
  42. package/dist/config/userChannels.js.map +1 -1
  43. package/dist/config/userConfig.d.ts +11 -9
  44. package/dist/config/userConfig.js +53 -60
  45. package/dist/config/userConfig.js.map +1 -1
  46. package/dist/config/userProfiles.d.ts +31 -15
  47. package/dist/config/userProfiles.js +139 -96
  48. package/dist/config/userProfiles.js.map +1 -1
  49. package/dist/hdhr/channelMap.d.ts +1 -1
  50. package/dist/hdhr/channelMap.js +4 -7
  51. package/dist/hdhr/channelMap.js.map +1 -1
  52. package/dist/hdhr/index.js +6 -9
  53. package/dist/hdhr/index.js.map +1 -1
  54. package/dist/native/index.js +3 -3
  55. package/dist/native/index.js.map +1 -1
  56. package/dist/native/intercept.js +86 -89
  57. package/dist/native/intercept.js.map +1 -1
  58. package/dist/native/probe.js +2 -2
  59. package/dist/native/probe.js.map +1 -1
  60. package/dist/native/proxy.js +4 -4
  61. package/dist/native/proxy.js.map +1 -1
  62. package/dist/routes/assets.js +3 -3
  63. package/dist/routes/assets.js.map +1 -1
  64. package/dist/routes/auth.js +3 -3
  65. package/dist/routes/auth.js.map +1 -1
  66. package/dist/routes/config/channels/index.d.ts +1 -1
  67. package/dist/routes/config/channels/index.js +1 -1
  68. package/dist/routes/config/channels/index.js.map +1 -1
  69. package/dist/routes/config/channels/routes.js +488 -460
  70. package/dist/routes/config/channels/routes.js.map +1 -1
  71. package/dist/routes/config/channels/table.d.ts +4 -4
  72. package/dist/routes/config/channels/table.js +206 -147
  73. package/dist/routes/config/channels/table.js.map +1 -1
  74. package/dist/routes/config/index.d.ts +2 -2
  75. package/dist/routes/config/index.js +3 -3
  76. package/dist/routes/config/index.js.map +1 -1
  77. package/dist/routes/config/{providers.js → services.js} +44 -39
  78. package/dist/routes/config/services.js.map +1 -0
  79. package/dist/routes/config/settings.js +47 -29
  80. package/dist/routes/config/settings.js.map +1 -1
  81. package/dist/routes/debug.js +5 -7
  82. package/dist/routes/debug.js.map +1 -1
  83. package/dist/routes/health.js +1 -1
  84. package/dist/routes/health.js.map +1 -1
  85. package/dist/routes/index.js +2 -2
  86. package/dist/routes/index.js.map +1 -1
  87. package/dist/routes/logs.js +4 -4
  88. package/dist/routes/logs.js.map +1 -1
  89. package/dist/routes/playlist.d.ts +4 -4
  90. package/dist/routes/playlist.js +56 -44
  91. package/dist/routes/playlist.js.map +1 -1
  92. package/dist/routes/root/content.js +58 -58
  93. package/dist/routes/root/content.js.map +1 -1
  94. package/dist/routes/root/scripts/channels.js +529 -572
  95. package/dist/routes/root/scripts/channels.js.map +1 -1
  96. package/dist/routes/root/scripts/config.js +838 -992
  97. package/dist/routes/root/scripts/config.js.map +1 -1
  98. package/dist/routes/root/scripts/shared.js +431 -197
  99. package/dist/routes/root/scripts/shared.js.map +1 -1
  100. package/dist/routes/root/scripts/status.js +247 -196
  101. package/dist/routes/root/scripts/status.js.map +1 -1
  102. package/dist/routes/root/styles.js +12 -4
  103. package/dist/routes/root/styles.js.map +1 -1
  104. package/dist/routes/services.d.ts +6 -0
  105. package/dist/routes/{providers.js → services.js} +43 -43
  106. package/dist/routes/services.js.map +1 -0
  107. package/dist/routes/ui.js +2 -0
  108. package/dist/routes/ui.js.map +1 -1
  109. package/dist/service/commands.js +5 -8
  110. package/dist/service/commands.js.map +1 -1
  111. package/dist/service/generators.d.ts +1 -1
  112. package/dist/service/generators.js +143 -41
  113. package/dist/service/generators.js.map +1 -1
  114. package/dist/streaming/hls.d.ts +4 -4
  115. package/dist/streaming/hls.js +24 -23
  116. package/dist/streaming/hls.js.map +1 -1
  117. package/dist/streaming/hlsResume.js +1 -1
  118. package/dist/streaming/hlsResume.js.map +1 -1
  119. package/dist/streaming/monitor.d.ts +2 -2
  120. package/dist/streaming/monitor.js +19 -13
  121. package/dist/streaming/monitor.js.map +1 -1
  122. package/dist/streaming/preroll.js +1 -1
  123. package/dist/streaming/preroll.js.map +1 -1
  124. package/dist/streaming/registry.js +4 -8
  125. package/dist/streaming/registry.js.map +1 -1
  126. package/dist/streaming/setup.d.ts +2 -2
  127. package/dist/streaming/setup.js +23 -22
  128. package/dist/streaming/setup.js.map +1 -1
  129. package/dist/streaming/showInfo.js +8 -10
  130. package/dist/streaming/showInfo.js.map +1 -1
  131. package/dist/streaming/statusEmitter.d.ts +4 -3
  132. package/dist/streaming/statusEmitter.js +3 -3
  133. package/dist/streaming/statusEmitter.js.map +1 -1
  134. package/dist/types/channels.d.ts +15 -11
  135. package/dist/types/config.d.ts +2 -2
  136. package/dist/types/index.d.ts +2 -2
  137. package/dist/types/profiles.d.ts +9 -9
  138. package/dist/types/selection.d.ts +1 -1
  139. package/dist/types/shared.d.ts +1 -1
  140. package/dist/types/streaming.d.ts +1 -1
  141. package/dist/utils/chromeFetch.js +1 -1
  142. package/dist/utils/debugFilter.js +3 -3
  143. package/dist/utils/debugFilter.js.map +1 -1
  144. package/dist/utils/fileLogger.js +4 -3
  145. package/dist/utils/fileLogger.js.map +1 -1
  146. package/dist/utils/format.d.ts +7 -1
  147. package/dist/utils/format.js +21 -1
  148. package/dist/utils/format.js.map +1 -1
  149. package/dist/utils/logger.js +17 -27
  150. package/dist/utils/logger.js.map +1 -1
  151. package/dist/utils/morganStream.js +2 -2
  152. package/dist/utils/morganStream.js.map +1 -1
  153. package/dist/utils/platform.js +3 -2
  154. package/dist/utils/platform.js.map +1 -1
  155. package/dist/utils/streamContext.d.ts +7 -0
  156. package/dist/utils/streamContext.js +10 -1
  157. package/dist/utils/streamContext.js.map +1 -1
  158. package/dist/utils/version.js +4 -4
  159. package/dist/utils/version.js.map +1 -1
  160. package/package.json +5 -7
  161. package/dist/config/providerPacks.d.ts +0 -46
  162. package/dist/config/providerPacks.js.map +0 -1
  163. package/dist/config/providers.d.ts +0 -175
  164. package/dist/config/providers.js.map +0 -1
  165. package/dist/routes/config/providers.js.map +0 -1
  166. package/dist/routes/providers.d.ts +0 -6
  167. package/dist/routes/providers.js.map +0 -1
  168. /package/dist/routes/config/{providers.d.ts → services.d.ts} +0 -0
@@ -1,33 +1,33 @@
1
- // Channel identity fields — metadata that describes the channel itself, independent of which provider serves it. This is the single source of truth for the
2
- // identity/provider-specific field separation used by: (1) applyVariantInheritance in providers.ts (identity fields always come from the canonical),
1
+ // Channel identity fields — metadata that describes the channel itself, independent of which service serves it. This is the single source of truth for the
2
+ // identity/service-specific field separation used by: (1) applyVariantInheritance in services.ts (identity fields always come from the canonical),
3
3
  // (2) startup migration in userChannels.ts (strips legacy identity fields from variant entries), and (3) DELTA_ALLOWED_FIELDS derivation (identity +
4
- // provider-specific editable fields). Adding a new identity field here automatically propagates to all three consumers.
5
- export const CHANNEL_IDENTITY_FIELDS = new Set(["channelNumber", "hdhrEnabled", "name", "stationId", "tags", "tvgShift"]);
4
+ // service-specific editable fields). Adding a new identity field here automatically propagates to all three consumers.
5
+ export const CHANNEL_IDENTITY_FIELDS = new Set(["channelNumber", "guideTitle", "hdhrEnabled", "logoUrl", "name", "stationId", "tags", "tvgShift"]);
6
6
  // Predefined tag vocabulary. These tags ship with PrismCast and are assigned to predefined channel definitions below. Users can delete predefined tags from
7
7
  // their registry (they're tracked in channels.json deletedTags) and create their own tags. The runtime vocabulary is: (PREDEFINED_TAGS - deletedTags) + userTags.
8
- export const PREDEFINED_TAGS = ["documentary", "entertainment", "hbo", "kids", "lifestyle", "local", "movies", "news", "showtime", "sports", "starz"];
9
- // Site provider key. When a channel has its own streaming website, this key is used in the providers map. The site provider always wins as canonical.
8
+ export const PREDEFINED_TAGS = ["Documentary", "Entertainment", "HBO", "Kids", "Lifestyle", "Local", "Movies", "News", "Showtime", "Sports", "Starz"];
9
+ // Site service key. When a channel has its own streaming website, this key is used in the services map. The site service always wins as canonical.
10
10
  const SITE_KEY = "site";
11
- /* Nested channel definitions. Each entry maps a channel key to a ChannelDefinition with identity fields (name, stationId) and a providers map keyed by provider
12
- * slug. The "site" key represents the channel's own streaming website. All other keys are multi-provider platform slugs (cox, directv, hulu, sling, spectrum,
11
+ /* Nested channel definitions. Each entry maps a channel key to a ChannelDefinition with identity fields (name, stationId) and a services map keyed by service
12
+ * slug. The "site" key represents the channel's own streaming website. All other keys are multi-service platform slugs (cox, directv, hulu, sling, spectrum,
13
13
  * xfinity, yttv, foxone, paramountplus).
14
14
  *
15
15
  * At module load, the flattener compiles these nested definitions into the flat ChannelMap consumed by the rest of the codebase. Each variant entry gets
16
- * canonicalKey set to its parent definition's key, which buildProviderGroups in providers.ts uses to assemble provider groups.
16
+ * canonicalKey set to its parent definition's key, which buildServiceGroups in services.ts uses to assemble service groups.
17
17
  *
18
18
  * Canonical resolution rules:
19
- * 1. If "site" exists in providers, the canonical always gets the site URL.
20
- * 2. Otherwise, the provider whose key sorts first alphabetically (computed, not source-order) becomes canonical.
19
+ * 1. If "site" exists in services, the canonical always gets the site URL.
20
+ * 2. Otherwise, the service whose key sorts first alphabetically (computed, not source-order) becomes canonical.
21
21
  *
22
- * Adding a new provider never changes canonicals unless a "site" entry is introduced.
22
+ * Adding a new service never changes canonicals unless a "site" entry is introduced.
23
23
  *
24
24
  * Pacific timezone support:
25
25
  * - pacificStationId on an East ChannelDefinition triggers auto-generation of a Pacific sibling.
26
26
  * - Manual Pacific definitions (keys ending in "p") can pre-declare overrides (e.g., West-specific channelSelectors).
27
- * - Pacific generation merges inherited providers from the East definition into the Pacific definition, skipping providers whose channelSelector contains
28
- * "East" or "West" and never overwriting existing Pacific providers. See generatePacificDefinitions() for full rules.
27
+ * - Pacific generation merges inherited services from the East definition into the Pacific definition, skipping services whose channelSelector contains
28
+ * "East" or "West" and never overwriting existing Pacific services. See generatePacificDefinitions() for full rules.
29
29
  *
30
- * FAST channels: This list contains only traditional linear TV networks and public broadcasters — no FAST (Free Ad-Supported Streaming Television) channels.
30
+ * FAST channels: This list contains only traditional linear TV networks and public broadcasters - no FAST (Free Ad-Supported Streaming Television) channels.
31
31
  * FAST channels from platforms like Pluto TV or Tubi should not be added here. Users who want FAST content can add them as user-defined channels through the
32
32
  * web UI or user channels file, or preferably use dedicated high-quality integrations such as Plex Channels, Pluto for Channels, or Tubi for Channels.
33
33
  */
@@ -35,8 +35,8 @@ const SITE_KEY = "site";
35
35
  const BASE_CHANNEL_DEFINITIONS = {
36
36
  abc: {
37
37
  name: "ABC",
38
- tags: ["local"],
39
- providers: {
38
+ tags: ["Local"],
39
+ services: {
40
40
  cox: { channelSelector: "ABC", url: "https://watchtv.cox.com/listings" },
41
41
  directv: { channelSelector: "ABC", url: "https://stream.directv.com" },
42
42
  hulu: { channelSelector: "ABC", url: "https://www.hulu.com/live" },
@@ -49,9 +49,9 @@ const BASE_CHANNEL_DEFINITIONS = {
49
49
  },
50
50
  abcnews: {
51
51
  name: "ABC News Live",
52
- tags: ["news"],
52
+ tags: ["News"],
53
53
  stationId: "113380",
54
- providers: {
54
+ services: {
55
55
  cox: { channelSelector: "ABCNL", url: "https://watchtv.cox.com/listings" },
56
56
  directv: { channelSelector: "ABC News Live", url: "https://stream.directv.com" },
57
57
  hulu: { channelSelector: "ABC News Live", url: "https://www.hulu.com/live" },
@@ -62,10 +62,10 @@ const BASE_CHANNEL_DEFINITIONS = {
62
62
  },
63
63
  ae: {
64
64
  name: "A&E",
65
- tags: ["documentary", "entertainment"],
65
+ tags: ["Documentary", "Entertainment"],
66
66
  pacificStationId: "57439",
67
67
  stationId: "51529",
68
- providers: {
68
+ services: {
69
69
  cox: { channelSelector: "A&E", url: "https://watchtv.cox.com/listings" },
70
70
  directv: { channelSelector: "A&E", url: "https://stream.directv.com" },
71
71
  hulu: { channelSelector: "A&E", url: "https://www.hulu.com/live" },
@@ -78,9 +78,9 @@ const BASE_CHANNEL_DEFINITIONS = {
78
78
  },
79
79
  ahc: {
80
80
  name: "American Heroes",
81
- tags: ["documentary"],
81
+ tags: ["Documentary"],
82
82
  stationId: "78808",
83
- providers: {
83
+ services: {
84
84
  cox: { channelSelector: "American Heroes", url: "https://watchtv.cox.com/listings" },
85
85
  site: { url: "https://watch.foodnetwork.com/channel/ahc" },
86
86
  spectrum: { channelSelector: "American Heroes Channel", url: "https://watch.spectrum.net/guide" },
@@ -89,10 +89,10 @@ const BASE_CHANNEL_DEFINITIONS = {
89
89
  },
90
90
  amc: {
91
91
  name: "AMC",
92
- tags: ["entertainment", "movies"],
92
+ tags: ["Entertainment", "Movies"],
93
93
  pacificStationId: "78836",
94
94
  stationId: "59337",
95
- providers: {
95
+ services: {
96
96
  cox: { channelSelector: "AMC", url: "https://watchtv.cox.com/listings" },
97
97
  directv: { channelSelector: "AMC", url: "https://stream.directv.com" },
98
98
  sling: { channelSelector: "AMC", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -103,19 +103,19 @@ const BASE_CHANNEL_DEFINITIONS = {
103
103
  },
104
104
  amcthrillers: {
105
105
  name: "AMC Thrillers",
106
- tags: ["entertainment", "movies"],
106
+ tags: ["Entertainment", "Movies"],
107
107
  stationId: "115678",
108
- providers: {
108
+ services: {
109
109
  sling: { channelSelector: "AMC Thrillers", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
110
110
  yttv: { channelSelector: "AMC Thrillers", url: "https://tv.youtube.com/live" },
111
111
  },
112
112
  },
113
113
  animal: {
114
114
  name: "Animal Planet",
115
- tags: ["documentary"],
115
+ tags: ["Documentary"],
116
116
  pacificStationId: "68785",
117
117
  stationId: "57394",
118
- providers: {
118
+ services: {
119
119
  cox: { channelSelector: "Animal Planet", url: "https://watchtv.cox.com/listings" },
120
120
  directv: { channelSelector: "Animal Planet", url: "https://stream.directv.com" },
121
121
  hulu: { channelSelector: "Animal Planet", url: "https://www.hulu.com/live" },
@@ -127,9 +127,9 @@ const BASE_CHANNEL_DEFINITIONS = {
127
127
  },
128
128
  axstv: {
129
129
  name: "AXS TV",
130
- tags: ["entertainment", "sports"],
130
+ tags: ["Entertainment", "Sports"],
131
131
  stationId: "28506",
132
- providers: {
132
+ services: {
133
133
  cox: { channelSelector: "AXS TV", url: "https://watchtv.cox.com/listings" },
134
134
  directv: { channelSelector: "AXS TV", url: "https://stream.directv.com" },
135
135
  spectrum: { channelSelector: "AXS TV", url: "https://watch.spectrum.net/guide" },
@@ -138,10 +138,10 @@ const BASE_CHANNEL_DEFINITIONS = {
138
138
  },
139
139
  bbcamerica: {
140
140
  name: "BBC America",
141
- tags: ["entertainment"],
141
+ tags: ["Entertainment"],
142
142
  pacificStationId: "76739",
143
143
  stationId: "64492",
144
- providers: {
144
+ services: {
145
145
  cox: { channelSelector: "BBC America", url: "https://watchtv.cox.com/listings" },
146
146
  directv: { channelSelector: "BBC America", url: "https://stream.directv.com" },
147
147
  sling: { channelSelector: "BBC America", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -152,9 +152,9 @@ const BASE_CHANNEL_DEFINITIONS = {
152
152
  },
153
153
  bbcnews: {
154
154
  name: "BBC News (North America)",
155
- tags: ["news"],
155
+ tags: ["News"],
156
156
  stationId: "101449",
157
- providers: {
157
+ services: {
158
158
  cox: { channelSelector: "BBC News", url: "https://watchtv.cox.com/listings" },
159
159
  directv: { channelSelector: "BBC News", url: "https://stream.directv.com" },
160
160
  sling: { channelSelector: "BBC News", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -165,10 +165,10 @@ const BASE_CHANNEL_DEFINITIONS = {
165
165
  },
166
166
  bet: {
167
167
  name: "BET",
168
- tags: ["entertainment"],
168
+ tags: ["Entertainment"],
169
169
  pacificStationId: "64673",
170
170
  stationId: "63236",
171
- providers: {
171
+ services: {
172
172
  cox: { channelSelector: "BET", url: "https://watchtv.cox.com/listings" },
173
173
  directv: { channelSelector: "BET", url: "https://stream.directv.com" },
174
174
  hulu: { channelSelector: "BET", url: "https://www.hulu.com/live" },
@@ -181,10 +181,10 @@ const BASE_CHANNEL_DEFINITIONS = {
181
181
  },
182
182
  bether: {
183
183
  name: "BET Her",
184
- tags: ["entertainment"],
184
+ tags: ["Entertainment"],
185
185
  pacificStationId: "97360",
186
186
  stationId: "63220",
187
- providers: {
187
+ services: {
188
188
  cox: { channelSelector: "BET Her", url: "https://watchtv.cox.com/listings" },
189
189
  directv: { channelSelector: "BET Her", url: "https://stream.directv.com" },
190
190
  spectrum: { channelSelector: "BET Her", url: "https://watch.spectrum.net/guide" },
@@ -194,9 +194,9 @@ const BASE_CHANNEL_DEFINITIONS = {
194
194
  },
195
195
  bigten: {
196
196
  name: "Big 10",
197
- tags: ["sports"],
197
+ tags: ["Sports"],
198
198
  stationId: "58321",
199
- providers: {
199
+ services: {
200
200
  cox: { channelSelector: "Big Ten Network", url: "https://watchtv.cox.com/listings" },
201
201
  directv: { channelSelector: "Big Ten", url: "https://stream.directv.com" },
202
202
  foxone: { channelSelector: "BTN", url: "https://www.fox.com/live/channels" },
@@ -209,9 +209,9 @@ const BASE_CHANNEL_DEFINITIONS = {
209
209
  },
210
210
  bloomberg: {
211
211
  name: "Bloomberg Television",
212
- tags: ["news"],
212
+ tags: ["News"],
213
213
  stationId: "71799",
214
- providers: {
214
+ services: {
215
215
  cox: { channelSelector: "Bloomberg", url: "https://watchtv.cox.com/listings" },
216
216
  directv: { channelSelector: "Bloomberg TV", url: "https://stream.directv.com" },
217
217
  hulu: { channelSelector: "Bloomberg Television", url: "https://www.hulu.com/live" },
@@ -223,17 +223,17 @@ const BASE_CHANNEL_DEFINITIONS = {
223
223
  },
224
224
  bloombergoriginals: {
225
225
  name: "Bloomberg Originals",
226
- tags: ["news"],
226
+ tags: ["News"],
227
227
  stationId: "175656",
228
- providers: {
228
+ services: {
229
229
  yttv: { channelSelector: "Bloomberg Originals", url: "https://tv.youtube.com/live" },
230
230
  },
231
231
  },
232
232
  bravo: {
233
233
  name: "Bravo",
234
- tags: ["entertainment"],
234
+ tags: ["Entertainment"],
235
235
  stationId: "58625",
236
- providers: {
236
+ services: {
237
237
  cox: { channelSelector: "Bravo", url: "https://watchtv.cox.com/listings" },
238
238
  directv: { channelSelector: "Bravo", url: "https://stream.directv.com" },
239
239
  hulu: { channelSelector: "Bravo", url: "https://www.hulu.com/live" },
@@ -246,18 +246,18 @@ const BASE_CHANNEL_DEFINITIONS = {
246
246
  },
247
247
  bravop: {
248
248
  name: "Bravo (Pacific)",
249
- tags: ["entertainment"],
249
+ tags: ["Entertainment"],
250
250
  stationId: "73994",
251
- providers: {
251
+ services: {
252
252
  site: { url: "https://www.nbc.com/live?brand=bravo&callsign=bravo_west" },
253
253
  },
254
254
  },
255
255
  cartoon: {
256
256
  name: "Cartoon Network",
257
- tags: ["kids"],
257
+ tags: ["Kids"],
258
258
  pacificStationId: "67703",
259
259
  stationId: "60048",
260
- providers: {
260
+ services: {
261
261
  cox: { channelSelector: "Cartoon Network", url: "https://watchtv.cox.com/listings" },
262
262
  directv: { channelSelector: "Cartoon Network", url: "https://stream.directv.com" },
263
263
  hulu: { channelSelector: "Cartoon Network (East)", url: "https://www.hulu.com/live" },
@@ -268,16 +268,16 @@ const BASE_CHANNEL_DEFINITIONS = {
268
268
  },
269
269
  cartoonp: {
270
270
  name: "Cartoon Network (Pacific)",
271
- tags: ["kids"],
271
+ tags: ["Kids"],
272
272
  stationId: "67703",
273
- providers: {
273
+ services: {
274
274
  hulu: { channelSelector: "Cartoon Network (West)", url: "https://www.hulu.com/live" },
275
275
  },
276
276
  },
277
277
  cbs: {
278
278
  name: "CBS",
279
- tags: ["local"],
280
- providers: {
279
+ tags: ["Local"],
280
+ services: {
281
281
  cox: { channelSelector: "CBS", url: "https://watchtv.cox.com/listings" },
282
282
  directv: { channelSelector: "CBS", url: "https://stream.directv.com" },
283
283
  hulu: { channelSelector: "CBS", url: "https://www.hulu.com/live" },
@@ -290,18 +290,18 @@ const BASE_CHANNEL_DEFINITIONS = {
290
290
  },
291
291
  cbsnews: {
292
292
  name: "CBS News 24/7",
293
- tags: ["news"],
293
+ tags: ["News"],
294
294
  stationId: "104846",
295
- providers: {
295
+ services: {
296
296
  hulu: { channelSelector: "CBS News 24/7", url: "https://www.hulu.com/live" },
297
297
  sling: { channelSelector: "CBS News 24/7", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
298
298
  },
299
299
  },
300
300
  cbssports: {
301
301
  name: "CBS Sports Network",
302
- tags: ["sports"],
302
+ tags: ["Sports"],
303
303
  stationId: "59250",
304
- providers: {
304
+ services: {
305
305
  cox: { channelSelector: "CBS Sports Network", url: "https://watchtv.cox.com/listings" },
306
306
  hulu: { channelSelector: "CBS Sports Network", url: "https://www.hulu.com/live" },
307
307
  spectrum: { channelSelector: "CBS Sports Network", url: "https://watch.spectrum.net/guide" },
@@ -311,10 +311,10 @@ const BASE_CHANNEL_DEFINITIONS = {
311
311
  },
312
312
  cmt: {
313
313
  name: "CMT",
314
- tags: ["entertainment"],
314
+ tags: ["Entertainment"],
315
315
  pacificStationId: "64610",
316
316
  stationId: "59440",
317
- providers: {
317
+ services: {
318
318
  cox: { channelSelector: "CMT", url: "https://watchtv.cox.com/listings" },
319
319
  directv: { channelSelector: "CMT", url: "https://stream.directv.com" },
320
320
  hulu: { channelSelector: "CMT", url: "https://www.hulu.com/live" },
@@ -325,9 +325,9 @@ const BASE_CHANNEL_DEFINITIONS = {
325
325
  },
326
326
  cnbc: {
327
327
  name: "CNBC",
328
- tags: ["news"],
328
+ tags: ["News"],
329
329
  stationId: "58780",
330
- providers: {
330
+ services: {
331
331
  cox: { channelSelector: "CNBC", url: "https://watchtv.cox.com/listings" },
332
332
  directv: { channelSelector: "CNBC", url: "https://stream.directv.com" },
333
333
  hulu: { channelSelector: "CNBC", url: "https://www.hulu.com/live" },
@@ -340,18 +340,18 @@ const BASE_CHANNEL_DEFINITIONS = {
340
340
  },
341
341
  cnbcworld: {
342
342
  name: "CNBC World",
343
- tags: ["news"],
343
+ tags: ["News"],
344
344
  stationId: "26849",
345
- providers: {
345
+ services: {
346
346
  directv: { channelSelector: "CNBC World", url: "https://stream.directv.com" },
347
347
  spectrum: { channelSelector: "CNBC World", url: "https://watch.spectrum.net/guide" },
348
348
  },
349
349
  },
350
350
  cnn: {
351
351
  name: "CNN",
352
- tags: ["news"],
352
+ tags: ["News"],
353
353
  stationId: "58646",
354
- providers: {
354
+ services: {
355
355
  cox: { channelSelector: "CNN", url: "https://watchtv.cox.com/listings" },
356
356
  directv: { channelSelector: "CNN", url: "https://stream.directv.com" },
357
357
  hulu: { channelSelector: "CNN", url: "https://www.hulu.com/live" },
@@ -364,9 +364,9 @@ const BASE_CHANNEL_DEFINITIONS = {
364
364
  },
365
365
  cnni: {
366
366
  name: "CNN International",
367
- tags: ["news"],
367
+ tags: ["News"],
368
368
  stationId: "83110",
369
- providers: {
369
+ services: {
370
370
  directv: { channelSelector: "CNNi HD East", url: "https://stream.directv.com" },
371
371
  hulu: { channelSelector: "CNN International", url: "https://www.hulu.com/live" },
372
372
  site: { url: "https://www.cnn.com/videos/cnn-i" },
@@ -375,10 +375,10 @@ const BASE_CHANNEL_DEFINITIONS = {
375
375
  },
376
376
  comedycentral: {
377
377
  name: "Comedy Central",
378
- tags: ["entertainment"],
378
+ tags: ["Entertainment"],
379
379
  pacificStationId: "64599",
380
380
  stationId: "62420",
381
- providers: {
381
+ services: {
382
382
  cox: { channelSelector: "Comedy Central", url: "https://watchtv.cox.com/listings" },
383
383
  directv: { channelSelector: "Comedy Central", url: "https://stream.directv.com" },
384
384
  hulu: { channelSelector: "Comedy Central", url: "https://www.hulu.com/live" },
@@ -390,9 +390,9 @@ const BASE_CHANNEL_DEFINITIONS = {
390
390
  },
391
391
  cooking: {
392
392
  name: "Cooking",
393
- tags: ["lifestyle"],
393
+ tags: ["Lifestyle"],
394
394
  stationId: "68065",
395
- providers: {
395
+ services: {
396
396
  cox: { channelSelector: "Cooking Channel", url: "https://watchtv.cox.com/listings" },
397
397
  directv: { channelSelector: "Cooking Channel", url: "https://stream.directv.com" },
398
398
  site: { url: "https://watch.foodnetwork.com/channel/cooking-channel" },
@@ -402,9 +402,9 @@ const BASE_CHANNEL_DEFINITIONS = {
402
402
  },
403
403
  cspan: {
404
404
  name: "C-SPAN",
405
- tags: ["news"],
405
+ tags: ["News"],
406
406
  stationId: "68344",
407
- providers: {
407
+ services: {
408
408
  cox: { channelSelector: "C-SPAN", url: "https://watchtv.cox.com/listings" },
409
409
  directv: { channelSelector: "C-SPAN", url: "https://stream.directv.com" },
410
410
  hulu: { channelSelector: "C-SPAN", url: "https://www.hulu.com/live" },
@@ -416,9 +416,9 @@ const BASE_CHANNEL_DEFINITIONS = {
416
416
  },
417
417
  cspan2: {
418
418
  name: "C-SPAN 2",
419
- tags: ["news"],
419
+ tags: ["News"],
420
420
  stationId: "68334",
421
- providers: {
421
+ services: {
422
422
  cox: { channelSelector: "CPN2D", url: "https://watchtv.cox.com/listings" },
423
423
  directv: { channelSelector: "C-SPAN2", url: "https://stream.directv.com" },
424
424
  hulu: { channelSelector: "C-SPAN2", url: "https://www.hulu.com/live" },
@@ -430,9 +430,9 @@ const BASE_CHANNEL_DEFINITIONS = {
430
430
  },
431
431
  cspan3: {
432
432
  name: "C-SPAN 3",
433
- tags: ["news"],
433
+ tags: ["News"],
434
434
  stationId: "68332",
435
- providers: {
435
+ services: {
436
436
  cox: { channelSelector: "CPN3H", url: "https://watchtv.cox.com/listings" },
437
437
  hulu: { channelSelector: "C-SPAN3", url: "https://www.hulu.com/live" },
438
438
  site: { url: "https://www.c-span.org/networks/?autoplay=true&channel=c-span-3" },
@@ -443,8 +443,8 @@ const BASE_CHANNEL_DEFINITIONS = {
443
443
  },
444
444
  cw: {
445
445
  name: "CW",
446
- tags: ["local"],
447
- providers: {
446
+ tags: ["Local"],
447
+ services: {
448
448
  cox: { channelSelector: "CW TV", url: "https://watchtv.cox.com/listings" },
449
449
  directv: { channelSelector: "CW", url: "https://stream.directv.com" },
450
450
  hulu: { channelSelector: "CW", url: "https://www.hulu.com/live" },
@@ -455,9 +455,9 @@ const BASE_CHANNEL_DEFINITIONS = {
455
455
  },
456
456
  destinationamerica: {
457
457
  name: "Destination America",
458
- tags: ["documentary"],
458
+ tags: ["Documentary"],
459
459
  stationId: "60468",
460
- providers: {
460
+ services: {
461
461
  cox: { channelSelector: "Destination America", url: "https://watchtv.cox.com/listings" },
462
462
  directv: { channelSelector: "Destination America HD", url: "https://stream.directv.com" },
463
463
  site: { url: "https://watch.foodnetwork.com/channel/destination-america" },
@@ -467,10 +467,10 @@ const BASE_CHANNEL_DEFINITIONS = {
467
467
  },
468
468
  discovery: {
469
469
  name: "Discovery",
470
- tags: ["documentary"],
470
+ tags: ["Documentary"],
471
471
  pacificStationId: "80399",
472
472
  stationId: "56905",
473
- providers: {
473
+ services: {
474
474
  cox: { channelSelector: "Discovery Channel", url: "https://watchtv.cox.com/listings" },
475
475
  directv: { channelSelector: "Discovery", url: "https://stream.directv.com" },
476
476
  hulu: { channelSelector: "Discovery", url: "https://www.hulu.com/live" },
@@ -483,9 +483,9 @@ const BASE_CHANNEL_DEFINITIONS = {
483
483
  },
484
484
  discoverylife: {
485
485
  name: "Discovery Life",
486
- tags: ["documentary"],
486
+ tags: ["Documentary"],
487
487
  stationId: "92204",
488
- providers: {
488
+ services: {
489
489
  cox: { channelSelector: "Discovery Life", url: "https://watchtv.cox.com/listings" },
490
490
  directv: { channelSelector: "Discovery Life", url: "https://stream.directv.com" },
491
491
  site: { url: "https://watch.foodnetwork.com/channel/discovery-life" },
@@ -495,9 +495,9 @@ const BASE_CHANNEL_DEFINITIONS = {
495
495
  },
496
496
  discoveryturbo: {
497
497
  name: "Discovery Turbo",
498
- tags: ["documentary"],
498
+ tags: ["Documentary"],
499
499
  stationId: "31046",
500
- providers: {
500
+ services: {
501
501
  cox: { channelSelector: "Discovery Turbo", url: "https://watchtv.cox.com/listings" },
502
502
  directv: { channelSelector: "Discovery Turbo", url: "https://stream.directv.com" },
503
503
  hulu: { channelSelector: "Discovery Turbo", url: "https://www.hulu.com/live" },
@@ -510,10 +510,10 @@ const BASE_CHANNEL_DEFINITIONS = {
510
510
  },
511
511
  disney: {
512
512
  name: "Disney",
513
- tags: ["kids"],
513
+ tags: ["Kids"],
514
514
  pacificStationId: "63320",
515
515
  stationId: "59684",
516
- providers: {
516
+ services: {
517
517
  cox: { channelSelector: "Disney Channel", url: "https://watchtv.cox.com/listings" },
518
518
  directv: { channelSelector: "Disney Channel", url: "https://stream.directv.com" },
519
519
  hulu: { channelSelector: "Disney Channel", url: "https://www.hulu.com/live" },
@@ -526,10 +526,10 @@ const BASE_CHANNEL_DEFINITIONS = {
526
526
  },
527
527
  disneyjr: {
528
528
  name: "Disney Jr.",
529
- tags: ["kids"],
529
+ tags: ["Kids"],
530
530
  pacificStationId: "75004",
531
531
  stationId: "74885",
532
- providers: {
532
+ services: {
533
533
  cox: { channelSelector: "Disney Jr.", url: "https://watchtv.cox.com/listings" },
534
534
  directv: { channelSelector: "Disney Junior", url: "https://stream.directv.com" },
535
535
  hulu: { channelSelector: "Disney Junior", url: "https://www.hulu.com/live" },
@@ -541,10 +541,10 @@ const BASE_CHANNEL_DEFINITIONS = {
541
541
  },
542
542
  disneyxd: {
543
543
  name: "Disney XD",
544
- tags: ["kids"],
544
+ tags: ["Kids"],
545
545
  pacificStationId: "63322",
546
546
  stationId: "60006",
547
- providers: {
547
+ services: {
548
548
  cox: { channelSelector: "Disney XD", url: "https://watchtv.cox.com/listings" },
549
549
  hulu: { channelSelector: "Disney XD", url: "https://www.hulu.com/live" },
550
550
  site: { url: "https://disneynow.com/watch-live?brand=009" },
@@ -555,9 +555,9 @@ const BASE_CHANNEL_DEFINITIONS = {
555
555
  },
556
556
  e: {
557
557
  name: "E!",
558
- tags: ["entertainment"],
558
+ tags: ["Entertainment"],
559
559
  stationId: "61812",
560
- providers: {
560
+ services: {
561
561
  cox: { channelSelector: "E!", url: "https://watchtv.cox.com/listings" },
562
562
  directv: { channelSelector: "E!", url: "https://stream.directv.com" },
563
563
  hulu: { channelSelector: "E!", url: "https://www.hulu.com/live" },
@@ -570,17 +570,17 @@ const BASE_CHANNEL_DEFINITIONS = {
570
570
  },
571
571
  ep: {
572
572
  name: "E! (Pacific)",
573
- tags: ["entertainment"],
573
+ tags: ["Entertainment"],
574
574
  stationId: "91579",
575
- providers: {
575
+ services: {
576
576
  site: { channelSelector: "E-_West", url: "https://www.usanetwork.com/live" },
577
577
  },
578
578
  },
579
579
  espn: {
580
580
  name: "ESPN",
581
- tags: ["sports"],
581
+ tags: ["Sports"],
582
582
  stationId: "32645",
583
- providers: {
583
+ services: {
584
584
  cox: { channelSelector: "ESPN", url: "https://watchtv.cox.com/listings" },
585
585
  directv: { channelSelector: "ESPN", url: "https://stream.directv.com" },
586
586
  disneyplus: { channelSelector: "poster_linear_espn_none", url: "https://www.disneyplus.com/browse/live" },
@@ -594,9 +594,9 @@ const BASE_CHANNEL_DEFINITIONS = {
594
594
  },
595
595
  espn2: {
596
596
  name: "ESPN2",
597
- tags: ["sports"],
597
+ tags: ["Sports"],
598
598
  stationId: "45507",
599
- providers: {
599
+ services: {
600
600
  cox: { channelSelector: "ES2HD", url: "https://watchtv.cox.com/listings" },
601
601
  directv: { channelSelector: "ESPN2", url: "https://stream.directv.com" },
602
602
  disneyplus: { channelSelector: "poster_linear_espn2_none", url: "https://www.disneyplus.com/browse/live" },
@@ -610,9 +610,9 @@ const BASE_CHANNEL_DEFINITIONS = {
610
610
  },
611
611
  espnacc: {
612
612
  name: "ACC Network",
613
- tags: ["sports"],
613
+ tags: ["Sports"],
614
614
  stationId: "111871",
615
- providers: {
615
+ services: {
616
616
  cox: { channelSelector: "ACC Network", url: "https://watchtv.cox.com/listings" },
617
617
  directv: { channelSelector: "ACC Network", url: "https://stream.directv.com" },
618
618
  disneyplus: { channelSelector: "poster_linear_acc-network_none", url: "https://www.disneyplus.com/browse/live" },
@@ -625,9 +625,9 @@ const BASE_CHANNEL_DEFINITIONS = {
625
625
  },
626
626
  espndeportes: {
627
627
  name: "ESPN Deportes",
628
- tags: ["sports"],
628
+ tags: ["Sports"],
629
629
  stationId: "71914",
630
- providers: {
630
+ services: {
631
631
  cox: { channelSelector: "ESPN Deportes", url: "https://watchtv.cox.com/listings" },
632
632
  disneyplus: { channelSelector: "poster_linear_espn-deportes_none", url: "https://www.disneyplus.com/browse/live" },
633
633
  site: { url: "https://www.espn.com/watch/player?network=espndeportes" },
@@ -638,9 +638,9 @@ const BASE_CHANNEL_DEFINITIONS = {
638
638
  },
639
639
  espnews: {
640
640
  name: "ESPNews",
641
- tags: ["sports"],
641
+ tags: ["Sports"],
642
642
  stationId: "59976",
643
- providers: {
643
+ services: {
644
644
  cox: { channelSelector: "ESWHD", url: "https://watchtv.cox.com/listings" },
645
645
  directv: { channelSelector: "ESPNews", url: "https://stream.directv.com" },
646
646
  disneyplus: { channelSelector: "poster_linear_espnews_none", url: "https://www.disneyplus.com/browse/live" },
@@ -653,9 +653,9 @@ const BASE_CHANNEL_DEFINITIONS = {
653
653
  },
654
654
  espnsec: {
655
655
  name: "SEC Network",
656
- tags: ["sports"],
656
+ tags: ["Sports"],
657
657
  stationId: "89714",
658
- providers: {
658
+ services: {
659
659
  cox: { channelSelector: "SEC", url: "https://watchtv.cox.com/listings" },
660
660
  directv: { channelSelector: "SEC Network", url: "https://stream.directv.com" },
661
661
  disneyplus: { channelSelector: "poster_linear_sec-network_none", url: "https://www.disneyplus.com/browse/live" },
@@ -668,9 +668,9 @@ const BASE_CHANNEL_DEFINITIONS = {
668
668
  },
669
669
  espnu: {
670
670
  name: "ESPNU",
671
- tags: ["sports"],
671
+ tags: ["Sports"],
672
672
  stationId: "60696",
673
- providers: {
673
+ services: {
674
674
  cox: { channelSelector: "ESPNU", url: "https://watchtv.cox.com/listings" },
675
675
  directv: { channelSelector: "ESPNU", url: "https://stream.directv.com" },
676
676
  disneyplus: { channelSelector: "poster_linear_espnu_none", url: "https://www.disneyplus.com/browse/live" },
@@ -683,9 +683,9 @@ const BASE_CHANNEL_DEFINITIONS = {
683
683
  },
684
684
  fbc: {
685
685
  name: "Fox Business",
686
- tags: ["news"],
686
+ tags: ["News"],
687
687
  stationId: "58718",
688
- providers: {
688
+ services: {
689
689
  cox: { channelSelector: "Fox Business", url: "https://watchtv.cox.com/listings" },
690
690
  directv: { channelSelector: "Fox Business Network", url: "https://stream.directv.com" },
691
691
  foxone: { channelSelector: "FBN", url: "https://www.fox.com/live/channels" },
@@ -698,9 +698,9 @@ const BASE_CHANNEL_DEFINITIONS = {
698
698
  },
699
699
  fnc: {
700
700
  name: "Fox News",
701
- tags: ["news"],
701
+ tags: ["News"],
702
702
  stationId: "60179",
703
- providers: {
703
+ services: {
704
704
  cox: { channelSelector: "Fox News", url: "https://watchtv.cox.com/listings" },
705
705
  directv: { channelSelector: "Fox News Channel", url: "https://stream.directv.com" },
706
706
  foxone: { channelSelector: "FNC", url: "https://www.fox.com/live/channels" },
@@ -714,10 +714,10 @@ const BASE_CHANNEL_DEFINITIONS = {
714
714
  },
715
715
  food: {
716
716
  name: "Food Network",
717
- tags: ["lifestyle"],
717
+ tags: ["Lifestyle"],
718
718
  pacificStationId: "82119",
719
719
  stationId: "50747",
720
- providers: {
720
+ services: {
721
721
  cox: { channelSelector: "Food Network", url: "https://watchtv.cox.com/listings" },
722
722
  directv: { channelSelector: "Food Network", url: "https://stream.directv.com" },
723
723
  hulu: { channelSelector: "Food Network", url: "https://www.hulu.com/live" },
@@ -730,12 +730,12 @@ const BASE_CHANNEL_DEFINITIONS = {
730
730
  },
731
731
  fox: {
732
732
  name: "Fox",
733
- tags: ["local"],
734
- providers: {
733
+ tags: ["Local"],
734
+ services: {
735
735
  cox: { channelSelector: "Fox", url: "https://watchtv.cox.com/listings" },
736
736
  directv: { channelSelector: "FOX", url: "https://stream.directv.com" },
737
+ foxone: { channelSelector: "FOXD2C", url: "https://www.fox.com/live/channels" },
737
738
  hulu: { channelSelector: "Fox", url: "https://www.hulu.com/live" },
738
- site: { channelSelector: "FOXD2C", url: "https://www.fox.com/live/channels" },
739
739
  sling: { channelSelector: "FOX", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
740
740
  spectrum: { channelSelector: "FOX", url: "https://watch.spectrum.net/guide" },
741
741
  xfinity: { channelSelector: "Fox", url: "https://www.xfinity.com/stream/listings" },
@@ -744,9 +744,9 @@ const BASE_CHANNEL_DEFINITIONS = {
744
744
  },
745
745
  foxdeportes: {
746
746
  name: "Fox Deportes",
747
- tags: ["sports"],
747
+ tags: ["Sports"],
748
748
  stationId: "72189",
749
- providers: {
749
+ services: {
750
750
  cox: { channelSelector: "Fox Deportes", url: "https://watchtv.cox.com/listings" },
751
751
  foxone: { channelSelector: "FOXD", url: "https://www.fox.com/live/channels" },
752
752
  site: { url: "https://www.foxsports.com/live/foxdep" },
@@ -757,36 +757,36 @@ const BASE_CHANNEL_DEFINITIONS = {
757
757
  },
758
758
  foxsoccerplus: {
759
759
  name: "Fox Soccer Plus",
760
- tags: ["sports"],
760
+ tags: ["Sports"],
761
761
  stationId: "66879",
762
- providers: {
762
+ services: {
763
763
  site: { url: "https://www.foxsports.com/live/fsp" },
764
764
  yttv: { channelSelector: "FOX Soccer Plus", url: "https://tv.youtube.com/live" },
765
765
  },
766
766
  },
767
767
  france24: {
768
768
  name: "France 24",
769
- tags: ["news"],
769
+ tags: ["News"],
770
770
  stationId: "60961",
771
- providers: {
771
+ services: {
772
772
  site: { url: "https://www.france24.com/en/live" },
773
773
  sling: { channelSelector: "France 24 (English)", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
774
774
  },
775
775
  },
776
776
  france24fr: {
777
777
  name: "France 24 (French)",
778
- tags: ["news"],
778
+ tags: ["News"],
779
779
  stationId: "58685",
780
- providers: {
780
+ services: {
781
781
  site: { url: "https://www.france24.com/fr/direct" },
782
782
  sling: { channelSelector: "France 24", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
783
783
  },
784
784
  },
785
785
  freeform: {
786
786
  name: "Freeform",
787
- tags: ["entertainment"],
787
+ tags: ["Entertainment"],
788
788
  stationId: "59615",
789
- providers: {
789
+ services: {
790
790
  cox: { channelSelector: "Freeform", url: "https://watchtv.cox.com/listings" },
791
791
  directv: { channelSelector: "Freeform HD", url: "https://stream.directv.com" },
792
792
  hulu: { channelSelector: "Freeform", url: "https://www.hulu.com/live" },
@@ -798,17 +798,17 @@ const BASE_CHANNEL_DEFINITIONS = {
798
798
  },
799
799
  freeformp: {
800
800
  name: "Freeform (Pacific)",
801
- tags: ["entertainment"],
801
+ tags: ["Entertainment"],
802
802
  stationId: "63324",
803
- providers: {
803
+ services: {
804
804
  site: { url: "https://www.freeform.com/watch-live/3507c750-e86a-4c0f-8ff4-dd23c4859009" },
805
805
  },
806
806
  },
807
807
  fs1: {
808
808
  name: "FS1",
809
- tags: ["sports"],
809
+ tags: ["Sports"],
810
810
  stationId: "82547",
811
- providers: {
811
+ services: {
812
812
  cox: { channelSelector: "FOX Sports 1", url: "https://watchtv.cox.com/listings" },
813
813
  directv: { channelSelector: "FOX Sports 1", url: "https://stream.directv.com" },
814
814
  foxone: { channelSelector: "FS1", url: "https://www.fox.com/live/channels" },
@@ -822,9 +822,9 @@ const BASE_CHANNEL_DEFINITIONS = {
822
822
  },
823
823
  fs2: {
824
824
  name: "FS2",
825
- tags: ["sports"],
825
+ tags: ["Sports"],
826
826
  stationId: "59305",
827
- providers: {
827
+ services: {
828
828
  cox: { channelSelector: "FOX Sports 2", url: "https://watchtv.cox.com/listings" },
829
829
  directv: { channelSelector: "FOX Sports 2", url: "https://stream.directv.com" },
830
830
  foxone: { channelSelector: "FS2", url: "https://www.fox.com/live/channels" },
@@ -837,9 +837,9 @@ const BASE_CHANNEL_DEFINITIONS = {
837
837
  },
838
838
  fx: {
839
839
  name: "FX",
840
- tags: ["entertainment"],
840
+ tags: ["Entertainment"],
841
841
  stationId: "58574",
842
- providers: {
842
+ services: {
843
843
  cox: { channelSelector: "FX", url: "https://watchtv.cox.com/listings" },
844
844
  directv: { channelSelector: "FX", url: "https://stream.directv.com" },
845
845
  hulu: { channelSelector: "FX", url: "https://www.hulu.com/live" },
@@ -852,10 +852,10 @@ const BASE_CHANNEL_DEFINITIONS = {
852
852
  },
853
853
  fxm: {
854
854
  name: "FXM",
855
- tags: ["movies"],
855
+ tags: ["Movies"],
856
856
  pacificStationId: "98488",
857
857
  stationId: "70253",
858
- providers: {
858
+ services: {
859
859
  cox: { channelSelector: "FXM", url: "https://watchtv.cox.com/listings" },
860
860
  directv: { channelSelector: "FX Movie Channel", url: "https://stream.directv.com" },
861
861
  hulu: { channelSelector: "FXM", url: "https://www.hulu.com/live" },
@@ -867,17 +867,17 @@ const BASE_CHANNEL_DEFINITIONS = {
867
867
  },
868
868
  fxp: {
869
869
  name: "FX (Pacific)",
870
- tags: ["entertainment"],
870
+ tags: ["Entertainment"],
871
871
  stationId: "59814",
872
- providers: {
872
+ services: {
873
873
  site: { url: "https://abc.com/watch-live/2cee3401-f63b-42d0-b32e-962fef610b9e" },
874
874
  },
875
875
  },
876
876
  fxx: {
877
877
  name: "FXX",
878
- tags: ["entertainment"],
878
+ tags: ["Entertainment"],
879
879
  stationId: "66379",
880
- providers: {
880
+ services: {
881
881
  cox: { channelSelector: "FXX", url: "https://watchtv.cox.com/listings" },
882
882
  directv: { channelSelector: "FXX", url: "https://stream.directv.com" },
883
883
  hulu: { channelSelector: "FXX", url: "https://www.hulu.com/live" },
@@ -889,18 +889,18 @@ const BASE_CHANNEL_DEFINITIONS = {
889
889
  },
890
890
  fxxp: {
891
891
  name: "FXX (Pacific)",
892
- tags: ["entertainment"],
892
+ tags: ["Entertainment"],
893
893
  stationId: "82571",
894
- providers: {
894
+ services: {
895
895
  site: { url: "https://abc.com/watch-live/e4c83395-62ed-4a49-829a-c55ab3c33e7d" },
896
896
  },
897
897
  },
898
898
  fyi: {
899
899
  name: "FYI",
900
- tags: ["entertainment"],
900
+ tags: ["Entertainment"],
901
901
  pacificStationId: "92372",
902
902
  stationId: "58988",
903
- providers: {
903
+ services: {
904
904
  cox: { channelSelector: "FYI", url: "https://watchtv.cox.com/listings" },
905
905
  directv: { channelSelector: "FYI", url: "https://stream.directv.com" },
906
906
  hulu: { channelSelector: "FYI", url: "https://www.hulu.com/live" },
@@ -911,10 +911,10 @@ const BASE_CHANNEL_DEFINITIONS = {
911
911
  },
912
912
  gameshow: {
913
913
  name: "Game Show Network",
914
- tags: ["entertainment"],
914
+ tags: ["Entertainment"],
915
915
  pacificStationId: "90210",
916
916
  stationId: "68827",
917
- providers: {
917
+ services: {
918
918
  cox: { channelSelector: "Game Show Network", url: "https://watchtv.cox.com/listings" },
919
919
  directv: { channelSelector: "GSN HD", url: "https://stream.directv.com" },
920
920
  hulu: { channelSelector: "Game Show Network", url: "https://www.hulu.com/live" },
@@ -925,9 +925,9 @@ const BASE_CHANNEL_DEFINITIONS = {
925
925
  },
926
926
  golf: {
927
927
  name: "Golf",
928
- tags: ["sports"],
928
+ tags: ["Sports"],
929
929
  stationId: "61854",
930
- providers: {
930
+ services: {
931
931
  cox: { channelSelector: "Golf Channel", url: "https://watchtv.cox.com/listings" },
932
932
  directv: { channelSelector: "Golf Channel", url: "https://stream.directv.com" },
933
933
  hulu: { channelSelector: "Golf Channel", url: "https://www.hulu.com/live" },
@@ -940,10 +940,10 @@ const BASE_CHANNEL_DEFINITIONS = {
940
940
  },
941
941
  hallmark: {
942
942
  name: "Hallmark",
943
- tags: ["entertainment"],
943
+ tags: ["Entertainment"],
944
944
  pacificStationId: "66415",
945
945
  stationId: "66268",
946
- providers: {
946
+ services: {
947
947
  cox: { channelSelector: "Hallmark Channel", url: "https://watchtv.cox.com/listings" },
948
948
  directv: { channelSelector: "Hallmark Channel", url: "https://stream.directv.com" },
949
949
  hulu: { channelSelector: "Hallmark Channel", url: "https://www.hulu.com/live" },
@@ -954,9 +954,9 @@ const BASE_CHANNEL_DEFINITIONS = {
954
954
  },
955
955
  hallmarkfamily: {
956
956
  name: "Hallmark Family",
957
- tags: ["entertainment"],
957
+ tags: ["Entertainment"],
958
958
  stationId: "105723",
959
- providers: {
959
+ services: {
960
960
  cox: { channelSelector: "HFM", url: "https://watchtv.cox.com/listings" },
961
961
  spectrum: { channelSelector: "Hallmark Family", url: "https://watch.spectrum.net/guide" },
962
962
  xfinity: { channelSelector: "HFM", url: "https://www.xfinity.com/stream/listings" },
@@ -965,10 +965,10 @@ const BASE_CHANNEL_DEFINITIONS = {
965
965
  },
966
966
  hallmarkmystery: {
967
967
  name: "Hallmark Mystery",
968
- tags: ["entertainment"],
968
+ tags: ["Entertainment"],
969
969
  pacificStationId: "66412",
970
970
  stationId: "46710",
971
- providers: {
971
+ services: {
972
972
  cox: { channelSelector: "HMYS", url: "https://watchtv.cox.com/listings" },
973
973
  hulu: { channelSelector: "Hallmark Mystery", url: "https://www.hulu.com/live" },
974
974
  spectrum: { channelSelector: "Hallmark Mystery", url: "https://watch.spectrum.net/guide" },
@@ -978,9 +978,9 @@ const BASE_CHANNEL_DEFINITIONS = {
978
978
  },
979
979
  hbo: {
980
980
  name: "HBO",
981
- tags: ["hbo", "movies"],
981
+ tags: ["HBO", "Movies"],
982
982
  stationId: "19548",
983
- providers: {
983
+ services: {
984
984
  cox: { channelSelector: "HBO", url: "https://watchtv.cox.com/listings" },
985
985
  site: { channelSelector: "HBO", url: "https://play.hbomax.com" },
986
986
  xfinity: { channelSelector: "HBO", url: "https://www.xfinity.com/stream/listings" },
@@ -989,9 +989,9 @@ const BASE_CHANNEL_DEFINITIONS = {
989
989
  },
990
990
  hbocomedy: {
991
991
  name: "HBO Comedy",
992
- tags: ["hbo", "movies"],
992
+ tags: ["HBO", "Movies"],
993
993
  stationId: "59839",
994
- providers: {
994
+ services: {
995
995
  cox: { channelSelector: "HBOCH", url: "https://watchtv.cox.com/listings" },
996
996
  site: { channelSelector: "HBO Comedy", url: "https://play.hbomax.com" },
997
997
  xfinity: { channelSelector: "HBOCH", url: "https://www.xfinity.com/stream/listings" },
@@ -1000,9 +1000,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1000
1000
  },
1001
1001
  hbodrama: {
1002
1002
  name: "HBO Drama",
1003
- tags: ["hbo", "movies"],
1003
+ tags: ["HBO", "Movies"],
1004
1004
  stationId: "59363",
1005
- providers: {
1005
+ services: {
1006
1006
  cox: { channelSelector: "HBOSH", url: "https://watchtv.cox.com/listings" },
1007
1007
  site: { channelSelector: "HBO Drama", url: "https://play.hbomax.com" },
1008
1008
  xfinity: { channelSelector: "HBOSH", url: "https://www.xfinity.com/stream/listings" },
@@ -1011,9 +1011,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1011
1011
  },
1012
1012
  hbohits: {
1013
1013
  name: "HBO Hits",
1014
- tags: ["hbo", "movies"],
1014
+ tags: ["HBO", "Movies"],
1015
1015
  stationId: "59368",
1016
- providers: {
1016
+ services: {
1017
1017
  cox: { channelSelector: "HBO2H", url: "https://watchtv.cox.com/listings" },
1018
1018
  site: { channelSelector: "HBO Hits", url: "https://play.hbomax.com" },
1019
1019
  xfinity: { channelSelector: "HBO2H", url: "https://www.xfinity.com/stream/listings" },
@@ -1022,9 +1022,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1022
1022
  },
1023
1023
  hbomovies: {
1024
1024
  name: "HBO Movies",
1025
- tags: ["hbo", "movies"],
1025
+ tags: ["HBO", "Movies"],
1026
1026
  stationId: "59845",
1027
- providers: {
1027
+ services: {
1028
1028
  cox: { channelSelector: "HBOZH", url: "https://watchtv.cox.com/listings" },
1029
1029
  site: { channelSelector: "HBO Movies", url: "https://play.hbomax.com" },
1030
1030
  xfinity: { channelSelector: "HBOZH", url: "https://www.xfinity.com/stream/listings" },
@@ -1033,10 +1033,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1033
1033
  },
1034
1034
  hgtv: {
1035
1035
  name: "HGTV",
1036
- tags: ["lifestyle"],
1036
+ tags: ["Lifestyle"],
1037
1037
  pacificStationId: "87317",
1038
1038
  stationId: "49788",
1039
- providers: {
1039
+ services: {
1040
1040
  cox: { channelSelector: "HGTV", url: "https://watchtv.cox.com/listings" },
1041
1041
  directv: { channelSelector: "HGTV", url: "https://stream.directv.com" },
1042
1042
  hulu: { channelSelector: "HGTV", url: "https://www.hulu.com/live" },
@@ -1049,10 +1049,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1049
1049
  },
1050
1050
  history: {
1051
1051
  name: "History",
1052
- tags: ["documentary"],
1052
+ tags: ["Documentary"],
1053
1053
  pacificStationId: "88545",
1054
1054
  stationId: "57708",
1055
- providers: {
1055
+ services: {
1056
1056
  cox: { channelSelector: "History", url: "https://watchtv.cox.com/listings" },
1057
1057
  directv: { channelSelector: "HISTORY", url: "https://stream.directv.com" },
1058
1058
  hulu: { channelSelector: "The HISTORY Channel", url: "https://www.hulu.com/live" },
@@ -1064,9 +1064,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1064
1064
  },
1065
1065
  hln: {
1066
1066
  name: "HLN",
1067
- tags: ["news"],
1067
+ tags: ["News"],
1068
1068
  stationId: "64549",
1069
- providers: {
1069
+ services: {
1070
1070
  cox: { channelSelector: "HLN", url: "https://watchtv.cox.com/listings" },
1071
1071
  directv: { channelSelector: "HLN", url: "https://stream.directv.com" },
1072
1072
  hulu: { channelSelector: "HLN", url: "https://www.hulu.com/live" },
@@ -1079,10 +1079,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1079
1079
  },
1080
1080
  id: {
1081
1081
  name: "Investigation Discovery",
1082
- tags: ["documentary"],
1082
+ tags: ["Documentary"],
1083
1083
  pacificStationId: "80309",
1084
1084
  stationId: "65342",
1085
- providers: {
1085
+ services: {
1086
1086
  cox: { channelSelector: "Investigation Discovery", url: "https://watchtv.cox.com/listings" },
1087
1087
  directv: { channelSelector: "Investigation Discovery", url: "https://stream.directv.com" },
1088
1088
  hulu: { channelSelector: "Investigation Discovery", url: "https://www.hulu.com/live" },
@@ -1095,10 +1095,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1095
1095
  },
1096
1096
  ifc: {
1097
1097
  name: "IFC",
1098
- tags: ["entertainment", "movies"],
1098
+ tags: ["Entertainment", "Movies"],
1099
1099
  pacificStationId: "109735",
1100
1100
  stationId: "59444",
1101
- providers: {
1101
+ services: {
1102
1102
  cox: { channelSelector: "IFC", url: "https://watchtv.cox.com/listings" },
1103
1103
  directv: { channelSelector: "IFC", url: "https://stream.directv.com" },
1104
1104
  sling: { channelSelector: "IFC", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -1109,9 +1109,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1109
1109
  },
1110
1110
  indieplex: {
1111
1111
  name: "IndiePlex",
1112
- tags: ["movies", "starz"],
1112
+ tags: ["Movies", "Starz"],
1113
1113
  stationId: "65795",
1114
- providers: {
1114
+ services: {
1115
1115
  hulu: { channelSelector: "IndiePlex (East)", url: "https://www.hulu.com/live" },
1116
1116
  sling: { channelSelector: "IndiePlex", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1117
1117
  spectrum: { channelSelector: "IndiePlex", url: "https://watch.spectrum.net/guide" },
@@ -1119,18 +1119,18 @@ const BASE_CHANNEL_DEFINITIONS = {
1119
1119
  },
1120
1120
  indieplexp: {
1121
1121
  name: "IndiePlex (Pacific)",
1122
- tags: ["movies", "starz"],
1122
+ tags: ["Movies", "Starz"],
1123
1123
  stationId: "65796",
1124
- providers: {
1124
+ services: {
1125
1125
  hulu: { channelSelector: "IndiePlex (West)", url: "https://www.hulu.com/live" },
1126
1126
  },
1127
1127
  },
1128
1128
  lifetime: {
1129
1129
  name: "Lifetime",
1130
- tags: ["entertainment"],
1130
+ tags: ["Entertainment"],
1131
1131
  pacificStationId: "60250",
1132
1132
  stationId: "60150",
1133
- providers: {
1133
+ services: {
1134
1134
  cox: { channelSelector: "Lifetime", url: "https://watchtv.cox.com/listings" },
1135
1135
  directv: { channelSelector: "Lifetime", url: "https://stream.directv.com" },
1136
1136
  hulu: { channelSelector: "Lifetime", url: "https://www.hulu.com/live" },
@@ -1142,10 +1142,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1142
1142
  },
1143
1143
  lmn: {
1144
1144
  name: "Lifetime Movie Network",
1145
- tags: ["entertainment", "movies"],
1145
+ tags: ["Entertainment", "Movies"],
1146
1146
  pacificStationId: "92373",
1147
1147
  stationId: "55887",
1148
- providers: {
1148
+ services: {
1149
1149
  cox: { channelSelector: "Lifetime Movies", url: "https://watchtv.cox.com/listings" },
1150
1150
  directv: { channelSelector: "Lifetime Movie Network", url: "https://stream.directv.com" },
1151
1151
  hulu: { channelSelector: "LMN", url: "https://www.hulu.com/live" },
@@ -1155,10 +1155,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1155
1155
  },
1156
1156
  magnolia: {
1157
1157
  name: "Magnolia Network",
1158
- tags: ["lifestyle"],
1158
+ tags: ["Lifestyle"],
1159
1159
  pacificStationId: "122081",
1160
1160
  stationId: "67375",
1161
- providers: {
1161
+ services: {
1162
1162
  cox: { channelSelector: "Magnolia Network", url: "https://watchtv.cox.com/listings" },
1163
1163
  directv: { channelSelector: "Magnolia Network", url: "https://stream.directv.com" },
1164
1164
  hulu: { channelSelector: "Magnolia Network", url: "https://www.hulu.com/live" },
@@ -1170,10 +1170,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1170
1170
  },
1171
1171
  mgmplus: {
1172
1172
  name: "MGM+",
1173
- tags: ["movies"],
1173
+ tags: ["Movies"],
1174
1174
  pacificStationId: "95927",
1175
1175
  stationId: "65687",
1176
- providers: {
1176
+ services: {
1177
1177
  cox: { channelSelector: "MGM+", url: "https://watchtv.cox.com/listings" },
1178
1178
  directv: { channelSelector: "MGM+", url: "https://stream.directv.com" },
1179
1179
  xfinity: { channelSelector: "MGM+", url: "https://www.xfinity.com/stream/listings" },
@@ -1181,9 +1181,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1181
1181
  },
1182
1182
  mlb: {
1183
1183
  name: "MLB Network",
1184
- tags: ["sports"],
1184
+ tags: ["Sports"],
1185
1185
  stationId: "62081",
1186
- providers: {
1186
+ services: {
1187
1187
  cox: { channelSelector: "MLB Network", url: "https://watchtv.cox.com/listings" },
1188
1188
  directv: { channelSelector: "MLB Network", url: "https://stream.directv.com" },
1189
1189
  hulu: { channelSelector: "MLB Network", url: "https://www.hulu.com/live" },
@@ -1193,9 +1193,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1193
1193
  },
1194
1194
  movieplex: {
1195
1195
  name: "MoviePlex",
1196
- tags: ["movies", "starz"],
1196
+ tags: ["Movies", "Starz"],
1197
1197
  stationId: "83075",
1198
- providers: {
1198
+ services: {
1199
1199
  hulu: { channelSelector: "MoviePlex (East)", url: "https://www.hulu.com/live" },
1200
1200
  sling: { channelSelector: "MoviePlex", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1201
1201
  spectrum: { channelSelector: "Movieplex", url: "https://watch.spectrum.net/guide" },
@@ -1203,33 +1203,33 @@ const BASE_CHANNEL_DEFINITIONS = {
1203
1203
  },
1204
1204
  movieplexp: {
1205
1205
  name: "MoviePlex (Pacific)",
1206
- tags: ["movies", "starz"],
1206
+ tags: ["Movies", "Starz"],
1207
1207
  stationId: "105963",
1208
- providers: {
1208
+ services: {
1209
1209
  hulu: { channelSelector: "MoviePlex (West)", url: "https://www.hulu.com/live" },
1210
1210
  },
1211
1211
  },
1212
1212
  msg: {
1213
1213
  name: "MSG",
1214
- tags: ["sports"],
1214
+ tags: ["Sports"],
1215
1215
  stationId: "35402",
1216
- providers: {
1216
+ services: {
1217
1217
  directv: { channelSelector: "MSG", url: "https://stream.directv.com" },
1218
1218
  },
1219
1219
  },
1220
1220
  msgsn: {
1221
1221
  name: "MSG Sportsnet",
1222
- tags: ["sports"],
1222
+ tags: ["Sports"],
1223
1223
  stationId: "35383",
1224
- providers: {
1224
+ services: {
1225
1225
  directv: { channelSelector: "MSG Sportsnet HD 635", url: "https://stream.directv.com" },
1226
1226
  },
1227
1227
  },
1228
1228
  msnow: {
1229
1229
  name: "MS NOW",
1230
- tags: ["news"],
1230
+ tags: ["News"],
1231
1231
  stationId: "64241",
1232
- providers: {
1232
+ services: {
1233
1233
  cox: { channelSelector: "MS NOW", url: "https://watchtv.cox.com/listings" },
1234
1234
  directv: { channelSelector: "MS Now", url: "https://stream.directv.com" },
1235
1235
  hulu: { channelSelector: "MS NOW", url: "https://www.hulu.com/live" },
@@ -1243,10 +1243,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1243
1243
  },
1244
1244
  mtv: {
1245
1245
  name: "MTV",
1246
- tags: ["entertainment"],
1246
+ tags: ["Entertainment"],
1247
1247
  pacificStationId: "64630",
1248
1248
  stationId: "60964",
1249
- providers: {
1249
+ services: {
1250
1250
  cox: { channelSelector: "MTV", url: "https://watchtv.cox.com/listings" },
1251
1251
  directv: { channelSelector: "MTV", url: "https://stream.directv.com" },
1252
1252
  hulu: { channelSelector: "MTV", url: "https://www.hulu.com/live" },
@@ -1257,10 +1257,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1257
1257
  },
1258
1258
  mtv2: {
1259
1259
  name: "MTV2",
1260
- tags: ["entertainment"],
1260
+ tags: ["Entertainment"],
1261
1261
  pacificStationId: "75506",
1262
1262
  stationId: "75077",
1263
- providers: {
1263
+ services: {
1264
1264
  cox: { channelSelector: "MTV2", url: "https://watchtv.cox.com/listings" },
1265
1265
  directv: { channelSelector: "MTV2", url: "https://stream.directv.com" },
1266
1266
  spectrum: { channelSelector: "MTV2", url: "https://watch.spectrum.net/guide" },
@@ -1269,9 +1269,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1269
1269
  },
1270
1270
  mtvclassic: {
1271
1271
  name: "MTV Classic",
1272
- tags: ["entertainment"],
1272
+ tags: ["Entertainment"],
1273
1273
  stationId: "92240",
1274
- providers: {
1274
+ services: {
1275
1275
  cox: { channelSelector: "MTV Classic", url: "https://watchtv.cox.com/listings" },
1276
1276
  directv: { channelSelector: "MTV Classic", url: "https://stream.directv.com" },
1277
1277
  spectrum: { channelSelector: "MTV Classic", url: "https://watch.spectrum.net/guide" },
@@ -1280,9 +1280,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1280
1280
  },
1281
1281
  natgeo: {
1282
1282
  name: "National Geographic",
1283
- tags: ["documentary"],
1283
+ tags: ["Documentary"],
1284
1284
  stationId: "49438",
1285
- providers: {
1285
+ services: {
1286
1286
  cox: { channelSelector: "Nat Geo", url: "https://watchtv.cox.com/listings" },
1287
1287
  directv: { channelSelector: "National Geographic Channel", url: "https://stream.directv.com" },
1288
1288
  hulu: { channelSelector: "National Geographic", url: "https://www.hulu.com/live" },
@@ -1295,17 +1295,17 @@ const BASE_CHANNEL_DEFINITIONS = {
1295
1295
  },
1296
1296
  natgeop: {
1297
1297
  name: "National Geographic (Pacific)",
1298
- tags: ["documentary"],
1298
+ tags: ["Documentary"],
1299
1299
  stationId: "71601",
1300
- providers: {
1300
+ services: {
1301
1301
  site: { url: "https://www.nationalgeographic.com/tv/watch-live/91456580-f32f-417c-8e1a-9f82640832a7" },
1302
1302
  },
1303
1303
  },
1304
1304
  natgeowild: {
1305
1305
  name: "Nat Geo Wild",
1306
- tags: ["documentary"],
1306
+ tags: ["Documentary"],
1307
1307
  stationId: "67331",
1308
- providers: {
1308
+ services: {
1309
1309
  cox: { channelSelector: "National Geographic WILD", url: "https://watchtv.cox.com/listings" },
1310
1310
  directv: { channelSelector: "Nat Geo WILD", url: "https://stream.directv.com" },
1311
1311
  hulu: { channelSelector: "Nat Geo WILD", url: "https://www.hulu.com/live" },
@@ -1317,9 +1317,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1317
1317
  },
1318
1318
  nba: {
1319
1319
  name: "NBA TV",
1320
- tags: ["sports"],
1320
+ tags: ["Sports"],
1321
1321
  stationId: "45526",
1322
- providers: {
1322
+ services: {
1323
1323
  cox: { channelSelector: "NBA TV", url: "https://watchtv.cox.com/listings" },
1324
1324
  directv: { channelSelector: "NBA TV", url: "https://stream.directv.com" },
1325
1325
  site: { url: "https://www.nba.com/watch/nba-tv" },
@@ -1330,8 +1330,8 @@ const BASE_CHANNEL_DEFINITIONS = {
1330
1330
  },
1331
1331
  nbc: {
1332
1332
  name: "NBC",
1333
- tags: ["local"],
1334
- providers: {
1333
+ tags: ["Local"],
1334
+ services: {
1335
1335
  cox: { channelSelector: "NBC", url: "https://watchtv.cox.com/listings" },
1336
1336
  directv: { channelSelector: "NBC", url: "https://stream.directv.com" },
1337
1337
  hulu: { channelSelector: "NBC", url: "https://www.hulu.com/live" },
@@ -1344,9 +1344,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1344
1344
  },
1345
1345
  nbcnews: {
1346
1346
  name: "NBC News Now",
1347
- tags: ["news"],
1347
+ tags: ["News"],
1348
1348
  stationId: "114174",
1349
- providers: {
1349
+ services: {
1350
1350
  cox: { channelSelector: "NBC News NOW", url: "https://watchtv.cox.com/listings" },
1351
1351
  directv: { channelSelector: "NBC News Now", url: "https://stream.directv.com" },
1352
1352
  hulu: { channelSelector: "NBC News NOW", url: "https://www.hulu.com/live" },
@@ -1358,57 +1358,57 @@ const BASE_CHANNEL_DEFINITIONS = {
1358
1358
  },
1359
1359
  nbcsbayarea: {
1360
1360
  name: "NBC Sports Bay Area",
1361
- tags: ["sports"],
1361
+ tags: ["Sports"],
1362
1362
  stationId: "63138",
1363
- providers: {
1363
+ services: {
1364
1364
  site: { url: "https://www.nbc.com/live?brand=rsn-bay-area&callsign=nbcsbayarea" },
1365
1365
  },
1366
1366
  },
1367
1367
  nbcsboston: {
1368
1368
  name: "NBC Sports Boston",
1369
- tags: ["sports"],
1369
+ tags: ["Sports"],
1370
1370
  stationId: "49198",
1371
- providers: {
1371
+ services: {
1372
1372
  site: { url: "https://www.nbc.com/live?brand=rsn-boston&callsign=nbcsboston" },
1373
1373
  },
1374
1374
  },
1375
1375
  nbcscalifornia: {
1376
1376
  name: "NBC Sports California",
1377
- tags: ["sports"],
1377
+ tags: ["Sports"],
1378
1378
  stationId: "45540",
1379
- providers: {
1379
+ services: {
1380
1380
  site: { url: "https://www.nbc.com/live?brand=rsn-california&callsign=nbcscalifornia" },
1381
1381
  },
1382
1382
  },
1383
1383
  nbcsn: {
1384
1384
  name: "NBC Sports Network",
1385
- tags: ["sports"],
1385
+ tags: ["Sports"],
1386
1386
  stationId: "194412",
1387
- providers: {
1387
+ services: {
1388
1388
  yttv: { channelSelector: "NBC Sports Network", url: "https://tv.youtube.com/live" },
1389
1389
  },
1390
1390
  },
1391
1391
  nbcsphiladelphia: {
1392
1392
  name: "NBC Sports Philadelphia",
1393
- tags: ["sports"],
1393
+ tags: ["Sports"],
1394
1394
  stationId: "32571",
1395
- providers: {
1395
+ services: {
1396
1396
  site: { url: "https://www.nbc.com/live?brand=rsn-philadelphia&callsign=nbcsphiladelphia" },
1397
1397
  },
1398
1398
  },
1399
1399
  necn: {
1400
1400
  name: "NECN",
1401
- tags: ["news"],
1401
+ tags: ["News"],
1402
1402
  stationId: "66278",
1403
- providers: {
1403
+ services: {
1404
1404
  site: { url: "https://www.nbc.com/live?brand=necn&callsign=necn" },
1405
1405
  },
1406
1406
  },
1407
1407
  nfl: {
1408
1408
  name: "NFL Network",
1409
- tags: ["sports"],
1409
+ tags: ["Sports"],
1410
1410
  stationId: "45399",
1411
- providers: {
1411
+ services: {
1412
1412
  cox: { channelSelector: "NFL Network", url: "https://watchtv.cox.com/listings" },
1413
1413
  directv: { channelSelector: "NFL Network", url: "https://stream.directv.com" },
1414
1414
  hulu: { channelSelector: "NFL Network", url: "https://www.hulu.com/live" },
@@ -1420,9 +1420,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1420
1420
  },
1421
1421
  nhl: {
1422
1422
  name: "NHL Network",
1423
- tags: ["sports"],
1423
+ tags: ["Sports"],
1424
1424
  stationId: "58690",
1425
- providers: {
1425
+ services: {
1426
1426
  cox: { channelSelector: "NHL Network", url: "https://watchtv.cox.com/listings" },
1427
1427
  directv: { channelSelector: "NHL Network HD", url: "https://stream.directv.com" },
1428
1428
  spectrum: { channelSelector: "NHL Network", url: "https://watch.spectrum.net/guide" },
@@ -1431,9 +1431,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1431
1431
  },
1432
1432
  own: {
1433
1433
  name: "OWN",
1434
- tags: ["lifestyle"],
1434
+ tags: ["Lifestyle"],
1435
1435
  stationId: "70388",
1436
- providers: {
1436
+ services: {
1437
1437
  cox: { channelSelector: "OWN", url: "https://watchtv.cox.com/listings" },
1438
1438
  directv: { channelSelector: "OWN", url: "https://stream.directv.com" },
1439
1439
  hulu: { channelSelector: "Oprah Winfrey Network", url: "https://www.hulu.com/live" },
@@ -1445,9 +1445,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1445
1445
  },
1446
1446
  oxygen: {
1447
1447
  name: "Oxygen",
1448
- tags: ["entertainment"],
1448
+ tags: ["Entertainment"],
1449
1449
  stationId: "70522",
1450
- providers: {
1450
+ services: {
1451
1451
  cox: { channelSelector: "Oxygen True Crime", url: "https://watchtv.cox.com/listings" },
1452
1452
  directv: { channelSelector: "Oxygen True Crime", url: "https://stream.directv.com" },
1453
1453
  hulu: { channelSelector: "Oxygen True Crime", url: "https://www.hulu.com/live" },
@@ -1459,17 +1459,17 @@ const BASE_CHANNEL_DEFINITIONS = {
1459
1459
  },
1460
1460
  oxygenp: {
1461
1461
  name: "Oxygen (Pacific)",
1462
- tags: ["entertainment"],
1462
+ tags: ["Entertainment"],
1463
1463
  stationId: "74032",
1464
- providers: {
1464
+ services: {
1465
1465
  site: { channelSelector: "Oxygen_West", url: "https://www.usanetwork.com/live" },
1466
1466
  },
1467
1467
  },
1468
1468
  paramount: {
1469
1469
  name: "Paramount Network",
1470
- tags: ["entertainment"],
1470
+ tags: ["Entertainment"],
1471
1471
  stationId: "59186",
1472
- providers: {
1472
+ services: {
1473
1473
  cox: { channelSelector: "Paramount Network", url: "https://watchtv.cox.com/listings" },
1474
1474
  hulu: { channelSelector: "Paramount Network", url: "https://www.hulu.com/live" },
1475
1475
  spectrum: { channelSelector: "Paramount Network", url: "https://watch.spectrum.net/guide" },
@@ -1479,16 +1479,16 @@ const BASE_CHANNEL_DEFINITIONS = {
1479
1479
  },
1480
1480
  paramountp: {
1481
1481
  name: "Paramount (Pacific)",
1482
- tags: ["entertainment"],
1482
+ tags: ["Entertainment"],
1483
1483
  stationId: "64593",
1484
- providers: {
1484
+ services: {
1485
1485
  yttv: { channelSelector: "Paramount Network", url: "https://tv.youtube.com/live" },
1486
1486
  },
1487
1487
  },
1488
1488
  pbs: {
1489
1489
  name: "PBS",
1490
- tags: ["local"],
1491
- providers: {
1490
+ tags: ["Local"],
1491
+ services: {
1492
1492
  cox: { channelSelector: "PBS", url: "https://watchtv.cox.com/listings" },
1493
1493
  directv: { channelSelector: "PBS", url: "https://stream.directv.com" },
1494
1494
  hulu: { channelSelector: "PBS", url: "https://www.hulu.com/live" },
@@ -1499,27 +1499,27 @@ const BASE_CHANNEL_DEFINITIONS = {
1499
1499
  },
1500
1500
  pbschicago: {
1501
1501
  name: "PBS Chicago (WTTW)",
1502
- tags: ["local"],
1502
+ tags: ["Local"],
1503
1503
  stationId: "30415",
1504
- providers: {
1504
+ services: {
1505
1505
  hulu: { channelSelector: "PBS", url: "https://www.hulu.com/live" },
1506
1506
  site: { url: "https://www.wttw.com/wttw-live-stream" },
1507
1507
  },
1508
1508
  },
1509
1509
  pbslakeshore: {
1510
1510
  name: "PBS Lakeshore (WYIN)",
1511
- tags: ["local"],
1511
+ tags: ["Local"],
1512
1512
  stationId: "49237",
1513
- providers: {
1513
+ services: {
1514
1514
  hulu: { channelSelector: "Lakeshore PBS", url: "https://www.hulu.com/live" },
1515
1515
  site: { url: "https://video.lakeshorepbs.org/livestream" },
1516
1516
  },
1517
1517
  },
1518
1518
  retroplex: {
1519
1519
  name: "RetroPlex",
1520
- tags: ["movies", "starz"],
1520
+ tags: ["Movies", "Starz"],
1521
1521
  stationId: "65791",
1522
- providers: {
1522
+ services: {
1523
1523
  hulu: { channelSelector: "RetroPlex (East)", url: "https://www.hulu.com/live" },
1524
1524
  sling: { channelSelector: "RetroPlex", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1525
1525
  spectrum: { channelSelector: "RetroPlex", url: "https://watch.spectrum.net/guide" },
@@ -1527,17 +1527,17 @@ const BASE_CHANNEL_DEFINITIONS = {
1527
1527
  },
1528
1528
  retroplexp: {
1529
1529
  name: "RetroPlex (Pacific)",
1530
- tags: ["movies", "starz"],
1530
+ tags: ["Movies", "Starz"],
1531
1531
  stationId: "65793",
1532
- providers: {
1532
+ services: {
1533
1533
  hulu: { channelSelector: "RetroPlex (West)", url: "https://www.hulu.com/live" },
1534
1534
  },
1535
1535
  },
1536
1536
  science: {
1537
1537
  name: "Science",
1538
- tags: ["documentary"],
1538
+ tags: ["Documentary"],
1539
1539
  stationId: "57390",
1540
- providers: {
1540
+ services: {
1541
1541
  cox: { channelSelector: "Science Channel", url: "https://watchtv.cox.com/listings" },
1542
1542
  directv: { channelSelector: "Science", url: "https://stream.directv.com" },
1543
1543
  site: { url: "https://watch.foodnetwork.com/channel/science" },
@@ -1547,9 +1547,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1547
1547
  },
1548
1548
  showtime: {
1549
1549
  name: "Showtime",
1550
- tags: ["movies", "showtime"],
1550
+ tags: ["Movies", "Showtime"],
1551
1551
  stationId: "91620",
1552
- providers: {
1552
+ services: {
1553
1553
  cox: { channelSelector: "PSHOh", url: "https://watchtv.cox.com/listings" },
1554
1554
  paramountplus: { url: "https://www.paramountplus.com/live-tv/stream/showtime-east" },
1555
1555
  xfinity: { channelSelector: "PSHOh", url: "https://www.xfinity.com/stream/listings" },
@@ -1558,18 +1558,18 @@ const BASE_CHANNEL_DEFINITIONS = {
1558
1558
  },
1559
1559
  showtimep: {
1560
1560
  name: "Showtime (Pacific)",
1561
- tags: ["movies", "showtime"],
1561
+ tags: ["Movies", "Showtime"],
1562
1562
  stationId: "91621",
1563
- providers: {
1563
+ services: {
1564
1564
  paramountplus: { url: "https://www.paramountplus.com/live-tv/stream/showtime-west" },
1565
1565
  },
1566
1566
  },
1567
1567
  smithsonian: {
1568
1568
  name: "Smithsonian Channel",
1569
- tags: ["documentary"],
1569
+ tags: ["Documentary"],
1570
1570
  pacificStationId: "82695",
1571
1571
  stationId: "58532",
1572
- providers: {
1572
+ services: {
1573
1573
  cox: { channelSelector: "Smithsonian", url: "https://watchtv.cox.com/listings" },
1574
1574
  directv: { channelSelector: "Smithsonian Channel HD", url: "https://stream.directv.com" },
1575
1575
  hulu: { channelSelector: "Smithsonian Channel", url: "https://www.hulu.com/live" },
@@ -1580,17 +1580,17 @@ const BASE_CHANNEL_DEFINITIONS = {
1580
1580
  },
1581
1581
  sny: {
1582
1582
  name: "SportsNet New York",
1583
- tags: ["sports"],
1583
+ tags: ["Sports"],
1584
1584
  stationId: "50038",
1585
- providers: {
1585
+ services: {
1586
1586
  directv: { channelSelector: "SportsNet New York HD 639", url: "https://stream.directv.com" },
1587
1587
  },
1588
1588
  },
1589
1589
  starz: {
1590
1590
  name: "Starz",
1591
- tags: ["movies", "starz"],
1591
+ tags: ["Movies", "Starz"],
1592
1592
  stationId: "34941",
1593
- providers: {
1593
+ services: {
1594
1594
  cox: { channelSelector: "STARZ", url: "https://watchtv.cox.com/listings" },
1595
1595
  hulu: { channelSelector: "STARZ (East)", url: "https://www.hulu.com/live" },
1596
1596
  site: { url: "https://www.starz.com/us/en/play/2" },
@@ -1600,60 +1600,60 @@ const BASE_CHANNEL_DEFINITIONS = {
1600
1600
  },
1601
1601
  starzcinema: {
1602
1602
  name: "Starz Cinema",
1603
- tags: ["movies", "starz"],
1603
+ tags: ["Movies", "Starz"],
1604
1604
  stationId: "67236",
1605
- providers: {
1605
+ services: {
1606
1606
  hulu: { channelSelector: "STARZ Cinema (East)", url: "https://www.hulu.com/live" },
1607
1607
  sling: { channelSelector: "Starz Cinema", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1608
1608
  },
1609
1609
  },
1610
1610
  starzcinemap: {
1611
1611
  name: "Starz Cinema (Pacific)",
1612
- tags: ["movies", "starz"],
1612
+ tags: ["Movies", "Starz"],
1613
1613
  stationId: "67365",
1614
- providers: {
1614
+ services: {
1615
1615
  hulu: { channelSelector: "STARZ Cinema (West)", url: "https://www.hulu.com/live" },
1616
1616
  },
1617
1617
  },
1618
1618
  starzcomedy: {
1619
1619
  name: "Starz Comedy",
1620
- tags: ["movies", "starz"],
1620
+ tags: ["Movies", "Starz"],
1621
1621
  stationId: "57569",
1622
- providers: {
1622
+ services: {
1623
1623
  hulu: { channelSelector: "STARZ Comedy (East)", url: "https://www.hulu.com/live" },
1624
1624
  sling: { channelSelector: "Starz Comedy", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1625
1625
  },
1626
1626
  },
1627
1627
  starzcomedyp: {
1628
1628
  name: "Starz Comedy (Pacific)",
1629
- tags: ["movies", "starz"],
1629
+ tags: ["Movies", "Starz"],
1630
1630
  stationId: "57575",
1631
- providers: {
1631
+ services: {
1632
1632
  hulu: { channelSelector: "STARZ Comedy (West)", url: "https://www.hulu.com/live" },
1633
1633
  },
1634
1634
  },
1635
1635
  starzedge: {
1636
1636
  name: "Starz Edge",
1637
- tags: ["movies", "starz"],
1637
+ tags: ["Movies", "Starz"],
1638
1638
  stationId: "57573",
1639
- providers: {
1639
+ services: {
1640
1640
  hulu: { channelSelector: "STARZ Edge (East)", url: "https://www.hulu.com/live" },
1641
1641
  sling: { channelSelector: "Starz Edge", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1642
1642
  },
1643
1643
  },
1644
1644
  starzedgep: {
1645
1645
  name: "Starz Edge (Pacific)",
1646
- tags: ["movies", "starz"],
1646
+ tags: ["Movies", "Starz"],
1647
1647
  stationId: "57578",
1648
- providers: {
1648
+ services: {
1649
1649
  hulu: { channelSelector: "STARZ Edge (West)", url: "https://www.hulu.com/live" },
1650
1650
  },
1651
1651
  },
1652
1652
  starzencore: {
1653
1653
  name: "Starz Encore",
1654
- tags: ["movies", "starz"],
1654
+ tags: ["Movies", "Starz"],
1655
1655
  stationId: "36225",
1656
- providers: {
1656
+ services: {
1657
1657
  cox: { channelSelector: "STZEH", url: "https://watchtv.cox.com/listings" },
1658
1658
  hulu: { channelSelector: "STARZ Encore (East)", url: "https://www.hulu.com/live" },
1659
1659
  sling: { channelSelector: "Starz Encore", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -1662,9 +1662,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1662
1662
  },
1663
1663
  starzencoreaction: {
1664
1664
  name: "Starz Encore Action",
1665
- tags: ["movies", "starz"],
1665
+ tags: ["Movies", "Starz"],
1666
1666
  stationId: "72015",
1667
- providers: {
1667
+ services: {
1668
1668
  cox: { channelSelector: "STZAH", url: "https://watchtv.cox.com/listings" },
1669
1669
  hulu: { channelSelector: "STARZ Encore Action (East)", url: "https://www.hulu.com/live" },
1670
1670
  sling: { channelSelector: "Starz Encore Action", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -1673,17 +1673,17 @@ const BASE_CHANNEL_DEFINITIONS = {
1673
1673
  },
1674
1674
  starzencoreactionp: {
1675
1675
  name: "Starz Encore Action (Pacific)",
1676
- tags: ["movies", "starz"],
1676
+ tags: ["Movies", "Starz"],
1677
1677
  stationId: "103833",
1678
- providers: {
1678
+ services: {
1679
1679
  hulu: { channelSelector: "STARZ Encore Action (West)", url: "https://www.hulu.com/live" },
1680
1680
  },
1681
1681
  },
1682
1682
  starzencoreblack: {
1683
1683
  name: "Starz Encore Black",
1684
- tags: ["movies", "starz"],
1684
+ tags: ["Movies", "Starz"],
1685
1685
  stationId: "72014",
1686
- providers: {
1686
+ services: {
1687
1687
  cox: { channelSelector: "STZBH", url: "https://watchtv.cox.com/listings" },
1688
1688
  hulu: { channelSelector: "STARZ Encore Black (East)", url: "https://www.hulu.com/live" },
1689
1689
  sling: { channelSelector: "Starz Encore Black", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -1692,155 +1692,155 @@ const BASE_CHANNEL_DEFINITIONS = {
1692
1692
  },
1693
1693
  starzencoreblackp: {
1694
1694
  name: "Starz Encore Black (Pacific)",
1695
- tags: ["movies", "starz"],
1695
+ tags: ["Movies", "Starz"],
1696
1696
  stationId: "103834",
1697
- providers: {
1697
+ services: {
1698
1698
  hulu: { channelSelector: "STARZ Encore Black (West)", url: "https://www.hulu.com/live" },
1699
1699
  },
1700
1700
  },
1701
1701
  starzencoreclassic: {
1702
1702
  name: "Starz Encore Classic",
1703
- tags: ["movies", "starz"],
1703
+ tags: ["Movies", "Starz"],
1704
1704
  stationId: "83404",
1705
- providers: {
1705
+ services: {
1706
1706
  hulu: { channelSelector: "STARZ Encore Classic (East)", url: "https://www.hulu.com/live" },
1707
1707
  sling: { channelSelector: "Starz Encore Classic", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1708
1708
  },
1709
1709
  },
1710
1710
  starzencoreclassicp: {
1711
1711
  name: "Starz Encore Classic (Pacific)",
1712
- tags: ["movies", "starz"],
1712
+ tags: ["Movies", "Starz"],
1713
1713
  stationId: "97233",
1714
- providers: {
1714
+ services: {
1715
1715
  hulu: { channelSelector: "STARZ Encore Classic (West)", url: "https://www.hulu.com/live" },
1716
1716
  },
1717
1717
  },
1718
1718
  starzencoreespanol: {
1719
1719
  name: "Starz Encore Español",
1720
- tags: ["movies", "starz"],
1720
+ tags: ["Movies", "Starz"],
1721
1721
  stationId: "72016",
1722
- providers: {
1722
+ services: {
1723
1723
  hulu: { channelSelector: "STARZ Encore Español (East)", url: "https://www.hulu.com/live" },
1724
1724
  sling: { channelSelector: "Starz Encore Español", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1725
1725
  },
1726
1726
  },
1727
1727
  starzencoreespanolp: {
1728
1728
  name: "Starz Encore Español (Pacific)",
1729
- tags: ["movies", "starz"],
1729
+ tags: ["Movies", "Starz"],
1730
1730
  stationId: "104730",
1731
- providers: {
1731
+ services: {
1732
1732
  hulu: { channelSelector: "STARZ Encore Español (West)", url: "https://www.hulu.com/live" },
1733
1733
  },
1734
1734
  },
1735
1735
  starzencorefamily: {
1736
1736
  name: "Starz Encore Family",
1737
- tags: ["kids", "movies", "starz"],
1737
+ tags: ["Kids", "Movies", "Starz"],
1738
1738
  stationId: "14886",
1739
- providers: {
1739
+ services: {
1740
1740
  hulu: { channelSelector: "STARZ Encore Family (East)", url: "https://www.hulu.com/live" },
1741
1741
  sling: { channelSelector: "Starz Encore Family", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1742
1742
  },
1743
1743
  },
1744
1744
  starzencorefamilyp: {
1745
1745
  name: "Starz Encore Family (Pacific)",
1746
- tags: ["kids", "movies", "starz"],
1746
+ tags: ["Kids", "Movies", "Starz"],
1747
1747
  stationId: "103829",
1748
- providers: {
1748
+ services: {
1749
1749
  hulu: { channelSelector: "STARZ Encore Family (West)", url: "https://www.hulu.com/live" },
1750
1750
  },
1751
1751
  },
1752
1752
  starzencorep: {
1753
1753
  name: "Starz Encore (Pacific)",
1754
- tags: ["movies", "starz"],
1754
+ tags: ["Movies", "Starz"],
1755
1755
  stationId: "67237",
1756
- providers: {
1756
+ services: {
1757
1757
  hulu: { channelSelector: "STARZ Encore (West)", url: "https://www.hulu.com/live" },
1758
1758
  sling: { channelSelector: "Starz Encore West", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1759
1759
  },
1760
1760
  },
1761
1761
  starzencoresuspense: {
1762
1762
  name: "Starz Encore Suspense",
1763
- tags: ["movies", "starz"],
1763
+ tags: ["Movies", "Starz"],
1764
1764
  stationId: "83076",
1765
- providers: {
1765
+ services: {
1766
1766
  hulu: { channelSelector: "STARZ Encore Suspense (East)", url: "https://www.hulu.com/live" },
1767
1767
  sling: { channelSelector: "Starz Encore Suspense", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1768
1768
  },
1769
1769
  },
1770
1770
  starzencoresuspensep: {
1771
1771
  name: "Starz Encore Suspense (Pacific)",
1772
- tags: ["movies", "starz"],
1772
+ tags: ["Movies", "Starz"],
1773
1773
  stationId: "103836",
1774
- providers: {
1774
+ services: {
1775
1775
  hulu: { channelSelector: "STARZ Encore Suspense (West)", url: "https://www.hulu.com/live" },
1776
1776
  },
1777
1777
  },
1778
1778
  starzencorewesterns: {
1779
1779
  name: "Starz Encore Westerns",
1780
- tags: ["movies", "starz"],
1780
+ tags: ["Movies", "Starz"],
1781
1781
  stationId: "14765",
1782
- providers: {
1782
+ services: {
1783
1783
  hulu: { channelSelector: "STARZ Encore Westerns (East)", url: "https://www.hulu.com/live" },
1784
1784
  sling: { channelSelector: "Starz Encore Westerns", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1785
1785
  },
1786
1786
  },
1787
1787
  starzencorewesternsp: {
1788
1788
  name: "Starz Encore Westerns (Pacific)",
1789
- tags: ["movies", "starz"],
1789
+ tags: ["Movies", "Starz"],
1790
1790
  stationId: "103856",
1791
- providers: {
1791
+ services: {
1792
1792
  hulu: { channelSelector: "STARZ Encore Westerns (West)", url: "https://www.hulu.com/live" },
1793
1793
  },
1794
1794
  },
1795
1795
  starzinblack: {
1796
1796
  name: "Starz in Black",
1797
- tags: ["movies", "starz"],
1797
+ tags: ["Movies", "Starz"],
1798
1798
  stationId: "67235",
1799
- providers: {
1799
+ services: {
1800
1800
  hulu: { channelSelector: "STARZ in Black (East)", url: "https://www.hulu.com/live" },
1801
1801
  sling: { channelSelector: "Starz in Black", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1802
1802
  },
1803
1803
  },
1804
1804
  starzinblackp: {
1805
1805
  name: "Starz in Black (Pacific)",
1806
- tags: ["movies", "starz"],
1806
+ tags: ["Movies", "Starz"],
1807
1807
  stationId: "67367",
1808
- providers: {
1808
+ services: {
1809
1809
  hulu: { channelSelector: "STARZ in Black (West)", url: "https://www.hulu.com/live" },
1810
1810
  },
1811
1811
  },
1812
1812
  starzkids: {
1813
1813
  name: "Starz Kids",
1814
- tags: ["kids", "starz"],
1814
+ tags: ["Kids", "Starz"],
1815
1815
  stationId: "57581",
1816
- providers: {
1816
+ services: {
1817
1817
  hulu: { channelSelector: "STARZ Kids (East)", url: "https://www.hulu.com/live" },
1818
1818
  sling: { channelSelector: "Starz Kids", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1819
1819
  },
1820
1820
  },
1821
1821
  starzkidsp: {
1822
1822
  name: "Starz Kids (Pacific)",
1823
- tags: ["kids", "starz"],
1823
+ tags: ["Kids", "Starz"],
1824
1824
  stationId: "57583",
1825
- providers: {
1825
+ services: {
1826
1826
  hulu: { channelSelector: "STARZ Kids (West)", url: "https://www.hulu.com/live" },
1827
1827
  },
1828
1828
  },
1829
1829
  starzp: {
1830
1830
  name: "Starz (Pacific)",
1831
- tags: ["movies", "starz"],
1831
+ tags: ["Movies", "Starz"],
1832
1832
  stationId: "34949",
1833
- providers: {
1833
+ services: {
1834
1834
  hulu: { channelSelector: "STARZ (West)", url: "https://www.hulu.com/live" },
1835
1835
  sling: { channelSelector: "Starz West", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
1836
1836
  },
1837
1837
  },
1838
1838
  sundancetv: {
1839
1839
  name: "SundanceTV",
1840
- tags: ["movies"],
1840
+ tags: ["Movies"],
1841
1841
  pacificStationId: "78806",
1842
1842
  stationId: "71280",
1843
- providers: {
1843
+ services: {
1844
1844
  cox: { channelSelector: "SundanceTV", url: "https://watchtv.cox.com/listings" },
1845
1845
  directv: { channelSelector: "Sundance TV", url: "https://stream.directv.com" },
1846
1846
  spectrum: { channelSelector: "SundanceTV", url: "https://watch.spectrum.net/guide" },
@@ -1850,9 +1850,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1850
1850
  },
1851
1851
  syfy: {
1852
1852
  name: "Syfy",
1853
- tags: ["entertainment"],
1853
+ tags: ["Entertainment"],
1854
1854
  stationId: "58623",
1855
- providers: {
1855
+ services: {
1856
1856
  cox: { channelSelector: "SYFY", url: "https://watchtv.cox.com/listings" },
1857
1857
  directv: { channelSelector: "Syfy", url: "https://stream.directv.com" },
1858
1858
  hulu: { channelSelector: "SYFY", url: "https://www.hulu.com/live" },
@@ -1865,17 +1865,17 @@ const BASE_CHANNEL_DEFINITIONS = {
1865
1865
  },
1866
1866
  syfyp: {
1867
1867
  name: "Syfy (Pacific)",
1868
- tags: ["entertainment"],
1868
+ tags: ["Entertainment"],
1869
1869
  stationId: "65626",
1870
- providers: {
1870
+ services: {
1871
1871
  site: { channelSelector: "Syfy_West", url: "https://www.usanetwork.com/live" },
1872
1872
  },
1873
1873
  },
1874
1874
  tbs: {
1875
1875
  name: "TBS",
1876
- tags: ["entertainment"],
1876
+ tags: ["Entertainment"],
1877
1877
  stationId: "58515",
1878
- providers: {
1878
+ services: {
1879
1879
  cox: { channelSelector: "TBS", url: "https://watchtv.cox.com/listings" },
1880
1880
  directv: { channelSelector: "TBS", url: "https://stream.directv.com" },
1881
1881
  hulu: { channelSelector: "TBS (East)", url: "https://www.hulu.com/live" },
@@ -1888,18 +1888,18 @@ const BASE_CHANNEL_DEFINITIONS = {
1888
1888
  },
1889
1889
  tbsp: {
1890
1890
  name: "TBS (Pacific)",
1891
- tags: ["entertainment"],
1891
+ tags: ["Entertainment"],
1892
1892
  stationId: "67890",
1893
- providers: {
1893
+ services: {
1894
1894
  hulu: { channelSelector: "TBS (West)", url: "https://www.hulu.com/live" },
1895
1895
  site: { url: "https://www.tbs.com/watchtbs/west" },
1896
1896
  },
1897
1897
  },
1898
1898
  tcm: {
1899
1899
  name: "TCM",
1900
- tags: ["movies"],
1900
+ tags: ["Movies"],
1901
1901
  stationId: "64312",
1902
- providers: {
1902
+ services: {
1903
1903
  cox: { channelSelector: "TCM", url: "https://watchtv.cox.com/listings" },
1904
1904
  directv: { channelSelector: "TCM", url: "https://stream.directv.com" },
1905
1905
  hulu: { channelSelector: "TCM (East)", url: "https://www.hulu.com/live" },
@@ -1910,18 +1910,18 @@ const BASE_CHANNEL_DEFINITIONS = {
1910
1910
  },
1911
1911
  tcmp: {
1912
1912
  name: "TCM (Pacific)",
1913
- tags: ["movies"],
1913
+ tags: ["Movies"],
1914
1914
  stationId: "64312",
1915
1915
  tvgShift: 3,
1916
- providers: {
1916
+ services: {
1917
1917
  hulu: { channelSelector: "TCM (West)", url: "https://www.hulu.com/live" },
1918
1918
  },
1919
1919
  },
1920
1920
  tennis: {
1921
1921
  name: "Tennis Channel",
1922
- tags: ["sports"],
1922
+ tags: ["Sports"],
1923
1923
  stationId: "60316",
1924
- providers: {
1924
+ services: {
1925
1925
  cox: { channelSelector: "Tennis Channel", url: "https://watchtv.cox.com/listings" },
1926
1926
  directv: { channelSelector: "Tennis Channel HD", url: "https://stream.directv.com" },
1927
1927
  spectrum: { channelSelector: "Tennis Channel", url: "https://watch.spectrum.net/guide" },
@@ -1931,9 +1931,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1931
1931
  },
1932
1932
  tennis2: {
1933
1933
  name: "Tennis Channel 2",
1934
- tags: ["sports"],
1934
+ tags: ["Sports"],
1935
1935
  stationId: "137752",
1936
- providers: {
1936
+ services: {
1937
1937
  cox: { channelSelector: "T2", url: "https://watchtv.cox.com/listings" },
1938
1938
  hulu: { channelSelector: "Tennis Channel 2", url: "https://www.hulu.com/live" },
1939
1939
  sling: { channelSelector: "T2", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
@@ -1943,10 +1943,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1943
1943
  },
1944
1944
  tlc: {
1945
1945
  name: "TLC",
1946
- tags: ["lifestyle"],
1946
+ tags: ["Lifestyle"],
1947
1947
  pacificStationId: "79911",
1948
1948
  stationId: "57391",
1949
- providers: {
1949
+ services: {
1950
1950
  cox: { channelSelector: "TLC", url: "https://watchtv.cox.com/listings" },
1951
1951
  directv: { channelSelector: "TLC", url: "https://stream.directv.com" },
1952
1952
  hulu: { channelSelector: "TLC", url: "https://www.hulu.com/live" },
@@ -1959,9 +1959,9 @@ const BASE_CHANNEL_DEFINITIONS = {
1959
1959
  },
1960
1960
  tnt: {
1961
1961
  name: "TNT",
1962
- tags: ["entertainment"],
1962
+ tags: ["Entertainment"],
1963
1963
  stationId: "42642",
1964
- providers: {
1964
+ services: {
1965
1965
  cox: { channelSelector: "TNT", url: "https://watchtv.cox.com/listings" },
1966
1966
  directv: { channelSelector: "TNT", url: "https://stream.directv.com" },
1967
1967
  hulu: { channelSelector: "TNT (East)", url: "https://www.hulu.com/live" },
@@ -1974,19 +1974,19 @@ const BASE_CHANNEL_DEFINITIONS = {
1974
1974
  },
1975
1975
  tntp: {
1976
1976
  name: "TNT (Pacific)",
1977
- tags: ["entertainment"],
1977
+ tags: ["Entertainment"],
1978
1978
  stationId: "61340",
1979
- providers: {
1979
+ services: {
1980
1980
  hulu: { channelSelector: "TNT (West)", url: "https://www.hulu.com/live" },
1981
1981
  site: { url: "https://www.tntdrama.com/watchtnt/west" },
1982
1982
  },
1983
1983
  },
1984
1984
  travel: {
1985
1985
  name: "Travel",
1986
- tags: ["lifestyle"],
1986
+ tags: ["Lifestyle"],
1987
1987
  pacificStationId: "64525",
1988
1988
  stationId: "59303",
1989
- providers: {
1989
+ services: {
1990
1990
  cox: { channelSelector: "Travel Channel", url: "https://watchtv.cox.com/listings" },
1991
1991
  directv: { channelSelector: "Travel Channel", url: "https://stream.directv.com" },
1992
1992
  hulu: { channelSelector: "Travel Channel", url: "https://www.hulu.com/live" },
@@ -1999,10 +1999,10 @@ const BASE_CHANNEL_DEFINITIONS = {
1999
1999
  },
2000
2000
  trutv: {
2001
2001
  name: "truTV",
2002
- tags: ["entertainment"],
2002
+ tags: ["Entertainment"],
2003
2003
  pacificStationId: "65717",
2004
2004
  stationId: "64490",
2005
- providers: {
2005
+ services: {
2006
2006
  cox: { channelSelector: "truTV", url: "https://watchtv.cox.com/listings" },
2007
2007
  directv: { channelSelector: "truTV", url: "https://stream.directv.com" },
2008
2008
  hulu: { channelSelector: "truTV (East)", url: "https://www.hulu.com/live" },
@@ -2015,18 +2015,18 @@ const BASE_CHANNEL_DEFINITIONS = {
2015
2015
  },
2016
2016
  trutvp: {
2017
2017
  name: "truTV (Pacific)",
2018
- tags: ["entertainment"],
2018
+ tags: ["Entertainment"],
2019
2019
  stationId: "65717",
2020
- providers: {
2020
+ services: {
2021
2021
  hulu: { channelSelector: "truTV (West)", url: "https://www.hulu.com/live" },
2022
2022
  },
2023
2023
  },
2024
2024
  tvland: {
2025
2025
  name: "TV Land",
2026
- tags: ["entertainment"],
2026
+ tags: ["Entertainment"],
2027
2027
  pacificStationId: "74134",
2028
2028
  stationId: "73541",
2029
- providers: {
2029
+ services: {
2030
2030
  cox: { channelSelector: "TV Land", url: "https://watchtv.cox.com/listings" },
2031
2031
  directv: { channelSelector: "TV Land", url: "https://stream.directv.com" },
2032
2032
  hulu: { channelSelector: "TV Land", url: "https://www.hulu.com/live" },
@@ -2037,9 +2037,9 @@ const BASE_CHANNEL_DEFINITIONS = {
2037
2037
  },
2038
2038
  usa: {
2039
2039
  name: "USA Network",
2040
- tags: ["entertainment"],
2040
+ tags: ["Entertainment"],
2041
2041
  stationId: "58452",
2042
- providers: {
2042
+ services: {
2043
2043
  cox: { channelSelector: "USA", url: "https://watchtv.cox.com/listings" },
2044
2044
  directv: { channelSelector: "USA Network", url: "https://stream.directv.com" },
2045
2045
  hulu: { channelSelector: "USA", url: "https://www.hulu.com/live" },
@@ -2052,18 +2052,18 @@ const BASE_CHANNEL_DEFINITIONS = {
2052
2052
  },
2053
2053
  usap: {
2054
2054
  name: "USA Network (Pacific)",
2055
- tags: ["entertainment"],
2055
+ tags: ["Entertainment"],
2056
2056
  stationId: "74030",
2057
- providers: {
2057
+ services: {
2058
2058
  site: { channelSelector: "USA_West", url: "https://www.usanetwork.com/live" },
2059
2059
  },
2060
2060
  },
2061
2061
  vh1: {
2062
2062
  name: "VH1",
2063
- tags: ["entertainment"],
2063
+ tags: ["Entertainment"],
2064
2064
  pacificStationId: "64634",
2065
2065
  stationId: "60046",
2066
- providers: {
2066
+ services: {
2067
2067
  cox: { channelSelector: "VH1", url: "https://watchtv.cox.com/listings" },
2068
2068
  directv: { channelSelector: "VH1", url: "https://stream.directv.com" },
2069
2069
  hulu: { channelSelector: "VH1", url: "https://www.hulu.com/live" },
@@ -2075,10 +2075,10 @@ const BASE_CHANNEL_DEFINITIONS = {
2075
2075
  },
2076
2076
  vice: {
2077
2077
  name: "Vice",
2078
- tags: ["entertainment"],
2078
+ tags: ["Entertainment"],
2079
2079
  pacificStationId: "92375",
2080
2080
  stationId: "65732",
2081
- providers: {
2081
+ services: {
2082
2082
  cox: { channelSelector: "VICE", url: "https://watchtv.cox.com/listings" },
2083
2083
  directv: { channelSelector: "VICE", url: "https://stream.directv.com" },
2084
2084
  hulu: { channelSelector: "Vice", url: "https://www.hulu.com/live" },
@@ -2089,9 +2089,9 @@ const BASE_CHANNEL_DEFINITIONS = {
2089
2089
  },
2090
2090
  weather: {
2091
2091
  name: "The Weather Channel",
2092
- tags: ["news"],
2092
+ tags: ["News"],
2093
2093
  stationId: "58812",
2094
- providers: {
2094
+ services: {
2095
2095
  cox: { channelSelector: "Weather Channel", url: "https://watchtv.cox.com/listings" },
2096
2096
  directv: { channelSelector: "The Weather Channel HD", url: "https://stream.directv.com" },
2097
2097
  hulu: { channelSelector: "The Weather Channel", url: "https://www.hulu.com/live" },
@@ -2102,10 +2102,10 @@ const BASE_CHANNEL_DEFINITIONS = {
2102
2102
  },
2103
2103
  wetv: {
2104
2104
  name: "WE tv",
2105
- tags: ["entertainment"],
2105
+ tags: ["Entertainment"],
2106
2106
  pacificStationId: "108192",
2107
2107
  stationId: "59296",
2108
- providers: {
2108
+ services: {
2109
2109
  cox: { channelSelector: "WE tv", url: "https://watchtv.cox.com/listings" },
2110
2110
  directv: { channelSelector: "WE TV", url: "https://stream.directv.com" },
2111
2111
  spectrum: { channelSelector: "WE tv", url: "https://watch.spectrum.net/guide" },
@@ -2115,9 +2115,9 @@ const BASE_CHANNEL_DEFINITIONS = {
2115
2115
  },
2116
2116
  yes: {
2117
2117
  name: "YES Network",
2118
- tags: ["sports"],
2118
+ tags: ["Sports"],
2119
2119
  stationId: "63558",
2120
- providers: {
2120
+ services: {
2121
2121
  directv: { channelSelector: "Yes Network HD", url: "https://stream.directv.com" },
2122
2122
  spectrum: { channelSelector: "YES Network", url: "https://watch.spectrum.net/guide" },
2123
2123
  },
@@ -2126,36 +2126,36 @@ const BASE_CHANNEL_DEFINITIONS = {
2126
2126
  /* eslint-enable @hjdhjd/blank-line-after-open-brace, @stylistic/comma-dangle, sort-keys */
2127
2127
  // Pacific channel auto-generation.
2128
2128
  /* PrismCast automatically generates Pacific timezone channel definitions to reduce manual maintenance. Generation runs at module load, producing definitions
2129
- * that are functionally identical to hand-written ones. Generated definitions never override manually-defined ones — if a key already exists in
2129
+ * that are functionally identical to hand-written ones. Generated definitions never override manually-defined ones - if a key already exists in
2130
2130
  * BASE_CHANNEL_DEFINITIONS, the manual definition takes precedence.
2131
2131
  *
2132
- * Step 1 — Generate Pacific ChannelDefinitions from East entries with pacificStationId:
2132
+ * Step 1 - Generate Pacific ChannelDefinitions from East entries with pacificStationId:
2133
2133
  *
2134
2134
  * When an East definition has a pacificStationId field and no "{key}p" entry exists in BASE_CHANNEL_DEFINITIONS, a new Pacific ChannelDefinition is created
2135
- * with the Pacific station ID, " (Pacific)" appended to the name, and an empty providers map (to be filled by Step 2).
2135
+ * with the Pacific station ID, " (Pacific)" appended to the name, and an empty services map (to be filled by Step 2).
2136
2136
  *
2137
- * Example — adding pacificStationId to the East definition:
2138
- * animal: { name: "Animal Planet", pacificStationId: "68785", stationId: "57394", providers: { ... } }
2137
+ * Example - adding pacificStationId to the East definition:
2138
+ * animal: { name: "Animal Planet", pacificStationId: "68785", stationId: "57394", services: { ... } }
2139
2139
  * Auto-generates:
2140
- * animalp: { name: "Animal Planet (Pacific)", stationId: "68785", providers: {} }
2140
+ * animalp: { name: "Animal Planet (Pacific)", stationId: "68785", services: {} }
2141
2141
  *
2142
- * Step 2 — Merge East providers into Pacific definitions:
2142
+ * Step 2 - Merge East services into Pacific definitions:
2143
2143
  *
2144
- * For every Pacific definition "{key}p" (manual or generated), if a corresponding East definition "{key}" exists, its providers are merged into the Pacific
2145
- * definition. Providers are skipped if: (a) they already exist in the Pacific definition, or (b) their channelSelector contains "East" or "West" (these have
2144
+ * For every Pacific definition "{key}p" (manual or generated), if a corresponding East definition "{key}" exists, its services are merged into the Pacific
2145
+ * definition. Services are skipped if: (a) they already exist in the Pacific definition, or (b) their channelSelector contains "East" or "West" (these have
2146
2146
  * timezone-specific entries and need manual Pacific definitions with the correct West selector).
2147
2147
  *
2148
- * Example — East providers merged into auto-generated Pacific:
2149
- * animal's cox provider: { channelSelector: "Animal Planet", url: "https://watchtv.cox.com/listings" }
2148
+ * Example - East services merged into auto-generated Pacific:
2149
+ * animal's cox service: { channelSelector: "Animal Planet", url: "https://watchtv.cox.com/listings" }
2150
2150
  * Merges into animalp as:
2151
- * animalp's cox provider: { channelSelector: "Animal Planet", url: "https://watchtv.cox.com/listings" }
2151
+ * animalp's cox service: { channelSelector: "Animal Planet", url: "https://watchtv.cox.com/listings" }
2152
2152
  *
2153
2153
  * Adding a new channel with Pacific support:
2154
2154
  *
2155
2155
  * 1. Look up both East and Pacific HD station IDs in Gracenote (http://localhost:8089/tms/stations/<search>).
2156
- * 2. Add the East definition with both IDs: mychannel: { name: "...", pacificStationId: "PACIFIC_ID", stationId: "EAST_ID", providers: { ... } }
2157
- * 3. The system auto-generates mychannelp (Pacific definition) and merges all compatible providers.
2158
- * 4. If the Pacific version needs a different URL or channelSelector for specific providers, define mychannelp manually with those overrides.
2156
+ * 2. Add the East definition with both IDs: mychannel: { name: "...", pacificStationId: "PACIFIC_ID", stationId: "EAST_ID", services: { ... } }
2157
+ * 3. The system auto-generates mychannelp (Pacific definition) and merges all compatible services.
2158
+ * 4. If the Pacific version needs a different URL or channelSelector for specific services, define mychannelp manually with those overrides.
2159
2159
  */
2160
2160
  function generatePacificDefinitions(definitions) {
2161
2161
  const eastWestPattern = /east|west/i;
@@ -2172,15 +2172,15 @@ function generatePacificDefinitions(definitions) {
2172
2172
  }
2173
2173
  generated[pacificKey] = {
2174
2174
  name: def.name + " (Pacific)",
2175
- providers: {},
2175
+ services: {},
2176
2176
  stationId: def.pacificStationId,
2177
2177
  ...(def.tags ? { tags: def.tags } : {})
2178
2178
  };
2179
2179
  }
2180
2180
  // Merge base and generated for Pacific lookup in Step 2.
2181
2181
  const allDefinitions = { ...definitions, ...generated };
2182
- // Step 2: Merge East providers into Pacific definitions (both manual and generated). For manually-defined Pacific entries, we create a copy with a fresh
2183
- // providers map to avoid mutating the input definitions.
2182
+ // Step 2: Merge East services into Pacific definitions (both manual and generated). For manually-defined Pacific entries, we create a copy with a fresh
2183
+ // services map to avoid mutating the input definitions.
2184
2184
  for (const [pacKey, originalPacDef] of Object.entries(allDefinitions)) {
2185
2185
  // Only process Pacific keys (ending in "p" with a corresponding East key).
2186
2186
  if (!pacKey.endsWith("p")) {
@@ -2192,20 +2192,20 @@ function generatePacificDefinitions(definitions) {
2192
2192
  if (!eastDef) {
2193
2193
  continue;
2194
2194
  }
2195
- // Create a copy with a fresh providers map so we never mutate the input definitions (which are the module-level BASE_CHANNEL_DEFINITIONS).
2196
- const pacDef = { ...originalPacDef, providers: { ...originalPacDef.providers } };
2197
- // Merge each East provider into the Pacific definition, skipping existing and East/West-specific selectors.
2198
- for (const [slug, variant] of Object.entries(eastDef.providers)) {
2199
- // Don't overwrite existing Pacific providers (manual overrides take precedence).
2200
- if (slug in pacDef.providers) {
2195
+ // Create a copy with a fresh services map so we never mutate the input definitions (which are the module-level BASE_CHANNEL_DEFINITIONS).
2196
+ const pacDef = { ...originalPacDef, services: { ...originalPacDef.services } };
2197
+ // Merge each East service into the Pacific definition, skipping existing and East/West-specific selectors.
2198
+ for (const [slug, variant] of Object.entries(eastDef.services)) {
2199
+ // Don't overwrite existing Pacific services (manual overrides take precedence).
2200
+ if (slug in pacDef.services) {
2201
2201
  continue;
2202
2202
  }
2203
- // Skip providers with timezone-specific channelSelectors — these need manual Pacific entries.
2203
+ // Skip services with timezone-specific channelSelectors - these need manual Pacific entries.
2204
2204
  if (variant.channelSelector && eastWestPattern.test(variant.channelSelector)) {
2205
2205
  continue;
2206
2206
  }
2207
- // Copy the provider variant. We spread to create a new object so the East and Pacific definitions don't share references.
2208
- pacDef.providers[slug] = { ...variant };
2207
+ // Copy the service variant. We spread to create a new object so the East and Pacific definitions don't share references.
2208
+ pacDef.services[slug] = { ...variant };
2209
2209
  }
2210
2210
  generated[pacKey] = pacDef;
2211
2211
  }
@@ -2213,41 +2213,41 @@ function generatePacificDefinitions(definitions) {
2213
2213
  }
2214
2214
  // Channel definition flattener.
2215
2215
  /* The flattener compiles nested ChannelDefinition entries into the flat ChannelMap consumed by the rest of the codebase. For each definition, it produces a
2216
- * canonical flat entry (keyed by the definition key) and variant flat entries (keyed as "{definitionKey}-{providerSlug}").
2216
+ * canonical flat entry (keyed by the definition key) and variant flat entries (keyed as "{definitionKey}-{serviceSlug}").
2217
2217
  *
2218
2218
  * Canonical resolution:
2219
- * 1. If "site" exists in providers, the site provider populates the canonical entry. No "{key}-site" variant is emitted.
2220
- * 2. Otherwise, providers are sorted alphabetically by key. The first provider populates the canonical entry. No variant key is emitted for it.
2221
- * 3. All remaining providers produce variant entries keyed as "{key}-{slug}".
2219
+ * 1. If "site" exists in services, the site service populates the canonical entry. No "{key}-site" variant is emitted.
2220
+ * 2. Otherwise, services are sorted alphabetically by key. The first service populates the canonical entry. No variant key is emitted for it.
2221
+ * 3. All remaining services produce variant entries keyed as "{key}-{slug}".
2222
2222
  *
2223
- * Identity fields (name, stationId, channelNumber, tvgShift) are set on the canonical entry and inherited by all variants. Provider-specific fields
2224
- * (channelSelector, url, profile, etc.) come from each ProviderVariant. ProviderVariant fields override ChannelDefinition fields when both are set.
2223
+ * Identity fields (name, stationId, channelNumber, tvgShift) are set on the canonical entry and inherited by all variants. Service-specific fields
2224
+ * (channelSelector, url, profile, etc.) come from each ServiceVariant. ServiceVariant fields override ChannelDefinition fields when both are set.
2225
2225
  */
2226
2226
  function flattenChannelDefinitions(definitions) {
2227
2227
  const channels = {};
2228
2228
  for (const [key, def] of Object.entries(definitions)) {
2229
- const slugs = Object.keys(def.providers).sort();
2229
+ const slugs = Object.keys(def.services).sort();
2230
2230
  if (slugs.length === 0) {
2231
2231
  continue;
2232
2232
  }
2233
- // Determine the canonical provider: "site" wins, otherwise first alphabetically.
2233
+ // Determine the canonical service: "site" wins, otherwise first alphabetically.
2234
2234
  const canonicalSlug = slugs.includes(SITE_KEY) ? SITE_KEY : slugs[0];
2235
- const canonicalVariant = def.providers[canonicalSlug];
2236
- // Build the canonical flat entry with identity fields + canonical provider's fields. pacificStationId is set only on the canonical entry — it drives Pacific
2237
- // auto-generation and is not meaningful on provider variants.
2235
+ const canonicalVariant = def.services[canonicalSlug];
2236
+ // Build the canonical flat entry with identity fields + canonical service's fields. pacificStationId is set only on the canonical entry - it drives Pacific
2237
+ // auto-generation and is not meaningful on service variants.
2238
2238
  const canonicalEntry = buildFlatEntry(def, canonicalVariant);
2239
2239
  if (def.pacificStationId) {
2240
2240
  canonicalEntry.pacificStationId = def.pacificStationId;
2241
2241
  }
2242
2242
  channels[key] = canonicalEntry;
2243
- // Build variant entries for all non-canonical providers. Each variant gets canonicalKey set to the definition key so that buildProviderGroups can group
2244
- // channels by a single mechanism — scanning canonicalKey — regardless of whether the channel is predefined or user-defined.
2243
+ // Build variant entries for all non-canonical services. Each variant gets canonicalKey set to the definition key so that buildServiceGroups can group
2244
+ // channels by a single mechanism - scanning canonicalKey - regardless of whether the channel is predefined or user-defined.
2245
2245
  for (const slug of slugs) {
2246
2246
  if (slug === canonicalSlug) {
2247
2247
  continue;
2248
2248
  }
2249
2249
  const variantKey = key + "-" + slug;
2250
- const variant = def.providers[slug];
2250
+ const variant = def.services[slug];
2251
2251
  const variantEntry = buildFlatEntry(def, variant);
2252
2252
  variantEntry.canonicalKey = key;
2253
2253
  channels[variantKey] = variantEntry;
@@ -2256,10 +2256,10 @@ function flattenChannelDefinitions(definitions) {
2256
2256
  return channels;
2257
2257
  }
2258
2258
  /**
2259
- * Builds a flat Channel entry by merging a ChannelDefinition's identity fields with a ProviderVariant's provider-specific fields. ProviderVariant fields
2259
+ * Builds a flat Channel entry by merging a ChannelDefinition's identity fields with a ServiceVariant's service-specific fields. ServiceVariant fields
2260
2260
  * override ChannelDefinition fields when both are set.
2261
2261
  * @param def - The parent ChannelDefinition with identity fields.
2262
- * @param variant - The ProviderVariant with provider-specific fields.
2262
+ * @param variant - The ServiceVariant with service-specific fields.
2263
2263
  * @returns A flat Channel entry.
2264
2264
  */
2265
2265
  function buildFlatEntry(def, variant) {
@@ -2284,8 +2284,8 @@ function buildFlatEntry(def, variant) {
2284
2284
  if (def.tvgShift !== undefined) {
2285
2285
  entry.tvgShift = def.tvgShift;
2286
2286
  }
2287
- // Provider-specific fields from ProviderVariant.
2288
- const variantKeys = ["channelSelector", "dismissSelector", "profile", "provider", "scrollSelector", "scrollTarget", "scrollToBottom"];
2287
+ // Service-specific fields from ServiceVariant.
2288
+ const variantKeys = ["channelSelector", "dismissSelector", "profile", "scrollSelector", "scrollTarget", "scrollToBottom", "service"];
2289
2289
  for (const key of variantKeys) {
2290
2290
  if (variant[key] !== undefined) {
2291
2291
  entry[key] = variant[key];
@@ -2295,7 +2295,7 @@ function buildFlatEntry(def, variant) {
2295
2295
  }
2296
2296
  // Compile the nested definitions into flat output.
2297
2297
  // Pacific-generated entries take precedence over base entries because Step 2 of Pacific generation produces enhanced copies of manual Pacific definitions
2298
- // (e.g., cartoonp with merged East providers). Base entries for non-Pacific keys are unaffected since they don't appear in the generated map.
2298
+ // (e.g., cartoonp with merged East services). Base entries for non-Pacific keys are unaffected since they don't appear in the generated map.
2299
2299
  const allDefinitions = { ...BASE_CHANNEL_DEFINITIONS, ...generatePacificDefinitions(BASE_CHANNEL_DEFINITIONS) };
2300
2300
  const CHANNELS = flattenChannelDefinitions(allDefinitions);
2301
2301
  export { CHANNELS, CHANNELS as PREDEFINED_CHANNELS };