Compare commits

...

35 commits

Author SHA1 Message Date
GitHub Actions Bot
011230fc0f update M3U8 2026-05-14 17:01:14 -04:00
GitHub Actions Bot
0ea79adf8e update M3U8 2026-05-14 16:30:47 -04:00
GitHub Actions Bot
c877f6365f update EPG 2026-05-14 20:19:00 +00:00
GitHub Actions Bot
d79c0b9d79 update M3U8 2026-05-14 16:01:25 -04:00
GitHub Actions Bot
55bef4b3ab update M3U8 2026-05-14 15:30:39 -04:00
GitHub Actions Bot
b98fd50b82 update M3U8 2026-05-14 15:01:09 -04:00
GitHub Actions Bot
3b48bb0d93 update M3U8 2026-05-14 14:30:37 -04:00
GitHub Actions Bot
412de8de19 update M3U8 2026-05-14 14:00:57 -04:00
GitHub Actions Bot
e19921233f update M3U8 2026-05-14 13:00:50 -04:00
GitHub Actions Bot
a90655de47 health log 2026-05-14 16:25:59 +00:00
GitHub Actions Bot
b7fd1d6893 update M3U8 2026-05-14 12:00:45 -04:00
GitHub Actions Bot
42d85811e5 update M3U8 2026-05-14 11:01:00 -04:00
GitHub Actions Bot
486994d1ab update M3U8 2026-05-14 10:00:26 -04:00
GitHub Actions Bot
fcd4240269 update M3U8 2026-05-14 09:00:51 -04:00
GitHub Actions Bot
32e592c1af update EPG 2026-05-14 12:17:47 +00:00
GitHub Actions Bot
a320eadfc4 update M3U8 2026-05-14 08:01:18 -04:00
GitHub Actions Bot
679ab4dd53 health log 2026-05-14 10:42:23 +00:00
GitHub Actions Bot
f2810b3880 update EPG 2026-05-14 06:04:15 +00:00
GitHub Actions Bot
9e740ff533 health log 2026-05-14 06:02:16 +00:00
GitHub Actions Bot
8429e7f4b9 update M3U8 2026-05-13 23:30:51 -04:00
GitHub Actions Bot
2755c39852 update M3U8 2026-05-13 23:00:29 -04:00
GitHub Actions Bot
8983a1fbf7 update M3U8 2026-05-13 22:30:57 -04:00
GitHub Actions Bot
6cfc15c57a update M3U8 2026-05-13 22:01:27 -04:00
doms9
00000d9ad8 e
- add dami.py
2026-05-13 21:41:14 -04:00
GitHub Actions Bot
1291aa98b4 update M3U8 2026-05-13 21:30:42 -04:00
GitHub Actions Bot
73489178a2 update M3U8 2026-05-13 21:00:52 -04:00
GitHub Actions Bot
9ab113c4d7 update M3U8 2026-05-13 20:31:10 -04:00
GitHub Actions Bot
22dc68dd97 update M3U8 2026-05-13 20:00:37 -04:00
GitHub Actions Bot
4b9df500d8 update M3U8 2026-05-13 19:32:51 -04:00
GitHub Actions Bot
61e0562c1c update M3U8 2026-05-13 19:00:45 -04:00
GitHub Actions Bot
db861084ca update M3U8 2026-05-13 18:31:12 -04:00
GitHub Actions Bot
c4aab8d5b9 update M3U8 2026-05-13 18:00:40 -04:00
GitHub Actions Bot
881c367b29 health log 2026-05-13 21:51:58 +00:00
GitHub Actions Bot
7e8aaba0a5 update M3U8 2026-05-13 17:30:17 -04:00
GitHub Actions Bot
e29cc712f9 update M3U8 2026-05-13 17:00:55 -04:00
6 changed files with 120416 additions and 126522 deletions

File diff suppressed because it is too large Load diff

243052
M3U8/TV.xml

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -6,6 +6,7 @@ from pathlib import Path
from playwright.async_api import async_playwright
from scrapers import (
cdnlivetv,
dami,
embedhd,
fawa,
fsports,
@ -65,6 +66,7 @@ async def main() -> None:
]
httpx_tasks = [
# asyncio.create_task(dami.scrape()),
asyncio.create_task(fawa.scrape()),
asyncio.create_task(istreameast.scrape()),
asyncio.create_task(mainportal.scrape()),
@ -93,6 +95,7 @@ async def main() -> None:
additions = (
cdnlivetv.urls
| dami.urls
| embedhd.urls
| fawa.urls
| fsports.urls

80
M3U8/scrapers/dami.py Normal file
View file

@ -0,0 +1,80 @@
from .utils import Cache, Time, get_logger, leagues, network
log = get_logger(__name__)
urls: dict[str, dict[str, str | float]] = {}
TAG = "DAMI"
CACHE_FILE = Cache(TAG, exp=28_800)
API_URL = "https://api.ppv.to/api/streams"
# "https://api.ppv.cx/api/streams"
# "https://api.ppv.sh/api/streams"
async def get_events() -> dict[str, dict[str, str | float]]:
now = Time.clean(Time.now())
events = {}
if not (r := await network.request(API_URL, log=log)):
return events
api_data: dict[str, dict] = r.json()
for stream_group in api_data.get("streams", []):
sport = stream_group["category"]
if sport == "24/7 Streams":
continue
for event in stream_group.get("streams", []):
name = event.get("name")
start_ts = event.get("starts_at")
logo = event.get("poster")
uri_name = event.get("uri_name")
if not (name and start_ts and uri_name):
continue
event_dt = Time.from_ts(start_ts)
if event_dt.date() != now.date():
continue
key = f"[{sport}] {name} ({TAG})"
tvg_id, pic = leagues.get_tvg_info(sport, name)
events[key] = {
"url": f"https://dami-tv.pro/live-hls/channel/{uri_name}/playlist.m3u8",
"logo": logo or pic,
"base": f"https://dami-tv.pro/player/auto/?match={uri_name}",
"timestamp": now.timestamp(),
"id": tvg_id or "Live.Event.us",
}
return events
async def scrape() -> None:
if cached_urls := CACHE_FILE.load():
urls.update(cached_urls)
log.info(f"Loaded {len(urls)} event(s) from cache")
return
log.info(f'Scraping from "{API_URL}"')
events = await get_events()
urls.update(events)
log.info(f"Collected and cached {len(urls)} event(s)")
CACHE_FILE.write(urls)

View file

@ -1,10 +1,7 @@
## Base Log @ 2026-05-13 16:40 UTC
## Base Log @ 2026-05-14 16:25 UTC
### ✅ Working Streams: 159<br>❌ Dead Streams: 1
### ✅ Working Streams: 160<br>❌ Dead Streams: 0
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| FDSN Midwest | HTTP Error (403) | `http://realsport.scalecdn.co:8080/live/supersonicstreams/cUewZolveU8Jh18jk34BDJ/3784.ts` |
---
#### Base Channels URL
```