Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Script das mp3 Dateien umbennent, Ordner erstellt und verschiebt

Featured Replies

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:

 

  1. Es soll das"download" Verzeichnis überwachen (per cron z.b. alle 30 Sekunden) ob neue Dateien vorhanden sind, falls Ja
  2. die Datei von "greek" ins "greeklish" umbenennen z.b. "Σταμάτης Γονίδης - Δικιά Μου Είναι Η Ζωή" in "Stamatis Gonidis - Dikia Mou Einai I Zwi"
  3. 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? :D

Vielleicht kennt der eine oder andere eine einfachere Methode.

 

LG

Sakis

 

 

 

Edited by sakistech

  • Community Expert
6 hours ago, sakistech said:

Was meint Ihr, ist das so möglich? Wenn ja wie? :D

Hast du schon mal Skripte geschrieben? Wenn ja: ChatGPT fragen. Ergebnis kannst du hier gerne posten, dann korrigieren wie es bei Bedarf.

  • Author

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?

 

  • Community Expert
1 hour ago, sakistech said:
/home/sakis/youtube

So einen Pfad gibt es in unRAID nicht?!

  • Author

Ích weiß, ich teste das script erst auf einer ubuntu-VM.

  • Community Expert
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.

  • Author

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.

 

  1. Benennt die Datei von "greek" ins "greeklish".
  2. Verschiebt die Datei von "download" nach "audio".

Es gibt aber zwei Probleme:

  1. 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.
  2. 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 by sakistech

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.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.