Compare commits

...

35 commits

Author SHA1 Message Date
GitHub Actions Bot
41bf21c362 update M3U8 2026-01-20 21:31:30 -05:00
GitHub Actions Bot
8937550b20 update M3U8 2026-01-20 21:04:00 -05:00
GitHub Actions Bot
93049e14f0 update M3U8 2026-01-20 20:32:47 -05:00
GitHub Actions Bot
22f25f073c update M3U8 2026-01-20 20:03:13 -05:00
GitHub Actions Bot
77644b363f update M3U8 2026-01-20 19:32:38 -05:00
GitHub Actions Bot
1d5058bf3f update M3U8 2026-01-20 19:11:20 -05:00
GitHub Actions Bot
167dc02505 update M3U8 2026-01-20 18:31:51 -05:00
GitHub Actions Bot
ae1a2a208d update M3U8 2026-01-20 18:01:03 -05:00
GitHub Actions Bot
72c9e237dd health log 2026-01-20 17:41:26 -05:00
GitHub Actions Bot
668cdbce49 update M3U8 2026-01-20 17:31:04 -05:00
GitHub Actions Bot
6d11c3a718 update M3U8 2026-01-20 17:01:00 -05:00
GitHub Actions Bot
e9ba7a12c3 update M3U8 2026-01-20 16:01:37 -05:00
GitHub Actions Bot
fc26338707 health log 2026-01-20 20:52:50 +00:00
GitHub Actions Bot
89326bdb0b update M3U8 2026-01-20 15:31:36 -05:00
doms9
00000d9553 e
parse 'important games' section for totalsportek.py
2026-01-20 15:18:17 -05:00
GitHub Actions Bot
0b7a4b1ae5 update M3U8 2026-01-20 15:06:35 -05:00
GitHub Actions Bot
0ae14f9b2a update EPG 2026-01-20 19:54:35 +00:00
GitHub Actions Bot
04811d2ee4 update M3U8 2026-01-20 14:32:50 -05:00
GitHub Actions Bot
90c13547a9 update M3U8 2026-01-20 14:01:56 -05:00
GitHub Actions Bot
46bee60a5c update M3U8 2026-01-20 13:31:28 -05:00
GitHub Actions Bot
e44a56ea4f update M3U8 2026-01-20 13:02:58 -05:00
GitHub Actions Bot
ea55512be0 update M3U8 2026-01-20 12:03:17 -05:00
GitHub Actions Bot
975301418c update M3U8 2026-01-20 11:01:52 -05:00
GitHub Actions Bot
d5c6736aca update M3U8 2026-01-20 10:01:50 -05:00
GitHub Actions Bot
05c22b7370 health log 2026-01-20 14:55:33 +00:00
GitHub Actions Bot
08644950bd update M3U8 2026-01-20 09:02:11 -05:00
GitHub Actions Bot
a293df41f4 update M3U8 2026-01-20 08:02:07 -05:00
GitHub Actions Bot
707b73cba6 update EPG 2026-01-20 10:59:51 +00:00
GitHub Actions Bot
57e6854e48 health log 2026-01-20 08:55:39 +00:00
GitHub Actions Bot
e86551658d update M3U8 2026-01-19 23:32:56 -05:00
GitHub Actions Bot
3b26d1c16e update M3U8 2026-01-19 23:01:39 -05:00
GitHub Actions Bot
5607d3609b update EPG 2026-01-20 03:59:28 +00:00
GitHub Actions Bot
f10202e8dd health log 2026-01-20 03:54:42 +00:00
GitHub Actions Bot
83bc47e487 update M3U8 2026-01-19 22:30:46 -05:00
GitHub Actions Bot
9ca80b6206 update M3U8 2026-01-19 22:03:00 -05:00
8 changed files with 88485 additions and 86592 deletions

167420
EPG/TV.xml

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -64,7 +64,7 @@ async def main() -> None:
asyncio.create_task(roxie.scrape()),
asyncio.create_task(shark.scrape()),
asyncio.create_task(sport9.scrape()),
asyncio.create_task(streambtw.scrape()),
# asyncio.create_task(streambtw.scrape()),
asyncio.create_task(streamcenter.scrape()),
asyncio.create_task(streamfree.scrape()),
asyncio.create_task(streamhub.scrape()),

View file

@ -18,7 +18,7 @@ API_FILE = Cache(f"{TAG.lower()}-api.json", exp=28_800)
MIRRORS = [
"https://streami.su",
"https://streamed.st",
# "https://streamed.st",
"https://streamed.pk",
]

View file

@ -1,6 +1,6 @@
import re
from functools import partial
from urllib.parse import urljoin
from urllib.parse import urljoin, urlparse
from selectolax.parser import HTMLParser
@ -26,7 +26,9 @@ MIRRORS = [
]
def fix_league(s: str) -> str:
def fix_txt(s: str) -> str:
s = " ".join(s.split())
return s.upper() if s.islower() else s
@ -34,9 +36,9 @@ async def process_event(href: str, url_num: int) -> tuple[str | None, str | None
valid_m3u8 = re.compile(r'var\s+(\w+)\s*=\s*"([^"]*)"', re.IGNORECASE)
for x, mirror in enumerate(MIRRORS, start=1):
base = mirror["base"]
base: str = mirror["base"]
hex_decode = mirror["hex_decode"]
hex_decode: bool = mirror["hex_decode"]
url = urljoin(base, href)
@ -61,11 +63,10 @@ async def process_event(href: str, url_num: int) -> tuple[str | None, str | None
log.warning(f"M{x} | URL {url_num}) No Clappr source found.")
continue
raw = match[2]
raw: str = match[2]
try:
m3u8_url = bytes.fromhex(raw).decode("utf-8") if hex_decode else raw
except Exception as e:
log.warning(f"M{x} | URL {url_num}) Decoding failed: {e}")
continue
@ -75,10 +76,7 @@ async def process_event(href: str, url_num: int) -> tuple[str | None, str | None
return m3u8_url, iframe_src
else:
log.warning(f"M{x} | URL {url_num}) No M3U8 found")
return None, None
log.warning(f"M{x} | URL {url_num}) No M3U8 found")
return None, None
@ -93,41 +91,42 @@ async def get_events(url: str, cached_keys: list[str]) -> list[dict[str, str]]:
sport = "Live Event"
for box in soup.css(".div-main-box"):
for node in box.iter():
if not (node_class := node.attributes.get("class")):
continue
for node in soup.css("a"):
if not node.attributes.get("class"):
continue
if "my-1" in node_class:
if span := node.css_first("span"):
sport = span.text(strip=True)
if (parent := node.parent) and "my-1" in parent.attributes.get("class", ""):
if span := node.css_first("span"):
sport = span.text(strip=True)
if node.tag == "a" and "nav-link2" in node_class:
if not (time_node := node.css_first(".col-3")):
continue
sport = fix_txt(sport)
if time_node.text(strip=True) != "MatchStarted":
continue
if not (teams := [t.text(strip=True) for t in node.css(".col-7 .col-12")]):
continue
if not (href := node.attributes.get("href")) or href.startswith("http"):
continue
if not (href := node.attributes.get("href")):
continue
sport = fix_league(sport)
href = urlparse(href).path if href.startswith("http") else href
teams = [t.text(strip=True) for t in node.css(".col-7 .col-12")]
if not (time_node := node.css_first(".col-3 span")):
continue
event_name = " vs ".join(teams)
if time_node.text(strip=True) != "MatchStarted":
continue
if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue
event_name = fix_txt(" vs ".join(teams))
events.append(
{
"sport": sport,
"event": event_name,
"href": href,
}
)
if f"[{sport}] {event_name} ({TAG})" in cached_keys:
continue
events.append(
{
"sport": sport,
"event": event_name,
"href": href,
}
)
return events

View file

@ -216,6 +216,7 @@
"CHAMPIONSHIP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/24.png",
"names": [
"ENGLAND CHAMPIONSHIP",
"ENGLISH CHAMPIONSHIP",
"ENGLISH FOOTBALL LEAGUE CHAMPIONSHIP",
"ENGLISH LEAGUE CHAMPIONSHIP",
@ -324,6 +325,7 @@
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/25.png",
"names": [
"ENGLISH FOOTBALL LEAGUE ONE",
"ENGLISH LEAGUE ONE",
"LEAGUE ONE",
"SKY BET LEAGUE ONE"
]
@ -334,6 +336,7 @@
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/26.png",
"names": [
"ENGLISH FOOTBALL LEAGUE TWO",
"ENGLISH LEAGUE TWO",
"LEAGUE TWO",
"SKY BET LEAGUE TWO"
]
@ -680,7 +683,7 @@
{
"UEFA CHAMPIONS LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2.png",
"names": ["CHAMPIONS LEAGUE", "UCL"]
"names": ["CHAMPIONS LEAGUE", "EUROPE UEFA CHAMPIONS LEAGUE", "UCL"]
}
},
{

View file

@ -1,10 +1,13 @@
## Base Log @ 2026-01-19 20:43 UTC
## Base Log @ 2026-01-20 22:40 UTC
### ✅ Working Streams: 144<br>❌ Dead Streams: 1
### ✅ Working Streams: 141<br>❌ Dead Streams: 4
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| Premier Sports 2 | Unknown status (302) | `http://hardcoremedia.xyz:80/NW3Vk7xXwW/8375773282/117038` |
| ESPN | HTTP Error (404) | `http://41.205.93.154/ESPN/index.m3u8` |
| FDSN Florida | HTTP Error (403) | `http://mytvstream.net:8080/live/A1Jay5/362586/46794.m3u8` |
| NBC Sports Bay Area | Unknown status (302) | `http://hardcoremedia.xyz:80/NW3Vk7xXwW/8375773282/257216` |
| Premier Sports 2 | HTTP Error (502) | `http://hardcoremedia.xyz:80/NW3Vk7xXwW/8375773282/117038` |
---
#### Base Channels URL
```