diff --git a/gallery/easel/route/view/common/utils/template.py b/gallery/easel/route/view/common/utils/template.py
index 290966d..c724e45 100644
--- a/gallery/easel/route/view/common/utils/template.py
+++ b/gallery/easel/route/view/common/utils/template.py
@@ -1,6 +1,7 @@
import datetime
import typing
from pathlib import Path
+from urllib.parse import parse_qsl, urlencode, urlsplit
from babel.dates import format_date
from fastapi import Request
@@ -28,6 +29,14 @@ def base_context_processor(request: Request) -> dict:
}
+def build_url(request: Request, query: dict | None = None) -> str:
+ parts = urlsplit(str(request.url))
+ if query:
+ query_dict = {**dict(parse_qsl(parts.query)), **query}
+ parts = parts._replace(query=urlencode(query_dict))
+ return parts.geturl()
+
+
def build_templates(
templates_dir: Path | None = None, filters: dict | None = None, context_processor: ContextProcessor | None = None
) -> Jinja2Templates:
@@ -46,6 +55,7 @@ def build_templates(
"datetime": datetime,
"tag_util": TagUtil,
"DATE_FORMAT": "E, d MMMM Y",
+ "build_url": build_url,
}
)
if filters:
diff --git a/gallery/easel/route/view/schedule/__init__.py b/gallery/easel/route/view/schedule/__init__.py
index 5762552..518039d 100644
--- a/gallery/easel/route/view/schedule/__init__.py
+++ b/gallery/easel/route/view/schedule/__init__.py
@@ -68,3 +68,24 @@ async def get_channel_tag(request: AppRequest, schedule_api: ScheduleApiDepends,
"response": response,
},
)
+
+
+@router.get("/group", response_class=HTMLResponse)
+async def get_group(request: AppRequest, ids: str, date: datetime.date | None = None, tag: str | None = None):
+ date = date or datetime.date.today()
+ if tag:
+ date = TagUtil.parse_tag(tag).date
+ channels = [item.split(":") for item in ids.split(" ")]
+ responses = [
+ await request.app.state.api.get_api(ScheduleApi, provider).get_schedule(channel_id, date)
+ for provider, channel_id in channels
+ ]
+ return templates.TemplateResponse(
+ request=request,
+ name="group.html",
+ context={
+ "tag_util": TagUtil,
+ "datetime": datetime,
+ "responses": responses,
+ },
+ )
diff --git a/gallery/easel/route/view/schedule/templates/group.html b/gallery/easel/route/view/schedule/templates/group.html
new file mode 100644
index 0000000..502b106
--- /dev/null
+++ b/gallery/easel/route/view/schedule/templates/group.html
@@ -0,0 +1,53 @@
+{% extends "base.html" %}
+{% block title %}
+{{_("TV program")}}
+{% endblock %}
+
+{% block header %}
+
| + | + |
| + {{value.start.strftime('%H:%M')}} + ({{(value.end - value.start) | timedelta_format}}) + | +{{value.label}} | +