mirror of
https://github.com/doms9/iptv.git
synced 2026-03-07 11:18:25 +01:00
Compare commits
35 commits
b9b5681a28
...
41bf21c362
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41bf21c362 | ||
|
|
8937550b20 | ||
|
|
93049e14f0 | ||
|
|
22f25f073c | ||
|
|
77644b363f | ||
|
|
1d5058bf3f | ||
|
|
167dc02505 | ||
|
|
ae1a2a208d | ||
|
|
72c9e237dd | ||
|
|
668cdbce49 | ||
|
|
6d11c3a718 | ||
|
|
e9ba7a12c3 | ||
|
|
fc26338707 | ||
|
|
89326bdb0b | ||
|
|
00000d9553 | ||
|
|
0b7a4b1ae5 | ||
|
|
0ae14f9b2a | ||
|
|
04811d2ee4 | ||
|
|
90c13547a9 | ||
|
|
46bee60a5c | ||
|
|
e44a56ea4f | ||
|
|
ea55512be0 | ||
|
|
975301418c | ||
|
|
d5c6736aca | ||
|
|
05c22b7370 | ||
|
|
08644950bd | ||
|
|
a293df41f4 | ||
|
|
707b73cba6 | ||
|
|
57e6854e48 | ||
|
|
e86551658d | ||
|
|
3b26d1c16e | ||
|
|
5607d3609b | ||
|
|
f10202e8dd | ||
|
|
83bc47e487 | ||
|
|
9ca80b6206 |
8 changed files with 88485 additions and 86592 deletions
167420
EPG/TV.xml
167420
EPG/TV.xml
File diff suppressed because one or more lines are too long
3784
M3U8/TV.m3u8
3784
M3U8/TV.m3u8
File diff suppressed because it is too large
Load diff
3784
M3U8/events.m3u8
3784
M3U8/events.m3u8
File diff suppressed because it is too large
Load diff
|
|
@ -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()),
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue