sakistech Posted December 29, 2022 Share Posted December 29, 2022 (edited) Hallo, ich nutze die Youtube-DL Docker-App, um mp3 Lieder herunterzuladen. Soweit funktioniert auch alles. Meine Ordnerstruktur sieht wie folgt aus. youtube/ ├─ download/ ├─ audio/ │ ├─ Stamatis Gonidis │ ├─ Zafeiris Melas │ ├─ ... Im "download" Verzeichnis landen alle mp3 Dateien, die ich mit der Youtube-DL Docker-App herunterlade. Im "audio" Verzeichnis sind alle Künstler mit jeweils separaten Ordner (Vor- und Nachname). Jetzt zu meinem Problem: Die meisten mp3 Dateien haben einen griechischen Dateinamen, z.b. Σταμάτης Γονίδης - Δικιά Μου Είναι Η Ζωή Gibt es eine Möglichkeit mittels "User Script" folgende Aufgaben zu erledigen: Es soll das"download" Verzeichnis überwachen (per cron z.b. alle 30 Sekunden) ob neue Dateien vorhanden sind, falls Ja die Datei von "greek" ins "greeklish" umbenennen z.b. "Σταμάτης Γονίδης - Δικιά Μου Είναι Η Ζωή" in "Stamatis Gonidis - Dikia Mou Einai I Zwi" Zum Schluss soll es überprüfen, ob im "audio" Verzeichnis bereits ein Verzeichnis mit dem Künstler existiert (in diesem Fall "Stamatis Gonidis"). Falls nicht, soll es eins erstellen und die zuvor umbenannte mp3 Datei dorthin verschieben, falls ja, soll es nur die zuvor umbenannte mp3 Datei dorthin verschieben. Was meint Ihr, ist das so möglich? Wenn ja wie? Vielleicht kennt der eine oder andere eine einfachere Methode. LG Sakis Edited December 29, 2022 by sakistech Quote Link to comment
mgutt Posted December 29, 2022 Share Posted December 29, 2022 6 hours ago, sakistech said: Was meint Ihr, ist das so möglich? Wenn ja wie? Hast du schon mal Skripte geschrieben? Wenn ja: ChatGPT fragen. Ergebnis kannst du hier gerne posten, dann korrigieren wie es bei Bedarf. 1 Quote Link to comment
sakistech Posted December 29, 2022 Author Share Posted December 29, 2022 Danke für den Tipp mit ChatGPT. Ich habe folgenden Code „erstellt“, aber irgendwie passiert nichts, wenn ich es ausführe. #!/bin/bash # Set the directory to watch for new files WATCH_DIR="/home/sakis/youtube/download" # Set the directory to move files to DEST_DIR="/home/sakis/youtube/audio" # Set the interval to check for new files (in seconds) INTERVAL=30 while true; do # Check if there are any new files in the watch directory NEW_FILES=$(find "$WATCH_DIR" -type f -mmin -$INTERVAL) # If there are new files if [ -n "$NEW_FILES" ]; then # For each new file for file in $NEW_FILES; do # Get the artist name from the file name artist=$(echo "$file" | sed -E 's/.*(\S+) - (\S+).mp3/\1/') # Replace Greek characters in the artist name with their English equivalents artist=$(echo "$artist" | sed -E 's/Α/A/g' | sed -E 's/Β/B/g' | sed -E 's/Γ/G/g' | sed -E 's/Δ/D/g' | sed -E 's/Ε/E/g' | sed -E 's/Ζ/Z/g' | sed -E 's/Η/H/g' | sed -E 's/Θ/TH/g' | sed -E 's/Ι/I/g' | sed -E 's/Κ/K/g' | sed -E 's/Λ/L/g' | sed -E 's/Μ/M/g' | sed -E 's/Ν/N/g' | sed -E 's/Ξ/X/g' | sed -E 's/Ο/O/g' | sed -E 's/Π/P/g' | sed -E 's/Ρ/R/g' | sed -E 's/Σ/S/g' | sed -E 's/Τ/T/g' | sed -E 's/Υ/Y/g' | sed -E 's/Φ/F/g' | sed -E 's/Χ/CH/g' | sed -E 's/Ψ/PS/g' | sed -E 's/Ω/O/g') # Replace Greek characters in the file name with their English equivalents filename=$(echo "$file" | sed -E 's/(\S+) - (\S+).mp3/\1 - \2/' | sed -E 's/Α/A/g' | sed -E 's/Β/B/g' | sed -E 's/Γ/G/g' | sed -E 's/Δ/D/g' | sed -E 's/Ε/E/g' | sed -E 's/Ζ/Z/g' | sed -E 's/Η/H/g' | sed -E 's/Θ/TH/g' | sed -E 's/Ι/I/g' | sed -E 's/Κ/K/g' | sed -E 's/Λ/L/g' | sed -E 's/Μ/M/g' | sed -E 's/Ν/N/g' | sed -E 's/Ξ/X/g' | sed -E 's/Ο/O/g' | sed -E 's/Π/P/g' | sed -E 's/Ρ/R/g' | sed -E 's/Σ/S/g' | sed -E 's/Τ/T/g' | sed -E 's/Υ/Y/g' | sed -E 's/Φ/F/g' | sed -E 's/Χ/CH/g' | sed -E 's/Ψ/PS/g' | sed -E 's/Ω/O/g') # Check if the artist directory exists in the destination directory if [ ! -d "$DEST_DIR/$artist" ]; then # If it doesn't exist, create it mkdir "$DEST_DIR/$artist" fi # Move the file to the artist directory in the destination directory mv "$file" "$DEST_DIR/$artist" done fi # Sleep for the specified interval before checking for new files again sleep $INTERVAL done Hier noch die Beschreibung die der ChatGPT ausgegeben hat. Dieses Skript überwacht das Verzeichnis WATCH_DIR auf neue Dateien und benennt diese um, indem es griechische Zeichen in englische Zeichen umwandelt. Es erstellt auch einen Ordner für den Künstler im Verzeichnis DEST_DIR, falls dieser noch nicht vorhanden ist, und verschiebt die umbenannte Datei in diesen Ordner. Um das Skript alle 30 Sekunden auszuführen, können Sie es mit cron planen. Öffnen Sie dazu die crontab-Datei mit crontab -e und fügen Sie folgende Zeile hinzu: * * * * * /path/to/script.sh Klingt erstmal nach dem, was ich eigentlich wollte, aber irgendwie klappt das nicht. Kann da jemand weiterhelfen? Quote Link to comment
mgutt Posted December 29, 2022 Share Posted December 29, 2022 1 hour ago, sakistech said: /home/sakis/youtube So einen Pfad gibt es in unRAID nicht?! Quote Link to comment
sakistech Posted December 29, 2022 Author Share Posted December 29, 2022 Ích weiß, ich teste das script erst auf einer ubuntu-VM. Quote Link to comment
mgutt Posted December 29, 2022 Share Posted December 29, 2022 1 hour ago, sakistech said: NEW_FILES=$(find "$WATCH_DIR" -type f -mmin -$INTERVAL) Passt das denn? Weil das findet ja nur Dateien, die in den letzten 30 Sekunden erstellt wurden. Ich würde -mmin -$INTERVAL weglassen. Das ist eh ein Fehler im Skript, da es bei Dateien, die exakt in der Sekunde erstellt werden, wenn das Skript 30 Sekunden alt ist, übersehen werden (= Race Condition). Und da das Skript ja eh alles verschieben soll, kann es ja ruhig alle Dateien auslesen. Darf find rekursiv in der Quelle suchen? Ansonsten solltest du noch -maxdepth 1 und -mindepth 1 ergänzen. Quote Link to comment
sakistech Posted December 29, 2022 Author Share Posted December 29, 2022 (edited) Gute Fragen, ich bin da ein absoluter Neuling was das Programmieren etc. angeht. Aber ich bin einen Schritt weiter gekommen, und zwar konnte ich mittels ChatGPT einen Python Script erstellen lassen, der folgendes tut. Benennt die Datei von "greek" ins "greeklish". Verschiebt die Datei von "download" nach "audio". Es gibt aber zwei Probleme: Was ich nicht bedacht habe, ist, dass die Dateinamen aus YouTube nicht nur den Künstlernamen sowie Titel haben, sondern zusätzliche Informationen beinhalten. Hier ein Beispiel: Basilis Mpatis - Zimia _ Vasilis Mpatis - Zimia _ Official Video Clip HQ 2017.mp3. Wie kann ich jetzt aus solchen Dateinamen nur den Künstlername + Titel behalten und alles entfernen? Soll am Ende quasi wie folgt aussehen Vasilis Mpatis - Zimia.mp3. Aktuell wird nur die Datei im Zielordner verschoben, aber kein neuer Ordner erstellt, da ja wie im Punkt 1 nicht der Künstlername nicht „identifiziert“ wird, sprich erst muss Punkt 1 gelöst werden, damit Punkt 2 funktioniert. Hier der Python Script: Spoiler import os import re # Path to the folder with the MP3 files path = "/home/sakis/youtube/download" # Path to the destination folder destination_folder = "/home/sakis/youtube/audio" # Regular expression for matching the artist artist_pattern = re.compile(r'^(.+?) - ') # Regular expression for matching the title title_pattern = re.compile(r'^.+? - (.*?)[^\w\s-]*(\.mp3)?$') # Iterate over all MP3 files in the folder for file in os.listdir(path): if file.endswith('.mp3'): # Save current filename and convert to Unicode old_name = file.encode('utf-8').decode('utf-8') # Match the artist using the artist regular expression artist_match = artist_pattern.match(old_name) if artist_match: artist = artist_match.group(1).strip() else: artist = 'Unknown' # Match the title using the title regular expression title_match = title_pattern.match(old_name) if title_match: title = title_match.group(1).strip() else: title = old_name # Replace Greek letters in filenames artist = ( artist.replace("Ά", "A") .replace("Έ", "E") .replace("Ή", "H") .replace("Ί", "I") .replace("Ό", "O") .replace("Ύ", "Y") .replace("Ώ", "W") .replace("ΐ", "I") .replace("Α", "A") .replace("Β", "B") .replace("Γ", "G") .replace("Δ", "D") .replace("Ε", "E") .replace("Ζ", "Z") .replace("Η", "H") .replace("Θ", "TH") .replace("Ι", "I") .replace("Κ", "K") .replace("Λ", "L") .replace("Μ", "M") .replace("Ν", "N") .replace("Ξ", "X") .replace("Ο", "O") .replace("Π", "P") .replace("Ρ", "R") .replace("Σ", "S") .replace("Τ", "T") .replace("Υ", "Y") .replace("Φ", "F") .replace("Χ", "X") .replace("Ψ", "PS") .replace("Ω", "O") .replace("ά", "a") .replace("έ", "e") .replace("ή", "i") .replace("ί", "i") .replace("ό", "o") .replace("ύ", "y") .replace("ώ", "w") .replace("ϊ", "i") .replace("ϋ", "u") .replace("ό", "o") .replace("α", "a") .replace("β", "b") .replace("γ", "g") .replace("δ", "d") .replace("ε", "e") .replace("ζ", "z") .replace("η", "i") .replace("θ", "th") .replace("ι", "i") .replace("κ", "k") .replace("λ", "l") .replace("μ", "m") .replace("ν", "n") .replace("ξ", "x") .replace("ο", "o") .replace("π", "p") .replace("ρ", "r") .replace("ς", "s") .replace("σ", "s") .replace("τ", "t") .replace("υ", "y") .replace("φ", "f") .replace("χ", "x") .replace("ψ", "ps") .replace("ω", "o") ) title = ( title.replace("Ά", "A") .replace("Έ", "E") .replace("Ή", "H") .replace("Ί", "I") .replace("Ό", "O") .replace("Ύ", "Y") .replace("Ώ", "W") .replace("ΐ", "I") .replace("Α", "A") .replace("Β", "B") .replace("Γ", "G") .replace("Δ", "D") .replace("Ε", "E") .replace("Ζ", "Z") .replace("Η", "H") .replace("Θ", "TH") .replace("Ι", "I") .replace("Κ", "K") .replace("Λ", "L") .replace("Μ", "M") .replace("Ν", "N") .replace("Ξ", "X") .replace("Ο", "O") .replace("Π", "P") .replace("Ρ", "R") .replace("Σ", "S") .replace("Τ", "T") .replace("Υ", "Y") .replace("Φ", "F") .replace("Χ", "X") .replace("Ψ", "PS") .replace("Ω", "O") .replace("ά", "a") .replace("έ", "e") .replace("ή", "i") .replace("ί", "i") .replace("ό", "o") .replace("ύ", "y") .replace("ώ", "w") .replace("ϊ", "i") .replace("ϋ", "u") .replace("ό", "o") .replace("α", "a") .replace("β", "b") .replace("γ", "g") .replace("δ", "d") .replace("ε", "e") .replace("ζ", "z") .replace("η", "i") .replace("θ", "th") .replace("ι", "i") .replace("κ", "k") .replace("λ", "l") .replace("μ", "m") .replace("ν", "n") .replace("ξ", "x") .replace("ο", "o") .replace("π", "p") .replace("ρ", "r") .replace("ς", "s") .replace("σ", "s") .replace("τ", "t") .replace("υ", "y") .replace("φ", "f") .replace("χ", "x") .replace("ψ", "ps") .replace("ω", "o") ) # Remove any additional text after the title title = title.split(' -')[0] # Remove any additional text at the end of the title title = re.sub(r'[^\w\s-]*$', '', title).strip() # Construct the new file name new_name = f'{artist} - {title}.mp3' # Create the artist folder if it doesn't exist artist_folder = os.path.join(destination_folder, artist) if not os.path.exists(artist_folder): os.makedirs(artist_folder) # Rename the file and move it to the artist folder os.rename(os.path.join(path, old_name), os.path.join(artist_folder, new_name)) print('Done!') Edit:\\ Ich konnte den 2. Punkt, mit dem Ordner verschieben, beheben (Code angepasst). Jetzt hänge ich daran den passenden regulären Ausdruck für den Titel anzupassen. Aktuell sieht der Code wie folgt aus: # Regular expression for matching the title title_pattern = re.compile(r'^.+? - (.*?)[^\w\s-]*(\.mp3)?$') Die Ausgabe sieht wie folgt aus: Michael Jackson - Michael Jackson - Beat it || New Song.mp3.mp3 Natürlich sollte es am Ende wie folgt aussehen Michael Jackson - Beat It.mp3 Ich vermute das es schwer ist einen regulären Ausdruck zu erstellen, da die Dateinamen über youtube-dl keine feste Dateinamen-Struktur haben. Meint ihr, man kann das trotzdem mit Python lösen oder gibt es da andere Lösungsansätze? LG Sakis Edited December 30, 2022 by sakistech Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.