Compare commits

...

37 commits

Author SHA1 Message Date
GitHub Actions Bot
e66d6b169b update M3U8 2025-12-17 16:01:00 -05:00
GitHub Actions Bot
52974d3fad health log 2025-12-17 20:44:54 +00:00
GitHub Actions Bot
82fcffd971 update M3U8 2025-12-17 15:31:34 -05:00
GitHub Actions Bot
bb8ef7fb17 update M3U8 2025-12-17 15:01:46 -05:00
GitHub Actions Bot
0be25caaea update M3U8 2025-12-17 14:31:54 -05:00
GitHub Actions Bot
49a237cc77 update M3U8 2025-12-17 14:03:12 -05:00
GitHub Actions Bot
cece243fe2 update EPG 2025-12-17 19:00:01 +00:00
GitHub Actions Bot
2cb8aef441 update M3U8 2025-12-17 13:31:42 -05:00
GitHub Actions Bot
847bbfa63c update M3U8 2025-12-17 13:03:26 -05:00
GitHub Actions Bot
56df008768 update M3U8 2025-12-17 12:03:17 -05:00
GitHub Actions Bot
52ec238ef5 update M3U8 2025-12-17 11:01:50 -05:00
GitHub Actions Bot
f5ebd0162e update M3U8 2025-12-17 10:01:04 -05:00
GitHub Actions Bot
97edd62d70 health log 2025-12-17 14:47:45 +00:00
GitHub Actions Bot
bbf8c209b5 update M3U8 2025-12-17 09:01:01 -05:00
GitHub Actions Bot
ecde6ed76f update M3U8 2025-12-17 08:01:47 -05:00
GitHub Actions Bot
b39016131a update EPG 2025-12-17 10:54:57 +00:00
GitHub Actions Bot
483488b8f8 health log 2025-12-17 08:52:32 +00:00
GitHub Actions Bot
1a21e7f30a update M3U8 2025-12-16 23:30:54 -05:00
GitHub Actions Bot
e0e2202086 update M3U8 2025-12-16 23:00:29 -05:00
GitHub Actions Bot
25c58ae488 update EPG 2025-12-17 03:44:16 +00:00
GitHub Actions Bot
7a05667d58 health log 2025-12-17 03:41:36 +00:00
GitHub Actions Bot
5446c93373 update M3U8 2025-12-16 22:31:07 -05:00
GitHub Actions Bot
36c8daf623 update M3U8 2025-12-16 22:01:35 -05:00
GitHub Actions Bot
d30051afd7 update M3U8 2025-12-16 21:30:40 -05:00
GitHub Actions Bot
556b7b0758 update M3U8 2025-12-16 21:01:13 -05:00
doms9
00000d998e e 2025-12-16 20:39:52 -05:00
GitHub Actions Bot
ad80c3c982 update M3U8 2025-12-16 20:31:15 -05:00
doms9
00000d9bce e 2025-12-16 20:28:51 -05:00
GitHub Actions Bot
3944fc8516 update M3U8 2025-12-16 20:01:29 -05:00
GitHub Actions Bot
3d8fcafbf1 update M3U8 2025-12-16 19:31:14 -05:00
GitHub Actions Bot
df9073350b update M3U8 2025-12-16 19:03:08 -05:00
GitHub Actions Bot
ca2cf91794 update M3U8 2025-12-16 18:31:25 -05:00
GitHub Actions Bot
ba8dada65c update M3U8 2025-12-16 18:01:25 -05:00
GitHub Actions Bot
6e72f491ca update M3U8 2025-12-16 17:30:26 -05:00
GitHub Actions Bot
1201fed9ab update M3U8 2025-12-16 17:01:01 -05:00
GitHub Actions Bot
769689a664 update M3U8 2025-12-16 16:30:46 -05:00
GitHub Actions Bot
876806d401 health log 2025-12-16 16:08:47 -05:00
13 changed files with 90265 additions and 89853 deletions

176659
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

@ -113,7 +113,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.now().timestamp()
now = Time.clean(Time.now()).timestamp()
for i, ev in enumerate(events, start=1):
handler = partial(

View file

@ -111,7 +111,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.now().timestamp()
now = Time.clean(Time.now()).timestamp()
async with async_playwright() as p:
browser, context = await network.browser(p)

View file

@ -118,7 +118,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
now = Time.now().timestamp()
now = Time.clean(Time.now()).timestamp()
async with async_playwright() as p:
browser, context = await network.browser(p, browser="brave")

View file

@ -32,7 +32,7 @@ async def get_events(client: httpx.AsyncClient) -> dict[str, dict[str, str | flo
events = {}
now = Time.now().timestamp()
now = Time.clean(Time.now()).timestamp()
for streams in api_data.get("streams", {}).values():
if not streams:

View file

@ -141,7 +141,7 @@ async def get_events(
live = []
start_ts = now.delta(minutes=-30).timestamp()
start_ts = now.delta(hours=-1).timestamp()
end_ts = now.delta(minutes=5).timestamp()
for k, v in events.items():
@ -158,9 +158,8 @@ async def get_events(
async def scrape(client: httpx.AsyncClient) -> None:
cached_urls = CACHE_FILE.load()
valid_urls = {k: v for k, v in cached_urls.items() if v["url"]}
valid_count = cached_count = len(valid_urls)
urls.update(valid_urls)
cached_count = len(cached_urls)
urls.update(cached_urls)
log.info(f"Loaded {cached_count} event(s) from cache")
@ -172,7 +171,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
if events:
async with async_playwright() as p:
browser, context = await network.browser(p)
browser, context = await network.browser(p, browser="brave")
for i, ev in enumerate(events, start=1):
handler = partial(
@ -190,6 +189,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
log=log,
)
if url:
sport, event, logo, link, ts = (
ev["sport"],
ev["event"],
@ -211,15 +211,11 @@ async def scrape(client: httpx.AsyncClient) -> None:
"link": link,
}
cached_urls[key] = entry
if url:
valid_count += 1
urls[key] = entry
urls[key] = cached_urls[key] = entry
await browser.close()
if new_count := valid_count - cached_count:
if new_count := len(cached_urls) - cached_count:
log.info(f"Collected and cached {new_count} new event(s)")
else:
log.info("No new events found")

View file

@ -94,7 +94,7 @@ async def get_events(
events = []
start_dt = now.delta(minutes=-30)
start_dt = now.delta(hours=-1)
end_dt = now.delta(minutes=5)
for stream_group in api_data:
@ -139,9 +139,8 @@ async def get_events(
async def scrape(client: httpx.AsyncClient) -> None:
cached_urls = CACHE_FILE.load()
valid_urls = {k: v for k, v in cached_urls.items() if v["url"]}
valid_count = cached_count = len(valid_urls)
urls.update(valid_urls)
cached_count = len(cached_urls)
urls.update(cached_urls)
log.info(f"Loaded {cached_count} event(s) from cache")
@ -153,7 +152,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
if events:
async with async_playwright() as p:
browser, context = await network.browser(p)
browser, context = await network.browser(p, browser="brave")
for i, ev in enumerate(events, start=1):
handler = partial(
@ -170,6 +169,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
log=log,
)
if url:
sport, event, ts, link = (
ev["sport"],
ev["event"],
@ -190,15 +190,11 @@ async def scrape(client: httpx.AsyncClient) -> None:
"link": link,
}
cached_urls[key] = entry
if url:
valid_count += 1
urls[key] = entry
urls[key] = cached_urls[key] = entry
await browser.close()
if new_count := valid_count - cached_count:
if new_count := len(cached_urls) - cached_count:
log.info(f"Collected and cached {new_count} new event(s)")
else:
log.info("No new events found")

View file

@ -28,7 +28,7 @@ async def get_data(client: httpx.AsyncClient) -> list[str]:
async def get_events(client: httpx.AsyncClient) -> dict[str, dict[str, str | float]]:
now = Time.now().timestamp()
now = Time.clean(Time.now()).timestamp()
events = {}

View file

@ -72,7 +72,7 @@ async def refresh_api_cache(
for ev in data:
ev["ts"] = ev.pop("timestamp")
data[-1]["timestamp"] = Time.now().timestamp()
data[-1]["timestamp"] = Time.clean(Time.now()).timestamp()
return data

View file

@ -35,7 +35,7 @@ async def refresh_html_cache(
return {}
now = Time.now()
now = Time.clean(Time.now())
soup = HTMLParser(r.content)

111
readme.md
View file

@ -1,103 +1,26 @@
## Base Log @ 2025-12-16 20:43 UTC
## Base Log @ 2025-12-17 20:44 UTC
### ✅ Working Streams: 52<br>❌ Dead Streams: 94
### ✅ Working Streams: 129<br>❌ Dead Streams: 17
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| A&E TV | HTTP Error (404) | `http://fl1.moveonjoy.com/ANE/index.m3u8` |
| ACC Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/9273` |
| AMC | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/18925` |
| Altitude Sports | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/79545` |
| Animal Planet | HTTP Error (404) | `http://fl1.moveonjoy.com/Animal_Planet/index.m3u8` |
| BBC America | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20194` |
| BBC World News | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/139752` |
| BET | HTTP Error (404) | `http://fl1.moveonjoy.com/BET_EAST/index.m3u8` |
| Big Ten Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/9828` |
| Bloomberg TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/15158` |
| Boomerang | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/14741` |
| Bounce TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/48323` |
| CBS Sports Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10454` |
| CBS | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/120749` |
| CW | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/120893` |
| Cartoon Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46708` |
| Comedy Central | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/7466` |
| Comedy TV | HTTP Error (404) | `https://fl1.moveonjoy.com/Comedy_TV/index.m3u8` |
| Comet TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/125831` |
| Cooking Channel | HTTP Error (404) | `https://fl1.moveonjoy.com/COOKING_CHANNEL/index.m3u8` |
| Court TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/21092` |
| Cozi TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/11868` |
| Crime & Investigation Network | HTTP Error (404) | `https://fl1.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8` |
| Discovery Channel | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46720` |
| Discovery Family Channel | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10538` |
| CNBC | HTTP Error (404) | `https://fl1.moveonjoy.com/CNBC/index.m3u8` |
| Discovery Life | HTTP Error (404) | `https://fl1.moveonjoy.com/DISCOVERY_LIFE/index.m3u8` |
| Disney XD | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/75621` |
| Disney | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/2206` |
| ESPN News | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/17707` |
| ESPN U | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10255` |
| ESPN | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/14197` |
| ESPN2 | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/2210` |
| FDSN Detroit | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20936` |
| FDSN Florida | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46794` |
| FDSN Midwest | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/66795` |
| FDSN North | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/58827` |
| FDSN Ohio | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/17752` |
| FDSN Oklahoma | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20934` |
| FDSN SoCal | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/221151` |
| FDSN Southeast | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/81111` |
| FDSN Southwest | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/21843` |
| FDSN Sun | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/104917` |
| FDSN West | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20932` |
| FDSN Wisconsin | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/78599` |
| FX | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46690` |
| FXX | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46699` |
| Food Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/7323` |
| Fox Business | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/17639` |
| Fox News | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/1818` |
| Fox Sports 1 | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/1846` |
| Fox Sports 2 | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/1847` |
| Fox | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/121595` |
| Freeform TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/13370` |
| Game Show Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/120633` |
| HBO | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46713` |
| History Channel | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/15017` |
| ION TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/9297` |
| Investigation Discovery | HTTP Error (404) | `https://fl1.moveonjoy.com/INVESTIGATION_DISCOVERY/index.m3u8` |
| MSG | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/21090` |
| Marquee Sports Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/13379` |
| MotorTrend TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10399` |
| NBC Sports Bay Area | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/9900` |
| NBC Sports Boston | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20939` |
| NBC Sports California | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20940` |
| NBC Sports Philadelphia | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20943` |
| NESN | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/31637` |
| NFL Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/159117` |
| NFL RedZone | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/208830` |
| NewsNation | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/161450` |
| Nickelodeon | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/38` |
| Nicktoons | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/36` |
| Oxygen | HTTP Error (404) | `https://fl1.moveonjoy.com/OXYGEN/index.m3u8` |
| Reelz Channel | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10526` |
| Root Sports | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/85232` |
| SEC Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/17608` |
| Space City Home Network | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/213668` |
| Spectrum SportsNet LA Dodgers | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/31636` |
| Spectrum SportsNet Lakers | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20946` |
| SportsNet New York | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/20938` |
| SportsNet Pittsburgh | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/108178` |
| Sportsnet 360 | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/57299` |
| Sportsnet East | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/57298` |
| Sportsnet One | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10247` |
| Sportsnet Ontario | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/11649` |
| Starz | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/9299` |
| Syfy | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46685` |
| TLC | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/12734` |
| TSN1 | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/57292` |
| TSN2 | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/47442` |
| The Weather Channel | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/18926` |
| USA East | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/10252` |
| Vice TV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/46697` |
| Willow Cricket | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/41979` |
| getTV | HTTP Error (404) | `http://cord-cutter.net:8080/k4Svp2/645504/18366` |
| FDSN Florida | HTTP Error (403) | `http://tv14s.xyz:8080/A1Jay5/362586/46794` |
| FYI TV | HTTP Error (404) | `http://fl1.moveonjoy.com/FYI/index.m3u8` |
| Grit TV | HTTP Error (404) | `http://fl1.moveonjoy.com/GRIT_TV/index.m3u8` |
| HBO 2 | HTTP Error (404) | `http://fl1.moveonjoy.com/HBO_2/index.m3u8` |
| HBO Comedy | HTTP Error (404) | `http://fl1.moveonjoy.com/HBO_COMEDY/index.m3u8` |
| HBO Family | HTTP Error (404) | `https://fl1.moveonjoy.com/HBO_FAMILY/index.m3u8` |
| HBO Zone | HTTP Error (404) | `https://fl1.moveonjoy.com/HBO_ZONE/index.m3u8` |
| MLB Network | HTTP Error (404) | `https://fl1.moveonjoy.com/MLB_NETWORK/index.m3u8` |
| NBA TV | HTTP Error (404) | `http://fl1.moveonjoy.com/NBA_TV/index.m3u8` |
| National Geographic | HTTP Error (404) | `http://fl1.moveonjoy.com/National_Geographic/index.m3u8` |
| Paramount Network | HTTP Error (404) | `https://fl1.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8` |
| Showtime | HTTP Error (404) | `http://fl1.moveonjoy.com/SHOWTIME/index.m3u8` |
| Smithsonian Channel | HTTP Error (404) | `http://fl1.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8` |
| Tennis Channel | HTTP Error (404) | `https://fl1.moveonjoy.com/TENNIS_CHANNEL/index.m3u8` |
---
#### Base Channels URL
```