Aller au contenu

Ecrire les Personnes-taguées dans la base de donnée Moments dans les fichiers images


Flam

Messages recommandés

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

  • 2 semaines après...
  • 2 semaines après...

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.