feat(schedule): add matchtv schedule

This commit is contained in:
2024-08-12 01:19:14 +03:00
parent 6db33ca669
commit bf51ddabc0
17 changed files with 5721 additions and 8 deletions

View File

@@ -0,0 +1,52 @@
import datetime
from pathlib import Path
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from gallery.easel.route.view.weather.util import TagType, TagUtil
from gallery.sketch.schedule.api import ScheduleApi
def mount(app: FastAPI):
base_dir = Path(__file__).parent
app.mount(
"/schedule/static", StaticFiles(directory=base_dir / "static"), name="static"
)
templates = Jinja2Templates(directory=base_dir / "templates")
@app.get("/schedule", response_class=HTMLResponse)
async def get_schedule_list(request: Request):
schedule_api: ScheduleApi = request.app.state.schedule_api
channels = await schedule_api.get_channels()
return templates.TemplateResponse(
request=request,
name="index.html",
context={
"channels": channels,
},
)
@app.get("/schedule/{channel}", response_class=RedirectResponse)
async def get_schedule_default(channel: str):
return RedirectResponse(f"{channel}/tag/today")
@app.get("/schedule/{channel}/tag/{tag}", response_class=HTMLResponse)
async def get_schedule_tag(request: Request, channel: str, tag: str):
tag_value = TagUtil.parse_tag(tag)
schedule_api: ScheduleApi = request.app.state.schedule_api
if tag_value.type == TagType.DAY:
response = await schedule_api.get_channel_schedule(channel, tag_value.date)
else:
raise ValueError(tag)
return templates.TemplateResponse(
request=request,
name="schedule.html",
context={
"tag_util": TagUtil,
"datetime": datetime,
"response": response,
},
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,21 @@
body {
font-size: 1.5rem;
}
.app-container {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-items: center;
}
table,
th,
td {
/* border: 1px solid rgba(0, 0, 0, 0.2); */
text-align: left;
}
td {
padding: 0.1rem 0.4rem;
}

View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible"
content="ie=edge">
<title>ТВ</title>
<link rel="stylesheet"
href="/schedule/static/style.css?v=1">
<link rel="icon"
href="/schedule/static/favicon.ico"
type="image/x-icon">
</head>
<body class="app-container">
<ul>
{% for channel in channels %}
<li><a href="schedule/{{channel}}">{{channel}}</a></li>
{% endfor %}
</ul>
</body>
</html>

View File

@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible"
content="ie=edge">
<title>Программа | {{response.channel.name}} | {{response.date.strftime('%a, %d %B %Y')}}</title>
<link rel="stylesheet"
href="/schedule/static/style.css?v=1">
<link rel="icon"
href="/schedule/static/favicon.ico"
type="image/x-icon">
</head>
<body class="app-container">
<h3>
{{response.channel.name}} | {{response.date.strftime('%a, %d %B %Y')}}
</h3>
<table>
<thead>
<tr>
<td>TIME</td>
<td>NAME</td>
</tr>
</thead>
<tbody>
{% for value in response.values %}
<tr>
<td>{{value.start.strftime('%H:%M')}}</td>
<td>{{value.label}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

View File

@@ -171,7 +171,6 @@
</tr>
</tbody>
</table>
<script src="/static/index.js"></script>
</body>
</html>