Create > descript.ion file

Ideas for improvements and requests for new features in XnView MP

Moderators: XnTriq, helmut, xnview

User avatar
michel038
XnThusiast
Posts: 1434
Joined: Tue Sep 27, 2016 8:18 am
Location: France

Create > descript.ion file

Post by michel038 »

En
At the root of my photo folder, a 60 Kb descript.ion file contains about 70 lines (the 70 folders contained).
Each line begins with the folder name (ex “2021” ) followed by information separated by spaces.
I used Windows powershell and exiftool to recursively go through all the folders, collecting iptc:city iptc:region-state and the folder names and possibly the file names.
This information is then processed, eliminating duplicates, to form the line corresponding to the folder being processed.

In the root folder, all I have to do is type a few letters or a word in the quick search to obtain the folder containing them.
This folder also contains a descript.ion file to get the next subfolder..
It's extraordinarily efficient.

A tool in xnviewmp that could perform this task for a selected folder would be smart.
As parameters, you just need to be able to choose the fields to be collected, as in “File list”.

FR
A la racine de mon dossier de photos, un fichier descript.ion de 60 Ko contient environ 70 lignes (les 70 dossiers contenus)
Chaque ligne commence par le nom de dossier ( ex "2021" ) suivi par des informations séparées par des espaces.
J'ai utilisé Windows powershell et exiftool pour parcourir récursivement tous les dossiers, collecter iptc:city iptc:region-state et les noms de dossiers, et eventuellement les noms de fichiers (pas dan mon cas)
Un traitement rassemble ces informations, élimine les doublons , pour constituer la ligne correspondant au dossier traité.

Au dossier racine, il me suffit de taper quelques lettres ou un mot dans la recherche rapide, pour obtenir le dossier qui les contient.
Ce dossier contient aussi un fichier descript.ion pour obtenir le sous répertoire de rang suivant
C'est d'une efficacité extraordinaire.

Un outil dans xnviewmp qui pourrait réaliser cette tâche pour un dossier sélectionné, ce serait smart
En paramètres , il suffit de pouvoir choisir des champs à collecter exactement comme dans "Liste de fichiers"
User avatar
user0
XnThusiast
Posts: 2062
Joined: Sat May 09, 2015 9:37 am

Re: Create > descript.ion file

Post by user0 »

Create > File listing ?
on the other hand, why bother with external txt files when you have db, Catalog filter pane and Advanced/Quick search already in place
User avatar
michel038
XnThusiast
Posts: 1434
Joined: Tue Sep 27, 2016 8:18 am
Location: France

Re: Create > descript.ion file

Post by michel038 »

EN
People have very different ways of organizing their photos, and many are resistant to computers, keywords and complex searches.
The “quick search” is similar to what Picasa used to offer: a simple search field that responds quickly.
For beginners, ywe could build a descript.ion file with the names of folders or photos (many have classified their photos in this way).
More technical users can use metadata not included in the DB (xpkeywords, city, state, country, caption, headline, title...)

File listing generates a line for each photo. To build a descript.ion file, we need a line for each folder that should be recursively browsed...

I've just finalized a powershell that does this job, I'll copy it here.
But modifying variables in it to choose its features eliminates a lot of people.

FR
Des personnes ont des méthodes très variées pour ranger leurs photos, beaucoup sont réfractaires à l'informatique, aux mots-clés, aux recherches complexes. La "Recherche rapide" ressemble à ce que proposait Picasa : un champ recherche simple et qui répond vite.
Pour les débutants, on pourrait construire un fichier descript.ion avec des noms de dossiers ou de photos (beaucoup ont classé leurs photos de cette façon)
Des utilisateurs plus techniques ont pu utiliser des métadonnées qui ne sont pas dans la DB (xpkeywords, ville, région,pays, légende,titre ...)

Créer > Liste des fichiers génère une ligne pour chaque photo. Pour construire un fichier descript.ion, nous avons besoin d'une ligne pour chaque dossier qui devrait être récursivement parcouru...

Je viens de finaliser un powershell qui fait ce boulot, je le copierai ici .
Mais y modifier les variables pour choisir ses fonctionnalités, ca élimine beaucoup de personnes.
Last edited by michel038 on Fri Dec 06, 2024 10:32 pm, edited 2 times in total.
User avatar
michel038
XnThusiast
Posts: 1434
Joined: Tue Sep 27, 2016 8:18 am
Location: France

Script powershell Win10 descript.ion file

Post by michel038 »

( For english , copy the script below, and ask an A.I. for translation , and read comments beginning with a # ...)

Pour Windows 10
Enregistrez ce script sous le nom descript.ps1 par exemple
Clic-droit > Modifier.
Lisez les commentaires commençant par un #
Faites le fonctionner sur un petit dossier de test, au lieu de D:\Photos
Au lancement, il affiche quelques détails à vérifier, tapez Ctrl C pour interrompre en cas de besoin.
Feedback apprécié, pour les franglais... :D

edit : nouvelle version bugs corrigés 06/12/2024 à 16h00 heure France

Pour Pierre Xnviev, le premier paragraphe de commentaires du script précise bien les termes de la suggestion

Code: Select all

# Ce script parcourt un dossier de photos, par exemple D:\Photos, y compris tous les sous-dossiers (récursivement donc)
# Pour chaque répertoire situé dans D:\Photos
#   - Il peut extraire les noms des sous-dossiers et éventuellement coupe les 11 premiers caractères comme dans "2023-07-25 Plage"
#   - Il peut extraire les noms de fichiers jpg sans extension.
#   - Il peut extraire des métadonnées avec ExifTool
#   - Toutes ces informations sont concentrées en une seule ligne, sans doublon, sans mots courts (le , la, St, ...)
#   - cette ligne débute par le nom du dossier de rang 1 , entre guillemets, contenu dans D:\Photos
#   - Tout ceci constitue un fichier descript.ion qui est placé dans D:\Photos
#   XnViewMp exploite ce fichier descript.ion dans sa fonction "Recherche rapide"
#  On peut refaire tourner ce script à un rang inférieur, pour générer des fichiers descript.ion un rang plus bas dans la hiérarchie des dossiers de photos.


# Initialisation des variables, ajustez ces informations à vos besoins 
# mettez 1 pour traiter les données, ou 0 pour ne pas le faire
$BaseFolder = "C:\jpegli"
$OutputFile = "$BaseFolder\descript.ion"

# Parametres pour Exftool (1=oui 0=non)
$ProcessExifTool = 0
$ExifToolName = "$BaseFolder\exiftool.exe"
$ExifToolArgs = '/$IPTC:Province-State $IPTC:City'
    # le / devant IPTC:Province-State me sert à distinguer un numero de département (/13) d'une date 13-03-2013

# Parametres traitement noms de dossiers (1=oui 0=non)
$ProcessFolderNames = 1
$TrunkFolderNames = 1
$TrunkLen = 11

# Parametres traitement noms de fichiers (1=oui 0=non)
$ProcessFileNames = 0

# Parametres traitement mots courts (1=oui 0=non)
$DelShortNames = 1

# Debut ************************************
Write-Host ""
Write-Host "   ***  PARAMETRES DE TRAITEMENT   *** "
Write-Host "Dossier de photos    : $BaseFolder"
Write-Host "Fichier de sortie    : $OutputFile"
Write-Host "Emplacement ExifTool : $ExifToolName"
Write-Host ""

If ($ProcessExifTool)    {Write-Host "Exiftool va extraire les métadonnées suivantes des photos jpg : $ExifToolArgs " } else {Write-Host "Pas de métadonnées à extraire" }

If ($ProcessFolderNames) {
        Write-Host -NoNewLine "Les noms de dossiers seront collectés" 
        if ($TrunkFolderNames)   {Write-Host " et les $TrunkLen premiers caractères sont omis"}
        } else {
        Write-Host "Les noms de dossiers ne sont pas collectés" 
                }
If ($ProcessFileNames)  {Write-Host "Les noms de photos seront collectés (à éviter)" } else {Write-Host "Les noms de photos ne sont pas collectés" }

if ($DelShortNames) {Write-Host "Les mots de 1 ou 2 caractères seront supprimés" }
Write-Host ""

If ($ProcessExifTool)    {Write-Host "Durée estimée : 2 à 4 minutes pour 10 000 photos" } else {
        If ($ProcessFileNames) {Write-Host "Durée du traitement : 1 seconde pour 1000 photos"} else { Write-Host "Le traitement sera presque instantané" }
        }
Write-Host ""

Write-Host "Tapez Ctrl C pour interrompre" 
pause

# Création ou nettoyage du fichier de sortie
if (Test-Path $OutputFile) { Remove-Item $OutputFile }
New-Item -Path $OutputFile -ItemType File | Out-Null


# Fonction pour traiter les dossiers de manière récursive et construire la ligne
function Process-Folder {
    param (
        [string]$FolderPath
    )

    # Initialiser une ligne vide
    $Line = ""

    # Ajouter le nom des sous-dossiers si activé
    if ($ProcessFolderNames -eq 1) {
        $Subfolders = Get-ChildItem -Path $FolderPath -Directory
        foreach ($Subfolder in $Subfolders) {

        # Couper les premiers caractères des noms de dossiers
        if ($TrunkFolderNames) {
            if ($Subfolder.Name.Length -lt ($TrunkLen + 1) ) {
                # Si la longueur du nom est inférieure à ($TrunkLen + 1), on utilise le nom complet
                $Line += " $($Subfolder.Name)"
                } else {
                # Si la longueur du nom est supérieure ou égale à 12, on enlève les 11 premiers caractères
                $Line += " $($Subfolder.Name.Substring($TrunkLen))"
                }
            } else {
                # On ne coupe pas les noms de dossiers
                $Line += " $($Subfolder.Name)"
                }
        }
    }
    
    # Ajouter les noms des fichiers JPG, y compris ceux des sous-dossiers
    if ($ProcessFileNames -eq 1) {
        $Files = Get-ChildItem -Path $FolderPath -Recurse -File | Where-Object { $_.Extension -match 'jpg|jpeg' }
        foreach ($File in $Files) {
            $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($File.Name)
            $Line += " $FileNameWithoutExtension"
        }
    }

    # Exécuter ExifTool si activé
    if ($ProcessExifTool -eq 1 -and (Test-Path $ExifToolName)) {
        $TempFile = "$BaseFolder\TempFile.txt"
        if (Test-Path $TempFile) { Remove-Item $TempFile }


   
    # Appeler ExifTool avec les arguments $ExifToolArgs
        Write-Host -NoNewline " ExifTool ... " ;
        & $ExifToolName -m -F -q -r -ext jpg -p $ExifToolArgs "$FolderPath" 1>>$TempFile
        # Lire et traiter les données du fichier temporaire
        if (Test-Path $TempFile) {
            $ExifData = Get-Content $TempFile
            $FormattedExifData = $ExifData -join " "
            $Line += " $FormattedExifData"
            Remove-Item $TempFile
        }
    }

# Éliminer les doublons dans la ligne
$UniqueLine = ($Line.Split(" ") | Select-Object -Unique) -join " "

# Optionnel : Éliminer les mots de longueur inférieure à 3 caractères dans le reste de la ligne
if ($DelShortNames) {$UniqueLine = ($Line -split " " | Where-Object { $_.Length -ge 3 } | Select-Object -Unique) -join " " }

# Retourner la ligne unique
return $UniqueLine

}

# Fin de la fonction Process-Folder

#Programme Principal 
# Parcourir les dossiers de rang1
$FoldersRang1 = Get-ChildItem -Path $BaseFolder -Directory
foreach ($FolderRang1 in $FoldersRang1) {
    Write-Host -NoNewLine " Traitement $FolderRang1 "

    # Fonction de construction de la ligne pour le dossier actuel
    $Line = Process-Folder -FolderPath $FolderRang1.FullName

    # Ajouter le nom du dossier qui a été traité en tête de ligne 
    $Line = "`"$FolderRang1`" " + $Line

    # Écrire la ligne dans le fichier de sortie
    Add-Content -Path $OutputFile -Value $Line -Encoding UTF8
    Write-Host "Ok"
}

Write-Host "Traitement terminé. Résultat enregistré dans $OutputFile"