Pour renommer les MP3 que vous avez dl (album complet d'un artiste ou groupe), je vous propose d'utiliser ce petit programme : (code à la fin)
Il vous permet de remplacer les "_" par des espaces, de découper les champs afin de renommer les fichiers avec le formattage choisi : "Groupe - Numéro - Titre" ou "Titre", etc... (grâce aux boutons 'Num', 'Titre', etc.)
Il gère aussi la sauvegarde du formattage sélectionné et du dernier dossier parcouru.
En double-cliquant sur la ListViewGadget des nouveaux noms, vous pouvez modifierle nom d'une piste.
Voilà dîtes moi ce que vous en pensez. C'est un code PB4

Code : Tout sélectionner
Declare.s GetTagIndex(list.s(), ind.l)
Macro MyStringField(text, indice, sep)
Trim(StringField(text, indice, sep))
EndMacro
Global NewList Modified.b()
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#Frame3D_0
#Listview_0
#Frame3D_1
#Listview_1
#Frame3D_2
#Label_artist
#String_Artist
#Label_album
#String_Album
#Label_Format
#String_Format
#Button_Num
#Button_Artist
#Button_Album
#Button_Title
#Button_Ok
#Button_Quit
EndEnumeration
NewList InfoSong.s()
AddElement(InfoSong())
InfoSong() = "%Num%"
AddElement(InfoSong())
InfoSong() = "%Title%"
AddElement(InfoSong())
InfoSong() = "%Artist%"
AddElement(InfoSong())
InfoSong() = "%Album%"
Enumeration
#Tag_Num
#Tag_Title
#Tag_Artist
#Tag_Album
EndEnumeration
#PrefFile = "data.ini"
#Path = "Path"
#Mask = "Mask"
Global DefaultPath.s, DefaultMask.s
DefaultPath = "F:\Mes documents\Ma musique\## By artist ##\NightWish\From Wishes to Eternity"
DefaultMask = GetTagIndex(InfoSong(), #Tag_Num) + " - " + GetTagIndex(InfoSong(), #Tag_Title) + " - " + GetTagIndex(InfoSong(), #Tag_Artist)
Procedure InsertTag(list.s(), ind.l)
SelectElement(list(), ind)
SendMessage_(GadgetID(#String_Format), #EM_GETSEL, @debut.l, @fin.l)
text$ = GetGadgetText(#String_Format)
text$ = Left(text$, debut) + list() + Right(text$, Len(text$)-fin)
SetGadgetText(#String_Format, text$)
SendMessage_(GadgetID(#String_Format), #EM_SETSEL, debut+Len(list()), debut+Len(list()))
EndProcedure
Procedure Open_Window()
If OpenWindow(#Window_0, 283, 67, 900, 278, "MusicFiles renamer", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
Frame3DGadget(#Frame3D_0, 0, 0, 280, 270, "Fichiers trouvés")
ListViewGadget(#Listview_0, 10, 20, 260, 240)
Frame3DGadget(#Frame3D_1, 300, 0, 280, 270, "Nouveaux noms")
ListViewGadget(#Listview_1, 310, 20, 260, 240)
Frame3DGadget(#Frame3D_2, 600, 0, 290, 270, "Informations")
TextGadget(#Label_artist, 610, 20, 270, 20, "Artiste :")
StringGadget(#String_Artist, 620, 40, 250, 20, "")
TextGadget(#Label_album, 610, 70, 270, 20, "Album :")
StringGadget(#String_Album, 620, 90, 250, 20, "")
TextGadget(#Label_Format, 610, 130, 260, 20, "Format de sortie :")
StringGadget(#String_Format, 620, 150, 250, 20, "")
ButtonGadget(#Button_Num, 610, 180, 60, 30, "Numéro")
ButtonGadget(#Button_Title, 680, 180, 60, 30, "Titre")
ButtonGadget(#Button_Artist, 750, 180, 60, 30, "Artiste")
ButtonGadget(#Button_Album, 820, 180, 60, 30, "Album")
ButtonGadget(#Button_Ok, 630, 230, 110, 30, "> Renommer <")
ButtonGadget(#Button_Quit, 750, 230, 110, 30, "Quitter")
EndIf
EndIf
EndProcedure
Procedure.s GetTagIndex(list.s(), ind.l)
SelectElement(list(), ind)
ProcedureReturn list()
EndProcedure
Procedure.s Implode(list.s(), sep$)
Res$ = #NULL$
ForEach list()
Res$ = Res$ + list() + sep$
Next
Res$ = Mid(Res$, 1, Len(Res$)-1)
ProcedureReturn Res$
EndProcedure
Procedure ListCollision(l1.s(), l2.s(), res.s())
ClearList(res())
ForEach l1()
ForEach l2()
If l1() = l2()
;Debug "Col : " + l1()
AddElement(res())
res() = l1()
EndIf
Next
Next
EndProcedure
Procedure SearchPattern(file1.s, file2.s, same.s())
ClearList(same())
ReplaceString(file1, ".", "-", 2)
ReplaceString(file2, ".", "-", 2)
For i=1 To CountString(file1, "-")+1
field$ = MyStringField(file1, i, "-")
For j=1 To CountString(file2, "-")+1
If field$ = MyStringField(file2, j, "-")
AddElement(same())
same() = field$
EndIf
Next j
Next i
EndProcedure
; Enleve l'extension d'un nom de fichier
Procedure.s EnleveExtension(file$)
If Len(GetExtensionPart(file$))
file$ = Left(file$, Len(file$)-(Len(GetExtensionPart(file$))+1))
;PokeB(@file$, Asc(UCase(Mid(file$,1,1))))
EndIf
ProcedureReturn file$
EndProcedure
Procedure CopyList(l1.s(), l2.s())
ClearList(l2())
ForEach l1()
AddElement(l2())
l2() = l1()
Next
EndProcedure
Procedure GetCollisionFields(files.s(), resCollision.s())
NewList patternFound1.s()
NewList patternFound2.s()
ClearList(resCollision())
SelectElement(files(),0)
file1$ = files()
While NextElement(files())
file2$ = EnleveExtension(files())
SearchPattern(file1$, file2$, patternFound2())
If CountList(patternFound1()) = 0
CopyList(patternFound2(), resCollision())
Else
ListCollision(patternFound1(), patternFound2(), resCollision())
EndIf
file1$ = file2$
CopyList(resCollision(), patternFound1())
Wend
EndProcedure
Procedure IsNumeric(t$)
For i = 1 To Len(t$)
If Asc(Mid(t$, i, 1)) < '0' Or Asc(Mid(t$, i, 1)) > '9'
ProcedureReturn #False
EndIf
Next i
ProcedureReturn #True
EndProcedure
Procedure GetNumFile(file.s, defaut.l)
For i = 1 To CountString(file, "-")+1
field$ = MyStringField(file, i, "-")
If IsNumeric(field$) And Val(field$)>0
ProcedureReturn Val(field$)
EndIf
Next i
ProcedureReturn defaut
EndProcedure
Procedure.s FormatValue(val.l)
If val > 9
ProcedureReturn Str(val)
Else
ProcedureReturn "0" + Str(val)
EndIf
EndProcedure
Procedure.s SearchSongTitle(file.s, col.s())
ReplaceString(file, "_", " ", 2)
ReplaceString(file, ".", "-", 2)
For i = 3 To CountString(file, "-")+1
trouve = #False
field.s = MyStringField(file, i, "-")
;Debug field
ForEach col()
If col() = field
trouve = #True
EndIf
Next
If trouve = #False And IsNumeric(field)=#False
PokeB(@field, Asc(UCase(Mid(field,1,1))))
;Debug "-> " + field
ProcedureReturn field
EndIf
Next i
ProcedureReturn ""
EndProcedure
Procedure.s NormalizeString(t.s)
ReplaceString(t, "_", " ", 2)
PokeB(@t, Asc(UCase(Mid(t,1,1))))
For i = 2 To Len(t)
If PeekB(@t+i-2) = ' '
PokeB(@t+i-1, Asc(UCase(Chr(PeekB(@t+i-1)))))
EndIf
Next i
ProcedureReturn t
EndProcedure
Procedure ConvertFileName(files.s(), col.s(), tag.s())
Protected file.s
ClearGadgetItemList(#Listview_1)
ResetList(Modified())
ForEach(files())
;Debug files()
NextElement(Modified())
If Modified() = #False
file.s = GetGadgetText(#String_Format) + "." + GetExtensionPart(files())
ForEach tag()
Select ListIndex(tag())
Case #Tag_Num
file = ReplaceString(file, tag(), FormatValue(GetNumFile(files(), ListIndex(files())+1)))
Case #Tag_Title
tmp.s = tag()
file = ReplaceString(file, tag(), SearchSongTitle(EnleveExtension(files()), col()))
Case #Tag_Artist
file = ReplaceString(file, tag(), NormalizeString(GetGadgetText(#String_Artist)))
Case #Tag_Album
file = ReplaceString(file, tag(), NormalizeString(GetGadgetText(#String_Album)))
Default
Debug "Error !!!"
EndSelect
Next
ReplaceString(file, "_", " ", 2)
;Debug " --> " + file
AddGadgetItem(#Listview_1, -1, file)
EndIf
Next
EndProcedure
Procedure Quit(folder.s, masque.s)
OpenPreferences(#PrefFile)
WritePreferenceString(#Path, folder)
WritePreferenceString(#Mask, masque)
ClosePreferences()
End
EndProcedure
Procedure LoadPreferences()
If OpenPreferences(#PrefFile)
DefaultPath = ReadPreferenceString(#Path, DefaultPath)
DefaultMask = ReadPreferenceString(#Mask, DefaultMask)
ClosePreferences()
EndIf
EndProcedure
; ---------------------------------------------------------------------
;- Prog principal
; ---------------------------------------------------------------------
; -------------------------------------
;- Récupérartion du dossier à analyser
LoadPreferences()
folder.s = #NULL$
temp.s
nbParam.l = CountProgramParameters()
If nbParam > 0
i.l = 0
While folder = #NULL$ And i < nbParam
temp = ProgramParameter(i)
If FileSize(temp) = -2
folder = temp
EndIf
Wend
Else
folder = PathRequester( "Dossier à analyser", DefaultPath)
EndIf
If FileSize(folder) <> -2
End
EndIf
If Right(folder,1) <> "\"
folder + "\"
EndIf
NewList files.s()
hDir.l = ExamineDirectory(#PB_Any, folder, "*.*")
If hDir
While NextDirectoryEntry(hDir)
If DirectoryEntryType(hDir) = #PB_DirectoryEntry_File
temp = DirectoryEntryName(hDir)
ext$ = LCase(GetExtensionPart(temp))
If ext$ = "mp3" Or ext$ = "wma" Or ext$ = "wav" Or ext$ = "mid"
AddElement(files())
files() = temp
EndIf
EndIf
Wend
SortList(files(), 2)
Else
MessageRequester("Erreur", "Impossible d'analyser le dossier !", #MB_ICONERROR)
End
EndIf
; -------------------------------------
;- Recherche des infos des chansons
; Pas assez de fichiers
If CountList(files()) < 2
MessageRequester("Erreur", "Pas assez de fichiers !", #MB_ICONERROR)
End
EndIf
NewList resCollision.s()
GetCollisionFields(files.s(), resCollision())
Open_Window()
ForEach files()
AddGadgetItem(#Listview_0 ,-1, files())
AddElement(Modified())
;Modified() = #False
Next
SetGadgetText(#String_Format, DefaultMask)
If CountList( resCollision() ) > 0
SelectElement(resCollision(),0)
SetGadgetText(#String_Artist, NormalizeString(resCollision()))
EndIf
If CountList( resCollision() ) > 1
SelectElement(resCollision(),1)
SetGadgetText(#String_Album, NormalizeString(resCollision()))
EndIf
ConvertFileName(files(), resCollision(), InfoSong())
; -------------------------------------
;- Boucle principale des Events
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit(folder, GetGadgetText(#String_Format))
Case #PB_Event_Gadget
EventType.l = EventType()
EventGadget.l = EventGadget()
Select EventGadget
Case #Button_Quit
Quit(folder, GetGadgetText(#String_Format))
Case #Button_Num
InsertTag(InfoSong(), #Tag_Num)
SetActiveGadget(#String_Format)
ConvertFileName(files(), resCollision(), InfoSong())
Case #Button_Title
InsertTag(InfoSong(), #Tag_Title)
SetActiveGadget(#String_Format)
ConvertFileName(files(), resCollision(), InfoSong())
Case #Button_Album
InsertTag(InfoSong(), #Tag_Album)
SetActiveGadget(#String_Format)
ConvertFileName(files(), resCollision(), InfoSong())
Case #Button_Artist
InsertTag(InfoSong(), #Tag_Artist)
SetActiveGadget(#String_Format)
ConvertFileName(files(), resCollision(), InfoSong())
Case #Button_Ok
For i=0 To CountGadgetItems(#Listview_0)-1
If GetGadgetItemText(#Listview_0, i, 0) <> GetGadgetItemText(#Listview_1, i, 0)
If FileSize(folder+GetGadgetItemText(#Listview_1, i, 0)) = -1
RenameFile(folder+GetGadgetItemText(#Listview_0, i, 0), folder+GetGadgetItemText(#Listview_1, i, 0))
Else
MessageRequester("Erreur", "Impossible de renommer le fichier '" + GetGadgetItemText(#Listview_0, i, 0) + "' !", #MB_ICONERROR)
EndIf
EndIf
Next
MessageRequester("Renommage", "Opération terminée !", #MB_ICONINFORMATION)
Quit(folder, GetGadgetText(#String_Format))
Case #Listview_1
If EventType = #PB_EventType_LeftDoubleClick
index = GetGadgetState(#Listview_1)
If index >= 0
nom$ = InputRequester("Modification du nom d'une chanson", "Nouveau nom", GetGadgetText(#Listview_1))
If nom$
SetGadgetItemText(#Listview_1, index, nom$, 0)
EndIf
EndIf
EndIf
EndSelect
Select EventType
Case #PB_EventType_LeftDoubleClick
If EventGadget = #Listview_1
index = GetGadgetState(#Listview_1)
If index >= 0
nom$ = InputRequester("Modification du nom d'une chanson", "Nouveau nom", GetGadgetText(#Listview_1))
If nom$ And nom$ <> GetGadgetText(#Listview_1)
SetGadgetItemText(#Listview_1, index, nom$, 0)
SelectElement(Modified(), index)
Modified() = #True
EndIf
EndIf
EndIf
Case #PB_EventType_Change
Select EventGadget
Case #String_Album
ConvertFileName(files(), resCollision(), InfoSong())
Case #String_Artist
ConvertFileName(files(), resCollision(), InfoSong())
Case #String_Format
ConvertFileName(files(), resCollision(), InfoSong())
EndSelect
EndSelect
EndSelect
ForEver