├── models ├── __init__.py ├── ustvgo │ ├── __init__.py │ └── programs.py ├── xmltv │ ├── __init__.py │ └── programme.py └── tvguide │ ├── __init__.py │ ├── shows_cast.py │ └── program_details.py ├── .gitignore ├── assets └── 404.ts ├── cache └── cache.db ├── ustvgo.for-dark-bg.xml.gz ├── ustvgo.for-light-bg.xml.gz ├── images └── icons │ ├── metascore │ ├── 0.png │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 4.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ ├── 49.png │ ├── 5.png │ ├── 50.png │ ├── 51.png │ ├── 52.png │ ├── 53.png │ ├── 54.png │ ├── 55.png │ ├── 56.png │ ├── 57.png │ ├── 58.png │ ├── 59.png │ ├── 6.png │ ├── 60.png │ ├── 61.png │ ├── 62.png │ ├── 63.png │ ├── 64.png │ ├── 65.png │ ├── 66.png │ ├── 67.png │ ├── 68.png │ ├── 69.png │ ├── 7.png │ ├── 70.png │ ├── 71.png │ ├── 72.png │ ├── 73.png │ ├── 74.png │ ├── 75.png │ ├── 76.png │ ├── 77.png │ ├── 78.png │ ├── 79.png │ ├── 8.png │ ├── 80.png │ ├── 81.png │ ├── 82.png │ ├── 83.png │ ├── 84.png │ ├── 85.png │ ├── 86.png │ ├── 87.png │ ├── 88.png │ ├── 89.png │ ├── 9.png │ ├── 90.png │ ├── 91.png │ ├── 92.png │ ├── 93.png │ ├── 94.png │ ├── 95.png │ ├── 96.png │ ├── 97.png │ ├── 98.png │ ├── 99.png │ └── 100.png │ ├── tv_rating │ ├── 12.png │ ├── 15.png │ ├── 18.png │ ├── G.png │ ├── NR.png │ ├── PG.png │ ├── R.png │ ├── U.png │ ├── UR.png │ ├── 12A.png │ ├── R18.png │ ├── TV-G.png │ ├── TV-Y.png │ ├── 0_PLUS.png │ ├── 12_PLUS.png │ ├── 15_PLUS.png │ ├── 18_PLUS.png │ ├── 6_PLUS.png │ ├── NC-17.png │ ├── PG-13.png │ ├── TV-14.png │ ├── TV-MA.png │ ├── TV-PG.png │ ├── TV-Y7.png │ ├── NOT_RATED.png │ └── NO_RATING.png │ ├── channels │ ├── for-dark-bg │ │ ├── E.png │ │ ├── ABC.png │ │ ├── AE.png │ │ ├── AMC.png │ │ ├── BET.png │ │ ├── BTN.png │ │ ├── CBS.png │ │ ├── CMT.png │ │ ├── CN.png │ │ ├── CNN.png │ │ ├── CW.png │ │ ├── DA.png │ │ ├── DIY.png │ │ ├── FOX.png │ │ ├── FS1.png │ │ ├── FS2.png │ │ ├── FX.png │ │ ├── FXX.png │ │ ├── GSN.png │ │ ├── HBO.png │ │ ├── HLN.png │ │ ├── HMM.png │ │ ├── ID.png │ │ ├── MLB.png │ │ ├── MTV.png │ │ ├── NBA.png │ │ ├── NBC.png │ │ ├── NFL.png │ │ ├── OAN.png │ │ ├── OLY.png │ │ ├── OWN.png │ │ ├── PBS.png │ │ ├── POP.png │ │ ├── TBS.png │ │ ├── TCM.png │ │ ├── TLC.png │ │ ├── TNT.png │ │ ├── TWC.png │ │ ├── VH1.png │ │ ├── WWE.png │ │ ├── YES.png │ │ ├── ABCHD.png │ │ ├── ABCNY.png │ │ ├── ACCN.png │ │ ├── Animal.png │ │ ├── Bravo.png │ │ ├── CBSHD.png │ │ ├── CBSNY.png │ │ ├── CBSSN.png │ │ ├── CNBC.png │ │ ├── CSPAN.png │ │ ├── CWHD.png │ │ ├── CWNY.png │ │ ├── Comedy.png │ │ ├── Disney.png │ │ ├── ESPN.png │ │ ├── ESPN2.png │ │ ├── ESPNU.png │ │ ├── FOXHD.png │ │ ├── FOXNY.png │ │ ├── FS1HD.png │ │ ├── GOLF.png │ │ ├── HBOHD.png │ │ ├── HGTV.png │ │ ├── IONNY.png │ │ ├── MSNBC.png │ │ ├── NBCHD.png │ │ ├── NBCNY.png │ │ ├── NBCSN.png │ │ ├── NFLHD.png │ │ ├── NFLRZ.png │ │ ├── NHLHD.png │ │ ├── NatGEO.png │ │ ├── NickJr.png │ │ ├── Oxygen.png │ │ ├── Reelz.png │ │ ├── SECN.png │ │ ├── SYFY.png │ │ ├── StarZ.png │ │ ├── TVLand.png │ │ ├── Tennis.png │ │ ├── Travel.png │ │ ├── TruTV.png │ │ ├── WETV.png │ │ ├── Cinemax.png │ │ ├── DisneyJr.png │ │ ├── DisneyXD.png │ │ ├── ESPNews.png │ │ ├── FXMovie.png │ │ ├── FoxNews.png │ │ ├── Freeform.png │ │ ├── Hallmark.png │ │ ├── History.png │ │ ├── Lifetime.png │ │ ├── Science.png │ │ ├── Showtime.png │ │ ├── TeenNick.png │ │ ├── BBCAmerica.png │ │ ├── Boomerang.png │ │ ├── Discovery.png │ │ ├── FoodNetwork.png │ │ ├── FoxBusiness.png │ │ ├── LifetimeM.png │ │ ├── MotorTrend.png │ │ ├── NatGEOWild.png │ │ ├── Nickelodeon.png │ │ ├── Nicktoons.png │ │ ├── Paramount.png │ │ ├── SundanceTV.png │ │ ├── Telemundo.png │ │ ├── USANetwork.png │ │ ├── Univision.png │ │ └── DiscoveryFamily.png │ └── for-light-bg │ │ ├── AE.png │ │ ├── CN.png │ │ ├── CW.png │ │ ├── DA.png │ │ ├── E.png │ │ ├── FX.png │ │ ├── ID.png │ │ ├── ABC.png │ │ ├── ABCHD.png │ │ ├── ABCNY.png │ │ ├── ACCN.png │ │ ├── AMC.png │ │ ├── BET.png │ │ ├── BTN.png │ │ ├── Bravo.png │ │ ├── CBS.png │ │ ├── CBSHD.png │ │ ├── CBSNY.png │ │ ├── CBSSN.png │ │ ├── CMT.png │ │ ├── CNBC.png │ │ ├── CNN.png │ │ ├── CSPAN.png │ │ ├── CWHD.png │ │ ├── CWNY.png │ │ ├── DIY.png │ │ ├── ESPN.png │ │ ├── ESPN2.png │ │ ├── ESPNU.png │ │ ├── FOX.png │ │ ├── FOXHD.png │ │ ├── FOXNY.png │ │ ├── FS1.png │ │ ├── FS1HD.png │ │ ├── FS2.png │ │ ├── FXX.png │ │ ├── GOLF.png │ │ ├── GSN.png │ │ ├── HBO.png │ │ ├── HBOHD.png │ │ ├── HGTV.png │ │ ├── HLN.png │ │ ├── HMM.png │ │ ├── IONNY.png │ │ ├── MLB.png │ │ ├── MSNBC.png │ │ ├── MTV.png │ │ ├── NBA.png │ │ ├── NBC.png │ │ ├── NBCHD.png │ │ ├── NBCNY.png │ │ ├── NBCSN.png │ │ ├── NFL.png │ │ ├── NFLHD.png │ │ ├── NFLRZ.png │ │ ├── NHLHD.png │ │ ├── OAN.png │ │ ├── OLY.png │ │ ├── OWN.png │ │ ├── PBS.png │ │ ├── POP.png │ │ ├── Reelz.png │ │ ├── SECN.png │ │ ├── SYFY.png │ │ ├── StarZ.png │ │ ├── TBS.png │ │ ├── TCM.png │ │ ├── TLC.png │ │ ├── TNT.png │ │ ├── TWC.png │ │ ├── TruTV.png │ │ ├── VH1.png │ │ ├── WETV.png │ │ ├── WWE.png │ │ ├── YES.png │ │ ├── Animal.png │ │ ├── Cinemax.png │ │ ├── Comedy.png │ │ ├── Disney.png │ │ ├── ESPNHD.png │ │ ├── ESPNews.png │ │ ├── FXMovie.png │ │ ├── FoxNews.png │ │ ├── History.png │ │ ├── NatGEO.png │ │ ├── NickJr.png │ │ ├── Oxygen.png │ │ ├── Science.png │ │ ├── TVLand.png │ │ ├── Tennis.png │ │ ├── Travel.png │ │ ├── BBCAmerica.png │ │ ├── Boomerang.png │ │ ├── Discovery.png │ │ ├── DisneyJr.png │ │ ├── DisneyXD.png │ │ ├── Freeform.png │ │ ├── Hallmark.png │ │ ├── Lifetime.png │ │ ├── LifetimeM.png │ │ ├── MotorTrend.png │ │ ├── NatGEOWild.png │ │ ├── Nicktoons.png │ │ ├── Paramount.png │ │ ├── Showtime.png │ │ ├── SundanceTV.png │ │ ├── TeenNick.png │ │ ├── Telemundo.png │ │ ├── USANetwork.png │ │ ├── Univision.png │ │ ├── FoodNetwork.png │ │ ├── FoxBusiness.png │ │ ├── Nickelodeon.png │ │ └── DiscoveryFamily.png │ ├── generate_metascore.py │ ├── tv_rating.json │ ├── metascore.json │ ├── channels-for-dark-bg.json │ └── channels-for-light-bg.json ├── .flake8 ├── requirements.txt ├── .github └── workflows │ ├── tests.yml │ └── tvguide.yml ├── ustvgo_iptv.py ├── README.md ├── epg_downloader.py └── channels.json /models/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | venv/ 2 | .vscode/ 3 | __pycache__ 4 | -------------------------------------------------------------------------------- /assets/404.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/assets/404.ts -------------------------------------------------------------------------------- /cache/cache.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/cache/cache.db -------------------------------------------------------------------------------- /models/ustvgo/__init__.py: -------------------------------------------------------------------------------- 1 | from .programs import Program 2 | 3 | 4 | __all__ = [ 5 | 'Program', 6 | ] 7 | -------------------------------------------------------------------------------- /models/xmltv/__init__.py: -------------------------------------------------------------------------------- 1 | from .programme import Programme 2 | 3 | __all__ = [ 4 | 'Programme', 5 | ] 6 | -------------------------------------------------------------------------------- /ustvgo.for-dark-bg.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/ustvgo.for-dark-bg.xml.gz -------------------------------------------------------------------------------- /ustvgo.for-light-bg.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/ustvgo.for-light-bg.xml.gz -------------------------------------------------------------------------------- /images/icons/metascore/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/0.png -------------------------------------------------------------------------------- /images/icons/metascore/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/1.png -------------------------------------------------------------------------------- /images/icons/metascore/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/10.png -------------------------------------------------------------------------------- /images/icons/metascore/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/11.png -------------------------------------------------------------------------------- /images/icons/metascore/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/12.png -------------------------------------------------------------------------------- /images/icons/metascore/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/13.png -------------------------------------------------------------------------------- /images/icons/metascore/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/14.png -------------------------------------------------------------------------------- /images/icons/metascore/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/15.png -------------------------------------------------------------------------------- /images/icons/metascore/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/16.png -------------------------------------------------------------------------------- /images/icons/metascore/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/17.png -------------------------------------------------------------------------------- /images/icons/metascore/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/18.png -------------------------------------------------------------------------------- /images/icons/metascore/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/19.png -------------------------------------------------------------------------------- /images/icons/metascore/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/2.png -------------------------------------------------------------------------------- /images/icons/metascore/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/20.png -------------------------------------------------------------------------------- /images/icons/metascore/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/21.png -------------------------------------------------------------------------------- /images/icons/metascore/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/22.png -------------------------------------------------------------------------------- /images/icons/metascore/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/23.png -------------------------------------------------------------------------------- /images/icons/metascore/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/24.png -------------------------------------------------------------------------------- /images/icons/metascore/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/25.png -------------------------------------------------------------------------------- /images/icons/metascore/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/26.png -------------------------------------------------------------------------------- /images/icons/metascore/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/27.png -------------------------------------------------------------------------------- /images/icons/metascore/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/28.png -------------------------------------------------------------------------------- /images/icons/metascore/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/29.png -------------------------------------------------------------------------------- /images/icons/metascore/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/3.png -------------------------------------------------------------------------------- /images/icons/metascore/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/30.png -------------------------------------------------------------------------------- /images/icons/metascore/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/31.png -------------------------------------------------------------------------------- /images/icons/metascore/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/32.png -------------------------------------------------------------------------------- /images/icons/metascore/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/33.png -------------------------------------------------------------------------------- /images/icons/metascore/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/34.png -------------------------------------------------------------------------------- /images/icons/metascore/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/35.png -------------------------------------------------------------------------------- /images/icons/metascore/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/36.png -------------------------------------------------------------------------------- /images/icons/metascore/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/37.png -------------------------------------------------------------------------------- /images/icons/metascore/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/38.png -------------------------------------------------------------------------------- /images/icons/metascore/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/39.png -------------------------------------------------------------------------------- /images/icons/metascore/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/4.png -------------------------------------------------------------------------------- /images/icons/metascore/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/40.png -------------------------------------------------------------------------------- /images/icons/metascore/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/41.png -------------------------------------------------------------------------------- /images/icons/metascore/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/42.png -------------------------------------------------------------------------------- /images/icons/metascore/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/43.png -------------------------------------------------------------------------------- /images/icons/metascore/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/44.png -------------------------------------------------------------------------------- /images/icons/metascore/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/45.png -------------------------------------------------------------------------------- /images/icons/metascore/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/46.png -------------------------------------------------------------------------------- /images/icons/metascore/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/47.png -------------------------------------------------------------------------------- /images/icons/metascore/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/48.png -------------------------------------------------------------------------------- /images/icons/metascore/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/49.png -------------------------------------------------------------------------------- /images/icons/metascore/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/5.png -------------------------------------------------------------------------------- /images/icons/metascore/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/50.png -------------------------------------------------------------------------------- /images/icons/metascore/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/51.png -------------------------------------------------------------------------------- /images/icons/metascore/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/52.png -------------------------------------------------------------------------------- /images/icons/metascore/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/53.png -------------------------------------------------------------------------------- /images/icons/metascore/54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/54.png -------------------------------------------------------------------------------- /images/icons/metascore/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/55.png -------------------------------------------------------------------------------- /images/icons/metascore/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/56.png -------------------------------------------------------------------------------- /images/icons/metascore/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/57.png -------------------------------------------------------------------------------- /images/icons/metascore/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/58.png -------------------------------------------------------------------------------- /images/icons/metascore/59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/59.png -------------------------------------------------------------------------------- /images/icons/metascore/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/6.png -------------------------------------------------------------------------------- /images/icons/metascore/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/60.png -------------------------------------------------------------------------------- /images/icons/metascore/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/61.png -------------------------------------------------------------------------------- /images/icons/metascore/62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/62.png -------------------------------------------------------------------------------- /images/icons/metascore/63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/63.png -------------------------------------------------------------------------------- /images/icons/metascore/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/64.png -------------------------------------------------------------------------------- /images/icons/metascore/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/65.png -------------------------------------------------------------------------------- /images/icons/metascore/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/66.png -------------------------------------------------------------------------------- /images/icons/metascore/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/67.png -------------------------------------------------------------------------------- /images/icons/metascore/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/68.png -------------------------------------------------------------------------------- /images/icons/metascore/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/69.png -------------------------------------------------------------------------------- /images/icons/metascore/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/7.png -------------------------------------------------------------------------------- /images/icons/metascore/70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/70.png -------------------------------------------------------------------------------- /images/icons/metascore/71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/71.png -------------------------------------------------------------------------------- /images/icons/metascore/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/72.png -------------------------------------------------------------------------------- /images/icons/metascore/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/73.png -------------------------------------------------------------------------------- /images/icons/metascore/74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/74.png -------------------------------------------------------------------------------- /images/icons/metascore/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/75.png -------------------------------------------------------------------------------- /images/icons/metascore/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/76.png -------------------------------------------------------------------------------- /images/icons/metascore/77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/77.png -------------------------------------------------------------------------------- /images/icons/metascore/78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/78.png -------------------------------------------------------------------------------- /images/icons/metascore/79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/79.png -------------------------------------------------------------------------------- /images/icons/metascore/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/8.png -------------------------------------------------------------------------------- /images/icons/metascore/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/80.png -------------------------------------------------------------------------------- /images/icons/metascore/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/81.png -------------------------------------------------------------------------------- /images/icons/metascore/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/82.png -------------------------------------------------------------------------------- /images/icons/metascore/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/83.png -------------------------------------------------------------------------------- /images/icons/metascore/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/84.png -------------------------------------------------------------------------------- /images/icons/metascore/85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/85.png -------------------------------------------------------------------------------- /images/icons/metascore/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/86.png -------------------------------------------------------------------------------- /images/icons/metascore/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/87.png -------------------------------------------------------------------------------- /images/icons/metascore/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/88.png -------------------------------------------------------------------------------- /images/icons/metascore/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/89.png -------------------------------------------------------------------------------- /images/icons/metascore/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/9.png -------------------------------------------------------------------------------- /images/icons/metascore/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/90.png -------------------------------------------------------------------------------- /images/icons/metascore/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/91.png -------------------------------------------------------------------------------- /images/icons/metascore/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/92.png -------------------------------------------------------------------------------- /images/icons/metascore/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/93.png -------------------------------------------------------------------------------- /images/icons/metascore/94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/94.png -------------------------------------------------------------------------------- /images/icons/metascore/95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/95.png -------------------------------------------------------------------------------- /images/icons/metascore/96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/96.png -------------------------------------------------------------------------------- /images/icons/metascore/97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/97.png -------------------------------------------------------------------------------- /images/icons/metascore/98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/98.png -------------------------------------------------------------------------------- /images/icons/metascore/99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/99.png -------------------------------------------------------------------------------- /images/icons/tv_rating/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/12.png -------------------------------------------------------------------------------- /images/icons/tv_rating/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/15.png -------------------------------------------------------------------------------- /images/icons/tv_rating/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/18.png -------------------------------------------------------------------------------- /images/icons/tv_rating/G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/G.png -------------------------------------------------------------------------------- /images/icons/tv_rating/NR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/NR.png -------------------------------------------------------------------------------- /images/icons/tv_rating/PG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/PG.png -------------------------------------------------------------------------------- /images/icons/tv_rating/R.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/R.png -------------------------------------------------------------------------------- /images/icons/tv_rating/U.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/U.png -------------------------------------------------------------------------------- /images/icons/tv_rating/UR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/UR.png -------------------------------------------------------------------------------- /images/icons/metascore/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/metascore/100.png -------------------------------------------------------------------------------- /images/icons/tv_rating/12A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/12A.png -------------------------------------------------------------------------------- /images/icons/tv_rating/R18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/R18.png -------------------------------------------------------------------------------- /images/icons/tv_rating/TV-G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/TV-G.png -------------------------------------------------------------------------------- /images/icons/tv_rating/TV-Y.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/TV-Y.png -------------------------------------------------------------------------------- /images/icons/tv_rating/0_PLUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/0_PLUS.png -------------------------------------------------------------------------------- /images/icons/tv_rating/12_PLUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/12_PLUS.png -------------------------------------------------------------------------------- /images/icons/tv_rating/15_PLUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/15_PLUS.png -------------------------------------------------------------------------------- /images/icons/tv_rating/18_PLUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/18_PLUS.png -------------------------------------------------------------------------------- /images/icons/tv_rating/6_PLUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/6_PLUS.png -------------------------------------------------------------------------------- /images/icons/tv_rating/NC-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/NC-17.png -------------------------------------------------------------------------------- /images/icons/tv_rating/PG-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/PG-13.png -------------------------------------------------------------------------------- /images/icons/tv_rating/TV-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/TV-14.png -------------------------------------------------------------------------------- /images/icons/tv_rating/TV-MA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/TV-MA.png -------------------------------------------------------------------------------- /images/icons/tv_rating/TV-PG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/TV-PG.png -------------------------------------------------------------------------------- /images/icons/tv_rating/TV-Y7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/TV-Y7.png -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 110 3 | per-file-ignores = 4 | # module imported but unused 5 | __init__.py:F401, 6 | -------------------------------------------------------------------------------- /images/icons/tv_rating/NOT_RATED.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/NOT_RATED.png -------------------------------------------------------------------------------- /images/icons/tv_rating/NO_RATING.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/tv_rating/NO_RATING.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/E.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ABC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ABC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/AE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/AE.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/AMC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/AMC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/BET.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/BET.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/BTN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/BTN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CBS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CBS.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CMT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CMT.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CNN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CW.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/DA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/DA.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/DIY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/DIY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FOX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FOX.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FS1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FS1.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FS2.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FX.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FXX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FXX.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/GSN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/GSN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/HBO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/HBO.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/HLN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/HLN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/HMM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/HMM.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ID.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/MLB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/MLB.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/MTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/MTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NBA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NBA.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NBC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NFL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NFL.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/OAN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/OAN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/OLY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/OLY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/OWN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/OWN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/PBS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/PBS.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/POP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/POP.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TBS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TBS.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TCM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TCM.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TLC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TLC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TNT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TNT.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TWC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TWC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/VH1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/VH1.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/WWE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/WWE.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/YES.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/YES.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/AE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/AE.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CW.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/DA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/DA.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/E.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FX.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ID.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ABCHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ABCHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ABCNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ABCNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ACCN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ACCN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Animal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Animal.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Bravo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Bravo.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CBSHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CBSHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CBSNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CBSNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CBSSN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CBSSN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CNBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CNBC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CSPAN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CSPAN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CWHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CWHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/CWNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/CWNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Comedy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Comedy.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Disney.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Disney.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ESPN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ESPN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ESPN2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ESPN2.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ESPNU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ESPNU.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FOXHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FOXHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FOXNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FOXNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FS1HD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FS1HD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/GOLF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/GOLF.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/HBOHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/HBOHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/HGTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/HGTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/IONNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/IONNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/MSNBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/MSNBC.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NBCHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NBCHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NBCNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NBCNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NBCSN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NBCSN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NFLHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NFLHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NFLRZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NFLRZ.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NHLHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NHLHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NatGEO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NatGEO.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NickJr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NickJr.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Oxygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Oxygen.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Reelz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Reelz.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/SECN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/SECN.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/SYFY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/SYFY.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/StarZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/StarZ.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TVLand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TVLand.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Tennis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Tennis.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Travel.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TruTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TruTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/WETV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/WETV.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ABC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ABC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ABCHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ABCHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ABCNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ABCNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ACCN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ACCN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/AMC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/AMC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/BET.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/BET.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/BTN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/BTN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Bravo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Bravo.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CBS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CBS.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CBSHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CBSHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CBSNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CBSNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CBSSN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CBSSN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CMT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CMT.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CNBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CNBC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CNN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CSPAN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CSPAN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CWHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CWHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/CWNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/CWNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/DIY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/DIY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ESPN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ESPN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ESPN2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ESPN2.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ESPNU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ESPNU.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FOX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FOX.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FOXHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FOXHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FOXNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FOXNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FS1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FS1.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FS1HD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FS1HD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FS2.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FXX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FXX.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/GOLF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/GOLF.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/GSN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/GSN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/HBO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/HBO.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/HBOHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/HBOHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/HGTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/HGTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/HLN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/HLN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/HMM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/HMM.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/IONNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/IONNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/MLB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/MLB.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/MSNBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/MSNBC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/MTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/MTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NBA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NBA.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NBC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NBCHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NBCHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NBCNY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NBCNY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NBCSN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NBCSN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NFL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NFL.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NFLHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NFLHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NFLRZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NFLRZ.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NHLHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NHLHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/OAN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/OAN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/OLY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/OLY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/OWN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/OWN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/PBS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/PBS.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/POP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/POP.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Reelz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Reelz.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/SECN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/SECN.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/SYFY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/SYFY.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/StarZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/StarZ.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TBS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TBS.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TCM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TCM.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TLC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TLC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TNT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TNT.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TWC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TWC.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TruTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TruTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/VH1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/VH1.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/WETV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/WETV.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/WWE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/WWE.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/YES.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/YES.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Cinemax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Cinemax.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/DisneyJr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/DisneyJr.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/DisneyXD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/DisneyXD.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/ESPNews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/ESPNews.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FXMovie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FXMovie.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FoxNews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FoxNews.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Freeform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Freeform.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Hallmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Hallmark.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/History.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Lifetime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Lifetime.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Science.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Science.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Showtime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Showtime.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/TeenNick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/TeenNick.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Animal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Animal.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Cinemax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Cinemax.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Comedy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Comedy.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Disney.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Disney.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ESPNHD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ESPNHD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/ESPNews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/ESPNews.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FXMovie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FXMovie.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FoxNews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FoxNews.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/History.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NatGEO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NatGEO.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NickJr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NickJr.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Oxygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Oxygen.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Science.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Science.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TVLand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TVLand.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Tennis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Tennis.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Travel.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/BBCAmerica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/BBCAmerica.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Boomerang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Boomerang.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Discovery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Discovery.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FoodNetwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FoodNetwork.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/FoxBusiness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/FoxBusiness.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/LifetimeM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/LifetimeM.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/MotorTrend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/MotorTrend.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/NatGEOWild.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/NatGEOWild.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Nickelodeon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Nickelodeon.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Nicktoons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Nicktoons.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Paramount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Paramount.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/SundanceTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/SundanceTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Telemundo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Telemundo.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/USANetwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/USANetwork.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/Univision.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/Univision.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/BBCAmerica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/BBCAmerica.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Boomerang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Boomerang.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Discovery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Discovery.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/DisneyJr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/DisneyJr.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/DisneyXD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/DisneyXD.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Freeform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Freeform.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Hallmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Hallmark.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Lifetime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Lifetime.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/LifetimeM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/LifetimeM.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/MotorTrend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/MotorTrend.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/NatGEOWild.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/NatGEOWild.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Nicktoons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Nicktoons.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Paramount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Paramount.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Showtime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Showtime.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/SundanceTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/SundanceTV.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/TeenNick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/TeenNick.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Telemundo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Telemundo.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/USANetwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/USANetwork.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Univision.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Univision.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | aiohttp>=3.8.1 2 | tqdm>=4.64.0 3 | pydantic>=1.9.1 4 | py-xmltv==1.0.8 5 | Pillow>=9.1.1 6 | diskcache>=5.4.0 7 | furl>=2.1.3 8 | lxml>=4.9.0 -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FoodNetwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FoodNetwork.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/FoxBusiness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/FoxBusiness.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/Nickelodeon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/Nickelodeon.png -------------------------------------------------------------------------------- /images/icons/channels/for-dark-bg/DiscoveryFamily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-dark-bg/DiscoveryFamily.png -------------------------------------------------------------------------------- /images/icons/channels/for-light-bg/DiscoveryFamily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interlark/ustvgo-tvguide/HEAD/images/icons/channels/for-light-bg/DiscoveryFamily.png -------------------------------------------------------------------------------- /models/tvguide/__init__.py: -------------------------------------------------------------------------------- 1 | from .program_details import ProgramDetails 2 | from .shows_cast import ShowsCast 3 | 4 | 5 | __all__ = [ 6 | 'ProgramDetails', 7 | 'ShowsCast', 8 | ] 9 | -------------------------------------------------------------------------------- /models/xmltv/programme.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import Optional 3 | 4 | import xmltv.models 5 | 6 | 7 | @dataclass 8 | class Programme(xmltv.models.Programme): 9 | live: Optional[object] = field( 10 | default=None, 11 | metadata={ 12 | "type": "Element", 13 | } 14 | ) 15 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: [ push, pull_request ] 4 | 5 | jobs: 6 | flake8: 7 | name: Test Flake8 8 | 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - uses: actions/checkout@v3 13 | 14 | - name: Set up Python 3.10 15 | uses: actions/setup-python@v3 16 | with: 17 | python-version: '3.10' 18 | 19 | - name: Install dependencies 20 | run: | 21 | python -m pip install --upgrade pip 22 | python -m pip install flake8 23 | - name: Run flake8 24 | run: flake8 25 | -------------------------------------------------------------------------------- /models/ustvgo/programs.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import Optional, List 4 | 5 | from pydantic import BaseModel, PrivateAttr 6 | 7 | from ..tvguide import ProgramDetails, ShowsCast 8 | 9 | 10 | class Program(BaseModel): 11 | id: int 12 | name: str 13 | image: str 14 | start_timestamp: int 15 | end_timestamp: int 16 | color: int 17 | description: str 18 | day: str 19 | start_time: str 20 | end_time: str 21 | tags: List[str] = [] 22 | 23 | _details: Optional[ProgramDetails] = PrivateAttr(default=None) 24 | _cast: Optional[ShowsCast] = PrivateAttr(default=None) 25 | -------------------------------------------------------------------------------- /.github/workflows/tvguide.yml: -------------------------------------------------------------------------------- 1 | name: TV Guide 2 | 3 | on: 4 | schedule: 5 | - cron: "*/30 * * * *" 6 | workflow_dispatch: 7 | 8 | jobs: 9 | tvguide-update: 10 | name: Update TV Guide 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Set up Python 18 | uses: actions/setup-python@v3 19 | with: 20 | python-version: "3.8" 21 | 22 | - name: Install dependencies 23 | run: | 24 | python -m pip install --upgrade pip 25 | python -m pip install -r requirements.txt 26 | 27 | - name: Run EPG Downloader 28 | run: | 29 | python epg_downloader.py ustvgo.for-dark-bg.xml \ 30 | --create-archive \ 31 | --base-url https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master 32 | 33 | python epg_downloader.py ustvgo.for-light-bg.xml \ 34 | --create-archive \ 35 | --icons-for-light-bg \ 36 | --base-url https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master 37 | 38 | - name: Get current time 39 | id: time 40 | run: echo "::set-output name=time::$(date -u +'%Y-%m-%d %H:%M UTC')" 41 | 42 | - uses: EndBug/add-and-commit@v9 43 | with: 44 | default_author: github_actions 45 | message: 'TV Guide update ${{ steps.time.outputs.time }}' 46 | -------------------------------------------------------------------------------- /ustvgo_iptv.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import json 3 | import logging 4 | import pathlib 5 | from functools import partial 6 | 7 | from tqdm.asyncio import tqdm 8 | 9 | 10 | USER_AGENT = ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' 11 | '(KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36') 12 | USTVGO_HEADERS = {'Referer': 'https://ustvgo.tv/', 'User-Agent': USER_AGENT} 13 | 14 | logging.basicConfig( 15 | level=logging.INFO, format='%(asctime)s :: %(levelname)s :: %(message)s', 16 | datefmt='%H:%M:%S' 17 | ) 18 | 19 | logger = logging.getLogger(__name__) 20 | 21 | 22 | def root_dir(): 23 | """Root directory.""" 24 | return pathlib.Path(__file__).parent 25 | 26 | 27 | def load_dict(filename): 28 | """Load root dictionary.""" 29 | filepath = root_dir() / filename 30 | with open(filepath, encoding='utf-8') as f: 31 | return json.load(f) 32 | 33 | 34 | async def gather_with_concurrency(n, *tasks, show_progress=True, progress_title=None): 35 | """Gather tasks with concurrency.""" 36 | semaphore = asyncio.Semaphore(n) 37 | 38 | async def sem_task(task): 39 | async with semaphore: 40 | return await task 41 | 42 | gather = partial(tqdm.gather, desc=progress_title) if show_progress \ 43 | else asyncio.gather 44 | return await gather(*[sem_task(x) for x in tasks]) 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 | USTVGO-IPTV Logo 5 | 6 |

7 |
8 | 9 |
10 | TV Guide status 11 | PyPi version 12 | Supported platforms 13 |

14 | 15 | This repo is a 📺 **TV Guide**, the part of [USTVGO Free IPTV](https://github.com/interlark/ustvgo-iptv) project. 16 | 17 | This Github Action based ETL generates **EPG XML** for upcoming programs of all the channels **twice an hour**. 18 | 19 | - [ustvgo.for-dark-bg.xml](https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master/ustvgo.for-dark-bg.xml) - TV Guide for players with Dark UI 20 | - [ustvgo.for-dark-bg.xml.gz](https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master/ustvgo.for-dark-bg.xml.gz) - Compressed TV Guide for players with Dark UI 21 | - [ustvgo.for-light-bg.xml](https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master/ustvgo.for-light-bg.xml) - TV Guide for players with Light UI 22 | - [ustvgo.for-light-bg.xml.gz](https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master/ustvgo.for-light-bg.xml.gz) - Compressed TV Guide for players with Light UI 23 | -------------------------------------------------------------------------------- /models/tvguide/shows_cast.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import List, Optional 4 | 5 | from pydantic import BaseModel, NonNegativeInt 6 | from xmltv.models import Credits, Actor 7 | 8 | 9 | # class Image(BaseModel): 10 | # id: str 11 | # width: int 12 | # height: int 13 | # bucketType: str 14 | # bucketPath: Optional[str] 15 | 16 | 17 | class Item(BaseModel): 18 | id: int 19 | name: str 20 | role: Optional[str] 21 | type: str 22 | # image: Optional[Image] = None 23 | 24 | 25 | class ShowsCastXMLTVOptions(BaseModel): 26 | """Options purposed to control number of cast 27 | per type presented in target xmltv credits.""" 28 | actor: NonNegativeInt = 15 29 | director: NonNegativeInt = 1 30 | writer: NonNegativeInt = 1 31 | adapter: NonNegativeInt = 1 32 | producer: NonNegativeInt = 1 33 | composer: NonNegativeInt = 1 34 | editor: NonNegativeInt = 1 35 | presenter: NonNegativeInt = 3 36 | commentator: NonNegativeInt = 2 37 | guest: NonNegativeInt = 3 38 | 39 | def take_one(self, type_name): 40 | if not hasattr(self, type_name): 41 | return False 42 | 43 | allowed_positions = getattr(self, type_name) 44 | if allowed_positions > 0: 45 | setattr(self, type_name, allowed_positions - 1) 46 | return True 47 | 48 | return False 49 | 50 | 51 | class ShowsCast(BaseModel): 52 | id: str 53 | items: List[Item] 54 | 55 | def add_cast(self, xmltv_program, **options): 56 | """Add cast & crew to xmltv program. 57 | 58 | Example: 59 | add_cast(xmltv_program, actor=99, director=1, adapter=0) 60 | """ 61 | staff_list = [] 62 | xmltv_options = ShowsCastXMLTVOptions(**options) 63 | 64 | for person in self.items: 65 | type_name = person.type.lower() 66 | if xmltv_options.take_one(type_name): 67 | staff_list.append((type_name, person.name, person.role)) 68 | 69 | if staff_list: 70 | credits = Credits() 71 | for type_name, person_name, person_role in staff_list: 72 | if type_name != 'actor': 73 | getattr(credits, type_name).append(person_name) 74 | else: 75 | credits.actor = Actor(content=[person_name], role=person_role) 76 | 77 | xmltv_program.credits = credits 78 | -------------------------------------------------------------------------------- /images/icons/generate_metascore.py: -------------------------------------------------------------------------------- 1 | import colorsys 2 | import json 3 | 4 | from PIL import Image, ImageColor, ImageDraw, ImageFont 5 | 6 | ICON_SIZE = 128 7 | ICON_RADIUS = 0.1 * ICON_SIZE 8 | ICON_STROKE = 1 9 | 10 | FONT_SIZE = ICON_SIZE // 2 11 | BADGE_PARAMETERS = [ 12 | { 13 | 'score_start': 0, 14 | 'score_end': 19, 15 | 'color': '#f00', # RED 16 | 'comment': 'Overwhelming dislike', 17 | }, 18 | { 19 | 'score_start': 20, 20 | 'score_end': 39, 21 | 'color': '#f00', # RED 22 | 'comment': 'Generally unfavorable reviews', 23 | }, 24 | { 25 | 'score_start': 40, 26 | 'score_end': 60, 27 | 'color': '#fc3', # YELLOW 28 | 'comment': 'Mixed or average reviews', 29 | }, 30 | { 31 | 'score_start': 61, 32 | 'score_end': 80, 33 | 'color': '#6c3', # GREEN 34 | 'comment': 'Generally favorable reviews', 35 | }, 36 | { 37 | 'score_start': 81, 38 | 'score_end': 100, 39 | 'color': '#6c3', # GREEN 40 | 'comment': 'Universal acclaim', 41 | }, 42 | ] 43 | 44 | 45 | def darker_color(color, rel_ratio=0.9): 46 | rgb = ImageColor.getrgb(color) 47 | h, l, s = colorsys.rgb_to_hls(*map(lambda x: x / 255, rgb)) 48 | l = min(1, l * rel_ratio) # noqa: E741 49 | rgb = colorsys.hls_to_rgb(h, l, s) 50 | return tuple(map(lambda x: int(x * 255), rgb)) 51 | 52 | 53 | def get_badge_color(score): 54 | for badge in BADGE_PARAMETERS: 55 | if badge['score_start'] <= score <= badge['score_end']: 56 | return badge['color'] 57 | 58 | 59 | def create_badge(score, color): 60 | img = Image.new('RGBA', (ICON_SIZE, ICON_SIZE), (255, 0, 0, 0)) 61 | draw = ImageDraw.Draw(img) 62 | draw.rounded_rectangle(((0, 0), (ICON_SIZE, ICON_SIZE)), 63 | fill=color, radius=ICON_RADIUS) 64 | 65 | font = ImageFont.truetype('Arial_Bold.ttf', FONT_SIZE) 66 | draw.text((ICON_SIZE/2, ICON_SIZE/2), str(score), 67 | font=font, fill='white', anchor='mm', 68 | stroke_fill=darker_color(color, 0.95), stroke_width=ICON_STROKE) 69 | 70 | img.save(f'metascore/{score}.png', 'PNG') 71 | 72 | 73 | if __name__ == '__main__': 74 | meta_data = {} 75 | for score in range(0, 100 + 1): 76 | create_badge(score, get_badge_color(score)) 77 | 78 | meta_data[score] = { 79 | 'path': f'metascore/{score}.png', 80 | 'width': ICON_SIZE, 81 | 'height': ICON_SIZE, 82 | } 83 | 84 | with open('metascore.json', 'w') as f: 85 | json.dump(meta_data, f, indent=4) 86 | -------------------------------------------------------------------------------- /images/icons/tv_rating.json: -------------------------------------------------------------------------------- 1 | { 2 | "12": { 3 | "path": "tv_rating/12.png", 4 | "width": 240, 5 | "height": 240 6 | }, 7 | "15": { 8 | "path": "tv_rating/15.png", 9 | "width": 240, 10 | "height": 240 11 | }, 12 | "18": { 13 | "path": "tv_rating/18.png", 14 | "width": 240, 15 | "height": 240 16 | }, 17 | "TV-Y": { 18 | "path": "tv_rating/TV-Y.png", 19 | "width": 240, 20 | "height": 240 21 | }, 22 | "TV-Y7": { 23 | "path": "tv_rating/TV-Y7.png", 24 | "width": 240, 25 | "height": 240 26 | }, 27 | "TV-G": { 28 | "path": "tv_rating/TV-G.png", 29 | "width": 240, 30 | "height": 240 31 | }, 32 | "TV-PG": { 33 | "path": "tv_rating/TV-PG.png", 34 | "width": 240, 35 | "height": 240 36 | }, 37 | "TV-14": { 38 | "path": "tv_rating/TV-14.png", 39 | "width": 240, 40 | "height": 240 41 | }, 42 | "TV-MA": { 43 | "path": "tv_rating/TV-MA.png", 44 | "width": 240, 45 | "height": 240 46 | }, 47 | "G": { 48 | "path": "tv_rating/G.png", 49 | "width": 240, 50 | "height": 209 51 | }, 52 | "PG": { 53 | "path": "tv_rating/PG.png", 54 | "width": 240, 55 | "height": 164 56 | }, 57 | "PG-13": { 58 | "path": "tv_rating/PG-13.png", 59 | "width": 240, 60 | "height": 93 61 | }, 62 | "R": { 63 | "path": "tv_rating/R.png", 64 | "width": 240, 65 | "height": 209 66 | }, 67 | "NC-17": { 68 | "path": "tv_rating/NC-17.png", 69 | "width": 240, 70 | "height": 71 71 | }, 72 | "U": { 73 | "path": "tv_rating/U.png", 74 | "width": 240, 75 | "height": 214 76 | }, 77 | "12A": { 78 | "path": "tv_rating/12A.png", 79 | "width": 240, 80 | "height": 240 81 | }, 82 | "R18": { 83 | "path": "tv_rating/R18.png", 84 | "width": 240, 85 | "height": 240 86 | }, 87 | "0+": { 88 | "path": "tv_rating/0_PLUS.png", 89 | "width": 240, 90 | "height": 240 91 | }, 92 | "6+": { 93 | "path": "tv_rating/6_PLUS.png", 94 | "width": 240, 95 | "height": 240 96 | }, 97 | "12+": { 98 | "path": "tv_rating/12_PLUS.png", 99 | "width": 240, 100 | "height": 240 101 | }, 102 | "15+": { 103 | "path": "tv_rating/15_PLUS.png", 104 | "width": 240, 105 | "height": 240 106 | }, 107 | "18+": { 108 | "path": "tv_rating/18_PLUS.png", 109 | "width": 240, 110 | "height": 240 111 | }, 112 | "NR": { 113 | "path": "tv_rating/NR.png", 114 | "width": 240, 115 | "height": 60 116 | }, 117 | "NO RATING": { 118 | "path": "tv_rating/NO_RATING.png", 119 | "width": 240, 120 | "height": 60 121 | }, 122 | "NOT RATED": { 123 | "path": "tv_rating/NOT_RATED.png", 124 | "width": 240, 125 | "height": 60 126 | }, 127 | "UR": { 128 | "path": "tv_rating/UR.png", 129 | "width": 240, 130 | "height": 69 131 | } 132 | } -------------------------------------------------------------------------------- /models/tvguide/program_details.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import re 4 | import warnings 5 | from datetime import datetime 6 | from typing import List, Optional 7 | 8 | from pydantic import BaseModel, validator 9 | from xmltv.models import (Category, EpisodeNum, Icon, Length, Rating, 10 | StarRating, SubTitle, Title) 11 | 12 | from ..xmltv import Programme 13 | 14 | 15 | class ImageType(BaseModel): 16 | typeId: int 17 | typeName: str # "showcard", "key art" 18 | providerTypeName: str 19 | 20 | 21 | class Image(BaseModel): 22 | id: str 23 | provider: str 24 | imageType: ImageType 25 | bucketType: str 26 | bucketPath: str 27 | filename: str 28 | width: int 29 | height: int 30 | 31 | @property 32 | def url(self) -> str: 33 | if self.bucketType == 'local': 34 | return self.bucketPath 35 | else: 36 | return 'https://www.tvguide.com/a/img/catalog/' \ 37 | + self.bucketPath.lstrip('/') 38 | 39 | 40 | class Genre(BaseModel): 41 | id: int 42 | name: str 43 | genres: List[str] 44 | 45 | 46 | class MetacriticSummaryItem(BaseModel): 47 | url: Optional[str] 48 | score: int 49 | reviewCount: int 50 | 51 | 52 | class VideoImage(BaseModel): 53 | imageUrl: str 54 | width: int 55 | height: int 56 | 57 | 58 | class VideoItem(BaseModel): 59 | videoId: int 60 | providerId: int 61 | title: str 62 | slug: str 63 | type: str 64 | contentType: str 65 | contentTypeId: int 66 | videoTitle: str 67 | url: str 68 | # description: Optional[str] 69 | duration: int 70 | originalAirDate: Optional[str] 71 | seasonNumber: int 72 | episodeNumber: int 73 | images: List[VideoImage] 74 | 75 | 76 | class ProgramDetails(BaseModel): 77 | id: int 78 | name: str 79 | parentId: Optional[int] 80 | description: Optional[str] 81 | isSportsEvent: bool 82 | rating: Optional[str] 83 | tvRating: Optional[str] 84 | episodeTitle: Optional[str] 85 | releaseYear: Optional[int] 86 | # seoUrl: Optional[str] 87 | categoryId: int 88 | subCategoryId: int 89 | episodeAirDate: Optional[str] # /Date(timestamp + timezone offset)/ 90 | episodeNumber: Optional[int] 91 | seasonNumber: Optional[int] 92 | mcoId: Optional[int] 93 | title: Optional[str] 94 | type: Optional[str] 95 | slug: Optional[str] 96 | typeId: Optional[int] 97 | images: List[Image] 98 | genres: List[Genre] 99 | duration: Optional[int] # Seconds 100 | metacriticSummary: Optional[MetacriticSummaryItem] 101 | video: Optional[VideoItem] 102 | 103 | @validator('tvRating') 104 | def uppercase_tv_rating(cls, v): 105 | """Just to be sure TV rating is always uppercased.""" 106 | if v is not None: 107 | v = v.upper() 108 | 109 | return v 110 | 111 | @property 112 | def rating_system(self): 113 | """Detect rating system.""" 114 | if self.tvRating in ('12', '12A', '15', '18', 'R18', 'U'): 115 | return 'BBFC' 116 | 117 | if self.tvRating in ('TV-Y', 'TV-Y7', 'TV-G', 'TV-PG', 'TV-14', 'TV-MA'): 118 | return 'VCHIP' 119 | 120 | if self.tvRating in ('G', 'PG', 'PG-13', 'R', 'NC-17', 121 | 'NR', 'NO RATING', 'NOT RATED', 'UR'): 122 | return 'MPA' 123 | 124 | if self.tvRating in ('0+', '6+', '12+', '15+', '18+'): 125 | return 'GSRR' 126 | 127 | return None 128 | 129 | def to_xmltv(self, get_icon=None, expand_genres=True, add_tv_rating_icon=False, lang=None): 130 | # Add title 131 | program = Programme( 132 | title=[Title(content=[self.name], lang=lang)], 133 | clumpidx=None, 134 | ) 135 | 136 | # Description 137 | if self.description: 138 | program.desc = self.description 139 | 140 | # Date 141 | if self.episodeAirDate: 142 | try: 143 | ts = int(re.sub(r'[^\d]', '', self.episodeAirDate)[:-3]) # tz comes always "000" 144 | date = datetime.fromtimestamp(ts) 145 | program.date = date.strftime('%Y%m%d') 146 | except ValueError: 147 | pass 148 | 149 | if not program.date and self.releaseYear: 150 | # Add trailing zeros, eg: 20070000 151 | program.date = f'{self.releaseYear}0000' 152 | 153 | # Genres 154 | for genre in sorted(self.genres, key=lambda x: x.id): 155 | if expand_genres: 156 | for sub_genre in genre.genres: 157 | # All subgenres are lowercased, recase it 158 | sub_genre = re.sub( 159 | r'[\w\s-]+&?\s?', lambda x: x.group(0).capitalize(), 160 | sub_genre 161 | ) 162 | program.category.append( 163 | Category(content=[sub_genre]) 164 | ) 165 | else: 166 | program.category.append(Category( 167 | content=[genre.name] 168 | )) 169 | 170 | # Duration (without commercials) 171 | if self.duration: 172 | program.length = Length(content=[self.duration], units='seconds') 173 | 174 | # Subtitle 175 | if self.episodeTitle: 176 | program.sub_title.append(SubTitle(content=[self.episodeTitle])) 177 | 178 | # Season / Episode 179 | onscreen, xmltv_ns = None, None 180 | season, episode = self.seasonNumber, self.episodeNumber 181 | if season is not None and episode is not None: 182 | onscreen = f'S{season:02d}E{episode:02d}' 183 | 184 | if season > 0 and episode > 0: 185 | xmltv_ns = f'{season - 1}.{episode - 1}.' 186 | 187 | if season is not None and episode is None: 188 | onscreen = f'S{season:02d}E--' 189 | 190 | if season > 0: 191 | xmltv_ns = f'{season - 1}..' 192 | 193 | if season is None and episode is not None: 194 | onscreen = f'S--E{episode:02d}' 195 | 196 | if episode > 0: 197 | xmltv_ns = f'.{episode - 1}.' 198 | 199 | if onscreen: 200 | program.episode_num.append(EpisodeNum(content=[onscreen], system='onscreen')) 201 | if xmltv_ns: 202 | program.episode_num.append(EpisodeNum(content=[xmltv_ns], system='xmltv_ns')) 203 | 204 | # Posters 205 | for image in self.images: 206 | program.icon.append(Icon(src=image.url, width=image.width, height=image.height)) 207 | 208 | # Rating 209 | if self.tvRating: 210 | tv_rating = Rating(value=self.tvRating) 211 | 212 | if self.rating_system: 213 | tv_rating.system = self.rating_system 214 | else: 215 | warnings.warn(f'No rating system detected for rating "{self.tvRating}"') 216 | 217 | # Add rating icons (some old soft could fail parsing result xml) 218 | if get_icon and add_tv_rating_icon: 219 | tv_rating_icon = get_icon( 220 | icon_name=self.tvRating, 221 | manifest_name='tv_rating' 222 | ) 223 | 224 | if tv_rating_icon: 225 | tv_rating.icon.append(tv_rating_icon) 226 | else: 227 | warnings.warn(f'Failed to get rating icon "{self.tvRating}"') 228 | 229 | program.rating.append(tv_rating) 230 | 231 | # Star-rating 232 | if self.metacriticSummary and self.metacriticSummary.score > 0: 233 | star_rating = StarRating( 234 | value='%d/100' % self.metacriticSummary.score, 235 | system='Metascore' 236 | ) 237 | if get_icon: 238 | metascore_icon = get_icon( 239 | icon_name=str(self.metacriticSummary.score), 240 | manifest_name='metascore' 241 | ) 242 | if metascore_icon: 243 | star_rating.icon.append(metascore_icon) 244 | else: 245 | warnings.warn(f'Failed to get star-rating icon "{self.tvRating}"') 246 | 247 | program.star_rating.append(star_rating) 248 | 249 | return program 250 | -------------------------------------------------------------------------------- /images/icons/metascore.json: -------------------------------------------------------------------------------- 1 | { 2 | "0": { 3 | "path": "metascore/0.png", 4 | "width": 128, 5 | "height": 128 6 | }, 7 | "1": { 8 | "path": "metascore/1.png", 9 | "width": 128, 10 | "height": 128 11 | }, 12 | "2": { 13 | "path": "metascore/2.png", 14 | "width": 128, 15 | "height": 128 16 | }, 17 | "3": { 18 | "path": "metascore/3.png", 19 | "width": 128, 20 | "height": 128 21 | }, 22 | "4": { 23 | "path": "metascore/4.png", 24 | "width": 128, 25 | "height": 128 26 | }, 27 | "5": { 28 | "path": "metascore/5.png", 29 | "width": 128, 30 | "height": 128 31 | }, 32 | "6": { 33 | "path": "metascore/6.png", 34 | "width": 128, 35 | "height": 128 36 | }, 37 | "7": { 38 | "path": "metascore/7.png", 39 | "width": 128, 40 | "height": 128 41 | }, 42 | "8": { 43 | "path": "metascore/8.png", 44 | "width": 128, 45 | "height": 128 46 | }, 47 | "9": { 48 | "path": "metascore/9.png", 49 | "width": 128, 50 | "height": 128 51 | }, 52 | "10": { 53 | "path": "metascore/10.png", 54 | "width": 128, 55 | "height": 128 56 | }, 57 | "11": { 58 | "path": "metascore/11.png", 59 | "width": 128, 60 | "height": 128 61 | }, 62 | "12": { 63 | "path": "metascore/12.png", 64 | "width": 128, 65 | "height": 128 66 | }, 67 | "13": { 68 | "path": "metascore/13.png", 69 | "width": 128, 70 | "height": 128 71 | }, 72 | "14": { 73 | "path": "metascore/14.png", 74 | "width": 128, 75 | "height": 128 76 | }, 77 | "15": { 78 | "path": "metascore/15.png", 79 | "width": 128, 80 | "height": 128 81 | }, 82 | "16": { 83 | "path": "metascore/16.png", 84 | "width": 128, 85 | "height": 128 86 | }, 87 | "17": { 88 | "path": "metascore/17.png", 89 | "width": 128, 90 | "height": 128 91 | }, 92 | "18": { 93 | "path": "metascore/18.png", 94 | "width": 128, 95 | "height": 128 96 | }, 97 | "19": { 98 | "path": "metascore/19.png", 99 | "width": 128, 100 | "height": 128 101 | }, 102 | "20": { 103 | "path": "metascore/20.png", 104 | "width": 128, 105 | "height": 128 106 | }, 107 | "21": { 108 | "path": "metascore/21.png", 109 | "width": 128, 110 | "height": 128 111 | }, 112 | "22": { 113 | "path": "metascore/22.png", 114 | "width": 128, 115 | "height": 128 116 | }, 117 | "23": { 118 | "path": "metascore/23.png", 119 | "width": 128, 120 | "height": 128 121 | }, 122 | "24": { 123 | "path": "metascore/24.png", 124 | "width": 128, 125 | "height": 128 126 | }, 127 | "25": { 128 | "path": "metascore/25.png", 129 | "width": 128, 130 | "height": 128 131 | }, 132 | "26": { 133 | "path": "metascore/26.png", 134 | "width": 128, 135 | "height": 128 136 | }, 137 | "27": { 138 | "path": "metascore/27.png", 139 | "width": 128, 140 | "height": 128 141 | }, 142 | "28": { 143 | "path": "metascore/28.png", 144 | "width": 128, 145 | "height": 128 146 | }, 147 | "29": { 148 | "path": "metascore/29.png", 149 | "width": 128, 150 | "height": 128 151 | }, 152 | "30": { 153 | "path": "metascore/30.png", 154 | "width": 128, 155 | "height": 128 156 | }, 157 | "31": { 158 | "path": "metascore/31.png", 159 | "width": 128, 160 | "height": 128 161 | }, 162 | "32": { 163 | "path": "metascore/32.png", 164 | "width": 128, 165 | "height": 128 166 | }, 167 | "33": { 168 | "path": "metascore/33.png", 169 | "width": 128, 170 | "height": 128 171 | }, 172 | "34": { 173 | "path": "metascore/34.png", 174 | "width": 128, 175 | "height": 128 176 | }, 177 | "35": { 178 | "path": "metascore/35.png", 179 | "width": 128, 180 | "height": 128 181 | }, 182 | "36": { 183 | "path": "metascore/36.png", 184 | "width": 128, 185 | "height": 128 186 | }, 187 | "37": { 188 | "path": "metascore/37.png", 189 | "width": 128, 190 | "height": 128 191 | }, 192 | "38": { 193 | "path": "metascore/38.png", 194 | "width": 128, 195 | "height": 128 196 | }, 197 | "39": { 198 | "path": "metascore/39.png", 199 | "width": 128, 200 | "height": 128 201 | }, 202 | "40": { 203 | "path": "metascore/40.png", 204 | "width": 128, 205 | "height": 128 206 | }, 207 | "41": { 208 | "path": "metascore/41.png", 209 | "width": 128, 210 | "height": 128 211 | }, 212 | "42": { 213 | "path": "metascore/42.png", 214 | "width": 128, 215 | "height": 128 216 | }, 217 | "43": { 218 | "path": "metascore/43.png", 219 | "width": 128, 220 | "height": 128 221 | }, 222 | "44": { 223 | "path": "metascore/44.png", 224 | "width": 128, 225 | "height": 128 226 | }, 227 | "45": { 228 | "path": "metascore/45.png", 229 | "width": 128, 230 | "height": 128 231 | }, 232 | "46": { 233 | "path": "metascore/46.png", 234 | "width": 128, 235 | "height": 128 236 | }, 237 | "47": { 238 | "path": "metascore/47.png", 239 | "width": 128, 240 | "height": 128 241 | }, 242 | "48": { 243 | "path": "metascore/48.png", 244 | "width": 128, 245 | "height": 128 246 | }, 247 | "49": { 248 | "path": "metascore/49.png", 249 | "width": 128, 250 | "height": 128 251 | }, 252 | "50": { 253 | "path": "metascore/50.png", 254 | "width": 128, 255 | "height": 128 256 | }, 257 | "51": { 258 | "path": "metascore/51.png", 259 | "width": 128, 260 | "height": 128 261 | }, 262 | "52": { 263 | "path": "metascore/52.png", 264 | "width": 128, 265 | "height": 128 266 | }, 267 | "53": { 268 | "path": "metascore/53.png", 269 | "width": 128, 270 | "height": 128 271 | }, 272 | "54": { 273 | "path": "metascore/54.png", 274 | "width": 128, 275 | "height": 128 276 | }, 277 | "55": { 278 | "path": "metascore/55.png", 279 | "width": 128, 280 | "height": 128 281 | }, 282 | "56": { 283 | "path": "metascore/56.png", 284 | "width": 128, 285 | "height": 128 286 | }, 287 | "57": { 288 | "path": "metascore/57.png", 289 | "width": 128, 290 | "height": 128 291 | }, 292 | "58": { 293 | "path": "metascore/58.png", 294 | "width": 128, 295 | "height": 128 296 | }, 297 | "59": { 298 | "path": "metascore/59.png", 299 | "width": 128, 300 | "height": 128 301 | }, 302 | "60": { 303 | "path": "metascore/60.png", 304 | "width": 128, 305 | "height": 128 306 | }, 307 | "61": { 308 | "path": "metascore/61.png", 309 | "width": 128, 310 | "height": 128 311 | }, 312 | "62": { 313 | "path": "metascore/62.png", 314 | "width": 128, 315 | "height": 128 316 | }, 317 | "63": { 318 | "path": "metascore/63.png", 319 | "width": 128, 320 | "height": 128 321 | }, 322 | "64": { 323 | "path": "metascore/64.png", 324 | "width": 128, 325 | "height": 128 326 | }, 327 | "65": { 328 | "path": "metascore/65.png", 329 | "width": 128, 330 | "height": 128 331 | }, 332 | "66": { 333 | "path": "metascore/66.png", 334 | "width": 128, 335 | "height": 128 336 | }, 337 | "67": { 338 | "path": "metascore/67.png", 339 | "width": 128, 340 | "height": 128 341 | }, 342 | "68": { 343 | "path": "metascore/68.png", 344 | "width": 128, 345 | "height": 128 346 | }, 347 | "69": { 348 | "path": "metascore/69.png", 349 | "width": 128, 350 | "height": 128 351 | }, 352 | "70": { 353 | "path": "metascore/70.png", 354 | "width": 128, 355 | "height": 128 356 | }, 357 | "71": { 358 | "path": "metascore/71.png", 359 | "width": 128, 360 | "height": 128 361 | }, 362 | "72": { 363 | "path": "metascore/72.png", 364 | "width": 128, 365 | "height": 128 366 | }, 367 | "73": { 368 | "path": "metascore/73.png", 369 | "width": 128, 370 | "height": 128 371 | }, 372 | "74": { 373 | "path": "metascore/74.png", 374 | "width": 128, 375 | "height": 128 376 | }, 377 | "75": { 378 | "path": "metascore/75.png", 379 | "width": 128, 380 | "height": 128 381 | }, 382 | "76": { 383 | "path": "metascore/76.png", 384 | "width": 128, 385 | "height": 128 386 | }, 387 | "77": { 388 | "path": "metascore/77.png", 389 | "width": 128, 390 | "height": 128 391 | }, 392 | "78": { 393 | "path": "metascore/78.png", 394 | "width": 128, 395 | "height": 128 396 | }, 397 | "79": { 398 | "path": "metascore/79.png", 399 | "width": 128, 400 | "height": 128 401 | }, 402 | "80": { 403 | "path": "metascore/80.png", 404 | "width": 128, 405 | "height": 128 406 | }, 407 | "81": { 408 | "path": "metascore/81.png", 409 | "width": 128, 410 | "height": 128 411 | }, 412 | "82": { 413 | "path": "metascore/82.png", 414 | "width": 128, 415 | "height": 128 416 | }, 417 | "83": { 418 | "path": "metascore/83.png", 419 | "width": 128, 420 | "height": 128 421 | }, 422 | "84": { 423 | "path": "metascore/84.png", 424 | "width": 128, 425 | "height": 128 426 | }, 427 | "85": { 428 | "path": "metascore/85.png", 429 | "width": 128, 430 | "height": 128 431 | }, 432 | "86": { 433 | "path": "metascore/86.png", 434 | "width": 128, 435 | "height": 128 436 | }, 437 | "87": { 438 | "path": "metascore/87.png", 439 | "width": 128, 440 | "height": 128 441 | }, 442 | "88": { 443 | "path": "metascore/88.png", 444 | "width": 128, 445 | "height": 128 446 | }, 447 | "89": { 448 | "path": "metascore/89.png", 449 | "width": 128, 450 | "height": 128 451 | }, 452 | "90": { 453 | "path": "metascore/90.png", 454 | "width": 128, 455 | "height": 128 456 | }, 457 | "91": { 458 | "path": "metascore/91.png", 459 | "width": 128, 460 | "height": 128 461 | }, 462 | "92": { 463 | "path": "metascore/92.png", 464 | "width": 128, 465 | "height": 128 466 | }, 467 | "93": { 468 | "path": "metascore/93.png", 469 | "width": 128, 470 | "height": 128 471 | }, 472 | "94": { 473 | "path": "metascore/94.png", 474 | "width": 128, 475 | "height": 128 476 | }, 477 | "95": { 478 | "path": "metascore/95.png", 479 | "width": 128, 480 | "height": 128 481 | }, 482 | "96": { 483 | "path": "metascore/96.png", 484 | "width": 128, 485 | "height": 128 486 | }, 487 | "97": { 488 | "path": "metascore/97.png", 489 | "width": 128, 490 | "height": 128 491 | }, 492 | "98": { 493 | "path": "metascore/98.png", 494 | "width": 128, 495 | "height": 128 496 | }, 497 | "99": { 498 | "path": "metascore/99.png", 499 | "width": 128, 500 | "height": 128 501 | }, 502 | "100": { 503 | "path": "metascore/100.png", 504 | "width": 128, 505 | "height": 128 506 | } 507 | } -------------------------------------------------------------------------------- /images/icons/channels-for-dark-bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "FoxNews": { 3 | "path": "channels/for-dark-bg/FoxNews.png", 4 | "width": 512, 5 | "height": 512 6 | }, 7 | "ESPN": { 8 | "path": "channels/for-dark-bg/ESPN.png", 9 | "width": 512, 10 | "height": 512 11 | }, 12 | "ESPNHD": { 13 | "path": "channels/for-dark-bg/ESPNHD.png", 14 | "width": 512, 15 | "height": 512 16 | }, 17 | "BET": { 18 | "path": "channels/for-dark-bg/BET.png", 19 | "width": 512, 20 | "height": 512 21 | }, 22 | "Boomerang": { 23 | "path": "channels/for-dark-bg/Boomerang.png", 24 | "width": 512, 25 | "height": 512 26 | }, 27 | "HBO": { 28 | "path": "channels/for-dark-bg/HBO.png", 29 | "width": 512, 30 | "height": 512 31 | }, 32 | "HBOHD": { 33 | "path": "channels/for-dark-bg/HBOHD.png", 34 | "width": 512, 35 | "height": 512 36 | }, 37 | "Discovery": { 38 | "path": "channels/for-dark-bg/Discovery.png", 39 | "width": 512, 40 | "height": 512 41 | }, 42 | "DiscoveryFamily": { 43 | "path": "channels/for-dark-bg/DiscoveryFamily.png", 44 | "width": 512, 45 | "height": 512 46 | }, 47 | "NBC": { 48 | "path": "channels/for-dark-bg/NBC.png", 49 | "width": 512, 50 | "height": 512 51 | }, 52 | "NBCHD": { 53 | "path": "channels/for-dark-bg/NBCHD.png", 54 | "width": 512, 55 | "height": 512 56 | }, 57 | "DisneyJr": { 58 | "path": "channels/for-dark-bg/DisneyJr.png", 59 | "width": 512, 60 | "height": 512 61 | }, 62 | "FOX": { 63 | "path": "channels/for-dark-bg/FOX.png", 64 | "width": 512, 65 | "height": 512 66 | }, 67 | "FOXHD": { 68 | "path": "channels/for-dark-bg/FOXHD.png", 69 | "width": 512, 70 | "height": 512 71 | }, 72 | "MotorTrend": { 73 | "path": "channels/for-dark-bg/MotorTrend.png", 74 | "width": 512, 75 | "height": 512 76 | }, 77 | "BTN": { 78 | "path": "channels/for-dark-bg/BTN.png", 79 | "width": 512, 80 | "height": 512 81 | }, 82 | "AE": { 83 | "path": "channels/for-dark-bg/AE.png", 84 | "width": 512, 85 | "height": 512 86 | }, 87 | "CBS": { 88 | "path": "channels/for-dark-bg/CBS.png", 89 | "width": 512, 90 | "height": 512 91 | }, 92 | "CBSHD": { 93 | "path": "channels/for-dark-bg/CBSHD.png", 94 | "width": 512, 95 | "height": 512 96 | }, 97 | "DisneyXD": { 98 | "path": "channels/for-dark-bg/DisneyXD.png", 99 | "width": 512, 100 | "height": 512 101 | }, 102 | "SECN": { 103 | "path": "channels/for-dark-bg/SECN.png", 104 | "width": 512, 105 | "height": 512 106 | }, 107 | "Freeform": { 108 | "path": "channels/for-dark-bg/Freeform.png", 109 | "width": 512, 110 | "height": 512 111 | }, 112 | "AMC": { 113 | "path": "channels/for-dark-bg/AMC.png", 114 | "width": 512, 115 | "height": 512 116 | }, 117 | "CW": { 118 | "path": "channels/for-dark-bg/CW.png", 119 | "width": 512, 120 | "height": 512 121 | }, 122 | "CWHD": { 123 | "path": "channels/for-dark-bg/CWHD.png", 124 | "width": 512, 125 | "height": 512 126 | }, 127 | "GOLF": { 128 | "path": "channels/for-dark-bg/GOLF.png", 129 | "width": 512, 130 | "height": 512 131 | }, 132 | "NatGEOWild": { 133 | "path": "channels/for-dark-bg/NatGEOWild.png", 134 | "width": 512, 135 | "height": 512 136 | }, 137 | "Comedy": { 138 | "path": "channels/for-dark-bg/Comedy.png", 139 | "width": 512, 140 | "height": 512 141 | }, 142 | "FOXNY": { 143 | "path": "channels/for-dark-bg/FOXNY.png", 144 | "width": 512, 145 | "height": 512 146 | }, 147 | "Hallmark": { 148 | "path": "channels/for-dark-bg/Hallmark.png", 149 | "width": 512, 150 | "height": 512 151 | }, 152 | "Showtime": { 153 | "path": "channels/for-dark-bg/Showtime.png", 154 | "width": 512, 155 | "height": 512 156 | }, 157 | "Nicktoons": { 158 | "path": "channels/for-dark-bg/Nicktoons.png", 159 | "width": 512, 160 | "height": 512 161 | }, 162 | "NickJr": { 163 | "path": "channels/for-dark-bg/NickJr.png", 164 | "width": 512, 165 | "height": 512 166 | }, 167 | "History": { 168 | "path": "channels/for-dark-bg/History.png", 169 | "width": 512, 170 | "height": 512 171 | }, 172 | "Telemundo": { 173 | "path": "channels/for-dark-bg/Telemundo.png", 174 | "width": 512, 175 | "height": 512 176 | }, 177 | "Lifetime": { 178 | "path": "channels/for-dark-bg/Lifetime.png", 179 | "width": 512, 180 | "height": 512 181 | }, 182 | "Science": { 183 | "path": "channels/for-dark-bg/Science.png", 184 | "width": 512, 185 | "height": 512 186 | }, 187 | "E": { 188 | "path": "channels/for-dark-bg/E.png", 189 | "width": 512, 190 | "height": 512 191 | }, 192 | "MLB": { 193 | "path": "channels/for-dark-bg/MLB.png", 194 | "width": 512, 195 | "height": 512 196 | }, 197 | "HLN": { 198 | "path": "channels/for-dark-bg/HLN.png", 199 | "width": 512, 200 | "height": 512 201 | }, 202 | "ESPN2": { 203 | "path": "channels/for-dark-bg/ESPN2.png", 204 | "width": 512, 205 | "height": 512 206 | }, 207 | "Cinemax": { 208 | "path": "channels/for-dark-bg/Cinemax.png", 209 | "width": 512, 210 | "height": 512 211 | }, 212 | "FS1": { 213 | "path": "channels/for-dark-bg/FS1.png", 214 | "width": 512, 215 | "height": 512 216 | }, 217 | "FS1HD": { 218 | "path": "channels/for-dark-bg/FS1HD.png", 219 | "width": 512, 220 | "height": 512 221 | }, 222 | "WWE": { 223 | "path": "channels/for-dark-bg/WWE.png", 224 | "width": 512, 225 | "height": 512 226 | }, 227 | "CMT": { 228 | "path": "channels/for-dark-bg/CMT.png", 229 | "width": 512, 230 | "height": 512 231 | }, 232 | "TruTV": { 233 | "path": "channels/for-dark-bg/TruTV.png", 234 | "width": 512, 235 | "height": 512 236 | }, 237 | "CSPAN": { 238 | "path": "channels/for-dark-bg/CSPAN.png", 239 | "width": 512, 240 | "height": 512 241 | }, 242 | "ABCNY": { 243 | "path": "channels/for-dark-bg/ABCNY.png", 244 | "width": 512, 245 | "height": 512 246 | }, 247 | "POP": { 248 | "path": "channels/for-dark-bg/POP.png", 249 | "width": 512, 250 | "height": 512 251 | }, 252 | "CNN": { 253 | "path": "channels/for-dark-bg/CNN.png", 254 | "width": 512, 255 | "height": 512 256 | }, 257 | "Paramount": { 258 | "path": "channels/for-dark-bg/Paramount.png", 259 | "width": 512, 260 | "height": 512 261 | }, 262 | "Animal": { 263 | "path": "channels/for-dark-bg/Animal.png", 264 | "width": 512, 265 | "height": 512 266 | }, 267 | "SundanceTV": { 268 | "path": "channels/for-dark-bg/SundanceTV.png", 269 | "width": 512, 270 | "height": 512 271 | }, 272 | "FoodNetwork": { 273 | "path": "channels/for-dark-bg/FoodNetwork.png", 274 | "width": 512, 275 | "height": 512 276 | }, 277 | "FoxBusiness": { 278 | "path": "channels/for-dark-bg/FoxBusiness.png", 279 | "width": 512, 280 | "height": 512 281 | }, 282 | "WETV": { 283 | "path": "channels/for-dark-bg/WETV.png", 284 | "width": 512, 285 | "height": 512 286 | }, 287 | "CNBC": { 288 | "path": "channels/for-dark-bg/CNBC.png", 289 | "width": 512, 290 | "height": 512 291 | }, 292 | "USANetwork": { 293 | "path": "channels/for-dark-bg/USANetwork.png", 294 | "width": 512, 295 | "height": 512 296 | }, 297 | "PBS": { 298 | "path": "channels/for-dark-bg/PBS.png", 299 | "width": 512, 300 | "height": 512 301 | }, 302 | "DA": { 303 | "path": "channels/for-dark-bg/DA.png", 304 | "width": 512, 305 | "height": 512 306 | }, 307 | "FS2": { 308 | "path": "channels/for-dark-bg/FS2.png", 309 | "width": 512, 310 | "height": 512 311 | }, 312 | "TNT": { 313 | "path": "channels/for-dark-bg/TNT.png", 314 | "width": 512, 315 | "height": 512 316 | }, 317 | "HGTV": { 318 | "path": "channels/for-dark-bg/HGTV.png", 319 | "width": 512, 320 | "height": 512 321 | }, 322 | "MTV": { 323 | "path": "channels/for-dark-bg/MTV.png", 324 | "width": 512, 325 | "height": 512 326 | }, 327 | "CWNY": { 328 | "path": "channels/for-dark-bg/CWNY.png", 329 | "width": 512, 330 | "height": 512 331 | }, 332 | "OLY": { 333 | "path": "channels/for-dark-bg/OLY.png", 334 | "width": 512, 335 | "height": 512 336 | }, 337 | "Oxygen": { 338 | "path": "channels/for-dark-bg/Oxygen.png", 339 | "width": 512, 340 | "height": 512 341 | }, 342 | "NBCNY": { 343 | "path": "channels/for-dark-bg/NBCNY.png", 344 | "width": 512, 345 | "height": 512 346 | }, 347 | "MSNBC": { 348 | "path": "channels/for-dark-bg/MSNBC.png", 349 | "width": 512, 350 | "height": 512 351 | }, 352 | "OWN": { 353 | "path": "channels/for-dark-bg/OWN.png", 354 | "width": 512, 355 | "height": 512 356 | }, 357 | "Univision": { 358 | "path": "channels/for-dark-bg/Univision.png", 359 | "width": 512, 360 | "height": 512 361 | }, 362 | "CBSSN": { 363 | "path": "channels/for-dark-bg/CBSSN.png", 364 | "width": 512, 365 | "height": 512 366 | }, 367 | "FXMovie": { 368 | "path": "channels/for-dark-bg/FXMovie.png", 369 | "width": 512, 370 | "height": 512 371 | }, 372 | "NFL": { 373 | "path": "channels/for-dark-bg/NFL.png", 374 | "width": 512, 375 | "height": 512 376 | }, 377 | "NFLHD": { 378 | "path": "channels/for-dark-bg/NFLHD.png", 379 | "width": 512, 380 | "height": 512 381 | }, 382 | "NHLHD": { 383 | "path": "channels/for-dark-bg/NHLHD.png", 384 | "width": 512, 385 | "height": 512 386 | }, 387 | "FX": { 388 | "path": "channels/for-dark-bg/FX.png", 389 | "width": 512, 390 | "height": 512 391 | }, 392 | "TLC": { 393 | "path": "channels/for-dark-bg/TLC.png", 394 | "width": 512, 395 | "height": 512 396 | }, 397 | "ABC": { 398 | "path": "channels/for-dark-bg/ABC.png", 399 | "width": 512, 400 | "height": 512 401 | }, 402 | "ABCHD": { 403 | "path": "channels/for-dark-bg/ABCHD.png", 404 | "width": 512, 405 | "height": 512 406 | }, 407 | "Bravo": { 408 | "path": "channels/for-dark-bg/Bravo.png", 409 | "width": 512, 410 | "height": 512 411 | }, 412 | "FXX": { 413 | "path": "channels/for-dark-bg/FXX.png", 414 | "width": 512, 415 | "height": 512 416 | }, 417 | "TBS": { 418 | "path": "channels/for-dark-bg/TBS.png", 419 | "width": 512, 420 | "height": 512 421 | }, 422 | "NFLRZ": { 423 | "path": "channels/for-dark-bg/NFLRZ.png", 424 | "width": 512, 425 | "height": 512 426 | }, 427 | "StarZ": { 428 | "path": "channels/for-dark-bg/StarZ.png", 429 | "width": 512, 430 | "height": 512 431 | }, 432 | "OAN": { 433 | "path": "channels/for-dark-bg/OAN.png", 434 | "width": 512, 435 | "height": 512 436 | }, 437 | "ESPNU": { 438 | "path": "channels/for-dark-bg/ESPNU.png", 439 | "width": 512, 440 | "height": 512 441 | }, 442 | "TWC": { 443 | "path": "channels/for-dark-bg/TWC.png", 444 | "width": 512, 445 | "height": 512 446 | }, 447 | "NBCSN": { 448 | "path": "channels/for-dark-bg/NBCSN.png", 449 | "width": 512, 450 | "height": 512 451 | }, 452 | "NBA": { 453 | "path": "channels/for-dark-bg/NBA.png", 454 | "width": 512, 455 | "height": 512 456 | }, 457 | "IONNY": { 458 | "path": "channels/for-dark-bg/IONNY.png", 459 | "width": 512, 460 | "height": 512 461 | }, 462 | "BBCAmerica": { 463 | "path": "channels/for-dark-bg/BBCAmerica.png", 464 | "width": 512, 465 | "height": 512 466 | }, 467 | "Tennis": { 468 | "path": "channels/for-dark-bg/Tennis.png", 469 | "width": 512, 470 | "height": 512 471 | }, 472 | "Nickelodeon": { 473 | "path": "channels/for-dark-bg/Nickelodeon.png", 474 | "width": 512, 475 | "height": 512 476 | }, 477 | "YES": { 478 | "path": "channels/for-dark-bg/YES.png", 479 | "width": 512, 480 | "height": 512 481 | }, 482 | "ACCN": { 483 | "path": "channels/for-dark-bg/ACCN.png", 484 | "width": 512, 485 | "height": 512 486 | }, 487 | "DIY": { 488 | "path": "channels/for-dark-bg/DIY.png", 489 | "width": 512, 490 | "height": 512 491 | }, 492 | "Travel": { 493 | "path": "channels/for-dark-bg/Travel.png", 494 | "width": 512, 495 | "height": 512 496 | }, 497 | "ID": { 498 | "path": "channels/for-dark-bg/ID.png", 499 | "width": 512, 500 | "height": 512 501 | }, 502 | "GSN": { 503 | "path": "channels/for-dark-bg/GSN.png", 504 | "width": 512, 505 | "height": 512 506 | }, 507 | "HMM": { 508 | "path": "channels/for-dark-bg/HMM.png", 509 | "width": 512, 510 | "height": 512 511 | }, 512 | "VH1": { 513 | "path": "channels/for-dark-bg/VH1.png", 514 | "width": 512, 515 | "height": 512 516 | }, 517 | "CBSNY": { 518 | "path": "channels/for-dark-bg/CBSNY.png", 519 | "width": 512, 520 | "height": 512 521 | }, 522 | "CN": { 523 | "path": "channels/for-dark-bg/CN.png", 524 | "width": 512, 525 | "height": 512 526 | }, 527 | "NatGEO": { 528 | "path": "channels/for-dark-bg/NatGEO.png", 529 | "width": 512, 530 | "height": 512 531 | }, 532 | "ESPNews": { 533 | "path": "channels/for-dark-bg/ESPNews.png", 534 | "width": 512, 535 | "height": 512 536 | }, 537 | "Disney": { 538 | "path": "channels/for-dark-bg/Disney.png", 539 | "width": 512, 540 | "height": 512 541 | }, 542 | "TCM": { 543 | "path": "channels/for-dark-bg/TCM.png", 544 | "width": 512, 545 | "height": 512 546 | }, 547 | "LifetimeM": { 548 | "path": "channels/for-dark-bg/LifetimeM.png", 549 | "width": 512, 550 | "height": 512 551 | }, 552 | "TVLand": { 553 | "path": "channels/for-dark-bg/TVLand.png", 554 | "width": 512, 555 | "height": 512 556 | }, 557 | "SYFY": { 558 | "path": "channels/for-dark-bg/SYFY.png", 559 | "width": 512, 560 | "height": 512 561 | }, 562 | "Reelz": { 563 | "path": "channels/for-dark-bg/Reelz.png", 564 | "width": 512, 565 | "height": 512 566 | }, 567 | "TeenNick": { 568 | "path": "channels/for-dark-bg/TeenNick.png", 569 | "width": 512, 570 | "height": 512 571 | } 572 | } -------------------------------------------------------------------------------- /images/icons/channels-for-light-bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "FoxNews": { 3 | "path": "channels/for-light-bg/FoxNews.png", 4 | "width": 512, 5 | "height": 512 6 | }, 7 | "ESPN": { 8 | "path": "channels/for-light-bg/ESPN.png", 9 | "width": 512, 10 | "height": 512 11 | }, 12 | "ESPNHD": { 13 | "path": "channels/for-light-bg/ESPNHD.png", 14 | "width": 512, 15 | "height": 512 16 | }, 17 | "BET": { 18 | "path": "channels/for-light-bg/BET.png", 19 | "width": 512, 20 | "height": 512 21 | }, 22 | "Boomerang": { 23 | "path": "channels/for-light-bg/Boomerang.png", 24 | "width": 512, 25 | "height": 512 26 | }, 27 | "HBO": { 28 | "path": "channels/for-light-bg/HBO.png", 29 | "width": 512, 30 | "height": 512 31 | }, 32 | "HBOHD": { 33 | "path": "channels/for-light-bg/HBOHD.png", 34 | "width": 512, 35 | "height": 512 36 | }, 37 | "Discovery": { 38 | "path": "channels/for-light-bg/Discovery.png", 39 | "width": 512, 40 | "height": 512 41 | }, 42 | "DiscoveryFamily": { 43 | "path": "channels/for-light-bg/DiscoveryFamily.png", 44 | "width": 512, 45 | "height": 512 46 | }, 47 | "NBC": { 48 | "path": "channels/for-light-bg/NBC.png", 49 | "width": 512, 50 | "height": 512 51 | }, 52 | "NBCHD": { 53 | "path": "channels/for-light-bg/NBCHD.png", 54 | "width": 512, 55 | "height": 512 56 | }, 57 | "DisneyJr": { 58 | "path": "channels/for-light-bg/DisneyJr.png", 59 | "width": 512, 60 | "height": 512 61 | }, 62 | "FOX": { 63 | "path": "channels/for-light-bg/FOX.png", 64 | "width": 512, 65 | "height": 512 66 | }, 67 | "FOXHD": { 68 | "path": "channels/for-light-bg/FOXHD.png", 69 | "width": 512, 70 | "height": 512 71 | }, 72 | "MotorTrend": { 73 | "path": "channels/for-light-bg/MotorTrend.png", 74 | "width": 512, 75 | "height": 512 76 | }, 77 | "BTN": { 78 | "path": "channels/for-light-bg/BTN.png", 79 | "width": 512, 80 | "height": 512 81 | }, 82 | "AE": { 83 | "path": "channels/for-light-bg/AE.png", 84 | "width": 512, 85 | "height": 512 86 | }, 87 | "CBS": { 88 | "path": "channels/for-light-bg/CBS.png", 89 | "width": 512, 90 | "height": 512 91 | }, 92 | "CBSHD": { 93 | "path": "channels/for-light-bg/CBSHD.png", 94 | "width": 512, 95 | "height": 512 96 | }, 97 | "DisneyXD": { 98 | "path": "channels/for-light-bg/DisneyXD.png", 99 | "width": 512, 100 | "height": 512 101 | }, 102 | "SECN": { 103 | "path": "channels/for-light-bg/SECN.png", 104 | "width": 512, 105 | "height": 512 106 | }, 107 | "Freeform": { 108 | "path": "channels/for-light-bg/Freeform.png", 109 | "width": 512, 110 | "height": 512 111 | }, 112 | "AMC": { 113 | "path": "channels/for-light-bg/AMC.png", 114 | "width": 512, 115 | "height": 512 116 | }, 117 | "CW": { 118 | "path": "channels/for-light-bg/CW.png", 119 | "width": 512, 120 | "height": 512 121 | }, 122 | "CWHD": { 123 | "path": "channels/for-light-bg/CWHD.png", 124 | "width": 512, 125 | "height": 512 126 | }, 127 | "GOLF": { 128 | "path": "channels/for-light-bg/GOLF.png", 129 | "width": 512, 130 | "height": 512 131 | }, 132 | "NatGEOWild": { 133 | "path": "channels/for-light-bg/NatGEOWild.png", 134 | "width": 512, 135 | "height": 512 136 | }, 137 | "Comedy": { 138 | "path": "channels/for-light-bg/Comedy.png", 139 | "width": 512, 140 | "height": 512 141 | }, 142 | "FOXNY": { 143 | "path": "channels/for-light-bg/FOXNY.png", 144 | "width": 512, 145 | "height": 512 146 | }, 147 | "Hallmark": { 148 | "path": "channels/for-light-bg/Hallmark.png", 149 | "width": 512, 150 | "height": 512 151 | }, 152 | "Showtime": { 153 | "path": "channels/for-light-bg/Showtime.png", 154 | "width": 512, 155 | "height": 512 156 | }, 157 | "Nicktoons": { 158 | "path": "channels/for-light-bg/Nicktoons.png", 159 | "width": 512, 160 | "height": 512 161 | }, 162 | "NickJr": { 163 | "path": "channels/for-light-bg/NickJr.png", 164 | "width": 512, 165 | "height": 512 166 | }, 167 | "History": { 168 | "path": "channels/for-light-bg/History.png", 169 | "width": 512, 170 | "height": 512 171 | }, 172 | "Telemundo": { 173 | "path": "channels/for-light-bg/Telemundo.png", 174 | "width": 512, 175 | "height": 512 176 | }, 177 | "Lifetime": { 178 | "path": "channels/for-light-bg/Lifetime.png", 179 | "width": 512, 180 | "height": 512 181 | }, 182 | "Science": { 183 | "path": "channels/for-light-bg/Science.png", 184 | "width": 512, 185 | "height": 512 186 | }, 187 | "E": { 188 | "path": "channels/for-light-bg/E.png", 189 | "width": 512, 190 | "height": 512 191 | }, 192 | "MLB": { 193 | "path": "channels/for-light-bg/MLB.png", 194 | "width": 512, 195 | "height": 512 196 | }, 197 | "HLN": { 198 | "path": "channels/for-light-bg/HLN.png", 199 | "width": 512, 200 | "height": 512 201 | }, 202 | "ESPN2": { 203 | "path": "channels/for-light-bg/ESPN2.png", 204 | "width": 512, 205 | "height": 512 206 | }, 207 | "Cinemax": { 208 | "path": "channels/for-light-bg/Cinemax.png", 209 | "width": 512, 210 | "height": 512 211 | }, 212 | "FS1": { 213 | "path": "channels/for-light-bg/FS1.png", 214 | "width": 512, 215 | "height": 512 216 | }, 217 | "FS1HD": { 218 | "path": "channels/for-light-bg/FS1HD.png", 219 | "width": 512, 220 | "height": 512 221 | }, 222 | "WWE": { 223 | "path": "channels/for-light-bg/WWE.png", 224 | "width": 512, 225 | "height": 512 226 | }, 227 | "CMT": { 228 | "path": "channels/for-light-bg/CMT.png", 229 | "width": 512, 230 | "height": 512 231 | }, 232 | "TruTV": { 233 | "path": "channels/for-light-bg/TruTV.png", 234 | "width": 512, 235 | "height": 512 236 | }, 237 | "CSPAN": { 238 | "path": "channels/for-light-bg/CSPAN.png", 239 | "width": 512, 240 | "height": 512 241 | }, 242 | "ABCNY": { 243 | "path": "channels/for-light-bg/ABCNY.png", 244 | "width": 512, 245 | "height": 512 246 | }, 247 | "POP": { 248 | "path": "channels/for-light-bg/POP.png", 249 | "width": 512, 250 | "height": 512 251 | }, 252 | "CNN": { 253 | "path": "channels/for-light-bg/CNN.png", 254 | "width": 512, 255 | "height": 512 256 | }, 257 | "Paramount": { 258 | "path": "channels/for-light-bg/Paramount.png", 259 | "width": 512, 260 | "height": 512 261 | }, 262 | "Animal": { 263 | "path": "channels/for-light-bg/Animal.png", 264 | "width": 512, 265 | "height": 512 266 | }, 267 | "SundanceTV": { 268 | "path": "channels/for-light-bg/SundanceTV.png", 269 | "width": 512, 270 | "height": 512 271 | }, 272 | "FoodNetwork": { 273 | "path": "channels/for-light-bg/FoodNetwork.png", 274 | "width": 512, 275 | "height": 512 276 | }, 277 | "FoxBusiness": { 278 | "path": "channels/for-light-bg/FoxBusiness.png", 279 | "width": 512, 280 | "height": 512 281 | }, 282 | "WETV": { 283 | "path": "channels/for-light-bg/WETV.png", 284 | "width": 512, 285 | "height": 512 286 | }, 287 | "CNBC": { 288 | "path": "channels/for-light-bg/CNBC.png", 289 | "width": 512, 290 | "height": 512 291 | }, 292 | "USANetwork": { 293 | "path": "channels/for-light-bg/USANetwork.png", 294 | "width": 512, 295 | "height": 512 296 | }, 297 | "PBS": { 298 | "path": "channels/for-light-bg/PBS.png", 299 | "width": 512, 300 | "height": 512 301 | }, 302 | "DA": { 303 | "path": "channels/for-light-bg/DA.png", 304 | "width": 512, 305 | "height": 512 306 | }, 307 | "FS2": { 308 | "path": "channels/for-light-bg/FS2.png", 309 | "width": 512, 310 | "height": 512 311 | }, 312 | "TNT": { 313 | "path": "channels/for-light-bg/TNT.png", 314 | "width": 512, 315 | "height": 512 316 | }, 317 | "HGTV": { 318 | "path": "channels/for-light-bg/HGTV.png", 319 | "width": 512, 320 | "height": 512 321 | }, 322 | "MTV": { 323 | "path": "channels/for-light-bg/MTV.png", 324 | "width": 512, 325 | "height": 512 326 | }, 327 | "CWNY": { 328 | "path": "channels/for-light-bg/CWNY.png", 329 | "width": 512, 330 | "height": 512 331 | }, 332 | "OLY": { 333 | "path": "channels/for-light-bg/OLY.png", 334 | "width": 512, 335 | "height": 512 336 | }, 337 | "Oxygen": { 338 | "path": "channels/for-light-bg/Oxygen.png", 339 | "width": 512, 340 | "height": 512 341 | }, 342 | "NBCNY": { 343 | "path": "channels/for-light-bg/NBCNY.png", 344 | "width": 512, 345 | "height": 512 346 | }, 347 | "MSNBC": { 348 | "path": "channels/for-light-bg/MSNBC.png", 349 | "width": 512, 350 | "height": 512 351 | }, 352 | "OWN": { 353 | "path": "channels/for-light-bg/OWN.png", 354 | "width": 512, 355 | "height": 512 356 | }, 357 | "Univision": { 358 | "path": "channels/for-light-bg/Univision.png", 359 | "width": 512, 360 | "height": 512 361 | }, 362 | "CBSSN": { 363 | "path": "channels/for-light-bg/CBSSN.png", 364 | "width": 512, 365 | "height": 512 366 | }, 367 | "FXMovie": { 368 | "path": "channels/for-light-bg/FXMovie.png", 369 | "width": 512, 370 | "height": 512 371 | }, 372 | "NFL": { 373 | "path": "channels/for-light-bg/NFL.png", 374 | "width": 512, 375 | "height": 512 376 | }, 377 | "NFLHD": { 378 | "path": "channels/for-light-bg/NFLHD.png", 379 | "width": 512, 380 | "height": 512 381 | }, 382 | "NHLHD": { 383 | "path": "channels/for-light-bg/NHLHD.png", 384 | "width": 512, 385 | "height": 512 386 | }, 387 | "FX": { 388 | "path": "channels/for-light-bg/FX.png", 389 | "width": 512, 390 | "height": 512 391 | }, 392 | "TLC": { 393 | "path": "channels/for-light-bg/TLC.png", 394 | "width": 512, 395 | "height": 512 396 | }, 397 | "ABC": { 398 | "path": "channels/for-light-bg/ABC.png", 399 | "width": 512, 400 | "height": 512 401 | }, 402 | "ABCHD": { 403 | "path": "channels/for-light-bg/ABCHD.png", 404 | "width": 512, 405 | "height": 512 406 | }, 407 | "Bravo": { 408 | "path": "channels/for-light-bg/Bravo.png", 409 | "width": 512, 410 | "height": 512 411 | }, 412 | "FXX": { 413 | "path": "channels/for-light-bg/FXX.png", 414 | "width": 512, 415 | "height": 512 416 | }, 417 | "TBS": { 418 | "path": "channels/for-light-bg/TBS.png", 419 | "width": 512, 420 | "height": 512 421 | }, 422 | "NFLRZ": { 423 | "path": "channels/for-light-bg/NFLRZ.png", 424 | "width": 512, 425 | "height": 512 426 | }, 427 | "StarZ": { 428 | "path": "channels/for-light-bg/StarZ.png", 429 | "width": 512, 430 | "height": 512 431 | }, 432 | "OAN": { 433 | "path": "channels/for-light-bg/OAN.png", 434 | "width": 512, 435 | "height": 512 436 | }, 437 | "ESPNU": { 438 | "path": "channels/for-light-bg/ESPNU.png", 439 | "width": 512, 440 | "height": 512 441 | }, 442 | "TWC": { 443 | "path": "channels/for-light-bg/TWC.png", 444 | "width": 512, 445 | "height": 512 446 | }, 447 | "NBCSN": { 448 | "path": "channels/for-light-bg/NBCSN.png", 449 | "width": 512, 450 | "height": 512 451 | }, 452 | "NBA": { 453 | "path": "channels/for-light-bg/NBA.png", 454 | "width": 512, 455 | "height": 512 456 | }, 457 | "IONNY": { 458 | "path": "channels/for-light-bg/IONNY.png", 459 | "width": 512, 460 | "height": 512 461 | }, 462 | "BBCAmerica": { 463 | "path": "channels/for-light-bg/BBCAmerica.png", 464 | "width": 512, 465 | "height": 512 466 | }, 467 | "Tennis": { 468 | "path": "channels/for-light-bg/Tennis.png", 469 | "width": 512, 470 | "height": 512 471 | }, 472 | "Nickelodeon": { 473 | "path": "channels/for-light-bg/Nickelodeon.png", 474 | "width": 512, 475 | "height": 512 476 | }, 477 | "YES": { 478 | "path": "channels/for-light-bg/YES.png", 479 | "width": 512, 480 | "height": 512 481 | }, 482 | "ACCN": { 483 | "path": "channels/for-light-bg/ACCN.png", 484 | "width": 512, 485 | "height": 512 486 | }, 487 | "DIY": { 488 | "path": "channels/for-light-bg/DIY.png", 489 | "width": 512, 490 | "height": 512 491 | }, 492 | "Travel": { 493 | "path": "channels/for-light-bg/Travel.png", 494 | "width": 512, 495 | "height": 512 496 | }, 497 | "ID": { 498 | "path": "channels/for-light-bg/ID.png", 499 | "width": 512, 500 | "height": 512 501 | }, 502 | "GSN": { 503 | "path": "channels/for-light-bg/GSN.png", 504 | "width": 512, 505 | "height": 512 506 | }, 507 | "HMM": { 508 | "path": "channels/for-light-bg/HMM.png", 509 | "width": 512, 510 | "height": 512 511 | }, 512 | "VH1": { 513 | "path": "channels/for-light-bg/VH1.png", 514 | "width": 512, 515 | "height": 512 516 | }, 517 | "CBSNY": { 518 | "path": "channels/for-light-bg/CBSNY.png", 519 | "width": 512, 520 | "height": 512 521 | }, 522 | "CN": { 523 | "path": "channels/for-light-bg/CN.png", 524 | "width": 512, 525 | "height": 512 526 | }, 527 | "NatGEO": { 528 | "path": "channels/for-light-bg/NatGEO.png", 529 | "width": 512, 530 | "height": 512 531 | }, 532 | "ESPNews": { 533 | "path": "channels/for-light-bg/ESPNews.png", 534 | "width": 512, 535 | "height": 512 536 | }, 537 | "Disney": { 538 | "path": "channels/for-light-bg/Disney.png", 539 | "width": 512, 540 | "height": 512 541 | }, 542 | "TCM": { 543 | "path": "channels/for-light-bg/TCM.png", 544 | "width": 512, 545 | "height": 512 546 | }, 547 | "LifetimeM": { 548 | "path": "channels/for-light-bg/LifetimeM.png", 549 | "width": 512, 550 | "height": 512 551 | }, 552 | "TVLand": { 553 | "path": "channels/for-light-bg/TVLand.png", 554 | "width": 512, 555 | "height": 512 556 | }, 557 | "SYFY": { 558 | "path": "channels/for-light-bg/SYFY.png", 559 | "width": 512, 560 | "height": 512 561 | }, 562 | "Reelz": { 563 | "path": "channels/for-light-bg/Reelz.png", 564 | "width": 512, 565 | "height": 512 566 | }, 567 | "TeenNick": { 568 | "path": "channels/for-light-bg/TeenNick.png", 569 | "width": 512, 570 | "height": 512 571 | } 572 | } 573 | -------------------------------------------------------------------------------- /epg_downloader.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import asyncio 5 | import atexit 6 | import functools 7 | import gzip 8 | import io 9 | import json 10 | import pathlib 11 | import shutil 12 | import time 13 | from datetime import datetime, timedelta, timezone 14 | from functools import lru_cache, partial 15 | 16 | import aiohttp 17 | import lxml.etree as ET 18 | import xmltv.models 19 | from diskcache import Cache 20 | from furl import furl 21 | from PIL import Image 22 | from pydantic import ValidationError 23 | from tqdm import tqdm 24 | from xsdata.formats.dataclass.serializers import XmlSerializer 25 | from xsdata.formats.dataclass.serializers.config import SerializerConfig 26 | 27 | import models.tvguide 28 | import models.ustvgo 29 | import models.xmltv 30 | from ustvgo_iptv import (USER_AGENT, USTVGO_HEADERS, gather_with_concurrency, 31 | load_dict, logger, root_dir) 32 | 33 | # Usage: 34 | # ./epg-downloader.py ustvgo.xml --create-archive 35 | 36 | 37 | VERSION = '0.1.1' 38 | DISK_CACHE = Cache(root_dir() / 'cache', size_limit=2**32) # 2**32 bytes == 4 GB 39 | DISK_CACHE_EXPIRE = int(timedelta(days=2).total_seconds()) # 2 days cache expire 40 | 41 | XMLTV_PROGRAM_OPTIONS = { 42 | # Whether to expand genres 43 | 'expand_genres': True, 44 | 45 | # Whether to add TV-Rating icons to XMLTV (some EPG consumers don't support it) 46 | 'add_tv_rating_icon': False 47 | } 48 | 49 | 50 | @atexit.register 51 | def close_cache(): 52 | """Cleanup cache and close.""" 53 | DISK_CACHE.expire() 54 | DISK_CACHE.close() 55 | 56 | 57 | def download_cached_by_url(func): 58 | """Cached wrapper for `download_with_retries`.""" 59 | @functools.wraps(func) 60 | async def inner(url, *args, **kwargs): 61 | result = DISK_CACHE.get(key=url) 62 | if not result: 63 | result = await func(url, *args, **kwargs) 64 | if result: 65 | DISK_CACHE.set(key=url, value=result, expire=DISK_CACHE_EXPIRE) 66 | 67 | return result 68 | 69 | return inner 70 | 71 | 72 | @download_cached_by_url 73 | async def download_with_retries(url, headers=None, timeout=1, timeout_increment=1, 74 | timeout_max=10, retries_max=10, method='json', 75 | extra_exceptions=None, loader=None, ret_default=None): 76 | """Download URL with retries.""" 77 | exceptions = [asyncio.TimeoutError, aiohttp.ClientConnectionError, 78 | aiohttp.ClientResponseError, aiohttp.ServerDisconnectedError] 79 | if method == 'json': 80 | exceptions.append(json.JSONDecodeError) 81 | if extra_exceptions: 82 | exceptions.extend(extra_exceptions) 83 | 84 | loader = loader if loader else lambda x: x 85 | retry = 1 86 | while True: 87 | try: 88 | async with aiohttp.ClientSession(headers=headers, raise_for_status=True) as session: 89 | async with session.get(url, timeout=timeout) as response: 90 | return loader(await getattr(response, method)()) 91 | except Exception as e: 92 | is_exc_valid = any([isinstance(e, exc) for exc in exceptions]) 93 | if not is_exc_valid: 94 | raise 95 | timeout = min(timeout + timeout_increment, timeout_max) 96 | if retry > retries_max: 97 | logger.warning('Failed to download URL %s', url) 98 | return ret_default 99 | retry += 1 100 | 101 | 102 | async def download_programs(channel): 103 | """Download list of upcoming programs from USTVGO endpoint.""" 104 | if not channel['tvguide_id']: 105 | channel['programs'] = [] 106 | return 107 | 108 | url = 'https://ustvgo.tv/tvguide/JSON2/%s.json?_=%d' \ 109 | % (channel['tvguide_id'], time.time()) # NOTE: 100% cache miss 110 | 111 | def loader(response): 112 | programs = sum(response.get('items', {}).values(), []) 113 | return [models.ustvgo.Program(**program) for program in programs] 114 | 115 | channel['programs'] = await download_with_retries( 116 | url, USTVGO_HEADERS, loader=loader, ret_default=[], 117 | extra_exceptions=[ValidationError, AttributeError], 118 | ) 119 | 120 | 121 | async def download_program_detail(program): 122 | """Download program details from tvguide.com""" 123 | headers = {'Referer': 'https://google.com', 'User-Agent': USER_AGENT} 124 | url = ('https://cmg-prod.apigee.net/v1/xapi/tvschedules/' 125 | 'tvguide/programdetails/%d/web' % program.id) 126 | 127 | def loader(response): 128 | return models.tvguide.ProgramDetails(**response['data']['item']) 129 | 130 | program._details = await download_with_retries( 131 | url, headers, loader=loader, 132 | extra_exceptions=[ValidationError, KeyError] 133 | ) 134 | 135 | 136 | async def download_program_cast(program): 137 | """Download program Cast & Crew.""" 138 | if program._details and program._details.mcoId: 139 | headers = {'Referer': 'https://google.com', 'User-Agent': USER_AGENT} 140 | url = ('https://cmg-prod.apigee.net/v1/xapi/composer/tvguide/pages/' 141 | 'shows-cast/%d/web?contentOnly=true' % program._details.mcoId) 142 | 143 | def loader(response): 144 | # Find "Cast & Crew" component 145 | for component in response.get('components', []): 146 | meta = component.get('meta', {}) 147 | if meta.get('componentName') == 'tv-object-cast-and-crew': 148 | cast_data = component.get('data', {}) 149 | if cast_data: 150 | return models.tvguide.ShowsCast(**cast_data) 151 | 152 | # Component not found, return dummy cast 153 | return models.tvguide.ShowsCast(id='0', items=[]) 154 | 155 | program._cast = await download_with_retries( 156 | url, headers, loader=loader, 157 | extra_exceptions=[ValidationError, KeyError, AttributeError] 158 | ) 159 | 160 | 161 | async def download_program_images(program, images_size, images_quality, base_url): 162 | """Download and resize program images.""" 163 | if not program._details: 164 | return # Nothing to download, bail 165 | 166 | def loader(response): 167 | """Image resize in loader for 168 | reducing disk cache size.""" 169 | with Image.open(io.BytesIO(response)) as img: 170 | img.thumbnail((images_size, images_size)) 171 | bytesio = io.BytesIO() 172 | img.save(bytesio, format=img.format, quality=images_quality) 173 | return bytesio.getbuffer().tobytes() 174 | 175 | for image in program._details.images: 176 | try: 177 | # Download image 178 | img_bytes = await download_with_retries( 179 | image.url, method='read', loader=loader, 180 | timeout=15, timeout_max=120, timeout_increment=10 181 | ) 182 | 183 | # Path for img 184 | img_path = root_dir() / 'images' / 'posters' / image.bucketPath.lstrip('/') 185 | img_path.parent.mkdir(parents=True, exist_ok=True) 186 | 187 | # Save preloaded image 188 | iobytes = io.BytesIO(img_bytes) 189 | img_path.write_bytes(iobytes.getbuffer()) 190 | 191 | # Update image parameters 192 | with Image.open(iobytes) as img: 193 | image.width = img.width 194 | image.height = img.height 195 | image.bucketPath = (furl(base_url) / 'images/posters' / image.bucketPath).url 196 | image.bucketType = 'local' 197 | except Exception as e: 198 | logger.warn(('Something bad happened during ' 199 | 'working with image: %s (URL: %s)', e, image.url)) 200 | 201 | 202 | async def download_program_tags(channels): 203 | """Download tags for programs.""" 204 | start_date = datetime.utcnow() - timedelta(minutes=30) 205 | start_ts = int(start_date.timestamp()) 206 | duration_mins = 60 * 12 207 | provider_id = '9100001138' # Eastern Time Zone 208 | url = ('https://cmg-prod.apigee.net/v1/xapi/tvschedules' 209 | f'/tvguide/{provider_id}/web?start={start_ts}&duration={duration_mins}') 210 | headers = {**USTVGO_HEADERS, 'Referer': 'https://www.tvguide.com/'} 211 | 212 | def loader(response): 213 | programs = sum([x['programSchedules'] for x in response['data']['items']], []) 214 | programs_and_attrs = {(x['programId'], x['startTime']): x['airingAttrib'] for x in programs 215 | if x['airingAttrib'] and x['programId']} 216 | return programs_and_attrs 217 | 218 | data = await download_with_retries(url, headers, loader=loader) 219 | if data: 220 | programs_new = {k for k, v in data.items() if v & 0b100} 221 | programs_live = {k for k, v in data.items() if v & 0b1} 222 | 223 | for channel in channels: 224 | for program in channel['programs']: 225 | if (program.id, program.start_timestamp) in programs_new: 226 | program.tags.append('new') 227 | 228 | if (program.id, program.start_timestamp) in programs_live: 229 | program.tags.append('live') 230 | 231 | 232 | @lru_cache 233 | def icon_manifest(manifest_name): 234 | """Load icon manifest.""" 235 | manifest_path = root_dir() / 'images' / 'icons' / f'{manifest_name}.json' 236 | manifest = json.loads(manifest_path.read_text(encoding='utf-8')) 237 | return manifest 238 | 239 | 240 | def xmltv_icon(icon_name, manifest_name, base_url): 241 | """Get XMLTV icon.""" 242 | manifest = icon_manifest(manifest_name) 243 | if icon_name in manifest: 244 | icon_info = manifest[icon_name] 245 | icon_src = (furl(base_url) / 'images/icons' / icon_info['path']).url 246 | return xmltv.models.Icon(src=icon_src, width=icon_info['width'], height=icon_info['height']) 247 | 248 | return None 249 | 250 | 251 | def make_xmltv(channels, filepath, base_url, icons_for_light_bg): 252 | """Make XMLTV document out of stored channels and collected programs.""" 253 | tv = xmltv.models.Tv( 254 | generator_info_name='ustvgo-iptv', 255 | generator_info_url='https://github.com/interlark/ustvgo-iptv', 256 | date=datetime.now().strftime('%Y%m%d%H%M%S') 257 | ) 258 | 259 | get_icon = partial(xmltv_icon, base_url=base_url) 260 | 261 | for channel in tqdm(channels, desc='Make EPG XMLTV'): 262 | # Add channels 263 | channel_id = channel['stream_id'] 264 | xmltv_channel = xmltv.models.Channel( 265 | display_name=channel['name'], 266 | id=channel_id 267 | ) 268 | 269 | channels_manifest_name = 'channels' 270 | if icons_for_light_bg: 271 | channels_manifest_name += '-for-light-bg' 272 | else: 273 | channels_manifest_name += '-for-dark-bg' 274 | 275 | channel_icon = get_icon(channel_id, channels_manifest_name) 276 | if channel_icon: 277 | xmltv_channel.icon.append(channel_icon) 278 | else: 279 | logger.warning(f'Failed to get channel icon "{channel_id}"') 280 | 281 | tv.channel.append(xmltv_channel) 282 | 283 | # Add programs 284 | for program in channel['programs']: 285 | if program._details: 286 | # Convert program details to xmltv program 287 | xmltv_program = program._details.to_xmltv( 288 | get_icon=get_icon, lang=channel['language'], 289 | **XMLTV_PROGRAM_OPTIONS 290 | ) 291 | else: 292 | # Create program without details 293 | xmltv_program = models.xmltv.Programme( 294 | title=[xmltv.models.Title(content=[program.name])], 295 | clumpidx=None, 296 | ) 297 | 298 | # Bind current channel to the program 299 | xmltv_program.channel = channel['stream_id'] 300 | 301 | # Add tags 302 | if 'new' in program.tags: 303 | xmltv_program.new = '' 304 | 305 | if 'live' in program.tags: 306 | xmltv_program.live = '' 307 | 308 | # Start / End dates 309 | start_ts = datetime.fromtimestamp(program.start_timestamp, tz=timezone.utc) 310 | end_ts = datetime.fromtimestamp(program.end_timestamp, tz=timezone.utc) 311 | 312 | xmltv_program.start = start_ts.strftime('%Y%m%d%H%M%S %z') 313 | xmltv_program.stop = end_ts.strftime('%Y%m%d%H%M%S %z') 314 | 315 | # Add Cast & Crew 316 | if program._cast: 317 | program._cast.add_cast(xmltv_program) 318 | 319 | tv.programme.append(xmltv_program) 320 | 321 | # Write EPG XMLTV to target file path 322 | write_file_from_xml(filepath, tv, base_url) 323 | 324 | 325 | def postprocess_xml(xml_filepath): 326 | """Postprocess output XML file.""" 327 | xml = ET.parse(xml_filepath) 328 | xsi_type = '{http://www.w3.org/2001/XMLSchema-instance}type' 329 | 330 | for programme in xml.findall('programme'): 331 | programme.attrib.pop(xsi_type, None) 332 | 333 | xml.write(xml_filepath, pretty_print=True, encoding='utf-8', xml_declaration=True) 334 | 335 | 336 | def write_file_from_xml(xml_filepath, serialize_class, base_url): 337 | """Method to write serialized XML data to a file.""" 338 | serializer = XmlSerializer(config=SerializerConfig( 339 | pretty_print=True, 340 | encoding='UTF-8', 341 | xml_version='1.0', 342 | xml_declaration=True, 343 | schema_location=furl(base_url).add(path='resources/xmltv.xsd').url 344 | )) 345 | 346 | with xml_filepath.open('w') as data: 347 | serializer.write(data, serialize_class) 348 | 349 | postprocess_xml(xml_filepath) 350 | 351 | 352 | async def download_and_make_epg(filepath, parallel, create_archive, images_size, 353 | images_quality, base_url, icons_for_light_bg): 354 | """Download channels' programs and make XMLTV EPG.""" 355 | channels = load_dict('channels.json') 356 | download_tasks = [download_programs(channel) for channel in channels] 357 | 358 | # Download programs per each channel from USTVGO 359 | await gather_with_concurrency(parallel, *download_tasks, progress_title='Download programs') 360 | 361 | # Download program details from TVGUIDE 362 | for channel in tqdm(channels, desc='Download details'): 363 | download_tasks = [download_program_detail(program) for program in channel['programs']] 364 | await gather_with_concurrency(parallel, *download_tasks, show_progress=False) 365 | 366 | # Download program cast (actors, directors, writers, etc) from TVGUIDE 367 | for channel in tqdm(channels, desc='Download credits'): 368 | download_tasks = [download_program_cast(program) for program in channel['programs']] 369 | await gather_with_concurrency(parallel, *download_tasks, show_progress=False) 370 | 371 | # Download and resize images from TVGUIDE 372 | shutil.rmtree(root_dir() / 'images' / 'posters', ignore_errors=True) # Remove old imgs first 373 | for channel in tqdm(channels, desc='Download images'): 374 | download_tasks = [download_program_images(program, images_size, images_quality, base_url) 375 | for program in channel['programs']] 376 | await gather_with_concurrency(parallel, *download_tasks, show_progress=False) 377 | 378 | # Add tags for programs, 379 | # could be usefull for IPTV recorders. 380 | await download_program_tags(channels) 381 | 382 | # Make EPG 383 | make_xmltv(channels, filepath, base_url, icons_for_light_bg) 384 | 385 | if create_archive: 386 | with gzip.open(f'{filepath}.gz', 'wb') as f: 387 | f.write(filepath.read_bytes()) 388 | 389 | 390 | def main(): 391 | parser = argparse.ArgumentParser('epg-downloader') 392 | parser.add_argument('filepath', type=pathlib.Path) 393 | parser.add_argument( 394 | '--parallel', '-p', metavar='N', type=int, default=10, 395 | help='Number of parallel requests (default: %(default)s)' 396 | ) 397 | parser.add_argument( 398 | '--create-archive', '-a', action='store_true', 399 | help='Create archive of target XML' 400 | ) 401 | parser.add_argument( 402 | '--images-size', type=int, metavar='SIZE', default=720, 403 | help='Set images size (default: %(default)s)' 404 | ) 405 | parser.add_argument( 406 | '--images-quality', type=int, metavar='N', default=80, 407 | help='Set images quality (default: %(default)s)' 408 | ) 409 | parser.add_argument( 410 | '--base-url', metavar='URL', 411 | default='https://raw.githubusercontent.com/interlark/ustvgo-tvguide/master', 412 | help='Base URL' 413 | ) 414 | parser.add_argument( 415 | '--icons-for-light-bg', action='store_true', 416 | help='Put channel icons adapted for light background' 417 | ) 418 | parser.add_argument( 419 | '--version', '-v', action='version', version=f'%(prog)s {VERSION}' 420 | ) 421 | args = parser.parse_args() 422 | 423 | if args.parallel <= 0 or args.images_size <= 0 or args.images_quality <= 0: 424 | parser.error('Invalid arguments') 425 | 426 | asyncio.run(download_and_make_epg(**vars(args))) 427 | 428 | 429 | if __name__ == '__main__': 430 | main() 431 | -------------------------------------------------------------------------------- /channels.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "stream_id": "ABC", 5 | "tvguide_id": "9233011874", 6 | "name": "ABC", 7 | "category": "Entertainment", 8 | "language": "en" 9 | }, 10 | { 11 | "id": 2, 12 | "stream_id": "ABCHD", 13 | "tvguide_id": "9233011874", 14 | "name": "ABC HD", 15 | "category": "Entertainment", 16 | "language": "en" 17 | }, 18 | { 19 | "id": 3, 20 | "stream_id": "ABCNY", 21 | "tvguide_id": "9200000057", 22 | "name": "ABC 7 New York", 23 | "category": "Entertainment", 24 | "language": "en" 25 | }, 26 | { 27 | "id": 4, 28 | "stream_id": "ACCN", 29 | "tvguide_id": "9200017734", 30 | "name": "ACC Network", 31 | "category": "Sports", 32 | "language": "en" 33 | }, 34 | { 35 | "id": 5, 36 | "stream_id": "AE", 37 | "tvguide_id": "9200004889", 38 | "name": "A&E Network", 39 | "category": "Lifestyle", 40 | "language": "en" 41 | }, 42 | { 43 | "id": 6, 44 | "stream_id": "AMC", 45 | "tvguide_id": "9200020107", 46 | "name": "AMC", 47 | "category": "Entertainment", 48 | "language": "en" 49 | }, 50 | { 51 | "id": 7, 52 | "stream_id": "Animal", 53 | "tvguide_id": "9233013462", 54 | "name": "Animal Planet", 55 | "category": "Lifestyle", 56 | "language": "en" 57 | }, 58 | { 59 | "id": 8, 60 | "stream_id": "BBCAmerica", 61 | "tvguide_id": "9200009303", 62 | "name": "BBC America", 63 | "category": "Entertainment", 64 | "language": "en" 65 | }, 66 | { 67 | "id": 9, 68 | "stream_id": "BTN", 69 | "tvguide_id": "9200004533", 70 | "name": "Big Ten Network", 71 | "category": "Sports", 72 | "language": "en" 73 | }, 74 | { 75 | "id": 10, 76 | "stream_id": "BET", 77 | "tvguide_id": "9233000226", 78 | "name": "BET", 79 | "category": "Lifestyle", 80 | "language": "en" 81 | }, 82 | { 83 | "id": 11, 84 | "stream_id": "Boomerang", 85 | "tvguide_id": "9233015844", 86 | "name": "Boomerang", 87 | "category": "Kids", 88 | "language": "en" 89 | }, 90 | { 91 | "id": 12, 92 | "stream_id": "Bravo", 93 | "tvguide_id": "9200020094", 94 | "name": "Bravo", 95 | "category": "Lifestyle", 96 | "language": "en" 97 | }, 98 | { 99 | "id": 13, 100 | "stream_id": "CSPAN", 101 | "tvguide_id": "9233007144", 102 | "name": "C-SPAN", 103 | "category": "News", 104 | "language": "en" 105 | }, 106 | { 107 | "id": 14, 108 | "stream_id": "CBS", 109 | "tvguide_id": "9200018514", 110 | "name": "CBS", 111 | "category": "News", 112 | "language": "en" 113 | }, 114 | { 115 | "id": 15, 116 | "stream_id": "CBSHD", 117 | "tvguide_id": "9200018514", 118 | "name": "CBS HD", 119 | "category": "News", 120 | "language": "en" 121 | }, 122 | { 123 | "id": 16, 124 | "stream_id": "CBSNY", 125 | "tvguide_id": "9200017850", 126 | "name": "CBS 2 New York", 127 | "category": "Entertainment", 128 | "language": "en" 129 | }, 130 | { 131 | "id": 17, 132 | "stream_id": "CBSSN", 133 | "tvguide_id": "9233015468", 134 | "name": "CBS Sports Network", 135 | "category": "Sports", 136 | "language": "en" 137 | }, 138 | { 139 | "id": 18, 140 | "stream_id": "Cinemax", 141 | "tvguide_id": "9200000143", 142 | "name": "Cinemax", 143 | "category": "Premium", 144 | "language": "en" 145 | }, 146 | { 147 | "id": 19, 148 | "stream_id": "CMT", 149 | "tvguide_id": "9233000169", 150 | "name": "CMT", 151 | "category": "Entertainment", 152 | "language": "en" 153 | }, 154 | { 155 | "id": 20, 156 | "stream_id": "CN", 157 | "tvguide_id": "9233001926", 158 | "name": "Cartoon Network", 159 | "category": "Kids", 160 | "language": "en" 161 | }, 162 | { 163 | "id": 21, 164 | "stream_id": "CNBC", 165 | "tvguide_id": "9200009145", 166 | "name": "CNBC", 167 | "category": "News", 168 | "language": "en" 169 | }, 170 | { 171 | "id": 22, 172 | "stream_id": "CNN", 173 | "tvguide_id": "9233008130", 174 | "name": "CNN", 175 | "category": "News", 176 | "language": "en" 177 | }, 178 | { 179 | "id": 23, 180 | "stream_id": "Comedy", 181 | "tvguide_id": "9233009509", 182 | "name": "Comedy Central", 183 | "category": "Entertainment", 184 | "language": "en" 185 | }, 186 | { 187 | "id": 24, 188 | "stream_id": "CW", 189 | "tvguide_id": "9233011398", 190 | "name": "CW", 191 | "category": "Entertainment", 192 | "language": "en" 193 | }, 194 | { 195 | "id": 25, 196 | "stream_id": "CWHD", 197 | "tvguide_id": "9233011398", 198 | "name": "CW HD", 199 | "category": "Entertainment", 200 | "language": "en" 201 | }, 202 | { 203 | "id": 26, 204 | "stream_id": "CWNY", 205 | "tvguide_id": "9233011398", 206 | "name": "CW 11 New York", 207 | "category": "News", 208 | "language": "en" 209 | }, 210 | { 211 | "id": 27, 212 | "stream_id": "DA", 213 | "tvguide_id": "9200014472", 214 | "name": "Destination America", 215 | "category": "Lifestyle", 216 | "language": "en" 217 | }, 218 | { 219 | "id": 28, 220 | "stream_id": "Discovery", 221 | "tvguide_id": "9233001914", 222 | "name": "Discovery", 223 | "category": "Lifestyle", 224 | "language": "en" 225 | }, 226 | { 227 | "id": 29, 228 | "stream_id": "DiscoveryFamily", 229 | "tvguide_id": "9233015612", 230 | "name": "Discovery Family", 231 | "category": "Kids", 232 | "language": "en" 233 | }, 234 | { 235 | "id": 30, 236 | "stream_id": "Disney", 237 | "tvguide_id": "9200011893", 238 | "name": "Disney", 239 | "category": "Kids", 240 | "language": "en" 241 | }, 242 | { 243 | "id": 31, 244 | "stream_id": "DisneyJr", 245 | "tvguide_id": "9200016560", 246 | "name": "Disney Junior", 247 | "category": "Kids", 248 | "language": "en" 249 | }, 250 | { 251 | "id": 32, 252 | "stream_id": "DisneyXD", 253 | "tvguide_id": "9200004852", 254 | "name": "Disney XD", 255 | "category": "Kids", 256 | "language": "en" 257 | }, 258 | { 259 | "id": 33, 260 | "stream_id": "DIY", 261 | "tvguide_id": "9200000664", 262 | "name": "Magnolia Network (DIY)", 263 | "category": "Lifestyle", 264 | "language": "en" 265 | }, 266 | { 267 | "id": 34, 268 | "stream_id": "E", 269 | "tvguide_id": "9233003794", 270 | "name": "E!", 271 | "category": "Lifestyle", 272 | "language": "en" 273 | }, 274 | { 275 | "id": 35, 276 | "stream_id": "ESPN", 277 | "tvguide_id": "9233007996", 278 | "name": "ESPN", 279 | "category": "Sports", 280 | "language": "en" 281 | }, 282 | { 283 | "id": 36, 284 | "stream_id": "ESPNHD", 285 | "tvguide_id": "9233007996", 286 | "name": "ESPN HD", 287 | "category": "Sports", 288 | "language": "en" 289 | }, 290 | { 291 | "id": 37, 292 | "stream_id": "ESPN2", 293 | "tvguide_id": "9200016131", 294 | "name": "ESPN2", 295 | "category": "Sports", 296 | "language": "en" 297 | }, 298 | { 299 | "id": 38, 300 | "stream_id": "ESPNU", 301 | "tvguide_id": "9233011350", 302 | "name": "ESPNU", 303 | "category": "Sports", 304 | "language": "en" 305 | }, 306 | { 307 | "id": 39, 308 | "stream_id": "ESPNews", 309 | "tvguide_id": "9200006523", 310 | "name": "ESPNews", 311 | "category": "Sports", 312 | "language": "en" 313 | }, 314 | { 315 | "id": 40, 316 | "stream_id": "FoodNetwork", 317 | "tvguide_id": "9233005598", 318 | "name": "Food Network", 319 | "category": "Lifestyle", 320 | "language": "en" 321 | }, 322 | { 323 | "id": 41, 324 | "stream_id": "FOX", 325 | "tvguide_id": "9233002271", 326 | "name": "FOX", 327 | "category": "Entertainment", 328 | "language": "en" 329 | }, 330 | { 331 | "id": 42, 332 | "stream_id": "FOXHD", 333 | "tvguide_id": "9233002271", 334 | "name": "FOX HD", 335 | "category": "Entertainment", 336 | "language": "en" 337 | }, 338 | { 339 | "id": 43, 340 | "stream_id": "FOXNY", 341 | "tvguide_id": "9233003497", 342 | "name": "FOX 5 New York", 343 | "category": "Entertainment", 344 | "language": "en" 345 | }, 346 | { 347 | "id": 44, 348 | "stream_id": "FoxBusiness", 349 | "tvguide_id": "9200009124", 350 | "name": "Fox Business", 351 | "category": "Lifestyle", 352 | "language": "en" 353 | }, 354 | { 355 | "id": 45, 356 | "stream_id": "FoxNews", 357 | "tvguide_id": "9233006969", 358 | "name": "Fox News", 359 | "category": "News", 360 | "language": "en" 361 | }, 362 | { 363 | "id": 46, 364 | "stream_id": "Freeform", 365 | "tvguide_id": "9200000497", 366 | "name": "Freeform", 367 | "category": "Entertainment", 368 | "language": "en" 369 | }, 370 | { 371 | "id": 47, 372 | "stream_id": "FS1", 373 | "tvguide_id": "9233000539", 374 | "name": "Fox Sports 1 (FS1)", 375 | "category": "Sports", 376 | "language": "en" 377 | }, 378 | { 379 | "id": 48, 380 | "stream_id": "FS1HD", 381 | "tvguide_id": "9233000539", 382 | "name": "Fox Sports 1 HD", 383 | "category": "Sports", 384 | "language": "en" 385 | }, 386 | { 387 | "id": 49, 388 | "stream_id": "FS2", 389 | "tvguide_id": "9200009884", 390 | "name": "Fox Sports 2 (FS2)", 391 | "category": "Sports", 392 | "language": "en" 393 | }, 394 | { 395 | "id": 50, 396 | "stream_id": "FX", 397 | "tvguide_id": "9233006959", 398 | "name": "FX", 399 | "category": "Entertainment", 400 | "language": "en" 401 | }, 402 | { 403 | "id": 51, 404 | "stream_id": "FXMovie", 405 | "tvguide_id": "9233013967", 406 | "name": "FX Movie Channel", 407 | "category": "Entertainment", 408 | "language": "en" 409 | }, 410 | { 411 | "id": 52, 412 | "stream_id": "FXX", 413 | "tvguide_id": "9200014910", 414 | "name": "FXX", 415 | "category": "Entertainment", 416 | "language": "en" 417 | }, 418 | { 419 | "id": 53, 420 | "stream_id": "GOLF", 421 | "tvguide_id": "9200011865", 422 | "name": "Golf Channel", 423 | "category": "Sports", 424 | "language": "en" 425 | }, 426 | { 427 | "id": 54, 428 | "stream_id": "GSN", 429 | "tvguide_id": "9200019858", 430 | "name": "Game Show Network", 431 | "category": "Entertainment", 432 | "language": "en" 433 | }, 434 | { 435 | "id": 55, 436 | "stream_id": "Hallmark", 437 | "tvguide_id": "9200016034", 438 | "name": "Hallmark Channel", 439 | "category": "Entertainment", 440 | "language": "en" 441 | }, 442 | { 443 | "id": 56, 444 | "stream_id": "HBO", 445 | "tvguide_id": "9200004886", 446 | "name": "HBO", 447 | "category": "Premium", 448 | "language": "en" 449 | }, 450 | { 451 | "id": 57, 452 | "stream_id": "HBOHD", 453 | "tvguide_id": "9200004886", 454 | "name": "HBO HD", 455 | "category": "Premium", 456 | "language": "en" 457 | }, 458 | { 459 | "id": 58, 460 | "stream_id": "HGTV", 461 | "tvguide_id": "9200004467", 462 | "name": "Home & Garden TV", 463 | "category": "Lifestyle", 464 | "language": "en" 465 | }, 466 | { 467 | "id": 59, 468 | "stream_id": "History", 469 | "tvguide_id": "9233008002", 470 | "name": "History", 471 | "category": "Lifestyle", 472 | "language": "en" 473 | }, 474 | { 475 | "id": 60, 476 | "stream_id": "HLN", 477 | "tvguide_id": "9233005762", 478 | "name": "HLN", 479 | "category": "News", 480 | "language": "en" 481 | }, 482 | { 483 | "id": 61, 484 | "stream_id": "HMM", 485 | "tvguide_id": "9200020115", 486 | "name": "Hallmark Movies & Mysteries", 487 | "category": "Movies", 488 | "language": "en" 489 | }, 490 | { 491 | "id": 62, 492 | "stream_id": "ID", 493 | "tvguide_id": "9200002243", 494 | "name": "Investigation Discovery", 495 | "category": "Lifestyle", 496 | "language": "en" 497 | }, 498 | { 499 | "id": 63, 500 | "stream_id": "IONNY", 501 | "tvguide_id": "9233015369", 502 | "name": "ION (WPXN) New York", 503 | "category": "Entertainment", 504 | "language": "en" 505 | }, 506 | { 507 | "id": 64, 508 | "stream_id": "Lifetime", 509 | "tvguide_id": "9200000502", 510 | "name": "Lifetime", 511 | "category": "Lifestyle", 512 | "language": "en" 513 | }, 514 | { 515 | "id": 65, 516 | "stream_id": "LifetimeM", 517 | "tvguide_id": "9200000502", 518 | "name": "Lifetime Movie Network", 519 | "category": "Movies", 520 | "language": "en" 521 | }, 522 | { 523 | "id": 66, 524 | "stream_id": "MLB", 525 | "tvguide_id": "9200009223", 526 | "name": "MLB Network", 527 | "category": "Sports", 528 | "language": "en" 529 | }, 530 | { 531 | "id": 67, 532 | "stream_id": "MotorTrend", 533 | "tvguide_id": "9233003479", 534 | "name": "Motor Trend", 535 | "category": "Lifestyle", 536 | "language": "en" 537 | }, 538 | { 539 | "id": 68, 540 | "stream_id": "MSNBC", 541 | "tvguide_id": "9233006803", 542 | "name": "MSNBC", 543 | "category": "News", 544 | "language": "en" 545 | }, 546 | { 547 | "id": 69, 548 | "stream_id": "MTV", 549 | "tvguide_id": "9233015501", 550 | "name": "MTV", 551 | "category": "Entertainment", 552 | "language": "en" 553 | }, 554 | { 555 | "id": 70, 556 | "stream_id": "NatGEO", 557 | "tvguide_id": "9233009337", 558 | "name": "National Geographic", 559 | "category": "Lifestyle", 560 | "language": "en" 561 | }, 562 | { 563 | "id": 71, 564 | "stream_id": "NatGEOWild", 565 | "tvguide_id": "9200004683", 566 | "name": "National Geographic Wild", 567 | "category": "Lifestyle", 568 | "language": "en" 569 | }, 570 | { 571 | "id": 72, 572 | "stream_id": "NBA", 573 | "tvguide_id": "9200000070", 574 | "name": "NBA TV", 575 | "category": "Sports", 576 | "language": "en" 577 | }, 578 | { 579 | "id": 73, 580 | "stream_id": "NBC", 581 | "tvguide_id": "9233009876", 582 | "name": "NBC", 583 | "category": "News", 584 | "language": "en" 585 | }, 586 | { 587 | "id": 74, 588 | "stream_id": "NBCHD", 589 | "tvguide_id": "9233009876", 590 | "name": "NBC HD", 591 | "category": "News", 592 | "language": "en" 593 | }, 594 | { 595 | "id": 75, 596 | "stream_id": "NBCNY", 597 | "tvguide_id": "9200016000", 598 | "name": "NBC 4 New York", 599 | "category": "News", 600 | "language": "en" 601 | }, 602 | { 603 | "id": 76, 604 | "stream_id": "NBCSN", 605 | "tvguide_id": "9233000030", 606 | "name": "NBC Sports (NBCSN)", 607 | "category": "Sports", 608 | "language": "en" 609 | }, 610 | { 611 | "id": 77, 612 | "stream_id": "NFL", 613 | "tvguide_id": "9200004330", 614 | "name": "NFL Network", 615 | "category": "Sports", 616 | "language": "en" 617 | }, 618 | { 619 | "id": 78, 620 | "stream_id": "NFLHD", 621 | "tvguide_id": "9200004330", 622 | "name": "NFL HD", 623 | "category": "Sports", 624 | "language": "en" 625 | }, 626 | { 627 | "id": 79, 628 | "stream_id": "NFLRZ", 629 | "tvguide_id": "9233000241", 630 | "name": "NFL RedZone", 631 | "category": "Sports", 632 | "language": "en" 633 | }, 634 | { 635 | "id": 80, 636 | "stream_id": "NHLHD", 637 | "tvguide_id": "9200016261", 638 | "name": "NHL HD", 639 | "category": "Sports", 640 | "language": "en" 641 | }, 642 | { 643 | "id": 81, 644 | "stream_id": "Nickelodeon", 645 | "tvguide_id": "9233011497", 646 | "name": "Nickelodeon", 647 | "category": "Kids", 648 | "language": "en" 649 | }, 650 | { 651 | "id": 82, 652 | "stream_id": "Nicktoons", 653 | "tvguide_id": "9200020469", 654 | "name": "Nicktoons", 655 | "category": "Kids", 656 | "language": "en" 657 | }, 658 | { 659 | "id": 83, 660 | "stream_id": "NickJr", 661 | "tvguide_id": "9233007153", 662 | "name": "Nick Jr", 663 | "category": "Kids", 664 | "language": "en" 665 | }, 666 | { 667 | "id": 84, 668 | "stream_id": "OAN", 669 | "tvguide_id": "9200005058", 670 | "name": "One America News Network", 671 | "category": "News", 672 | "language": "en" 673 | }, 674 | { 675 | "id": 85, 676 | "stream_id": "OWN", 677 | "tvguide_id": "9200004740", 678 | "name": "Oprah Winfrey Network (OWN)", 679 | "category": "Lifestyle", 680 | "language": "en" 681 | }, 682 | { 683 | "id": 86, 684 | "stream_id": "OLY", 685 | "tvguide_id": "9233008939", 686 | "name": "Olympic Channel", 687 | "category": "Sports", 688 | "language": "en" 689 | }, 690 | { 691 | "id": 87, 692 | "stream_id": "Oxygen", 693 | "tvguide_id": "9200012145", 694 | "name": "Oxygen", 695 | "category": "Lifestyle", 696 | "language": "en" 697 | }, 698 | { 699 | "id": 88, 700 | "stream_id": "Paramount", 701 | "tvguide_id": "9233001931", 702 | "name": "Paramount Network", 703 | "category": "Entertainment", 704 | "language": "en" 705 | }, 706 | { 707 | "id": 89, 708 | "stream_id": "PBS", 709 | "tvguide_id": "9233004141", 710 | "name": "PBS", 711 | "category": "Lifestyle", 712 | "language": "en" 713 | }, 714 | { 715 | "id": 90, 716 | "stream_id": "POP", 717 | "tvguide_id": "9200018304", 718 | "name": "Pop", 719 | "category": "Entertainment", 720 | "language": "en" 721 | }, 722 | { 723 | "id": 91, 724 | "stream_id": "Reelz", 725 | "tvguide_id": "9200011769", 726 | "name": "Reelz", 727 | "category": "Entertainment", 728 | "language": "en" 729 | }, 730 | { 731 | "id": 92, 732 | "stream_id": "Science", 733 | "tvguide_id": "9200019847", 734 | "name": "Science", 735 | "category": "Lifestyle", 736 | "language": "en" 737 | }, 738 | { 739 | "id": 93, 740 | "stream_id": "SECN", 741 | "tvguide_id": "9233002484", 742 | "name": "SEC Network", 743 | "category": "Sports", 744 | "language": "en" 745 | }, 746 | { 747 | "id": 94, 748 | "stream_id": "Showtime", 749 | "tvguide_id": "9233011188", 750 | "name": "Showtime", 751 | "category": "Premium", 752 | "language": "en" 753 | }, 754 | { 755 | "id": 95, 756 | "stream_id": "StarZ", 757 | "tvguide_id": "9233013809", 758 | "name": "Starz", 759 | "category": "Premium", 760 | "language": "en" 761 | }, 762 | { 763 | "id": 96, 764 | "stream_id": "SundanceTV", 765 | "tvguide_id": "9233001687", 766 | "name": "Sundance TV", 767 | "category": "Lifestyle", 768 | "language": "en" 769 | }, 770 | { 771 | "id": 97, 772 | "stream_id": "SYFY", 773 | "tvguide_id": "9200004316", 774 | "name": "Syfy", 775 | "category": "Entertainment", 776 | "language": "en" 777 | }, 778 | { 779 | "id": 98, 780 | "stream_id": "TBS", 781 | "tvguide_id": "9233011348", 782 | "name": "TBS", 783 | "category": "Entertainment", 784 | "language": "en" 785 | }, 786 | { 787 | "id": 99, 788 | "stream_id": "TCM", 789 | "tvguide_id": "9200017928", 790 | "name": "Turner Classic Movies (TCM)", 791 | "category": "Movies", 792 | "language": "en" 793 | }, 794 | { 795 | "id": 100, 796 | "stream_id": "Telemundo", 797 | "tvguide_id": "9200011857", 798 | "name": "Telemundo", 799 | "category": "En Español", 800 | "language": "es" 801 | }, 802 | { 803 | "id": 101, 804 | "stream_id": "Tennis", 805 | "tvguide_id": "9200017917", 806 | "name": "Tennis Channel", 807 | "category": "Sports", 808 | "language": "en" 809 | }, 810 | { 811 | "id": 102, 812 | "stream_id": "TeenNick", 813 | "tvguide_id": "9200006974", 814 | "name": "TeenNick", 815 | "category": "Kids", 816 | "language": "en" 817 | }, 818 | { 819 | "id": 103, 820 | "stream_id": "TLC", 821 | "tvguide_id": "9200016249", 822 | "name": "The Learning Channel (TLC)", 823 | "category": "Lifestyle", 824 | "language": "en" 825 | }, 826 | { 827 | "id": 104, 828 | "stream_id": "TNT", 829 | "tvguide_id": "9233011830", 830 | "name": "Turner Network Television (TNT)", 831 | "category": "Entertainment", 832 | "language": "en" 833 | }, 834 | { 835 | "id": 105, 836 | "stream_id": "Travel", 837 | "tvguide_id": "9233000035", 838 | "name": "Travel Channel", 839 | "category": "Lifestyle", 840 | "language": "en" 841 | }, 842 | { 843 | "id": 106, 844 | "stream_id": "TruTV", 845 | "tvguide_id": "9233015561", 846 | "name": "truTV", 847 | "category": "Entertainment", 848 | "language": "en" 849 | }, 850 | { 851 | "id": 107, 852 | "stream_id": "TVLand", 853 | "tvguide_id": "9233005468", 854 | "name": "TV Land", 855 | "category": "Entertainment", 856 | "language": "en" 857 | }, 858 | { 859 | "id": 108, 860 | "stream_id": "TWC", 861 | "tvguide_id": "9200016258", 862 | "name": "The Weather Channel", 863 | "category": "Weather", 864 | "language": "en" 865 | }, 866 | { 867 | "id": 109, 868 | "stream_id": "Univision", 869 | "tvguide_id": "9200000867", 870 | "name": "Univisión Network", 871 | "category": "En Español", 872 | "language": "es" 873 | }, 874 | { 875 | "id": 110, 876 | "stream_id": "USANetwork", 877 | "tvguide_id": "9200009133", 878 | "name": "USA Network", 879 | "category": "Entertainment", 880 | "language": "en" 881 | }, 882 | { 883 | "id": 111, 884 | "stream_id": "VH1", 885 | "tvguide_id": "9233000037", 886 | "name": "VH1", 887 | "category": "Lifestyle", 888 | "language": "en" 889 | }, 890 | { 891 | "id": 112, 892 | "stream_id": "WETV", 893 | "tvguide_id": "9233003770", 894 | "name": "We TV", 895 | "category": "Lifestyle", 896 | "language": "en" 897 | }, 898 | { 899 | "id": 113, 900 | "stream_id": "WWE", 901 | "tvguide_id": "", 902 | "name": "WWE Network", 903 | "category": "Sports", 904 | "language": "en" 905 | }, 906 | { 907 | "id": 114, 908 | "stream_id": "YES", 909 | "tvguide_id": "9200004247", 910 | "name": "YES Network", 911 | "category": "Sports", 912 | "language": "en" 913 | } 914 | ] --------------------------------------------------------------------------------