e
This commit is contained in:
parent
7103b0f1c4
commit
00000d9937
17 changed files with 597 additions and 524 deletions
|
|
@ -1,27 +1,79 @@
|
|||
import json
|
||||
import re
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
|
||||
import pytz
|
||||
|
||||
TZ = pytz.timezone("America/New_York")
|
||||
ZONES = {"ET": pytz.timezone("America/New_York"), "UTC": timezone.utc}
|
||||
|
||||
now = datetime.now(TZ)
|
||||
ZONES["EDT"] = ZONES["EST"] = ZONES["ET"]
|
||||
|
||||
live_img = "https://i.gyazo.com/978f2eb4a199ca5b56b447aded0cb9e3.png"
|
||||
|
||||
leagues_file = Path(__file__).parent / "leagues.json"
|
||||
class Time(datetime):
|
||||
TZ = timezone.utc
|
||||
|
||||
@classmethod
|
||||
def now(cls) -> "Time":
|
||||
dt = datetime.now(cls.TZ)
|
||||
return cls.fromtimestamp(dt.timestamp(), tz=cls.TZ)
|
||||
|
||||
@classmethod
|
||||
def from_ts(cls, ts: int | float) -> "Time":
|
||||
return cls.fromtimestamp(ts, tz=cls.TZ)
|
||||
|
||||
def delta(self, **kwargs) -> "Time":
|
||||
new_dt = super().__add__(timedelta(**kwargs))
|
||||
return self.__class__.fromtimestamp(new_dt.timestamp(), tz=new_dt.tzinfo)
|
||||
|
||||
@classmethod
|
||||
def from_str(cls, s: str, fmt: str | None = None) -> "Time":
|
||||
pattern = r"\b(ET|UTC|EST|EDT)\b"
|
||||
|
||||
match = re.search(pattern, s)
|
||||
|
||||
tz = ZONES.get(match[1]) if match else cls.TZ
|
||||
|
||||
cleaned_str = re.sub(pattern, "", s).strip()
|
||||
|
||||
if fmt:
|
||||
dt = datetime.strptime(cleaned_str, fmt)
|
||||
else:
|
||||
formats = [
|
||||
"%Y-%m-%d %H:%M",
|
||||
"%Y-%m-%d %H:%M:%S",
|
||||
]
|
||||
|
||||
for frmt in formats:
|
||||
try:
|
||||
dt = datetime.strptime(cleaned_str, frmt)
|
||||
break
|
||||
except ValueError:
|
||||
continue
|
||||
else:
|
||||
return cls.from_ts(31496400)
|
||||
|
||||
dt = tz.localize(dt) if hasattr(tz, "localize") else dt.replace(tzinfo=tz)
|
||||
|
||||
return cls.fromtimestamp(dt.astimezone(cls.TZ).timestamp(), tz=cls.TZ)
|
||||
|
||||
def to_tz(self, tzone: str) -> "Time":
|
||||
dt = self.astimezone(ZONES[tzone])
|
||||
return self.__class__.fromtimestamp(dt.timestamp(), tz=ZONES[tzone])
|
||||
|
||||
|
||||
class Leagues:
|
||||
def __init__(self) -> None:
|
||||
self.data = json.loads(leagues_file.read_text(encoding="utf-8"))
|
||||
self.data = json.loads(
|
||||
(Path(__file__).parent / "leagues.json").read_text(encoding="utf-8")
|
||||
)
|
||||
|
||||
self.live_img = "https://i.gyazo.com/978f2eb4a199ca5b56b447aded0cb9e3.png"
|
||||
|
||||
def teams(self, league: str) -> list[str]:
|
||||
return self.data["teams"].get(league, [])
|
||||
|
||||
def info(self, name: str) -> tuple[str | str]:
|
||||
def info(self, name: str) -> tuple[str | None, str]:
|
||||
name = name.upper()
|
||||
|
||||
if match := next(
|
||||
|
|
@ -36,9 +88,9 @@ class Leagues:
|
|||
):
|
||||
tvg_id, logo = match
|
||||
|
||||
return (tvg_id, logo or live_img)
|
||||
return (tvg_id, logo or self.live_img)
|
||||
|
||||
return ("Live.Event.us", live_img)
|
||||
return (None, self.live_img)
|
||||
|
||||
def is_valid(self, event: str, league: str) -> bool:
|
||||
if match := re.search(r"(\-|vs.?)", event):
|
||||
|
|
@ -48,5 +100,11 @@ class Leagues:
|
|||
|
||||
return event.lower() == "nfl redzone" if league == "NFL" else False
|
||||
|
||||
@property
|
||||
def league_names(self) -> list[str]:
|
||||
return self.data["teams"].keys()
|
||||
|
||||
|
||||
leagues = Leagues()
|
||||
|
||||
__all__ = ["leagues", "Time"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue