Ordner mithilfe von MP3 Tags erstellen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Ordner mithilfe von MP3 Tags erstellen

Beitrag von Joel »

Hi,

Hier ein kleines Programm, dass MP3s mithilfe der ID3 Tags einordnet.

Beispiel: Ihr wählt als erstes einen Ordner aus, der 1000 Musikstücke enthält (ohne Unterordner). Dannach "Eigene Musik".

Die Ordnerstruktur in Eigene Musik ist dann so:
  • Autor>Album>Dateiname+".mp3"
Der Dateiname wird so definiert:
  • Autor - Album - Track - Titel - .mp3
Bitte unten alle Dlls etc Downloaden, dasshier sit nur die Source:

Code: Alles auswählen

; PB 4.30
; Version 1.0
; Joel Th. (Deutsches Forum)
EnableExplicit
XIncludeFile "ID3-Tagger-pbi.pbi"

Procedure.s MyMusicDirectory()
  Protected sPath.s = Space(#MAX_PATH)
  SHGetSpecialFolderPath_(#Null, @sPath, #CSIDL_MYMUSIC, 0)
  PathAddBackslash_(@sPath)
  ProcedureReturn sPath
EndProcedure

Procedure.s TimeString(Time, Sep$ = ":")
 If Time > 0
  Protected sTimeString.s
  Protected iHours.i, iMinutes.i, iSeconds.i
  
  Time / 1000: iSeconds = Time % 60
  Time / 60:   iMinutes = Time % 60
  Time / 60:   iHours   = Time % 60
    
  sTimeString + RSet(Str(iHours), 2, "0") + Sep$ + RSet(Str(iMinutes), 2, "0") + Sep$ + RSet(Str(iSeconds), 2, "0")
  
  ProcedureReturn sTimeString
 Else
  ProcedureReturn "00:00:00"
 EndIf
EndProcedure

Structure _Tag
  title.s
  artist.s
  album.s
  year.i
  comment.s
  track.i
  genre.s
  bitrate.i
  samplerate.i
  channels.i
  length.i
EndStructure
Global Tag._Tag

Procedure.i TagLib_ReadTag(File$)
  Protected iResult.i
  
  If Trim(File$) = "" Or FileSize(File$) < 1
    iResult = 0
  Else
    Protected iFile.i
    
    iFile = taglib_file_new(File$)
    If iFile
      Protected *Tag, *Proberties
      
      *Tag = taglib_file_tag(iFile)
      If *Tag
        Tag\title   = Trim(PeekS(taglib_tag_title(*Tag) ,-1, #PB_UTF8))
        Tag\artist  = Trim(PeekS(taglib_tag_artist(*Tag) ,-1, #PB_UTF8))
        Tag\album   = Trim(PeekS(taglib_tag_album(*Tag) ,-1, #PB_UTF8))
        Tag\year    = taglib_tag_year(*Tag)
        Tag\comment = Trim(PeekS(taglib_tag_comment(*Tag), -1, #PB_UTF8))
        Tag\track   = taglib_tag_track(*Tag)
        Tag\genre   = Trim(PeekS(taglib_tag_genre(*Tag) ,-1, #PB_UTF8))
      EndIf
      
      *Proberties = taglib_file_audioproperties(iFile)
      If *Proberties
        Tag\bitrate    = taglib_audioproperties_bitrate(*Proberties)
        Tag\samplerate = taglib_audioproperties_samplerate(*Proberties)
        Tag\channels   = taglib_audioproperties_channels(*Proberties)
        Tag\length     = taglib_audioproperties_length(*Proberties)
      EndIf
      
      taglib_tag_free_strings()
      taglib_file_free(iFile)
      
      iResult = 1
    EndIf
  EndIf
  
  ProcedureReturn iResult
EndProcedure

;Test
Define.s sFolder = PathRequester("Ordnerwahl", "C:\Users")
Define.s sSave = PathRequester("Speichern", "C:\Users")
Delay(1000)
If sFolder
  If ExamineDirectory(0, sFolder, "*.*")
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        If TagLib_ReadTag(sFolder + DirectoryEntryName(0)) = 1
        
       If Tag\artist
       If FileSize(sSave+Tag\artist) <> -2 
            CreateDirectory(sSave+Tag\artist)
        EndIf
            Else 
            MessageRequester("Fehler", "Der Artist von "+sSave+DirectoryEntryName(0)+"konnte nicht ermittelt werden", 0)
          EndIf
          
          If Tag\album
          If FileSize(sSave+Tag\artist+"\"+Tag\album) <> -2
             CreateDirectory(sSave+Tag\artist+"\"+Tag\album)
             EndIf 
             Else 
             MessageRequester("Fehler", "Das Album von "+sSave+DirectoryEntryName(0)+"konnte nicht ermittelt werden", 0)
             Tag\album = "Unbekannt"
             CreateDirectory(sSave+Tag\artist+"\"+Tag\album)
          EndIf
                    
          If CopyFile(sFolder+DirectoryEntryName(0), sSave+Tag\artist+"\"+Tag\album+"\"+Tag\artist+"-"+Tag\album+"-"+Str(0)+Str(Tag\track)+"-"+Tag\title+".mp3") 
         Else 
         MessageRequester("Fehler", "Das Artist, Album, Tracknummer oder Titel von "+sSave+DirectoryEntryName(0)+" konnte nicht ermittelt werden. ID ist gleich "+sSave+Tag\artist+"\"+Tag\album+"\"+Tag\artist+"-"+Tag\album+"-"+Str(0)+Str(Tag\track)+"-"+Tag\title+".mp3", 0)
         EndIf 
      
      
      
        Else
          Debug "Open Failed"
        EndIf
      EndIf
    Wend
    FinishDirectory(0)
  EndIf
EndIf
Download
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7