dopedeluxe
Goto Top

Fehler in Powershell: SortAlbumsByGenre per MP3TAG

Guten Tag,

da ich vor langer Zeit mal sehr gute Erfahrungen mit diesem Forum gemacht habe, richte ich mich heute wieder vertrauensvoll an die Windows-Experten unter euch:

Ich möchte in Windows automatisiert meine MP3-Albensammlung nach Genre sortieren. Dafür hat mir ChatGPT ein PowerShell-Script geschrieben, das mit der Freeware MP3TAG jeweils das Genre ausliest und in eine Textdatei schreibt, daraus einen neuen Ordner erstellt und den Ordner des jeweiligen Albums samt Inhalt da hinein verschiebt. Doch leider passiert nichts nach der Ausführung. Nur das Tool MP3TAG öffnet sich, sonst nichts.#

ChatGPT beschreibt den Workflow folgendermaßen:
  • Das Skript durchläuft alle Ordner in Ihrer Musiksammlung.
  • Für jeden Ordner wird Mp3tag aufgerufen, um das Genre zu ermitteln und in eine Textdatei zu schreiben.
  • Das Skript liest das Genre aus der Textdatei.
  • Ein entsprechender Genre-Ordner wird erstellt, falls er noch nicht existiert.
  • Der Album-Ordner wird in den passenden Genre-Ordner verschoben.
  • Die temporäre Genre-Textdatei wird gelöscht.

Das Script sieht so aus:

$rootFolder = "F:\Musik\00-TEST"  
$genreFolder = "F:\Musik\00-TEST\00-Genres"  
$mp3tagPath = "C:\Users\matth\Documents\Mp3tag\Mp3tag.exe"  

Get-ChildItem -Path $rootFolder -Directory | ForEach-Object {
    $albumFolder = $_.FullName
    
    # Mp3tag ausführen, um das Genre zu ermitteln
    & $mp3tagPath $albumFolder
    
    # Genre aus der Textdatei lesen
    $genreFile = Join-Path $albumFolder "genre.txt"  
    if (Test-Path $genreFile) {
        $genre = Get-Content $genreFile -Raw
        $genre = $genre.Trim()
        
        # Zielordner erstellen, falls nicht vorhanden
        $targetFolder = Join-Path $genreFolder $genre
        if (-not (Test-Path $targetFolder)) {
            New-Item -Path $targetFolder -ItemType Directory
        }
        
        # Album-Ordner verschieben
        Move-Item -Path $albumFolder -Destination $targetFolder -Force
        
        # Aufräumen
        Remove-Item $genreFile
    }
}

Bin für jeden Hinweis dankbar.
Besten Gruß face-smile

Content-ID: 668284

Url: https://administrator.de/contentid/668284

Ausgedruckt am: 26.09.2024 um 23:09 Uhr

DivideByZero
DivideByZero 21.09.2024 um 11:28:49 Uhr
Goto Top
Moin,

welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.

Gruß

DivideByZero
Penny.Cilin
Penny.Cilin 21.09.2024 um 12:37:51 Uhr
Goto Top
@DivideByZero
welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.

Das stimmt nicht ganz. Laut Dokumentation gibt es den Parameter
/add
.

Ausschnitt aus der Dokumentation:
Command Line Interface
These parameters can be used when starting Mp3tag from the command line:

Start with directory 
Mp3tag.exe /fp:"<full-qualified path to directory>"  

Starts Mp3tag in the specified directory using the directory as working directory.

Start with file 
Mp3tag.exe /fn:"<full-qualified file name>"  

Starts Mp3tag with the specified file using the directory of the file as working directory.

Add directory or file 
/add

Use this in combination with /fp or /fn to add files to the file list. Please note, that files are not automatically sorted when added to the file list.

Ich bin allerdings was Powershell betrifft, nicht so fit, ich nutze eher REXX.

Gruss Penny.
Ted555
Ted555 21.09.2024 aktualisiert um 13:52:01 Uhr
Goto Top
Wieso externe Tools verwenden wenn es auch mit Bordmitteln geht?! 😉

# Quellordner 
$sourceroot = "d:\Musik\Alben"  
# Ordner nach Genre
$sortedroot = "d:\Musik\sortiert"  
# shell object
$shell = New-Object -Com Shell.Application  
# Ordner nach Genre der ersten MP3 Datei der Ordner gruppieren
$groupedalbums = Get-ChildItem -Path $sourceroot -Directory | group-item {Get-ChildItem $_.Fullname -File -Filter *.mp3 -Recurse | select -First 1 | %{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("System.Music.Genre")}} | ? Name -ne ''  
# Genre Gruppen durchlaufen und in Ordner mit Genre-Name verschieben 
foreach($genre in $groupedalbums){
    # Zielpfad erstellen
    $targetpath = join-path $sortedroot $genre.Name
    # Ordner erstellen falls er noch nicht existiert
    if(!(Test-Path -Path $targetpath -PathType Container)){new-item -type dir -path $targetpath | out-null}
    # Ordner in Zielordner verschieben 
    $genre.Group | move-item -Destination $targetpath -verbose
}

Ganz ohne KI shiet😋
DivideByZero
DivideByZero 21.09.2024 um 14:09:04 Uhr
Goto Top
Zitat von @Penny.Cilin:

@DivideByZero
welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.

Das stimmt nicht ganz. Laut Dokumentation gibt es den Parameter
/add
.

Ausschnitt aus der Dokumentation:

Schon klar, ruft aber nur die GUI auf, daher ist die Alternative die reine powershell Lösung
UseAfterFreeException
UseAfterFreeException 21.09.2024 um 16:25:10 Uhr
Goto Top
Moin,

falls der Wechsel des Tools zum Auslesen der Tags eine Option für Dich ist, kann ich TagLibSharp empfehlen; der assembly ist leicht bei NuGet zu finden und in der Powershell ebenso einfach referenziert…

Viel Erfolg!