Aller au contenu

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

Featured Replies

Posté(e)

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

 

Modifié par Flam
MAJ overwrite original image file

  • 2 semaines après...
Posté(e)

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

  • 2 semaines après...
Posté(e)
  • Auteur

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.

Modifié par Flam

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.