[RESOLU] Script simple mais complexe - Renomage de masse

Bonjour,

Je souhaite renommer 1500 fichiers.
Ces fichiers son nommer ainsi : Artiste - Nom De La Chanson.mp3 ou Artiste artiste - Nom De La Chanson.mp3

Est ce qu’il est possible d’écrire un script permettant de les renommer ainsi : Artiste Artiste - Nom de la chanson.mp3 ?

j’aurais fais ça en python moi (en perl c’est sûrement 100x plus court, mais je connais pas)

1ere étape, récupérer la liste des fichiers à renommer (le module os de python à tout ce qu’il faut)

Ensuite, pour chaque nom de fichier dans ta liste:

** 2eme étape, pour chaque fichier, séparer la partie artiste de la partie nom de la chanson, ajouter une majuscule à la première lettre du nom de l’artiste, le dupliquer

** 3eme étape, renommer le fichier avec le nouveau nom.

je popurrais te le faire, mais ça me prendrait un peu de temps car je suis débutant en python, tu peux t’y mettre si tu es motivé (quelques base en programmation peuvent s’avérer utile, si tu n’en as aucune, c’est peut-être pas la meilleur idée, à moins que tu sois vraiment motivé), et je pourrai toujours t’aiguiller et te corriger.

Je connais pas le python mais je connais un tout petit peu le perl.
Je vais voir dans ce sens…

J’avance mais j’ai un problème de regex.

Artiste et artiste - Titre atitre.mp3
Artiste artiste - Titre atitre.mp3

Comment faire pour que le a du artiste soit en majuscule uniquement si artiste à une longueur supérieur à 2 ?


Est-il possible d’écrire des tags id3 avec perl ?


#~*~ UTF-8 ~*~

from os import *

liste_titres = listdir(".")
for titre in liste_titres :
        #recherche de la sequence " - " qui separe l'artiste du titre
        a=titre.find(" - ")
        artiste=titre[:a]
        chanson=titre[a+3:]

        #recherche du caractere   (espace) qui separe (eventuellement) les deux occurences de artiste
        b=artiste.find(" ")
        if b>0 :
                artiste=artiste[:b]
        nomfichier=artiste+" "+artiste+" - "+chanson
        print nomfichier

Je pense que c’est faisable avec les regexp et find …

Edit : il manque à faire le rename à la place du print à la fin :
rename(titre , nomfichier)

Mais j’ai cela :

#!/usr/bin/perl -w
use strict;

my @elements = glob("/media/gros_docs/0-9/*.mp3");
my $elements;

foreach $elements(@elements) {

	$elements = lc($elements);
	$elements = ucfirst($elements);

	$elements =~ s/ feat / & /;  $elements =~ s/ feat. / & /;
	$elements =~ s/ feat./ & /;  $elements =~ s/ ft / & /;

	# ajouter une majuscule artiste composer de deux mots


	$elements =~ s/- a{1}/- A/;  $elements =~ s/- b{1}/- B/;
	$elements =~ s/- c{1}/- C/;  $elements =~ s/- d{1}/- D/;
	$elements =~ s/- e{1}/- E/;  $elements =~ s/- f{1}/- F/;
	$elements =~ s/- g{1}/- G/;  $elements =~ s/- h{1}/- H/;
	$elements =~ s/- i{1}/- I/;  $elements =~ s/- j{1}/- J/;
	$elements =~ s/- k{1}/- K/;  $elements =~ s/- l{1}/- L/;
	$elements =~ s/- m{1}/- M/;  $elements =~ s/- n{1}/- N/;
	$elements =~ s/- o{1}/- O/;  $elements =~ s/- p{1}/- P/;
	$elements =~ s/- q{1}/- Q/;  $elements =~ s/- r{1}/- R/;
	$elements =~ s/- s{1}/- S/;  $elements =~ s/- t{1}/- T/;
	$elements =~ s/- u{1}/- U/;  $elements =~ s/- v{1}/- V/;
	$elements =~ s/- w{1}/- W/;  $elements =~ s/- x{1}/- X/;
	$elements =~ s/- y{1}/- Y/;  $elements =~ s/- z{1}/- Z/;
	print "$elements\n";

}

v_atekor : ton bout de code en python renvoie des trucs bizarres

Ah, possible … Il est basé sur la présence ou non d’espaces, donc si il y en a en plus ou en moins ça ne marche pas (ça peut s’arranger)

Et comment stp ?

En parcourant la chaine de caractère artiste et vérifier si elle est composée de deux fois la même séquence, à la casse près.
Le problème là encore est qu’il faut que ce soir les mêmes séquences. les majuscules minuscules ne sont pas un problème, mais un fichier nommé comme ceci :

Prenom Nom P.Nom - nom du titre.mp3

pose problème

Edit : essaie de copier une dixaines de titres, histoire de voir les cas qui se présentent

Tous mes fichiers sont nommé de la sorte :

Auteur Auteur - Nom De La Chanson.mp3
Auteur Feat Auteur - Nom De La Chanson.mp3

Le problème de ton bout de code :

fichier d’entrée : Fatal Picard - L’amour à la française.mp3
fichier de sortie : Fatal Fatal - L’amour à la française.mp3

Ok, je te fais un script :wink:

:jap: :jap: :jap: :jap:


#~*~ UTF-8 ~*~

from os import *
from string import capitalize

liste_titres = listdir(".")
for titre in liste_titres :
        #recherche de la sequence " - " qui separe l'artiste du titre
        a=titre.find(" - ")
        artiste=titre[:a]
        chanson=titre[a+3:]

        #recherche du caractere   (espace) qui separe (eventuellement) les deux occurences de artiste
        lComposants=artiste.split(" ")
        l=len(lComposants)
        doublon=True
        for i in range(l/2):
                if capitalize(lComposants[i])!=capitalize(lComposants[i+l/2]):
                        doublon=False
        if doublon :
                lUtile=range(l/2)
        else:
                lUtile=range(l)
        artiste=""
        for i in lUtile:
                artiste=artiste+" "+lComposants[i]
        nomfichier=artiste+" "+artiste+" - "+chanson
        print nomfichier

-> C’est bon ?

Fichier d’entrée : Fatal Picard - L’amour à la française.mp3
Fichier de sortie : Fatal Picard Fatal Picard - L’amour à la française.mp3

Fichier d’entrée : Opus - Live Is Life.mp3
Fichier de sortie : - Live Is Life.mp3

Ok, je corrige. (Je m’en doutais :wink: )


#~*~ UTF-8 ~*~

from os import *
from string import capitalize

liste_titres = listdir(".")
for titre in liste_titres :
        #recherche de la sequence " - " qui separe l'artiste du titre
        a=titre.find(" - ")
        artiste=titre[:a]
        chanson=titre[a+3:]

        #recherche du caractere   (espace) qui separe (eventuellement) les deux occurences de artiste
        lComposants=artiste.split(" ")
        l=len(lComposants)
        doublon=True
        if l%2==0 :
                for i in range(l/2):
                        if capitalize(lComposants[i])!=capitalize(lComposants[i+l/2]):
                                doublon=False
        else :
                doublon=False

        if doublon :
                lUtile=range(l/2)
        else:
                lUtile=range(l)
        artiste=""
        for i in lUtile:
                artiste=artiste+" "+lComposants[i]
        nomfichier=artiste+" "+artiste+" - "+chanson
        print nomfichier

Mieux?

Presque ^^

Fichier d’entrée : Olivia Ruiz - La Femme Chocolat.mp3
Fichier de sortie : Olivia Ruiz Olivia Ruiz - La Femme Chocolat.mp3

Fichier d’entrée : Opus - Live Is Life.mp3
Fichier de sortie : Opus Opus - Live Is Life.mp3

nomfichier=artiste+" "+artiste+" - "+chanson

a remplacer par :

nomfichier=artiste+" - "+chanson

et c’est ok :

Fichier d’entrée : Olivia Ruiz - La Femme Chocolat.mp3
Fichier de sortie : Olivia Ruiz - La Femme Chocolat.mp3

Fichier d’entrée : Opus - Live Is Life.mp3
Fichier de sortie : Opus - Live Is Life.mp3

Et tu voudrais quoi ? (parce que c’est ce que j’avais compris defaire)

Le but :
Entrée : Artiste Artiste - Titre De La Chanson
Sortie : Artiste Artiste - Titre de la Chanson

Ici "ive Is Life" et "a Femme Chocolat" ne sont pas mis en minuscule. :smiley:

ok :wink:
je modifie :smiley: