Bibliothèque vidéo partagée par URL signées

Extrait de li.k3nny.fr et rendu indépendant du serveur : toute la
configuration propre à l'hôte passe par li.env (URL publique, chemins,
expiration, répertoires « HTML seulement », commande nginx).

Écarts avec la version en production :
- li-user del retire aussi la page .html, pas seulement le .xspf ;
- li-gen ignore les répertoires cachés, pas seulement les fichiers ;
- textes de la page HTML accentués.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-27 10:06:08 +02:00
co-authored by Claude Opus 5.5
commit 1e63e4fe80
12 changed files with 1001 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
"""python3 -m unittest discover tests"""
import importlib.machinery
import importlib.util
import subprocess
import unittest
from pathlib import Path
_chargeur = importlib.machinery.SourceFileLoader(
"li_gen", str(Path(__file__).resolve().parent.parent / "bin" / "li-gen"))
_spec = importlib.util.spec_from_loader("li_gen", _chargeur)
li_gen = importlib.util.module_from_spec(_spec)
_chargeur.exec_module(li_gen)
class Signature(unittest.TestCase):
def test_identique_a_openssl(self):
# Ce que calcule li-user, donc ce que verifie secure_link_md5.
chemin, secret = "/library/movies/Été à Paris/The Janitor’s Boy.mkv", "abc123"
brut = f"2145916800{chemin}{secret}"
attendu = subprocess.run(
["sh", "-c", "printf '%s' \"$1\" | openssl md5 -binary | openssl base64 "
"| tr '+/' '-_' | tr -d '='", "sh", brut],
check=True, capture_output=True, text=True).stdout.strip()
self.assertEqual(li_gen.signe(chemin, 2145916800, secret), attendu)
def test_signe_le_chemin_decode(self):
cfg = li_gen.Config({"LI_BASE_URL": "https://li.example.org/"})
u = li_gen.url(cfg, "/library/a b’c.mkv", "alice", "s3cret")
self.assertTrue(u.startswith("https://li.example.org/library/a%20b%E2%80%99c.mkv?"))
self.assertTrue(u.endswith("&s=" + li_gen.signe("/library/a b’c.mkv", 2145916800, "s3cret")))
class Configuration(unittest.TestCase):
def test_base_obligatoire(self):
with self.assertRaises(SystemExit):
li_gen.Config({})
if __name__ == "__main__":
unittest.main()