mirror of
https://github.com/doms9/iptv.git
synced 2026-03-07 11:18:25 +01:00
Compare commits
41 commits
1279c39289
...
61b05a7587
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61b05a7587 | ||
|
|
00000d947c | ||
|
|
3d5b650833 | ||
|
|
2c00acbfa5 | ||
|
|
c2d7c04929 | ||
|
|
00000d9bb4 | ||
|
|
00000d9247 | ||
|
|
2ad26ef050 | ||
|
|
8b33d14577 | ||
|
|
770fc6b8a9 | ||
|
|
6db866752c | ||
|
|
96cc3fa599 | ||
|
|
fc4f57a62b | ||
|
|
00000d9a6c | ||
|
|
2e528dd8b2 | ||
|
|
70b0364fdd | ||
|
|
91fe86c8d5 | ||
|
|
9bbaa2db45 | ||
|
|
394635faa5 | ||
|
|
ec2c92e79a | ||
|
|
80f52bac9f | ||
|
|
a80d688739 | ||
|
|
3c8e2d3cd4 | ||
|
|
d760362607 | ||
|
|
dd3605af1c | ||
|
|
cceb03edff | ||
|
|
021b2be5c1 | ||
|
|
664a357a70 | ||
|
|
00000d9b17 | ||
|
|
edf6618aa8 | ||
|
|
d11368a259 | ||
|
|
0931c7d882 | ||
|
|
97a4b17af2 | ||
|
|
cfab61bec8 | ||
|
|
e5552d6c6f | ||
|
|
e913d2b24e | ||
|
|
a7e38e8cd8 | ||
|
|
03a66c7ff9 | ||
|
|
e9feaaedb6 | ||
|
|
e0dbf4eb11 | ||
|
|
49c35e7b28 |
18 changed files with 116228 additions and 115099 deletions
1026
M3U8/TV.m3u8
1026
M3U8/TV.m3u8
File diff suppressed because it is too large
Load diff
228998
M3U8/TV.xml
228998
M3U8/TV.xml
File diff suppressed because one or more lines are too long
|
|
@ -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://mytvstream.net:8080/live/30550113/30550113/9273.m3u8
|
||||
http://fl31.moveonjoy.com/ACC_NETWORK/index.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://mytvstream.net:8080/live/30550113/30550113/21927.m3u8
|
||||
http://fl31.moveonjoy.com/Aspire/index.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://mytvstream.net:8080/live/bn80NG/909467/20194.m3u8
|
||||
http://fl31.moveonjoy.com/BBC_AMERICA/index.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://mytvstream.net:8080/live/bn80NG/909467/139752.m3u8
|
||||
http://fl31.moveonjoy.com/BBC_WORLD_NEWS/index.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/46703.m3u8
|
||||
http://mytvstream.net:8080/live/30550113/30550113/13702.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://mytvstream.net:8080/live/30550113/30550113/20859.m3u8
|
||||
http://41.205.93.154/BRAVO/index.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://mytvstream.net:8080/live/30550113/30550113/9815.m3u8
|
||||
http://41.205.93.154:80/CNBC/index.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://fl1.moveonjoy.com/Comedy_TV/index.m3u8
|
||||
https://fl31.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/53689.m3u8
|
||||
https://fl31.moveonjoy.com/Crime_and_Investigation_Network/index.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://mytvstream.net:8080/live/30550113/30550113/10538.m3u8
|
||||
http://fl31.moveonjoy.com/DISCOVERY_FAMILY_CHANNEL/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/9861.m3u8
|
||||
https://fl31.moveonjoy.com/DISCOVERY_LIFE/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/20866.m3u8
|
||||
https://fl31.moveonjoy.com/Discovery_Science/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/2206.m3u8
|
||||
https://fl31.moveonjoy.com/DISNEY/index.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://mytvstream.net:8080/live/30550113/30550113/14197.m3u8
|
||||
http://41.205.93.154/ESPN/index.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://mytvstream.net:8080/live/30550113/30550113/11707.m3u8
|
||||
http://fl31.moveonjoy.com/ESPN_NEWS/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/17639.m3u8
|
||||
https://fl31.moveonjoy.com/FOX_Business_Network/index.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://mytvstream.net:8080/live/30550113/30550113/9240.m3u8
|
||||
http://fl31.moveonjoy.com/FYI/index.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://mytvstream.net:8080/live/30550113/30550113/18366.m3u8
|
||||
http://fl31.moveonjoy.com/GET_TV/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/46728.m3u8
|
||||
https://fl31.moveonjoy.com/GOLF/index.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://mytvstream.net:8080/live/30550113/30550113/20861.m3u8
|
||||
http://fl31.moveonjoy.com/GRIT_TV/index.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://23.237.104.106:8080/USA_HBO_COMEDY/index.m3u8
|
||||
http://fl31.moveonjoy.com/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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/17772.m3u8
|
||||
https://fl31.moveonjoy.com/HBO_FAMILY/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/13379.m3u8
|
||||
https://fl31.moveonjoy.com/MARQUEE_SPORTS_NETWORK/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/21360.m3u8
|
||||
https://fl31.moveonjoy.com/MLB_NETWORK/index.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://mytvstream.net:8080/live/30550113/30550113/20073.m3u8
|
||||
http://fl31.moveonjoy.com/NBA_TV/index.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://mytvstream.net:8080/live/30550113/30550113/161450.m3u8
|
||||
http://fl31.moveonjoy.com/NEWS_NATION/index.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://fl1.moveonjoy.com/Ovation/index.m3u8
|
||||
https://fl31.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/20976.m3u8
|
||||
https://fl31.moveonjoy.com/Pop_TV/index.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://mytvstream.net:8080/live/30550113/30550113/46214.m3u8
|
||||
http://fl31.moveonjoy.com/SHOWTIME/index.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://mytvstream.net:8080/live/30550113/30550113/31150.m3u8
|
||||
http://fl31.moveonjoy.com/SMITHSONIAN_CHANNEL/index.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://mytvstream.net:8080/live/30550113/30550113/2214.m3u8
|
||||
http://fl31.moveonjoy.com/Sony_Movie_Channel/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/20184.m3u8
|
||||
https://fl31.moveonjoy.com/TENNIS_CHANNEL/index.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
|
||||
http://mytvstream.net:8080/live/30550113/30550113/46696.m3u8
|
||||
https://fl31.moveonjoy.com/TV_LAND/index.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
|
||||
|
|
|
|||
960
M3U8/events.m3u8
960
M3U8/events.m3u8
File diff suppressed because it is too large
Load diff
|
|
@ -21,7 +21,7 @@ from scrapers import (
|
|||
streamhub,
|
||||
streamsgate,
|
||||
totalsportek,
|
||||
tvpass,
|
||||
tvapp,
|
||||
watchfooty,
|
||||
webcast,
|
||||
xstreameast,
|
||||
|
|
@ -65,13 +65,12 @@ 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(tvpass.scrape(hdl_brwsr)),
|
||||
asyncio.create_task(tvapp.scrape(hdl_brwsr)),
|
||||
# asyncio.create_task(webcast.scrape(hdl_brwsr)),
|
||||
]
|
||||
|
||||
|
|
@ -79,6 +78,7 @@ 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
|
||||
| tvpass.urls
|
||||
| tvapp.urls
|
||||
| watchfooty.urls
|
||||
| webcast.urls
|
||||
| xstreameast.urls
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
from functools import partial
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from playwright.async_api import Browser
|
||||
|
||||
|
|
@ -14,7 +15,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/v1/events/sports"
|
||||
API_URL = "https://api.cdn-live.tv"
|
||||
|
||||
|
||||
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
||||
|
|
@ -26,7 +27,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
log.info("Refreshing API cache")
|
||||
|
||||
if r := await network.request(
|
||||
API_URL,
|
||||
urljoin(API_URL, "api/v1/events/sports"),
|
||||
log=log,
|
||||
params={"user": "cdnlivetv", "plan": "free"},
|
||||
):
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
from functools import partial
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from playwright.async_api import Browser
|
||||
|
||||
|
|
@ -14,7 +15,7 @@ CACHE_FILE = Cache(TAG, exp=5_400)
|
|||
|
||||
API_CACHE = Cache(f"{TAG}-api", exp=28_800)
|
||||
|
||||
BASE_URL = "https://embedhd.org/api-event.php"
|
||||
BASE_URL = "https://embedhd.org"
|
||||
|
||||
|
||||
def fix_league(s: str) -> str:
|
||||
|
|
@ -29,7 +30,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
|
||||
api_data = {"timestamp": now.timestamp()}
|
||||
|
||||
if r := await network.request(BASE_URL, log=log):
|
||||
if r := await network.request(urljoin(BASE_URL, "api-event.php"), log=log):
|
||||
api_data: dict = r.json()
|
||||
|
||||
api_data["timestamp"] = now.timestamp()
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ async def scrape() -> None:
|
|||
log.info(f"Processing {len(events)} new URL(s)")
|
||||
|
||||
if events:
|
||||
now = Time.clean(Time.now()).timestamp()
|
||||
now = Time.clean(Time.now())
|
||||
|
||||
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": now.timestamp(),
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"href": ev["href"],
|
||||
"link": link,
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ async def scrape() -> None:
|
|||
log.info(f"Processing {len(events)} new URL(s)")
|
||||
|
||||
if events:
|
||||
now = Time.clean(Time.now()).timestamp()
|
||||
now = Time.clean(Time.now())
|
||||
|
||||
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": now.timestamp(),
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"link": link,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 not (
|
||||
v["sport"] in VALID_SPORTS
|
||||
or v["league"] in VALID_SPORTS
|
||||
or v["event"].lower() == "olympic games"
|
||||
if (
|
||||
v["sport"] not in VALID_SPORTS
|
||||
and v["league"] not in VALID_SPORTS
|
||||
and v["event"].lower() != "olympic games"
|
||||
):
|
||||
continue
|
||||
|
||||
|
|
|
|||
|
|
@ -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()).timestamp()
|
||||
now = Time.clean(Time.now())
|
||||
|
||||
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": now.timestamp(),
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"link": link,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import json
|
||||
from functools import partial
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from playwright.async_api import Browser, Page
|
||||
|
||||
|
|
@ -13,20 +14,20 @@ TAG = "PIXEL"
|
|||
|
||||
CACHE_FILE = Cache(TAG, exp=19_800)
|
||||
|
||||
BASE_URL = "https://pixelsport.tv/backend/livetv/events"
|
||||
BASE_URL = "https://pixelsport.tv"
|
||||
|
||||
|
||||
async def get_api_data(page: Page) -> dict[str, list[dict, str, str]]:
|
||||
try:
|
||||
await page.goto(
|
||||
BASE_URL,
|
||||
url := urljoin(BASE_URL, "backend/livetv/events"),
|
||||
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 "{BASE_URL}": {e}')
|
||||
log.error(f'Failed to fetch "{url}": {e}')
|
||||
|
||||
return {}
|
||||
|
||||
|
|
@ -65,7 +66,7 @@ async def get_events(page: Page) -> dict[str, dict[str, str | float]]:
|
|||
events[key] = {
|
||||
"url": stream_link,
|
||||
"logo": logo,
|
||||
"base": "https://pixelsport.tv",
|
||||
"base": BASE_URL,
|
||||
"timestamp": now.timestamp(),
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,6 +30,22 @@ 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,
|
||||
|
|
@ -99,8 +115,8 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
|
||||
live = []
|
||||
|
||||
start_ts = now.delta(hours=-1).timestamp()
|
||||
end_ts = now.delta(minutes=5).timestamp()
|
||||
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:
|
||||
|
|
@ -114,14 +130,12 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
return live
|
||||
|
||||
|
||||
async def scrape(browser: Browser) -> None:
|
||||
async def scrape() -> None:
|
||||
cached_urls = CACHE_FILE.load()
|
||||
|
||||
valid_urls = {k: v for k, v in cached_urls.items() if v["url"]}
|
||||
cached_count = len(cached_urls)
|
||||
|
||||
valid_count = cached_count = len(valid_urls)
|
||||
|
||||
urls.update(valid_urls)
|
||||
urls.update(cached_urls)
|
||||
|
||||
log.info(f"Loaded {cached_count} event(s) from cache")
|
||||
|
||||
|
|
@ -132,52 +146,44 @@ async def scrape(browser: Browser) -> None:
|
|||
log.info(f"Processing {len(events)} new URL(s)")
|
||||
|
||||
if events:
|
||||
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,
|
||||
)
|
||||
for i, ev in enumerate(events, start=1):
|
||||
handler = partial(
|
||||
process_event,
|
||||
url=ev["link"],
|
||||
url_num=i,
|
||||
)
|
||||
|
||||
url = await network.safe_process(
|
||||
handler,
|
||||
url_num=i,
|
||||
semaphore=network.PW_S,
|
||||
log=log,
|
||||
)
|
||||
url = await network.safe_process(
|
||||
handler,
|
||||
url_num=i,
|
||||
semaphore=network.HTTP_S,
|
||||
log=log,
|
||||
)
|
||||
|
||||
sport, event, ts, link = (
|
||||
ev["sport"],
|
||||
ev["event"],
|
||||
ev["event_ts"],
|
||||
ev["link"],
|
||||
)
|
||||
if url:
|
||||
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,
|
||||
}
|
||||
|
||||
cached_urls[key] = entry
|
||||
urls[key] = cached_urls[key] = entry
|
||||
|
||||
if url:
|
||||
valid_count += 1
|
||||
|
||||
urls[key] = entry
|
||||
|
||||
if new_count := valid_count - cached_count:
|
||||
if new_count := len(cached_urls) - cached_count:
|
||||
log.info(f"Collected and cached {new_count} new event(s)")
|
||||
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -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()).timestamp()
|
||||
now = Time.clean(Time.now())
|
||||
|
||||
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": now.timestamp(),
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"link": link,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ CACHE_FILE = Cache(TAG, exp=10_800)
|
|||
|
||||
HTML_CACHE = Cache(f"{TAG}-html", exp=28_800)
|
||||
|
||||
BASE_URL = "https://streamhub.pro/"
|
||||
MIRRORS = ["https://streamhub.pro", "https://livesports4u.net"]
|
||||
|
||||
CATEGORIES = {
|
||||
"Soccer": "sport_68c02a4464a38",
|
||||
|
|
@ -35,15 +35,17 @@ 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(BASE_URL, f"events/{date}"),
|
||||
urljoin(url, f"events/{date}"),
|
||||
log=log,
|
||||
params={"sport_id": sport_id},
|
||||
)
|
||||
|
|
@ -93,7 +95,7 @@ async def refresh_html_cache(
|
|||
return events
|
||||
|
||||
|
||||
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
||||
async def get_events(url: str, cached_keys: list[str]) -> list[dict[str, str]]:
|
||||
now = Time.clean(Time.now())
|
||||
|
||||
if not (events := HTML_CACHE.load()):
|
||||
|
|
@ -101,6 +103,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
|
||||
tasks = [
|
||||
refresh_html_cache(
|
||||
url,
|
||||
date,
|
||||
sport_id,
|
||||
now.timestamp(),
|
||||
|
|
@ -143,9 +146,16 @@ async def scrape(browser: Browser) -> None:
|
|||
|
||||
log.info(f"Loaded {cached_count} event(s) from cache")
|
||||
|
||||
log.info(f'Scraping from "{BASE_URL}"')
|
||||
if not (base_url := await network.get_base(MIRRORS)):
|
||||
log.warning("No working PPV mirrors")
|
||||
|
||||
events = await get_events(cached_urls.keys())
|
||||
CACHE_FILE.write(cached_urls)
|
||||
|
||||
return
|
||||
|
||||
log.info(f'Scraping from "{base_url}"')
|
||||
|
||||
events = await get_events(base_url, cached_urls.keys())
|
||||
|
||||
log.info(f"Processing {len(events)} new URL(s)")
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
from functools import partial
|
||||
from urllib.parse import urljoin
|
||||
from urllib.parse import urljoin, urlparse
|
||||
|
||||
from playwright.async_api import Browser
|
||||
from selectolax.parser import HTMLParser
|
||||
|
|
@ -10,19 +10,23 @@ log = get_logger(__name__)
|
|||
|
||||
urls: dict[str, dict[str, str | float]] = {}
|
||||
|
||||
TAG = "TVPASS"
|
||||
TAG = "TVAPP"
|
||||
|
||||
CACHE_FILE = Cache(TAG, exp=10_800)
|
||||
|
||||
HTML_CACHE = Cache(f"{TAG}-html", exp=28_800)
|
||||
CACHE_FILE = Cache(TAG, exp=86_400)
|
||||
|
||||
BASE_URL = "https://thetvapp.to"
|
||||
|
||||
|
||||
async def refresh_html_cache(now_ts: float) -> dict[str, dict[str, str | float]]:
|
||||
log.info("Refreshing HTML cache")
|
||||
def fix_url(s: str) -> str:
|
||||
parsed = urlparse(s)
|
||||
|
||||
events = {}
|
||||
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 = []
|
||||
|
||||
if not (html_data := await network.request(BASE_URL, log=log)):
|
||||
return events
|
||||
|
|
@ -39,56 +43,25 @@ async def refresh_html_cache(now_ts: float) -> dict[str, dict[str, str | float]]
|
|||
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
|
||||
|
||||
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,
|
||||
}
|
||||
events.append(
|
||||
{
|
||||
"sport": sport,
|
||||
"event": event_name,
|
||||
"link": urljoin(BASE_URL, href),
|
||||
}
|
||||
)
|
||||
|
||||
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()
|
||||
|
||||
|
|
@ -105,6 +78,8 @@ 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:
|
||||
|
|
@ -124,10 +99,9 @@ async def scrape(browser: Browser) -> None:
|
|||
)
|
||||
|
||||
if url:
|
||||
sport, event, ts, link = (
|
||||
sport, event, link = (
|
||||
ev["sport"],
|
||||
ev["event"],
|
||||
ev["event_ts"],
|
||||
ev["link"],
|
||||
)
|
||||
|
||||
|
|
@ -136,10 +110,10 @@ async def scrape(browser: Browser) -> None:
|
|||
tvg_id, logo = leagues.get_tvg_info(sport, event)
|
||||
|
||||
entry = {
|
||||
"url": url,
|
||||
"url": fix_url(url),
|
||||
"logo": logo,
|
||||
"base": BASE_URL,
|
||||
"timestamp": ts,
|
||||
"timestamp": now.timestamp(),
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"link": link,
|
||||
}
|
||||
12
readme.md
12
readme.md
|
|
@ -1,17 +1,11 @@
|
|||
## Base Log @ 2026-02-11 04:40 UTC
|
||||
## Base Log @ 2026-02-12 04:35 UTC
|
||||
|
||||
### ✅ Working Streams: 138<br>❌ Dead Streams: 8
|
||||
### ✅ Working Streams: 144<br>❌ Dead Streams: 2
|
||||
|
||||
| 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` |
|
||||
| Ovation | HTTP Error (000) | `https://fl1.moveonjoy.com/Ovation/index.m3u8` |
|
||||
| NFL RedZone | HTTP Error (000) | `http://mytvstream.net:8080/live/30550113/30550113/159118.m3u8` |
|
||||
---
|
||||
#### Base Channels URL
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue