Renommez vos MP3

Programmation d'applications complexes
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Renommez vos MP3

Message par lionel_om »

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 :D (j'y suis enfin passé !)

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
Lionel
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Re

Voici un lien pour télécharger MP3 renammer.

Comme dit précédemmant, il vous permet de renommer tous les fichier d'un dossier en respectant un formatage qu'il vous est libre de définir (parmi le numéro, le titre, le nom de l'album et le groupe). AInsi tous vos fichiers musiquaux seront du même format et aussi plus faciles à retrouver pour les lecteurs MP3 avec fonctions de reccherche de morceaux.

Voici une image de l'interface : Image

@++
Lionel
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

#good
Je suis un train de faire un truc qui n'a aucun rapport mais je pourrais te donner une partie du code pour renommer des fichiers mp4 (aac compris) assez facilement ... et sans bug :P
MP si tu es interessé ;)
"Qui baise trop bouffe un poil." P. Desproges
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

@KarLKoX : MP envoyé

Juste pour préciser, mon prog ne modifie pas les tags des fichiers, juste leur nom. Mais j'incorporerai ca plutard sans doute.

Si le source vous intéresse, je le mettrai en ligne plutard.

@++ Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre