Permuter la numérotation de deux fichiers mp3

Résolu/Fermé
CIZARTS - Modifié le 24 févr. 2023 à 02:37
 CIZARTS - 24 févr. 2023 à 13:56

Bonjour,

Je viens sur ce forum en espérant avoir de la chance pour le timing assez serré de 2 jours.

Le contexte pour ceux que ça intéresse: Je dois faire une fête et je dois gérer les musiques et donc faire une playlist sur clé USB. Oui on est en 2023 le Bluetooth ça existe, mais on m'a demander de procéder comme ça, pas de commande dispo sur l'enceinte donc je dois tout mettre dans un ordre précis.
 

Mon idée était de créer un programme sous Python permettant de copier les musiques de deux dossiers vers un autre, en numérotant automatiquement celles-ci en alternant 3 par 3 les musiques des deux dossiers. Touts les tags MP3 se suppriment et le titre dans les tags devient le même que le nom du fichier. Celui-là, il fonctionne sans soucis.

Mon soucis est sur le deuxième programme.

Le but de ce programme est de charger la liste de tout les fichiers( MP3) présent dans le dossier, de les lister dans l'invite de commande, en donnant le numéro correspondant sur la liste de l'invite de commande de pouvoir échanger le numéro de deux musiques sur le nom de fichier ET également dans le titre au niveau des tags ! (au cas-où quelques unes sont à réorganisées)

Le programme "fonctionne" jusqu'à la validation du deuxième numéro, puis se ferme totalement sans aucun changement. Le programme en question:

import os
from mutagen.easyid3 import EasyID3

# Demander le dossier source à l'utilisateur et vérifier que le dossier existe
source_dir = input("Entrez le chemin du dossier source : ")
if not os.path.isdir(source_dir):
    print("Le dossier source spécifié n'existe pas.")
    exit()

while True:
    # Charger la liste de tous les fichiers dans le dossier source
    files = os.listdir(source_dir)
    # Afficher une liste des fichiers dans le dossier
    print("Fichiers dans le dossier source :")
    for i, file in enumerate(files):
        print(f"{i+1}. {file}")

    # Demander à l'utilisateur de saisir les numéros des fichiers à échanger
    num1 = int(input("Entrez le numéro du premier fichier à échanger : "))
    num2 = int(input("Entrez le numéro du deuxième fichier à échanger : "))

    # Extraire les noms des fichiers à échanger
    filename1 = os.path.join(source_dir, files[num1-1])
    filename2 = os.path.join(source_dir, files[num2-1])

    # Échanger les numéros situés au debut de leur noms
    name1, ext1 = os.path.splitext(filename1)
    name2, ext2 = os.path.splitext(filename2)
    os.rename(filename1, f"{name2}{ext1}")
    os.rename(filename2, f"{name1}{ext2}")

    # Mettre à jour les tags ID3 des fichiers mp3
    if ext1 == ".mp3" and ext2 == ".mp3":
        audio1 = EasyID3(filename1)
        audio2 = EasyID3(filename2)
        audio1["title"], audio2["title"] = audio2["title"], audio1["title"]
        audio1.save()
        audio2.save()

    # Demander à l'utilisateur s'il souhaite continuer à échanger des fichiers
    response = input("Voulez-vous continuer à échanger des fichiers ? (Oui/Non) ")
    if response.lower() != "oui":
        break

Je précise que les fichiers numérotés par le 1er programme ressemblent à ceci:

1_musique-abc.mp3

2_musique-bcd.mp3

etc...

L'erreur dans le cmd est:

Traceback (most recent call last):
  File "C:\Users\Nom\Desktop\Musiques fête\Test ChatGPT\pt22.py", line 29, in <module>
    os.rename(filename1, f"{name2}{ext1}")
FileExistsError: [WinError 183] Impossible de créer un fichier déjà existant: 'C:\\Users\\Nom\\Desktop\\Musiques fête\\Test ChatGPT\\Dossier trié\\8_musique.mp3' -> 'C:\\Users\\Nom\\Desktop\\Musiques fête\\Test ChatGPT\\Dossier trié\\9_musique.mp3'


Gros Disclaimer: J'avoue avoir aucune connaissances en Python, je me suis servis de ChatGPT (une intelligence artificielle) pour créer les deux programmes. Je n'ai malheureusement pas le temps d'étudier le langage Python, donc si certains d'entres vous auraient l'amabilité de partager votre savoir, je suis preneur !

PS: Bien évidemment que ChatGPT n'a pas pu corriger l'erreur, sinon je ne serais pas là !

5 réponses

Tu as :

1_musique-abc.mp3
2_musique-bcd.mp3

et tu voudrais :

1_musique-bcd.mp3
2_musique-abc.mp3

Tout ce que fait ton code est d'échanger les extensions, qui sont malheureusement identiques dans le cas actuel.
Est-ce que les numéros peuvent dépasser 10, voire 100?
Est-ce qu'il y a d'autres '_' après le premier?

Avec des extensions identiques, le code suivant devrait fonctionner:

    # Extraire les noms des fichiers à échanger
    filename1 = os.path.join(source_dir, files[num1-1])
    filename2 = os.path.join(source_dir, files[num2-1])
    # Échanger les numéros situés au debut de leur noms
    index1 = files[num1-1].index("_")
    index2 = files[num2-1].index("_")
    newname1 = files[num2-1][:index2] + files[num1-1][index1:]
    newname2 = files[num1-1][:index1] + files[num2-1][index2:]
    newname1 = os.path.join(source_dir, newname1)
    newname2 = os.path.join(source_dir, newname2)
    name1, ext1 = os.path.splitext(newname1)
    name2, ext2 = os.path.splitext(newname2)
    os.rename(filename1, f"{name1}{ext1}")
    os.rename(filename2, f"{name2}{ext2}")

J'ai des doutes sur la pertinence d'échanger les titres dans ta base de données car les anciens noms n'existeront plus.

1

Bonsoir et merci pour ta réponse rapide ! Oui le nombre de musique dépasse les 100. Non pas de "_" après le premier. Je me doute bien que échanger un 1 avec un 2 peut causer trouble avec un 31 ou bien un 32 dans le programme car le 2 et le 1 sont présents dans ces valeurs.

0
CIZARTS > CIZARTS
22 févr. 2023 à 03:00

Et oui tu as bien compris !

0

Re ! Je viens de tester avec ton code, dans l'invite de commande c'est classé différemment: ​​​​​​​https://prnt.sc/3gSkpWHaJsRL c'est pas dans l'ordre des numéros des fichiers (ce qui ne me dérange absolument pas si je peux effectuer les manips) mais si j'ai bien compris vu que la liste "indexe" un nombre a chaque musique c'est plus facile de se référer à ce numéro plutôt qu'a celui des fichiers qui peuvent vites être confondus.

Alors ya un petit soucis, seuls les noms complets (nombres compris) se sont changés ! Pas les musiques: "1_musiqueabc" s'est fait renommé "2_musiquebcd" mais ça reste toujours la même musique. 

0
CIZARTS > CIZARTS
22 févr. 2023 à 03:29

Et vice-versa bien-entendu. Je te remercie beaucoups pour ton aide.

0

"J'ai des doutes sur la pertinence d'échanger les titres dans ta base de données car les anciens noms n'existeront plus."

Ouais c'est vrai que dit comme ça, mais bon en soit je pensai vraiment pas que ce soit si fastidieux et qui fallait détourner autant les choses pour si peu ahaha... En soit éditer un fichier manuellement et échanger les numéros c'est simple, mais sur un grand nombre de file a traiter bah c'est assez long...

Et je pensai que le semi-automatiser le serait aussi et que ça pouvait me faire gagner du temps, mais bon ça m'a l'air compliqué.

0

Avec le code suivant, on devrait pouvoir échanger:

1_musique-abc.mp3
21_musique-def.mp3

pour:

1_musique-def.mp3
21_musique-abc.mp3

Note qu'un dossier n'est pas forcément trié dans l'ordre dans lequel il est affiché.
La commande dir de Windows et ls de Ubuntu les affichent dans l'ordre "alphabétique".

Si c'est un automate qui lira le dossier pour le faire jouer, il pourrait le lire dans l'ordre de création et non dans l'ordre d'affichage.
-
 

    # Extraire les noms des fichiers à échanger
    filename1 = os.path.join(source_dir, files[num1-1])
    filename2 = os.path.join(source_dir, files[num2-1])
    # Échanger les numéros situés au debut de leur noms
    index1 = files[num1-1].index("_")
    index2 = files[num2-1].index("_")
    newname1 = files[num2-1][:index2] + files[num1-1][index1:]
    newname2 = files[num1-1][:index1] + files[num2-1][index2:]
    newname1 = os.path.join(source_dir, newname1)
    newname2 = os.path.join(source_dir, newname2)
    os.rename(filename1, newname1)
    os.rename(filename2, newname2)
1

Yessss !! Merci énormément pour ta patience et ton aide précieuse, j'ai mon ptit arsenal complet de programme grace à toi !!!! :)

0

" Note qu'un dossier n'est pas forcément trié dans l'ordre dans lequel il est affiché.
La commande dir de Windows et ls de Ubuntu les affichent dans l'ordre "alphabétique" "
Oui biensur je sais, merci beaucoup l'ami !! Tu fais un heureux jte l'dis !

0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
24 févr. 2023 à 02:44

Hello,

Bon et sinon concernant le code python, le code serait significativement plus simple en utilisant le module pathlib et la fonction split. Mais bref, si tu es content avec le code actuel, autant en rester là ;-)

Enfin, il y a des choix assez surprenant dans le code que tu proposes. Tu utilises EasyID3 pour modifier les métadonnées des fichiers mp3, mais tu stockes le titre et le numéro de piste dans le titre. Généralement le numéro de piste est stocké dans un champ dédié quand on parle d'un album. Et si on parle d'une playlist, la bonne manière de faire est d'ordonner des fichiers mp3 dans un fichier m3u, ce qui ne nécessite aucune compétence en programmation et est supporté par la plupart des lecteurs mp3...

Bonne continuation

1

Salut, je ne connais (casiment) rien au langage Python, ses modules et bibliothèques ! Les codes ont été écrit par ChatGPT qui est une intelligence artificielle et qui a fait elle même le code. J'en aurait appris plus que je ne le pensais en m'intéressant au codage Python par hasard ahaha !

Vu que je ne sais pas de quelle manière l'enceinte lis les fichiers sur la clé USB (donc si c'est un automate comme disait PierrotLeFou) j'ai bien fais en sorte que le code place les numéros dans l'endroit dédié dans les tags mais aussi au début des titres, par sécurité pour forcer l'ordre, car je ne sais pas ce qui établira l'ordre dans lequel les fichiers seront lu sur l'enceinte. 

Oui le m3u me dit quelque chose mais je ne sais pas si l'enceinte l'aurais pris en compte donc j'ai voulu essayer une approche un peu plus "simple" pour classer les sons. Merci à toi pour ton aide et tes propositions ! 

0

Ce qui m'a embrouillé, c'est l'idée de possiblement échanger les extensions. Est-ce que toutes les extensions sont 'mp3' dans ton cas?
Redis-moi ce que tu attends de l'échange:
1_musique-abc.mp3
2_musique-def.mp3

0

Ah oui bien sur les fichiers sont tous des .mp3. Je cherche simplement a intervertir le numéro au début des noms de fichier dans le programme sans qu'il se ferme si possible hehe, histoire de rapidement changer l'ordre quand nécessaire.

0
CIZARTS > CIZARTS
22 févr. 2023 à 04:09

Pour être le plus clair possible:

"1_michael-jackson-thriller.mp3" et 2_bruno-mars-treasure.mp3"

deviennent simplement

"2_michael-jackson-thriller.mp3" et 1_bruno-mars-treasure.mp3"

[Fichier respectifs l'un en dessous de l'autre]

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Changer l'ordre dans l'affichage ou dans le dossier?
Pour changer dans le dossier, il faut faire des rename.
Pour changer seulement sur l'affichage, il suffit d'interchanger les entrées dans la liste  files .

0

Je cherche seulement a rename certains fichiers en échangeant les numéros l'ami ! Je dois ranger les sons dans l'ordre précis du déroulement de la soirée et interchangé certains de numéros. C'est peut-être plus clair comme ça? On va y arriver bordel haha merci beaucoup de ton aide vraiment c'est sincère

0
CIZARTS > CIZARTS
22 févr. 2023 à 04:26

Exemple concret, j'ai dans mon dossier:

1_michael-jackson-thriller.mp3

2_bruno-mars-treasure.mp3

3_stevie-wonder-superstition.mp3

4_autresonun.mp3

5_autresondeux.mp3

J'aimerai simplement sur le programme pouvoir dire: prend "1_michael-jackson-thriller.mp3" et "4_autresonun.mp3" et rename les en échangeant le numéro pour que ça devienne "4_michael-jackson-thriller.mp3" et ""1_autresonun.mp3"

Ce qui me donnera:

1_autresonun.mp3

2_bruno-mars-treasure.mp3

3_stevie-wonder-superstition.mp3

4_michael-jackson-thriller.mp3

5_autresondeux.mp3

0
PierrotLeFou > CIZARTS
22 févr. 2023 à 04:50

Le second code que j'ai donné devrait faire exactement ce que tu veux.

Mais qui (ou quoi) va sélectionner les fichiers?

Est que le programme va se fier à l'affichage ou au contenu réel du dossier?

0
CIZARTS > PierrotLeFou
24 févr. 2023 à 01:47

Salut l'ami, désolé, je n'ai pas pu revenir sur le forum plus tôt. Ton programme a bien fonctionné sans soucis, j'ai réussi à modifier le code (tout avec ChatGPT bien évidemment) pour faire en sorte que la musique 26 corresponde bien au numéro 26 de la liste/index créer dans le programme. Car comme je t'ai montré sur un screen dans un autre commentaire, les musiques étaient attribué de manière assez confuse. Ce n'étais pas si dérangeant mais moins pratique.

J'ai aussi rajouté que le programme m'indique quelles sont les 2 musiques qui ont été échangés en affichant les titres en vert pour plus de lisibilité (avec la bibliothèque Colorama) et que le message s'affiche pendant 5 secondes pour bien pouvoir lire sans soucis la modification. Le programme redonnait ensuite lui même de base la liste avec les 2 musiques échangées.

Je te remercie énormément car cela m'a bien évité 2 heures au moins de travail. 

J'ai aussi fais 3 autres programmes supplémentaires qui permettent de "formater" les fichiers de sorte à ce que tout se lise dans l'ordre (numéro et nom de fichier copiés dans les tags, sur le titre, et seulement le numéro dans le numéro de piste) et que chaque mot commence par une majuscule, et également supprime tout les tirets.

Si jamais tu es intéressé par la gueule des codes je te les partagés volontiers ! Encore merci pour ta gentillesse, ta patience, ta bienveillance envers quelqu'un qui n'y connais pas grand chose en Python, et surtout la rapidité de tes réponses. Je te souhaite le meilleurs ahaha. !

0