This commit is contained in:
doms9 2025-09-24 12:30:55 -04:00
parent acb19b7886
commit 00000d9990
10 changed files with 718 additions and 747 deletions

View file

@ -5,7 +5,7 @@ from urllib.parse import urljoin
import httpx
from selectolax.parser import HTMLParser, Node
from .utils import get_base, get_logger, league_info
from .utils import get_base, get_logger, leagues
log = get_logger(__name__)
@ -111,7 +111,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
key = f"[{sport}] {event} (S{i})"
tvg_id, logo = league_info(sport)
tvg_id, logo = leagues.info(sport)
entry = {
"url": link,

View file

@ -7,7 +7,7 @@ from selectolax.parser import HTMLParser
from .utils import (
get_base,
get_logger,
league_info,
leagues,
load_cache,
now,
safe_process_event,
@ -157,7 +157,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
f"[{sport}] {match_name} (FSTV)" if match_name else f"[{sport}] (FSTV)"
)
tvg_id, logo = league_info(sport)
tvg_id, logo = leagues.info(sport)
entry = {
"url": url,

View file

@ -13,7 +13,7 @@ from .utils import (
TZ,
capture_req,
get_logger,
league_info,
leagues,
load_cache,
new_browser,
now,
@ -308,10 +308,10 @@ async def scrape(client: httpx.AsyncClient) -> None:
key = f"[{sport}: {event}] {title} (LTVSX)"
tvg_id, logo = league_info(event)
tvg_id, logo = leagues.info(event)
if not tvg_id:
tvg_id, logo = league_info(sport)
tvg_id, logo = leagues.info(sport)
entry = {
"url": url,

View file

@ -12,7 +12,7 @@ from .utils import (
capture_req,
get_base,
get_logger,
league_info,
leagues,
load_cache,
new_browser,
now,
@ -36,49 +36,30 @@ MIRRORS = [
"https://freeppv.fun",
]
NFL_TEAMS = {
"Arizona Cardinals",
"Atlanta Falcons",
"Baltimore Ravens",
"Buffalo Bills",
"Carolina Panthers",
"Chicago Bears",
"Cincinnati Bengals",
"Cleveland Browns",
"Dallas Cowboys",
"Denver Broncos",
"Detroit Lions",
"Green Bay Packers",
"Houston Texans",
"Indianapolis Colts",
"Jacksonville Jaguars",
"Kansas City Chiefs",
"Las Vegas Raiders",
"Los Angeles Chargers",
"Los Angeles Rams",
"Miami Dolphins",
"Minnesota Vikings",
"New England Patriots",
"New Orleans Saints",
"New York Giants",
"New York Jets",
"Philadelphia Eagles",
"Pittsburgh Steelers",
"San Francisco 49ers",
"Seattle Seahawks",
"Tampa Bay Buccaneers",
"Tennessee Titans",
"Washington Commanders",
}
def get_tvg(sport: str, event: str) -> str | None:
match sport:
case "American Football":
if leagues.is_valid(event, "NFL"):
return "NFL.Dummy.us"
def is_nfl(event: str) -> bool:
try:
t1, t2 = event.split(" vs. ")
else:
return "NCAA.Sports.Dummy.us"
return t1 in NFL_TEAMS or t2 in NFL_TEAMS
except ValueError:
return event.lower() == "nfl redzone"
case "Basketball":
if leagues.is_valid(event, "NBA"):
return "NBA.Basketball.Dummy.us"
elif leagues.is_valid(event, "WNBA"):
return "WNBA.dummy.us"
# NCAA
else:
return "Basketball.Dummy.us"
case _:
return
async def refresh_api_cache(
@ -239,11 +220,6 @@ async def scrape(client: httpx.AsyncClient) -> None:
if url:
sport, event = ev["sport"], ev["event"]
if sport == "American Football":
tvg_id = "NFL.Dummy.us" if is_nfl(event) else "NCAA.Sports.Dummy.us"
else:
tvg_id = league_info(sport)[0]
key = f"[{sport}] {event} (PPV)"
entry = {
@ -251,7 +227,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
"logo": ev["logo"],
"base": base_url,
"timestamp": now.timestamp(),
"id": tvg_id or "Live.Event.us",
"id": get_tvg(sport, event) or "Live.Event.us",
}
urls[key] = cached_urls[key] = entry

View file

@ -5,14 +5,7 @@ from urllib.parse import urljoin
import httpx
from selectolax.parser import HTMLParser
from .utils import (
get_logger,
league_info,
load_cache,
now,
safe_process_event,
write_cache,
)
from .utils import get_logger, leagues, load_cache, now, safe_process_event, write_cache
log = get_logger(__name__)
@ -108,7 +101,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
key = f"[{sport}] {event} (SBTW)"
tvg_id, logo = league_info(sport)
tvg_id, logo = leagues.info(sport)
entry = {
"url": url,

View file

@ -13,7 +13,7 @@ from .utils import (
capture_req,
get_base,
get_logger,
league_info,
leagues,
load_cache,
new_browser,
now,
@ -184,9 +184,13 @@ async def scrape(client: httpx.AsyncClient) -> None:
if url:
sport, event = ev["sport"], ev["event"]
key = f"[{sport}] {event} (SEAST)"
tvg_id, logo = leagues.info(sport)
tvg_id, logo = league_info(sport)
if sport == "NBA" and leagues.is_valid(event, "WNBA"):
sport, tvg_id = "WNBA", "WNBA.dummy.us"
logo = leagues.info("WNBA")[1]
key = f"[{sport}] {event} (SEAST)"
entry = {
"url": url,

View file

@ -3,7 +3,7 @@ from pathlib import Path
import httpx
from .utils import get_logger, league_info, load_cache, now, write_cache
from .utils import get_logger, leagues, load_cache, now, write_cache
log = get_logger(__name__)
@ -54,7 +54,7 @@ async def scrape(client: httpx.AsyncClient) -> None:
channel = url.split("/")[-2]
tvg_id, logo = league_info(sport)
tvg_id, logo = leagues.info(sport)
entry = {
"url": f"http://origin.thetvapp.to/hls/{channel}/mono.m3u8",

View file

@ -1,5 +1,5 @@
from .cache import load_cache, write_cache
from .config import TZ, league_info, now
from .config import TZ, leagues, now
from .logger import get_logger
from .network import CLIENT, UA, capture_req, get_base, new_browser, safe_process_event
@ -10,7 +10,7 @@ __all__ = [
"capture_req",
"get_base",
"get_logger",
"league_info",
"leagues",
"load_cache",
"new_browser",
"now",

View file

@ -1,4 +1,5 @@
import json
import re
from datetime import datetime
from pathlib import Path
@ -12,18 +13,21 @@ live_img = "https://i.gyazo.com/978f2eb4a199ca5b56b447aded0cb9e3.png"
leagues_file = Path(__file__).parent / "leagues.json"
LEAGUES: dict[str, dict[str, str]] = json.loads(
leagues_file.read_text(encoding="utf-8")
)
class Leagues:
def __init__(self) -> None:
self.data = json.loads(leagues_file.read_text(encoding="utf-8"))
def league_info(name: str) -> tuple[str | None, str]:
def teams(self, league: str) -> list[str]:
return self.data["teams"].get(league, [])
def info(self, name: str) -> tuple[str | None, str]:
name = name.upper()
if match := next(
(
(tvg_id, league_data.get("logo"))
for tvg_id, leagues in LEAGUES.items()
for tvg_id, leagues in self.data["leagues"].items()
for league_entry in leagues
for league_name, league_data in league_entry.items()
if name == league_name or name in league_data.get("names", [])
@ -35,3 +39,14 @@ def league_info(name: str) -> tuple[str | None, str]:
return (tvg_id, logo or live_img)
return (None, live_img)
def is_valid(self, event: str, league: str) -> bool:
if match := re.search(r"(\-|vs.?)", event):
t1, t2 = event.split(match[1])
return any(t in self.teams(league) for t in (t1.strip(), t2.strip()))
return event.lower() == "nfl redzone" if league == "NFL" else False
leagues = Leagues()

View file

@ -1,4 +1,5 @@
{
"leagues": {
"Basketball.Dummy.us": [
{
"BASKETBALL": {
@ -17,9 +18,7 @@
{
"PGA": {
"logo": "https://1000logos.net/wp-content/uploads/2024/10/PGA-Tour-Logo-500x281.png",
"names": [
"PGA TOUR"
]
"names": ["PGA TOUR"]
}
}
],
@ -27,10 +26,7 @@
{
"MLB": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/teamlogos/leagues/500/mlb.png",
"names": [
"BASEBALL",
"MAJOR LEAGUE BASEBALL"
]
"names": ["BASEBALL", "MAJOR LEAGUE BASEBALL"]
}
}
],
@ -38,10 +34,7 @@
{
"NBA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/teamlogos/leagues/500/nba.png",
"names": [
"NATIONAL BASKETBALL ASSOCIATION",
"NBA PRESEASON"
]
"names": ["NATIONAL BASKETBALL ASSOCIATION", "NBA PRESEASON"]
}
}
],
@ -49,12 +42,7 @@
{
"NCAA": {
"logo": "https://1000logos.net/wp-content/uploads/2021/12/NCAA-Logo-500x281.png",
"names": [
"CBB",
"CFB",
"NCAAB",
"NCAAF"
]
"names": ["CBB", "CFB", "NCAAB", "NCAAF"]
}
}
],
@ -75,11 +63,7 @@
{
"NHL": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/teamlogos/leagues/500/nhl.png",
"names": [
"HOCKEY",
"NATIONAL HOCKEY LEAGUE",
"NHL PRESEASON"
]
"names": ["HOCKEY", "NATIONAL HOCKEY LEAGUE", "NHL PRESEASON"]
}
}
],
@ -87,20 +71,13 @@
{
"PAY PER VIEW": {
"logo": null,
"names": [
"PAY-PER-VIEW",
"PAYPERVIEW",
"PPV"
]
"names": ["PAY-PER-VIEW", "PAYPERVIEW", "PPV"]
}
},
{
"WRESTLING": {
"logo": null,
"names": [
"AEW",
"WWE"
]
"names": ["AEW", "WWE"]
}
}
],
@ -108,18 +85,13 @@
{
"F1": {
"logo": "https://1000logos.net/wp-content/uploads/2021/06/F1-logo-500x281.png",
"names": [
"FORMULA 1",
"FORMULA ONE"
]
"names": ["FORMULA 1", "FORMULA ONE"]
}
},
{
"MOTO GP": {
"logo": "https://1000logos.net/wp-content/uploads/2021/03/MotoGP-Logo-500x281.png",
"names": [
"MOTOGP"
]
"names": ["MOTOGP"]
}
},
{
@ -145,45 +117,31 @@
{
"AFC CHAMPIONS LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2200.png&scale=crop&cquality=40&location=origin&w=500&h=500",
"names": [
"ACL",
"ACL ELITE",
"ASIAN CHAMPIONS LEAGUE"
]
"names": ["ACL", "ACL ELITE", "ASIAN CHAMPIONS LEAGUE"]
}
},
{
"AFRICA CUP OF NATIONS": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/76.png",
"names": [
"AFCON"
]
"names": ["AFCON"]
}
},
{
"AUSTRIA 2 LIGA": {
"logo": "https://i.gyazo.com/5d1464502b841fef6e5d78c8b0764b52.png",
"names": [
"ADMIRAL 2. LIGA"
]
"names": ["ADMIRAL 2. LIGA"]
}
},
{
"AUSTRIA BUNDESLIGA": {
"logo": "https://i.gyazo.com/83d851fb1110f1e395690403f9cf01bb.webp",
"names": [
"ADMIRAL BUNDESLIGA",
"FEDERAL LEAGUE"
]
"names": ["ADMIRAL BUNDESLIGA", "FEDERAL LEAGUE"]
}
},
{
"BUNDESLIGA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/10.png",
"names": [
"BUNDESLIG",
"GERMAN BUNDESLIGA"
]
"names": ["BUNDESLIG", "GERMAN BUNDESLIGA"]
}
},
{
@ -195,10 +153,7 @@
{
"CANADIAN PREMIER LEAGUE": {
"logo": "https://i.gyazo.com/f61986e2ccfbf88f7d753b4e7f2c9fdc.png",
"names": [
"CANPL",
"CPL"
]
"names": ["CANPL", "CPL"]
}
},
{
@ -211,24 +166,26 @@
]
}
},
{
"CONCACAF CENTRAL AMERICAN CUP": {
"logo": "https://b.fssta.com/uploads/application/soccer/competition-logos/CONCACAFCentralAmericanCup.png",
"names": ["COPA CENTROAMERICANA DE CONCACAF"]
}
},
{
"CONCACAF CHAMPIONS LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2298.png",
"names": [
"CONCACAF CHAMPIONS CUP"
]
"names": ["CONCACAF CHAMPIONS CUP"]
}
},
{
"CONCACAF GOLD CUP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/59.png",
"names": [
"COPA ORO CONCACAF"
]
"names": ["COPA ORO CONCACAF"]
}
},
{
"COPA AMéRICA": {
"COPA AMÉRICA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/83.png",
"names": [
"CONMEBOL COPA AMERICA",
@ -244,7 +201,7 @@
"names": [
"CONMEBOL LIBERTADORES",
"COPA LIBERTADORES DE AMERICA",
"COPA LIBERTADORES DE AMéRICA",
"COPA LIBERTADORES DE AMÉRICA",
"LIBERTADORES"
]
}
@ -252,9 +209,17 @@
{
"COPA SUDAMERICANA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/1208.png",
"names": ["CONMEBOL SUDAMERICANA", "COPA CONMEBOL SUDAMERICANA"]
}
},
{
"EFL": {
"logo": "https://i.gyazo.com/f3839327b125774f201a18bed8e38a6a.gif",
"names": [
"CONMEBOL SUDAMERICANA",
"COPA CONMEBOL SUDAMERICANA"
"CARABAO CUP",
"EFL CUP",
"ENGLISH FOOTBALL LEAGUE CUP",
"LEAGUE CUP"
]
}
},
@ -281,43 +246,41 @@
{
"EKSTRAKLASA": {
"logo": "https://i.gyazo.com/362e31efdd0dad03b00858f4fb0901b5.png",
"names": [
"PKO BANK POLSKI EKSTRAKLASA",
"POLAND EKSTRAKLASA"
]
"names": ["PKO BANK POLSKI EKSTRAKLASA", "POLAND EKSTRAKLASA"]
}
},
{
"EREDIVISIE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/11.png",
"names": ["VRIENDENLOTERIJ EREDIVISIE"]
}
},
{
"FA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/40.png&w=500&h=500",
"names": [
"VRIENDENLOTERIJ EREDIVISIE"
"EMIRATES FA CUP",
"FA CUP",
"FOOTBALL ASSOCIATION CHALLENGE CUP"
]
}
},
{
"FIFA CLUB WORLD CUP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/1932.png",
"names": [
"FIFA CWC"
]
"names": ["FIFA CWC"]
}
},
{
"FIFA WORLD CUP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/4.png",
"names": [
"FIFA WC",
"WC"
]
"names": ["FIFA WC", "WC"]
}
},
{
"FIFA'S WOMEN WORLD CUP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/60.png",
"names": [
"FIFA WOMEN WC"
]
"names": ["FIFA WOMEN WC"]
}
},
{
@ -329,20 +292,13 @@
{
"FRAUEN BUNDESLIGA": {
"logo": "https://i.gyazo.com/d13d4c0330be96801aa4b2d8b83d3a8f.png",
"names": [
"GOOGLE PIXEL FRAUEN-BUNDESLIGA",
"WOMEN'S FEDERAL LEAGUE"
]
"names": ["GOOGLE PIXEL FRAUEN-BUNDESLIGA", "WOMEN'S FEDERAL LEAGUE"]
}
},
{
"J1 LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2199.png",
"names": [
"J.LEAGUE",
"JAPANESE J.LEAGUE",
"MEIJI YASUDA J1 LEAGUE"
]
"names": ["J.LEAGUE", "JAPANESE J.LEAGUE", "MEIJI YASUDA J1 LEAGUE"]
}
},
{
@ -399,6 +355,7 @@
"LIGA BBVA MX",
"LIGA MAYOR",
"MEXICAN LIGA BBVA MX",
"MEXICO LIGA MX",
"PRIMERA DIVISION DE MEXICO",
"PRIMERA DIVISIÓN DE MÉXICO"
]
@ -421,104 +378,73 @@
{
"LIGUE 1": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/9.png",
"names": [
"FRANCE LIGUE 1",
"FRENCH LIGUE 1"
]
"names": ["FRANCE LIGUE 1", "FRENCH LIGUE 1"]
}
},
{
"LIGUE 2": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/96.png",
"names": [
"FRANCE LIGUE 2",
"FRENCH LIGUE 2"
]
"names": ["FRANCE LIGUE 2", "FRENCH LIGUE 2"]
}
},
{
"MLS": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/19.png",
"names": [
"MAJOR LEAGUE SOCCER"
]
"names": ["MAJOR LEAGUE SOCCER"]
}
},
{
"NWSL": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2323.png",
"names": [
"NATIONAL WOMEN'S SOCCER LEAGUE",
"NWSL WOMEN"
]
"names": ["NATIONAL WOMEN'S SOCCER LEAGUE", "NWSL WOMEN"]
}
},
{
"PREMIER LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/23.png",
"names": [
"ENGLISH PREMIER LEAGUE",
"EPL"
]
"names": ["ENGLISH PREMIER LEAGUE", "EPL"]
}
},
{
"PRIMEIRA LIGA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/14.png",
"names": [
"LIGA PORTUGAL",
"PORTUGUESE PRIMEIRA LIGA"
]
"names": ["LIGA PORTUGAL", "PORTUGUESE PRIMEIRA LIGA"]
}
},
{
"PRIMERA A": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/1543.png",
"names": [
"COLOMBIAN PRIMERA A"
]
"names": ["COLOMBIAN PRIMERA A"]
}
},
{
"PRIMERA B": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2295.png",
"names": [
"COLOMBIAN PRIMERA B"
]
"names": ["COLOMBIAN PRIMERA B"]
}
},
{
"SCOTTISH PREMIERSHIP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/45.png",
"names": [
"PREMIERSHIP",
"SPFL"
]
"names": ["PREMIERSHIP", "SPFL"]
}
},
{
"SERBIA SUPERLIGA": {
"logo": "https://i.gyazo.com/0992f078dcacfef489477fc7bb1f5220.webp",
"names": [
"MOZZART SUPERLIGA",
"SERBIAN SUPER LEAGUE"
]
"names": ["MOZZART SUPERLIGA", "SERBIAN SUPER LEAGUE"]
}
},
{
"SERIE A": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/12.png",
"names": [
"ITALIAN SERIE A"
]
"names": ["ITALIAN SERIE A"]
}
},
{
"SERIE B": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/99.png",
"names": [
"ITALIAN SERIE B"
]
"names": ["ITALIAN SERIE B"]
}
},
{
@ -539,32 +465,21 @@
}
},
{
"SüPER LIG": {
"SÜPER LIG": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/18.png",
"names": [
"SUPER LIG",
"SUPERLIG",
"SÜPERLIG",
"TURKISH SUPER LIG"
]
"names": ["SUPER LIG", "SUPERLIG", "SÜPERLIG", "TURKISH SUPER LIG"]
}
},
{
"TURKEY 1 LIG": {
"logo": "https://i.gyazo.com/730673f84223a85c9b9ae66123907bba.png",
"names": [
"TFF 1. LIG",
"TRENDYOL 1. LIG"
]
"names": ["TFF 1. LIG", "TRENDYOL 1. LIG"]
}
},
{
"UEFA CHAMPIONS LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2.png",
"names": [
"CHAMPIONS LEAGUE",
"UCL"
]
"names": ["CHAMPIONS LEAGUE", "UCL"]
}
},
{
@ -576,36 +491,25 @@
{
"UEFA EUROPA LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2310.png",
"names": [
"EUROPA LEAGUE"
]
"names": ["EUROPA LEAGUE"]
}
},
{
"UEFA EUROPEAN CHAMPIONSHIP": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/74.png",
"names": [
"EUROS",
"UEFA EUROS"
]
"names": ["EUROS", "UEFA EUROS"]
}
},
{
"UEFA SUPER CUP": {
"logo": "https://i.gyazo.com/3b786181aba130321b85c0e2f9604652.png",
"names": [
"EUROPEAN SUPER CUP"
]
"names": ["EUROPEAN SUPER CUP"]
}
},
{
"UEFA WOMEN'S CHAMPIONS LEAGUE": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/leaguelogos/soccer/500/2408.png",
"names": [
"UCL WOMEN",
"UEFA WOMEN",
"WOMEN'S CHAMPIONS LEAGUE"
]
"names": ["UCL WOMEN", "UEFA WOMEN", "WOMEN'S CHAMPIONS LEAGUE"]
}
},
{
@ -638,9 +542,7 @@
{
"UFC": {
"logo": "https://1000logos.net/wp-content/uploads/2017/06/Logo-UFC-500x313.png",
"names": [
"UFC FIGHT NIGHT"
]
"names": ["UFC FIGHT NIGHT"]
}
}
],
@ -648,11 +550,92 @@
{
"WNBA": {
"logo": "https://a.espncdn.com/combiner/i?img=/i/teamlogos/leagues/500/wnba.png",
"names": [
"NBA W",
"WOMEN'S NATIONAL BASKETBALL ASSOCIATION"
]
"names": ["NBA W", "WOMEN'S NATIONAL BASKETBALL ASSOCIATION"]
}
}
]
},
"teams": {
"NBA": [
"Atlanta Hawks",
"Boston Celtics",
"Brooklyn Nets",
"Charlotte Hornets",
"Chicago Bulls",
"Cleveland Cavaliers",
"Dallas Mavericks",
"Denver Nuggets",
"Detroit Pistons",
"Golden State Warriors",
"Houston Rockets",
"Indiana Pacers",
"Los Angeles Clippers",
"Los Angeles Lakers",
"Memphis Grizzlies",
"Miami Heat",
"Milwaukee Bucks",
"Minnesota Timberwolves",
"New Orleans Pelicans",
"New York Knicks",
"Oklahoma City Thunder",
"Orlando Magic",
"Philadelphia 76ers",
"Phoenix Suns",
"Portland Trail Blazers",
"Sacramento Kings",
"San Antonio Spurs",
"Toronto Raptors",
"Utah Jazz",
"Washington Wizards"
],
"NFL": [
"Arizona Cardinals",
"Atlanta Falcons",
"Baltimore Ravens",
"Buffalo Bills",
"Carolina Panthers",
"Chicago Bears",
"Cincinnati Bengals",
"Cleveland Browns",
"Dallas Cowboys",
"Denver Broncos",
"Detroit Lions",
"Green Bay Packers",
"Houston Texans",
"Indianapolis Colts",
"Jacksonville Jaguars",
"Kansas City Chiefs",
"Las Vegas Raiders",
"Los Angeles Chargers",
"Los Angeles Rams",
"Miami Dolphins",
"Minnesota Vikings",
"New England Patriots",
"New Orleans Saints",
"New York Giants",
"New York Jets",
"Philadelphia Eagles",
"Pittsburgh Steelers",
"San Francisco 49ers",
"Seattle Seahawks",
"Tampa Bay Buccaneers",
"Tennessee Titans",
"Washington Commanders"
],
"WNBA": [
"Atlanta Dream",
"Chicago Sky",
"Connecticut Sun",
"Dallas Wings",
"Golden State Valkyries",
"Indiana Fever",
"Las Vegas Aces",
"Los Angeles Sparks",
"Minnesota Lynx",
"New York Liberty",
"Phoenix Mercury",
"Seattle Storm",
"Washington Mystics"
]
}
}