diff --git a/M3U8/fetch.py b/M3U8/fetch.py index ba5b8b5..af58220 100644 --- a/M3U8/fetch.py +++ b/M3U8/fetch.py @@ -5,10 +5,10 @@ from pathlib import Path import httpx from scrape import fstv, tvpass -m3u8_file = Path(__file__).parent / "TV.m3u8" - base_url = "https://s.id/ePwXT" +m3u8_file = Path(__file__).parent / "TV.m3u8" + client = httpx.AsyncClient( timeout=5, follow_redirects=True, diff --git a/M3U8/scrape/tvpass.json b/M3U8/scrape/tvpass.json index 483111d..1dac901 100644 --- a/M3U8/scrape/tvpass.json +++ b/M3U8/scrape/tvpass.json @@ -1,22 +1,61 @@ -{ - "_timestamp": 1756394172.403869, - "urls": { - "[MLB] Washington Nationals @ New York Yankees": "https://tvpass.org/live/mlb-15/sd", - "[MLB] Atlanta Braves @ Miami Marlins": "https://tvpass.org/live/mlb-07/sd", - "[MLB] Tampa Bay Rays @ Cleveland Guardians": "https://tvpass.org/live/mlb-30/sd", - "[MLB] San Diego Padres @ Seattle Mariners": "https://tvpass.org/live/mlb-10/sd", - "[MLB] Boston Red Sox @ Baltimore Orioles": "https://tvpass.org/live/mlb-17/sd", - "[MLB] Minnesota Twins @ Toronto Blue Jays": "https://tvpass.org/live/mlb-12/sd", - "[MLB] Philadelphia Phillies @ New York Mets": "https://tvpass.org/live/mlb-24/sd", - "[NBATV] Las Vegas Aces @ Atlanta Dream": "https://tvpass.org/live/NBATV/sd", - "[MLB] Kansas City Royals @ Chicago White Sox": "https://tvpass.org/live/mlb-03/sd", - "[MLB] Arizona Diamondbacks @ Milwaukee Brewers": "https://tvpass.org/live/mlb-16/sd", - "[MLB] Pittsburgh Pirates @ St. Louis Cardinals": "https://tvpass.org/live/mlb-08/sd", - "[WNBA] Connecticut Sun @ Dallas Wings": "https://tvpass.org/live/WNBA02/sd", - "[MLB] Los Angeles Angels @ Texas Rangers": "https://tvpass.org/live/mlb-13/sd", - "[MLB] Colorado Rockies @ Houston Astros": "https://tvpass.org/live/mlb-06/sd", - "[MLB] Cincinnati Reds @ Los Angeles Dodgers": "https://tvpass.org/live/mlb-14/sd", - "[MLB] Chicago Cubs @ San Francisco Giants": "https://tvpass.org/live/mlb-27/sd", - "[MLB] Detroit Tigers @ Oakland Athletics": "https://tvpass.org/live/mlb-19/sd" - } -} \ No newline at end of file +{ + "_timestamp": 1756397743.720503, + "urls": { + "[MLB] Boston Red Sox @ Baltimore Orioles (SD)": "https://tvpass.org/live/mlb-17/sd", + "[MLB] Boston Red Sox @ Baltimore Orioles (HD)": "https://tvpass.org/live/mlb-17/hd", + "[MLB] Arizona Diamondbacks @ Milwaukee Brewers (SD)": "https://tvpass.org/live/mlb-16/sd", + "[MLB] Arizona Diamondbacks @ Milwaukee Brewers (HD)": "https://tvpass.org/live/mlb-16/hd", + "[MLB] Colorado Rockies @ Houston Astros (SD)": "https://tvpass.org/live/mlb-06/sd", + "[MLB] Colorado Rockies @ Houston Astros (HD)": "https://tvpass.org/live/mlb-06/hd", + "[MLB] Pittsburgh Pirates @ St. Louis Cardinals (SD)": "https://tvpass.org/live/mlb-08/sd", + "[MLB] Pittsburgh Pirates @ St. Louis Cardinals (HD)": "https://tvpass.org/live/mlb-08/hd", + "[MLB] Chicago Cubs @ San Francisco Giants (SD)": "https://tvpass.org/live/mlb-27/sd", + "[MLB] Chicago Cubs @ San Francisco Giants (HD)": "https://tvpass.org/live/mlb-27/hd", + "[NCAAF] Boise State Broncos @ South Florida Bulls (SD)": "https://tvpass.org/live/ESPN/sd", + "[NCAAF] Boise State Broncos @ South Florida Bulls (HD)": "https://tvpass.org/live/ESPN/hd", + "[NCAAF] Ohio Bobcats @ Rutgers Scarlet Knights (SD)": "https://tvpass.org/live/BTN/sd", + "[NCAAF] Ohio Bobcats @ Rutgers Scarlet Knights (HD)": "https://tvpass.org/live/BTN/hd", + "[NCAAF] Lafayette Leopards @ Bowling Green Falcons (SD)": "https://tvpass.org/live/NCAAF03/sd", + "[NCAAF] Lafayette Leopards @ Bowling Green Falcons (HD)": "https://tvpass.org/live/NCAAF03/hd", + "[MLB] Atlanta Braves @ Philadelphia Phillies (SD)": "https://tvpass.org/live/mlb-18/sd", + "[MLB] Atlanta Braves @ Philadelphia Phillies (HD)": "https://tvpass.org/live/mlb-18/hd", + "[WNBA] Washington Mystics @ New York Liberty (SD)": "https://tvpass.org/live/WNBA01/sd", + "[WNBA] Washington Mystics @ New York Liberty (HD)": "https://tvpass.org/live/WNBA01/hd", + "[NCAAF] Wyoming Cowboys @ Akron Zips (SD)": "https://tvpass.org/live/NCAAF06/sd", + "[NCAAF] Wyoming Cowboys @ Akron Zips (HD)": "https://tvpass.org/live/NCAAF06/hd", + "[NCAAF] East Carolina Pirates @ NC State Wolfpack (SD)": "https://tvpass.org/live/ACCNetwork/sd", + "[NCAAF] East Carolina Pirates @ NC State Wolfpack (HD)": "https://tvpass.org/live/ACCNetwork/hd", + "[NCAAF] St. Francis (PA) Red Flash @ UL Monroe Warhawks (SD)": "https://tvpass.org/live/NCAAF07/sd", + "[NCAAF] St. Francis (PA) Red Flash @ UL Monroe Warhawks (HD)": "https://tvpass.org/live/NCAAF07/hd", + "[NCAAF] Delaware State Hornets @ Delaware Blue Hens (SD)": "https://tvpass.org/live/NCAAF10/sd", + "[NCAAF] Delaware State Hornets @ Delaware Blue Hens (HD)": "https://tvpass.org/live/NCAAF10/hd", + "[NCAAF] Jacksonville State Gamecocks @ UCF Knights (SD)": "https://tvpass.org/live/NCAAF08/sd", + "[NCAAF] Jacksonville State Gamecocks @ UCF Knights (HD)": "https://tvpass.org/live/NCAAF08/hd", + "[MLB] Miami Marlins @ New York Mets (SD)": "https://tvpass.org/live/mlb-24/sd", + "[MLB] Miami Marlins @ New York Mets (HD)": "https://tvpass.org/live/mlb-24/hd", + "[NCAAF] Central Arkansas Bears @ Missouri Tigers (SD)": "https://tvpass.org/live/SECN/sd", + "[NCAAF] Central Arkansas Bears @ Missouri Tigers (HD)": "https://tvpass.org/live/SECN/hd", + "[NCAAF] Elon Phoenix @ Duke Blue Devils (SD)": "https://tvpass.org/live/NCAAF12/sd", + "[NCAAF] Elon Phoenix @ Duke Blue Devils (HD)": "https://tvpass.org/live/NCAAF12/hd", + "[NCAAF] UT Martin Skyhawks @ Oklahoma State Cowboys (SD)": "https://tvpass.org/live/NCAAF14/sd", + "[NCAAF] UT Martin Skyhawks @ Oklahoma State Cowboys (HD)": "https://tvpass.org/live/NCAAF14/hd", + "[MLB] New York Yankees @ Chicago White Sox (SD)": "https://tvpass.org/live/mlb-03/sd", + "[MLB] New York Yankees @ Chicago White Sox (HD)": "https://tvpass.org/live/mlb-03/hd", + "[NCAAF] Buffalo Bulls @ Minnesota Golden Gophers (SD)": "https://tvpass.org/live/FoxSports1/sd", + "[NCAAF] Buffalo Bulls @ Minnesota Golden Gophers (HD)": "https://tvpass.org/live/FoxSports1/hd", + "[NCAAF] Stephen F. Austin Lumberjacks @ Houston Cougars (SD)": "https://tvpass.org/live/NCAAF15/sd", + "[NCAAF] Stephen F. Austin Lumberjacks @ Houston Cougars (HD)": "https://tvpass.org/live/NCAAF15/hd", + "[WNBA] Seattle Storm @ Minnesota Lynx (SD)": "https://tvpass.org/live/WNBA02/sd", + "[WNBA] Seattle Storm @ Minnesota Lynx (HD)": "https://tvpass.org/live/WNBA02/hd", + "[NCAAF] Alabama State Hornets @ UAB Blazers (SD)": "https://tvpass.org/live/NCAAF18/sd", + "[NCAAF] Alabama State Hornets @ UAB Blazers (HD)": "https://tvpass.org/live/NCAAF18/hd", + "[NCAAF] Nebraska Cornhuskers @ Cincinnati Bearcats (SD)": "https://tvpass.org/live/ESPN/sd", + "[NCAAF] Nebraska Cornhuskers @ Cincinnati Bearcats (HD)": "https://tvpass.org/live/ESPN/hd", + "[NCAAF] Miami (OH) RedHawks @ Wisconsin Badgers (SD)": "https://tvpass.org/live/BTN/sd", + "[NCAAF] Miami (OH) RedHawks @ Wisconsin Badgers (HD)": "https://tvpass.org/live/BTN/hd", + "[NCAAF] Stony Brook Seawolves @ San Diego State Aztecs (SD)": "https://tvpass.org/live/NCAAF21/sd", + "[NCAAF] Stony Brook Seawolves @ San Diego State Aztecs (HD)": "https://tvpass.org/live/NCAAF21/hd", + "[WNBA] Chicago Sky @ Phoenix Mercury (SD)": "https://tvpass.org/live/WNBA03/sd", + "[WNBA] Chicago Sky @ Phoenix Mercury (HD)": "https://tvpass.org/live/WNBA03/hd" + } +} diff --git a/M3U8/scrape/tvpass.py b/M3U8/scrape/tvpass.py index 2008d49..4bc8956 100644 --- a/M3U8/scrape/tvpass.py +++ b/M3U8/scrape/tvpass.py @@ -2,18 +2,18 @@ import json import re from datetime import datetime, timedelta from pathlib import Path -from urllib.parse import urlparse import httpx import pytz base_url = "https://tvpass.org/playlist/m3u" + base_file = Path(__file__).parent / "tvpass.json" -urls: dict[str, str] = {} - TZ = pytz.timezone("America/New_York") +urls: dict[str, str] = {} + def cache_expired(t: float) -> bool: now = datetime.now(TZ) @@ -64,29 +64,27 @@ async def main(client: httpx.AsyncClient) -> None: if not (data := await fetch_m3u8(client)): return - for i, line in enumerate(data[:-1]): + for i, line in enumerate(data): if line.startswith("#EXTINF"): tvg_id_match = re.search(r'tvg-id="([^"]*)"', line) tvg_name_match = re.search(r'tvg-name="([^"]*)"', line) + group_title_match = re.search(r'group-title="([^"]*)"', line) tvg_id = tvg_id_match[1] if tvg_id_match else None tvg_name = tvg_name_match[1] if tvg_name_match else None + sport = group_title_match[1] if group_title_match else None if tvg_id == "": url = data[i + 1] if tvg_name: - tvg_name = tvg_name.split("(")[0].strip() + tvg_name = "(".join(tvg_name.split("(")[:-1]).strip() if url.endswith("/sd"): - path_parts = urlparse(url).path.strip("/").split("/") + urls[f"[{sport}] {tvg_name} (SD)"] = url - if len(path_parts) >= 2 and path_parts[-1] == "sd": - sport = "".join(x for x in path_parts[1] if x.isalpha()).upper() - else: - sport = "UNKNWN" - - urls[f"[{sport}] {tvg_name}"] = url + elif url.endswith("/hd"): + urls[f"[{sport}] {tvg_name} (HD)"] = url if urls: save_cache(urls)