Flam Posté(e) le 14 avril 2020 Partager Posté(e) le 14 avril 2020 Bonjour, Je viens de finir d'écrire un programme qui récupère les face-tagués de Moments et les écrits directement dans les tag-keywords des fichiers images. En fait, on peut en fait récupérer les données de Moments et en faire ce que l'on veut. Le principe (Proof Of Concept) étant écrit , on peut imaginer de rajouter tout un tas de fonctionnalités (synchronisations). Si cela vous intéresse... ATTENTION: VERIFIEZ QUE VOUS AVEZ BIEN BACKUPE VOS FICHIERS IMAGES. Je ne garanti rien, testé chez moi sur 30.000 images (ça prend du temps!) sur les fichiers JPEG, les SVG, BMP, GIF, TIFF, MOV, MP3,... cela dépend de exiftool. #!/bin/bash # Auteur: DanKe # Description: extract recognized face in Synology Moment Database and add them as keyword in image file # Date: 2020/05/03 # Version: 1.03 # Prerequisit: # Moments, psql, exiftool, write access to images # Usage: # moment_copy_facetag.sh <username> # Update: # 1.01: check if keyword already exists in image and write only if not; else file stay unchanged and dont duplicate keyword # 1.02: minor changes # 1.03: add -overwrite_original, factorize PSQL # USER_NAME="$1" HOME_PATH="/volume1/homes" MOMENT_PATH="$HOME_PATH/$USER_NAME/Drive/Moments" PSQL="psql synophoto -t -U postgres" EXIFTOOL="exiftool" SED="sed" if [ $# -ne 1 ] then echo "Usage: $0 <username>" echo " extract recognized face in Synology Moment Database and add them as keyword in image file" exit 1 fi if [ ! -d "$MOMENT_PATH" ] then echo "Error: $MOMENT_PATH does not exist for user $USER_NAME" exit 3 fi USER_ID=`$PSQL -c "SELECT id from user_info where name = '$USER_NAME' ;" | $SED -e 's/ *//'` if [ "$USER_ID" == "" ]; then echo "Error: $USER_NAME not a valid Moments database user" exit 2 fi SUBTABLE="user_$USER_ID" COMMAND="SELECT FORMAT('exiftool -q -overwrite_original -keywords+=\"%1\$s\" -if \'not \$keywords=~/%1\$s/\' \"%2\$s/%3\$s\"', p.n ame, d.name, u.filename) FROM $SUBTABLE.face f INNER JOIN $SUBTABLE.person p ON f.id_person = p.id INNER JOIN $SUBTABLE.unit u O N u.id = f.id_unit LEFT JOIN $SUBTABLE.folder d ON u.id_folder = d.id WHERE p.name != '';" TMPSHELL=/tmp/moments_add_facename_$$.sh $PSQL -c "$COMMAND" \ | $SED -n -e "s/\/Moments\///p" \ > $TMPSHELL cd $MOMENT_PATH chmod +x $TMPSHELL echo "write identifications to file"" /bin/bash $TMPSHELL Lien vers le commentaire Partager sur d’autres sites More sharing options...
DomZ Posté(e) le 30 avril 2020 Partager Posté(e) le 30 avril 2020 Bonjour @Flam, J'ai l'impression que tu connais particulièrement bien la structure de la base de données de moments (synophoto). Je cherche dans quelle table/colonne Moments stocke les tags des personnes (Albums > Personnes). Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Flam Posté(e) le 11 mai 2020 Auteur Partager Posté(e) le 11 mai 2020 En fait la ligne SELECT te donne les informations et les tables en jeux Tables: face, person, unit, folder. SELECT p.name, d.name, u.filename FROM $SUBTABLE.face f INNER JOIN $SUBTABLE.person p ON f.id_person = p.id INNER JOIN $SUBTABLE.unit u ON u.id = f.id_unit LEFT JOIN $SUBTABLE.folder d ON u.id_folder = d.id WHERE p.name != '';" Ensuite c'est à toi de l'adapter selon tes besoins. La BD de Moments est très différente de celle de PhotoStation (déjà Mediaserver+photostation vs Drive+Moments, ensuite les tables). Aucune idée de ce que la fusion promise dans DSM 7 nous réserve. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.