Jump to content

Script das mp3 Dateien umbennent, Ordner erstellt und verschiebt


sakistech

Recommended Posts

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
Link to comment

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?

 

Link to comment
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.

Link to comment

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
Link to comment

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...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...