refactor(tv): rework tv parsers

This commit is contained in:
2026-09-18 22:13:57 +03:00
parent a14f49742b
commit 5d025998b9
22 changed files with 208 additions and 132 deletions
+70
View File
@@ -0,0 +1,70 @@
import datetime
import json
import re
from typing import NamedTuple
from gallery.sketch.parse.core import Parser
from gallery.sketch.schedule.model import Channel, Schedule, ScheduleValue
from . import PROVIDER
class DateParser(Parser[str, datetime.date]):
def parse(self, data: str) -> datetime.date:
matched = re.compile('{\\"date\\":(\\d+)}').search(data)
return datetime.date.strptime(matched.group(1), data)
class ScheduleData(NamedTuple):
date: datetime.date
data: str
class MatchTVScheduleParser(Parser[ScheduleData, Schedule]):
date_parser = DateParser()
def parse(self, data: ScheduleData) -> Schedule:
content = json.loads(data.data)
channel_data = content["result"]["channels"][0]
channel = Channel(id=channel_data["alias"], name=channel_data["name"], provider=PROVIDER)
values = []
start = datetime.datetime.combine(data.date, datetime.time.min)
end = start + datetime.timedelta(days=1, hours=6)
prev_value: ScheduleValue | None = None
for item in channel_data["schedule"]:
title = item["title"]
time_str = item["time"]
hours, minutes = map(int, time_str.split(":"))
item_date = start.replace(hour=hours, minute=minutes)
if prev_value is not None and item_date.hour < prev_value.start.hour:
start += datetime.timedelta(days=1)
item_date += datetime.timedelta(days=1)
live = "Прямая трансляция" in title
value = ScheduleValue(start=item_date, end=end, label=title, live=live)
values.append(value)
if prev_value is not None:
prev_value.end = item_date
prev_value = value
return Schedule(
channel=channel,
date=data.date,
values=values,
)
class ChannelData(NamedTuple):
query: str
data: str
class MatchTVChannelParser(Parser[ChannelData, list[Channel]]):
def parse(self, data: ChannelData) -> list[Channel]:
context = json.loads(data.data)
result = []
query = data.query.lower()
for item in context["result"]:
if query in item["name"].lower() or query in item["alias"]:
channel_id = item["alias"]
name = item["name"].split("|")[0].strip()
result.append(Channel(id=channel_id, name=name, provider=PROVIDER))
return result