prismcast 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/app.js +18 -1
  2. package/dist/app.js.map +1 -1
  3. package/dist/browser/cdp.d.ts +2 -1
  4. package/dist/browser/cdp.js +44 -23
  5. package/dist/browser/cdp.js.map +1 -1
  6. package/dist/browser/channelSelection.d.ts +45 -1
  7. package/dist/browser/channelSelection.js +164 -27
  8. package/dist/browser/channelSelection.js.map +1 -1
  9. package/dist/browser/display.d.ts +0 -4
  10. package/dist/browser/display.js +0 -7
  11. package/dist/browser/display.js.map +1 -1
  12. package/dist/browser/index.d.ts +5 -0
  13. package/dist/browser/index.js +14 -0
  14. package/dist/browser/index.js.map +1 -1
  15. package/dist/browser/precaching.d.ts +5 -0
  16. package/dist/browser/precaching.js +112 -0
  17. package/dist/browser/precaching.js.map +1 -0
  18. package/dist/browser/tuning/directv.d.ts +2 -0
  19. package/dist/browser/tuning/directv.js +723 -0
  20. package/dist/browser/tuning/directv.js.map +1 -0
  21. package/dist/browser/tuning/fox.d.ts +2 -2
  22. package/dist/browser/tuning/fox.js +141 -22
  23. package/dist/browser/tuning/fox.js.map +1 -1
  24. package/dist/browser/tuning/hbo.d.ts +2 -2
  25. package/dist/browser/tuning/hbo.js +110 -41
  26. package/dist/browser/tuning/hbo.js.map +1 -1
  27. package/dist/browser/tuning/hulu.d.ts +2 -2
  28. package/dist/browser/tuning/hulu.js +442 -168
  29. package/dist/browser/tuning/hulu.js.map +1 -1
  30. package/dist/browser/tuning/sling.d.ts +2 -2
  31. package/dist/browser/tuning/sling.js +200 -56
  32. package/dist/browser/tuning/sling.js.map +1 -1
  33. package/dist/browser/tuning/youtubeTv.d.ts +2 -2
  34. package/dist/browser/tuning/youtubeTv.js +243 -57
  35. package/dist/browser/tuning/youtubeTv.js.map +1 -1
  36. package/dist/browser/video.d.ts +1 -1
  37. package/dist/browser/video.js +4 -2
  38. package/dist/browser/video.js.map +1 -1
  39. package/dist/channels/index.js +280 -34
  40. package/dist/channels/index.js.map +1 -1
  41. package/dist/config/health.d.ts +78 -0
  42. package/dist/config/health.js +202 -0
  43. package/dist/config/health.js.map +1 -0
  44. package/dist/config/paths.d.ts +10 -0
  45. package/dist/config/paths.js +14 -0
  46. package/dist/config/paths.js.map +1 -1
  47. package/dist/config/profiles.d.ts +6 -4
  48. package/dist/config/profiles.js +65 -14
  49. package/dist/config/profiles.js.map +1 -1
  50. package/dist/config/providerPacks.d.ts +46 -0
  51. package/dist/config/providerPacks.js +200 -0
  52. package/dist/config/providerPacks.js.map +1 -0
  53. package/dist/config/providers.d.ts +36 -3
  54. package/dist/config/providers.js +168 -8
  55. package/dist/config/providers.js.map +1 -1
  56. package/dist/config/sites.d.ts +1 -12
  57. package/dist/config/sites.js +38 -5
  58. package/dist/config/sites.js.map +1 -1
  59. package/dist/config/userChannels.d.ts +12 -0
  60. package/dist/config/userChannels.js +81 -14
  61. package/dist/config/userChannels.js.map +1 -1
  62. package/dist/config/userConfig.d.ts +5 -1
  63. package/dist/config/userConfig.js +58 -6
  64. package/dist/config/userConfig.js.map +1 -1
  65. package/dist/config/userProfiles.d.ts +81 -0
  66. package/dist/config/userProfiles.js +424 -0
  67. package/dist/config/userProfiles.js.map +1 -0
  68. package/dist/routes/config/channels/index.d.ts +3 -0
  69. package/dist/routes/config/channels/index.js +3 -0
  70. package/dist/routes/config/channels/index.js.map +1 -0
  71. package/dist/routes/config/channels/routes.d.ts +6 -0
  72. package/dist/routes/config/channels/routes.js +797 -0
  73. package/dist/routes/config/channels/routes.js.map +1 -0
  74. package/dist/routes/config/channels/table.d.ts +46 -0
  75. package/dist/routes/config/channels/table.js +811 -0
  76. package/dist/routes/config/channels/table.js.map +1 -0
  77. package/dist/routes/config/index.d.ts +37 -0
  78. package/dist/routes/config/index.js +81 -0
  79. package/dist/routes/config/index.js.map +1 -0
  80. package/dist/routes/config/providers.d.ts +18 -0
  81. package/dist/routes/config/providers.js +573 -0
  82. package/dist/routes/config/providers.js.map +1 -0
  83. package/dist/routes/config/settings.d.ts +39 -0
  84. package/dist/routes/config/settings.js +820 -0
  85. package/dist/routes/config/settings.js.map +1 -0
  86. package/dist/routes/index.d.ts +3 -2
  87. package/dist/routes/index.js +7 -4
  88. package/dist/routes/index.js.map +1 -1
  89. package/dist/routes/playlist.d.ts +5 -1
  90. package/dist/routes/playlist.js +32 -7
  91. package/dist/routes/playlist.js.map +1 -1
  92. package/dist/routes/providers.d.ts +6 -0
  93. package/dist/routes/providers.js +166 -0
  94. package/dist/routes/providers.js.map +1 -0
  95. package/dist/routes/root/content.d.ts +32 -0
  96. package/dist/routes/root/content.js +857 -0
  97. package/dist/routes/root/content.js.map +1 -0
  98. package/dist/routes/root/index.js +197 -0
  99. package/dist/routes/root/index.js.map +1 -0
  100. package/dist/routes/root/scripts/channels.d.ts +1 -0
  101. package/dist/routes/root/scripts/channels.js +745 -0
  102. package/dist/routes/root/scripts/channels.js.map +1 -0
  103. package/dist/routes/root/scripts/config.d.ts +1 -0
  104. package/dist/routes/root/scripts/config.js +1662 -0
  105. package/dist/routes/root/scripts/config.js.map +1 -0
  106. package/dist/routes/root/scripts/index.d.ts +3 -0
  107. package/dist/routes/root/scripts/index.js +8 -0
  108. package/dist/routes/root/scripts/index.js.map +1 -0
  109. package/dist/routes/root/scripts/status.d.ts +1 -0
  110. package/dist/routes/root/scripts/status.js +436 -0
  111. package/dist/routes/root/scripts/status.js.map +1 -0
  112. package/dist/routes/root/styles.d.ts +5 -0
  113. package/dist/routes/root/styles.js +447 -0
  114. package/dist/routes/root/styles.js.map +1 -0
  115. package/dist/routes/ui.js +8 -3
  116. package/dist/routes/ui.js.map +1 -1
  117. package/dist/service/commands.d.ts +5 -3
  118. package/dist/service/commands.js +117 -33
  119. package/dist/service/commands.js.map +1 -1
  120. package/dist/service/generators.d.ts +27 -0
  121. package/dist/service/generators.js +97 -6
  122. package/dist/service/generators.js.map +1 -1
  123. package/dist/streaming/hls.js +18 -1
  124. package/dist/streaming/hls.js.map +1 -1
  125. package/dist/streaming/lifecycle.js +1 -1
  126. package/dist/streaming/lifecycle.js.map +1 -1
  127. package/dist/streaming/monitor.d.ts +1 -38
  128. package/dist/streaming/monitor.js +2 -289
  129. package/dist/streaming/monitor.js.map +1 -1
  130. package/dist/streaming/recovery.d.ts +143 -0
  131. package/dist/streaming/recovery.js +286 -0
  132. package/dist/streaming/recovery.js.map +1 -0
  133. package/dist/streaming/registry.d.ts +1 -1
  134. package/dist/streaming/setup.d.ts +1 -1
  135. package/dist/streaming/setup.js +3 -1
  136. package/dist/streaming/setup.js.map +1 -1
  137. package/dist/streaming/statusEmitter.d.ts +4 -2
  138. package/dist/streaming/statusEmitter.js +5 -0
  139. package/dist/streaming/statusEmitter.js.map +1 -1
  140. package/dist/types/channels.d.ts +68 -0
  141. package/dist/types/channels.js +2 -0
  142. package/dist/types/channels.js.map +1 -0
  143. package/dist/types/config.d.ts +127 -0
  144. package/dist/types/config.js +2 -0
  145. package/dist/types/config.js.map +1 -0
  146. package/dist/types/index.d.ts +7 -429
  147. package/dist/types/index.js +1 -5
  148. package/dist/types/index.js.map +1 -1
  149. package/dist/types/profiles.d.ts +141 -0
  150. package/dist/types/profiles.js +2 -0
  151. package/dist/types/profiles.js.map +1 -0
  152. package/dist/types/selection.d.ts +101 -0
  153. package/dist/types/selection.js +6 -0
  154. package/dist/types/selection.js.map +1 -0
  155. package/dist/types/shared.d.ts +7 -0
  156. package/dist/types/shared.js +6 -0
  157. package/dist/types/shared.js.map +1 -0
  158. package/dist/types/streaming.d.ts +96 -0
  159. package/dist/types/streaming.js +2 -0
  160. package/dist/types/streaming.js.map +1 -0
  161. package/dist/utils/debugFilter.js +3 -1
  162. package/dist/utils/debugFilter.js.map +1 -1
  163. package/dist/utils/format.d.ts +7 -0
  164. package/dist/utils/format.js +22 -0
  165. package/dist/utils/format.js.map +1 -1
  166. package/dist/utils/index.d.ts +1 -0
  167. package/dist/utils/index.js +1 -0
  168. package/dist/utils/index.js.map +1 -1
  169. package/dist/utils/sanitize.d.ts +14 -0
  170. package/dist/utils/sanitize.js +37 -0
  171. package/dist/utils/sanitize.js.map +1 -0
  172. package/package.json +5 -3
  173. package/dist/routes/config.d.ts +0 -76
  174. package/dist/routes/config.js +0 -2187
  175. package/dist/routes/config.js.map +0 -1
  176. package/dist/routes/root.js +0 -3158
  177. package/dist/routes/root.js.map +0 -1
  178. /package/dist/routes/{root.d.ts → root/index.d.ts} +0 -0
@@ -5,11 +5,14 @@
5
5
  * - url: Streaming site URL.
6
6
  * - profile: Site behavior profile (optional). Use "auto" or omit to auto-detect from URL domain. See config/profiles.ts for available profiles.
7
7
  * - stationId: Gracenote station ID for guide data (optional). Local affiliates (ABC, CBS, NBC) vary by region.
8
- * - channelSelector: Channel identifier for multi-channel pages. For thumbnailRow/tileClick profiles, this is a slug matched against image URLs. For foxGrid
9
- * (foxLive), this is the station code matched against GuideChannelLogo button titles (e.g., FOXD2C, FNC, FS1). For guideGrid (huluLive), this is the exact
10
- * channel name matched against image alt text. For hboGrid (hboMax), this is the channel name matched against the live channel rail tile text (e.g., HBO, HBO
11
- * Hits). For slingGrid (slingLive), this is the channel name as it appears in the Sling TV guide grid data-testid attributes. For youtubeGrid (youtubeTV), this
12
- * is the channel name from the YouTube TV guide or a network name (e.g., NBC) for local affiliates.
8
+ * - pacificStationId: Gracenote station ID for the Pacific timezone feed (optional). When set on an East canonical, the system auto-generates a Pacific
9
+ * canonical ("{key}p") and matching provider variants at startup. See generatePacificEntries() below for details, examples, and how to add new channels.
10
+ * - channelSelector: Channel identifier for multi-channel pages. For thumbnailRow/tileClick profiles, this is a slug matched against image URLs. For directvGrid
11
+ * (directvStream), this is the channel name from the DirecTV Stream Redux store (e.g., CNN, ESPN, NBC). For foxGrid (foxLive), this is the station code matched
12
+ * against GuideChannelLogo button titles (e.g., FOXD2C, FNC, FS1). For guideGrid (huluLive), this is the exact channel name matched against image alt text. For
13
+ * hboGrid (hboMax), this is the channel name matched against the live channel rail tile text (e.g., HBO, HBO Hits). For slingGrid (slingLive), this is the
14
+ * channel name as it appears in the Sling TV guide grid data-testid attributes. For youtubeGrid (youtubeTV), this is the channel name from the YouTube TV guide
15
+ * or a network name (e.g., NBC) for local affiliates.
13
16
  * - provider: Display name override for the provider selection dropdown (optional). Normally auto-derived from the URL domain via DOMAIN_CONFIG in
14
17
  * config/profiles.ts. Only needed when a channel's display name should differ from the domain-level default.
15
18
  *
@@ -18,60 +21,98 @@
18
21
  *
19
22
  * IMPORTANT: Avoid hyphenated keys that would unintentionally match an existing channel. If "foo" exists, "foo-bar" becomes its variant. Use non-hyphenated keys
20
23
  * for independent channels (e.g., "cnni" instead of "cnn-international").
24
+ *
25
+ * FAST channels: This list contains only traditional linear TV networks and public broadcasters — no FAST (Free Ad-Supported Streaming Television) channels.
26
+ * 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
27
+ * web UI or user channels file, or preferably use dedicated high-quality integrations such as Plex Channels, Pluto for Channels, or Tubi for Channels. Any
28
+ * FAST channel listed here would be by exception only.
21
29
  */
22
- export const CHANNELS = {
30
+ /* eslint-disable @stylistic/max-len */
31
+ const BASE_CHANNELS = {
23
32
  abc: { name: "ABC", url: "https://abc.com/watch-live" },
24
33
  "abc-hulu": { channelSelector: "ABC", url: "https://www.hulu.com/live" },
25
34
  "abc-sling": { channelSelector: "ABC", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
26
35
  "abc-yttv": { channelSelector: "ABC", url: "https://tv.youtube.com/live" },
27
- ae: { name: "A&E", stationId: "51529", url: "https://play.aetv.com/live" },
36
+ abcnews: { channelSelector: "ABC News Live", name: "ABC News Live", stationId: "113380", url: "https://www.hulu.com/live" },
37
+ "abcnews-sling": { channelSelector: "ABC News Live", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
38
+ "abcnews-yttv": { channelSelector: "ABC News Live", url: "https://tv.youtube.com/live" },
39
+ ae: { name: "A&E", pacificStationId: "57439", stationId: "51529", url: "https://play.aetv.com/live" },
40
+ "ae-directv": { channelSelector: "A&E", url: "https://stream.directv.com" },
28
41
  "ae-hulu": { channelSelector: "A&E", url: "https://www.hulu.com/live" },
29
42
  "ae-sling": { channelSelector: "A&E", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
43
+ "ae-yttv": { channelSelector: "A&E", url: "https://tv.youtube.com/live" },
30
44
  ahc: { name: "American Heroes", stationId: "78808", url: "https://watch.foodnetwork.com/channel/ahc" },
31
- amc: { channelSelector: "AMC", name: "AMC", stationId: "59337", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
45
+ amc: { channelSelector: "AMC", name: "AMC", pacificStationId: "78836", stationId: "59337", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
32
46
  "amc-yttv": { channelSelector: "AMC", url: "https://tv.youtube.com/live" },
33
47
  amcthrillers: { channelSelector: "AMC Thrillers", name: "AMC Thrillers", stationId: "115678", url: "https://tv.youtube.com/live" },
34
- animal: { name: "Animal Planet", stationId: "57394", url: "https://watch.foodnetwork.com/channel/animal-planet" },
48
+ "amcthrillers-sling": { channelSelector: "AMC Thrillers", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
49
+ animal: { name: "Animal Planet", pacificStationId: "68785", stationId: "57394", url: "https://watch.foodnetwork.com/channel/animal-planet" },
50
+ "animal-directv": { channelSelector: "Animal Planet", url: "https://stream.directv.com" },
35
51
  "animal-hulu": { channelSelector: "Animal Planet", url: "https://www.hulu.com/live" },
36
52
  "animal-yttv": { channelSelector: "Animal Planet", url: "https://tv.youtube.com/live" },
37
- bet: { name: "BET", stationId: "63236", url: "https://www.bet.com/live-tv" },
53
+ bbcamerica: { channelSelector: "BBC America", name: "BBC America", pacificStationId: "76739", stationId: "64492", url: "https://tv.youtube.com/live" },
54
+ "bbcamerica-sling": { channelSelector: "BBC America", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
55
+ bbcnews: { channelSelector: "BBC News", name: "BBC News", stationId: "101449", url: "https://tv.youtube.com/live" },
56
+ "bbcnews-sling": { channelSelector: "BBC News", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
57
+ bet: { name: "BET", pacificStationId: "64673", stationId: "63236", url: "https://www.bet.com/live-tv" },
58
+ "bet-directv": { channelSelector: "BET", url: "https://stream.directv.com" },
38
59
  "bet-hulu": { channelSelector: "BET", url: "https://www.hulu.com/live" },
39
60
  "bet-sling": { channelSelector: "BET", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
40
61
  "bet-yttv": { channelSelector: "BET", url: "https://tv.youtube.com/live" },
62
+ bether: { channelSelector: "BET Her", name: "BET Her", pacificStationId: "97360", stationId: "63220", url: "https://tv.youtube.com/live" },
41
63
  bigten: { name: "Big 10", stationId: "58321", url: "https://www.foxsports.com/live/btn" },
42
64
  "bigten-foxcom": { channelSelector: "BTN", url: "https://www.fox.com/live/channels" },
43
65
  "bigten-hulu": { channelSelector: "Big Ten Network", url: "https://www.hulu.com/live" },
44
66
  "bigten-yttv": { channelSelector: "BTN", url: "https://tv.youtube.com/live" },
67
+ bloomberg: { channelSelector: "Bloomberg Television", name: "Bloomberg Television", stationId: "71799", url: "https://www.hulu.com/live" },
68
+ "bloomberg-directv": { channelSelector: "Bloomberg TV", url: "https://stream.directv.com" },
69
+ "bloomberg-sling": { channelSelector: "Bloomberg TV+", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
70
+ "bloomberg-yttv": { channelSelector: "Bloomberg TV+", url: "https://tv.youtube.com/live" },
71
+ bloombergoriginals: { channelSelector: "Bloomberg Originals", name: "Bloomberg Originals", stationId: "175656", url: "https://tv.youtube.com/live" },
45
72
  bravo: { name: "Bravo", stationId: "58625", url: "https://www.nbc.com/live?brand=bravo&callsign=bravo_east" },
73
+ "bravo-directv": { channelSelector: "Bravo", url: "https://stream.directv.com" },
46
74
  "bravo-hulu": { channelSelector: "Bravo", url: "https://www.hulu.com/live" },
47
75
  "bravo-sling": { channelSelector: "Bravo", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
48
76
  "bravo-yttv": { channelSelector: "Bravo", url: "https://tv.youtube.com/live" },
49
77
  bravop: { name: "Bravo (Pacific)", stationId: "73994", url: "https://www.nbc.com/live?brand=bravo&callsign=bravo_west" },
78
+ cartoon: { channelSelector: "Cartoon Network", name: "Cartoon Network", pacificStationId: "67703", stationId: "60048", url: "https://tv.youtube.com/live" },
79
+ "cartoon-hulu": { channelSelector: "Cartoon Network (East)", url: "https://www.hulu.com/live" },
80
+ "cartoonp-hulu": { channelSelector: "Cartoon Network (West)", url: "https://www.hulu.com/live" },
50
81
  cbs: { name: "CBS", url: "https://www.cbs.com/live-tv/stream" },
51
82
  "cbs-hulu": { channelSelector: "CBS", url: "https://www.hulu.com/live" },
52
83
  "cbs-paramountplus": { name: "CBS", url: "https://www.paramountplus.com/live-tv/" },
53
84
  "cbs-yttv": { channelSelector: "CBS", url: "https://tv.youtube.com/live" },
54
- cmt: { channelSelector: "CMT", name: "CMT", stationId: "59440", url: "https://www.hulu.com/live" },
85
+ cbsnews: { channelSelector: "CBS News 24/7", name: "CBS News 24/7", stationId: "104846", url: "https://www.hulu.com/live" },
86
+ "cbsnews-sling": { channelSelector: "CBS News 24/7", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
87
+ cbssports: { channelSelector: "CBS Sports Network", name: "CBS Sports Network", stationId: "59250", url: "https://www.hulu.com/live" },
88
+ "cbssports-yttv": { channelSelector: "CBS Sports Network", url: "https://tv.youtube.com/live" },
89
+ cmt: { channelSelector: "CMT", name: "CMT", pacificStationId: "64610", stationId: "59440", url: "https://www.hulu.com/live" },
55
90
  "cmt-yttv": { channelSelector: "CMT", url: "https://tv.youtube.com/live" },
56
91
  cnbc: { name: "CNBC", stationId: "58780", url: "https://www.cnbc.com/live-tv" },
92
+ "cnbc-directv": { channelSelector: "CNBC", url: "https://stream.directv.com" },
57
93
  "cnbc-hulu": { channelSelector: "CNBC", url: "https://www.hulu.com/live" },
58
94
  "cnbc-usa": { channelSelector: "CNBC_US", url: "https://www.usanetwork.com/live" },
59
95
  "cnbc-yttv": { channelSelector: "CNBC", url: "https://tv.youtube.com/live" },
60
96
  cnn: { name: "CNN", stationId: "58646", url: "https://www.cnn.com/videos/cnn" },
97
+ "cnn-directv": { channelSelector: "CNN", url: "https://stream.directv.com" },
61
98
  "cnn-hulu": { channelSelector: "CNN", url: "https://www.hulu.com/live" },
62
99
  "cnn-sling": { channelSelector: "CNN", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
63
100
  "cnn-yttv": { channelSelector: "CNN", url: "https://tv.youtube.com/live" },
64
101
  cnni: { name: "CNN International", stationId: "83110", url: "https://www.cnn.com/videos/cnn-i" },
102
+ "cnni-directv": { channelSelector: "CNN International", url: "https://stream.directv.com" },
65
103
  "cnni-hulu": { channelSelector: "CNN International", url: "https://www.hulu.com/live" },
66
104
  "cnni-yttv": { channelSelector: "CNN International", url: "https://tv.youtube.com/live" },
67
- "comedycentral": { channelSelector: "Comedy Central", name: "Comedy Central", stationId: "62420", url: "https://www.hulu.com/live" },
105
+ "comedycentral": { channelSelector: "Comedy Central", name: "Comedy Central", pacificStationId: "64599", stationId: "62420", url: "https://www.hulu.com/live" },
106
+ "comedycentral-directv": { channelSelector: "Comedy Central", url: "https://stream.directv.com" },
68
107
  "comedycentral-sling": { channelSelector: "Comedy Central", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
69
108
  "comedycentral-yttv": { channelSelector: "Comedy Central", url: "https://tv.youtube.com/live" },
70
109
  cooking: { name: "Cooking", stationId: "68065", url: "https://watch.foodnetwork.com/channel/cooking-channel" },
71
110
  cspan: { name: "C-SPAN", stationId: "68344", url: "https://www.c-span.org/networks/?autoplay=true&channel=c-span" },
111
+ "cspan-directv": { channelSelector: "C-SPAN", url: "https://stream.directv.com" },
72
112
  "cspan-hulu": { channelSelector: "C-SPAN", url: "https://www.hulu.com/live" },
73
113
  "cspan-yttv": { channelSelector: "C-SPAN", url: "https://tv.youtube.com/live" },
74
114
  cspan2: { name: "C-SPAN 2", stationId: "68334", url: "https://www.c-span.org/networks/?autoplay=true&channel=c-span-2" },
115
+ "cspan2-directv": { channelSelector: "C-SPAN2", url: "https://stream.directv.com" },
75
116
  "cspan2-hulu": { channelSelector: "C-SPAN2", url: "https://www.hulu.com/live" },
76
117
  "cspan2-yttv": { channelSelector: "C-SPAN2", url: "https://tv.youtube.com/live" },
77
118
  cspan3: { name: "C-SPAN 3", stationId: "68332", url: "https://www.c-span.org/networks/?autoplay=true&channel=c-span-3" },
@@ -79,41 +120,49 @@ export const CHANNELS = {
79
120
  "cspan3-yttv": { channelSelector: "C-SPAN3", url: "https://tv.youtube.com/live" },
80
121
  cw: { channelSelector: "CW", name: "CW", url: "https://www.hulu.com/live" },
81
122
  "cw-yttv": { channelSelector: "CW", url: "https://tv.youtube.com/live" },
82
- discovery: { name: "Discovery", stationId: "56905", url: "https://watch.foodnetwork.com/channel/discovery" },
123
+ discovery: { name: "Discovery", pacificStationId: "80399", stationId: "56905", url: "https://watch.foodnetwork.com/channel/discovery" },
124
+ "discovery-directv": { channelSelector: "Discovery", url: "https://stream.directv.com" },
83
125
  "discovery-hulu": { channelSelector: "Discovery", url: "https://www.hulu.com/live" },
84
126
  "discovery-sling": { channelSelector: "Discovery", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
85
127
  "discovery-yttv": { channelSelector: "Discovery Channel", url: "https://tv.youtube.com/live" },
86
128
  discoverylife: { name: "Discovery Life", stationId: "92204", url: "https://watch.foodnetwork.com/channel/discovery-life" },
87
129
  discoveryturbo: { name: "Discovery Turbo", stationId: "31046", url: "https://watch.foodnetwork.com/channel/motortrend" },
130
+ "discoveryturbo-directv": { channelSelector: "Discovery Turbo", url: "https://stream.directv.com" },
88
131
  "discoveryturbo-hulu": { channelSelector: "Discovery Turbo", url: "https://www.hulu.com/live" },
89
132
  "discoveryturbo-sling": { channelSelector: "Discovery Turbo", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
90
133
  "discoveryturbo-yttv": { channelSelector: "Discovery Turbo", url: "https://tv.youtube.com/live" },
91
- disney: { name: "Disney", stationId: "59684", url: "https://disneynow.com/watch-live?brand=004" },
134
+ disney: { name: "Disney", pacificStationId: "63320", stationId: "59684", url: "https://disneynow.com/watch-live?brand=004" },
135
+ "disney-directv": { channelSelector: "Disney Channel", url: "https://stream.directv.com" },
92
136
  "disney-hulu": { channelSelector: "Disney Channel", url: "https://www.hulu.com/live" },
93
137
  "disney-sling": { channelSelector: "Disney Channel", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
94
138
  "disney-yttv": { channelSelector: "Disney Channel", url: "https://tv.youtube.com/live" },
95
- disneyjr: { name: "Disney Jr.", stationId: "74885", url: "https://disneynow.com/watch-live?brand=008" },
139
+ disneyjr: { name: "Disney Jr.", pacificStationId: "75004", stationId: "74885", url: "https://disneynow.com/watch-live?brand=008" },
140
+ "disneyjr-directv": { channelSelector: "Disney Junior", url: "https://stream.directv.com" },
96
141
  "disneyjr-hulu": { channelSelector: "Disney Junior", url: "https://www.hulu.com/live" },
97
142
  "disneyjr-yttv": { channelSelector: "Disney Junior", url: "https://tv.youtube.com/live" },
98
- disneyxd: { name: "Disney XD", stationId: "60006", url: "https://disneynow.com/watch-live?brand=009" },
143
+ disneyxd: { name: "Disney XD", pacificStationId: "63322", stationId: "60006", url: "https://disneynow.com/watch-live?brand=009" },
99
144
  "disneyxd-hulu": { channelSelector: "Disney XD", url: "https://www.hulu.com/live" },
100
145
  "disneyxd-yttv": { channelSelector: "Disney XD", url: "https://tv.youtube.com/live" },
101
146
  e: { channelSelector: "E-_East", name: "E!", stationId: "61812", url: "https://www.usanetwork.com/live" },
147
+ "e-directv": { channelSelector: "E!", url: "https://stream.directv.com" },
102
148
  "e-hulu": { channelSelector: "E!", url: "https://www.hulu.com/live" },
103
149
  "e-sling": { channelSelector: "E!", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
104
150
  "e-yttv": { channelSelector: "E!", url: "https://tv.youtube.com/live" },
105
151
  ep: { channelSelector: "E-_West", name: "E! (Pacific)", stationId: "91579", url: "https://www.usanetwork.com/live" },
106
152
  espn: { name: "ESPN", stationId: "32645", url: "https://www.espn.com/watch/player?network=espn" },
153
+ "espn-directv": { channelSelector: "ESPN", url: "https://stream.directv.com" },
107
154
  "espn-disneyplus": { channelSelector: "poster_linear_espn_none", url: "https://www.disneyplus.com/browse/live" },
108
155
  "espn-hulu": { channelSelector: "ESPN", url: "https://www.hulu.com/live" },
109
156
  "espn-sling": { channelSelector: "ESPN", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
110
157
  "espn-yttv": { channelSelector: "ESPN", url: "https://tv.youtube.com/live" },
111
158
  espn2: { name: "ESPN2", stationId: "45507", url: "https://www.espn.com/watch/player?network=espn2" },
159
+ "espn2-directv": { channelSelector: "ESPN2", url: "https://stream.directv.com" },
112
160
  "espn2-disneyplus": { channelSelector: "poster_linear_espn2_none", url: "https://www.disneyplus.com/browse/live" },
113
161
  "espn2-hulu": { channelSelector: "ESPN2", url: "https://www.hulu.com/live" },
114
162
  "espn2-sling": { channelSelector: "ESPN2", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
115
163
  "espn2-yttv": { channelSelector: "ESPN2", url: "https://tv.youtube.com/live" },
116
164
  espnacc: { name: "ACC Network", stationId: "111871", url: "https://www.espn.com/watch/player?network=acc" },
165
+ "espnacc-directv": { channelSelector: "ACC Network", url: "https://stream.directv.com" },
117
166
  "espnacc-disneyplus": { channelSelector: "poster_linear_acc-network_none", url: "https://www.disneyplus.com/browse/live" },
118
167
  "espnacc-hulu": { channelSelector: "ACC Network", url: "https://www.hulu.com/live" },
119
168
  "espnacc-yttv": { channelSelector: "ACC Network", url: "https://tv.youtube.com/live" },
@@ -121,27 +170,33 @@ export const CHANNELS = {
121
170
  "espndeportes-disneyplus": { channelSelector: "poster_linear_espn-deportes_none", url: "https://www.disneyplus.com/browse/live" },
122
171
  "espndeportes-yttv": { channelSelector: "ESPN Deportes", url: "https://tv.youtube.com/live" },
123
172
  espnews: { name: "ESPNews", stationId: "59976", url: "https://www.espn.com/watch/player?network=espnews" },
173
+ "espnews-directv": { channelSelector: "ESPNEWS", url: "https://stream.directv.com" },
124
174
  "espnews-disneyplus": { channelSelector: "poster_linear_espnews_none", url: "https://www.disneyplus.com/browse/live" },
125
175
  "espnews-hulu": { channelSelector: "ESPNEWS", url: "https://www.hulu.com/live" },
126
176
  "espnews-yttv": { channelSelector: "ESPNEWS", url: "https://tv.youtube.com/live" },
127
177
  espnsec: { name: "SEC Network", stationId: "89714", url: "https://www.espn.com/watch/player?network=sec" },
178
+ "espnsec-directv": { channelSelector: "SEC Network", url: "https://stream.directv.com" },
128
179
  "espnsec-disneyplus": { channelSelector: "poster_linear_sec-network_none", url: "https://www.disneyplus.com/browse/live" },
129
180
  "espnsec-hulu": { channelSelector: "SEC Network", url: "https://www.hulu.com/live" },
130
181
  "espnsec-yttv": { channelSelector: "SEC Network", url: "https://tv.youtube.com/live" },
131
182
  espnu: { name: "ESPNU", stationId: "60696", url: "https://www.espn.com/watch/player?network=espnu" },
183
+ "espnu-directv": { channelSelector: "ESPNU", url: "https://stream.directv.com" },
132
184
  "espnu-disneyplus": { channelSelector: "poster_linear_espnu_none", url: "https://www.disneyplus.com/browse/live" },
133
185
  "espnu-hulu": { channelSelector: "ESPNU", url: "https://www.hulu.com/live" },
134
186
  "espnu-yttv": { channelSelector: "ESPNU", url: "https://tv.youtube.com/live" },
135
187
  fbc: { name: "Fox Business", stationId: "58718", url: "https://www.foxbusiness.com/video/5640669329001" },
188
+ "fbc-directv": { channelSelector: "Fox Business Network", url: "https://stream.directv.com" },
136
189
  "fbc-foxcom": { channelSelector: "FBN", url: "https://www.fox.com/live/channels" },
137
190
  "fbc-hulu": { channelSelector: "Fox Business", url: "https://www.hulu.com/live" },
138
191
  "fbc-yttv": { channelSelector: "Fox Business", url: "https://tv.youtube.com/live" },
139
192
  fnc: { name: "Fox News", stationId: "60179", url: "https://www.foxnews.com/video/5614615980001" },
193
+ "fnc-directv": { channelSelector: "Fox News Channel", url: "https://stream.directv.com" },
140
194
  "fnc-foxcom": { channelSelector: "FNC", url: "https://www.fox.com/live/channels" },
141
195
  "fnc-hulu": { channelSelector: "Fox News", url: "https://www.hulu.com/live" },
142
196
  "fnc-sling": { channelSelector: "Fox News", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
143
197
  "fnc-yttv": { channelSelector: "Fox News", url: "https://tv.youtube.com/live" },
144
- food: { name: "Food Network", stationId: "50747", url: "https://watch.foodnetwork.com/channel/food-network" },
198
+ food: { name: "Food Network", pacificStationId: "82119", stationId: "50747", url: "https://watch.foodnetwork.com/channel/food-network" },
199
+ "food-directv": { channelSelector: "Food Network", url: "https://stream.directv.com" },
145
200
  "food-hulu": { channelSelector: "Food Network", url: "https://www.hulu.com/live" },
146
201
  "food-sling": { channelSelector: "Food Network", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
147
202
  "food-yttv": { channelSelector: "Food Network", url: "https://tv.youtube.com/live" },
@@ -158,39 +213,54 @@ export const CHANNELS = {
158
213
  "france24-sling": { channelSelector: "France 24 (English)", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
159
214
  france24fr: { name: "France 24 (French)", stationId: "58685", url: "https://www.france24.com/fr/direct" },
160
215
  "france24fr-sling": { channelSelector: "France 24", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
216
+ freeform: { name: "Freeform", stationId: "59615", url: "https://www.freeform.com/watch-live/885c669e-fa9a-4039-b42e-6c85c90cc86d" },
217
+ "freeform-directv": { channelSelector: "Freeform", url: "https://stream.directv.com" },
218
+ "freeform-hulu": { channelSelector: "Freeform", url: "https://www.hulu.com/live" },
219
+ "freeform-yttv": { channelSelector: "Freeform", url: "https://tv.youtube.com/live" },
220
+ freeformp: { name: "Freeform (Pacific)", stationId: "63324", url: "https://www.freeform.com/watch-live/3507c750-e86a-4c0f-8ff4-dd23c4859009" },
161
221
  fs1: { name: "FS1", stationId: "82547", url: "https://www.foxsports.com/live/fs1" },
222
+ "fs1-directv": { channelSelector: "FOX Sports 1", url: "https://stream.directv.com" },
162
223
  "fs1-foxcom": { channelSelector: "FS1", url: "https://www.fox.com/live/channels" },
163
224
  "fs1-hulu": { channelSelector: "FS1", url: "https://www.hulu.com/live" },
164
225
  "fs1-sling": { channelSelector: "FOX Sports 1", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
165
226
  "fs1-yttv": { channelSelector: "FS1", url: "https://tv.youtube.com/live" },
166
227
  fs2: { name: "FS2", stationId: "59305", url: "https://www.foxsports.com/live/fs2" },
228
+ "fs2-directv": { channelSelector: "FOX Sports 2", url: "https://stream.directv.com" },
167
229
  "fs2-foxcom": { channelSelector: "FS2", url: "https://www.fox.com/live/channels" },
168
230
  "fs2-hulu": { channelSelector: "FS2", url: "https://www.hulu.com/live" },
169
231
  "fs2-yttv": { channelSelector: "FS2", url: "https://tv.youtube.com/live" },
170
232
  fx: { name: "FX", stationId: "58574", url: "https://abc.com/watch-live/93256af4-5e80-4558-aa2e-2bdfffa119a0" },
233
+ "fx-directv": { channelSelector: "FX", url: "https://stream.directv.com" },
171
234
  "fx-hulu": { channelSelector: "FX", url: "https://www.hulu.com/live" },
172
235
  "fx-sling": { channelSelector: "FX", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
173
236
  "fx-yttv": { channelSelector: "FX", url: "https://tv.youtube.com/live" },
174
- fxm: { name: "FXM", stationId: "70253", url: "https://abc.com/watch-live/d298ab7e-c6b1-4efa-ac6e-a52dceed92ee" },
237
+ fxm: { name: "FXM", pacificStationId: "98488", stationId: "70253", url: "https://abc.com/watch-live/d298ab7e-c6b1-4efa-ac6e-a52dceed92ee" },
238
+ "fxm-directv": { channelSelector: "FX Movie Channel", url: "https://stream.directv.com" },
175
239
  "fxm-hulu": { channelSelector: "FXM", url: "https://www.hulu.com/live" },
176
240
  "fxm-yttv": { channelSelector: "FXM", url: "https://tv.youtube.com/live" },
177
241
  fxp: { name: "FX (Pacific)", stationId: "59814", url: "https://abc.com/watch-live/2cee3401-f63b-42d0-b32e-962fef610b9e" },
178
242
  fxx: { name: "FXX", stationId: "66379", url: "https://abc.com/watch-live/49f4a471-8d36-4728-8457-ea65cbbc84ea" },
243
+ "fxx-directv": { channelSelector: "FXX", url: "https://stream.directv.com" },
179
244
  "fxx-hulu": { channelSelector: "FXX", url: "https://www.hulu.com/live" },
180
245
  "fxx-yttv": { channelSelector: "FXX", url: "https://tv.youtube.com/live" },
181
246
  fxxp: { name: "FXX (Pacific)", stationId: "82571", url: "https://abc.com/watch-live/e4c83395-62ed-4a49-829a-c55ab3c33e7d" },
182
- fyi: { name: "FYI", stationId: "58988", url: "https://play.fyi.tv/live" },
247
+ fyi: { name: "FYI", pacificStationId: "92372", stationId: "58988", url: "https://play.fyi.tv/live" },
183
248
  "fyi-hulu": { channelSelector: "FYI", url: "https://www.hulu.com/live" },
249
+ gameshow: { channelSelector: "Game Show Network", name: "Game Show Network", pacificStationId: "90210", stationId: "68827", url: "https://www.hulu.com/live" },
250
+ "gameshow-yttv": { channelSelector: "Game Show Network", url: "https://tv.youtube.com/live" },
184
251
  golf: { name: "Golf", stationId: "61854", url: "https://www.golfchannel.com/watch/live" },
252
+ "golf-directv": { channelSelector: "Golf Channel", url: "https://stream.directv.com" },
185
253
  "golf-hulu": { channelSelector: "Golf Channel", url: "https://www.hulu.com/live" },
186
254
  "golf-usa": { channelSelector: "gc", url: "https://www.usanetwork.com/live" },
187
255
  "golf-yttv": { channelSelector: "Golf Channel", url: "https://tv.youtube.com/live" },
188
- hallmark: { name: "Hallmark", stationId: "66268", url: "https://www.watchhallmarktv.com/playback/item/live" },
256
+ hallmark: { name: "Hallmark", pacificStationId: "66415", stationId: "66268", url: "https://www.watchhallmarktv.com/playback/item/live" },
257
+ "hallmark-directv": { channelSelector: "Hallmark Channel", url: "https://stream.directv.com" },
189
258
  "hallmark-hulu": { channelSelector: "Hallmark Channel", url: "https://www.hulu.com/live" },
190
259
  "hallmark-yttv": { channelSelector: "Hallmark Channel", url: "https://tv.youtube.com/live" },
191
260
  hallmarkfamily: { name: "Hallmark Family", stationId: "105723", url: "https://www.watchhallmarktv.com/playback/item/hdlive" },
192
261
  "hallmarkfamily-yttv": { channelSelector: "Hallmark Family", url: "https://tv.youtube.com/live" },
193
- hallmarkmystery: { name: "Hallmark Mystery", stationId: "46710", url: "https://www.watchhallmarktv.com/playback/item/hmmlive" },
262
+ hallmarkmystery: { name: "Hallmark Mystery", pacificStationId: "66412", stationId: "46710", url: "https://www.watchhallmarktv.com/playback/item/hmmlive" },
263
+ "hallmarkmystery-directv": { channelSelector: "Hallmark Mystery", url: "https://stream.directv.com" },
194
264
  "hallmarkmystery-hulu": { channelSelector: "Hallmark Mystery", url: "https://www.hulu.com/live" },
195
265
  "hallmarkmystery-yttv": { channelSelector: "Hallmark Mystery", url: "https://tv.youtube.com/live" },
196
266
  hbo: { channelSelector: "HBO", name: "HBO", stationId: "19548", url: "https://play.hbomax.com" },
@@ -203,42 +273,56 @@ export const CHANNELS = {
203
273
  "hbohits-yttv": { channelSelector: "HBO Hits East", url: "https://tv.youtube.com/live" },
204
274
  hbomovies: { channelSelector: "HBO Movies", name: "HBO Movies", stationId: "59845", url: "https://play.hbomax.com" },
205
275
  "hbomovies-yttv": { channelSelector: "HBO Movies East", url: "https://tv.youtube.com/live" },
206
- hgtv: { name: "HGTV", stationId: "49788", url: "https://watch.foodnetwork.com/channel/hgtv" },
276
+ hgtv: { name: "HGTV", pacificStationId: "87317", stationId: "49788", url: "https://watch.foodnetwork.com/channel/hgtv" },
277
+ "hgtv-directv": { channelSelector: "HGTV", url: "https://stream.directv.com" },
207
278
  "hgtv-hulu": { channelSelector: "HGTV", url: "https://www.hulu.com/live" },
208
279
  "hgtv-sling": { channelSelector: "HGTV", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
209
280
  "hgtv-yttv": { channelSelector: "HGTV", url: "https://tv.youtube.com/live" },
210
- history: { name: "History", stationId: "14771", url: "https://play.history.com/live" },
281
+ history: { name: "History", pacificStationId: "88545", stationId: "14771", url: "https://play.history.com/live" },
211
282
  "history-hulu": { channelSelector: "The HISTORY Channel", url: "https://www.hulu.com/live" },
212
283
  "history-sling": { channelSelector: "History", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
213
284
  hln: { name: "HLN", stationId: "64549", url: "https://www.cnn.com/videos/hln" },
285
+ "hln-directv": { channelSelector: "HLN", url: "https://stream.directv.com" },
214
286
  "hln-hulu": { channelSelector: "HLN", url: "https://www.hulu.com/live" },
215
287
  "hln-sling": { channelSelector: "HLN", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
216
288
  "hln-yttv": { channelSelector: "HLN", url: "https://tv.youtube.com/live" },
217
- id: { name: "Investigation Discovery", stationId: "65342", url: "https://watch.foodnetwork.com/channel/investigation-discovery" },
289
+ id: { name: "Investigation Discovery", pacificStationId: "80309", stationId: "65342", url: "https://watch.foodnetwork.com/channel/investigation-discovery" },
290
+ "id-directv": { channelSelector: "Investigation Discovery", url: "https://stream.directv.com" },
218
291
  "id-hulu": { channelSelector: "Investigation Discovery", url: "https://www.hulu.com/live" },
219
292
  "id-sling": { channelSelector: "Investigation Discovery", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
220
293
  "id-yttv": { channelSelector: "ID", url: "https://tv.youtube.com/live" },
221
- ifc: { channelSelector: "IFC", name: "IFC", stationId: "59444", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
294
+ ifc: { channelSelector: "IFC", name: "IFC", pacificStationId: "109735", stationId: "59444", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
222
295
  "ifc-yttv": { channelSelector: "IFC", url: "https://tv.youtube.com/live" },
223
- lifetime: { name: "Lifetime", stationId: "60150", url: "https://play.mylifetime.com/live" },
296
+ indieplex: { channelSelector: "IndiePlex (East)", name: "IndiePlex", stationId: "65795", url: "https://www.hulu.com/live" },
297
+ indieplexp: { channelSelector: "IndiePlex (West)", name: "IndiePlex (Pacific)", stationId: "65796", url: "https://www.hulu.com/live" },
298
+ lifetime: { name: "Lifetime", pacificStationId: "60250", stationId: "60150", url: "https://play.mylifetime.com/live" },
299
+ "lifetime-directv": { channelSelector: "Lifetime", url: "https://stream.directv.com" },
224
300
  "lifetime-hulu": { channelSelector: "Lifetime", url: "https://www.hulu.com/live" },
225
301
  "lifetime-sling": { channelSelector: "Lifetime", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
226
- lmn: { channelSelector: "LMN", name: "Lifetime Movie Network", stationId: "55887", url: "https://www.hulu.com/live" },
227
- magnolia: { name: "Magnolia Network", stationId: "67375", url: "https://watch.foodnetwork.com/channel/magnolia-network-preview-atve-us" },
302
+ lmn: { channelSelector: "LMN", name: "Lifetime Movie Network", pacificStationId: "92373", stationId: "55887", url: "https://www.hulu.com/live" },
303
+ magnolia: { name: "Magnolia Network", pacificStationId: "122081", stationId: "67375", url: "https://watch.foodnetwork.com/channel/magnolia-network-preview-atve-us" },
304
+ "magnolia-directv": { channelSelector: "Magnolia Network", url: "https://stream.directv.com" },
228
305
  "magnolia-hulu": { channelSelector: "Magnolia Network", url: "https://www.hulu.com/live" },
229
306
  "magnolia-yttv": { channelSelector: "Magnolia Network", url: "https://tv.youtube.com/live" },
230
307
  mlb: { channelSelector: "MLB Network", name: "MLB Network", stationId: "62081", url: "https://www.hulu.com/live" },
308
+ movieplex: { channelSelector: "MoviePlex (East)", name: "MoviePlex", stationId: "83075", url: "https://www.hulu.com/live" },
309
+ movieplexp: { channelSelector: "MoviePlex (West)", name: "MoviePlex (Pacific)", stationId: "105963", url: "https://www.hulu.com/live" },
231
310
  msnow: { name: "MS NOW", stationId: "64241", url: "https://www.ms.now/live" },
311
+ "msnow-directv": { channelSelector: "MS NOW", url: "https://stream.directv.com" },
232
312
  "msnow-hulu": { channelSelector: "MS NOW", url: "https://www.hulu.com/live" },
233
313
  "msnow-sling": { channelSelector: "MS NOW", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
234
314
  "msnow-usa": { channelSelector: "image-23", url: "https://www.usanetwork.com/live" },
235
315
  "msnow-yttv": { channelSelector: "MS NOW", url: "https://tv.youtube.com/live" },
316
+ mtv: { channelSelector: "MTV", name: "MTV", pacificStationId: "64630", stationId: "60964", url: "https://www.hulu.com/live" },
317
+ "mtv-yttv": { channelSelector: "MTV", url: "https://tv.youtube.com/live" },
236
318
  natgeo: { name: "National Geographic", stationId: "49438", url: "https://www.nationalgeographic.com/tv/watch-live/0826a9a3-3384-4bb5-8841-91f01cb0e3a7" },
319
+ "natgeo-directv": { channelSelector: "National Geographic", url: "https://stream.directv.com" },
237
320
  "natgeo-hulu": { channelSelector: "National Geographic", url: "https://www.hulu.com/live" },
238
321
  "natgeo-sling": { channelSelector: "National Geographic", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
239
322
  "natgeo-yttv": { channelSelector: "Nat Geo", url: "https://tv.youtube.com/live" },
240
323
  natgeop: { name: "National Geographic (Pacific)", stationId: "71601", url: "https://www.nationalgeographic.com/tv/watch-live/91456580-f32f-417c-8e1a-9f82640832a7" },
241
324
  natgeowild: { name: "Nat Geo Wild", stationId: "67331", url: "https://www.nationalgeographic.com/tv/watch-live/239b9590-583f-4955-a499-22e9eefff9cf" },
325
+ "natgeowild-directv": { channelSelector: "Nat Geo WILD", url: "https://stream.directv.com" },
242
326
  "natgeowild-hulu": { channelSelector: "Nat Geo WILD", url: "https://www.hulu.com/live" },
243
327
  "natgeowild-yttv": { channelSelector: "Nat Geo WILD", url: "https://tv.youtube.com/live" },
244
328
  nba: { name: "NBA TV", stationId: "45526", url: "https://www.nba.com/watch/nba-tv" },
@@ -249,71 +333,233 @@ export const CHANNELS = {
249
333
  "nbc-yttv": { channelSelector: "NBC", url: "https://tv.youtube.com/live" },
250
334
  nbcnews: { name: "NBC News Now", stationId: "114174", url: "https://www.nbc.com/live?brand=nbc-news&callsign=nbcnews" },
251
335
  "nbcnews-hulu": { channelSelector: "NBC News NOW", url: "https://www.hulu.com/live" },
336
+ "nbcnews-sling": { channelSelector: "NBC News Now", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
252
337
  "nbcnews-yttv": { channelSelector: "NBC News NOW", url: "https://tv.youtube.com/live" },
253
338
  nbcsbayarea: { name: "NBC Sports Bay Area", stationId: "63138", url: "https://www.nbc.com/live?brand=rsn-bay-area&callsign=nbcsbayarea" },
254
339
  nbcsboston: { name: "NBC Sports Boston", stationId: "49198", url: "https://www.nbc.com/live?brand=rsn-boston&callsign=nbcsboston" },
255
340
  nbcscalifornia: { name: "NBC Sports California", stationId: "45540", url: "https://www.nbc.com/live?brand=rsn-california&callsign=nbcscalifornia" },
341
+ nbcsn: { channelSelector: "NBC Sports Network", name: "NBC Sports Network", stationId: "194412", url: "https://tv.youtube.com/live" },
256
342
  nbcsphiladelphia: { name: "NBC Sports Philadelphia", stationId: "32571", url: "https://www.nbc.com/live?brand=rsn-philadelphia&callsign=nbcsphiladelphia" },
257
343
  necn: { name: "NECN", stationId: "66278", url: "https://www.nbc.com/live?brand=necn&callsign=necn" },
344
+ nfl: { channelSelector: "NFL Network", name: "NFL Network", stationId: "45399", url: "https://www.hulu.com/live" },
345
+ "nfl-directv": { channelSelector: "NFL Network", url: "https://stream.directv.com" },
346
+ "nfl-sling": { channelSelector: "NFL Network", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
347
+ "nfl-yttv": { channelSelector: "NFL Network", url: "https://tv.youtube.com/live" },
258
348
  own: { name: "OWN", stationId: "70388", url: "https://watch.foodnetwork.com/channel/own" },
259
349
  "own-hulu": { channelSelector: "Oprah Winfrey Network", url: "https://www.hulu.com/live" },
260
350
  "own-yttv": { channelSelector: "OWN", url: "https://tv.youtube.com/live" },
261
351
  oxygen: { channelSelector: "Oxygen_East", name: "Oxygen", stationId: "70522", url: "https://www.usanetwork.com/live" },
352
+ "oxygen-directv": { channelSelector: "Oxygen True Crime", url: "https://stream.directv.com" },
262
353
  "oxygen-hulu": { channelSelector: "Oxygen True Crime", url: "https://www.hulu.com/live" },
263
354
  "oxygen-yttv": { channelSelector: "Oxygen True Crime", url: "https://tv.youtube.com/live" },
264
355
  oxygenp: { channelSelector: "Oxygen_West", name: "Oxygen (Pacific)", stationId: "74032", url: "https://www.usanetwork.com/live" },
356
+ paramount: { channelSelector: "Paramount Network", name: "Paramount Network", stationId: "59186", url: "https://www.hulu.com/live" },
357
+ "paramount-yttv": { channelSelector: "Paramount", url: "https://tv.youtube.com/live" },
358
+ paramountp: { name: "Paramount (Pacific)", stationId: "64593", url: "https://tv.youtube.com/live" },
359
+ "paramountp-yttv": { channelSelector: "Paramount Network", url: "https://tv.youtube.com/live" },
265
360
  pbs: { channelSelector: "PBS", name: "PBS", url: "https://www.hulu.com/live" },
266
361
  "pbs-yttv": { channelSelector: "PBS", url: "https://tv.youtube.com/live" },
267
362
  pbschicago: { name: "PBS Chicago (WTTW)", stationId: "30415", url: "https://www.wttw.com/wttw-live-stream" },
268
363
  "pbschicago-hulu": { channelSelector: "PBS", url: "https://www.hulu.com/live" },
269
364
  pbslakeshore: { name: "PBS Lakeshore (WYIN)", stationId: "49237", url: "https://video.lakeshorepbs.org/livestream" },
270
365
  "pbslakeshore-hulu": { channelSelector: "Lakeshore PBS", url: "https://www.hulu.com/live" },
366
+ retroplex: { channelSelector: "RetroPlex (East)", name: "RetroPlex", stationId: "65791", url: "https://www.hulu.com/live" },
367
+ retroplexp: { channelSelector: "RetroPlex (West)", name: "RetroPlex (Pacific)", stationId: "65793", url: "https://www.hulu.com/live" },
271
368
  science: { name: "Science", stationId: "57390", url: "https://watch.foodnetwork.com/channel/science" },
272
369
  showtime: { name: "Showtime", stationId: "91620", url: "https://www.paramountplus.com/live-tv/stream/showtime-east" },
273
370
  "showtime-yttv": { channelSelector: "Showtime East", url: "https://tv.youtube.com/live" },
274
371
  showtimep: { name: "Showtime (Pacific)", stationId: "91621", url: "https://www.paramountplus.com/live-tv/stream/showtime-west" },
372
+ smithsonian: { channelSelector: "Smithsonian Channel", name: "Smithsonian Channel", pacificStationId: "82695", stationId: "58532", url: "https://www.hulu.com/live" },
373
+ "smithsonian-yttv": { channelSelector: "Smithsonian Channel", url: "https://tv.youtube.com/live" },
374
+ starz: { name: "Starz", stationId: "34941", url: "https://www.starz.com/us/en/play/2" },
375
+ "starz-hulu": { channelSelector: "STARZ (East)", url: "https://www.hulu.com/live" },
376
+ starzcinema: { channelSelector: "STARZ Cinema (East)", name: "Starz Cinema", stationId: "67236", url: "https://www.hulu.com/live" },
377
+ starzcinemap: { channelSelector: "STARZ Cinema (West)", name: "Starz Cinema (Pacific)", stationId: "67365", url: "https://www.hulu.com/live" },
378
+ starzcomedy: { channelSelector: "STARZ Comedy (East)", name: "Starz Comedy", stationId: "57569", url: "https://www.hulu.com/live" },
379
+ starzcomedyp: { channelSelector: "STARZ Comedy (West)", name: "Starz Comedy (Pacific)", stationId: "57575", url: "https://www.hulu.com/live" },
380
+ starzedge: { channelSelector: "STARZ Edge (East)", name: "Starz Edge", stationId: "57573", url: "https://www.hulu.com/live" },
381
+ starzedgep: { channelSelector: "STARZ Edge (West)", name: "Starz Edge (Pacific)", stationId: "57578", url: "https://www.hulu.com/live" },
382
+ starzencore: { channelSelector: "STARZ Encore (East)", name: "Starz Encore", stationId: "36225", url: "https://www.hulu.com/live" },
383
+ starzencoreaction: { channelSelector: "STARZ Encore Action (East)", name: "Starz Encore Action", stationId: "72015", url: "https://www.hulu.com/live" },
384
+ starzencoreactionp: { channelSelector: "STARZ Encore Action (West)", name: "Starz Encore Action (Pacific)", stationId: "103833", url: "https://www.hulu.com/live" },
385
+ starzencoreblack: { channelSelector: "STARZ Encore Black (East)", name: "Starz Encore Black", stationId: "72014", url: "https://www.hulu.com/live" },
386
+ starzencoreblackp: { channelSelector: "STARZ Encore Black (West)", name: "Starz Encore Black (Pacific)", stationId: "103834", url: "https://www.hulu.com/live" },
387
+ starzencoreclassic: { channelSelector: "STARZ Encore Classic (East)", name: "Starz Encore Classic", stationId: "83404", url: "https://www.hulu.com/live" },
388
+ starzencoreclassicp: { channelSelector: "STARZ Encore Classic (West)", name: "Starz Encore Classic (Pacific)", stationId: "97233", url: "https://www.hulu.com/live" },
389
+ starzencoreespanol: { channelSelector: "STARZ Encore Español (East)", name: "Starz Encore Español", stationId: "72016", url: "https://www.hulu.com/live" },
390
+ starzencoreespanolp: { channelSelector: "STARZ Encore Español (West)", name: "Starz Encore Español (Pacific)", stationId: "104730", url: "https://www.hulu.com/live" },
391
+ starzencorefamily: { channelSelector: "STARZ Encore Family (East)", name: "Starz Encore Family", stationId: "14886", url: "https://www.hulu.com/live" },
392
+ starzencorefamilyp: { channelSelector: "STARZ Encore Family (West)", name: "Starz Encore Family (Pacific)", stationId: "103829", url: "https://www.hulu.com/live" },
393
+ starzencorep: { channelSelector: "STARZ Encore (West)", name: "Starz Encore (Pacific)", stationId: "67237", url: "https://www.hulu.com/live" },
394
+ starzencoresuspense: { channelSelector: "STARZ Encore Suspense (East)", name: "Starz Encore Suspense", stationId: "83076", url: "https://www.hulu.com/live" },
395
+ starzencoresuspensep: { channelSelector: "STARZ Encore Suspense (West)", name: "Starz Encore Suspense (Pacific)", stationId: "103836", url: "https://www.hulu.com/live" },
396
+ starzencorewesterns: { channelSelector: "STARZ Encore Westerns (East)", name: "Starz Encore Westerns", stationId: "14765", url: "https://www.hulu.com/live" },
397
+ starzencorewesternsp: { channelSelector: "STARZ Encore Westerns (West)", name: "Starz Encore Westerns (Pacific)", stationId: "103856", url: "https://www.hulu.com/live" },
398
+ starzinblack: { channelSelector: "STARZ in Black (East)", name: "Starz in Black", stationId: "67235", url: "https://www.hulu.com/live" },
399
+ starzinblackp: { channelSelector: "STARZ in Black (West)", name: "Starz in Black (Pacific)", stationId: "67367", url: "https://www.hulu.com/live" },
400
+ starzkids: { channelSelector: "STARZ Kids (East)", name: "Starz Kids", stationId: "57581", url: "https://www.hulu.com/live" },
401
+ starzkidsp: { channelSelector: "STARZ Kids (West)", name: "Starz Kids (Pacific)", stationId: "57583", url: "https://www.hulu.com/live" },
402
+ starzp: { channelSelector: "STARZ (West)", name: "Starz (Pacific)", stationId: "34949", url: "https://www.hulu.com/live" },
403
+ sundancetv: { channelSelector: "SundanceTV", name: "SundanceTV", pacificStationId: "78806", stationId: "71280", url: "https://tv.youtube.com/live" },
275
404
  syfy: { channelSelector: "Syfy_East", name: "Syfy", stationId: "58623", url: "https://www.usanetwork.com/live" },
405
+ "syfy-directv": { channelSelector: "SYFY", url: "https://stream.directv.com" },
276
406
  "syfy-hulu": { channelSelector: "SYFY", url: "https://www.hulu.com/live" },
277
407
  "syfy-sling": { channelSelector: "SYFY", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
278
408
  "syfy-yttv": { channelSelector: "SYFY", url: "https://tv.youtube.com/live" },
279
409
  syfyp: { channelSelector: "Syfy_West", name: "Syfy (Pacific)", stationId: "65626", url: "https://www.usanetwork.com/live" },
280
410
  tbs: { name: "TBS", stationId: "58515", url: "https://www.tbs.com/watchtbs/east" },
411
+ "tbs-directv": { channelSelector: "TBS", url: "https://stream.directv.com" },
281
412
  "tbs-hulu": { channelSelector: "TBS (East)", url: "https://www.hulu.com/live" },
282
413
  "tbs-sling": { channelSelector: "TBS", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
283
414
  "tbs-yttv": { channelSelector: "TBS", url: "https://tv.youtube.com/live" },
284
415
  tbsp: { name: "TBS (Pacific)", stationId: "67890", url: "https://www.tbs.com/watchtbs/west" },
285
416
  "tbsp-hulu": { channelSelector: "TBS (West)", url: "https://www.hulu.com/live" },
286
- tlc: { name: "TLC", stationId: "57391", url: "https://watch.foodnetwork.com/channel/tlc" },
417
+ tcm: { channelSelector: "TCM (East)", name: "TCM", stationId: "64312", url: "https://www.hulu.com/live" },
418
+ "tcm-yttv": { channelSelector: "Turner Classic Movies", url: "https://tv.youtube.com/live" },
419
+ tcmp: { channelSelector: "TCM (West)", name: "TCM (Pacific)", stationId: "64312", tvgShift: 3, url: "https://www.hulu.com/live" },
420
+ tennis: { channelSelector: "Tennis Channel", name: "Tennis Channel", stationId: "60316", url: "https://tv.youtube.com/live" },
421
+ tennis2: { channelSelector: "T2", name: "Tennis Channel 2", stationId: "137752", url: "https://tv.youtube.com/live" },
422
+ "tennis2-hulu": { channelSelector: "Tennis Channel 2", url: "https://www.hulu.com/live" },
423
+ "tennis2-sling": { channelSelector: "T2", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
424
+ tlc: { name: "TLC", pacificStationId: "79911", stationId: "57391", url: "https://watch.foodnetwork.com/channel/tlc" },
425
+ "tlc-directv": { channelSelector: "TLC", url: "https://stream.directv.com" },
287
426
  "tlc-hulu": { channelSelector: "TLC", url: "https://www.hulu.com/live" },
288
427
  "tlc-sling": { channelSelector: "TLC", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
289
428
  "tlc-yttv": { channelSelector: "TLC", url: "https://tv.youtube.com/live" },
290
429
  tnt: { name: "TNT", stationId: "42642", url: "https://www.tntdrama.com/watchtnt/east" },
430
+ "tnt-directv": { channelSelector: "TNT", url: "https://stream.directv.com" },
291
431
  "tnt-hulu": { channelSelector: "TNT (East)", url: "https://www.hulu.com/live" },
292
432
  "tnt-sling": { channelSelector: "TNT", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
293
433
  "tnt-yttv": { channelSelector: "TNT", url: "https://tv.youtube.com/live" },
294
434
  tntp: { name: "TNT (Pacific)", stationId: "61340", url: "https://www.tntdrama.com/watchtnt/west" },
295
435
  "tntp-hulu": { channelSelector: "TNT (West)", url: "https://www.hulu.com/live" },
296
- travel: { name: "Travel", stationId: "59303", url: "https://watch.foodnetwork.com/channel/travel-channel" },
436
+ travel: { name: "Travel", pacificStationId: "64525", stationId: "59303", url: "https://watch.foodnetwork.com/channel/travel-channel" },
437
+ "travel-directv": { channelSelector: "Travel Channel", url: "https://stream.directv.com" },
297
438
  "travel-hulu": { channelSelector: "Travel Channel", url: "https://www.hulu.com/live" },
298
439
  "travel-sling": { channelSelector: "Travel Channel", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
299
440
  "travel-yttv": { channelSelector: "Travel Channel", url: "https://tv.youtube.com/live" },
300
- trutv: { name: "truTV", stationId: "64490", url: "https://www.trutv.com/watchtrutv/east" },
441
+ trutv: { name: "truTV", pacificStationId: "65717", stationId: "64490", url: "https://www.trutv.com/watchtrutv/east" },
442
+ "trutv-directv": { channelSelector: "truTV", url: "https://stream.directv.com" },
301
443
  "trutv-hulu": { channelSelector: "truTV (East)", url: "https://www.hulu.com/live" },
302
444
  "trutv-sling": { channelSelector: "truTV", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
303
445
  "trutv-yttv": { channelSelector: "truTV", url: "https://tv.youtube.com/live" },
304
- trutvp: { name: "truTV (Pacific)", stationId: "65717", url: "https://www.trutv.com/watchtrutv/east" },
305
446
  "trutvp-hulu": { channelSelector: "truTV (West)", url: "https://www.hulu.com/live" },
447
+ tvland: { channelSelector: "TV Land", name: "TV Land", pacificStationId: "74134", stationId: "73541", url: "https://tv.youtube.com/live" },
448
+ "tvland-hulu": { channelSelector: "TV Land", url: "https://www.hulu.com/live" },
306
449
  usa: { channelSelector: "USA_East", name: "USA Network", stationId: "58452", url: "https://www.usanetwork.com/live" },
450
+ "usa-directv": { channelSelector: "USA Network", url: "https://stream.directv.com" },
307
451
  "usa-hulu": { channelSelector: "USA", url: "https://www.hulu.com/live" },
308
452
  "usa-sling": { channelSelector: "USA", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
309
453
  "usa-yttv": { channelSelector: "USA", url: "https://tv.youtube.com/live" },
310
454
  usap: { channelSelector: "USA_West", name: "USA Network (Pacific)", stationId: "74030", url: "https://www.usanetwork.com/live" },
311
- vh1: { name: "VH1", stationId: "60046", url: "https://www.vh1.com/live-tv" },
455
+ vh1: { name: "VH1", pacificStationId: "64634", stationId: "60046", url: "https://www.vh1.com/live-tv" },
456
+ "vh1-directv": { channelSelector: "VH1", url: "https://stream.directv.com" },
312
457
  "vh1-hulu": { channelSelector: "VH1", url: "https://www.hulu.com/live" },
313
458
  "vh1-yttv": { channelSelector: "VH1", url: "https://tv.youtube.com/live" },
459
+ vice: { channelSelector: "Vice", name: "Vice", pacificStationId: "92375", stationId: "65732", url: "https://www.hulu.com/live" },
460
+ "vice-sling": { channelSelector: "VICE", url: "https://watch.sling.com/dashboard/grid_guide/grid_guide_a_z" },
314
461
  weather: { channelSelector: "The Weather Channel", name: "The Weather Channel", stationId: "58812", url: "https://www.hulu.com/live" },
315
- "weather-yttv": { channelSelector: "The Weather Channel", url: "https://tv.youtube.com/live" }
462
+ "weather-yttv": { channelSelector: "The Weather Channel", url: "https://tv.youtube.com/live" },
463
+ wetv: { channelSelector: "WE tv", name: "WE tv", pacificStationId: "108192", stationId: "59296", url: "https://tv.youtube.com/live" }
316
464
  };
465
+ /* eslint-enable @stylistic/max-len */
466
+ // Pacific channel auto-generation.
467
+ /* PrismCast automatically generates Pacific timezone channel entries to reduce manual maintenance. Two tiers of generation run at module load, producing entries
468
+ * that are functionally identical to hand-written ones. Generated entries never override manually-defined entries — if a key already exists in BASE_CHANNELS,
469
+ * the manual definition takes precedence.
470
+ *
471
+ * Tier 1 — Pacific canonicals via pacificStationId:
472
+ *
473
+ * When an East canonical has a pacificStationId field, the system generates a "{key}p" entry with the Pacific station ID, the same url and channelSelector,
474
+ * and " (Pacific)" appended to the name. This works for channels where providers serve region-appropriate content via a single URL. Channels with distinct
475
+ * Pacific URLs (e.g., bravo_west vs bravo_east) or different Pacific channelSelectors (e.g., E-_West vs E-_East) must define their Pacific canonical manually.
476
+ *
477
+ * Example — adding pacificStationId to the East canonical:
478
+ * animal: { name: "Animal Planet", pacificStationId: "68785", stationId: "57394", url: "..." }
479
+ * Auto-generates:
480
+ * animalp: { name: "Animal Planet (Pacific)", stationId: "68785", url: "..." }
481
+ *
482
+ * Tier 2 — Pacific provider variants from East provider variants:
483
+ *
484
+ * For each East variant "{key}-{provider}", if a Pacific canonical "{key}p" exists (manual or generated), the system generates "{key}p-{provider}" with the
485
+ * same channelSelector and url. Providers serve region-appropriate feeds with a single selector — the Pacific variant's inherited stationId provides the
486
+ * correct timezone guide data. Variants with "East" or "West" in the channelSelector are skipped — these have explicit timezone entries on the provider and
487
+ * need manual Pacific definitions (e.g., Hulu's "TBS (East)" / "TBS (West)").
488
+ *
489
+ * Example — East variant with a Pacific canonical present:
490
+ * "animal-hulu": { channelSelector: "Animal Planet", url: "https://www.hulu.com/live" }
491
+ * Auto-generates (because animalp exists):
492
+ * "animalp-hulu": { channelSelector: "Animal Planet", url: "https://www.hulu.com/live" }
493
+ *
494
+ * Adding a new channel with Pacific support:
495
+ *
496
+ * 1. Look up both East and Pacific HD station IDs in Gracenote (http://localhost:8089/tms/stations/<search>).
497
+ * 2. Add the East canonical with both IDs: mychannel: { name: "...", pacificStationId: "PACIFIC_ID", stationId: "EAST_ID", url: "..." }
498
+ * 3. Add East provider variants: "mychannel-hulu": { channelSelector: "...", url: "https://www.hulu.com/live" }
499
+ * 4. The system auto-generates mychannelp (Pacific canonical) and mychannelp-hulu (Pacific provider variant).
500
+ * 5. If the Pacific version needs a different URL or channelSelector, skip pacificStationId and define the Pacific canonical manually instead.
501
+ *
502
+ * Manual entries always take precedence — generated entries never overwrite existing keys in BASE_CHANNELS.
503
+ */
504
+ function generatePacificEntries(channels) {
505
+ const eastWestPattern = /east|west/i;
506
+ const generated = {};
507
+ // Tier 1: Generate Pacific canonicals from East canonicals with pacificStationId.
508
+ for (const [key, channel] of Object.entries(channels)) {
509
+ if (!channel.pacificStationId) {
510
+ continue;
511
+ }
512
+ const pacificKey = key + "p";
513
+ // Manual Pacific canonical takes precedence.
514
+ if (pacificKey in channels) {
515
+ continue;
516
+ }
517
+ const entry = {
518
+ ...(channel.channelSelector ? { channelSelector: channel.channelSelector } : {}),
519
+ name: (channel.name ?? key) + " (Pacific)",
520
+ stationId: channel.pacificStationId,
521
+ url: channel.url
522
+ };
523
+ generated[pacificKey] = entry;
524
+ }
525
+ // Merge manual and generated entries for Pacific canonical lookup in Tier 2.
526
+ const allChannels = { ...channels, ...generated };
527
+ // Tier 2: Generate Pacific provider variants from East provider variants.
528
+ for (const [key, channel] of Object.entries(channels)) {
529
+ const dashIndex = key.indexOf("-");
530
+ if (dashIndex === -1) {
531
+ continue;
532
+ }
533
+ const baseKey = key.substring(0, dashIndex);
534
+ const providerSuffix = key.substring(dashIndex);
535
+ // The base key must exist as a canonical entry (otherwise this is not a provider variant).
536
+ if (!(baseKey in channels)) {
537
+ continue;
538
+ }
539
+ const pacificCanonicalKey = baseKey + "p";
540
+ const pacificVariantKey = pacificCanonicalKey + providerSuffix;
541
+ // A Pacific canonical must exist (manual or generated) for the variant to be meaningful.
542
+ if (!(pacificCanonicalKey in allChannels)) {
543
+ continue;
544
+ }
545
+ // Manual Pacific variant takes precedence.
546
+ if ((pacificVariantKey in channels) || (pacificVariantKey in generated)) {
547
+ continue;
548
+ }
549
+ // Skip when the East variant's channelSelector contains timezone-specific terms. These channels have provider-specific East/West entries
550
+ // (e.g., Hulu's "TBS (East)" / "TBS (West)") and need manually-defined Pacific variants with the correct West selector.
551
+ if (channel.channelSelector && eastWestPattern.test(channel.channelSelector)) {
552
+ continue;
553
+ }
554
+ const entry = {
555
+ ...(channel.channelSelector ? { channelSelector: channel.channelSelector } : {}),
556
+ url: channel.url
557
+ };
558
+ generated[pacificVariantKey] = entry;
559
+ }
560
+ return generated;
561
+ }
562
+ export const CHANNELS = { ...generatePacificEntries(BASE_CHANNELS), ...BASE_CHANNELS };
317
563
  // Re-export CHANNELS as PREDEFINED_CHANNELS for use in userChannels.ts where the distinction between predefined and user channels is important.
318
564
  export { CHANNELS as PREDEFINED_CHANNELS };
319
565
  //# sourceMappingURL=index.js.map