Renommez vos MP3
Publié : lun. 19/juin/2006 9:27
Bonjour à tous.
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
(j'y suis enfin passé !)
Lionel
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