Compare commits

..

37 commits

Author SHA1 Message Date
GitHub Actions Bot
13e9afae40 update M3U8 2025-12-19 16:31:11 -05:00
GitHub Actions Bot
5ff97f9f9e update M3U8 2025-12-19 16:01:28 -05:00
GitHub Actions Bot
5fc5966a8e health log 2025-12-19 20:41:44 +00:00
GitHub Actions Bot
c8da651e96 update M3U8 2025-12-19 15:31:33 -05:00
GitHub Actions Bot
82c6dcaba6 update M3U8 2025-12-19 15:03:03 -05:00
GitHub Actions Bot
daa608b252 update M3U8 2025-12-19 14:33:20 -05:00
doms9
00000d94e3 e 2025-12-19 14:05:41 -05:00
GitHub Actions Bot
8ac6ca8360 update M3U8 2025-12-19 14:03:24 -05:00
GitHub Actions Bot
1011010f7f update EPG 2025-12-19 18:57:40 +00:00
GitHub Actions Bot
7ad4ff9b92 update M3U8 2025-12-19 13:32:21 -05:00
doms9
00000d91c7 e
fix watchfooty scraping
2025-12-19 13:25:40 -05:00
GitHub Actions Bot
b4f5824bb5 update M3U8 2025-12-19 13:06:35 -05:00
GitHub Actions Bot
f367691e89 update M3U8 2025-12-19 12:08:12 -05:00
GitHub Actions Bot
7f49e9455b update M3U8 2025-12-19 11:02:12 -05:00
GitHub Actions Bot
26f94e1955 update M3U8 2025-12-19 10:01:06 -05:00
GitHub Actions Bot
7299b8b515 health log 2025-12-19 14:44:25 +00:00
GitHub Actions Bot
7c64ae5fa0 update M3U8 2025-12-19 09:03:08 -05:00
GitHub Actions Bot
50618864f6 update M3U8 2025-12-19 08:02:25 -05:00
GitHub Actions Bot
00db2b8a09 update EPG 2025-12-19 10:53:47 +00:00
GitHub Actions Bot
a208fd261a health log 2025-12-19 08:50:35 +00:00
GitHub Actions Bot
5510f35660 update M3U8 2025-12-18 23:30:56 -05:00
GitHub Actions Bot
b8c0e21b76 update M3U8 2025-12-18 23:00:34 -05:00
GitHub Actions Bot
89147547e5 update EPG 2025-12-19 03:47:51 +00:00
GitHub Actions Bot
8e7d441639 health log 2025-12-19 03:44:17 +00:00
GitHub Actions Bot
cdfc6f869f update M3U8 2025-12-18 22:31:00 -05:00
GitHub Actions Bot
8109c87cac update M3U8 2025-12-18 22:01:13 -05:00
GitHub Actions Bot
724ef867d9 update M3U8 2025-12-18 21:31:21 -05:00
GitHub Actions Bot
bbb40ab59a update M3U8 2025-12-18 21:01:48 -05:00
GitHub Actions Bot
649b9b0a57 update M3U8 2025-12-18 20:31:10 -05:00
GitHub Actions Bot
a12e319702 update M3U8 2025-12-18 20:01:50 -05:00
GitHub Actions Bot
2024e31a55 update M3U8 2025-12-18 19:31:17 -05:00
GitHub Actions Bot
48637fdd30 update M3U8 2025-12-18 19:02:50 -05:00
GitHub Actions Bot
dc0263367e update M3U8 2025-12-18 18:31:07 -05:00
GitHub Actions Bot
db1ac43db7 update M3U8 2025-12-18 18:01:15 -05:00
GitHub Actions Bot
4864cc0ad7 update M3U8 2025-12-18 17:30:23 -05:00
GitHub Actions Bot
dce0e886d6 update M3U8 2025-12-18 17:00:54 -05:00
GitHub Actions Bot
13cb387338 update M3U8 2025-12-18 16:31:22 -05:00
7 changed files with 88874 additions and 91938 deletions

175288
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

@ -57,7 +57,7 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
if not (html_data := await network.request(BASE_URL, log=log)):
return events
pattern = re.compile(r"^(?:LIVE|\d+\s+(minutes?)\b)", re.IGNORECASE)
pattern = re.compile(r"^(?:LIVE|(?:[1-9]|[12]\d|30)\s+minutes?\b)", re.IGNORECASE)
soup = HTMLParser(html_data.content)
@ -67,6 +67,14 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
if not (rank_elem := li_item.css_first(".f1-podium--rank")):
continue
if not (time_elem := li_item.css_first(".SaatZamanBilgisi")):
continue
time_text = time_elem.text(strip=True)
if not pattern.search(time_text):
continue
sport = rank_elem.text(strip=True)
if not (driver_elem := li_item.css_first(".f1-podium--driver")):
@ -83,14 +91,6 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
if not (href := link.attributes.get("href")):
continue
if not (time_elem := li_item.css_first(".SaatZamanBilgisi")):
continue
time_text = time_elem.text(strip=True)
if not pattern.search(time_text):
continue
events.append(
{
"sport": sport,

View file

@ -260,6 +260,19 @@
]
}
},
{
"COPA DEL REY": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/80.png",
"names": [
"KING'S CUP",
"KINGS CUP",
"LA COPA",
"SPAIN COPA DEL REY",
"SPANISH COPA DEL REY",
"SPANISH CUP"
]
}
},
{
"COPA LIBERTADORES": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/58.png",
@ -283,6 +296,12 @@
"names": ["ITALIAN CUP"]
}
},
{
"COUPE DE FRANCE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/182.png",
"names": ["FRANCE CUP", "FRENCH CUP"]
}
},
{
"EFL": {
"logo": "https://i.gyazo.com/c8842fbcb2eeb6a53bc69fa6055b8b5d.png",

View file

@ -17,7 +17,7 @@ TAG = "WATCHFTY"
CACHE_FILE = Cache(f"{TAG.lower()}.json", exp=10_800)
API_FILE = Cache(f"{TAG.lower()}-api.json", exp=28_800)
API_FILE = Cache(f"{TAG.lower()}-api.json", exp=19_800)
API_URL = "https://api.watchfooty.st"
@ -76,6 +76,8 @@ async def process_event(
context: BrowserContext,
) -> str | None:
pattern = re.compile(r"\((\d+)\)")
page = await context.new_page()
captured: list[str] = []
@ -111,18 +113,31 @@ async def process_event(
return
match = re.search(r"\((\d+)\)", text)
if not match or int(match[1]) == 0:
if not (match := pattern.search(text)) or int(match[1]) == 0:
log.warning(f"URL {url_num}) No available stream links.")
return
first_available = await page.wait_for_selector(
'a[href*="/stream/"]', timeout=3_000
)
try:
first_available = await page.wait_for_selector(
'a[href*="/stream/"]',
timeout=3_000,
)
except TimeoutError:
log.warning(f"URL {url_num}) No available stream links.")
await first_available.click()
return
if not (href := await first_available.get_attribute("href")):
log.warning(f"URL {url_num}) No available stream links.")
return
await page.goto(
href,
wait_until="domcontentloaded",
timeout=5_000,
)
wait_task = asyncio.create_task(got_one.wait())

View file

@ -1,11 +1,7 @@
## Base Log @ 2025-12-18 20:40 UTC
## Base Log @ 2025-12-19 20:41 UTC
### ✅ Working Streams: 144<br>❌ Dead Streams: 2
### ✅ Working Streams: 146<br>❌ Dead Streams: 0
| Channel | Error (Code) | Link |
| ------- | ------------ | ---- |
| ESPN U | HTTP Error (403) | `http://cord-cutter.net:8080/30550113/30550113/10255` |
| ION TV | HTTP Error (403) | `http://cord-cutter.net:8080/30550113/30550113/9297` |
---
#### Base Channels URL
```