Compare commits

..

No commits in common. "fe9dbd8ec09bd1ad4b9941a1fd99bf8f6aaebeea" and "933feeb76a29fc6a4659124964749f26becae924" have entirely different histories.

14 changed files with 119972 additions and 122228 deletions

File diff suppressed because it is too large Load diff

235286
M3U8/TV.xml

File diff suppressed because one or more lines are too long

View file

@ -409,16 +409,16 @@ http://mytvstream.net:8080/live/56481106/11185695/21842.m3u8
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/30847.ts http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/30847.ts
#EXTINF:-1 tvg-chno="137" tvg-id="Sportsnet.360.HD.ca2" tvg-name="Sportsnet 360" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s49952_dark_360w_270h.png" group-title="TV",Sportsnet 360 #EXTINF:-1 tvg-chno="137" tvg-id="Sportsnet.360.HD.ca2" tvg-name="Sportsnet 360" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s49952_dark_360w_270h.png" group-title="TV",Sportsnet 360
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/3377.ts https://stream.decentdoubts.net/803/index.m3u8
#EXTINF:-1 tvg-chno="138" tvg-id="Sportsnet.East.ca2" tvg-name="Sportsnet East" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s62109_dark_360w_270h.png" group-title="TV",Sportsnet East #EXTINF:-1 tvg-chno="138" tvg-id="Sportsnet.East.ca2" tvg-name="Sportsnet East" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s62109_dark_360w_270h.png" group-title="TV",Sportsnet East
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/1720.ts https://stream.decentdoubts.net/801/index.m3u8
#EXTINF:-1 tvg-chno="139" tvg-id="SNY.SportsNet.New.York.HD.us2" tvg-name="SportsNet New York" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s50038_dark_360w_270h.png" group-title="TV",SportsNet New York #EXTINF:-1 tvg-chno="139" tvg-id="SNY.SportsNet.New.York.HD.us2" tvg-name="SportsNet New York" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s50038_dark_360w_270h.png" group-title="TV",SportsNet New York
http://212.102.60.231/SNY/index.m3u8 http://212.102.60.231/SNY/index.m3u8
#EXTINF:-1 tvg-chno="140" tvg-id="Sportsnet.One.ca2" tvg-name="Sportsnet One" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s68859_dark_360w_270h.png" group-title="TV",Sportsnet One #EXTINF:-1 tvg-chno="140" tvg-id="Sportsnet.One.ca2" tvg-name="Sportsnet One" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s68859_dark_360w_270h.png" group-title="TV",Sportsnet One
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/3378.ts https://stream.decentdoubts.net/808/index.m3u8
#EXTINF:-1 tvg-chno="141" tvg-id="SportsNet.Pittsburgh.HD.us2" tvg-name="SportsNet Pittsburgh" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s26028_dark_360w_270h.png" group-title="TV",SportsNet Pittsburgh #EXTINF:-1 tvg-chno="141" tvg-id="SportsNet.Pittsburgh.HD.us2" tvg-name="SportsNet Pittsburgh" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s26028_dark_360w_270h.png" group-title="TV",SportsNet Pittsburgh
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/59945.ts http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/59945.ts
@ -451,10 +451,10 @@ https://turnerlive.warnermediacdn.com/hls/live/2023168/tnteast/slate/VIDEO_0_356
https://turnerlive.warnermediacdn.com/hls/live/2023176/trueast/slate/VIDEO_0_3564000.m3u8 https://turnerlive.warnermediacdn.com/hls/live/2023176/trueast/slate/VIDEO_0_3564000.m3u8
#EXTINF:-1 tvg-chno="151" tvg-id="TSN.1.ca2" tvg-name="TSN1" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s11182_dark_360w_270h.png" group-title="TV",TSN1 #EXTINF:-1 tvg-chno="151" tvg-id="TSN.1.ca2" tvg-name="TSN1" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s11182_dark_360w_270h.png" group-title="TV",TSN1
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/770.ts https://stream.decentdoubts.net/805/index.m3u8
#EXTINF:-1 tvg-chno="152" tvg-id="TSN.2.ca2" tvg-name="TSN2" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s61474_dark_360w_270h.png" group-title="TV",TSN2 #EXTINF:-1 tvg-chno="152" tvg-id="TSN.2.ca2" tvg-name="TSN2" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s61474_dark_360w_270h.png" group-title="TV",TSN2
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/771.ts https://stream.decentdoubts.net/806/index.m3u8
#EXTINF:-1 tvg-chno="153" tvg-id="Turner.Classic.Movies.HD.us2" tvg-name="Turner Classic Movies" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s12852_dark_360w_270h.png" group-title="TV",Turner Classic Movies #EXTINF:-1 tvg-chno="153" tvg-id="Turner.Classic.Movies.HD.us2" tvg-name="Turner Classic Movies" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s12852_dark_360w_270h.png" group-title="TV",Turner Classic Movies
https://turnerlive.warnermediacdn.com/hls/live/2023186/tcmeast/noslate/VIDEO_1_5128000.m3u8 https://turnerlive.warnermediacdn.com/hls/live/2023186/tcmeast/noslate/VIDEO_1_5128000.m3u8

File diff suppressed because it is too large Load diff

View file

@ -62,7 +62,7 @@ async def main() -> None:
xtrnl_brwsr = await network.browser(p, external=True) xtrnl_brwsr = await network.browser(p, external=True)
pw_tasks = [ pw_tasks = [
asyncio.create_task(cdnlivetv.scrape(hdl_brwsr)), # asyncio.create_task(cdnlivetv.scrape(hdl_brwsr)),
asyncio.create_task(embedhd.scrape(hdl_brwsr)), asyncio.create_task(embedhd.scrape(hdl_brwsr)),
# asyncio.create_task(fsports.scrape(xtrnl_brwsr)), # asyncio.create_task(fsports.scrape(xtrnl_brwsr)),
asyncio.create_task(ppv.scrape(xtrnl_brwsr)), asyncio.create_task(ppv.scrape(xtrnl_brwsr)),
@ -75,12 +75,12 @@ async def main() -> None:
asyncio.create_task(istreameast.scrape()), asyncio.create_task(istreameast.scrape()),
# asyncio.create_task(listapreta.scrape()), # asyncio.create_task(listapreta.scrape()),
asyncio.create_task(mainportal.scrape()), asyncio.create_task(mainportal.scrape()),
asyncio.create_task(ovogoal.scrape()), # asyncio.create_task(ovogoal.scrape()),
asyncio.create_task(pawa.scrape()), asyncio.create_task(pawa.scrape()),
asyncio.create_task(shark.scrape()), asyncio.create_task(shark.scrape()),
asyncio.create_task(streamcenter.scrape()), asyncio.create_task(streamcenter.scrape()),
# asyncio.create_task(streamhub.scrape()), # asyncio.create_task(streamhub.scrape()),
asyncio.create_task(streamsgate.scrape()), # asyncio.create_task(streamsgate.scrape()),
asyncio.create_task(streamtpnew.scrape()), asyncio.create_task(streamtpnew.scrape()),
asyncio.create_task(totalsportek.scrape()), asyncio.create_task(totalsportek.scrape()),
asyncio.create_task(tvapp.scrape()), asyncio.create_task(tvapp.scrape()),

View file

@ -15,7 +15,7 @@ CACHE_FILE = Cache(TAG, exp=10_800)
API_FILE = Cache(f"{TAG}-api", exp=19_800) API_FILE = Cache(f"{TAG}-api", exp=19_800)
API_URL = "https://api.cdnlivetv.tv" API_URL = "https://api.cdn-live.tv"
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]: async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:

View file

@ -76,7 +76,7 @@ async def get_events(cached_hrefs: set[str]) -> list[dict[str, str]]:
{ {
"sport": sport, "sport": sport,
"event": clean_event.sub("", event_name), "event": clean_event.sub("", event_name),
"link": urljoin(f"{html_data.url}", href), "link": urljoin(BASE_URL, href),
"href": href, "href": href,
} }
) )

View file

@ -1,3 +1,4 @@
import base64
import re import re
from functools import partial from functools import partial
@ -16,36 +17,39 @@ CACHE_FILE = Cache(TAG, exp=10_800)
BASE_URL = "https://istreameast.app" BASE_URL = "https://istreameast.app"
async def process_event(url: str, url_num: int) -> tuple[str | None, str | None]: async def process_event(url: str, url_num: int) -> str | None:
nones = None, None
if not (event_data := await network.request(url, log=log)): if not (event_data := await network.request(url, log=log)):
log.warning(f"URL {url_num}) Failed to load url.") log.warning(f"URL {url_num}) Failed to load url.")
return nones
return
soup = HTMLParser(event_data.content) soup = HTMLParser(event_data.content)
if not (iframe := soup.css_first("iframe#wp_player")): if not (iframe := soup.css_first("iframe#wp_player")):
log.warning(f"URL {url_num}) No iframe element found.") log.warning(f"URL {url_num}) No iframe element found.")
return nones
return
if not (iframe_src := iframe.attributes.get("src")): if not (iframe_src := iframe.attributes.get("src")):
log.warning(f"URL {url_num}) No iframe source found.") log.warning(f"URL {url_num}) No iframe source found.")
return nones
return
if not (iframe_src_data := await network.request(iframe_src, log=log)): if not (iframe_src_data := await network.request(iframe_src, log=log)):
log.warning(f"URL {url_num}) Failed to load iframe source.") log.warning(f"URL {url_num}) Failed to load iframe source.")
return nones
pattern = re.compile(r'const\s+source\s+=\s+"([^"]*)"', re.I) return
pattern = re.compile(r"source:\s*window\.atob\(\s*'([^']+)'\s*\)", re.I)
if not (match := pattern.search(iframe_src_data.text)): if not (match := pattern.search(iframe_src_data.text)):
log.warning(f"URL {url_num}) No Clappr source found.") log.warning(f"URL {url_num}) No Clappr source found.")
return nones
return
log.info(f"URL {url_num}) Captured M3U8") log.info(f"URL {url_num}) Captured M3U8")
return match[1], iframe_src return base64.b64decode(match[1]).decode("utf-8")
async def get_events(cached_keys: list[str]) -> list[dict[str, str]]: async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
@ -120,7 +124,7 @@ async def scrape() -> None:
url_num=i, url_num=i,
) )
url, iframe = await network.safe_process( url = await network.safe_process(
handler, handler,
url_num=i, url_num=i,
semaphore=network.HTTP_S, semaphore=network.HTTP_S,
@ -136,7 +140,7 @@ async def scrape() -> None:
entry = { entry = {
"url": url, "url": url,
"logo": logo, "logo": logo,
"base": iframe, "base": "https://gooz.aapmains.net",
"timestamp": now.timestamp(), "timestamp": now.timestamp(),
"id": tvg_id or "Live.Event.us", "id": tvg_id or "Live.Event.us",
"link": link, "link": link,

View file

@ -1,6 +1,5 @@
import re import re
from functools import partial from functools import partial
from urllib.parse import urljoin
from selectolax.parser import HTMLParser from selectolax.parser import HTMLParser
@ -14,7 +13,11 @@ TAG = "OVO"
CACHE_FILE = Cache(TAG, exp=28_800) CACHE_FILE = Cache(TAG, exp=28_800)
BASE_URL = "https://ovogoaal.com" BASE_URL = "https://orbixa.top"
def fix_league(s: str) -> str:
return " ".join(x.capitalize() for x in s.split()) if len(s) > 5 else s.upper()
async def process_event(url: str, url_num: int) -> tuple[str | None, str | None]: async def process_event(url: str, url_num: int) -> tuple[str | None, str | None]:
@ -61,20 +64,23 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
soup = HTMLParser(html_data.content) soup = HTMLParser(html_data.content)
sport = "Live Event" sport = None
for card in soup.css(".main-content .stream-row"): for node in soup.css(".wrapper *"):
if (not (watch_btn_elem := card.css_first(".watch-btn"))) or ( if (cls := node.attributes.get("class")) == "section-title":
not (onclick := watch_btn_elem.attributes.get("onclick")) sport = fix_league(node.text(strip=True))
):
if node.tag == "a" and cls == "match":
if not sport:
continue continue
if not (event_name_elem := card.css_first(".stream-info")): if not (team_elems := node.css(".team")):
continue continue
href = onclick.split(".href=")[-1].replace("'", "") if not (href := node.attributes.get("href")):
continue
event_name = event_name_elem.text(strip=True) event_name = " vs ".join(team.text(strip=True) for team in team_elems)
if f"[{sport}] {event_name} ({TAG})" in cached_keys: if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue continue
@ -83,7 +89,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
{ {
"sport": sport, "sport": sport,
"event": event_name, "event": event_name,
"link": urljoin(f"{html_data.url}", href), "link": href,
} }
) )

View file

@ -18,7 +18,7 @@ API_FILE = Cache(f"{TAG}-api", exp=19_800)
API_MIRRORS = [ API_MIRRORS = [
"https://api.ppv.to/api/streams", "https://api.ppv.to/api/streams",
"https://api.ppv.cx/api/streams", "https://api.ppv.cx/api/streams",
# "https://api.ppv.sh/api/streams", "https://api.ppv.sh/api/streams",
# "https://api.ppv.la/api/streams", # "https://api.ppv.la/api/streams",
] ]

View file

@ -80,7 +80,7 @@ async def process_event(url: str, url_num: int) -> tuple[str | None, str | None]
log.info(f"URL {url_num}) Captured M3U8") log.info(f"URL {url_num}) Captured M3U8")
return match[2], ifr_src return match[2]
async def refresh_api_cache(now_ts: float) -> list[dict[str, Any]]: async def refresh_api_cache(now_ts: float) -> list[dict[str, Any]]:
@ -178,7 +178,7 @@ async def scrape() -> None:
url_num=i, url_num=i,
) )
url, iframe = await network.safe_process( url = await network.safe_process(
handler, handler,
url_num=i, url_num=i,
semaphore=network.PW_S, semaphore=network.PW_S,
@ -198,7 +198,7 @@ async def scrape() -> None:
entry = { entry = {
"url": url, "url": url,
"logo": logo, "logo": logo,
"base": iframe, "base": "https://streamfree.click",
"timestamp": ts, "timestamp": ts,
"id": tvg_id or "Live.Event.us", "id": tvg_id or "Live.Event.us",
"link": link, "link": link,

View file

@ -113,7 +113,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
{ {
"sport": sport, "sport": sport,
"event": event_name, "event": event_name,
"link": urljoin(f"{html_data.url}", href), "link": urljoin(BASE_URL, href),
} }
) )

View file

@ -66,7 +66,7 @@ async def get_events() -> list[dict[str, str]]:
{ {
"sport": sport, "sport": sport,
"event": event_name, "event": event_name,
"link": urljoin(f"{html_data.url}", href), "link": urljoin(BASE_URL, href),
} }
) )

View file

@ -1,22 +1,12 @@
## Base Log @ 2026-04-11 15:01 UTC ## Base Log @ 2026-04-10 15:12 UTC
### ✅ Working Streams: 148<br>❌ Dead Streams: 13 ### ✅ Working Streams: 158<br>❌ Dead Streams: 3
| Channel | Error (Code) | Link | | Channel | Error (Code) | Link |
| ------- | ------------ | ---- | | ------- | ------------ | ---- |
| FDSN Southeast | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/82301.ts` |
| FX Movie Channel | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/39873.ts` | | FX Movie Channel | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/39873.ts` |
| Grit TV | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/15086.ts` | | TV One | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/13010.ts` |
| HBO Family | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/760.ts` |
| Hallmark Family | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/304609.ts` |
| Hallmark Mystery | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/3388.ts` |
| History Channel | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/761.ts` |
| ION TV | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/147661.ts` |
| Investigation Discovery | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/8557.ts` |
| Lifetime | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/4667.ts` |
| Marquee Sports Network | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/150609.ts` |
| YES Network | HTTP Error (404) | `http://23.237.104.106:8080/USA_YES_NETWORK/index.m3u8` | | YES Network | HTTP Error (404) | `http://23.237.104.106:8080/USA_YES_NETWORK/index.m3u8` |
| getTV | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/194187.ts` |
--- ---
#### Base Channels URL #### Base Channels URL
``` ```