Récupérer et classer vos photos iCloud en PowerShell

Récupérer ses données iCloud

Apple propose un portail dédié permettant de récupérer toutes ses données hébergées sur iCloud. Le fonctionnement est simple, il vous suffit de vous connecter sur l’URL suivante et de vous identifier : https://privacy.apple.com/account.

Une fois que c’est fait, vous pourrez choisir les services pour lesquels vous souhaitez récupérer vos données (en fonction l’attente sera plus longue).

iCloud - Data and Privacy
iCloud – Data and Privacy

Pour ma part, j’étais intéressé uniquement les photos de ma Galerie et mes Notes. La taille à récupérer pouvant être conséquente, vous devrez également définir le poids unitaire de chaque fichier ZIP à récupérer. En gros, si vous avez 10 Go de données à récupérer, Apple va les répartir dans 2 fichiers Zip de 5 Go (c’est-ce que j’ai pris).

Qu’obtenons-nous d’Apple ?

Après quelques jours d’attente, j’ai reçu un email d’Apple et 4 fichiers ZIP à récupérer : Photos iCloud Lot 1 sur 4. L’ensemble pesait un peu plus de 16 GB une fois décompressé.

Données extraites de iCloud
Données extraites de iCloud

Seul problème – comme tous les fournisseurs de services, vous pouvez récupérer vos fichiers certes mais sans conserver votre arborescence avec les dossiers ou les albums que vous aviez créé sur vos terminaux. Bref, vous avez plein de photos en pagaille. 🙁

Cela me rappel un peu le backup que l’on peut faire de sa boîte Gmail et Google qui fournit un fichier avec une extension spécifique “MBOX” qui ne peut pas être lu facilement par Outlook, Thunderbird ou la plupart des outils de messagerie… 🙁

Le premier fichier ZIP contient donc plusieurs dossiers :

  • Albums and Favorites (Fichiers CSV correspondant à mes Albums)
  • Memories (je n’utilise pas)
  • Photos (première série de photos – nous retrouverons la suite dans les autres ZIP)
  • iCloud Shared Albums.Zip (je n’utilise pas)
Contenu du premier fichier ZIP - iCloud
Contenu du premier fichier ZIP – iCloud

Tous les autres fichiers ZIP ne contiendront qu’un seul sous-dossier nommé simplement Photos. Si vous regardez dans le dossier Albums and Favorites, vous retrouverez une liste de fichier CSV. Chaque fichier CSV correspond à l’un de vos Albums iCloud avec la liste photos qui appartenaient à cet album.

Liste des fichiers CSV - iCloud
Liste des fichiers CSV – iCloud

Classement des photos grâce à PowerShell

Sachant que j’avais laissé plus de 1200 photos sur mon compte iCloud sans aucun classement. J’ai donc cherché un moyen d’automatiser l’utilisation de ces fichiers CSV afin de pouvoir retrouver sur mon PC la même organisation que j’avais sur mon iPhone avec les Albums.

J’ai utilisé PowerShell. La méthode que je vais décrire ci-dessous a fonctionné pour moi. Mais en fonction de vos données – elle pourrait nécessiter des adaptations. Donc n’exécutez pas directement les lignes PowerShell sans regarder votre cas d’usage. 🙂

Etape 1 – Regroupement de toutes les Photos

Prenez toutes les photos qui se trouvent dans chaque sous-dossier Photos et regroupez les dans un seul et même dossier. Dans mon cas, il s’agit du dossier : C:\Users\thibault\Desktop\iCloud\Photos iCloud Lot 1 sur 4\Photos.

Tous les anciens dossiers ..\Photos iCloud Lot 2 sur 4\Photos ; ..\Photos iCloud Lot 3 sur 4\Photos ; ..\Photos iCloud Lot 3 sur 4\Photos sont donc vides désormais.

Etape 2 – Re-créez une arborescence correspondant à vos Albums iCloud

Les quelques lignes ci-dessous vont nous permettre de re-créer automatiquement l’arborescence de nos Albums iCloud en dossiers Windows.

# Variables
$PathToAlbumsandFavorites = "C:\Users\thibault\Desktop\iCloud\Photos iCloud Lot 1 sur 4\Albums and Favorites"

# Creation des Albums / Dossiers
(Get-ChildItem -Path $PathToAlbumsandFavorites).Name | ForEach-Object { ($_).ToString().Replace(".csv","") | ForEach-Object { New-Item $($PathToAlbumsandFavorites + "\" + $_) -ItemType Directory -Force } }

Par défaut, je vais les créer dans le dossier suivant : ..\iCloud\Photos iCloud Lot 1 sur 4\Albums and Favorites. Chaque dossier portera le même nom que chaque fichier CSV – 1 par ancien Album iCloud.

Etape 3 – Ranger toutes les photos dans chaque dossier

La prochaine étape consiste maintenant à lire l’ensemble des fichiers CSV. Puis pour chaque nom de fichier image, nous allons regarder dans quel fichier CSV elle est mentionnée ce qui nous donnera alors l’album d’appartenance de la photo. Puis, nous déplacerons le fichier dans le dossier correspondant à l’Album.

# Récupération des infos de tous les fichiers CSV
$CSVFiles = Get-ChildItem -Path $PathToAlbumsandFavorites -Name "*.csv"

# Pour chaque fichier CSV
foreach ($item in $CSVFiles)
{
    Write-Host "[INFO] - Album en cours : " $item -ForegroundColor Red
    $Images = Import-Csv $item

    # Pour chaque image dans l'Album en cours
    foreach ($img in $Images.Images)
    {
        # Si l'image appartient à l'Album - On la déplace dans le dossier
        if (($Images.Images -contains $img) -eq "True")
        {
            Write-Host $("[MOVE] - Déplacement de : " + $($img) + " vers le dossier : " + ($item.ToString().Replace(".csv",""))) -ForegroundColor Green
            Move-Item -Path $($PathAllPhotos + "\" + $img) -Destination $($PathToAlbumsandFavorites + "\" + ($item.ToString().Replace(".csv","")))
            #Break # Debug
        }
    }
}

Après quelques secondes d’exécution, j’ai donc pu retrouver dans chacun de mes dossiers mes photos bien organisées. Cela fonctionne pour les images mais aussi pour les vidéos.

Exemple exécution 1
Exemple exécution 1
Exemple exécution 2
Exemple exécution 2

Pour un nombre limité de photos, j’ai reçu des erreurs car elles n’appartenaient à aucun Album iCloud. Il s’agissait probablement de photos que je n’avais associé à aucun Album. J’ai pu traiter les quelques photos à la main. 🙂

L’ensemble du code est visible sur GitHub : Plus d’infos sur le lien suivant.