Compare commits

...

38 commits

Author SHA1 Message Date
doms9
00000d9d6b e 2026-02-01 23:57:06 -05:00
GitHub Actions Bot
7184f33572 update EPG 2026-02-02 04:48:51 +00:00
GitHub Actions Bot
57cb623fb4 health log 2026-02-02 04:35:51 +00:00
GitHub Actions Bot
506f4084e8 update M3U8 2026-02-01 23:30:58 -05:00
GitHub Actions Bot
96c27bc166 update M3U8 2026-02-01 23:00:27 -05:00
GitHub Actions Bot
7a54d5b0d1 update M3U8 2026-02-01 22:31:10 -05:00
GitHub Actions Bot
6af7330a08 update M3U8 2026-02-01 22:00:47 -05:00
GitHub Actions Bot
8ecf888255 update M3U8 2026-02-01 21:30:57 -05:00
GitHub Actions Bot
1ea227c2bb update M3U8 2026-02-01 21:01:12 -05:00
GitHub Actions Bot
7c990639bb update M3U8 2026-02-01 20:31:16 -05:00
GitHub Actions Bot
29afb54212 update M3U8 2026-02-01 20:01:53 -05:00
GitHub Actions Bot
cf116426ce update M3U8 2026-02-01 19:31:45 -05:00
GitHub Actions Bot
14aaf4ef4a update M3U8 2026-02-01 19:04:19 -05:00
GitHub Actions Bot
90bfcf4616 update M3U8 2026-02-01 18:31:56 -05:00
GitHub Actions Bot
96cefdb5c7 update M3U8 2026-02-01 18:02:59 -05:00
GitHub Actions Bot
0fef2d79f5 update M3U8 2026-02-01 17:31:33 -05:00
GitHub Actions Bot
212831891c update M3U8 2026-02-01 17:02:39 -05:00
GitHub Actions Bot
3d453ee6f9 update M3U8 2026-02-01 16:32:31 -05:00
GitHub Actions Bot
79961bcdcf update M3U8 2026-02-01 16:04:48 -05:00
GitHub Actions Bot
699d99162f health log 2026-02-01 20:49:17 +00:00
GitHub Actions Bot
f2624f4b13 update M3U8 2026-02-01 15:31:26 -05:00
GitHub Actions Bot
b57ef84f92 update M3U8 2026-02-01 15:17:23 -05:00
GitHub Actions Bot
d9959b1ce2 update M3U8 2026-02-01 14:31:55 -05:00
GitHub Actions Bot
35de311dbd update EPG 2026-02-01 19:04:32 +00:00
GitHub Actions Bot
73138a7769 update M3U8 2026-02-01 14:03:14 -05:00
GitHub Actions Bot
b37955913c update M3U8 2026-02-01 13:31:59 -05:00
GitHub Actions Bot
61d0c019ee update M3U8 2026-02-01 13:05:22 -05:00
doms9
00000d99e7 e
edit scraping method for roxie.py
2026-02-01 12:52:05 -05:00
GitHub Actions Bot
825b5e9fd7 update M3U8 2026-02-01 12:07:26 -05:00
GitHub Actions Bot
f0292600ed update M3U8 2026-02-01 11:08:08 -05:00
GitHub Actions Bot
36a4543748 update M3U8 2026-02-01 10:07:55 -05:00
GitHub Actions Bot
2cdfbeb99e health log 2026-02-01 14:51:12 +00:00
GitHub Actions Bot
f12a1f01f8 update M3U8 2026-02-01 09:09:04 -05:00
GitHub Actions Bot
0ee4660e92 update M3U8 2026-02-01 08:07:05 -05:00
GitHub Actions Bot
69a75f162f update EPG 2026-02-01 10:58:49 +00:00
GitHub Actions Bot
02d0c0c92e health log 2026-02-01 08:55:34 +00:00
doms9
00000d91d9 e
update roxie.py base url
2026-02-01 00:38:51 -05:00
GitHub Actions Bot
64fa5490fb update EPG 2026-02-01 04:52:04 +00:00
8 changed files with 190230 additions and 186468 deletions

File diff suppressed because it is too large Load diff

373564
M3U8/TV.xml

File diff suppressed because one or more lines are too long

View file

@ -235,6 +235,7 @@ https://fl1.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8
http://fl1.moveonjoy.com/HBO/index.m3u8
#EXTINF:-1 tvg-chno="79" tvg-id="HBO2.HD.us2" tvg-name="HBO 2" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s68140_dark_360w_270h.png" group-title="TV",HBO 2
#EXTVLCOPT:http-user-agent=curl/8.5.0
http://lucidhosting.xyz:82/sandriassoc@gmail.com/Sm8G4ddxoW/2071
#EXTINF:-1 tvg-chno="80" tvg-id="HBO.Comedy.HD.us2" tvg-name="HBO Comedy" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s59839_dark_360w_270h.png" group-title="TV",HBO Comedy

File diff suppressed because it is too large Load diff

View file

@ -67,9 +67,10 @@ async def main() -> None:
asyncio.create_task(livetvsx.scrape(hdl_brwsr)),
asyncio.create_task(pixel.scrape(hdl_brwsr)),
asyncio.create_task(ppv.scrape(xtrnl_brwsr)),
asyncio.create_task(roxie.scrape(hdl_brwsr)),
asyncio.create_task(sport9.scrape(xtrnl_brwsr)),
asyncio.create_task(streamcenter.scrape(xtrnl_brwsr)),
asyncio.create_task(streamhub.scrape(xtrnl_brwsr)),
# asyncio.create_task(streamhub.scrape(xtrnl_brwsr)),
asyncio.create_task(streamsgate.scrape(xtrnl_brwsr)),
asyncio.create_task(totalsportek.scrape(hdl_brwsr)),
asyncio.create_task(webcast.scrape(hdl_brwsr)),
@ -79,8 +80,7 @@ async def main() -> None:
httpx_tasks = [
asyncio.create_task(fawa.scrape()),
asyncio.create_task(istreameast.scrape()),
asyncio.create_task(pawa.scrape()),
asyncio.create_task(roxie.scrape()),
# asyncio.create_task(pawa.scrape()),
asyncio.create_task(shark.scrape()),
# asyncio.create_task(streambtw.scrape()),
asyncio.create_task(streamfree.scrape()),

View file

@ -1,8 +1,8 @@
import asyncio
import re
from functools import partial
from urllib.parse import urljoin
from playwright.async_api import Browser
from selectolax.parser import HTMLParser
from .utils import Cache, Time, get_logger, leagues, network
@ -17,7 +17,7 @@ CACHE_FILE = Cache(TAG, exp=10_800)
HTML_CACHE = Cache(f"{TAG}-html", exp=19_800)
BASE_URL = "https://roxiestreams.live"
BASE_URL = "https://roxiestreams.info"
SPORT_ENDPOINTS = {
"fighting": "Fighting",
@ -30,25 +30,6 @@ SPORT_ENDPOINTS = {
}
async def process_event(url: str, url_num: int) -> str | None:
if not (html_data := await network.request(url, log=log)):
return
valid_m3u8 = re.compile(
r"showPlayer\(['\"]clappr['\"],\s*['\"]([^'\"]+?\.m3u8(?:\?[^'\"]*)?)['\"]\)",
re.IGNORECASE,
)
if not (match := valid_m3u8.search(html_data.text)):
log.info(f"URL {url_num}) No M3U8 found")
return
log.info(f"URL {url_num}) Captured M3U8")
return match[1]
async def refresh_html_cache(
url: str,
sport: str,
@ -118,8 +99,8 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
live = []
start_ts = now.delta(minutes=-30).timestamp()
end_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():
if k in cached_keys:
@ -133,12 +114,14 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
return live
async def scrape() -> None:
async def scrape(browser: Browser) -> None:
cached_urls = CACHE_FILE.load()
cached_count = len(cached_urls)
valid_urls = {k: v for k, v in cached_urls.items() if v["url"]}
urls.update(cached_urls)
valid_count = cached_count = len(valid_urls)
urls.update(valid_urls)
log.info(f"Loaded {cached_count} event(s) from cache")
@ -149,44 +132,52 @@ async def scrape() -> None:
log.info(f"Processing {len(events)} new URL(s)")
if events:
for i, ev in enumerate(events, start=1):
handler = partial(
process_event,
url=ev["link"],
url_num=i,
)
async with network.event_context(browser) as context:
for i, ev in enumerate(events, start=1):
async with network.event_page(context) as page:
handler = partial(
network.process_event,
url=ev["link"],
url_num=i,
page=page,
log=log,
)
url = await network.safe_process(
handler,
url_num=i,
semaphore=network.HTTP_S,
log=log,
)
url = await network.safe_process(
handler,
url_num=i,
semaphore=network.PW_S,
log=log,
)
if url:
sport, event, ts, link = (
ev["sport"],
ev["event"],
ev["event_ts"],
ev["link"],
)
sport, event, ts, link = (
ev["sport"],
ev["event"],
ev["event_ts"],
ev["link"],
)
tvg_id, logo = leagues.get_tvg_info(sport, event)
tvg_id, logo = leagues.get_tvg_info(sport, event)
key = f"[{sport}] {event} ({TAG})"
key = f"[{sport}] {event} ({TAG})"
entry = {
"url": url,
"logo": logo,
"base": BASE_URL,
"timestamp": ts,
"id": tvg_id or "Live.Event.us",
"link": link,
}
entry = {
"url": url,
"logo": logo,
"base": BASE_URL,
"timestamp": ts,
"id": tvg_id or "Live.Event.us",
"link": link,
}
urls[key] = cached_urls[key] = entry
cached_urls[key] = entry
if new_count := len(cached_urls) - cached_count:
if url:
valid_count += 1
urls[key] = entry
if new_count := valid_count - cached_count:
log.info(f"Collected and cached {new_count} new event(s)")
else:

View file

@ -317,8 +317,6 @@ class Network:
finally:
page.remove_listener("request", handler)
await page.close()
network = Network()

View file

@ -1,22 +1,13 @@
## Base Log @ 2026-02-01 04:41 UTC
## Base Log @ 2026-02-02 04:35 UTC
### ✅ Working Streams: 133<br>❌ Dead Streams: 13
### ✅ Working Streams: 142<br>❌ Dead Streams: 4
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| Disney | HTTP Error (404) | `https://fl1.moveonjoy.com/DISNEY/index.m3u8` |
| HBO 2 | HTTP Error (000) | `http://lucidhosting.xyz:82/sandriassoc@gmail.com/Sm8G4ddxoW/2071` |
| HBO Family | HTTP Error (404) | `https://fl1.moveonjoy.com/HBO_FAMILY/index.m3u8` |
| Hallmark Family | HTTP Error (000) | `https://fl1.moveonjoy.com/HALLMARK_DRAMA/index.m3u8` |
| Nicktoons | HTTP Error (000) | `http://fl1.moveonjoy.com/NICKTOONS/index.m3u8` |
| Ovation | HTTP Error (404) | `https://fl1.moveonjoy.com/Ovation/index.m3u8` |
| Oxygen | HTTP Error (000) | `https://fl1.moveonjoy.com/OXYGEN/index.m3u8` |
| Paramount Network | HTTP Error (000) | `https://fl1.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8` |
| Pop TV | HTTP Error (000) | `https://fl1.moveonjoy.com/Pop_TV/index.m3u8` |
| Sportsnet One | HTTP Error (403) | `http://mytvstream.net:8080/live/30550113/30550113/57297.m3u8` |
| TV Land | HTTP Error (000) | `https://fl1.moveonjoy.com/TV_LAND/index.m3u8` |
| TV One | HTTP Error (000) | `https://fl1.moveonjoy.com/TV_ONE/index.m3u8` |
| Vice TV | HTTP Error (000) | `https://fl1.moveonjoy.com/VICELAND/index.m3u8` |
| HLN TV | HTTP Error (000) | `https://turnerlive.warnermediacdn.com/hls/live/586496/cnngo/hln/VIDEO_0_3564000.m3u8` |
| Premier Sports 2 | HTTP Error (000) | `http://hardcoremedia.xyz:80/NW3Vk7xXwW/8375773282/117038` |
| Sony Movie Channel | HTTP Error (404) | `http://fl1.moveonjoy.com/Sony_Movie_Channel/index.m3u8` |
---
#### Base Channels URL
```