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

235226
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
#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
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
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
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
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
#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
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
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)
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(fsports.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(listapreta.scrape()),
asyncio.create_task(mainportal.scrape()),
asyncio.create_task(ovogoal.scrape()),
# asyncio.create_task(ovogoal.scrape()),
asyncio.create_task(pawa.scrape()),
asyncio.create_task(shark.scrape()),
asyncio.create_task(streamcenter.scrape()),
# asyncio.create_task(streamhub.scrape()),
asyncio.create_task(streamsgate.scrape()),
# asyncio.create_task(streamsgate.scrape()),
asyncio.create_task(streamtpnew.scrape()),
asyncio.create_task(totalsportek.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_URL = "https://api.cdnlivetv.tv"
API_URL = "https://api.cdn-live.tv"
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,
"event": clean_event.sub("", event_name),
"link": urljoin(f"{html_data.url}", href),
"link": urljoin(BASE_URL, href),
"href": href,
}
)

View file

@ -1,3 +1,4 @@
import base64
import re
from functools import partial
@ -16,36 +17,39 @@ CACHE_FILE = Cache(TAG, exp=10_800)
BASE_URL = "https://istreameast.app"
async def process_event(url: str, url_num: int) -> tuple[str | None, str | None]:
nones = None, None
async def process_event(url: str, url_num: int) -> str | None:
if not (event_data := await network.request(url, log=log)):
log.warning(f"URL {url_num}) Failed to load url.")
return nones
return
soup = HTMLParser(event_data.content)
if not (iframe := soup.css_first("iframe#wp_player")):
log.warning(f"URL {url_num}) No iframe element found.")
return nones
return
if not (iframe_src := iframe.attributes.get("src")):
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)):
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)):
log.warning(f"URL {url_num}) No Clappr source found.")
return nones
return
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]]:
@ -120,7 +124,7 @@ async def scrape() -> None:
url_num=i,
)
url, iframe = await network.safe_process(
url = await network.safe_process(
handler,
url_num=i,
semaphore=network.HTTP_S,
@ -136,7 +140,7 @@ async def scrape() -> None:
entry = {
"url": url,
"logo": logo,
"base": iframe,
"base": "https://gooz.aapmains.net",
"timestamp": now.timestamp(),
"id": tvg_id or "Live.Event.us",
"link": link,

View file

@ -1,6 +1,5 @@
import re
from functools import partial
from urllib.parse import urljoin
from selectolax.parser import HTMLParser
@ -14,7 +13,11 @@ TAG = "OVO"
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]:
@ -61,31 +64,34 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
soup = HTMLParser(html_data.content)
sport = "Live Event"
sport = None
for card in soup.css(".main-content .stream-row"):
if (not (watch_btn_elem := card.css_first(".watch-btn"))) or (
not (onclick := watch_btn_elem.attributes.get("onclick"))
):
continue
for node in soup.css(".wrapper *"):
if (cls := node.attributes.get("class")) == "section-title":
sport = fix_league(node.text(strip=True))
if not (event_name_elem := card.css_first(".stream-info")):
continue
if node.tag == "a" and cls == "match":
if not sport:
continue
href = onclick.split(".href=")[-1].replace("'", "")
if not (team_elems := node.css(".team")):
continue
event_name = event_name_elem.text(strip=True)
if not (href := node.attributes.get("href")):
continue
if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue
event_name = " vs ".join(team.text(strip=True) for team in team_elems)
events.append(
{
"sport": sport,
"event": event_name,
"link": urljoin(f"{html_data.url}", href),
}
)
if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue
events.append(
{
"sport": sport,
"event": event_name,
"link": href,
}
)
return events

View file

@ -18,7 +18,7 @@ API_FILE = Cache(f"{TAG}-api", exp=19_800)
API_MIRRORS = [
"https://api.ppv.to/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",
]

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")
return match[2], ifr_src
return match[2]
async def refresh_api_cache(now_ts: float) -> list[dict[str, Any]]:
@ -178,7 +178,7 @@ async def scrape() -> None:
url_num=i,
)
url, iframe = await network.safe_process(
url = await network.safe_process(
handler,
url_num=i,
semaphore=network.PW_S,
@ -198,7 +198,7 @@ async def scrape() -> None:
entry = {
"url": url,
"logo": logo,
"base": iframe,
"base": "https://streamfree.click",
"timestamp": ts,
"id": tvg_id or "Live.Event.us",
"link": link,

View file

@ -113,7 +113,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
{
"sport": sport,
"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,
"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 |
| ------- | ------------ | ---- |
| 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` |
| Grit TV | HTTP Timeout (408) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/15086.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` |
| TV One | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/13010.ts` |
| 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
```