IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Erreur dans Photos*: La connexion est invalide. (-609)


Sujet :

AppleScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mai 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Erreur dans Photos*: La connexion est invalide. (-609)
    Bonjour,

    J'ai réalisé le script suivant pour exporter des photos depuis l'app Photos vers mon NAS dans des répertoires nommés YYYY-MM-JJ.
    Le script fonctionne correctement pour quelques photos mais parfois au bout d'une centaine de photos j'ai une erreur qui apparait.
    l'erreur suivante apparait de manière aléatoire : Erreur dans Photos*: La connexion est invalide. (-609).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    set TempFolderPath to (path to downloads folder from user domain) as string
    set TempFolderName to "PhotoExportTemp"
    set TempFolder to TempFolderPath & TempFolderName & ":"
     
    -- Message to tell to the user to select photos to export in Photos app
    display dialog "Aller dans l'application Photos pour selectionner les photos ou vidéos à exporter. Lorsque c'est fait, cliquer sur Continuer" buttons {"Quitter", "Continuer"} default button "Continuer" cancel button "Quitter" with icon 2
     
    -- Select the destination folder in which export photos
    set TopFolderPath to choose folder with prompt "Selectionner le dossier dans lequel seront exportées les photos :"
     
    -- get the list of selected pictures in Photos app
    tell application "Photos" to set PicsList to get selection
     
    -- Update the initial progress bar information
    set theImageCount to length of PicsList
    set progress total steps to theImageCount
    set progress completed steps to 0
    set progress description to "Export en cours..."
    set progress additional description to "Préparation à l'export"
     
    set PicProcessed to 1
     
    -- Creation of a temp folder (no permission to export directly to TopFolderPath)
    tell application "Finder"
        if not (folder (TempFolder) exists) then
            make new folder in TempFolderPath with properties {name:TempFolderName}
        else
            try
                do shell script "rm -Rf " & (POSIX path of TempFolder) & "*"
            end try
        end if
    end tell
     
    repeat with aPhoto in PicsList
        set progress additional description to "Export de l'image " & PicProcessed & " sur " & theImageCount
     
        delay 1
     
        -- export photos in TempFolder
        tell application "Photos"
            set SName to filename of aPhoto
            set theDate to date of aPhoto
            export {aPhoto} to alias (TempFolder) with using originals
        end tell
     
     
        -- Creation of Destination folder
        -- convert date to yyyy-mm-dd
        set SY to (year of theDate) as string
        set SM to text -2 thru -1 of ("0" & ((month of theDate) as integer))
        set SD to text -2 thru -1 of ("0" & ((day of theDate) as string))
        set DestFolderName to SY & "-" & SM & "-" & SD -- DestFolder = folder "date" 
     
        set Destfolder to quoted form of ((POSIX path of TopFolderPath) & DestFolderName)
        do shell script "[[ -d " & Destfolder & " ]] || " & "mkdir " & Destfolder
     
        -- copy picture from TempFolder to Destination forlder
        set TempSName to (do shell script "echo " & quoted form of SName & " | cut -d. -f1")
        set TempFileName to quoted form of (POSIX path of TempFolder & TempSName) & "*"
     
        do shell script "cp -p " & TempFileName & " " & Destfolder
     
        -- remove temp file
        try
            do shell script "rm -f " & TempFileName
        end try
     
        set PicProcessed to PicProcessed + 1
        set progress completed steps to PicProcessed
     
    end repeat
     
    do shell script "rm -Rf " & (POSIX path of TempFolder)
    display dialog (theImageCount as string) & " Fichier(s) exportée(s)" buttons {"Ok"} default button 1
    Le problème se situe ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        -- export photos in TempFolder
        tell application "Photos"
            set SName to filename of aPhoto
            set theDate to date of aPhoto
            export {aPhoto} to alias (TempFolder) with using originals
        end tell
    En regardant sur les forum, j'ai vu qu'il fallait ajouter un délai pour éviter l'erreur, ce que j'ai fait, mais j'ai toujours l'erreur.

    Comment faire pour corriger ce problème ?

    Merci d'avance pour votre aide,
    Antony

    PS: j'utilise un répertoire temporaire car je n'ai pas réussi à créer les répertoires sur mon lecteur réseau quand la commande est lancée dans un bloc "tell application Photos"

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 603
    Points : 1 240
    Points
    1 240
    Par défaut
    Bonsoir,
    Photos, tout comme son ancêtre iPhotos, rencontre souvent des problèmes de script lors des exports, ...entre autre.

    Je te suggère de ne pas utiliser la fonction export pour une photo à la fois dans ta boucle, mais de utiliser avec une liste de photos. Cela fait moins d'appels successifs à Export et donc cela bug moins.
    Je viens de re-tester et pas de problèmes sur 100 photos sélectionnées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set dossiertemp to ((path to desktop) as string) & "Dossier_Export:"
    tell application "Photos"
        set ma_liste to selection
    export ma_liste to alias dossiertemp with using originals
    end tell
    Cependant l'inconvénient et qu'il faut ensuite traiter toutes ces photos pour les renommer/déplacer avec le dossier/noms adéquats.

    Cordialement

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mai 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci du conseil, je vais tenter ça ;-)

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mai 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai pris en compte ton conseil, et ça fonctionne parfaitement bien ;-)

    Merci beaucoup !

    Voici donc le code qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    on min(x, y)
    	if x ≤ y then
    		return x
    	else
    		return y
    	end if
    end min
     
     
    set TempFolderPath to (path to downloads folder from user domain) as string
    set TempFolderName to "PhotoExportTemp"
    set TempFolder to TempFolderPath & TempFolderName & ":"
    set PhotosBatchNumber to 100
     
     
    -- Message to tell to the user to select photos to export in Photos app
    display dialog "Aller dans l'application Photos pour selectionner les photos ou vidéos à exporter. 
    Lorsque c'est fait, cliquer sur Continuer.
     
    A noter : Les éléments sont exportés par lots de " & PhotosBatchNumber & ".
    " buttons {"Quitter", "Continuer"} default button "Continuer" cancel button "Quitter" with icon 2
     
    -- Select the destination folder in which export photos
    set TopFolderPath to choose folder with prompt "Selectionner le dossier dans lequel seront exportées les photos :"
     
    -- get the list of selected pictures in Photos app
    tell application "Photos" to set SelectedPhotos to get selection
     
    -- Update the initial progress bar information
    set NumberOfPhotos to length of SelectedPhotos
    set progress total steps to NumberOfPhotos
    set progress completed steps to 0
    set progress description to "Export en cours..."
    set progress additional description to "Préparation à l'export"
     
    set PicProcessed to 1
     
    -- Creation of a temp folder (no permission to export directly to TopFolderPath)
    tell application "Finder"
    	if not (folder (TempFolder) exists) then
    		make new folder in TempFolderPath with properties {name:TempFolderName}
    	else
    		try
    			do shell script "rm -Rf " & (POSIX path of TempFolder) & "*"
    		end try
    	end if
    end tell
     
     
    -- Loop by Batch of PhotosBatchNumber photos
    set FirstItem to 1
    set LastItem to min(PhotosBatchNumber, NumberOfPhotos)
    set ContinueLoop to 1
     
    repeat while ContinueLoop = 1
     
    	set progress additional description to "Export des éléments " & FirstItem & " à " & min(LastItem, NumberOfPhotos)
     
    	set BatchPhoto to items FirstItem thru min(LastItem, NumberOfPhotos) of SelectedPhotos
    	tell application "Photos" to export BatchPhoto to alias (TempFolder) with using originals
     
    	set progress additional description to "Copie des fichiers sur le répertoire destination..."
     
    	tell application "System Events" to set Files_list to get the name of every disk item of alias (TempFolder)
     
    	set item_count to (get count of items in Files_list)
     
    	repeat with i from 1 to item_count
    		set the_properties to ""
     
    		set the_item to item i of the Files_list
    		set the_item to ((TempFolder & the_item) as string) as alias
     
    		tell application "System Events" to set file_info to get info for the_item
     
    		set File_name to displayed name of file_info
    		set theDate to modification date of file_info
     
    		-- Creation of Destination folder
    		-- convert date to yyyy-mm-dd
    		set SY to (year of theDate) as string
    		set SM to text -2 thru -1 of ("0" & ((month of theDate) as integer))
    		set SD to text -2 thru -1 of ("0" & ((day of theDate) as string))
    		set DestFolderName to SY & "-" & SM & "-" & SD -- DestFolder = folder "date" 
     
    		set Destfolder to quoted form of ((POSIX path of TopFolderPath) & DestFolderName)
    		do shell script "[[ -d " & Destfolder & " ]] || " & "mkdir " & Destfolder
     
    		set PathFileName to quoted form of (POSIX path of TempFolder & File_name)
     
    		do shell script "mv " & PathFileName & " " & Destfolder
     
    		set progress additional description to "Copie de l'image " & PicProcessed & " sur " & NumberOfPhotos
    		set PicProcessed to PicProcessed + 1
    		set progress completed steps to PicProcessed
     
    	end repeat
     
    	set FirstItem to FirstItem + PhotosBatchNumber
    	set LastItem to LastItem + PhotosBatchNumber
     
    	if FirstItem > NumberOfPhotos then
    		set ContinueLoop to 0
    	end if
     
    end repeat
     
    do shell script "rm -Rf " & (POSIX path of TempFolder)
    display dialog (NumberOfPhotos as string) & " Fichier(s) exportée(s)" buttons {"Ok"} default button 1

  5. #5
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 603
    Points : 1 240
    Points
    1 240
    Par défaut
    Bonjour,
    Merci de ta confirmation.

    Cependant, tu as éveillé ma curiosité et j'ai comparé plus en détail l'ancien iPhoto et Photos d'un point de vue Applescript.
    J'ai découvert que Apple avait fortement réduit sur Photos, les appels Applescript.
    Par exemple, il est impossible de savoir où est enregistrée une photo dans la librairie de Photos. Tout est verrouillé et limité.
    Visiblement, il en est de même pour Aperture qui utilise la même technologie de fichiers.

    J'ai donc poussé un peu plus loin mes investigations et, si cela intéresse certains, voici le résultat qui permet de reproduire des appels Applescript qui pourraient manquer dans Photos, y compris des appels qui n'ont jamais existé dans iPhotos !

    La structure d'une librairie Photo :
    Tout d'abord, la librairie de Photos est en fait un dossier de type paquet. Un click droit sur cette librairie permet d'ouvrir le paquet qui contient 9 sous dossiers. Les 2 qui nous intéressent ici sont le dossier "Masters" et le dossier "database".
    (je ne détaille pas les autres, mais libre à chacun de fouiller).

    Le dossier "Master" contient tous les média (photo, videos), organisé en cascade de sous dossiers selon la date d'importation dans la librairie. Par exemple si des images ont été importées le 23/10/2015, il y aura un dossier "2015", avec un sous dossier "10", sous dossier "23" et enfin un dossier "20151023-xxxxxx" dans lequel les médias ont été importés.
    Pour les curieux, le xxxxxx est un index unique, généré sans doute par le moteur de base de donnée SQL qui régit toute la librairie Photos.

    Le dossier "database" contient des bases de données SQL, en particulier Library.apdb. On note que Apple a préféré utiliser sa propre extension au lieu du standard .db.
    Cette base de données contient plusieurs tables (beaucoup en fait ! comme les albums, les moments, les faces identifiées, les mots clés,...), mais les explications suivantes se concentreront sur 2 en particulier, les tables VKversion et VKMaster.

    Un peu de SQL
    Le shell de notre Mac contient tout ce qu'il faut pour gérer des bases SQL avec l'utilitaire sqlite3.
    Cela permet de voir que la table VKversion contient, entre autre une colonne Uuid qui contient l'Id du média retourné par Applescript lors d'un appel à un média, et une colonne masterUuid qui contient une référence unique vers la table des média.
    La table VKMaster des médias contient, outre l'index Uuid (le même que masterUuid de VKversion) et les attributs du média, dont son emplacement dans le dossier Masters ... celui que l'on cherche !!
    Donc à partir de l'ID renvoyé par Applescript, il suffit de faire une recherche dans VKversion sur l'index Uuid, puis de récupérer dans l'enregistrement trouvé la valeur de masterUuid, et enfin, d'utiliser cette dernière pour chercher dans la table RKMaster via l'index Uuid pour trouver le chemin d'accès à ce média.



    C'est là que le script d'Antony pourrait s'appliquer en évitant d'exporter les média sélectionnés vers un dossier intermédiaire, pour ensuite les copier ailleurs avec un autre nom.
    On peut, avec la méthode ci-dessous, récupérer directement le chemin Unix de l'image sélectionnée pour faire un copier/renommer avec un classique "cp".

    Un script d'exemple
    Pour mettre en pratique la théorie ci-dessus j'ai écrit le script ci-dessous.
    Je l'ai largement commenté pour être le plus clair possible , pour tous les niveaux.

    Tout est contenu dans le handler litOriginal qui demande 2 paramètres : le chemin unix vers le fichier library.adb et l'Id d'un média sélectionné, récupéré via Applescript.
    Ce handler retourne directement le chemin unix vers le média qui peut être utilisé pour une copie via 'cp'.


    j'ai aussi ajouté un second handler SelectLib qui permet de rassurer tout testeur !
    Ce module n'est pas indispensable mais constitue une sécurité. Si l'utilisateur a déjà copié une sauvegarde du fichier Library.apdb du sous dossier database du paquet photos.photoslibrary , il peut le sélectionner directement. Sinon, une sélection de la [FONT=Verdana]photos.photoslibrary provoquera directement une copie de Library.apbd sur le bureau et toutes les opérations se feront à partir de cette copie.
    [/FONT]Ainsi, si lors de vos tests SQL, vous effacez quelque chose, votre librairie Photos restera intacte.
    (Oui, c'est un peu paranoïaque, mais l'expérience a prouvé que...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    -- utilisation de la base de données SQL de la Photo Library pour récupérer le chemin de l'original
    
    -- selection de la librairie Photos
    set maLib to SelectLib()
    if maLib = "" then return
    
    tell application "Photos"
        set maListe to selection
        repeat with maPhoto in maListe
            set IdPhoto to id of maPhoto
            set Source to my litOriginal(maLib, IdPhoto)
            log "chemin fichier source photo =" & Source
        end repeat
    end tell
    -- fin handler principal
    
    
    
    
    -- *****************************************************
    on litOriginal(localBase, photoId) -- retourne l'URL format shell du fichier Photo à partir de l'ID media de Photos
    -- lecture de la table RKVersion avec uuid=photoId, pour récupérer le champ masterUuid ->mUuid
    -- lecture de la table RKMaster avec uuid=mUuid pour récupérer le champ imagePath
    -- quote est le double guillemet et space est l'espace
        
        set debut to "sqlite3 -line " & localBase & space & quote
        set cible to "select masterUuid from RKversion where uuid = '" & photoId & "'; "
        set Cut3 to " | awk '{print $3}'" -- pour ne prendre que le 3eme terme de la réponse champcolonne =  valeur
        try
            set mUuid to do shell script debut & cible & quote & Cut3
        on error
            return ""
        end try
        set cible to "select imagePath from RKMaster where uuid = '" & mUuid & "'; "
        try
            set chemin to do shell script debut & cible & quote
            set chemin to text 13 thru -1 of chemin
        on error
            return ""
        end try
        return chemin
    end litOriginal
    
    
    -- *****************************************************
    on SelectLib() -- selectionne la librairie Photos et renvoie le chemin vers la base de données de Photos (chemin Unix)
    -- soit l'utilisateur sélectionne le fichier Library.apdb qu'il a préalablement copié par sécurité ->  le chemin vers ce fichier (format shell)
    -- soit l'utilisateur sélectionne la photothèque. Dans ce cas une copie de la librairy.apdb est faite sur le bureau TemLib.apdb , par sécurité ->  le chemin vers ce fichier copié
        
    -- fSelect = fichier sélectionné, FExt = son extension, fNom = nom du fichier
    -- maBase = fichier database SQL utlisé par Photos
    -- fFinal = le fichier database final
        try
            set fSelect to choose file with prompt "Sélectionner la librairie Photos ou la copie de sa base de données" default location (path to pictures folder)
        on error
            return "" -- si l'utilisateur annule
        end try
        tell application "System Events" to set fNom to name of fSelect
        set FExt to (do shell script "echo " & quoted form of fNom & " | cut -d. -f2")
        if FExt is "photoslibrary" then
            set maBase to (fSelect as string) & "database:Library.apdb"
            tell application "System Events" to if not (file maBase exists) then return ""
            try
                set fFinal to quoted form of (POSIX path of (path to desktop folder) as string) & "TempLib.apdb"
                do shell script "cp " & (quoted form of (POSIX path of maBase)) & " " & fFinal
                return fFinal
            end try
        else if FExt is "apdb" then
            return quoted form of (POSIX path of fSelect)
        else
            return "" -- l'utilisateur n'a pas sélectionné un fichier approprié
        end if
    end SelectLib
    Voilà !
    J'espère avoir éclairé quelques lanternes sur la partie cachée de Photos.
    On peut faire plein d'autres choses avec les multiples tables de Library.apdb.
    Il n'y a pratiquement pas de limite à votre imagination.
    je me suis par exemple amusé à regarder dans le table person.db la position des yeux permettant entre autre d'identifier les visages...

    Cordialement

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/11/2016, 13h52
  2. erreur dans votre requête SQL.Ponctuation invalide @ 48
    Par Artoisvert dans le forum Débuter
    Réponses: 0
    Dernier message: 11/07/2008, 02h12
  3. [GD] Erreur dans galerie photo : Call to undefined function: imagecreatefromjpeg()
    Par philippedeletree dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 21/02/2006, 22h51
  4. [js] erreur dans un prog; de déplacement de photos
    Par TERRIBLE dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 31/12/2005, 10h59
  5. [BDD] Erreur dans la connexion à une base MySQL
    Par dodo10 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2005, 19h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo