Table des matières
Bonjour à tous,
Aujourd’hui, je vais vous montrer 2 petites astuces que j’ai mis en place pour me faire des raccourcis vers les filtres Wallabag que j’utilise le plus.
Contexte
Tout d’abord, ce sont des options que je pourrai rajouter dans Wallabag directement. Mais honnêtement, je n’y connais rien au PHP et ce n’est pas un langage qui me donne envie d’y passer du temps.
Et quand on regarde les tickets ouverts sur le sujet des filtres, on comprend que le travail sur les filtres est relativement important, pas juste un simple fix ou une petite amélioration (je ne blâme pas les développeurs de Wallabag attention !).
Redirection via regex Traefik
Il y a quelques années, j’avais déjà mis en place une redirection via les regex de Traefik.
Concrètement, j’ai juste mis en place le middleware de cette façon:
1 - "traefik.http.middlewares.wallabag-year-redirect.redirectregex.regex=https://mywallabag.fr/y([0-9]{4})"
2 - "traefik.http.middlewares.wallabag-year-redirect.redirectregex.replacement=https://mywallabag.fr/all/list?entry_filter%5BisUnread%5D=1&entry_filter%5Blanguage%5D=&entry_filter%5BhttpStatus%5D=&entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=&entry_filter%5BdomainName%5D=&entry_filter%5BcreatedAt%5D%5Bleft_date%5D=$1-01-01&entry_filter%5BcreatedAt%5D%5Bright_date%5D=$1-12-31"
Sans oublier de rajouter le middleware à la liste des autres middlewares de mon routeur Wallabag. Par exemple:
1 - "traefik.http.routers.wallabag.middlewares=nocsp-headers@file, wallabag-year-redirect"
Cela me permet donc d’avoir une redirection simple: mywallabag.fr/y2025 pour tous les articles de l’année 2025.
Redirection via script python
Cependant, c’est bien de pouvoir filtrer par années, mais j’ai récemment ressenti un besoin supplémentaire: avoir rapidement les derniers articles ajoutés. Par exemple avoir la liste complète des articles non lus rajoutés sur les 7 derniers jours est relativement pratique. Mais avoir ceux sur 30 jours l’est également pour accéder aux articles un peu plus froids. Cela évite d’être distraits et de crouler sous une montagne d’articles trop vieux (que je vais lire dans un autre contexte).
Pour ce besoin, je ne peux pas jouer avec une regex comme précédemment. Je vais donc faire tourner un mini serveur (python par simplicité et flemmardise) qui va retourner la bonne URL construite dynamiquement.
Voici donc le fameux serveur python (wallabag-shortcuts.py):
1#!/usr/bin/env python3
2import signal
3import sys
4from datetime import date, timedelta
5from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
6from urllib.parse import urlencode
7
8BASE = "https://wallabag.pofilo.fr/all/list"
9LISTEN_PORT = 8080
10
11RANGES = {
12 "/lw": {"days": 7},
13 "/lws": {"days": 7, "max_reading_time": 2},
14 "/l2m": {"days": 60},
15 "/lm": {"days": 30},
16 "/ly": {"days": 365},
17 "/lyl": {"days": 365, "min_reading_time": 5},
18}
19
20
21def target(cfg):
22 today = date.today()
23 return BASE + "?" + urlencode({
24 "entry_filter[isUnread]": 1,
25 "entry_filter[language]": "",
26 "entry_filter[httpStatus]": "",
27 "entry_filter[readingTime][left_number]": cfg.get("min_reading_time", ""),
28 "entry_filter[readingTime][right_number]": cfg.get("max_reading_time", ""),
29 "entry_filter[domainName]": "",
30 "entry_filter[createdAt][left_date]": (today - timedelta(days=cfg["days"])).isoformat(),
31 "entry_filter[createdAt][right_date]": today.isoformat(),
32 })
33
34
35class Handler(BaseHTTPRequestHandler):
36 protocol_version = "HTTP/1.1"
37
38 def do_GET(self):
39 path = "/" + self.path.split("?")[0].strip("/")
40
41 if path == "/health":
42 body = b"ok\n"
43 self.send_response(200)
44 self.send_header("Content-Type", "text/plain")
45 self.send_header("Content-Length", str(len(body)))
46 self.end_headers()
47 self.wfile.write(body)
48 return
49
50 cfg = RANGES.get(path)
51 if cfg is None:
52 self.send_error(404)
53 return
54
55 self.send_response(302)
56 self.send_header("Location", target(cfg))
57 self.send_header("Cache-Control", "no-store")
58 self.send_header("Content-Length", "0")
59 self.end_headers()
60
61 def do_HEAD(self):
62 self.do_GET()
63
64 def log_message(self, *args):
65 pass
66
67
68def _shutdown(signum, frame):
69 sys.exit(0)
70
71
72if __name__ == "__main__":
73 signal.signal(signal.SIGTERM, _shutdown)
74 signal.signal(signal.SIGINT, _shutdown)
75 ThreadingHTTPServer(("", LISTEN_PORT), Handler).serve_forever()
On peut ensuite rajouter ce service docker (j’utilise docker compose):
1 wallabag-shortcuts:
2 image: python:3.14.6-alpine3.24
3 container_name: "wallabag-shortcuts"
4 restart: always
5 command: python -u /app/redirect.py
6 init: true
7 volumes:
8 - ./wallabag-shortcuts.py:/app/redirect.py:ro
9 networks:
10 - traefik-frontend
11 healthcheck:
12 test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8080/health"]
13 interval: 30s
14 timeout: 3s
15 retries: 3
16 start_period: 5s
17 labels:
18 - "traefik.enable=true"
19 - "traefik.docker.network=traefik-frontend"
20 - "traefik.http.services.wallabag-shortcuts.loadbalancer.server.port=8080"
21 - "traefik.http.routers.wallabag-shortcuts.rule=Host(`mywallabag.fr`) && (Path(`/lw`) || Path(`/lws`) || Path(`/lm`) || Path(`/l2m`) || Path(`/ly`) || Path(`/lyl`))"
22 - "traefik.http.routers.wallabag-shortcuts.entrypoints=websecure"
23 # TLS and security
24 - "traefik.http.routers.wallabag-shortcuts.tls=true"
25 - "traefik.http.routers.wallabag-shortcuts.tls.options=intermediate@file"
J’ai ensuite créé un favori Firefox qui pointe vers mywallabag.fr/lw et je peux accéder en 1 clic aux articles des 7 derniers jours.
Conclusion
J’espère que cet article aura pu être utile, il peut s’appliquer à beaucoup d’autres services pour se créer des raccourcis/redirections assez facilement.
On aurait pu imaginer un paramètre dans Wallabag qui prendrait une période au lieu d’une date fixe, dans ce cas, ce serait Wallabag qui calculerait dynamiquement la période appropriée (mais comme je l’ai dit, je n’ai pas trop envie de mettre les mains dans le cambouis, je n’ai pas vraiment le temps).
Ensuite, on peut imaginer d’autres raccourcis: /lws (last week short) pour les articles des 7 derniers jours de moins de 2 minutes (pratique quand on veut lire une mini actualité chaude), etc…







