Delphi - MP3 fájlok rendezése

forráskód letöltése
Valószínűleg mindannyian rendelkezünk kisebb-nagyobb MP3 fájlgyűjteménnyel. Ezek rendezgetése sokszor igen sok időt vesz igénybe, főleg ha kategóriánként, előadónként, vagy más szempontok szerint is külön könyvtárakba másoljuk ezeket. Ez a feladat mostantól nagyban leegyszerűsödik, mert egy olyan komponenst mutatunk be, amely képes a fájlokat különböző szempontok szerint elrendezni, átnevezni. A mellékelt példaprogram megnyitása előtt az MP3Organizer.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A komponens lényegében az MP3 típusú fájlokban eltárolt TAG információk alapján dolgozik. Ebből nyeri ki az adott fájl adatait, az előadót, az albumot, a stílust és a címet. A rendezés stílus, előadó és album szerint történik, de ezek közül a szempontok közül bármelyik elhagyható. Erre szolgál a Mode property, melyben a következő értékeket állíthatjuk be:
  • omByGenre: stílus szerinti rendezés;
  • omByArtist: előadó szerinti rendezés;
  • omByAlbum: az album címe szerinti rendezés.
Ha bármelyik érték meg van adva, akkor az adott szempontnak megfelelő nevű könyvtár jön létre a cél könyvtárban (TargetPath property), ahová az adott fájl lesz másolva. A könyvtárak természetesen egymásba lesznek ágyazva a fenti felsorolás szerinti sorrendben.
Egy MP3 fájlban a TAG információk a fájl utolsó 128 bájtjában vannak eltárolva. Ezeket egy TID3TagRecord típusú összetett változóba olvassuk be, amelynek szerkezete a következő:
  TID3TagRecord = packed record
    Tag: array[0..2] of Char;
    TagTitle: array[0..29] of Char;
    TagArtist: array[0..29] of Char;
    TagAlbum: array[0..29] of Char;
    TagYear: array[0..3] of Char;
    TagComment: array[0..29] of Char;
    TagGenre: Byte;
  end;
Nem biztos azonban, hogy a fájlban megtalálható ez az információ. Ezt onnan tudjuk meg, hogy amikor a rekordba beolvassuk a bájtokat, akkor a Tag mező értékének „TAG”-nak kell lennie. A szükséges TAG információkat átmásoljuk egy TMP3OrganizerTagInfo típusú rekordba, amely sztring formátumban tárolja ezeket az adatokat, még a stílust is, amely a TID3TagRecord rekord TagGenre mezőjében van megadva. Ha az információk nincsenek megadva, akkor különböző trükkökhöz kell folyamodni. Ebben az esetben az album és a stílus értéke „Unknown”, a cím az eredeti fájl neve lesz, az előadó pedig annak a könyvtárnak a neve, amelyben az eredeti fájl található.

A FileNameFormat property-ben megadhatjuk a fájlnév formátumát. Ebben különböző azonosítókat alkalmazhatunk az adatok beillesztésére. Ezek az azonosítók a következők:
  • %ARTIST': az előadó neve;
  • %ALBUM: az album címe;
  • %TITLE: a szám címe;
  • %TRACK: a szám sorszáma.
A property ezeken az azonosítókon kívül természetesen más karaktereket is tartalmazhat, amelyek egy fájlnévben használhatók. Egy lehetséges érték a „%ARTIST - %TITLE.MP3”, amelynek a kimenete lehet például a „Dire Straits – Sultans of Swing.MP3” fájlév.
Ha a rendezés stílus, előadó és album szerint történik, akkor a „%TRACK. %TITLE.MP3” formátum használható a legjobban, amelynek a fenti esetben az elérési útvonallal együtt a következő lehet az eredménye, ha a TargetPath property értéke pl. „D:\MP3\” (feltéve, hogy a TAG információk rendelkezésre állnak):
D:\MP3\Rock\Dire Straits\The very best of\01. Sultans of Swing.MP3
A formátumot úgy adjuk meg, hogy a rendelkezésre álló információkból, vagy éppen azok hiánya miatt ne jöhessen létre két egyforma fájlnév ugyanabban a célkönyvtárban. Többek között erre szolgál az a szabály is, hogy a formátum sztringnek a %TITLE azonosítót mindenképpen tartalmaznia kell. Azonban ez még önmagában nem biztosítja, hogy nem lesz két egyforma fájlnév, hiszen gyakran előfordulnak olyan fájlnevek, hogy pl. „TRACK01.MP3”, „TRACK02.MP3”, és ha ezeknél nincs TAG rekord, akkor a %TITLE azonosító értéke az eredeti fájlnév lesz („TRACK01”, „TRACK02”, stb.).
Miközben a fájlok rendezése folyik, egy TStringList változóban folyamatosan gyűjtjük a célfájlok nevét az elérési útvonallal együtt. Így a rendezés végére egy komplett listánk lesz a fájlokról, melyet a GenerateContents property igaz értéke esetén a TargetPath property-ben megadott könyvtárba mentünk „contents.txt” néven.
A CopyMode property-ben megadhatjuk, hogy a fájlokat másoljuk, vagy mozgatjuk. Ez utóbbi esetben az eredeti fájl törölve lesz.

A rendezés az Execute eljárás meghívásával indul, és addig tart, amíg az összes MP3 fájl a SourcePath property-ben megadott könyvtárban (a SubFolders property igaz értéke esetén az alkönyvtárakban is) rendezésre nem kerül, vagy az FStop globális változó értéke igazra nem változik. Ez utóbbi a Stop eljárás meghívásakor történik meg.

A ScanFiles eljárás rekurzívan végigmegy az összes könyvtáron, és ha MP3 kiterjesztésű fájlt talál, akkor meghívja az OrganizeFile eljárást. Ez a GetFileInfo függvénnyel lekérdezi az MP3 fájl TAG információit, és ennek megfelelően előállítja a célfájl elérési útvonalát és a fájl nevét. Azután a CopyMode property értékének megfelelően a fájlt átmásolja (cmCopy), vagy átmozgatja (cmMove).