razorjack
Goto Top

MP3-Dateien gemäss ihres Namens in bestehende Ordner verteilen, in denen der Interpret des zu verschiebenden Songs vorhanden ist

Hallo Leute
ich bin neu hier.
Auf der Suche im Google bin ich mehrere Male auf euer offensichtlich tolles Forum gestossen.
Leider habe ich in den bereits vorhandenen Beiträgen noch keine Antwort für meinen "Fall" gefunden.
Andere kompetente Lösungen konnte ich leider nicht gemäss meinen Vorgaben anpassen.

Mein Problem ist, dass ich etwa 2'200 MP3 in einem Download-Ordner habe, die ich aber möglichst automatisiert verteilen, also in andere, bereits bestehende Musik-Ordner einordnen will.

Mein bestehendes Musik-Archiv sieht in seiner Ordnerstruktur etwa wie folgt aus:
(Sorry für die Formatierung - die Ordner rechts sind jeweils Unterordner vom darüberliegenden, mehr links stehenden Ordner)
M:\MEDIA
|_PHOTOS
|_MOVIES
|_MUSIC
|_MP3
|_ALTERNATIVE
|_ROCK
|_OLDIES
|_R'n'B / SOUL
|_REGGAE
|_HOUSE
|_ usw.

In diesen diversen "Genre-Ordnern", die ich mir vor langer Zeit angelegt habe (keine Genre-ID3-Tags), befinden sich die bereits vorhandenen und entsprechend der Musikrichtung abgelegten Musikdateien (ohne Unterordner "ALBUM X123").

Nun möchte ich die heruntergeladenen und säuberlich nach Schema [Interpret - Titel.mp3] beschrifteten MP3-Musikstücke vom Download-Ordner in die oben dargestellten Genre-Ordner verschieben.

D:\DOWNLOADS
|_NEUE MP3
|_ToCheck
|_INTERPRET1 - SONG1.mp3
|_INTERPRET1 - SONG2.mp3
|_INTERPRET2 - SONG1.mp3
|_INTERPRET2 - SONG2.mp3
|_INTERPRET2 - SONG3.mp3
|_INTERPRET3 - SONG1.mp3
|_INTERPRET4 - SONG1.mp3
|_INTERPRET4 - SONG2.mp3
|_usw.

Dabei soll jeweils geprüft werden, ob der entsprechende Interpret, des aus dem Download-Ordner zu verschiebenden Songs, bereits in einem Genre Ordner vorkommt und diese Datei vom Download-Ordner in genau jenen Genre-Ordner verschoben werden.

Es kann im Musikarchiv vorkommen, dass der selbe Interpret in verschiedenen Genre-Ordnern, also mehr als 1x vorkommt, da ich das bisher alles manuell verschoben habe und dabei darauf geachtet habe, in welchen Musikstil-Ordner das Stück wohl besser passt.

Genial wäre es dann natürlich schon, wenn man in solchen Fällen eine Auswahlmöglichkeit hätte oder zumindest in einem Logfile die potenziellen Genre-Ordner benannt werden und man sich diese Interpreten danach noch manuell vornehmen kann. Ich könnt aber auch damit leben, wenn die neuen MP3 jeweils in den ersten gefundenen Genre-Ordner verschoben werden. Meist ist es vom selben Interpreten ja auch die ähnliche Stilrichtung.

So, bissen viel auf einmal, aber ich hoffe ich konnte exakt erklären, was mich plagt und hoffe so auf einen Crack, der mir weiterhilft.

Dankeschön schon mal im Voraus, eine schöne besinnliche Weihnachtszeit und einen Ordentlichen Rutsch ins neue Jahr

Prosit! face-wink (...don't drink and drive!)
RazorJack

Content-ID: 132232

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

Ausgedruckt am: 25.11.2024 um 23:11 Uhr

Snowman25
Snowman25 23.12.2009 um 23:06:47 Uhr
Goto Top
Hallo RazorJack,

dein problem ist ein wenig komplexer als das, was man sonst so antrifft. Sollte aber durchaus per Batch möglich sein...
Ich muss mal schauen, ob ich Zeit dafür finde.

Greetz Snow
bastla
bastla 23.12.2009 um 23:15:35 Uhr
Goto Top
Hallo RazorJack und willkommen im Forum, hallo Snowman25!

Zum Testen die "Billigvariante" nach dem Motto "ab in den ersten passenden Ordner":
@echo off & setlocal
set "Quelle=D:\DOWNLOAD\NEUE MP3\ToCheck"  
set "Ziel=M:\MEDIA\MUSIC\MP3"  

set "Log=D:\Log.txt"  
set "Liste=%temp%\MP3Liste.txt"  
dir "%Ziel%\*.mp3" /s /b>%Liste%  

if exist "%Log%" del "%Log%"  
for %%i in ("%Quelle%\*.mp3") do set "DName=%%~ni" & call :ProcessFile "%%i"  
notepad "%Log%"  
goto :eof

:ProcessFile
for /f "delims=§" %%a in ("%DName: - =§%") do set "Interpret=%%a"  
set "Ordner="  
for /f "delims=" %%a in ('findstr /i /c:"\\%Interpret% - " %Liste% 2^>nul') do if not defined Ordner set "Ordner=%%~dpa"  
if not defined Ordner >>"%Log%" echo %~nx1: Noch kein Titel von %Interpret% vorhanden! & goto :eof  
echo move %1 "%Ordner%"  
>>"%Log%" echo %~nx1 --^> %Ordner:~,-1%  
goto :eof
Das "echo" vor dem "move" sorgt dafür, dass noch nicht wirklich verschoben, sondern der entsprechende Befehl nur angezeigt wird. Für jede Datei wird außerdem ein Eintrag in eine Logdatei erstellt und Letztere am Ende mit dem Editor geöffnet.

Grüße
bastla
rubberman
rubberman 24.12.2009 um 01:58:49 Uhr
Goto Top
Hallo Zusammen.

@bastla
Wieder was gelernt. Das:
for /f "delims=§" %%a in ("%DName: - =§%") do set "Interpret=%%a"  
hätte ich ungleich komplizierter gelöst, da ich nicht damit gerechnet hätte, dass die Ersetzung zur Laufzeit der Zeile bereits wirksam ist.

@RazorJack
Sinvoll ist meiner Meinung nach, wenn du das ganze in zwei Stepps durchführst.
- Im ersten Step erstellst du eine leicht zu editierende Vorschrift, wie mit jeder Datei vorzugehen ist. Falls dir Excel zur Verfügung steht, würde sich eine *.csv Datei anbieten. Hier sind Semikolons als Separatoren gesetzt und Excel ist standardmäßig mit diesem Dateityp verknüpft. Somit lassen sich Zuordnungen im Vorfeld noch ändern, bzw. für noch nicht vorhandene Interpreten hinzufügen.
- Im zweiten Step wird diese Datei wieder ausgelesen und das Verschieben der Dateien vorgenommen.

bastla's Batchscript lässt sich relativ einfach dahingehend erweitern.

Vorsicht ist bei der Verwendung von Batches für solche Vorhaben immer geboten, wenn du dir nicht sicher bist, ob Sonderzeichen der Kommandozeile (zB. & oder %) im Dateinamen vorkommen. Diese führen zu Fehlern in der Abarbeitung.

Grüße
rubberman
RazorJack
RazorJack 24.12.2009 um 10:42:13 Uhr
Goto Top
Hi bastla, hallo zusammen

Danke für Deinen Lösungsvorschlag und eure Beiträge. Das Script ist schon etwa fünf levels zu hoch für mich, aber ich verstehs zumindest im Ansatz face-smile
Ich hab die Pfadangaben entsprechend meiner "Testumgebung" angepasst und hab's gleich ausprobiert:
@echo off & setlocal
set "Quelle=T:\DOWNLOADS\ToCheck"  
set "Ziel=M:\Music\MP3\Other\TEST"  

set "Log=T:\DOWNLOADS\ToCheck\Log.txt"  
set "Liste=%temp%\MP3Liste.txt"  
dir "%Ziel%\*.mp3" /s /b>%Liste%  

if exist "%Log%" del "%Log%"  
for %%i in ("%Quelle%\*.mp3") do set "DName=%%~ni" & call :ProcessFile "%%i"  
notepad "%Log%"  
goto :eof

:ProcessFile
for /f "delims=§" %%a in ("%DName: - =§%") do set "Interpret=%%a"  
set "Ordner="  
for /f "delims=" %%a in ('findstr /i /c:"\\%Interpret% - " %Liste% 2^>nul') do if not defined Ordner set "Ordner=%%~dpa"  
if not defined Ordner >>"%Log%" echo %~nx1: Noch kein Titel von %Interpret% vorhanden! & goto :eof  
echo move %1 "%Ordner%"  
>>"%Log%" echo %~nx1 --^> %Ordner:~,-1%  
goto :eof

Das Script läuft ohne Fehlermeldung durch, führt die move -Aktionen aber wegen des "echo" vor dem "move" in der 3.-untersten Zeile, wie im Lösungsvorschlag erwähnt, nicht durch, sondern blendet zuletzt nur das Logfile ein.
Nach Entfernen des "echo" lief das Script inkl. des Verschiebens der Dateien fehlerfrei durch.

Das generierte Logfile:
Escolate - Happy Hour.mp3 --> M:\Music\MP3\Other\TEST\Jazz
Fredde Le Grand - Kann Ingen Sorg For Mig Bjorn Borg.mp3 --> M:\Music\MP3\Other\TEST\Jazz
Freddy Fader Meets Locana - Bom Bom.mp3 --> M:\Music\MP3\Other\TEST\Jazz
Grooves - Writing On The Wall.mp3 --> M:\Music\MP3\Other\TEST\Pop
Hypersnap 
Jupiter - Hon E Norsk Och Har Brunt Har.mp3 --> M:\Music\MP3\Other\TEST\Pop
Kate Ryan - Voyage Voyage.mp3 --> M:\Music\MP3\Other\TEST\Old School
Sex Appeal - Sensuality.mp3 --> M:\Music\MP3\Other\TEST\Old School
Tasty - You And Me.mp3 --> M:\Music\MP3\Other\TEST\R'n'B
Ti-Mo - Put Your Hands Up For New York.mp3 --> M:\Music\MP3\Other\TEST\R'n'B**

In der 5.Zeile des Logfiles (hier visuell in der 7. wegen der Zeilenumbrüche) wäre eigentlich "Hypersnap & Engl - Bass Tonight.mp3" korrekt gewesen. Wie rubberman bereits erwähnt hat, können Sonderzeichen wie "%" oder "&" nicht korrekt erkannt werden. Das ist ein Problem. Ich habe mehrere hundert Songs, in denen das Zeichen "&" vorkommt.
Na gut, wenn es sich nicht anders lösen lässt, würde ich halt vorgängig alle "&" jeweils durch "And" oder "Feat." ersetzen. Mit "Magic File Renamer" ist das in wenigen Minuten gemacht, allerdings wär's mir schon lieber, ich könnt die Namen aus ästethischen Gründen so belassen.

PS: Was ist eigentlich wenn ich im Quellverzeichnis mehrere Ordner habe? Wie kann ich das Script dahingehend abändern, dass vom root aus alle *.mp3 im Hauptquellenordner und Unterordner der Quelle berücksichtigt werden? Oder muss ich das für jeden Unterordner einmal ausführen?

Recht herzlichen Dank nochmals. Dieses Forum rockt!
Bin gespannt auf eure Antworten.

Cheers,
RazorJack

[Edit Biber] Codetags ergänzt. [/Edit]
Biber
Biber 24.12.2009 um 11:48:24 Uhr
Goto Top
[OT]
Moin RazorJack,

willkommen im Forum.
An der Lösungsverfeinerung will ich mich gar nicht beteiligen dieses Mal.

Aber an dieser Stelle und weil in diesem Thread alle mitlesen, die ich erreichen will

Danke dir, RazorJack für die vorbildliche Frage- und Titelformulierung und die klare Beschreibung der Anforderung.
So sehen leider nicht viele [Erst-]Beiträge aus.

Frohe Festtage und ein gutes nächstes Jahr

Biber
[/OT]
bastla
bastla 24.12.2009 um 12:34:18 Uhr
Goto Top
Hallo RazorJack!

Auch von mir eine Gratulation zu der Art Deiner Fragestellung und Rückmeldung! face-smile
Soferne Du mit dem einen oder anderen Anführungszeichen im Logfile leben kannst, sollte diese Version des Batches etwas robuster hinsichtlich Sonderzeichen sein und zusätzlich auch Unterordner des Quellordners abdecken (weshalb dann im Logfile der gesamte Pfad ausgegeben wird):
@echo off & setlocal
set "Quelle=T:\DOWNLOADS\ToCheck"  
set "Ziel=M:\Music\MP3\Other\TEST"  

set "Log=T:\DOWNLOADS\ToCheck\Log.txt"  
set "Liste=%temp%\MP3Liste.txt"  
dir "%Ziel%\*.mp3" /s /b>%Liste%  

if exist "%Log%" del "%Log%"  
for /f "delims=" %%i in ('dir /s /b "%Quelle%\*.mp3" 2^>nul') do set "DName=%%~ni" & call :ProcessFile "%%i"  
notepad "%Log%"  
goto :eof

:ProcessFile
for /f "delims=§" %%a in ("%DName: - =§%") do set "Interpret=%%a"  
set "Ordner="  
for /f "delims=" %%a in ('findstr /c:"\\%Interpret% - " %Liste% 2^>nul') do if not defined Ordner set "Ordner=%%~dpa"  
if not defined Ordner >>"%Log%" echo %1: Noch kein Titel von "%Interpret%" vorhanden! & goto :eof  
echo move %1 "%Ordner%"  
>>"%Log%" echo %1 --^> "%Ordner:~,-1%"  
goto :eof
@all
Die besten Weihnachtswünsche, und, falls wir uns vorher nicht mehr lesen sollten: Alles Gute für 2010!

Grüße
bastla
RazorJack
RazorJack 24.12.2009 um 15:00:28 Uhr
Goto Top
Hallo nochmal,

bastla, Du hast's wirklich drauf!

Bin grad zu Besuch und wollt nur ma schaun ob ich Antworten gekriegt hab und was seh ich: Du hast Dir nochmals die Mühe gemacht und am Script gearbeitet.

Vielen Herzlichen Dank, auch allen anderen die sich beteiligt haben.
Testen werde ich das ganze nochmal, wenn ich zu hause bin.

Schöne Weihnacht und Guten Rutsch!
RazorJack
RazorJack 06.01.2010 um 20:05:17 Uhr
Goto Top
So, hallo mal wieder und willkommen im neuen Jahr 2010.

Hab euch nicht vergessen face-smile

Brauchte noch etwas Zeit, um einiges zu erledigen und dann endlich den Batch zu testen.
Er funktioniert genauso wie er soll. Wirklich 1A Gebastla! face-wink

Beim Ausführen durchkämmt das Script sowohl die Quell-Haupt- und Unterverzeichnisse nach mp3-Dateien, als dann auch die Unterordner im angegebenen Ziel nach den entsprechenden, von den Quelldateien vorgegebenen Interpreten.

Die mp3-Dateien aus dem Quellverzeichnis werden schliesslich in den ersten, dem vorgegebenen Interpreten entsprechenden Ziel-Ordner verschoben.

Das Logfile dient zusätzlich als Kontrolle, wohin die Dateien verschoben wurden oder als Hinweis-Lieferant bei Nichtentsprechung.

Ich muss schon sagen, so für das Gröbste nimmt mir dieses Script wirklich einiges an "Arbeit" ab. Obwohl ich mir ja nicht ungern den einen oder anderen Song ans Ohr lege, aber bei Tausenden Stücken artet es dann schon eher in Arbeit aus.

Natürlich gäbe es Potenzial für Verbesserungen oder eher für den einen oder anderen Feinschliff, aber ein Diamant der Blitzprogrammierung ist er schon mal geworden face-smile

Nun kann ich mich mehr dem gezielten Musik-Hörgenuss widmen.

Danke, supa, happy face-smile

Grüsse
bastla
bastla 06.01.2010 um 21:26:06 Uhr
Goto Top
Hallo RazorJack!
Danke, supa, happy face-smile
Da kommt auch bei mir Freude auf face-smile - die durch die Art Deines (ausführlichen) Feedbacks noch verstärkt wird face-smileface-smile

Falls Dir einmal die Version "für Arme" nicht mehr reicht - lass wieder von Dir lesen (und dann schaun mer mal face-wink) ...

Grüße
bastla