Replace LF line endings with CRLF

This commit is contained in:
freearhey
2025-09-28 17:55:05 +03:00
parent efc74efcf8
commit b6a589c62a
1192 changed files with 445631 additions and 445631 deletions

View File

@@ -1,21 +1,21 @@
# tvguide.com
https://www.tvguide.com/listings/
### Download the guide
```sh
npm run grab --- --site=tvguide.com
```
### Update channel list
```sh
npm run channels:parse --- --config=./sites/tvguide.com/tvguide.com.config.js --output=./sites/tvguide.com/tvguide.com.channels.xml
```
### Test
```sh
npm test --- tvguide.com
```
# tvguide.com
https://www.tvguide.com/listings/
### Download the guide
```sh
npm run grab --- --site=tvguide.com
```
### Update channel list
```sh
npm run channels:parse --- --config=./sites/tvguide.com/tvguide.com.config.js --output=./sites/tvguide.com/tvguide.com.channels.xml
```
### Test
```sh
npm test --- tvguide.com
```

View File

@@ -1,156 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="tvguide.com" lang="en" xmltv_id="5StarMax.us@East" site_id="9233011931">5StarMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ABC.us@East" site_id="9233011874">ABC Network Feed</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ACCNetwork.us" site_id="9200017734">ACC Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ActionMax.us@East" site_id="9200016592">ActionMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AE.us@East" site_id="9200004889">A&amp;E</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AMC.us@East" site_id="9233011832">AMC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AmericanHeroesChannel.us" site_id="9233015768">American Heroes</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AnimalPlanet.us@East" site_id="9200018479">Animal Planet</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCAmerica.us@East" site_id="9200014701">BBC America</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCNews.uk@NorthAmerica" site_id="9200004927">BBC News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BET.us@East" site_id="9233005931">BET</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BETHer.us@East" site_id="9200020665">BET Her</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BigTenNetwork.us" site_id="9200004533">Big Ten Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BloombergTV.us" site_id="9233015798">Bloomberg Television</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Boomerang.us" site_id="9233015844">Boomerang</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Bravo.us@East" site_id="9200002886">Bravo</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CartoonNetwork.us@East" site_id="9200004848">Cartoon Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBS.us@East" site_id="9200018514">CBS National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBSSportsNetworkUSA.us" site_id="9233013235">CBS Sports Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Cinemax.us@East" site_id="9233009829">Cinemax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CMT.us@East" site_id="9200012085">CMT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNBC.us" site_id="9200009413">CNBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNN.us" site_id="9233013812">CNN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ComedyCentral.us@East" site_id="9200000657">Comedy Central</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CookingChannel.us" site_id="9200000016">Cooking</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CrimePlusInvestigation.us" site_id="9233003673">Crime &amp; Investigation Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CSPAN.us" site_id="9233007144">C-SPAN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DestinationAmerica.us" site_id="9200009245">Destination America</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryChannel.us@East" site_id="9233004102">Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryFamily.us" site_id="9200004290">Discovery Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryLife.us" site_id="9233013857">Discovery Life</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyChannel.us@East" site_id="9200018475">Disney</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyJunior.us@East" site_id="9233009788">Disney Junior</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyXD.us@East" site_id="9200004852">Disney XD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="E.us@East" site_id="9200012343">E!</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN2.us" site_id="9200012351">ESPN2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN.us" site_id="9200006937">ESPN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNews.us" site_id="9200006950">ESPN News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNU.us" site_id="9233011350">ESPNU</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FanDuelTV.us" site_id="9200012412">FanDuel TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Flix.us@East" site_id="9233000217">Flix</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoodNetwork.us@East" site_id="9233009448">Food Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Fox.us@East" site_id="9233002271">FOX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxBusinessNetwork.us" site_id="9200009124">Fox Business Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxNewsChannel.us" site_id="9233000410">Fox News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports1.us" site_id="9233008440">FOX Sports 1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports2.us" site_id="9200009884">FOX Sports 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Freeform.us@East" site_id="9200006942">Freeform</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Fuse.us@East" site_id="9233011488">Fuse HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FX.us@East" site_id="9200006932">FX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXMovieChannel.us" site_id="9233013967">FX Movie</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXX.us@East" site_id="9200018644">FXX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FYI.us@East" site_id="9200020460">FYI</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GameShowNetwork.us@East" site_id="9200019858">Game Show Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GolfChannel.us" site_id="9233005443">Golf</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GreatAmericanFamily.us" site_id="9200009636">Great American Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkChannel.us@East" site_id="9200016034">Hallmark</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkFamily.us" site_id="9233010939">Hallmark Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkMoviesMysteries.us@East" site_id="9233013351">Hallmark Mystery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBO2.us@East" site_id="9233003524">HBO 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBO.us@East" site_id="9200004886">HBO</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOComedy.us@East" site_id="9200006981">HBO Comedy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOFamily.us@East" site_id="9200004595">HBO Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOSignature.us@East" site_id="9233008160">HBO Signature</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOZone.us@East" site_id="9233009866">HBO Zone</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HGTV.us@East" site_id="9233004104">HGTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="History.us@East" site_id="9233008002">History</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HLN.us" site_id="9200016601">HLN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IFC.us@East" site_id="9200004303">IFC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="InvestigationDiscovery.us@East" site_id="9200002243">Investigation Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IONTV.us@East" site_id="9233011910">ION</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Lifetime.us@East" site_id="9200020452">Lifetime</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeMovies.us@East" site_id="9233009825">LMN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Logo.us@East" site_id="9233013354">LOGO</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MagnoliaNetwork.us@East" site_id="9200012415">MAGNOLIA Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMHD.us" site_id="9200009335">MGM+ HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusDriveIn.us" site_id="9200006851">MGM+ Drive-In</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusHits.us@East" site_id="9233013634">MGM+ Hits HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusMarquee.us" site_id="9200020594">MGM+ Marquee HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MLBNetwork.us" site_id="9200009223">MLB Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MoreMax.us@East" site_id="9233015766">MoreMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MotorTrend.us" site_id="9233003479">Motor Trend Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MovieMax.us@East" site_id="9233000532">MovieMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MSNBC.us" site_id="9233006803">MSNBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTV2.us@East" site_id="9200000872">MTV2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTV.us@East" site_id="9200014754">MTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MNT.us" site_id="9233001847">MyNetworkTV National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographic.us@East" site_id="9233002310">National Geographic</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographicWild.us@East" site_id="9200004683">National Geographic Wild</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBATV.us" site_id="9200000070">NBA TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBC.us@East" site_id="9233009876">NBC National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NewsNation.us" site_id="9233013251">NewsNation</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NFLNetwork.us" site_id="9200004330">NFL Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NHLNetwork.us" site_id="9233009455">NHL Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Nickelodeon.us@East" site_id="9200006939">Nickelodeon</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NickJr.us@East" site_id="9233007153">Nick Jr.</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Nicktoons.us@East" site_id="9200020469">Nicktoons</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OutdoorChannel.us" site_id="9233003538">Outdoor</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OuterMax.us@East" site_id="9200014841">OuterMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Ovation.us" site_id="9233011240">Ovation</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OWN.us@East" site_id="9200002736">OWN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Oxygen.us@East" site_id="9200004949">Oxygen</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ParamountNetwork.us@East" site_id="9233013810">Paramount Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="PBS.us@East" site_id="9233004141">PBS HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Pop.us@East" site_id="9200020464">Pop Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Reelz.us" site_id="9200011769">Reelz</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Science.us" site_id="9200019847">Science</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SECNetwork.us" site_id="9233008517">SEC Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Showtime2.us@East" site_id="9200018178">SHOWTIME 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Showtime.us@East" site_id="9200016599">Paramount+ with Showtime</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeExtreme.us@East" site_id="9200004879">SHOWTIME EXTREME</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeFamilyZone.us@East" site_id="9200000968">SHOWTIME FAMILY ZONE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeNext.us@East" site_id="9200016686">SHOWTIME NEXT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeShowcase.us@East" site_id="9233003805">SHOWTIME SHOWCASE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeWomen.us@East" site_id="9200002975">SHOWTIME WOMEN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShoxBet.us@East" site_id="9233017018">SHOxBET</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SmithsonianChannel.us@East" site_id="9233002112">Smithsonian</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Starz.us@East" site_id="9233013809">STARZ</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzCinema.us@East" site_id="9233008357">STARZ Cinema</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzComedy.us@East" site_id="9233003558">STARZ Comedy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEdge.us@East" site_id="9233011247">STARZ Edge</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncore.us@East" site_id="9200009649">STARZ ENCORE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreAction.us@East" site_id="9233005667">STARZ ENCORE Action</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreBlack.us@East" site_id="9200001097">STARZ ENCORE Black</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreClassic.us@East" site_id="9200003144">STARZ ENCORE Classic</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreFamily.us@East" site_id="9200011867">STARZ ENCORE Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreSuspense.us@East" site_id="9200011866">STARZ ENCORE Suspense</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreWesterns.us@East" site_id="9233008131">STARZ ENCORE Westerns</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzInBlack.us@East" site_id="9200011898">STARZ InBlack</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzKidsFamily.us@East" site_id="9200006977">STARZ Kids &amp; Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SundanceTV.us@East" site_id="9233001687">Sundance TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Syfy.us@East" site_id="9200004316">Syfy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TBS.us@East" site_id="9233000403">tbs</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TCM.us@East" site_id="9200017928">Turner Classic Movies</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TeenNick.us@East" site_id="9200006974">TeenNick</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Telemundo.us@East" site_id="9200011927">Telemundo</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TennisChannel.us" site_id="9200017917">The Tennis</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheCW.us" site_id="9233011398">CW Network National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannel.us@East" site_id="9233015305">The Movie</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannelXtra.us@East" site_id="9233011536">The Movie Xtra</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheWeatherChannel.us" site_id="9233013815">The Weather</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ThrillerMax.us@East" site_id="9200000856">ThrillerMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TLC.us@East" site_id="9233004112">TLC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TNT.us@East" site_id="9233011830">TNT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TravelChannel.us@East" site_id="9233000035">Travel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="truTV.us@East" site_id="9200009547">truTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TVLand.us@East" site_id="9233005468">TV Land</channel>
<channel site="tvguide.com" lang="en" xmltv_id="UniversalKids.us@East" site_id="9233003660">Universal Kids (Off-Air)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="USANetwork.us@East" site_id="9233004106">USA</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VH1.us@East" site_id="9233000037">VH1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VICETV.us" site_id="9233002242">VICE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="WeTV.us@East" site_id="9200018188">WE tv</channel>
<channel site="tvguide.com" lang="es" xmltv_id="Univision.us@East" site_id="9200000867">Univision</channel>
</channels>
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="tvguide.com" lang="en" xmltv_id="5StarMax.us@East" site_id="9233011931">5StarMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ABC.us@East" site_id="9233011874">ABC Network Feed</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ACCNetwork.us" site_id="9200017734">ACC Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ActionMax.us@East" site_id="9200016592">ActionMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AE.us@East" site_id="9200004889">A&amp;E</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AMC.us@East" site_id="9233011832">AMC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AmericanHeroesChannel.us" site_id="9233015768">American Heroes</channel>
<channel site="tvguide.com" lang="en" xmltv_id="AnimalPlanet.us@East" site_id="9200018479">Animal Planet</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCAmerica.us@East" site_id="9200014701">BBC America</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BBCNews.uk@NorthAmerica" site_id="9200004927">BBC News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BET.us@East" site_id="9233005931">BET</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BETHer.us@East" site_id="9200020665">BET Her</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BigTenNetwork.us" site_id="9200004533">Big Ten Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="BloombergTV.us" site_id="9233015798">Bloomberg Television</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Boomerang.us" site_id="9233015844">Boomerang</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Bravo.us@East" site_id="9200002886">Bravo</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CartoonNetwork.us@East" site_id="9200004848">Cartoon Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBS.us@East" site_id="9200018514">CBS National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CBSSportsNetworkUSA.us" site_id="9233013235">CBS Sports Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Cinemax.us@East" site_id="9233009829">Cinemax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CMT.us@East" site_id="9200012085">CMT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNBC.us" site_id="9200009413">CNBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CNN.us" site_id="9233013812">CNN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ComedyCentral.us@East" site_id="9200000657">Comedy Central</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CookingChannel.us" site_id="9200000016">Cooking</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CrimePlusInvestigation.us" site_id="9233003673">Crime &amp; Investigation Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="CSPAN.us" site_id="9233007144">C-SPAN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DestinationAmerica.us" site_id="9200009245">Destination America</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryChannel.us@East" site_id="9233004102">Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryFamily.us" site_id="9200004290">Discovery Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DiscoveryLife.us" site_id="9233013857">Discovery Life</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyChannel.us@East" site_id="9200018475">Disney</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyJunior.us@East" site_id="9233009788">Disney Junior</channel>
<channel site="tvguide.com" lang="en" xmltv_id="DisneyXD.us@East" site_id="9200004852">Disney XD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="E.us@East" site_id="9200012343">E!</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN2.us" site_id="9200012351">ESPN2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPN.us" site_id="9200006937">ESPN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNews.us" site_id="9200006950">ESPN News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ESPNU.us" site_id="9233011350">ESPNU</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FanDuelTV.us" site_id="9200012412">FanDuel TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Flix.us@East" site_id="9233000217">Flix</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoodNetwork.us@East" site_id="9233009448">Food Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Fox.us@East" site_id="9233002271">FOX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxBusinessNetwork.us" site_id="9200009124">Fox Business Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxNewsChannel.us" site_id="9233000410">Fox News</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports1.us" site_id="9233008440">FOX Sports 1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FoxSports2.us" site_id="9200009884">FOX Sports 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Freeform.us@East" site_id="9200006942">Freeform</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Fuse.us@East" site_id="9233011488">Fuse HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FX.us@East" site_id="9200006932">FX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXMovieChannel.us" site_id="9233013967">FX Movie</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FXX.us@East" site_id="9200018644">FXX</channel>
<channel site="tvguide.com" lang="en" xmltv_id="FYI.us@East" site_id="9200020460">FYI</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GameShowNetwork.us@East" site_id="9200019858">Game Show Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GolfChannel.us" site_id="9233005443">Golf</channel>
<channel site="tvguide.com" lang="en" xmltv_id="GreatAmericanFamily.us" site_id="9200009636">Great American Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkChannel.us@East" site_id="9200016034">Hallmark</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkFamily.us" site_id="9233010939">Hallmark Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HallmarkMoviesMysteries.us@East" site_id="9233013351">Hallmark Mystery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBO2.us@East" site_id="9233003524">HBO 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBO.us@East" site_id="9200004886">HBO</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOComedy.us@East" site_id="9200006981">HBO Comedy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOFamily.us@East" site_id="9200004595">HBO Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOSignature.us@East" site_id="9233008160">HBO Signature</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HBOZone.us@East" site_id="9233009866">HBO Zone</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HGTV.us@East" site_id="9233004104">HGTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="History.us@East" site_id="9233008002">History</channel>
<channel site="tvguide.com" lang="en" xmltv_id="HLN.us" site_id="9200016601">HLN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IFC.us@East" site_id="9200004303">IFC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="InvestigationDiscovery.us@East" site_id="9200002243">Investigation Discovery</channel>
<channel site="tvguide.com" lang="en" xmltv_id="IONTV.us@East" site_id="9233011910">ION</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Lifetime.us@East" site_id="9200020452">Lifetime</channel>
<channel site="tvguide.com" lang="en" xmltv_id="LifetimeMovies.us@East" site_id="9233009825">LMN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Logo.us@East" site_id="9233013354">LOGO</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MagnoliaNetwork.us@East" site_id="9200012415">MAGNOLIA Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMHD.us" site_id="9200009335">MGM+ HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusDriveIn.us" site_id="9200006851">MGM+ Drive-In</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusHits.us@East" site_id="9233013634">MGM+ Hits HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MGMPlusMarquee.us" site_id="9200020594">MGM+ Marquee HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MLBNetwork.us" site_id="9200009223">MLB Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MoreMax.us@East" site_id="9233015766">MoreMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MotorTrend.us" site_id="9233003479">Motor Trend Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MovieMax.us@East" site_id="9233000532">MovieMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MSNBC.us" site_id="9233006803">MSNBC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTV2.us@East" site_id="9200000872">MTV2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MTV.us@East" site_id="9200014754">MTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="MNT.us" site_id="9233001847">MyNetworkTV National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographic.us@East" site_id="9233002310">National Geographic</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NationalGeographicWild.us@East" site_id="9200004683">National Geographic Wild</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBATV.us" site_id="9200000070">NBA TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NBC.us@East" site_id="9233009876">NBC National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NewsNation.us" site_id="9233013251">NewsNation</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NFLNetwork.us" site_id="9200004330">NFL Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NHLNetwork.us" site_id="9233009455">NHL Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Nickelodeon.us@East" site_id="9200006939">Nickelodeon</channel>
<channel site="tvguide.com" lang="en" xmltv_id="NickJr.us@East" site_id="9233007153">Nick Jr.</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Nicktoons.us@East" site_id="9200020469">Nicktoons</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OutdoorChannel.us" site_id="9233003538">Outdoor</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OuterMax.us@East" site_id="9200014841">OuterMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Ovation.us" site_id="9233011240">Ovation</channel>
<channel site="tvguide.com" lang="en" xmltv_id="OWN.us@East" site_id="9200002736">OWN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Oxygen.us@East" site_id="9200004949">Oxygen</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ParamountNetwork.us@East" site_id="9233013810">Paramount Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="PBS.us@East" site_id="9233004141">PBS HD</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Pop.us@East" site_id="9200020464">Pop Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Reelz.us" site_id="9200011769">Reelz</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Science.us" site_id="9200019847">Science</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SECNetwork.us" site_id="9233008517">SEC Network</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Showtime2.us@East" site_id="9200018178">SHOWTIME 2</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Showtime.us@East" site_id="9200016599">Paramount+ with Showtime</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeExtreme.us@East" site_id="9200004879">SHOWTIME EXTREME</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeFamilyZone.us@East" site_id="9200000968">SHOWTIME FAMILY ZONE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeNext.us@East" site_id="9200016686">SHOWTIME NEXT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeShowcase.us@East" site_id="9233003805">SHOWTIME SHOWCASE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShowtimeWomen.us@East" site_id="9200002975">SHOWTIME WOMEN</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ShoxBet.us@East" site_id="9233017018">SHOxBET</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SmithsonianChannel.us@East" site_id="9233002112">Smithsonian</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Starz.us@East" site_id="9233013809">STARZ</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzCinema.us@East" site_id="9233008357">STARZ Cinema</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzComedy.us@East" site_id="9233003558">STARZ Comedy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEdge.us@East" site_id="9233011247">STARZ Edge</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncore.us@East" site_id="9200009649">STARZ ENCORE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreAction.us@East" site_id="9233005667">STARZ ENCORE Action</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreBlack.us@East" site_id="9200001097">STARZ ENCORE Black</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreClassic.us@East" site_id="9200003144">STARZ ENCORE Classic</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreFamily.us@East" site_id="9200011867">STARZ ENCORE Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreSuspense.us@East" site_id="9200011866">STARZ ENCORE Suspense</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzEncoreWesterns.us@East" site_id="9233008131">STARZ ENCORE Westerns</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzInBlack.us@East" site_id="9200011898">STARZ InBlack</channel>
<channel site="tvguide.com" lang="en" xmltv_id="StarzKidsFamily.us@East" site_id="9200006977">STARZ Kids &amp; Family</channel>
<channel site="tvguide.com" lang="en" xmltv_id="SundanceTV.us@East" site_id="9233001687">Sundance TV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Syfy.us@East" site_id="9200004316">Syfy</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TBS.us@East" site_id="9233000403">tbs</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TCM.us@East" site_id="9200017928">Turner Classic Movies</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TeenNick.us@East" site_id="9200006974">TeenNick</channel>
<channel site="tvguide.com" lang="en" xmltv_id="Telemundo.us@East" site_id="9200011927">Telemundo</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TennisChannel.us" site_id="9200017917">The Tennis</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheCW.us" site_id="9233011398">CW Network National</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannel.us@East" site_id="9233015305">The Movie</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheMovieChannelXtra.us@East" site_id="9233011536">The Movie Xtra</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TheWeatherChannel.us" site_id="9233013815">The Weather</channel>
<channel site="tvguide.com" lang="en" xmltv_id="ThrillerMax.us@East" site_id="9200000856">ThrillerMax</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TLC.us@East" site_id="9233004112">TLC</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TNT.us@East" site_id="9233011830">TNT</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TravelChannel.us@East" site_id="9233000035">Travel</channel>
<channel site="tvguide.com" lang="en" xmltv_id="truTV.us@East" site_id="9200009547">truTV</channel>
<channel site="tvguide.com" lang="en" xmltv_id="TVLand.us@East" site_id="9233005468">TV Land</channel>
<channel site="tvguide.com" lang="en" xmltv_id="UniversalKids.us@East" site_id="9233003660">Universal Kids (Off-Air)</channel>
<channel site="tvguide.com" lang="en" xmltv_id="USANetwork.us@East" site_id="9233004106">USA</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VH1.us@East" site_id="9233000037">VH1</channel>
<channel site="tvguide.com" lang="en" xmltv_id="VICETV.us" site_id="9233002242">VICE</channel>
<channel site="tvguide.com" lang="en" xmltv_id="WeTV.us@East" site_id="9200018188">WE tv</channel>
<channel site="tvguide.com" lang="es" xmltv_id="Univision.us@East" site_id="9200000867">Univision</channel>
</channels>

View File

@@ -1,152 +1,152 @@
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const debug = require('debug')('site:tvguide.com')
dayjs.extend(utc)
dayjs.extend(timezone)
const providerId = '9100001138'
const maxDuration = 240
const segments = 1440 / maxDuration
const headers = {
'referer': 'https://www.tvguide.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
}
const east_channels = [
'5StarMax', 'ABC Network Feed', 'ActionMax', 'A&E', 'AMC', 'Animal Planet', 'BBC America',
'BET', 'BET Her', 'Bravo', 'Cartoon Network', 'CBS National', 'Cinemax', 'CMT', 'Comedy Central',
'Discovery', 'Disney', 'Disney Junior', 'Disney XD', 'E!', 'Flix', 'Food Network', 'FOX', 'Freeform',
'Fuse HD', 'FX', 'FXX', 'FYI', 'Game Show Network', 'Hallmark', 'Hallmark Mystery', 'HBO 2',
'HBO Comedy', 'HBO', 'HBO Family', 'HBO Signature', 'HBO Zone', 'HGTV', 'History', 'IFC',
'Investigation Discovery', 'ION', 'Lifetime', 'LMN', 'LOGO', 'MAGNOLIA Network', 'MGM+ Hits HD',
'MoreMax', 'MovieMax', 'MTV2', 'MTV', 'National Geographic', 'National Geographic Wild', 'NBC National',
'Nickelodeon', 'Nick Jr.', 'Nicktoons', 'OuterMax', 'OWN', 'Oxygen', 'Paramount Network', 'PBS HD',
'Pop Network', 'SHOWTIME 2', 'Paramount+ with Showtime', 'SHOWTIME EXTREME', 'SHOWTIME FAMILY ZONE',
'SHOWTIME NEXT', 'SHOWTIME SHOWCASE', 'SHOWTIME WOMEN', 'SHOxBET', 'Smithsonian', 'STARZ Cinema',
'STARZ Comedy', 'STARZ', 'STARZ Edge', 'STARZ ENCORE Action', 'STARZ ENCORE Black',
'STARZ ENCORE Classic', 'STARZ ENCORE', 'STARZ ENCORE Family', 'STARZ ENCORE Suspense',
'STARZ ENCORE Westerns', 'STARZ InBlack', 'STARZ Kids & Family', 'Sundance TV', 'Syfy', 'tbs',
'Turner Classic Movies', 'TeenNick', 'Telemundo', 'The Movie', 'The Movie Xtra', 'ThrillerMax', 'TLC',
'TNT', 'Travel', 'truTV', 'TV Land', 'Universal Kids', 'USA', 'VH1', 'WE tv', 'Univision'
]
module.exports = {
site: 'tvguide.com',
days: 2,
request: {
headers: function () {
return headers
},
responseType: 'application/json',
decompress: true,
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
}
},
async url({ date, segment = 1 }) {
const params = []
if (module.exports.apiKey === undefined) {
module.exports.apiKey = await module.exports.fetchApiKey()
debug('Got api key', module.exports.apiKey)
}
if (date) {
if (segment > 1) {
date = date.add((segment - 1) * maxDuration, 'm')
}
params.push(`start=${date.unix()}`, `duration=${maxDuration}`)
}
params.push(`apiKey=${module.exports.apiKey}`)
return date ?
`https://backend.tvguide.com/tvschedules/tvguide/${providerId}/web?${params.join('&')}` :
`https://backend.tvguide.com/tvschedules/tvguide/serviceprovider/${providerId}/sources/web?${params.join('&')}`
},
async parser({ content, date, channel, fetchSegments = true }) {
const programs = []
const f = data => {
const result = []
if (typeof data === 'string') {
data = JSON.parse(data)
}
if (data && Array.isArray(data?.data?.items)) {
data.data.items
.filter(i => i.channel.sourceId.toString() === channel.site_id)
.forEach(i => {
result.push(...i.programSchedules.map(p => {
return { i: p, url: p.programDetails }
}))
})
}
return result
}
const queues = f(content)
if (queues.length && fetchSegments) {
for (let segment = 2; segment <= segments; segment++) {
const segmentUrl = await module.exports.url({ date, segment })
debug(`fetch segment ${segment}: ${segmentUrl}`)
try {
const res = await axios.get(segmentUrl, { headers })
queues.push(...f(res.data))
} catch (err) {
debug(`Failed to fetch segment ${segment}: ${err.message}`)
}
}
}
for (const queue of queues) {
try {
const res = await axios.get(queue.url, { headers })
const item = res.data?.data?.item || queue.i
programs.push({
title: item.title || queue.i.title,
sub_title: item.episodeNumber ? item.episodeTitle : null,
description: item.description,
season: item.seasonNumber,
episode: item.episodeNumber,
rating: item.rating ? { system: 'MPA', value: item.rating } : null,
categories: Array.isArray(item.genres) ? item.genres.map(g => g.name) : null,
start: dayjs.unix(item.startTime || queue.i.startTime),
stop: dayjs.unix(item.endTime || queue.i.endTime),
})
} catch (err) {
debug(`Failed to fetch program details ${queue.url}: ${err.message}`)
}
}
return programs
},
async channels() {
const channels = []
try {
const data = await axios
.get(await this.url({}), { headers })
.then(r => r.data)
data.data.items.forEach(item => {
const finalName = item.fullName.replace(/Channel|Schedule/g, '').trim()
const isEast = east_channels.some(name => name.toLowerCase().includes(finalName.toLowerCase()))
channels.push({
lang: 'en',
site_id: item.sourceId,
xmltv_id: finalName.replaceAll(/[ '&]/g, '') + '.us' + (isEast ? '@East' : ''),
name: finalName
})
})
} catch (err) {
console.error('Failed to fetch channels:', err.message)
}
return channels
},
async fetchApiKey() {
try {
const data = await axios
.get('https://www.tvguide.com/listings/')
.then(r => r.data)
return data ? data.match(/apiKey=([a-zA-Z0-9]+)&/)[1] : null
} catch (err) {
console.error('Failed to fetch API key:', err.message)
return null
}
}
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const debug = require('debug')('site:tvguide.com')
dayjs.extend(utc)
dayjs.extend(timezone)
const providerId = '9100001138'
const maxDuration = 240
const segments = 1440 / maxDuration
const headers = {
'referer': 'https://www.tvguide.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
}
const east_channels = [
'5StarMax', 'ABC Network Feed', 'ActionMax', 'A&E', 'AMC', 'Animal Planet', 'BBC America',
'BET', 'BET Her', 'Bravo', 'Cartoon Network', 'CBS National', 'Cinemax', 'CMT', 'Comedy Central',
'Discovery', 'Disney', 'Disney Junior', 'Disney XD', 'E!', 'Flix', 'Food Network', 'FOX', 'Freeform',
'Fuse HD', 'FX', 'FXX', 'FYI', 'Game Show Network', 'Hallmark', 'Hallmark Mystery', 'HBO 2',
'HBO Comedy', 'HBO', 'HBO Family', 'HBO Signature', 'HBO Zone', 'HGTV', 'History', 'IFC',
'Investigation Discovery', 'ION', 'Lifetime', 'LMN', 'LOGO', 'MAGNOLIA Network', 'MGM+ Hits HD',
'MoreMax', 'MovieMax', 'MTV2', 'MTV', 'National Geographic', 'National Geographic Wild', 'NBC National',
'Nickelodeon', 'Nick Jr.', 'Nicktoons', 'OuterMax', 'OWN', 'Oxygen', 'Paramount Network', 'PBS HD',
'Pop Network', 'SHOWTIME 2', 'Paramount+ with Showtime', 'SHOWTIME EXTREME', 'SHOWTIME FAMILY ZONE',
'SHOWTIME NEXT', 'SHOWTIME SHOWCASE', 'SHOWTIME WOMEN', 'SHOxBET', 'Smithsonian', 'STARZ Cinema',
'STARZ Comedy', 'STARZ', 'STARZ Edge', 'STARZ ENCORE Action', 'STARZ ENCORE Black',
'STARZ ENCORE Classic', 'STARZ ENCORE', 'STARZ ENCORE Family', 'STARZ ENCORE Suspense',
'STARZ ENCORE Westerns', 'STARZ InBlack', 'STARZ Kids & Family', 'Sundance TV', 'Syfy', 'tbs',
'Turner Classic Movies', 'TeenNick', 'Telemundo', 'The Movie', 'The Movie Xtra', 'ThrillerMax', 'TLC',
'TNT', 'Travel', 'truTV', 'TV Land', 'Universal Kids', 'USA', 'VH1', 'WE tv', 'Univision'
]
module.exports = {
site: 'tvguide.com',
days: 2,
request: {
headers: function () {
return headers
},
responseType: 'application/json',
decompress: true,
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
}
},
async url({ date, segment = 1 }) {
const params = []
if (module.exports.apiKey === undefined) {
module.exports.apiKey = await module.exports.fetchApiKey()
debug('Got api key', module.exports.apiKey)
}
if (date) {
if (segment > 1) {
date = date.add((segment - 1) * maxDuration, 'm')
}
params.push(`start=${date.unix()}`, `duration=${maxDuration}`)
}
params.push(`apiKey=${module.exports.apiKey}`)
return date ?
`https://backend.tvguide.com/tvschedules/tvguide/${providerId}/web?${params.join('&')}` :
`https://backend.tvguide.com/tvschedules/tvguide/serviceprovider/${providerId}/sources/web?${params.join('&')}`
},
async parser({ content, date, channel, fetchSegments = true }) {
const programs = []
const f = data => {
const result = []
if (typeof data === 'string') {
data = JSON.parse(data)
}
if (data && Array.isArray(data?.data?.items)) {
data.data.items
.filter(i => i.channel.sourceId.toString() === channel.site_id)
.forEach(i => {
result.push(...i.programSchedules.map(p => {
return { i: p, url: p.programDetails }
}))
})
}
return result
}
const queues = f(content)
if (queues.length && fetchSegments) {
for (let segment = 2; segment <= segments; segment++) {
const segmentUrl = await module.exports.url({ date, segment })
debug(`fetch segment ${segment}: ${segmentUrl}`)
try {
const res = await axios.get(segmentUrl, { headers })
queues.push(...f(res.data))
} catch (err) {
debug(`Failed to fetch segment ${segment}: ${err.message}`)
}
}
}
for (const queue of queues) {
try {
const res = await axios.get(queue.url, { headers })
const item = res.data?.data?.item || queue.i
programs.push({
title: item.title || queue.i.title,
sub_title: item.episodeNumber ? item.episodeTitle : null,
description: item.description,
season: item.seasonNumber,
episode: item.episodeNumber,
rating: item.rating ? { system: 'MPA', value: item.rating } : null,
categories: Array.isArray(item.genres) ? item.genres.map(g => g.name) : null,
start: dayjs.unix(item.startTime || queue.i.startTime),
stop: dayjs.unix(item.endTime || queue.i.endTime),
})
} catch (err) {
debug(`Failed to fetch program details ${queue.url}: ${err.message}`)
}
}
return programs
},
async channels() {
const channels = []
try {
const data = await axios
.get(await this.url({}), { headers })
.then(r => r.data)
data.data.items.forEach(item => {
const finalName = item.fullName.replace(/Channel|Schedule/g, '').trim()
const isEast = east_channels.some(name => name.toLowerCase().includes(finalName.toLowerCase()))
channels.push({
lang: 'en',
site_id: item.sourceId,
xmltv_id: finalName.replaceAll(/[ '&]/g, '') + '.us' + (isEast ? '@East' : ''),
name: finalName
})
})
} catch (err) {
console.error('Failed to fetch channels:', err.message)
}
return channels
},
async fetchApiKey() {
try {
const data = await axios
.get('https://www.tvguide.com/listings/')
.then(r => r.data)
return data ? data.match(/apiKey=([a-zA-Z0-9]+)&/)[1] : null
} catch (err) {
console.error('Failed to fetch API key:', err.message)
return null
}
}
}

View File

@@ -1,78 +1,78 @@
const { parser, url } = require('./tvguide.com.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2025-07-29', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '9200004683',
xmltv_id: 'NationalGeographicWild.us@East'
}
it('can generate valid url', async () => {
axios.get.mockImplementation(url => {
if (url === 'https://www.tvguide.com/listings/') {
return Promise.resolve({
data: fs.readFileSync(path.join(__dirname, '__data__', 'content.html'), 'utf8')
})
}
throw new Error(`Unexpected URL: ${url}`)
})
const result = await url({ date })
expect(result).toBe(
'https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1753747200&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc'
)
})
it('can parse response', async () => {
const content = JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', 'content.json'), 'utf-8'))
axios.get.mockImplementation(url => {
if (
url ===
'https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000058285/web'
) {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', 'program.json')))
})
} else {
return Promise.resolve({ data: '' })
}
})
let results = await parser({ content, date, channel, fetchSegments: false })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2025-07-29T00:00:00.000Z',
stop: '2025-07-29T01:00:00.000Z',
title: 'Secrets of the Zoo: North Carolina',
sub_title: 'Chimp Off the Old Block',
description:
'Chimps living at the North Carolina Zoo, a zoo located in the center of North Carolina that serves as the world\'s largest natural habitat zoo, as well as one of two state-supported zoos, are cared for',
categories: ['Reality'],
season: 1,
episode: 1,
})
})
it('can handle empty guide', async () => {
const results = await parser({
date,
channel,
content: fs.readFileSync(path.join(__dirname, '__data__', 'no-content.json'))
})
expect(results).toMatchObject([])
})
const { parser, url } = require('./tvguide.com.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2025-07-29', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '9200004683',
xmltv_id: 'NationalGeographicWild.us@East'
}
it('can generate valid url', async () => {
axios.get.mockImplementation(url => {
if (url === 'https://www.tvguide.com/listings/') {
return Promise.resolve({
data: fs.readFileSync(path.join(__dirname, '__data__', 'content.html'), 'utf8')
})
}
throw new Error(`Unexpected URL: ${url}`)
})
const result = await url({ date })
expect(result).toBe(
'https://backend.tvguide.com/tvschedules/tvguide/9100001138/web?start=1753747200&duration=240&apiKey=DI9elXhZ3bU6ujsA2gXEKOANyncXGUGc'
)
})
it('can parse response', async () => {
const content = JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', 'content.json'), 'utf-8'))
axios.get.mockImplementation(url => {
if (
url ===
'https://backend.tvguide.com/tvschedules/tvguide/programdetails/9000058285/web'
) {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', 'program.json')))
})
} else {
return Promise.resolve({ data: '' })
}
})
let results = await parser({ content, date, channel, fetchSegments: false })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2025-07-29T00:00:00.000Z',
stop: '2025-07-29T01:00:00.000Z',
title: 'Secrets of the Zoo: North Carolina',
sub_title: 'Chimp Off the Old Block',
description:
'Chimps living at the North Carolina Zoo, a zoo located in the center of North Carolina that serves as the world\'s largest natural habitat zoo, as well as one of two state-supported zoos, are cared for',
categories: ['Reality'],
season: 1,
episode: 1,
})
})
it('can handle empty guide', async () => {
const results = await parser({
date,
channel,
content: fs.readFileSync(path.join(__dirname, '__data__', 'no-content.json'))
})
expect(results).toMatchObject([])
})