e
This commit is contained in:
parent
c2aa25a654
commit
00000d934a
12 changed files with 231 additions and 68 deletions
|
|
@ -3,7 +3,7 @@ import asyncio
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
from scrapers import livetvsx, ppv, streameast, tvpass
|
from scrapers import fstv, livetvsx, ppv, streambtw, streameast, tvpass
|
||||||
from scrapers.utils import UA, get_logger
|
from scrapers.utils import UA, get_logger
|
||||||
|
|
||||||
log = get_logger(__name__)
|
log = get_logger(__name__)
|
||||||
|
|
@ -36,8 +36,10 @@ async def vanilla_fetch() -> tuple[list[str], int]:
|
||||||
|
|
||||||
async def main() -> None:
|
async def main() -> None:
|
||||||
tasks = [
|
tasks = [
|
||||||
|
asyncio.create_task(fstv.main(CLIENT)),
|
||||||
asyncio.create_task(livetvsx.main(CLIENT)),
|
asyncio.create_task(livetvsx.main(CLIENT)),
|
||||||
asyncio.create_task(ppv.main(CLIENT)),
|
asyncio.create_task(ppv.main(CLIENT)),
|
||||||
|
asyncio.create_task(streambtw.main(CLIENT)),
|
||||||
asyncio.create_task(streameast.main(CLIENT)),
|
asyncio.create_task(streameast.main(CLIENT)),
|
||||||
asyncio.create_task(tvpass.main(CLIENT)),
|
asyncio.create_task(tvpass.main(CLIENT)),
|
||||||
vanilla_fetch(),
|
vanilla_fetch(),
|
||||||
|
|
@ -47,25 +49,40 @@ async def main() -> None:
|
||||||
|
|
||||||
base_m3u8, tvg_chno = results[-1]
|
base_m3u8, tvg_chno = results[-1]
|
||||||
|
|
||||||
additions = livetvsx.urls | ppv.urls | streameast.urls | tvpass.urls
|
additions = (
|
||||||
|
fstv.urls
|
||||||
lines = [
|
| livetvsx.urls
|
||||||
f'#EXTINF:-1 tvg-chno="{chnl_num}" tvg-id="(N/A)" tvg-name="{event}" tvg-logo="{info["logo"]}" group-title="Live Events",{event}\n{info["url"]}'
|
| ppv.urls
|
||||||
for chnl_num, (event, info) in enumerate(
|
| streambtw.urls
|
||||||
sorted(additions.items()),
|
| streameast.urls
|
||||||
start=tvg_chno + 1,
|
| tvpass.urls
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
M3U8_FILE.write_text(
|
|
||||||
'#EXTM3U url-tvg="https://raw.githubusercontent.com/doms9/iptv/refs/heads/default/EPG/TV.xml"\n'
|
|
||||||
+ "\n".join(base_m3u8)
|
|
||||||
+ "\n"
|
|
||||||
+ "\n".join(lines)
|
|
||||||
+ "\n",
|
|
||||||
encoding="utf-8",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
live_events = []
|
||||||
|
|
||||||
|
for chnl_num, (event, info) in enumerate(
|
||||||
|
sorted(additions.items()),
|
||||||
|
start=tvg_chno + 1,
|
||||||
|
):
|
||||||
|
live_events.extend(
|
||||||
|
(
|
||||||
|
f'#EXTINF:-1 tvg-chno="{chnl_num}" tvg-id="(N/A)" tvg-name="{event}" tvg-logo="{info["logo"]}" group-title="Live Events",{event}',
|
||||||
|
f'#EXTVLCOPT:http-referrer={info["base"]}',
|
||||||
|
f'#EXTVLCOPT:http-origin={info["base"]}',
|
||||||
|
info["url"],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
m3u8_content = "\n".join(
|
||||||
|
[
|
||||||
|
'#EXTM3U url-tvg="https://raw.githubusercontent.com/doms9/iptv/refs/heads/default/EPG/TV.xml"'
|
||||||
|
]
|
||||||
|
+ base_m3u8
|
||||||
|
+ live_events
|
||||||
|
)
|
||||||
|
|
||||||
|
M3U8_FILE.write_text(m3u8_content, encoding="utf-8")
|
||||||
|
|
||||||
log.info(f"M3U8 saved to {M3U8_FILE.name}")
|
log.info(f"M3U8 saved to {M3U8_FILE.name}")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,126 +2,151 @@
|
||||||
"[Football: USA MLS Next Pro] St. Louis City 2 - Minnesota United II": {
|
"[Football: USA MLS Next Pro] St. Louis City 2 - Minnesota United II": {
|
||||||
"url": "https://ddt2.dbcast.live/5Be237bdjS9FWNQwHcCsdg/1757750718/3230392e362e3137392e313937/ff429/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/5Be237bdjS9FWNQwHcCsdg/1757750718/3230392e362e3137392e313937/ff429/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Ecuador Serie A] Libertad - LDU Quito": {
|
"[Football: Ecuador Serie A] Libertad - LDU Quito": {
|
||||||
"url": "https://ddt2.dbcast.live/pSL4febu-wntL1ioWtTOSw/1757750737/3230392e362e3137392e313937/ff427/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/pSL4febu-wntL1ioWtTOSw/1757750737/3230392e362e3137392e313937/ff427/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Mexico Women Liga MX] Toluca (W) - Monterrey (W)": {
|
"[Football: Mexico Women Liga MX] Toluca (W) - Monterrey (W)": {
|
||||||
"url": "https://ddt2.dbcast.live/fISUs4UFoUpseEFP2g0BGQ/1757750756/3230392e362e3137392e313937/ff428/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/fISUs4UFoUpseEFP2g0BGQ/1757750756/3230392e362e3137392e313937/ff428/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Combat Sport: Wrestling] WWE Smackdown": {
|
"[Combat Sport: Wrestling] WWE Smackdown": {
|
||||||
"url": "https://ddt2.dbcast.live/16kXWMV2o1G9PDOzuzy9zw/1757750786/3230392e362e3137392e313937/ff423/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/16kXWMV2o1G9PDOzuzy9zw/1757750786/3230392e362e3137392e313937/ff423/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Bolivia Primera Division] Bolivar - Guabira": {
|
"[Football: Bolivia Primera Division] Bolivar - Guabira": {
|
||||||
"url": "https://ddt1.dbcast.live/BXT1oEzK_d--tnM8M1Jlww/1757750795/3230392e362e3137392e313937/ff426/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/BXT1oEzK_d--tnM8M1Jlww/1757750795/3230392e362e3137392e313937/ff426/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Baseball: MLB] Minnesota - Arizona": {
|
"[Baseball: MLB] Minnesota - Arizona": {
|
||||||
"url": "https://ddt1.dbcast.live/uXCcBCLFE048Gzc7_2eeow/1757750806/3230392e362e3137392e313937/ff430/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/uXCcBCLFE048Gzc7_2eeow/1757750806/3230392e362e3137392e313937/ff430/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Baseball: MLB] Milwaukee - Saint-Louis": {
|
"[Baseball: MLB] Milwaukee - Saint-Louis": {
|
||||||
"url": "https://ddt2.dbcast.live/lK_ipHVXlxIea8PfedXQYQ/1757750815/3230392e362e3137392e313937/ff432/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/lK_ipHVXlxIea8PfedXQYQ/1757750815/3230392e362e3137392e313937/ff432/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Argentina Liga Profesional] Lanus - Independiente R": {
|
"[Football: Argentina Liga Profesional] Lanus - Independiente R": {
|
||||||
"url": "https://ddt2.dbcast.live/7frpo5ftDsAJ7MvWmS_96w/1757750825/3230392e362e3137392e313937/ff434/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/7frpo5ftDsAJ7MvWmS_96w/1757750825/3230392e362e3137392e313937/ff434/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Argentina Liga Profesional] Newell`s Old Boys - Atletico Tucuman": {
|
"[Football: Argentina Liga Profesional] Newell`s Old Boys - Atletico Tucuman": {
|
||||||
"url": "https://ddt1.dbcast.live/xVdG6q7epaQWM7cskH1AGQ/1757750836/3230392e362e3137392e313937/ff435/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/xVdG6q7epaQWM7cskH1AGQ/1757750836/3230392e362e3137392e313937/ff435/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Colombia Primera A] Atletico Junior - La Equidad": {
|
"[Football: Colombia Primera A] Atletico Junior - La Equidad": {
|
||||||
"url": "https://ddt1.dbcast.live/XEyD2nj0XMWEI-k6cBSc3g/1757750846/3230392e362e3137392e313937/ff437/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/XEyD2nj0XMWEI-k6cBSc3g/1757750846/3230392e362e3137392e313937/ff437/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Football: Brazil Serie B] Coritiba - Goias": {
|
"[Football: Brazil Serie B] Coritiba - Goias": {
|
||||||
"url": "https://ddt1.dbcast.live/4M6HouhhU_e8f_qDjoRSsg/1757750856/3230392e362e3137392e313937/ff436/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/4M6HouhhU_e8f_qDjoRSsg/1757750856/3230392e362e3137392e313937/ff436/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[American Football: NCAA] Arizona Wildcats - Kansas Wildcats": {
|
"[American Football: NCAA] Arizona Wildcats - Kansas Wildcats": {
|
||||||
"url": "https://broadcasthub.click/hls/zujm0b9gNEQv/index.m3u8?st=p_j7iqvtXPU7RaF9NBZlVQ&e=1757736361",
|
"url": "https://broadcasthub.click/hls/zujm0b9gNEQv/index.m3u8?st=p_j7iqvtXPU7RaF9NBZlVQ&e=1757736361",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757725505.510486
|
"timestamp": 1757725505.510486
|
||||||
},
|
},
|
||||||
"[Football: Mexico Liga MX] Necaxa - Juarez": {
|
"[Football: Mexico Liga MX] Necaxa - Juarez": {
|
||||||
"url": "https://ddt2.dbcast.live/nVc2u4EdQmOx6Put9G230g/1757754411/3230392e362e3137392e313937/ff442/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/nVc2u4EdQmOx6Put9G230g/1757754411/3230392e362e3137392e313937/ff442/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757725505.510486
|
"timestamp": 1757725505.510486
|
||||||
},
|
},
|
||||||
"[Football: Mexico Liga de Expansion] Correcaminos - Jaiba Brava": {
|
"[Football: Mexico Liga de Expansion] Correcaminos - Jaiba Brava": {
|
||||||
"url": "https://ddt1.dbcast.live/-FtPoznDD1Ia-NlCgpI1Qw/1757754443/3230392e362e3137392e313937/ff443/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/-FtPoznDD1Ia-NlCgpI1Qw/1757754443/3230392e362e3137392e313937/ff443/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757725505.510486
|
"timestamp": 1757725505.510486
|
||||||
},
|
},
|
||||||
"[Baseball: MLB] San Diego - Colorado": {
|
"[Baseball: MLB] San Diego - Colorado": {
|
||||||
"url": "https://ddt1.dbcast.live/gerrR2rVEH4BiZ8aQRmITg/1757757921/3230392e362e3137392e313937/ff446/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/gerrR2rVEH4BiZ8aQRmITg/1757757921/3230392e362e3137392e313937/ff446/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Football: Mexico Women Liga MX] UANL (W) - Pumas (W)": {
|
"[Football: Mexico Women Liga MX] UANL (W) - Pumas (W)": {
|
||||||
"url": "https://ddt1.dbcast.live/9Otngt3sItnlN5LBOgOBdw/1757757977/3230392e362e3137392e313937/ff464/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/9Otngt3sItnlN5LBOgOBdw/1757757977/3230392e362e3137392e313937/ff464/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[American Football: Canada CFL] Lions - Ottawa": {
|
"[American Football: Canada CFL] Lions - Ottawa": {
|
||||||
"url": "https://ab1.dbcast.live/ergfl2.m3u8?m=uFta8EPiYYjm86iZVpvT6g&c=fl2&p=3230392e362e3137392e313937&e=1757758017",
|
"url": "https://ab1.dbcast.live/ergfl2.m3u8?m=uFta8EPiYYjm86iZVpvT6g&c=fl2&p=3230392e362e3137392e313937&e=1757758017",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Football: USA MLS Next Pro] Tacoma Defiance - Austin II": {
|
"[Football: USA MLS Next Pro] Tacoma Defiance - Austin II": {
|
||||||
"url": "https://ddt2.dbcast.live/2VfyYEJq3yI8yZKgJd_pOg/1757758027/3230392e362e3137392e313937/ff452/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/2VfyYEJq3yI8yZKgJd_pOg/1757758027/3230392e362e3137392e313937/ff452/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Combat Sport: MMA] FFC": {
|
"[Combat Sport: MMA] FFC": {
|
||||||
"url": "https://ddt1.dbcast.live/jKP0IYVgcD31y0QPeulY5g/1757758058/3230392e362e3137392e313937/ff448/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/jKP0IYVgcD31y0QPeulY5g/1757758058/3230392e362e3137392e313937/ff448/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[American Football: NCAA] UCLA Bruins - New Mexico Lobos": {
|
"[American Football: NCAA] UCLA Bruins - New Mexico Lobos": {
|
||||||
"url": "https://broadcasthub.click/hls/M1Vc77MgylFf/index.m3u8?st=ToU1LS4VLHm6xAopRJtUng&e=1757740092",
|
"url": "https://broadcasthub.click/hls/M1Vc77MgylFf/index.m3u8?st=ToU1LS4VLHm6xAopRJtUng&e=1757740092",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Baseball: MLB] Seattle - LA Angels": {
|
"[Baseball: MLB] Seattle - LA Angels": {
|
||||||
"url": "https://ddt2.dbcast.live/GFbW6FDJMLCUVWT1R1pw-Q/1757758172/3230392e362e3137392e313937/ff459/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/GFbW6FDJMLCUVWT1R1pw-Q/1757758172/3230392e362e3137392e313937/ff459/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Baseball: MLB] San Francisco - LA Dodgers": {
|
"[Baseball: MLB] San Francisco - LA Dodgers": {
|
||||||
"url": "https://ddt1.dbcast.live/EiIAyYYHqIE8goTQI21VXQ/1757758182/3230392e362e3137392e313937/ff461/playlist.m3u8",
|
"url": "https://ddt1.dbcast.live/EiIAyYYHqIE8goTQI21VXQ/1757758182/3230392e362e3137392e313937/ff461/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Tennis: Davis Cup Qualification] Alex De Minaur - Raphael Collignon": {
|
"[Tennis: Davis Cup Qualification] Alex De Minaur - Raphael Collignon": {
|
||||||
"url": "https://ddt2.dbcast.live/yLO5aMKrc9dAF4occoQTnw/1757761570/3230392e362e3137392e313937/ff974/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/yLO5aMKrc9dAF4occoQTnw/1757761570/3230392e362e3137392e313937/ff974/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757732705.52622
|
"timestamp": 1757732705.52622
|
||||||
},
|
},
|
||||||
"[Golf: Asian Tour] Shinhan Donghae Open": {
|
"[Golf: Asian Tour] Shinhan Donghae Open": {
|
||||||
"url": "https://ddt2.dbcast.live/6MGqrT83ehv_jJ9LITLHhg/1757761606/3230392e362e3137392e313937/ff465/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/6MGqrT83ehv_jJ9LITLHhg/1757761606/3230392e362e3137392e313937/ff465/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757732705.52622
|
"timestamp": 1757732705.52622
|
||||||
},
|
},
|
||||||
"[Tennis: Davis Cup] Australia - Belgium": {
|
"[Tennis: Davis Cup] Australia - Belgium": {
|
||||||
"url": "https://ddt2.dbcast.live/0Sqw4xZ9yiRaGqfWVDYXyg/1757761617/3230392e362e3137392e313937/ff974/playlist.m3u8",
|
"url": "https://ddt2.dbcast.live/0Sqw4xZ9yiRaGqfWVDYXyg/1757761617/3230392e362e3137392e313937/ff974/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": 1757732705.52622
|
"timestamp": 1757732705.52622
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,36 +2,43 @@
|
||||||
"[Baseball] Arizona Diamondbacks vs. Minnesota Twins": {
|
"[Baseball] Arizona Diamondbacks vs. Minnesota Twins": {
|
||||||
"url": "https://gg.poocloud.in/twins/index.m3u8",
|
"url": "https://gg.poocloud.in/twins/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/f3a9af92177c789c2803e8404325120d-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/f3a9af92177c789c2803e8404325120d-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Baseball] St. Louis Cardinals vs. Milwaukee Brewers": {
|
"[Baseball] St. Louis Cardinals vs. Milwaukee Brewers": {
|
||||||
"url": "https://gg.poocloud.in/brewers/index.m3u8",
|
"url": "https://gg.poocloud.in/brewers/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/c28dd89542bcd64d85b25b86807529a4-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/c28dd89542bcd64d85b25b86807529a4-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Wrestling] WWE: Friday Night Smackdown": {
|
"[Wrestling] WWE: Friday Night Smackdown": {
|
||||||
"url": "https://gg.poocloud.in/wrestling/index.m3u8",
|
"url": "https://gg.poocloud.in/wrestling/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/ec7810b68fc39115ce3510bcf9687a63-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/ec7810b68fc39115ce3510bcf9687a63-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[Baseball] Colorado Rockies vs. San Diego Padres": {
|
"[Baseball] Colorado Rockies vs. San Diego Padres": {
|
||||||
"url": "https://gg.poocloud.in/padres/index.m3u8",
|
"url": "https://gg.poocloud.in/padres/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/ae2b1d17c96d982c0a6e920e0ff5579f-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/ae2b1d17c96d982c0a6e920e0ff5579f-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Baseball] Cincinnati Reds vs. Athletics": {
|
"[Baseball] Cincinnati Reds vs. Athletics": {
|
||||||
"url": "https://gg.poocloud.in/athletics/index.m3u8",
|
"url": "https://gg.poocloud.in/athletics/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/acd57c8a41de2705e77f550ac7ececf4-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/acd57c8a41de2705e77f550ac7ececf4-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Baseball] Los Angeles Angels vs. Seattle Mariners": {
|
"[Baseball] Los Angeles Angels vs. Seattle Mariners": {
|
||||||
"url": "https://gg.poocloud.in/mariners/index.m3u8",
|
"url": "https://gg.poocloud.in/mariners/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/8971b329d6f619350f3b42915d3d548c-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/8971b329d6f619350f3b42915d3d548c-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[Baseball] Los Angeles Dodgers vs. San Francisco Giants": {
|
"[Baseball] Los Angeles Dodgers vs. San Francisco Giants": {
|
||||||
"url": "https://gg.poocloud.in/giants/index.m3u8",
|
"url": "https://gg.poocloud.in/giants/index.m3u8",
|
||||||
"logo": "https://ppvs.su/assets/thumb/25adb7fd6882369cd4c08e9b0757623b-thumbnail.jpg",
|
"logo": "https://ppvs.su/assets/thumb/25adb7fd6882369cd4c08e9b0757623b-thumbnail.jpg",
|
||||||
|
"base": "https://ppvs.su/",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2,96 +2,115 @@
|
||||||
"[Soccer] Cyprus vs Romania": {
|
"[Soccer] Cyprus vs Romania": {
|
||||||
"url": "https://streameast247.com/playlist/stream_4.m3u8",
|
"url": "https://streameast247.com/playlist/stream_4.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[Soccer] Albania vs Latvia": {
|
"[Soccer] Albania vs Latvia": {
|
||||||
"url": "https://streameast247.com/playlist/stream_5.m3u8",
|
"url": "https://streameast247.com/playlist/stream_5.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[Soccer] France vs Iceland": {
|
"[Soccer] France vs Iceland": {
|
||||||
"url": "https://streameast247.com/playlist/stream_6.m3u8",
|
"url": "https://streameast247.com/playlist/stream_6.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[Soccer] Hungary vs Portugal": {
|
"[Soccer] Hungary vs Portugal": {
|
||||||
"url": "https://streameast247.com/playlist/stream_7.m3u8",
|
"url": "https://streameast247.com/playlist/stream_7.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
"logo": "https://artwork.espncdn.com/categories/119cfa41-71d4-39bf-a790-6273a52b0259/logo/original_201809051718.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Pittsburgh vs Baltimore": {
|
"[MLB] Pittsburgh vs Baltimore": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb1.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb1.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Kansas City vs Cleveland": {
|
"[MLB] Kansas City vs Cleveland": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb2.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb2.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Washington vs Miami": {
|
"[MLB] Washington vs Miami": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb3.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb3.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] N.Y. Mets vs Philadelphia": {
|
"[MLB] N.Y. Mets vs Philadelphia": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb4.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb4.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Detroit vs N.Y. Yankees": {
|
"[MLB] Detroit vs N.Y. Yankees": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb5.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb5.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Houston vs Toronto": {
|
"[MLB] Houston vs Toronto": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb6.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb6.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Chi. Cubs vs Atlanta": {
|
"[MLB] Chi. Cubs vs Atlanta": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb7.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb7.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Tampa Bay vs Chi. White Sox": {
|
"[MLB] Tampa Bay vs Chi. White Sox": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb8.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb8.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Milwaukee vs Texas": {
|
"[MLB] Milwaukee vs Texas": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb9.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb9.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Minnesota vs L.A. Angels": {
|
"[MLB] Minnesota vs L.A. Angels": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb10.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb10.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] St. Louis vs Seattle": {
|
"[MLB] St. Louis vs Seattle": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb11.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb11.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Cincinnati vs San Diego": {
|
"[MLB] Cincinnati vs San Diego": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb12.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb12.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Arizona vs San Francisco": {
|
"[MLB] Arizona vs San Francisco": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb13.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb13.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Boston vs Athletics": {
|
"[MLB] Boston vs Athletics": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb14.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb14.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
},
|
},
|
||||||
"[MLB] Colorado vs L.A. Dodgers": {
|
"[MLB] Colorado vs L.A. Dodgers": {
|
||||||
"url": "https://smsbusinesshub.com/playlist/stream_mlb15.m3u8",
|
"url": "https://smsbusinesshub.com/playlist/stream_mlb15.m3u8",
|
||||||
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
"logo": "https://artwork.espncdn.com/categories/b38f959b-7865-31ac-8841-b88355519e10/logo/original_201811152008.svg",
|
||||||
|
"base": "https://streambtw.com/",
|
||||||
"timestamp": 1757682303.329149
|
"timestamp": 1757682303.329149
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2,51 +2,61 @@
|
||||||
"[MLB] St. Louis Cardinals - Milwaukee Brewers": {
|
"[MLB] St. Louis Cardinals - Milwaukee Brewers": {
|
||||||
"url": "https://lb10.strmd.top/secure/pJawemMdGvTMviALZpuNBvjaFZYSVhBp/echo/stream/milwaukee-brewers-vs-stlouis-cardinals-baseball-173229/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/pJawemMdGvTMviALZpuNBvjaFZYSVhBp/echo/stream/milwaukee-brewers-vs-stlouis-cardinals-baseball-173229/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[MLB] Arizona Diamondbacks - Minnesota Twins": {
|
"[MLB] Arizona Diamondbacks - Minnesota Twins": {
|
||||||
"url": "https://lb10.strmd.top/secure/zBnEFkJErZYuzGUYJktohtdBHhXJkJOF/delta/stream/live_mlb_twins-diamondbacks-live-streaming-417853296/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/zBnEFkJErZYuzGUYJktohtdBHhXJkJOF/delta/stream/live_mlb_twins-diamondbacks-live-streaming-417853296/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[UFC] BKFC 80: Leonardo Perdomo vs Arnold Adams": {
|
"[UFC] BKFC 80: Leonardo Perdomo vs Arnold Adams": {
|
||||||
"url": "https://lb10.strmd.top/secure/DgjCyseThNvpAptcnfZSLYmfOrPwKDya/alpha/stream/bkfc-80-leonardo-perdomo-vs-arnold-adams/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/DgjCyseThNvpAptcnfZSLYmfOrPwKDya/alpha/stream/bkfc-80-leonardo-perdomo-vs-arnold-adams/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[MLB] New York Yankees - Boston Red Sox": {
|
"[MLB] New York Yankees - Boston Red Sox": {
|
||||||
"url": "https://lb10.strmd.top/secure/eAZxQJtKWvzZLCYQdaPiiILvvfZePXDw/echo/stream/boston-red-sox-vs-new-york-yankees-baseball-173224/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/eAZxQJtKWvzZLCYQdaPiiILvvfZePXDw/echo/stream/boston-red-sox-vs-new-york-yankees-baseball-173224/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757721904.604711
|
"timestamp": 1757721904.604711
|
||||||
},
|
},
|
||||||
"[CFB] Kansas State Wildcats - Arizona Wildcats": {
|
"[CFB] Kansas State Wildcats - Arizona Wildcats": {
|
||||||
"url": "https://lb10.strmd.top/secure/KCJtWABXfBLkyOtYNFHMCkilExzaplcA/echo/stream/arizona-vs-kansas-state-american-football-17776/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/KCJtWABXfBLkyOtYNFHMCkilExzaplcA/echo/stream/arizona-vs-kansas-state-american-football-17776/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757725505.510486
|
"timestamp": 1757725505.510486
|
||||||
},
|
},
|
||||||
"[WWE] WWE Friday Night Smackdown": {
|
"[WWE] WWE Friday Night Smackdown": {
|
||||||
"url": "https://lb10.strmd.top/secure/KPLpdKZEFDgIMlAKnoRUWaTnMNIKfLii/alpha/stream/wwe-friday-night-smackdown/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/KPLpdKZEFDgIMlAKnoRUWaTnMNIKfLii/alpha/stream/wwe-friday-night-smackdown/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"logo": "https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757725505.510486
|
"timestamp": 1757725505.510486
|
||||||
},
|
},
|
||||||
"[CFB] New Mexico Lobos - UCLA Bruins": {
|
"[CFB] New Mexico Lobos - UCLA Bruins": {
|
||||||
"url": "https://lb10.strmd.top/secure/DVLLjIwkhkdoCTJNhmsoFeoktnAiFdDd/echo/stream/indiana-vs-indiana-state-american-football-17799/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/DVLLjIwkhkdoCTJNhmsoFeoktnAiFdDd/echo/stream/indiana-vs-indiana-state-american-football-17799/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[MLB] Colorado Rockies - San Diego Padres": {
|
"[MLB] Colorado Rockies - San Diego Padres": {
|
||||||
"url": "https://lb10.strmd.top/secure/nDuhOdLPpdvzhAdggQiPtrkXWKqxbYNM/echo/stream/san-diego-padres-vs-colorado-rockies-baseball-173231/1/playlist.m3u8",
|
"url": "https://lb10.strmd.top/secure/nDuhOdLPpdvzhAdggQiPtrkXWKqxbYNM/echo/stream/san-diego-padres-vs-colorado-rockies-baseball-173231/1/playlist.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757729104.691189
|
"timestamp": 1757729104.691189
|
||||||
},
|
},
|
||||||
"[MLB] Los Angeles Dodgers - San Francisco Giants": {
|
"[MLB] Los Angeles Dodgers - San Francisco Giants": {
|
||||||
"url": "https://mainstreams.pro/hls/hfzljfahzcax29.m3u8?st=6pxPf-zHFDQ-PSFJXxYVbub5B3unjacCOub30IoyL-4&e=1757743512",
|
"url": "https://mainstreams.pro/hls/hfzljfahzcax29.m3u8?st=6pxPf-zHFDQ-PSFJXxYVbub5B3unjacCOub30IoyL-4&e=1757743512",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757732705.52622
|
"timestamp": 1757732705.52622
|
||||||
},
|
},
|
||||||
"[MLB] Cincinnati Reds - Athletics": {
|
"[MLB] Cincinnati Reds - Athletics": {
|
||||||
"url": "https://mainstreams.pro/hls/jzabfazkbf27.m3u8?st=WhD6cNVHQgvu5aWHjLos52gg8yg-mqDDX_3V-4v8hvA&e=1757743541",
|
"url": "https://mainstreams.pro/hls/jzabfazkbf27.m3u8?st=WhD6cNVHQgvu5aWHjLos52gg8yg-mqDDX_3V-4v8hvA&e=1757743541",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://streameast.ga",
|
||||||
"timestamp": 1757732705.52622
|
"timestamp": 1757732705.52622
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2,101 +2,121 @@
|
||||||
"[MLB] Tampa Bay Rays @ Chicago Cubs": {
|
"[MLB] Tampa Bay Rays @ Chicago Cubs": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB01/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB01/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[NCAAF] Indiana State Sycamores @ Indiana Hoosiers": {
|
"[NCAAF] Indiana State Sycamores @ Indiana Hoosiers": {
|
||||||
"url": "http://origin.thetvapp.to/hls/BTN/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/BTN/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Pittsburgh Pirates @ Washington Nationals": {
|
"[MLB] Pittsburgh Pirates @ Washington Nationals": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB02/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB02/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Kansas City Royals @ Philadelphia Phillies": {
|
"[MLB] Kansas City Royals @ Philadelphia Phillies": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB03/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB03/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[NCAAF] Colgate Raiders @ Syracuse Orange": {
|
"[NCAAF] Colgate Raiders @ Syracuse Orange": {
|
||||||
"url": "http://origin.thetvapp.to/hls/ACCNetwork/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/ACCNetwork/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Baltimore Orioles @ Toronto Blue Jays": {
|
"[MLB] Baltimore Orioles @ Toronto Blue Jays": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB04/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB04/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] New York Yankees @ Boston Red Sox": {
|
"[MLB] New York Yankees @ Boston Red Sox": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB05/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB05/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Chicago White Sox @ Cleveland Guardians": {
|
"[MLB] Chicago White Sox @ Cleveland Guardians": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB06/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB06/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Detroit Tigers @ Miami Marlins": {
|
"[MLB] Detroit Tigers @ Miami Marlins": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB07/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB07/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Texas Rangers @ New York Mets": {
|
"[MLB] Texas Rangers @ New York Mets": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB08/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB08/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Houston Astros @ Atlanta Braves": {
|
"[MLB] Houston Astros @ Atlanta Braves": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB09/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB09/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[NCAAF] Colorado Buffaloes @ Houston Cougars": {
|
"[NCAAF] Colorado Buffaloes @ Houston Cougars": {
|
||||||
"url": "http://origin.thetvapp.to/hls/ESPN/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/ESPN/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] St. Louis Cardinals @ Milwaukee Brewers": {
|
"[MLB] St. Louis Cardinals @ Milwaukee Brewers": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB11/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB11/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Arizona Diamondbacks @ Minnesota Twins": {
|
"[MLB] Arizona Diamondbacks @ Minnesota Twins": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB10/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB10/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[NCAAF] Kansas State Wildcats @ Arizona Wildcats": {
|
"[NCAAF] Kansas State Wildcats @ Arizona Wildcats": {
|
||||||
"url": "http://origin.thetvapp.to/hls/WNYWDT1/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/WNYWDT1/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Colorado Rockies @ San Diego Padres": {
|
"[MLB] Colorado Rockies @ San Diego Padres": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB12/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB12/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[NCAAF] New Mexico Lobos @ UCLA Bruins": {
|
"[NCAAF] New Mexico Lobos @ UCLA Bruins": {
|
||||||
"url": "http://origin.thetvapp.to/hls/BTN/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/BTN/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
"logo": "https://i.gyazo.com/ca63b40c86e757436de9d34d369b24f8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Cincinnati Reds @ Oakland Athletics": {
|
"[MLB] Cincinnati Reds @ Oakland Athletics": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB13/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB13/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Los Angeles Angels @ Seattle Mariners": {
|
"[MLB] Los Angeles Angels @ Seattle Mariners": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB14/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB14/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
},
|
},
|
||||||
"[MLB] Los Angeles Dodgers @ San Francisco Giants": {
|
"[MLB] Los Angeles Dodgers @ San Francisco Giants": {
|
||||||
"url": "http://origin.thetvapp.to/hls/MLB15/mono.m3u8",
|
"url": "http://origin.thetvapp.to/hls/MLB15/mono.m3u8",
|
||||||
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
"logo": "https://i.gyazo.com/0fe7865ef2f06c9507791b24f04dbca8.png",
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": 1757693103.550906
|
"timestamp": 1757693103.550906
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,24 +1,31 @@
|
||||||
import asyncio
|
import json
|
||||||
from urllib.parse import urljoin
|
from pathlib import Path
|
||||||
|
from urllib.parse import unquote, urljoin
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
from selectolax.parser import HTMLParser
|
from selectolax.parser import HTMLParser
|
||||||
|
|
||||||
from .utils import LOGOS, get_base, get_logger
|
from .utils import LOGOS, get_base, get_logger, load_cache, now, safe_process_event
|
||||||
|
|
||||||
log = get_logger(__name__)
|
log = get_logger(__name__)
|
||||||
|
|
||||||
urls: dict[str, dict[str, str]] = {}
|
urls: dict[str, dict[str, str]] = {}
|
||||||
|
|
||||||
MIRRORS = [
|
MIRRORS = [
|
||||||
"https://fstv.online",
|
|
||||||
"https://fstv.space",
|
|
||||||
"https://fstv.zip",
|
"https://fstv.zip",
|
||||||
|
"https://fstv.space",
|
||||||
|
"https://fstv.online",
|
||||||
"https://fstv.us",
|
"https://fstv.us",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
CACHE_FILE = Path(__file__).parent / "caches" / "fstv.json"
|
||||||
|
|
||||||
async def get_events(client: httpx.AsyncClient, base_url: str) -> list[tuple[str, str]]:
|
|
||||||
|
async def get_events(
|
||||||
|
client: httpx.AsyncClient,
|
||||||
|
base_url: str,
|
||||||
|
cached_hrefs: set[str],
|
||||||
|
) -> list[dict[str, str]]:
|
||||||
log.info(f'Scraping from "{base_url}"')
|
log.info(f'Scraping from "{base_url}"')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
@ -31,7 +38,7 @@ async def get_events(client: httpx.AsyncClient, base_url: str) -> list[tuple[str
|
||||||
|
|
||||||
soup = HTMLParser(r.text)
|
soup = HTMLParser(r.text)
|
||||||
|
|
||||||
events = {}
|
events = []
|
||||||
|
|
||||||
for wrpr in soup.css("div.fixtures-live-wrapper"):
|
for wrpr in soup.css("div.fixtures-live-wrapper"):
|
||||||
for games in wrpr.css(".match-table-item"):
|
for games in wrpr.css(".match-table-item"):
|
||||||
|
|
@ -48,21 +55,40 @@ async def get_events(client: httpx.AsyncClient, base_url: str) -> list[tuple[str
|
||||||
else:
|
else:
|
||||||
event_name = full_text
|
event_name = full_text
|
||||||
|
|
||||||
events[event_name] = urljoin(
|
href = league_match.attributes.get("href")
|
||||||
base_url, league_match.attributes.get("href")
|
|
||||||
|
link = urljoin(base_url, href)
|
||||||
|
|
||||||
|
if cached_hrefs & {href}:
|
||||||
|
continue
|
||||||
|
|
||||||
|
events.append(
|
||||||
|
{
|
||||||
|
"sport": event_name,
|
||||||
|
"link": link,
|
||||||
|
"logo": LOGOS.get(
|
||||||
|
event_name,
|
||||||
|
"https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
|
),
|
||||||
|
"href": href,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
return events.items()
|
return events
|
||||||
|
|
||||||
|
|
||||||
async def process_events(client: httpx.AsyncClient, url: str) -> tuple[str, list[str]]:
|
async def process_event(
|
||||||
|
client: httpx.AsyncClient,
|
||||||
|
url: str,
|
||||||
|
url_num: int,
|
||||||
|
) -> tuple[str, str]:
|
||||||
try:
|
try:
|
||||||
r = await client.get(url)
|
r = await client.get(url)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(f'Failed to fetch "{url}"\n{e}')
|
log.error(f'URL {url_num}) Failed to fetch "{url}"\n{e}')
|
||||||
|
|
||||||
return []
|
return "", ""
|
||||||
|
|
||||||
soup = HTMLParser(r.text)
|
soup = HTMLParser(r.text)
|
||||||
|
|
||||||
|
|
@ -77,43 +103,65 @@ async def process_events(client: httpx.AsyncClient, url: str) -> tuple[str, list
|
||||||
og_title.attributes.get("content", "").split(" start on")[0].strip()
|
og_title.attributes.get("content", "").split(" start on")[0].strip()
|
||||||
)
|
)
|
||||||
|
|
||||||
btns = soup.css("button.btn-server")
|
if src := soup.css_first("iframe").attributes.get("src", ""):
|
||||||
|
log.info(f"URL {url_num}) Captured M3U8")
|
||||||
|
return match_name, unquote(src).split("link=")[-1]
|
||||||
|
|
||||||
return match_name, [
|
log.info(f"URL {url_num}) No M3U8 found")
|
||||||
btn.attributes.get("data-link") for btn in btns if "data-link" in btn.attributes
|
return "", ""
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
async def main(client: httpx.AsyncClient) -> None:
|
async def main(client: httpx.AsyncClient) -> None:
|
||||||
|
cached_urls = load_cache(CACHE_FILE, exp=14400)
|
||||||
|
cached_hrefs = {entry["href"] for entry in cached_urls.values()}
|
||||||
|
cached_count = len(cached_urls)
|
||||||
|
urls.update(cached_urls)
|
||||||
|
|
||||||
|
log.info(f"Collected {cached_count} event(s) from cache")
|
||||||
|
|
||||||
if not (base_url := await get_base(client, MIRRORS)):
|
if not (base_url := await get_base(client, MIRRORS)):
|
||||||
log.warning("No working FSTV mirrors")
|
log.warning("No working FSTV mirrors")
|
||||||
return
|
return
|
||||||
|
|
||||||
events = await get_events(client, base_url)
|
events = await get_events(
|
||||||
|
client,
|
||||||
|
base_url,
|
||||||
|
cached_hrefs,
|
||||||
|
)
|
||||||
|
|
||||||
tasks = [process_events(client, href) for _, href in events if href]
|
log.info(f"Processing {len(events)} new URL(s)")
|
||||||
results = await asyncio.gather(*tasks)
|
|
||||||
|
|
||||||
for (event, _), (match_name, m3u8_urls) in zip(events, results):
|
for i, ev in enumerate(events, start=1):
|
||||||
event = event.strip()
|
match_name, url = await safe_process_event(
|
||||||
|
lambda: process_event(
|
||||||
|
client,
|
||||||
|
ev["link"],
|
||||||
|
url_num=i,
|
||||||
|
),
|
||||||
|
url_num=i,
|
||||||
|
log=log,
|
||||||
|
)
|
||||||
|
|
||||||
if not m3u8_urls:
|
if url:
|
||||||
continue
|
|
||||||
|
|
||||||
for i, link in enumerate(m3u8_urls, start=1):
|
|
||||||
key = (
|
key = (
|
||||||
f"[{event}] {match_name} (S{i})" if match_name else f"[{event}] (S{i})"
|
f"[{ev['sport']}] {match_name} (FSTV)"
|
||||||
|
if match_name
|
||||||
|
else f"[{ev['sport']}] (FSTV)"
|
||||||
)
|
)
|
||||||
|
|
||||||
urls[key] = {
|
entry = {
|
||||||
"url": link,
|
"url": url,
|
||||||
"logo": LOGOS.get(
|
"logo": ev["logo"],
|
||||||
event,
|
"base": base_url,
|
||||||
"https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"timestamp": now.timestamp(),
|
||||||
),
|
"href": ev["href"],
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info(f"Collected {len(urls)} live event(s)")
|
urls[key] = cached_urls[key] = entry
|
||||||
|
|
||||||
|
if new_count := len(cached_urls) - cached_count:
|
||||||
|
log.info(f"Collected and cached {new_count} new event(s)")
|
||||||
|
else:
|
||||||
|
log.info("No new events found")
|
||||||
|
|
||||||
# add caching
|
CACHE_FILE.write_text(json.dumps(cached_urls, indent=2), encoding="utf-8")
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ CERT_FILE = Path(__file__).parent / "utils" / "cached-ca.pem"
|
||||||
|
|
||||||
CACHE_FILE = Path(__file__).parent / "caches" / "livetvsx.json"
|
CACHE_FILE = Path(__file__).parent / "caches" / "livetvsx.json"
|
||||||
|
|
||||||
|
exist_sprts = set(LOGOS.keys())
|
||||||
|
|
||||||
|
|
||||||
async def write_to_cert(
|
async def write_to_cert(
|
||||||
client: httpx.AsyncClient,
|
client: httpx.AsyncClient,
|
||||||
|
|
@ -248,9 +250,13 @@ async def get_events(
|
||||||
else ("", "")
|
else ("", "")
|
||||||
)
|
)
|
||||||
|
|
||||||
key = f"[{sport}: {event}] {title}"
|
key = f"[{sport}: {event}] {title} (LTVSX)"
|
||||||
|
|
||||||
if key in cached_keys:
|
if cached_keys & {key}:
|
||||||
|
elem.clear()
|
||||||
|
continue
|
||||||
|
|
||||||
|
if exist_sprts & {sport, event}:
|
||||||
elem.clear()
|
elem.clear()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
@ -293,7 +299,7 @@ async def main(client: httpx.AsyncClient) -> None:
|
||||||
title = ev["title"]
|
title = ev["title"]
|
||||||
link = ev["link"]
|
link = ev["link"]
|
||||||
|
|
||||||
key = f"[{sport}: {event}] {title}"
|
key = f"[{sport}: {event}] {title} (LTVSX)"
|
||||||
|
|
||||||
url = await safe_process_event(
|
url = await safe_process_event(
|
||||||
lambda: process_event(link, url_num=i),
|
lambda: process_event(link, url_num=i),
|
||||||
|
|
@ -308,6 +314,7 @@ async def main(client: httpx.AsyncClient) -> None:
|
||||||
sport,
|
sport,
|
||||||
"https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
),
|
),
|
||||||
|
"base": "https://livetv.sx/enx/",
|
||||||
"timestamp": now.timestamp(),
|
"timestamp": now.timestamp(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -145,9 +145,9 @@ async def get_events(
|
||||||
event["uri_name"],
|
event["uri_name"],
|
||||||
)
|
)
|
||||||
|
|
||||||
key = f"[{sport}] {name}"
|
key = f"[{sport}] {name} (PPV)"
|
||||||
|
|
||||||
if key in cached_keys:
|
if cached_keys & {key}:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
start_dt = datetime.fromtimestamp(start_ts, tz=TZ) - timedelta(minutes=30)
|
start_dt = datetime.fromtimestamp(start_ts, tz=TZ) - timedelta(minutes=30)
|
||||||
|
|
@ -198,14 +198,15 @@ async def main(client: httpx.AsyncClient) -> None:
|
||||||
)
|
)
|
||||||
|
|
||||||
if url:
|
if url:
|
||||||
|
key = f"[{ev['sport']}] {ev['event']} (PPV)"
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
"url": url,
|
"url": url,
|
||||||
"logo": ev["logo"],
|
"logo": ev["logo"],
|
||||||
|
"base": base_url,
|
||||||
"timestamp": now.timestamp(),
|
"timestamp": now.timestamp(),
|
||||||
}
|
}
|
||||||
|
|
||||||
key = f"[{ev['sport']}] {ev['event']}"
|
|
||||||
|
|
||||||
urls[key] = cached_urls[key] = entry
|
urls[key] = cached_urls[key] = entry
|
||||||
|
|
||||||
if new_count := len(cached_urls) - cached_count:
|
if new_count := len(cached_urls) - cached_count:
|
||||||
|
|
|
||||||
|
|
@ -98,13 +98,16 @@ async def main(client: httpx.AsyncClient) -> None:
|
||||||
)
|
)
|
||||||
|
|
||||||
if url:
|
if url:
|
||||||
|
key = f"[{ev['sport']}] {ev['event']} (SBTW)"
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
"url": url,
|
"url": url,
|
||||||
"logo": ev["logo"],
|
"logo": ev["logo"],
|
||||||
|
"base": BASE_URL,
|
||||||
"timestamp": now.timestamp(),
|
"timestamp": now.timestamp(),
|
||||||
}
|
}
|
||||||
|
|
||||||
urls[f"[{ev['sport']}] {ev['event']}"] = entry
|
urls[key] = entry
|
||||||
|
|
||||||
log.info(f"Collected {len(urls)} event(s)")
|
log.info(f"Collected {len(urls)} event(s)")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ async def process_event(url: str, url_num: int) -> str | None:
|
||||||
async def get_events(
|
async def get_events(
|
||||||
client: httpx.AsyncClient,
|
client: httpx.AsyncClient,
|
||||||
url: str,
|
url: str,
|
||||||
cached_keys: list[str],
|
cached_keys: set[str],
|
||||||
) -> list[dict[str, str]]:
|
) -> list[dict[str, str]]:
|
||||||
try:
|
try:
|
||||||
r = await client.get(url)
|
r = await client.get(url)
|
||||||
|
|
@ -136,9 +136,9 @@ async def get_events(
|
||||||
time_text = time_span.text(strip=True)
|
time_text = time_span.text(strip=True)
|
||||||
timestamp = int(time_span.attributes.get("data-zaman"))
|
timestamp = int(time_span.attributes.get("data-zaman"))
|
||||||
|
|
||||||
key = f"[{sport}] {name}"
|
key = f"[{sport}] {name} (SEAST)"
|
||||||
|
|
||||||
if key in cached_keys:
|
if cached_keys & {key}:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
event_dt = datetime.fromtimestamp(timestamp, TZ)
|
event_dt = datetime.fromtimestamp(timestamp, TZ)
|
||||||
|
|
@ -188,14 +188,15 @@ async def main(client: httpx.AsyncClient) -> None:
|
||||||
)
|
)
|
||||||
|
|
||||||
if url:
|
if url:
|
||||||
|
key = f"[{ev['sport']}] {ev['event']} (SEAST)"
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
"url": url,
|
"url": url,
|
||||||
"logo": ev["logo"],
|
"logo": ev["logo"],
|
||||||
|
"base": base_url,
|
||||||
"timestamp": now.timestamp(),
|
"timestamp": now.timestamp(),
|
||||||
}
|
}
|
||||||
|
|
||||||
key = f"[{ev['sport']}] {ev['event']}"
|
|
||||||
|
|
||||||
urls[key] = cached_urls[key] = entry
|
urls[key] = cached_urls[key] = entry
|
||||||
|
|
||||||
if new_count := len(cached_urls) - cached_count:
|
if new_count := len(cached_urls) - cached_count:
|
||||||
|
|
|
||||||
|
|
@ -51,15 +51,20 @@ async def main(client: httpx.AsyncClient) -> None:
|
||||||
tvg_name = "(".join(tvg_name.split("(")[:-1]).strip()
|
tvg_name = "(".join(tvg_name.split("(")[:-1]).strip()
|
||||||
|
|
||||||
if url.endswith("/hd"):
|
if url.endswith("/hd"):
|
||||||
urls[f"[{sport}] {tvg_name}"] = {
|
key = f"[{sport}] {tvg_name} (TVP)"
|
||||||
|
|
||||||
|
entry = {
|
||||||
"url": f"http://origin.thetvapp.to/hls/{url.split('/')[-2]}/mono.m3u8",
|
"url": f"http://origin.thetvapp.to/hls/{url.split('/')[-2]}/mono.m3u8",
|
||||||
"logo": LOGOS.get(
|
"logo": LOGOS.get(
|
||||||
sport,
|
sport,
|
||||||
"https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
"https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png",
|
||||||
),
|
),
|
||||||
|
"base": "https://tvpass.org",
|
||||||
"timestamp": now.timestamp(),
|
"timestamp": now.timestamp(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
urls[key] = entry
|
||||||
|
|
||||||
CACHE_FILE.write_text(json.dumps(urls, indent=2), encoding="utf-8")
|
CACHE_FILE.write_text(json.dumps(urls, indent=2), encoding="utf-8")
|
||||||
|
|
||||||
log.info(f"Cached {len(urls)} event(s)")
|
log.info(f"Cached {len(urls)} event(s)")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue