Dance Videos
L'utilisateur prend des vidéos de ses cours de danses avec son iPhone, en télécharge depuis son application whatsapp quand on lui partage et enregistre l'écran de son téléphone quand certaines vidéos de danses apparaissent.
Les vidéos de l'iPhone sont au format .mov et possèdent des tags permettant d'identifier le lieu et le datetime de l'enregistrement. Les autres sont en général au format .mp4 et le datetime correspond à la réception et non au moment de la danse.
L'utilisateur souhaite dans un premier temps organiser ces vidéos (vidéos de cours, de démo). Dans un deuxième temps les convertir à un format adapté à son projecteur pour ses répétitions.
Un début de solution a été imaginé:Quand l'utilisateur "air drop" ses vidéos vers son MacBook pro M4, cela déclenche un script qui déplacera toutes les vidéos du dossier Téléchargement vers un premier dossier de travail et enclenchera le programme que l'on concevra ensemble.
Ce programme se chargera de convertir chaque vidéos en .mp4 (en conservant les tags si possibles) et en renomant les vidéos aussi bien que possible avec un label parlant.
On développera plus tard la manière de construire les règles d'organisation (une combinaison de machine learning et de llm assisté par l'utilisateur).
Quand l'utilisateur branche sa carte SD avec un nom bien défini ("SD Danse" par exemple), un programme se déclenche pour synchroniser son contenu avec le dossier de sortie où les vidéos sont organisées.
Prérequis
- Mac
- Une carte SD nommée SD_DANSE formatée en
MS-DOS (FAT32)pour un meilleur support des projecteurs - les programmes parallel, exiftool et ffmpeg
brew install parallel exiftool ffmpeg uv venv --prompt DanceVideos --allow-existing .venv -p 3.12source .venv/bin/activate && uv pip install -r app/requirements.txt && uv tool install streamlitstreamlit run app/app.py
Surveillance des répertoires
./trigger/trigger.sh
Architecture
---
config:
logLevel: debug
theme: forest
layout: elk
---
flowchart TB
subgraph s1["~/Documents/.DanceVideos/"]
raw[".DanceVideos/<b>raw</b><br><br><i>00_00.mov, xxxxxx_xxxx_xxxx_xxxx.mp4, ScreenRecordingaaaa-mm-dd_hh-mm-ss.mp4</i>"]
playlists[".DanceVideos/<b>playlists</b><br><br><i>directories of symbolic links to the videos</i>"]
videos[".DanceVideos/<b>videos</b><br><br><i>/aaaammdd_hhmmss/<br>video.mp4 videoRotated.mp4 thumbnail.jpeg</i>"]
pgrm1["program1"]
bdd["db.sqlite"]
pgrm2["program2"]
end
ios["<b>Iphone</b>"] L_ios_dll_0@-. air drop .-> dll["~/Downloads/"]
playlists L_playlists_SD_0@== "onSD_DANSEMount.sh" ==> SD["<b>SD card</b>"]
dll L_dll_raw_0@== "onAirDropDownload.sh" ==> raw
raw L_raw_pgrm1_0@=== pgrm1
pgrm1 L_pgrm1_videos_0@== ffmpeg ==> videos
pgrm1 -- 1) register videos --> bdd
app["DanceVideos App"] -- 2) classify, register playlists --> bdd
pgrm2 -- 3) convert playlists to directories of symlink --> playlists
pgrm2 --- bdd
videos L_videos_playlists_0@-.- playlists
raw@{ shape: docs}
playlists@{ shape: docs}
videos@{ shape: docs}
pgrm1@{ shape: text}
bdd@{ shape: db}
pgrm2@{ shape: text}
ios@{ shape: rect}
dll@{ shape: docs}
SD@{ shape: das}
app@{ shape: rect}
linkStyle 0 stroke:#D50000,fill:none
linkStyle 1 stroke:#D50000,fill:none
L_ios_dll_0@{ animation: fast }
L_playlists_SD_0@{ animation: slow }
L_dll_raw_0@{ animation: fast }
L_raw_pgrm1_0@{ animation: slow }
L_pgrm1_videos_0@{ animation: slow }
L_videos_playlists_0@{ animation: fast }
TODO
- Pouvoir supprimer une vidéo / regénérer une vidéo