Compare commits

..

No commits in common. "61b05a758782881b93f3f9111fce39f3d761dec8" and "1279c392894da87cfabd3d8cd517fa9024526618" have entirely different histories.

18 changed files with 114954 additions and 116083 deletions

File diff suppressed because it is too large Load diff

228604
M3U8/TV.xml

File diff suppressed because one or more lines are too long

View file

@ -7,7 +7,7 @@ http://mytvstream.net:8080/live/30550113/30550113/59056.m3u8
http://mytvstream.net:8080/live/30550113/30550113/120952.m3u8
#EXTINF:-1 tvg-chno="3" tvg-id="ACC.Network.us2" tvg-name="ACC Network" tvg-logo="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s111871_dark_360w_270h.png" group-title="TV",ACC Network
http://fl31.moveonjoy.com/ACC_NETWORK/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/9273.m3u8
#EXTINF:-1 tvg-chno="4" tvg-id="AdultSwim.com.Cartoon.Network.us2" tvg-name="Adult Swim" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16496_dark_360w_270h.png" group-title="TV",Adult Swim
https://turnerlive.warnermediacdn.com/hls/live/2023183/aseast/noslate/VIDEO_1_5128000.m3u8
@ -22,16 +22,16 @@ http://mytvstream.net:8080/live/30550113/30550113/18925.m3u8
http://23.237.104.106:8080/USA_ANIMAL_PLANET/index.m3u8
#EXTINF:-1 tvg-chno="8" tvg-id="ASPiRE.HD.us2" tvg-name="Aspire" tvg-logo="https://i.gyazo.com/0dec42cc5ef48c489cc10db906dc5b9b.png" group-title="TV",Aspire
http://fl31.moveonjoy.com/Aspire/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/21927.m3u8
#EXTINF:-1 tvg-chno="9" tvg-id="BBC.America.HD.us2" tvg-name="BBC America" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s64492_dark_360w_270h.png" group-title="TV",BBC America
http://fl31.moveonjoy.com/BBC_AMERICA/index.m3u8
http://mytvstream.net:8080/live/bn80NG/909467/20194.m3u8
#EXTINF:-1 tvg-chno="10" tvg-id="BBC.News.(North.America).HD.us2" tvg-name="BBC World News" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s89542_dark_360w_270h.png" group-title="TV",BBC World News
http://fl31.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8
http://mytvstream.net:8080/live/bn80NG/909467/139752.m3u8
#EXTINF:-1 tvg-chno="11" tvg-id="BET.HD.us2" tvg-name="BET" tvg-logo="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s10051_dark_360w_270h.png" group-title="TV",BET
http://mytvstream.net:8080/live/30550113/30550113/13702.m3u8
http://mytvstream.net:8080/live/30550113/30550113/46703.m3u8
#EXTINF:-1 tvg-chno="12" tvg-id="Big.Ten.Network.HD.us2" tvg-name="Big Ten Network" tvg-logo="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s56783_dark_360w_270h.png" group-title="TV",Big Ten Network
http://23.237.104.106:8080/USA_BTN/index.m3u8
@ -46,7 +46,7 @@ http://23.237.104.106:8080/USA_BOOMERANG/index.m3u8
http://23.237.104.106:8080/USA_BOUNCE/index.m3u8
#EXTINF:-1 tvg-chno="16" tvg-id="Bravo.HD.us2" tvg-name="Bravo TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s10057_dark_360w_270h.png" group-title="TV",Bravo TV
http://41.205.93.154/BRAVO/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/20859.m3u8
#EXTINF:-1 tvg-chno="17" tvg-id="BUZZR.Stream.us2" tvg-name="Buzzr" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s93430_dark_360w_270h.png" group-title="TV",Buzzr
https://buzzrota-web.amagi.tv/playlist.m3u8
@ -73,7 +73,7 @@ http://23.237.104.106:8080/USA_CBS_SPORTS/index.m3u8
http://23.237.104.106:8080/USA_CMT/index.m3u8
#EXTINF:-1 tvg-chno="25" tvg-id="CNBC.HD.us2" tvg-name="CNBC" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s10139_dark_360w_270h.png" group-title="TV",CNBC
http://41.205.93.154:80/CNBC/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/9815.m3u8
#EXTINF:-1 tvg-chno="26" tvg-id="CNN.HD.us2" tvg-name="CNN" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s58646_dark_360w_270h.png" group-title="TV",CNN
https://turnerlive.warnermediacdn.com/hls/live/586495/cnngo/cnn_slate/VIDEO_0_3564000.m3u8
@ -82,7 +82,7 @@ https://turnerlive.warnermediacdn.com/hls/live/586495/cnngo/cnn_slate/VIDEO_0_35
http://23.237.104.106:8080/USA_COMEDY_CENTRAL/index.m3u8
#EXTINF:-1 tvg-chno="28" tvg-id="Comedy.TV.HD.us2" tvg-name="Comedy TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s82470_dark_360w_270h.png" group-title="TV",Comedy TV
https://fl31.moveonjoy.com/Comedy_TV/index.m3u8
https://fl1.moveonjoy.com/Comedy_TV/index.m3u8
#EXTINF:-1 tvg-chno="29" tvg-id="Comet.us2" tvg-name="Comet TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s97051_dark_360w_270h.png" group-title="TV",Comet TV
https://fast-channels.sinclairstoryline.com/COMET/index.m3u8
@ -97,7 +97,7 @@ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01438-ewscrippscompan-courttv-tablo
http://mytvstream.net:8080/live/30550113/30550113/11868.m3u8
#EXTINF:-1 tvg-chno="33" tvg-id="Crime.and.Investigation.Network.HD.us2" tvg-name="Crime & Investigation Network" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s61469_dark_360w_270h.png" group-title="TV",Crime & Investigation Network
https://fl31.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/53689.m3u8
#EXTINF:-1 tvg-chno="34" tvg-id="WKCF-DT.us_locals1" tvg-name="CW" tvg-logo="https://i.gyazo.com/afd5b481b327d204087dfde6a7741f9d.png" group-title="TV",CW
http://mytvstream.net:8080/live/30550113/30550113/120893.m3u8
@ -106,16 +106,16 @@ http://mytvstream.net:8080/live/30550113/30550113/120893.m3u8
http://23.237.104.106:8080/USA_DISCOVERY/index.m3u8
#EXTINF:-1 tvg-chno="36" tvg-id="Discovery.Family.Channel.HD.us2" tvg-name="Discovery Family Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16618_dark_360w_270h.png" group-title="TV",Discovery Family Channel
http://fl31.moveonjoy.com/DISCOVERY_FAMILY_CHANNEL/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/10538.m3u8
#EXTINF:-1 tvg-chno="37" tvg-id="Discovery.Life.Channel.us2" tvg-name="Discovery Life" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16125_dark_360w_270h.png" group-title="TV",Discovery Life
https://fl31.moveonjoy.com/DISCOVERY_LIFE/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/9861.m3u8
#EXTINF:-1 tvg-chno="38" tvg-id="Science.Channel.HD.us2" tvg-name="Discovery Science" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s24282_dark_360w_270h.png" group-title="TV",Discovery Science
https://fl31.moveonjoy.com/Discovery_Science/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/20866.m3u8
#EXTINF:-1 tvg-chno="39" tvg-id="Disney.Channel.HD.us2" tvg-name="Disney" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s10171_dark_360w_270h.png" group-title="TV",Disney
https://fl31.moveonjoy.com/DISNEY/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/2206.m3u8
#EXTINF:-1 tvg-chno="40" tvg-id="Disney.XD.HD.us2" tvg-name="Disney XD" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s18279_dark_360w_270h.png" group-title="TV",Disney XD
http://23.237.104.106:8080/USA_DISNEY_XD/index.m3u8
@ -124,10 +124,10 @@ http://23.237.104.106:8080/USA_DISNEY_XD/index.m3u8
http://23.237.104.106:8080/USA_E/index.m3u8
#EXTINF:-1 tvg-chno="42" tvg-id="ESPN.HD.us2" tvg-name="ESPN" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s10179_dark_360w_270h.png" group-title="TV",ESPN
http://41.205.93.154/ESPN/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/14197.m3u8
#EXTINF:-1 tvg-chno="43" tvg-id="ESPNEWS.HD.us2" tvg-name="ESPN News" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16485_dark_360w_270h.png" group-title="TV",ESPN News
http://fl31.moveonjoy.com/ESPN_NEWS/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/11707.m3u8
#EXTINF:-1 tvg-chno="44" tvg-id="ESPNU.HD.us2" tvg-name="ESPN U" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s45654_dark_360w_270h.png" group-title="TV",ESPN U
http://23.237.104.106:8080/USA_ESPNU/index.m3u8
@ -181,7 +181,7 @@ http://23.237.104.106:8080/USA_FOOD_NETWORK/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/121595.m3u8
#EXTINF:-1 tvg-chno="61" tvg-id="Fox.Business.HD.us2" tvg-name="Fox Business" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s58649_dark_360w_270h.png" group-title="TV",Fox Business
https://fl31.moveonjoy.com/FOX_Business_Network/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/17639.m3u8
#EXTINF:-1 tvg-chno="62" tvg-id="Fox.News.Channel.HD.us2" tvg-name="Fox News" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16374_dark_360w_270h.png" group-title="TV",Fox News
http://mytvstream.net:8080/live/30550113/30550113/1818.m3u8
@ -208,19 +208,19 @@ http://mytvstream.net:8080/live/30550113/30550113/10260.m3u8
http://23.237.104.106:8080/USA_FXX/index.m3u8
#EXTINF:-1 tvg-chno="70" tvg-id="FYI.Channel.HD.us2" tvg-name="FYI TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16834_dark_360w_270h.png" group-title="TV",FYI TV
http://fl31.moveonjoy.com/FYI/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/9240.m3u8
#EXTINF:-1 tvg-chno="71" tvg-id="Game.Show.Network.HD.us2" tvg-name="Game Show Network" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s14909_dark_360w_270h.png" group-title="TV",Game Show Network
http://mytvstream.net:8080/live/30550113/30550113/120633.m3u8
#EXTINF:-1 tvg-chno="72" tvg-id="get.us2" tvg-name="getTV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s82563_dark_360w_270h.png" group-title="TV",getTV
http://fl31.moveonjoy.com/GET_TV/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/18366.m3u8
#EXTINF:-1 tvg-chno="73" tvg-id="Golf.Channel.HD.us2" tvg-name="Golf Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s14899_dark_360w_270h.png" group-title="TV",Golf Channel
https://fl31.moveonjoy.com/GOLF/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/46728.m3u8
#EXTINF:-1 tvg-chno="74" tvg-id="Grit.us2" tvg-name="Grit TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s89922_dark_360w_270h.png" group-title="TV",Grit TV
http://fl31.moveonjoy.com/GRIT_TV/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/20861.m3u8
#EXTINF:-1 tvg-chno="75" tvg-id="Hallmark.Channel.HD.us2" tvg-name="Hallmark Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s11221_dark_360w_270h.png" group-title="TV",Hallmark Channel
http://23.237.104.106:8080/USA_HALLMARK/index.m3u8
@ -238,10 +238,10 @@ http://23.237.104.106:8080/USA_HBO/index.m3u8
http://23.237.104.106:8080/USA_HBO2/index.m3u8
#EXTINF:-1 tvg-chno="80" tvg-id="HBO.Comedy.HD.us2" tvg-name="HBO Comedy" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s59839_dark_360w_270h.png" group-title="TV",HBO Comedy
http://fl31.moveonjoy.com/HBO_COMEDY/index.m3u8
http://23.237.104.106:8080/USA_HBO_COMEDY/index.m3u8
#EXTINF:-1 tvg-chno="81" tvg-id="HBO.Drama.us2" tvg-name="HBO Family" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s34879_dark_360w_270h.png" group-title="TV",HBO Family
https://fl31.moveonjoy.com/HBO_FAMILY/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/17772.m3u8
#EXTINF:-1 tvg-chno="82" tvg-id="HBO.Zone.HD.us2" tvg-name="HBO Zone" tvg-logo="https://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s18431_dark_360w_270h.png" group-title="TV",HBO Zone
http://23.237.104.106:8080/USA_HBO_ZONE/index.m3u8
@ -265,10 +265,10 @@ http://mytvstream.net:8080/live/30550113/30550113/46713.m3u8
http://23.237.104.106:8080/USA_LMN/index.m3u8
#EXTINF:-1 tvg-chno="89" tvg-id="Marquee.Sports.Network.HD.us2" tvg-name="Marquee Sports Network" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s113768_dark_360w_270h.png" group-title="TV",Marquee Sports Network
https://fl31.moveonjoy.com/MARQUEE_SPORTS_NETWORK/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/13379.m3u8
#EXTINF:-1 tvg-chno="90" tvg-id="MLB.Network.HD.us2" tvg-name="MLB Network" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s62081_dark_360w_270h.png" group-title="TV",MLB Network
https://fl31.moveonjoy.com/MLB_NETWORK/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/21360.m3u8
#EXTINF:-1 tvg-chno="91" tvg-id="MOTORTREND.HD.us2" tvg-name="MotorTrend TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s31046_dark_360w_270h.png" group-title="TV",MotorTrend TV
http://mytvstream.net:8080/live/30550113/30550113/10399.m3u8
@ -286,7 +286,7 @@ http://mytvstream.net:8080/live/30550113/30550113/9818.m3u8
http://23.237.104.106:8080/USA_NAT_GEO/index.m3u8
#EXTINF:-1 tvg-chno="96" tvg-id="NBA.TV.HD.us2" tvg-name="NBA TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s32281_dark_360w_270h.png" group-title="TV",NBA TV
http://fl31.moveonjoy.com/NBA_TV/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/20073.m3u8
#EXTINF:-1 tvg-chno="97" tvg-id="WFLA-DT.us_locals1" tvg-name="NBC" tvg-logo="https://i.gyazo.com/39d42952500205d04e448247b7889256.png" group-title="TV",NBC
http://mytvstream.net:8080/live/30550113/30550113/120950.m3u8
@ -310,7 +310,7 @@ http://mytvstream.net:8080/live/30550113/30550113/20943.m3u8
http://23.237.104.106:8080/USA_NESN/index.m3u8
#EXTINF:-1 tvg-chno="104" tvg-id="NewsNation.us2" tvg-name="NewsNation" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s91096_dark_360w_270h.png" group-title="TV",NewsNation
http://fl31.moveonjoy.com/NEWS_NATION/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/161450.m3u8
#EXTINF:-1 tvg-chno="105" tvg-id="NFL.Network.HD.us2" tvg-name="NFL Network" tvg-logo="https://raw.githubusercontent.com/tv-logo/tv-logos/refs/heads/main/countries/united-states/nfl-network-hz-us.png" group-title="TV",NFL Network
http://23.237.104.106:8080/USA_NFL_NETWORK/index.m3u8
@ -331,7 +331,7 @@ http://mytvstream.net:8080/live/30550113/30550113/36.m3u8
http://mytvstream.net:8080/live/30550113/30550113/9244.m3u8
#EXTINF:-1 tvg-chno="111" tvg-id="Ovation.HD.us2" tvg-name="Ovation" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s15807_dark_360w_270h.png" group-title="TV",Ovation
https://fl31.moveonjoy.com/Ovation/index.m3u8
https://fl1.moveonjoy.com/Ovation/index.m3u8
#EXTINF:-1 tvg-chno="112" tvg-id="Oxygen.True.Crime.HD.us2" tvg-name="Oxygen" tvg-logo="https://i.gyazo.com/68db5ec4dba40181592406e7c3128fc7.png" group-title="TV",Oxygen
http://mytvstream.net:8080/live/30550113/30550113/46695.m3u8
@ -340,7 +340,7 @@ http://mytvstream.net:8080/live/30550113/30550113/46695.m3u8
http://23.237.104.106:8080/USA_PARAMOUNT_NETWORK/index.m3u8
#EXTINF:-1 tvg-chno="114" tvg-id="POP.HD.us2" tvg-name="Pop TV" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16715_dark_360w_270h.png" group-title="TV",Pop TV
https://fl31.moveonjoy.com/Pop_TV/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/20976.m3u8
#EXTINF:-1 tvg-chno="115" tvg-id="Premier.Sports.1.HD.uk" tvg-name="Premier Sports 1" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s79027_dark_360w_270h.png" group-title="TV",Premier Sports 1
https://starshare.st/live/P4B9TB9xR8/humongous2tonight/5029.ts
@ -355,13 +355,13 @@ http://23.237.104.106:8080/USA_REELZ/index.m3u8
http://23.237.104.106:8080/USA_SEC_NETWORK/index.m3u8
#EXTINF:-1 tvg-chno="119" tvg-id="Paramount+.with.Showtime.HD.us2" tvg-name="Showtime" tvg-logo="https://raw.githubusercontent.com/tv-logo/tv-logos/refs/heads/main/countries/united-states/showtime-us.png" group-title="TV",Showtime
http://fl31.moveonjoy.com/SHOWTIME/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/46214.m3u8
#EXTINF:-1 tvg-chno="120" tvg-id="Smithsonian.HD.Network.us2" tvg-name="Smithsonian Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s58532_dark_360w_270h.png" group-title="TV",Smithsonian Channel
http://fl31.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/31150.m3u8
#EXTINF:-1 tvg-chno="121" tvg-id="Sony.Movie.Channel.HD.us2" tvg-name="Sony Movie Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s69130_dark_360w_270h.png" group-title="TV",Sony Movie Channel
http://fl31.moveonjoy.com/Sony_Movie_Channel/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/2214.m3u8
#EXTINF:-1 tvg-chno="122" tvg-id="Space.City.Home.Network.HD.us2" tvg-name="Space City Home Network" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s77744_dark_360w_270h.png" group-title="TV",Space City Home Network
http://mytvstream.net:8080/live/30550113/30550113/213668.m3u8
@ -400,7 +400,7 @@ http://23.237.104.106:8080/USA_SYFY/index.m3u8
https://turnerlive.warnermediacdn.com/hls/live/2023172/tbseast/slate/VIDEO_0_3564000.m3u8
#EXTINF:-1 tvg-chno="134" tvg-id="Tennis.Channel.HD.us2" tvg-name="Tennis Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s60316_dark_360w_270h.png" group-title="TV",Tennis Channel
https://fl31.moveonjoy.com/TENNIS_CHANNEL/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/20184.m3u8
#EXTINF:-1 tvg-chno="135" tvg-id="The.Weather.Channel.HD.us2" tvg-name="The Weather Channel" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s58812_dark_360w_270h.png" group-title="TV",The Weather Channel
http://mytvstream.net:8080/live/30550113/30550113/18926.m3u8
@ -424,7 +424,7 @@ http://mytvstream.net:8080/live/30550113/30550113/47442.m3u8
https://turnerlive.warnermediacdn.com/hls/live/2023186/tcmeast/noslate/VIDEO_1_5128000.m3u8
#EXTINF:-1 tvg-chno="142" tvg-id="TV.Land.HD.us2" tvg-name="TV Land" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s16123_dark_360w_270h.png" group-title="TV",TV Land
https://fl31.moveonjoy.com/TV_LAND/index.m3u8
http://mytvstream.net:8080/live/30550113/30550113/46696.m3u8
#EXTINF:-1 tvg-chno="143" tvg-id="TV.ONE.HD.us2" tvg-name="TV One" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s35513_dark_360w_270h.png" group-title="TV",TV One
http://mytvstream.net:8080/live/30550113/30550113/20868.m3u8

File diff suppressed because it is too large Load diff

View file

@ -21,7 +21,7 @@ from scrapers import (
streamhub,
streamsgate,
totalsportek,
tvapp,
tvpass,
watchfooty,
webcast,
xstreameast,
@ -65,12 +65,13 @@ async def main() -> None:
asyncio.create_task(embedhd.scrape(hdl_brwsr)),
asyncio.create_task(pixel.scrape(hdl_brwsr)),
asyncio.create_task(ppv.scrape(xtrnl_brwsr)),
asyncio.create_task(roxie.scrape(hdl_brwsr)),
asyncio.create_task(sport9.scrape(xtrnl_brwsr)),
asyncio.create_task(streamcenter.scrape(xtrnl_brwsr)),
# asyncio.create_task(streamhub.scrape(xtrnl_brwsr)),
asyncio.create_task(streamsgate.scrape(xtrnl_brwsr)),
asyncio.create_task(totalsportek.scrape(hdl_brwsr)),
asyncio.create_task(tvapp.scrape(hdl_brwsr)),
asyncio.create_task(tvpass.scrape(hdl_brwsr)),
# asyncio.create_task(webcast.scrape(hdl_brwsr)),
]
@ -78,7 +79,6 @@ async def main() -> None:
asyncio.create_task(fawa.scrape()),
asyncio.create_task(istreameast.scrape()),
asyncio.create_task(pawa.scrape()),
asyncio.create_task(roxie.scrape()),
asyncio.create_task(shark.scrape()),
asyncio.create_task(streambtw.scrape()),
asyncio.create_task(xstreameast.scrape()),
@ -114,7 +114,7 @@ async def main() -> None:
| streamhub.urls
| streamsgate.urls
| totalsportek.urls
| tvapp.urls
| tvpass.urls
| watchfooty.urls
| webcast.urls
| xstreameast.urls

View file

@ -1,5 +1,4 @@
from functools import partial
from urllib.parse import urljoin
from playwright.async_api import Browser
@ -15,7 +14,7 @@ CACHE_FILE = Cache(TAG, exp=10_800)
API_FILE = Cache(f"{TAG}-api", exp=19_800)
API_URL = "https://api.cdn-live.tv"
API_URL = "https://api.cdn-live.tv/api/v1/events/sports"
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
@ -27,7 +26,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
log.info("Refreshing API cache")
if r := await network.request(
urljoin(API_URL, "api/v1/events/sports"),
API_URL,
log=log,
params={"user": "cdnlivetv", "plan": "free"},
):

View file

@ -1,5 +1,4 @@
from functools import partial
from urllib.parse import urljoin
from playwright.async_api import Browser
@ -15,7 +14,7 @@ CACHE_FILE = Cache(TAG, exp=5_400)
API_CACHE = Cache(f"{TAG}-api", exp=28_800)
BASE_URL = "https://embedhd.org"
BASE_URL = "https://embedhd.org/api-event.php"
def fix_league(s: str) -> str:
@ -30,7 +29,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
api_data = {"timestamp": now.timestamp()}
if r := await network.request(urljoin(BASE_URL, "api-event.php"), log=log):
if r := await network.request(BASE_URL, log=log):
api_data: dict = r.json()
api_data["timestamp"] = now.timestamp()

View file

@ -102,7 +102,7 @@ async def scrape() -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.clean(Time.now())
now = Time.clean(Time.now()).timestamp()
for i, ev in enumerate(events, start=1):
handler = partial(
@ -133,7 +133,7 @@ async def scrape() -> None:
"url": url,
"logo": logo,
"base": BASE_URL,
"timestamp": now.timestamp(),
"timestamp": now,
"id": tvg_id or "Live.Event.us",
"href": ev["href"],
"link": link,

View file

@ -119,7 +119,7 @@ async def scrape() -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.clean(Time.now())
now = Time.clean(Time.now()).timestamp()
for i, ev in enumerate(events, start=1):
handler = partial(
@ -150,7 +150,7 @@ async def scrape() -> None:
"url": url,
"logo": logo,
"base": "https://gooz.aapmains.net",
"timestamp": now.timestamp(),
"timestamp": now,
"id": tvg_id or "Live.Event.us",
"link": link,
}

View file

@ -165,19 +165,19 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
XML_CACHE.write(events)
live = []
start_ts = now.delta(hours=-1).timestamp()
end_ts = now.delta(minutes=5).timestamp()
live = []
for k, v in events.items():
if k in cached_keys:
continue
if (
v["sport"] not in VALID_SPORTS
and v["league"] not in VALID_SPORTS
and v["event"].lower() != "olympic games"
if not (
v["sport"] in VALID_SPORTS
or v["league"] in VALID_SPORTS
or v["event"].lower() == "olympic games"
):
continue

View file

@ -15,7 +15,7 @@ TAG = "PAWA"
CACHE_FILE = Cache(TAG, exp=10_800)
BASE_URL = "https://pawastreams.net/feed"
BASE_URL = "https://pawastreams.net/feed/"
async def process_event(url: str, url_num: int) -> str | None:
@ -102,7 +102,7 @@ async def scrape() -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.clean(Time.now())
now = Time.clean(Time.now()).timestamp()
for i, ev in enumerate(events, start=1):
handler = partial(
@ -133,7 +133,7 @@ async def scrape() -> None:
"url": url,
"logo": logo,
"base": link,
"timestamp": now.timestamp(),
"timestamp": now,
"id": tvg_id or "Live.Event.us",
"link": link,
}

View file

@ -1,6 +1,5 @@
import json
from functools import partial
from urllib.parse import urljoin
from playwright.async_api import Browser, Page
@ -14,20 +13,20 @@ TAG = "PIXEL"
CACHE_FILE = Cache(TAG, exp=19_800)
BASE_URL = "https://pixelsport.tv"
BASE_URL = "https://pixelsport.tv/backend/livetv/events"
async def get_api_data(page: Page) -> dict[str, list[dict, str, str]]:
try:
await page.goto(
url := urljoin(BASE_URL, "backend/livetv/events"),
BASE_URL,
wait_until="domcontentloaded",
timeout=10_000,
)
raw_json = await page.locator("pre").inner_text(timeout=5_000)
except Exception as e:
log.error(f'Failed to fetch "{url}": {e}')
log.error(f'Failed to fetch "{BASE_URL}": {e}')
return {}
@ -66,7 +65,7 @@ async def get_events(page: Page) -> dict[str, dict[str, str | float]]:
events[key] = {
"url": stream_link,
"logo": logo,
"base": BASE_URL,
"base": "https://pixelsport.tv",
"timestamp": now.timestamp(),
"id": tvg_id or "Live.Event.us",
}

View file

@ -1,8 +1,8 @@
import asyncio
import re
from functools import partial
from urllib.parse import urljoin
from playwright.async_api import Browser
from selectolax.parser import HTMLParser
from .utils import Cache, Time, get_logger, leagues, network
@ -30,22 +30,6 @@ SPORT_ENDPOINTS = {
}
async def process_event(url: str, url_num: int) -> str | None:
if not (html_data := await network.request(url, log=log)):
return
valid_m3u8 = re.compile(r"'clappr',\s+'([^\"]*)'", re.IGNORECASE)
if not (match := valid_m3u8.search(html_data.text)):
log.info(f"URL {url_num}) No M3U8 found")
return
log.info(f"URL {url_num}) Captured M3U8")
return match[1]
async def refresh_html_cache(
url: str,
sport: str,
@ -115,8 +99,8 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
live = []
start_ts = now.delta(minutes=-30).timestamp()
end_ts = now.delta(minutes=30).timestamp()
start_ts = now.delta(hours=-1).timestamp()
end_ts = now.delta(minutes=5).timestamp()
for k, v in events.items():
if k in cached_keys:
@ -130,12 +114,14 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
return live
async def scrape() -> None:
async def scrape(browser: Browser) -> None:
cached_urls = CACHE_FILE.load()
cached_count = len(cached_urls)
valid_urls = {k: v for k, v in cached_urls.items() if v["url"]}
urls.update(cached_urls)
valid_count = cached_count = len(valid_urls)
urls.update(valid_urls)
log.info(f"Loaded {cached_count} event(s) from cache")
@ -146,44 +132,52 @@ async def scrape() -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
for i, ev in enumerate(events, start=1):
handler = partial(
process_event,
url=ev["link"],
url_num=i,
)
async with network.event_context(browser) as context:
for i, ev in enumerate(events, start=1):
async with network.event_page(context) as page:
handler = partial(
network.process_event,
url=ev["link"],
url_num=i,
page=page,
log=log,
)
url = await network.safe_process(
handler,
url_num=i,
semaphore=network.HTTP_S,
log=log,
)
url = await network.safe_process(
handler,
url_num=i,
semaphore=network.PW_S,
log=log,
)
if url:
sport, event, ts, link = (
ev["sport"],
ev["event"],
ev["event_ts"],
ev["link"],
)
sport, event, ts, link = (
ev["sport"],
ev["event"],
ev["event_ts"],
ev["link"],
)
tvg_id, logo = leagues.get_tvg_info(sport, event)
tvg_id, logo = leagues.get_tvg_info(sport, event)
key = f"[{sport}] {event} ({TAG})"
key = f"[{sport}] {event} ({TAG})"
entry = {
"url": url,
"logo": logo,
"base": BASE_URL,
"timestamp": ts,
"id": tvg_id or "Live.Event.us",
"link": link,
}
entry = {
"url": url,
"logo": logo,
"base": BASE_URL,
"timestamp": ts,
"id": tvg_id or "Live.Event.us",
"link": link,
}
urls[key] = cached_urls[key] = entry
cached_urls[key] = entry
if new_count := len(cached_urls) - cached_count:
if url:
valid_count += 1
urls[key] = entry
if new_count := valid_count - cached_count:
log.info(f"Collected and cached {new_count} new event(s)")
else:

View file

@ -15,7 +15,7 @@ TAG = "SPORT9"
CACHE_FILE = Cache(TAG, exp=5_400)
BASE_URL = "https://sport9.ru"
BASE_URL = "https://sport9.ru/"
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
@ -104,7 +104,7 @@ async def scrape(browser: Browser) -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.clean(Time.now())
now = Time.clean(Time.now()).timestamp()
async with network.event_context(browser, stealth=False) as context:
for i, ev in enumerate(events, start=1):
@ -139,7 +139,7 @@ async def scrape(browser: Browser) -> None:
"url": url,
"logo": logo,
"base": "https://vividmosaica.com/",
"timestamp": now.timestamp(),
"timestamp": now,
"id": tvg_id or "Live.Event.us",
"link": link,
}

View file

@ -17,7 +17,7 @@ CACHE_FILE = Cache(TAG, exp=10_800)
HTML_CACHE = Cache(f"{TAG}-html", exp=28_800)
MIRRORS = ["https://streamhub.pro", "https://livesports4u.net"]
BASE_URL = "https://streamhub.pro/"
CATEGORIES = {
"Soccer": "sport_68c02a4464a38",
@ -35,17 +35,15 @@ CATEGORIES = {
async def refresh_html_cache(
url: str,
date: str,
sport_id: str,
ts: float,
) -> dict[str, dict[str, str | float]]:
events = {}
if not (
html_data := await network.request(
urljoin(url, f"events/{date}"),
urljoin(BASE_URL, f"events/{date}"),
log=log,
params={"sport_id": sport_id},
)
@ -95,7 +93,7 @@ async def refresh_html_cache(
return events
async def get_events(url: str, cached_keys: list[str]) -> list[dict[str, str]]:
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
now = Time.clean(Time.now())
if not (events := HTML_CACHE.load()):
@ -103,7 +101,6 @@ async def get_events(url: str, cached_keys: list[str]) -> list[dict[str, str]]:
tasks = [
refresh_html_cache(
url,
date,
sport_id,
now.timestamp(),
@ -146,16 +143,9 @@ async def scrape(browser: Browser) -> None:
log.info(f"Loaded {cached_count} event(s) from cache")
if not (base_url := await network.get_base(MIRRORS)):
log.warning("No working PPV mirrors")
log.info(f'Scraping from "{BASE_URL}"')
CACHE_FILE.write(cached_urls)
return
log.info(f'Scraping from "{base_url}"')
events = await get_events(base_url, cached_urls.keys())
events = await get_events(cached_urls.keys())
log.info(f"Processing {len(events)} new URL(s)")

View file

@ -14,7 +14,7 @@ TAG = "TOTALSPRTK"
CACHE_FILE = Cache(TAG, exp=28_800)
BASE_URL = "https://live3.totalsportek777.com"
BASE_URL = "https://live3.totalsportek777.com/"
def fix_txt(s: str) -> str:

View file

@ -1,5 +1,5 @@
from functools import partial
from urllib.parse import urljoin, urlparse
from urllib.parse import urljoin
from playwright.async_api import Browser
from selectolax.parser import HTMLParser
@ -10,23 +10,19 @@ log = get_logger(__name__)
urls: dict[str, dict[str, str | float]] = {}
TAG = "TVAPP"
TAG = "TVPASS"
CACHE_FILE = Cache(TAG, exp=86_400)
CACHE_FILE = Cache(TAG, exp=10_800)
HTML_CACHE = Cache(f"{TAG}-html", exp=28_800)
BASE_URL = "https://thetvapp.to"
def fix_url(s: str) -> str:
parsed = urlparse(s)
async def refresh_html_cache(now_ts: float) -> dict[str, dict[str, str | float]]:
log.info("Refreshing HTML cache")
base = f"origin.{parsed.netloc.split('.', 1)[-1]}"
return urljoin(f"http://{base}", parsed.path.replace("tracks-v1a1/", ""))
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
events = []
events = {}
if not (html_data := await network.request(BASE_URL, log=log)):
return events
@ -43,25 +39,56 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
continue
for a in row.css("a.list-group-item[href]"):
event_name = a.text(strip=True).split(":", 1)[0]
if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue
if not (href := a.attributes.get("href")):
continue
events.append(
{
"sport": sport,
"event": event_name,
"link": urljoin(BASE_URL, href),
}
)
if not (span := a.css_first("span")):
continue
event_time = span.text(strip=True)
event_dt = Time.from_str(event_time, timezone="UTC")
event_name = a.text(strip=True).split(":")[0]
key = f"[{sport}] {event_name} ({TAG})"
events[key] = {
"sport": sport,
"event": event_name,
"link": urljoin(BASE_URL, href),
"event_ts": event_dt.timestamp(),
"timestamp": now_ts,
}
return events
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
now = Time.clean(Time.now())
if not (events := HTML_CACHE.load()):
events = await refresh_html_cache(now.timestamp())
HTML_CACHE.write(events)
live = []
start_ts = now.delta(minutes=-30).timestamp()
end_ts = now.delta(minutes=30).timestamp()
for k, v in events.items():
if k in cached_keys:
continue
if not start_ts <= v["event_ts"] <= end_ts:
continue
live.append({**v})
return live
async def scrape(browser: Browser) -> None:
cached_urls = CACHE_FILE.load()
@ -78,8 +105,6 @@ async def scrape(browser: Browser) -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.clean(Time.now())
async with network.event_context(browser) as context:
for i, ev in enumerate(events, start=1):
async with network.event_page(context) as page:
@ -99,9 +124,10 @@ async def scrape(browser: Browser) -> None:
)
if url:
sport, event, link = (
sport, event, ts, link = (
ev["sport"],
ev["event"],
ev["event_ts"],
ev["link"],
)
@ -110,10 +136,10 @@ async def scrape(browser: Browser) -> None:
tvg_id, logo = leagues.get_tvg_info(sport, event)
entry = {
"url": fix_url(url),
"url": url,
"logo": logo,
"base": BASE_URL,
"timestamp": now.timestamp(),
"timestamp": ts,
"id": tvg_id or "Live.Event.us",
"link": link,
}

View file

@ -1,11 +1,17 @@
## Base Log @ 2026-02-12 04:35 UTC
## Base Log @ 2026-02-11 04:40 UTC
### ✅ Working Streams: 144<br>❌ Dead Streams: 2
### ✅ Working Streams: 138<br>❌ Dead Streams: 8
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| C-SPAN | HTTP Error (403) | `http://mytvstream.net:8080/live/30550113/30550113/136589.m3u8` |
| Comedy TV | HTTP Error (000) | `https://fl1.moveonjoy.com/Comedy_TV/index.m3u8` |
| Crime & Investigation Network | HTTP Error (403) | `http://mytvstream.net:8080/live/30550113/30550113/53689.m3u8` |
| ESPN News | HTTP Error (000) | `http://mytvstream.net:8080/live/30550113/30550113/11707.m3u8` |
| ESPN2 | HTTP Error (000) | `http://mytvstream.net:8080/live/30550113/30550113/2210.m3u8` |
| Game Show Network | HTTP Error (403) | `http://mytvstream.net:8080/live/30550113/30550113/120633.m3u8` |
| Hallmark Mystery | HTTP Error (403) | `http://mytvstream.net:8080/live/30550113/30550113/10289.m3u8` |
| NFL RedZone | HTTP Error (000) | `http://mytvstream.net:8080/live/30550113/30550113/159118.m3u8` |
| Ovation | HTTP Error (000) | `https://fl1.moveonjoy.com/Ovation/index.m3u8` |
---
#### Base Channels URL
```