Compare commits

..

39 commits

Author SHA1 Message Date
GitHub Actions Bot
fe9dbd8ec0 update M3U8 2026-04-11 12:02:31 -04:00
doms9
00000d905b e
- edit scraping for ovogoal.py
- misc edits.
2026-04-11 11:40:47 -04:00
GitHub Actions Bot
6bd8aa9814 update M3U8 2026-04-11 11:03:14 -04:00
GitHub Actions Bot
92a9d6a74d health log 2026-04-11 15:01:27 +00:00
GitHub Actions Bot
6bd98d5d8c update M3U8 2026-04-11 10:04:38 -04:00
GitHub Actions Bot
d00ff8f133 update M3U8 2026-04-11 09:01:55 -04:00
GitHub Actions Bot
f7fdaba9ba update M3U8 2026-04-11 08:09:10 -04:00
GitHub Actions Bot
f0da7ea399 update EPG 2026-04-11 11:06:55 +00:00
GitHub Actions Bot
6c5b2c10e8 health log 2026-04-11 09:06:40 +00:00
GitHub Actions Bot
d81bcc9e13 update EPG 2026-04-11 04:35:08 +00:00
GitHub Actions Bot
9de1f6eafb health log 2026-04-11 04:32:55 +00:00
GitHub Actions Bot
2672274578 update M3U8 2026-04-10 23:30:54 -04:00
GitHub Actions Bot
e41002c5ea update M3U8 2026-04-10 23:00:27 -04:00
GitHub Actions Bot
26c9816c09 update M3U8 2026-04-10 22:30:55 -04:00
doms9
00000d9980 e
- edit domain for ovogoal.py
2026-04-10 22:27:10 -04:00
doms9
00000d9b90 e
- edit domain for cdnlivetv.py
- edit scraping for streamsgate.py
2026-04-10 22:24:03 -04:00
GitHub Actions Bot
a16a34ff4c update M3U8 2026-04-10 22:01:07 -04:00
doms9
00000d9ff3 e
- edit scraping for istreameast.py
2026-04-10 21:59:49 -04:00
GitHub Actions Bot
d9b1e9449c update M3U8 2026-04-10 21:31:17 -04:00
GitHub Actions Bot
8626002f6e update M3U8 2026-04-10 21:01:34 -04:00
GitHub Actions Bot
653ab997a8 update M3U8 2026-04-10 20:32:40 -04:00
GitHub Actions Bot
9a96ef951b update M3U8 2026-04-10 20:01:45 -04:00
GitHub Actions Bot
9f7af15554 update M3U8 2026-04-10 19:31:17 -04:00
GitHub Actions Bot
cd7a2e66b1 update M3U8 2026-04-10 19:03:56 -04:00
GitHub Actions Bot
9d3005faf1 update M3U8 2026-04-10 18:30:46 -04:00
GitHub Actions Bot
759f66efa6 health log 2026-04-10 18:07:04 -04:00
GitHub Actions Bot
bafa30f2a7 update M3U8 2026-04-10 18:01:17 -04:00
GitHub Actions Bot
2fe81e9381 update M3U8 2026-04-10 17:30:46 -04:00
GitHub Actions Bot
3592580ce4 health log 2026-04-10 21:12:19 +00:00
GitHub Actions Bot
816cce004e update M3U8 2026-04-10 17:00:19 -04:00
GitHub Actions Bot
ddf3b91382 update M3U8 2026-04-10 16:30:51 -04:00
GitHub Actions Bot
78fbdd9a1f update M3U8 2026-04-10 16:01:26 -04:00
GitHub Actions Bot
f83d1d7434 update M3U8 2026-04-10 15:31:23 -04:00
GitHub Actions Bot
867fc7402c update M3U8 2026-04-10 15:01:36 -04:00
GitHub Actions Bot
a3aedeb8ad update M3U8 2026-04-10 14:31:16 -04:00
GitHub Actions Bot
6d821bd779 update M3U8 2026-04-10 14:02:07 -04:00
GitHub Actions Bot
881bc3035a update M3U8 2026-04-10 13:35:06 -04:00
GitHub Actions Bot
2b5606e16a update M3U8 2026-04-10 13:01:50 -04:00
GitHub Actions Bot
5e505feea9 update M3U8 2026-04-10 12:01:17 -04:00
14 changed files with 122563 additions and 120307 deletions

File diff suppressed because it is too large Load diff

235744
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
https://stream.decentdoubts.net/803/index.m3u8
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/3377.ts
#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
https://stream.decentdoubts.net/801/index.m3u8
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/1720.ts
#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
https://stream.decentdoubts.net/808/index.m3u8
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/3378.ts
#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
https://stream.decentdoubts.net/805/index.m3u8
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/770.ts
#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
https://stream.decentdoubts.net/806/index.m3u8
http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/771.ts
#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.cdn-live.tv"
API_URL = "https://api.cdnlivetv.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(BASE_URL, href),
"link": urljoin(f"{html_data.url}", href),
"href": href,
}
)

View file

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

View file

@ -1,5 +1,6 @@
import re
from functools import partial
from urllib.parse import urljoin
from selectolax.parser import HTMLParser
@ -13,11 +14,7 @@ TAG = "OVO"
CACHE_FILE = Cache(TAG, exp=28_800)
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()
BASE_URL = "https://ovogoaal.com"
async def process_event(url: str, url_num: int) -> tuple[str | None, str | None]:
@ -64,34 +61,31 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
soup = HTMLParser(html_data.content)
sport = None
sport = "Live Event"
for node in soup.css(".wrapper *"):
if (cls := node.attributes.get("class")) == "section-title":
sport = fix_league(node.text(strip=True))
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
if node.tag == "a" and cls == "match":
if not sport:
continue
if not (event_name_elem := card.css_first(".stream-info")):
continue
if not (team_elems := node.css(".team")):
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:
continue
if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue
events.append(
{
"sport": sport,
"event": event_name,
"link": href,
}
)
events.append(
{
"sport": sport,
"event": event_name,
"link": urljoin(f"{html_data.url}", 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]
return match[2], ifr_src
async def refresh_api_cache(now_ts: float) -> list[dict[str, Any]]:
@ -178,7 +178,7 @@ async def scrape() -> None:
url_num=i,
)
url = await network.safe_process(
url, iframe = 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": "https://streamfree.click",
"base": iframe,
"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(BASE_URL, href),
"link": urljoin(f"{html_data.url}", href),
}
)

View file

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

View file

@ -1,12 +1,22 @@
## Base Log @ 2026-04-10 15:12 UTC
## Base Log @ 2026-04-11 15:01 UTC
### ✅ Working Streams: 158<br>❌ Dead Streams: 3
### ✅ Working Streams: 148<br>❌ Dead Streams: 13
| 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` |
| TV One | HTTP Error (404) | `http://iptvtree.net:8080/live/7e4b0dbd/1dd755dc3f/13010.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` |
| 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
```