Skip to content
Théo178 edited this page Aug 19, 2026 · 5 revisions

CLI

Branche : cli-converter

Outil en ligne de commande, basé sur sharp (images), potrace (vectorisation SVG), heic-convert (décodage HEIC/HEIF), SheetJS (données) et ffmpeg-static (audio/vidéo, binaire statique installé automatiquement — aucune install système requise).

Installation

Pas publié sur npm — installation depuis le dépôt :

git clone --branch cli-converter https://github.com/BloopStudio/Anyform.git anyform-cli
cd anyform-cli
npm install
npm link   # rend la commande `anyform` disponible globalement (optionnel)

Utilisation

anyform image.svg -t png
anyform *.png -t webp -o ./out --quality 80
anyform photo.jpg -t svg
anyform photo.heic -t png
anyform data.csv -t xlsx
anyform musique.wav -t mp3
anyform clip.mov -t mp4
anyform photo.jpg -c -l strong
anyform clip.mp4 --compress --level light -o ./out
anyform sous-titres.srt -t vtt
anyform info photo.jpg
anyform diff avant.png apres.png

Sans npm link, remplacer anyform par node bin/anyform.js.

Le type de fichier (image / données / audio / vidéo / sous-titres) est détecté automatiquement à partir de l'extension.

Options

Option Description
-t, --to <format> Format de sortie (incompatible avec -c)
-c, --compress Compresse sans changer de format, au lieu de convertir (incompatible avec -t)
-l, --level <level> Niveau de compression : light, medium (défaut), strong
-o, --out-dir <dir> Dossier de sortie (par défaut : à côté du fichier source)
-q, --quality <number> Qualité pour jpg/webp/avif (conversion)
-d, --density <number> DPI utilisé pour rasteriser un SVG en entrée

Il faut préciser exactement l'une des deux options -t ou -c.

Compresseur

Comme sur le web et l'app de bureau, -c/--compress réduit la taille d'un fichier sans changer son format, avec trois niveaux (light/medium/strong). Le fichier compressé est écrit avec le suffixe -compresse.

  • Images — PNG, JPG, WebP, GIF via sharp : quality réduite pour JPG/WebP, redimensionnement pour PNG/GIF. Contrairement au web/à l'app de bureau (Canvas, qui ne sait pas encoder GIF dans Chromium), sharp sait ré-encoder du GIF côté CLI — mais ne sait pas encoder de BMP, qui est donc exclu du Compresseur ici aussi. HEIC/HEIF est décodé puis compressé en PNG.
  • Audio — WAV, MP3, OGG, FLAC, AAC, M4A, WMA, Opus via ffmpeg-static : bitrate réduit (192/128/96 kbps) pour les formats compressés, -compression_level (5/8/12) pour FLAC (sans perte), fréquence d'échantillonnage réduite (44100/32000/22050 Hz) pour WAV (PCM brut, aucune notion de bitrate).
  • Vidéo — MP4, WebM, MOV, MKV, AVI, FLV, OGV via ffmpeg-static, CRF/qscale réduit sur le même codec/conteneur d'origine, audio non retouché (-c:a copy).

Pas d'historique local ni de notifications côté CLI (contrairement au web/à l'app de bureau/à l'extension) : un outil en ligne de commande n'a pas d'état persistant entre deux invocations, et n'a pas de fenêtre à mettre en arrière-plan.

Inspecteur et Comparateur

Deux sous-commandes séparées (pas des options de la commande principale — info n'a pas de format de sortie, diff a besoin d'exactement deux fichiers) :

  • anyform info <file> [--json] — affiche les propriétés d'un fichier sans le modifier : dimensions/ratio (images), durée/résolution/débit estimé (audio/vidéo, via ffmpeg -i et parsing de sa sortie standard — pas de binaire ffprobe séparé), lignes/ colonnes/en-têtes (données), nombre de sous-titres et plage couverte (sous-titres). --json pour une sortie machine-readable plutôt que du texte aligné.
  • anyform diff <fileA> <fileB> [--out <path>] — compare deux fichiers du même type. Images : diff pixel par pixel via sharp (raw pixels), écrite en PNG (<fileA>-diff.png par défaut). Données/sous-titres : diff ligne à ligne (LCS), affichée sur stdout ou écrite dans --out, repli sur empreinte SHA-256 au-delà de 3000 lignes. Reste (audio/ vidéo/xlsx) : empreinte SHA-256 (module crypto de Node) uniquement. ⚠️ Pas de forme courte -o pour --out : Commander résout les options courtes au niveau du programme entier plutôt que par sous-commande, et -o est déjà pris par --out-dir sur la commande racine — un -o sur diff serait silencieusement absorbé par la mauvaise option.

Formats supportés

  • Images — entrée : SVG, PNG, JPG, WebP, GIF, BMP, TIFF, AVIF, ICO, HEIC/HEIF. Sortie : PNG, JPG, WebP, TIFF, GIF, AVIF, ICO, SVG (vectorisation via potrace).
  • Données : CSV ⇄ JSON ⇄ XLSX.
  • Audio : WAV, MP3, OGG, FLAC, AAC, M4A, WMA, Opus.
  • Vidéo : MP4, WebM, MOV, AVI, MKV, FLV, OGV.
  • Sous-titres : SRT ⇄ VTT ⇄ ASS, en pur JavaScript (aucune dépendance). Le style ASS (police, couleur, position) n'est pas préservé — non représentable en SRT/VTT.

Le support HEIC/HEIF a été ajouté après coup pour rattraper le web et l'app de bureau (qui l'avaient depuis le début via heic2any) — heic-convert utilise la même approche (libheif compilé en WebAssembly), donc pas de dépendance système ni d'étape de compilation native à l'installation.

Structure du code

  • bin/anyform.js — interface en ligne de commande (détection de type, routage, sous-commandes info/diff)
  • lib/convert.js — conversion et compression d'images (sharp + potrace + heic-convert)
  • lib/data.js — conversion de données (SheetJS)
  • lib/media.js — conversion et compression audio/vidéo (ffmpeg-static)
  • lib/subtitles.js — conversion de sous-titres SRT/VTT/ASS (texte pur)
  • lib/inspect.js — lecture des propriétés d'un fichier, sans le modifier
  • lib/compare.js — diff entre deux fichiers (image, texte ligne à ligne, ou empreinte)

Versioning

Le patch de package.json est incrémenté automatiquement à chaque push sur cli-converter (workflow bump-version.yml).

Clone this wiki locally