home · contact · privacy
Improve templating modularity. master
authorChristian Heller <c.heller@plomlompom.de>
Sun, 24 Nov 2024 15:29:27 +0000 (16:29 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sun, 24 Nov 2024 15:29:27 +0000 (16:29 +0100)
templates/_base.tmpl [new file with mode: 0644]
templates/_macros.tmpl [new file with mode: 0644]
templates/playlist.tmpl
templates/queries.tmpl
templates/results.tmpl
templates/video.tmpl
templates/videos.tmpl
templates/yt_video.tmpl
ytplom/misc.py

diff --git a/templates/_base.tmpl b/templates/_base.tmpl
new file mode 100644 (file)
index 0000000..8839067
--- /dev/null
@@ -0,0 +1,20 @@
+{% import '_macros.tmpl' as macros %}
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+{% block script %}
+{% endblock %}
+</script>
+<style>
+body { background-color: #aaaa00; }
+{% block css %}
+{% endblock %}
+</style>
+</head>
+<body>
+{% block body %}
+{% endblock %}
+</body>
+</html>
diff --git a/templates/_macros.tmpl b/templates/_macros.tmpl
new file mode 100644 (file)
index 0000000..12b28df
--- /dev/null
@@ -0,0 +1,13 @@
+{% macro _link_if(cond, target) %}{% if cond %}<a href="/{{target}}">{% endif %}{{target}}{% if cond %}</a>{% endif %}{% endmacro %}
+
+
+{% macro nav_head(selected="") %}
+<p>
+{{ _link_if("playlist" != selected, "playlist") }}
+{{ _link_if("videos" != selected, "videos") }}
+{{ _link_if("queries" != selected, "queries") }}
+</p>
+<hr />
+{% endmacro %}
index 70aaa43b9abf5760b895c47f3f30e908239ba5a6..58c2b5b0cf81672e28794e61c6bdbceb0c91a0e7 100644 (file)
@@ -1,7 +1,7 @@
-<html>
-<head>
-<meta charset="UTF-8">
-<script>
+{% extends '_base.tmpl' %}
+
+
+{% block script %}
 const RELOAD_INTERVAL_S = 10;
 const PATH_LAST_UPDATE = '/_last_playlist_update.json';
 const MSG_SERVER_DOWN = 'Server seems to be unavailable.';
@@ -25,16 +25,18 @@ async function keep_updated() {
   setTimeout(keep_updated, RELOAD_INTERVAL_S * 1000); 
 }
 window.onload = keep_updated;
-</script>
-<style>
-body { background-color: #aaaaaa; }
+{% endblock %}
+
+
+{% block css %}
 table { width: 100%; }
 #status { text-align: center; font-weight: bold; }
 td.history { width: 50%; }
-</style>
-</head>
-<body>
-<p>playlist · <a href="/videos">videos</a> · <a href="/queries">queries</a></p>
+{% endblock %}
+
+
+{% block body %}
+{{ macros.nav_head("playlist") }}
 <table>
 <tr><td id="status" colspan=2>
 {% if running %}{% if pause %}PAUSED{% else %}PLAYING{% endif %}{% else %}STOPPED{% endif %}:<br />
@@ -55,6 +57,5 @@ td.history { width: 50%; }
 </td></tr>
 {% endfor %}
 </table>
-</body>
-</html>
+{% endblock %}
 
index 6ba91cb1db2d33acb16b586104797ca0c566aa7e..457f80e2d34d9ef1452835fe10071babab96cc63 100644 (file)
@@ -1,7 +1,8 @@
-<html>
-<meta charset="UTF-8">
-<body>
-<p><a href="/playlist">playlist</a> · <a href="/videos">videos</a> · queries</p>
+{% extends '_base.tmpl' %}
+
+
+{% block body %}
+{{ macros.nav_head("queries") }}
 <p>quota: {{quota_count}}/100000</p>
 <form action="/queries" method="POST" />
 <input name="query" />
@@ -18,5 +19,4 @@
 </tr>
 {% endfor %}
 </table>
-</body>
-</html>
+{% endblock %}
index db9d9a518e7e989468b0c6651568bcc88f732abf..131d14e438c33ab111b9794d9100db71e0d94d7d 100644 (file)
@@ -1,7 +1,8 @@
-<html>
-<meta charset="UTF-8">
-<body>
-<p><a href="/playlist">playlist</a> · <a href="/videos">videos</a> · <a href="/queries">queries</a></p>
+{% extends '_base.tmpl' %}
+
+
+{% block body %}
+{{ macros.nav_head() }}
 <p>query: {{query}}</p>
 <table>
 {% for video in videos %}
@@ -19,5 +20,4 @@
 </tr>
 {% endfor %}
 </table>
-</body>
-</html>
+{% endblock %}
index bcdaabb00375a20db33b7ce2dec098418e8b5d9d..54d005f50c1cc0a2b87eabb3ed9f77e921176de1 100644 (file)
@@ -1,7 +1,8 @@
-<html>
-<meta charset="UTF-8">
-<body>
-<p><a href="/playlist">playlist</a> · <a href="/videos">videos</a> · <a href="/queries">queries</a></p>
+{% extends '_base.tmpl' %}
+
+
+{% block body %}
+{{ macros.nav_head() }}
 <table>
 <tr><th>path:</th><td>{{file.rel_path}}</td></tr>
 <tr><th>YouTube ID:</th><td><a href="/yt_video/{{file.yt_id}}">{{file.yt_id}}</a></tr>
@@ -13,7 +14,4 @@
 {% endfor %}
 <input type="submit" />
 </form>
-</body>
-</html>
-
-
+{% endblock %}
index 14c3a2f64f3227533e4681d6c62890e41197a67a..5cbf47f05fb8fdf879ed39984c2b5153b8e2480a 100644 (file)
@@ -1,12 +1,12 @@
-<html>
-<meta charset="UTF-8">
-<body>
-<p><a href="/playlist">playlist</a> · videos · <a href="/queries">queries</a></p>
+{% extends '_base.tmpl' %}
+
+
+{% block body %}
+{{ macros.nav_head("videos") }}
 <p>downloaded videos:</p>
 <ul>
 {% for video_id, path in videos %}
 <li><a href="/video/{{video_id}}">{{ path }}</a>
 {% endfor %}
 </ul>
-</body>
-</html>
+{% endblock %}
index 358cced6a2c8ce482987fb6de5d8c1c8afe4a4af..1ecb2581591472159f50ee4d33143094738f636f 100644 (file)
@@ -1,7 +1,8 @@
-<html>
-<meta charset="UTF-8">
-<body>
-<p><a href="/playlist">playlist</a> · <a href="/videos">videos</a> · <a href="/queries">queries</a></p>
+{% extends '_base.tmpl' %}
+
+
+{% block body %}
+{{ macros.nav_head() }}
 <table>
 <tr><th>title:</th><td>{{video_data.title}}</td></tr>
 <tr><th>thumbnail:</th><td><img src="/thumbnails/{{video_data.id_}}.jpg" /></td></tr>
@@ -19,6 +20,4 @@
 </td>
 </tr>
 </table>
-</body>
-</html>
-
+{% endblock %}
index 5d7a2f09785430e58308a9334d178a965f25f73a..809787a29c0ba3b5a513f7065c4d2db2af65c915 100644 (file)
@@ -16,7 +16,7 @@ from urllib.parse import urlparse, parse_qs
 from urllib.request import urlretrieve
 from urllib.error import HTTPError
 # non-included libs
-from jinja2 import Template
+from jinja2 import Environment as JinjaEnv, FileSystemLoader as JinjaFSLoader
 from mpv import MPV  # type: ignore
 from yt_dlp import YoutubeDL  # type: ignore
 import googleapiclient.discovery  # type: ignore
@@ -594,6 +594,7 @@ class Server(HTTPServer):
 
     def __init__(self, downloads_db: DownloadsDb, *args, **kwargs) -> None:
         super().__init__(*args, **kwargs)
+        self.jinja = JinjaEnv(loader=JinjaFSLoader(PATH_TEMPLATES))
         self.player = Player()
         self.downloads = downloads_db
 
@@ -743,10 +744,7 @@ class TaskHandler(BaseHTTPRequestHandler):
                                 tmpl_name: PathStr,
                                 tmpl_ctx: TemplateContext
                                 ) -> None:
-        with open(path_join(PATH_TEMPLATES, tmpl_name),
-                  'r', encoding='utf8'
-                  ) as templ_file:
-            tmpl = Template(str(templ_file.read()))
+        tmpl = self.server.jinja.get_template(tmpl_name)
         html = tmpl.render(**tmpl_ctx)
         self._send_http(bytes(html, 'utf8'))