Compare commits

..

No commits in common. "26c5e0ec9e2dbb0b24e9a242ddf3c5e72b8acef3" and "4fca45dd52d89987b9634126d16b02cbf3e7d379" have entirely different histories.

6 changed files with 122715 additions and 106118 deletions

File diff suppressed because it is too large Load diff

225846
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

@ -1,4 +1,5 @@
import asyncio import asyncio
import re
from functools import partial from functools import partial
from urllib.parse import urljoin from urllib.parse import urljoin
@ -15,7 +16,7 @@ TAG = "ROXIE"
CACHE_FILE = Cache(TAG, exp=19_800) CACHE_FILE = Cache(TAG, exp=19_800)
BASE_URL = "https://roxiestreams.info" BASE_URL = "https://roxiestreams.su"
SPORT_URLS = { SPORT_URLS = {
# "March Madness": urljoin(BASE_URL, "march-madness"), # "March Madness": urljoin(BASE_URL, "march-madness"),
@ -101,10 +102,18 @@ async def get_events() -> list[dict[str, str]]:
if not (href := a_tag.attributes.get("href")): if not (href := a_tag.attributes.get("href")):
continue continue
if not (event_time_elem := row.css_first("td.event-start-time")): if not (span := row.css_first("span.countdown-timer")) or not (
data_start := span.attributes.get("data-start")
):
continue continue
event_dt = Time.from_str(event_time_elem.text(strip=True), timezone="EST") event_time = (
data_start.rsplit(":", 1)[0]
if (re.search(r"\d+:\d+:\d+", data_start) or "M:00" in data_start)
else data_start
)
event_dt = Time.from_str(event_time, timezone="PST")
if event_dt.date() != now.date(): if event_dt.date() != now.date():
continue continue

View file

@ -2,11 +2,11 @@ import asyncio
import logging import logging
import random import random
import re import re
from collections.abc import AsyncGenerator, Awaitable, Callable from collections.abc import Awaitable, Callable
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from functools import cache, partial from functools import cache, partial
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import AsyncGenerator, TypeVar
from urllib.parse import urlparse from urllib.parse import urlparse
import httpx import httpx
@ -158,7 +158,7 @@ class Network:
browser: Browser, browser: Browser,
stealth: bool = True, stealth: bool = True,
ignore_https: bool = False, ignore_https: bool = False,
) -> AsyncGenerator[BrowserContext]: ) -> AsyncGenerator[BrowserContext, None]:
context: BrowserContext | None = None context: BrowserContext | None = None
@ -195,7 +195,7 @@ class Network:
@staticmethod @staticmethod
@asynccontextmanager @asynccontextmanager
async def event_page(context: BrowserContext) -> AsyncGenerator[Page]: async def event_page(context: BrowserContext) -> AsyncGenerator[Page, None]:
page = await context.new_page() page = await context.new_page()
try: try:

View file

@ -1,11 +1,7 @@
## Base Log @ 2026-06-04 21:59 UTC ## Base Log @ 2026-06-03 23:06 UTC
### ✅ Working Streams: 142<br>❌ Dead Streams: 2 ### ✅ Working Streams: 144<br>❌ Dead Streams: 0
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| BBC America | HTTP Error (403) | `https://bcovlive-a.akamaihd.net/7f5ec16d102f4b5d92e8e27bc95ff424/us-east-1/6240731308001/playlist.m3u8` |
| Lifetime | HTTP Error (403) | `http://cdn1host.online:2999/live/bongus/35zqYxrbg0/148.ts` |
--- ---
#### Base Channels URL #### Base Channels URL
``` ```