*[English](README.md) | **Français*** # blink2video **Gérez vos caméras Blink depuis un ordinateur, et gardez ce qu'elles filment.** Blink est pensé pour le téléphone : un clip à la fois, aucune archive, pas d'équivalent sur ordinateur. Les enregistrements vivent sur la clé USB d'un Sync Module 2 ou la carte microSD d'un Sync Module XR, effacés à mesure que le support se remplit, ou dans le cloud de l'abonnement, qui les garde quelques semaines. blink2video est le versant manquant. Une interface locale pour voir les caméras en direct et armer la détection. Et ce que le téléphone ne sait pas faire : récupérer les clips avant que la rotation ne les efface, incruster l'heure dans l'image, et les assembler en une vidéo par jour, par semaine et par mois. Tout tourne sur votre machine. Rien n'est envoyé ailleurs. L'interface web n'écoute que sur `127.0.0.1` : rien d'autre sur votre réseau local ne peut l'atteindre, seulement cette machine. Elle n'a pas de mot de passe propre au-delà de la session du compte Blink : quiconque a accès à cette machine peut donc l'ouvrir. ## Présentation vidéo [![Voir la présentation de blink2video : Blink sur votre PC, direct et archives](https://i.ytimg.com/vi/V2E4m_SLgb4/hqdefault.jpg)](https://www.youtube.com/watch?v=V2E4m_SLgb4) **[Voir la présentation française sur YouTube](https://www.youtube.com/watch?v=V2E4m_SLgb4)** : 3 min 10 s, avec sous-titres et sans voix off. Découvrez pourquoi blink2video existe, le direct et les archives, puis l'installation sous Windows, le premier lancement et les principaux réglages. [English version](https://www.youtube.com/watch?v=6rNqLI9K8Tc). ## Fonctionnalités - Visionnage du direct de n'importe quelle caméra dans le navigateur, armement du système ou d'une seule caméra. - Son de la caméra dans le direct et les enregistrements (Réglages → Vidéo), en sourdine au démarrage avec contrôle d'écoute partagé par page. - Enregistrement du direct à la demande, un clic pendant le visionnage : conservé dans sa propre archive, consultable et filtrable exactement comme les clips de détection (écarter, supprimer, filtre caméra et période). - Photo à la demande, un clic depuis la vignette du direct ou déclenchée à distance via une URL webhook (domotique, bouton connecté) : conservée dans Photos, consultable et supprimable depuis la page. - Webhook sortant facultatif (Réglages) : un simple POST HTTP avec le nom de la caméra et le chemin du fichier, envoyé une fois qu'un clip ou une photo a vraiment fini d'être écrit, pour n'importe quel outil de domotique qui sait déjà en recevoir un. - Téléchargement incrémental des clips de détection de mouvement depuis le stockage local du module (clé USB du Sync Module 2 ou carte microSD du XR) et depuis le cloud de l'abonnement, sans jamais rapatrier deux fois le même enregistrement. L'historique des clips traités est conservé à côté de `Blink_Clips` : purger ce dossier ne déclenche pas leur téléchargement ni une nouvelle notification. - Affichage de l'état des caméras : batterie, température, signal, modèle et micrologiciel de chaque caméra. - Incrustation de la date et heure dans l'image, donc conservée par n'importe quel lecteur. Taille, couleur, opacité du bandeau et heure sur 24 h ou 12 h (AM/PM) configurables. - Création d'une vidéo par jour, par semaine ISO et par mois, pour chaque caméra. - Possibilité d'écarter les clips sans intérêt d'un clic, mis de côté plutôt que supprimés, et jamais retéléchargés. - Surveillance continue et alerte : caméra hors ligne, batterie faible, détection coupée, ou rien d'enregistré depuis deux jours. Alerte à acquitter, sourdine par caméra. - Français et anglais partout : interface web, notifications, et la sortie console de chaque commande. Détecté depuis le navigateur, changeable depuis la page. - Logiciel autonome pour Windows, Linux et macOS, ffmpeg inclus. ## Captures d'écran ![L'onglet Direct](Screenshots/serve_direct.fr.PNG) Le Direct : une tuile par caméra, sa dernière vignette, l'armement du système et de chaque caméra, la batterie, la température, le signal et la date du relevé. Une caméra hors ligne continue d'annoncer ses dernières valeurs connues, et l'interface dit de quand elles datent. ![Enregistrer le direct](Screenshots/direct_record_fr.PNG) Le bouton Enregistrer, en cours d'enregistrement (« Arrêter l'enregistrement », en rouge) : un clic pour commencer à sauvegarder le direct dans `Blink_Direct`, un clic pour arrêter. Les enregistrements apparaissent dans Directs Enregistrements, consultables et filtrables exactement comme les clips de détection. Pour inclure le son de la caméra dans le direct et les enregistrements, activez **Réglages → Vidéo → Inclure le son de la caméra dans le direct et les enregistrements**. Cette option est désactivée par défaut et concerne les nouvelles sessions. Avec le son, le direct utilise le mode compatible MSE, qui peut démarrer plus lentement. Utilisez **Écouter/Couper le son** dans le direct ou le volume du lecteur des vidéos sauvegardées. Si le canal principal reste silencieux, essayez **Alternatif** dans les réglages. Sans piste audio, la vidéo reste lisible. La lecture commence en sourdine. Activer le son d'une vidéo conserve ce choix et le volume pour les autres vidéos de la même page, y compris les lecteurs recréés pendant le défilement. Changer de vue, de page de galerie ou de filtre, ou recharger la page, remet la lecture en sourdine. La sourdine de lecture ne change pas le son enregistré. Les anciennes vidéos sans son restent sans son. ![L'onglet Clips](Screenshots/serve0.fr.PNG) Les clips du plus récent au plus ancien. Chaque carte donne la caméra, la durée, la date et le modèle, et le bouton « Écarter » retire le clip de toutes les vidéos assemblées. ![Le panneau de filtre](Screenshots/filtre.fr.PNG) Un seul bouton Filtre pour la caméra et la période ensemble : préréglages rapides (aujourd'hui, cette semaine, ce mois-ci, 2 derniers mois, ou tout l'historique) ou une plage personnalisée à l'heure près, pour retrouver un incident précis sans défiler tout l'historique d'une caméra toujours armée. Le filtre choisi reste mémorisé d'une visite à l'autre. ![Le panneau de réglages](Screenshots/settings.fr.PNG) Les réglages, derrière l'icône engrenage : démarrage automatique à l'ouverture de session, actualisation automatique de la page, port du serveur, dossier des vidéos avec un sélecteur natif, et cadence de lecture du stockage local et du cloud. Aussi l'horodatage incrusté dans l'image avec sa taille, sa couleur, l'opacité de son bandeau et l'heure sur 24 h ou 12 h, le fuseau horaire, le protocole du direct (WebRTC ou MSE), l'archivage quotidien/hebdomadaire/mensuel activable indépendamment, la mise en sourdine des alertes par caméra, la suppression automatique après téléchargement par caméra, et un bouton pour arrêter toute la surveillance sans passer par le mode CLI. ## Démarrer **1. Installer.** Téléchargez l'archive de votre système depuis la [dernière version publiée](https://github.com/nico579/blink2video/releases/latest) et décompressez-la. ffmpeg voyage dans le bundle, rien n'est installé dans le système. | Système | Archive | Premier lancement | |---|---|---| | Windows 10/11, x86-64 | `blink2video-windows-x86_64.zip` | `blink2video.exe` depuis un terminal | | Linux x86-64, glibc 2.35+ (Ubuntu 22.04+, Debian 12+) | `blink2video-linux-x86_64.tar.gz` | `chmod +x blink2video`, puis `./blink2video` | | macOS 12+, Apple Silicon | `blink2video-macos-arm64.zip` | `xattr -dr com.apple.quarantine blink2video`, puis `./blink2video` | Les archives embarquent WebRTC, le protocole par défaut du direct. Sous macOS, ses bibliothèques exigent macOS 14 ou plus : sous macOS 12 et 13, blink2video démarre normalement et le direct retombe sur MSE. Windows 7 SP1 x64 dispose d'une [édition legacy séparée](WINDOWS7.md), publiée aux côtés de chaque [release](https://github.com/nico579/blink2video/releases/latest). Pour le WebRTC natif, utiliser Supermium 144 R5 ou Thorium Legacy 122, validés sur les caméras réelles ; conserver MSE avec Firefox ESR 115. Voir le [tableau des navigateurs testés](WINDOWS7.md#quel-navigateur-utiliser-pour-webrtc-). **2. Le lancer.** Double-clic sur l'exécutable (ou `./blink2video` depuis un terminal). Aucun argument nécessaire : sans session valide, un onglet s'ouvre tout seul sur une page de connexion : votre adresse, votre mot de passe, puis le code que Blink envoie. Seul un jeton de session est conservé, jamais le mot de passe. Lors de la toute première utilisation, le panneau Réglages s'ouvre ensuite automatiquement. Vérifiez notamment le dossier des vidéos et le fuseau puis cliquez sur « Appliquer » : aucun clip n'est téléchargé avant cette validation. La surveillance, le rapatriement des clips et l'assemblage démarrent alors, chacun à son rythme, et les clips apparaissent au fur et à mesure. Ce parcours n'est pas répété lorsque le dossier des vidéos est changé. Si l'onglet ne s'est pas ouvert, ou que vous l'avez fermé, `blink2video open` le rouvre. Une icône apparaît aussi dans la zone de notification quand `start` tourne (Windows/macOS ; sous Linux, selon la prise en charge de votre bureau), avec Ouvrir/Redémarrer/Arrêter, sans passer par le terminal. **3. Réglages.** L'icône engrenage, en haut à droite, ouvre un panneau : démarrer automatiquement à l'ouverture de session, actualiser la page toute seule à l'arrivée des clips, la fréquence de lecture du stockage local et du cloud, et un bouton pour tout arrêter. `blink2video autostart on` et `blink2video stop` font la même chose depuis un terminal, si vous préférez.
Depuis les sources, avec Python 3.11 ou plus récent ```bash git clone https://github.com/nico579/blink2video cd blink2video python blink2video.py login ``` Le premier lancement crée un environnement isolé dans `~/.blink2video/venv` et s'y relance. `blink2video smoketest` vérifie ensuite que tout fonctionne sur votre machine. Le binaire publié n'est ni signé ni notarisé : sous macOS, Gatekeeper refuse le premier lancement d'une archive téléchargée par un navigateur, d'où le `xattr` du tableau. Un clic droit puis « Ouvrir » fait la même chose. Si le message est « Apple n'a pas pu vérifier [...] logiciel malveillant », c'est ce contrôle, pas une détection réelle de malware : ça signifie juste qu'aucun compte développeur Apple (99 $/an) n'a signé le binaire.
Avec Docker ```bash git clone https://github.com/nico579/blink2video cd blink2video docker compose up -d ``` Ou, sans cloner, avec l'image publiée sur [Docker Hub](https://hub.docker.com/r/nico579dock/blink2video) : ```bash docker run -d --name blink2video --restart unless-stopped \ -p 127.0.0.1:8765:8765 -e BLINK_TRUSTED_LOOPBACK_PROXY=1 \ -v blink_data:/data nico579dock/blink2video ``` Ouvrez `http://127.0.0.1:8765` et connectez-vous de la même façon. Réglages, session et clips persistent dans un volume nommé (`blink_data`), séparé de l'image : reconstruire l'image ne perd jamais rien. Le `docker-compose.yml` fourni publie le port sur `127.0.0.1` uniquement, comme le binaire par défaut : il n'y a aucune connexion sur le tableau de bord lui-même, donc rien au-delà de cette machine ne peut l'atteindre sauf à élargir volontairement la publication du port.
Y accéder à distance (reverse proxy) Le tableau de bord n'ayant aucune connexion, le serveur n'accepte que les requêtes dont l'en-tête `Host` vaut `127.0.0.1`, `localhost` ou `::1`, en plus d'exiger que la connexion elle-même vienne de cette machine (une vérification que `BLINK_TRUSTED_LOOPBACK_PROXY=1` assouplit pour le pont Docker ci-dessus, voir son commentaire dans `docker-compose.yml`). Un reverse proxy sur la même machine satisfait automatiquement la deuxième condition, mais par défaut il transmet le `Host` envoyé par le navigateur (son nom public ou son adresse LAN), pas `127.0.0.1`, et se fait donc refuser avec un 403 tant qu'on ne lui a pas dit de le réécrire. Un simple relais TCP (`socat`, la redirection de port d'un routeur) ne peut pas faire cette réécriture : il ne voit jamais les en-têtes HTTP, donc aucune configuration ne le fera atteindre ce serveur ; il faut toujours un reverse proxy qui comprend le HTTP. Le navigateur envoie aussi un en-tête `Origin` dès qu'il fait plus que charger la page (enregistrer un réglage, arrêter la surveillance, mettre une alerte en sourdine...), et le serveur le vérifie de la même façon. Un proxy qui ne réécrit que `Host` laisse `Origin` à l'adresse réellement utilisée par le navigateur : la page elle-même s'affiche très bien, mais chacune de ces actions se fait quand même refuser. Les deux en-têtes doivent être réécrits. Caddy : ``` mondomaine.exemple { reverse_proxy 127.0.0.1:8765 { header_up Host 127.0.0.1 header_up -Origin } } ``` nginx : ``` location / { proxy_pass http://127.0.0.1:8765; proxy_set_header Host 127.0.0.1; proxy_set_header Origin ""; } ``` Mettez votre propre authentification (mot de passe HTTP basique, certificat client, liste d'accès) devant l'un ou l'autre : c'est le proxy qui est joignable depuis le réseau, blink2video lui-même n'en a toujours aucune. Avec un VPN maillé (Tailscale, WireGuard) plutôt qu'un nom de domaine public, la même réécriture s'applique toujours : la vérification ne regarde que l'en-tête `Host`, jamais la façon dont la connexion est arrivée. ``` http://100.x.y.z:9765 { reverse_proxy 127.0.0.1:8765 { header_up Host 127.0.0.1 header_up -Origin } } ``` (`100.x.y.z` est l'adresse Tailscale de cette machine, donnée par `tailscale ip` ; le `http://` explicite évite que Caddy ne provisionne un certificat que personne n'a demandé.) Aucune authentification séparée n'est nécessaire dans ce cas : seuls vos propres appareils sur ce réseau peuvent même atteindre l'adresse. Cela veut aussi dire que la réécriture ci-dessus est inutile sur un VPN maillé : lier blink2video directement à l'adresse du tunnel avec `BLINK_BIND`, puis régler cette même adresse comme « Hôte de confiance » depuis les Réglages, ou la passer une fois avec `--trusted-host 100.x.y.z` (conservé ensuite comme n'importe quel réglage). blink2video accepte alors les requêtes qui lui sont adressées directement, sans proxy entre les deux. Ne faites confiance qu'à cette adresse précise, et gardez `BLINK_BIND` sur elle aussi, jamais `0.0.0.0`, qui accepterait alors le même `Host` depuis le LAN aussi et annulerait l'intérêt. L'hôte de confiance accepte aussi tout un sous-réseau en notation CIDR, par exemple `192.168.1.0/24`, pour un client sans adresse fixe (une machine Windows en DHCP, par exemple) plutôt qu'un seul pair VPN précis. C'est une garantie différente, plus large : n'importe quel appareil déjà sur ce sous-réseau obtient le même accès sans authentification, pas seulement l'unique machine qu'un tunnel VPN laisserait passer. Raisonnable sur un LAN domestique de confiance, jamais sur un réseau que vous ne maîtrisez pas entièrement. Un hôte de confiance exact (une adresse IPv4 ou un nom, pas un sous-réseau CIDR) permet aussi d'intégrer la page dans une `