refactor(parse): add base html and json parsers

This commit is contained in:
2026-09-21 22:17:50 +03:00
parent 5d025998b9
commit 0baa1277ef
8 changed files with 186 additions and 98 deletions
+17 -16
View File
@@ -1,9 +1,10 @@
import datetime
import json
import re
from typing import NamedTuple
from dataclasses import dataclass
from typing import Any
from gallery.sketch.parse.core import Parser
from gallery.sketch.parse.core import ParsedContext, Parser
from gallery.sketch.parse.json import JSONContextParser
from gallery.sketch.schedule.model import Channel, Schedule, ScheduleValue
from . import PROVIDER
@@ -15,20 +16,20 @@ class DateParser(Parser[str, datetime.date]):
return datetime.date.strptime(matched.group(1), data)
class ScheduleData(NamedTuple):
@dataclass
class ScheduleData:
date: datetime.date
data: str
class MatchTVScheduleParser(Parser[ScheduleData, Schedule]):
class MatchTVScheduleParser(JSONContextParser[ScheduleData, Schedule]):
date_parser = DateParser()
def parse(self, data: ScheduleData) -> Schedule:
content = json.loads(data.data)
channel_data = content["result"]["channels"][0]
def extract(self, data: ParsedContext[ScheduleData, Any]) -> Schedule:
channel_data = data.data["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)
start = datetime.datetime.combine(data.context.date, datetime.time.min)
end = start + datetime.timedelta(days=1, hours=6)
prev_value: ScheduleValue | None = None
for item in channel_data["schedule"]:
@@ -47,22 +48,22 @@ class MatchTVScheduleParser(Parser[ScheduleData, Schedule]):
prev_value = value
return Schedule(
channel=channel,
date=data.date,
date=data.context.date,
values=values,
)
class ChannelData(NamedTuple):
@dataclass
class ChannelData:
query: str
data: str
class MatchTVChannelParser(Parser[ChannelData, list[Channel]]):
def parse(self, data: ChannelData) -> list[Channel]:
context = json.loads(data.data)
class MatchTVChannelParser(JSONContextParser[ChannelData, list[Channel]]):
def extract(self, data: ParsedContext[ChannelData, Any]) -> list[Channel]:
result = []
query = data.query.lower()
for item in context["result"]:
query = data.context.query.lower()
for item in data.data["result"]:
if query in item["name"].lower() or query in item["alias"]:
channel_id = item["alias"]
name = item["name"].split("|")[0].strip()