Dokumentace k zápočtovému programu - Mp3ordnung

Ondřej Dušek, 1.ročník MFF, informatika, sk. 46. 16.9.2005

Obsah:

  1. Popis programu
  2. Ovladání
    1. Hlavní okno
    2. Doplňování dat
  3. Konfigurace
    1. Základní nastavení
    2. Pokročilé
  4. Struktura, rozdělení
  5. Funkce programu
    1. Čtení ID3 tagů
    2. Načítání informací z názvů souborů
    3. Rozhodování
    4. Zápis
    5. Konfigurace, podpůrné jednotky
  6. Závěr

1. Popis programu

Mp3ordnung je program pro doplňování ID3 tagů a přejmenovávání souborů Mp3 podle zadaného nastavení. Z názvů souborů a ID3 tagů zjistí co nejvíce informací, porovná je a zapíše tak, aby souhlasily, potom přejmenuje soubor podle nastaveného formátu. Měl by tak zjednodušit "rovnání" mp3-sbírek na pevném disku.

Uživatel má na výběr 3 režimy práce - automatický, kde stačí vybrat název adresáře a program vše provede sám bez jakéhokoliv zásahu, ale i bez možnosti kontroly výsledku, dále s kontrolou chyb, kdy se práce při každé nalezené chybě ( nesouhlasí-li informace ze 2 zdrojů, popř. pokud se nějaké informace nepodaří zjistit ) program zastaví a nechá uživatele situaci vyřešit. Poslední možnost je doplnění informací manuálně - provede se sice automatické zjištění informací, lze je však libovolně upravit před jejich zapsáním do souborů.

Správná práce programu závisí na jeho nastavení, kde je možné určit např. chování při načítání údajů z názvů souborů, popř. formát jmen přejmenovaných souborů atd., možností nastavení je dost a lze jejich měněním dosáhnout jak zlepšení práce, tak naprosto nesmyslného chování programu.

Informace jsou načítány z ID3 tagů verze 1 i 2 (podverze 2.3 a teoreticky i 2.4, ta však není odzkoušená - zatím se mi nedostal do rukou jediný mp3 soubor s tagem v tomto formátu, běžné programy pro zápis tagů používají verzi 2.3). Program doplňuje informace o interpretovi, názvu skladby, albu, pořadovém čísle v jeho rámci a roku vydání, navíc načítá a doplňuje krátké poznámky.

2. Ovládání

2.1 Hlavní okno

Po startu programu se načte hlavní okno, kde má uživatel na výběr všechny možnosti práce programu. Jsou přístupné buď přes programové menu, nebo pomocí ikon na pracovní liště.

Na pracovní liště je možno zvolit pracovní adresář, a to buď přímým zadáním (absolutní nebo relativní) cesty, popř. výběrem ze stromového výpisu, který se zobrazí po kliknutí na ikonu adresáře. Prostřední tři ikony spouštějí práci programu v jednotlivých režimech - zleva automatický, s kontrolou chyb a manuální. Po kliknutí na ně začne program vyhledávát v předem zvoleném adresáři mp3 soubory a provádět s nimi vybranou akci.

V automatickém režimu program všechny informace načte a vyhodnotí sám a v hlavním okně pouze zobrazí dotaz na potvrzení zapsaní tagů a přejmenování. (Zobrazí navíc cestu k pracovnímu adresáři a počet nalezených mp3 souborů).

Při práci s kontrolou chyb program začne vyhodnocovat načtená data a dojde-li k chybě - nedostatečné informace nebo nesouhlasící zdroje - zobrazí název souboru a všechna načtená data a uživatel může vybrat, jak s nimi naloží. Pole, ke kterým se nepodařilo zjistit žádné informace, ale jsou nastavená jako povinně vyplňovaná, se v takovém případě vybarví červeně a položky, u kterých došlo ke kolizi zdrojů, žlutě. Pro opravy lze data zadat ručně jen pro daný jeden soubor, popřípadě nechat program při kolizi v určité položce načítat data jen z jednoho zdroje a ostatní ignorovat, nebo zapisovat vždy jen text uživatelem zadaný do příslušného pole. V případě chybějících dat lze zapnout automatické doplňování zadaného textu pro všechny další soubory. Pokud k chybě nedojde, nebo po vyřešení všech problémů se program opět uživatele zeptá na potvrzení zapsání ID3 tagů a přejmenování souborů.

V manuálním režimu se informace ze všech souborů načtou, vyhodnotí a zobrazí ve formuláři (pod sebe, oddělené 3 řádky na 1 soubor) a uživatel má možnost kterékoliv pole (kromě zobrazených původních názvů souborů) libovolně měnit - buď ručně, nebo pomocí prvního (prázdného) formuláře na zobrazené stránce - tam může doplnit automaticky do všech souborů stejný text z polí, která jsou neprázdná (tlačítkem "Doplnit neprazdna pole" ), nebo z těch, která "zaškrtnul" na řádku pod prvním formulářem (kliknutím na "Doplnit vybrana pole"). Tlačítko "Znovu nacist" dovoluje vrátit zpět všechny provedené změny, "Storno" ruší celý proces a vrací se k hlavnímu oknu programu a "Zapsat vse" všechny informace z formulářů zapíše do tagů a přejmenuje soubory.

3. Konfigurace

Editor konfigurace se spouští ikonou na liště nejvíce vpravo. Nastavení je rozděleno na základní - spíše personalizaci, úpravu formátu výsledných jmen souborů, volbu zda zapisovat ID3 tagy či ne atp., a pokročilé - které nedoporučuji měnit čistě náhodně, protože špatné nastavení může dost negativně ovlivnit chování programu. Lze změnit např. seznam znaků používaných jako oddělovač polí, min. velikost zapsaného Id3 tagu verze 2 a další.

3.1. Základní nastavení

Základní nastavení má 4 pododdíly. Prvním z nich je položka "Prováděné akce" - ta obsahuje: "Masku zpracovávaných souborů", kde se dá nastavit přípona souborů, které se budou zpracovávat. Doporučuji nechat na ".mp3", protože i při jiném nastavení se k takovým souborům program chová stejně jako k mp3 - hledá a zapisuje v nich stejné tagy. Dále "Pořadí zjišťování informací z názvů souborů", které určuje, jaké možné formáty názvů souborů a v jakém pořadí bude program zkoušet - mělo by postupovat od nejsložitějšího k jednodušším, protože první formát, kterému název souboru vyhovuje, se použije. Jednotlivé formáty jsou zapsány pomocí znaků "%a" = umělec, "%t" = název, "%l" = album, "-" = oddělovač polí, "(" a ")" závorky; jsou odděleny mezerou. Čísla skladeb se do formátů nezapisují, protože jsou z názvů extrahována ještě před zkoušením těchto možností. Pak je možné zvolit, zda budou soubory přejmenovávány, resp. zda bude program zapisovat ID3 tagy a v kterých verzích. Oprava velkých a malých písmen automaticky převede každé první písmeno ve slově na velké a ostatní na malá (pokud je zapnutá). V řádku na panelu dole je možno zadat slova (zkratky apod.), která se tomuto pravidlu vymykají, a v jakém formátu (tedy správně velká/malá písmena) je má program zapisovat. Jsou oddělená mezerou.

Pododdíl "Čtení jmen souborů" ovlivňuje chování při načítání informací z názvů souborů. "Seznam slov, která neobsahují informaci o hudebním obsahu" určuje, která slova budou ze jmen souborů vyhozena jako neužitečná a pro ukládání nebudou použita - to proto, aby program nepovažoval soubory s názvy jako "Unknown Artist - Track 01.mp3" za užitečnou informaci (z tohoto názvu se pravděpodobně využije jen číslo skladby). Slova jsou oddělená mezerami, pokud je před mezerou "\", sváže se slovo s následujícím a považují se za jedno. Seznam slov, která mohou být součástí čísla určuje slova, která se považují za součást čísla (pokud se nachází v názvu ve stejném poli jako číslo), takže pokud je ve jméně souboru uvedeno "5 of 12", program to vyhodnotí jako pořadové číslo skladby. Slova, která se nepovažují za název alba určují, co nepoužívat při načítání názvu alba ze jména adresáře, ve kterém jsou hudební soubory obsaženy - tedy názvy např. adresářů s neutříděnými soubory, popř. název kořenového adresáře se všemi mp3 soubory. Slova, označující druh skladby jsou často uvedena v závorkách za jménem skladby, kde se ale může vyskytovat i jméno interpreta - pomocí nich program odliší význam např. "Revolution (Eric Clapton).mp3" od "Revolution (live London 2005).mp3". Někdy jsou části vícediskového alba umístěny ve zvláštních podadresářích, a aby program tyto nepovažoval za jména celého alba, jsou jejich obvyklé názvy umístěny v "Označení částí jednoho alba". Pokud je více částí alb v 1 adresáři a jsou odlišeny jen číselným prefixem (101 je číslo první skladby 1. alba), při zaškrtnutí položky "Uznávat číselné prefixy pro více částí alba v 1 adresáři) program takové číslo rozpozná jako číslo skladby 1. "Slova, ve kterých se ignoruje oddělovač polí" je seznam slov, která sama o sobě obsahují znak, který se používá jako oddělovač polí (běžně pomlčka), a tento v nich musí být ignorován (příklad: AC-DC).

"Automatické rozhodování" je panel, který určuje jaká důležitost bude připisována jednotlivým načteným informací hlavně v automatickém režimu práce. "Názvy souborů jsou důležitější než názvy adresářů" je položka, která určuje co program udělá, když např. v adresáři "The Beatles - White Album" bude mít soubor "Paul McCartney - Band on the Run.mp3" - zda jako umělce stanoví The Beatles (není zaškrtnuta), nebo Paula McCartneyho (je zaškrtnuta). "Informace z názvů souborů jsou důležitější než ID3 pro tato pole", určuje, kterému zdroji dá automatické rozhodování přednost při kolizi, tj. nesouhlasících informacích. "Slova, která se při porovnávání neberou v úvahu", určuje, která slova jsou nedůležitá pro to, aby 2 texty byly označené za shodné - např. při standardním nastavení označí program "Rolling Stones" a "The Rolling Stones" nebo "live Royal Albert Hall" a "Live at Royal Albert Hall" za stejný text. "Povinně vyplněná pole" jsou taková, při kterých průchod soubory s kontrolou chyb nahlásí problém, pokud k nim nemá žádné informace.

Vlastnosti "Přejmenování" určují formát názvu souboru, na který bude po úpravě programem přejmenován. "Formát výsledného názvu" se zapisuje podobně jako pořadí formátů pro zjišťování informací ze jmen souborů - pomocí metaznaků: "%a", "%t", "%l", "%n", "%y", "%c" postupně pro umělce, název skladby, album, číslo sklaby, rok vydání a poznámku; dále " " pro mezeru a "-" oddělovač polí (ty jsou nastaveny v položkách "Oddělovač polí pro přejmenování" a "Mezera pro přejmenování". Označení prázdného pole při přejmenování určuje, jaký text se do výsledného jména souboru vloží, pokud program nemá informaci o poli, zadeném ve formátu názvů. "Šířka čísel" upravuje, na jaký počet číslic se zarovnají čísla skladeb v názvech souborů ( 1 - "9", 2 - "09", 3 - "009", 4 - "0009" ).

3.2 Pokročilé

Pokročilé nastavení ovlivňuje chování programu hlavně při načítání informací z názvů souborů a čtení/zápisu id3v2 tagů, nedoporučuji měnit standardní nastavení. První panel "Čtení jmen: znaky" mění některé význam některých znaků při načítání jmen souborů. "Povolit více oddělovačů v jednom názvu souboru" nechává program načítat ve stavu, kdy se buď určí jeden znak jako mezera a jeden jako oddělovač polí (položka vypnutá) - podle statistiky výskytu těchto znaků v celém adresáři, nebo se určí jeden znak jako mezera a jako oddělovače polí jsou brány všechny ostatní znaky z pole "Seznam oddělovačů polí", což je množina znaků, ze kterých jsou možná mezera a oddělovač polí vybírány. "Seznam závorek" určuje, které znaky jsou při procházení jmény souborů brány jako závorky (a tedy reagují na metaznak "závorka" při procházení názvů, popř. jsou odstraňovány, pokud je celé jedno pole názvu uzavřeno do závorek). Na lichých pozicích řetězce MUSÍ být "otvírací" a na sudých "zavírací" závorky, jinak program nemusí pracovat správně.

"Čtení jmen : konstanty" určuje "Max. počet skladeb v jednom albu", tedy kolik maximálně může být skladeb v adresáři, aby byl považován za jediné album a ne směs netříděných skladeb, dále "Rozmezí čísel, která budou považována za letopočet" při načítání informací ze jmen souborů a adresářů, "Max. počet skladeb se stejným pořadovým číslem" - kolika nejvíce skladbám může automat přiřadit stejné číslo a "Max. část souborů bez čísla skladby - tedy pokud počet neočíslovaných skladeb při čtení jmen souborů překročí tuto hranici, použije se pro číslování ještě jednou agresivnější metoda (čísla skladeb jsou hledána i jako součásti slov).

Na panelu "Čtení a zápis ID3v2" se určuje chování v přístupu k ID3 tagům verze 2. Je zde možné zvolit zástupný znak pro nerozpoznané znaky formátu Unicode (zatím program v Unicode načte správně pouze anglickou abecedu, české znaky nepozná), dále zda má program načítat všechny součásti Id3v2 tagu označené "Poznámka", kterých může být v tagu více, a řetězit je za sebe, nebo jen první. "Ponechat neznámé Id3v2 frames beze změn" určuje, zda program v souboru ponechá informace s pro něj neznámým označením (například údaje o enkodéru, ochraně souboru, příp. další). "Min. velikost bufferu pro zápis Id3v2" určuje, jakou minimální velikost nechá program na ID3 tag verze 2, pro jeho případné rozšiřování (kdy později nemusí být přepisován celý soubor). Pokud žádné místo navíc ponechávat nechcete, nastavte tuto položku na 1. Poslední možností nastavení je 3-místný identifikátor jazyka pro poznámky v ID3 tagu verze 2. Doporučuji ponechat na "eng" (Angličtina), lze ale nastavit jakékoliv 3 znaky, "xxx" podle specifikace ID3v2 označuje "Neznámý jazyk".

4. Struktura, rozdělení

Celý program (hlavní program reprezentovaný souborem mp3ordnung.dpr) je rozdělen do několika na sobě závislých jednotek. Snažil jsem se co nejvíce oddělit interakci s uživatelem od samotné práce programu.

Nejníže v hierarchii závislostí stojí unita "Config", která se stará o uchovávání konfigurace v paměti a její zápis a čtení ze souboru. Podle jejího nastavení se řídí ostatní jednotky programu. Unita "Data" je také využívána většinou ostatních (sama používá Config) a obsahuje definice používaných datových struktur pro uchování informací o skladbách v paměti i pro načítání ID3 tagů ze souborů. Poslední 'pomocnou' jednotkou je "Str_Util", která zajišťuje všemožné operace s řetězci, používané hlavně při čtení názvů souborů.

Dalších několik jednotek slouží pro čtení - jsou to ID3Read pro zjišťování informací z hudebních tagů obou verzí (obsahuje obecný objekt pro čtení a jemu odvozené pro obě verze ID3), Fnm_read - parser jmen souborů a řídící logika čtení Read_Control, která předchozí dvě unity využívá. Podobnou strukturu mají jednotky využívané pro zápis do souborů - jsou to ID3write, Renamer na přejmenovávání a řízení Write_Control.

GUI pak přímo využívá jen jednotky Read_Control, Write_Control a Config. Největší část interakce s uživatelem obstarává a o zobrazování hlavního okna se stará unita "GUI", která používá jednotky "Frame_Autofill", "Frame_Check_Error" a "Frame_Manual" pro zobrazování jednotlivých režimů práce programu (tyto tři unity samy o sobě obsahují jen zobrazované komponenty, všechny metody jsou přímo v GUI, aby měly přístup i ke globálním zobrazovaným objektům). Unita "Dir_help" se stará o zobrazování okna s výběrem adresáře a informace o programu, taktéž neobsahuje sama žádné metody. Přístup ke konfiguraci zajišťuje jednotka "Settings", využívající přímo unitu Config.

5. Funkce Programu

5.1 Načítání ID3 tagů

Načítání informací z tagů zajišťuje jednotka "ID3_read", obsahující bázovou třídu "T_ID3_Reader", která zjistí seznam souborů v adresáři, projde ho a na každý zavolá virtuální metodu pro načtení informací z tagů. Takto získaná data se ukládají do "P_Mp3info", což je vlastně spojový seznam údajů o jednotlivých skladbách. T_Id3_Reader sám o sobě nemůže tvořit instance - metoda, zjišťující data z tagů je abstraktní. Jemu odvozené třídy "T_ID3v1_Reader", resp. "T_ID3v2_Reader" tuto metodu implementují pro obě verze tagů. Pro první verzi je tato docela jednoduchá, protože struktura ID3v1 tagu je jasně daná, má pevnou velikost, i umístění jednotlivých položek je pevně dané. Ve verzi 2 je trochu složitější, načítá postupně jednotlivé 'framy' - položky tagu, ze známých extrahuje text - prostý nebo ve formátu Unicode (pouze anglické znaky), a neznámé framy přeskakuje. O to se starají privátní metody třídy T_Id3v2_Reader "Save_ID3v2_Frame" a "Skip_ID3v2_Frame".

5.2 Načítání informací z názvů souborů

Parsování jmen souborů je o něco složitější procedura, stará se o ni jednotka "Fnm_Read", obsahující třídu "T_Filename_Reader". Využívá při tom "Str_Util" pro různé transformace zjištěných dat. Pracuje s daty, uloženými v objektu odvozeném od základního "P_Mp3data" (ukládajícího pouze základní položky informací o skladbě, je používán ve všech ostatních jednotkách), který obsahuje navíc údaje o dosud nezpracované části názvu souboru a o znaku, který v tomto konkrétním názvu představuje mezeru a oddělovač polí. Po zavolání jediné veřejné metody objektu - "Read_Filenames" jsou nalezeny všechny soubory v adresáři a přiřadí se jim prázdné datové položky s informacemi. Pak je pro každý soubor zvlášť určen znak mezery a oddělovače polí na základě statistik výskytu znaků oddělovačů a mezer z konfigurace. Potom procedura z názvů souborů extrahuje čísla skladeb a letopočty. Proces pokračuje zjištěním názvu alba ze jména adresáře (je možné že tato procedura nezjistí nic, nebo uzná, že adresář obsahuje netříděné mp3 soubory). Nakonec se projde zbytek názvu souboru a uloží se ostatní informace (pokud jde o jedno album, zachází se jinak s částmi jmen souborů, které jsou v celém adresáři shodné). Poslední částí procedury je nahrazení 'mezer' skutečným znakem ' ' - je to potřebné pro další použití při porovnávání s ostatními zdroji.

5.3 Rozhodování

Celé načítání obstarává unita "Read_Control", která je teprve přímo využívána GUI. Obsahuje třídu "T_Info_Reader", která má jako své neveřejné podobjekty instance tříd pro čtení tagů i názvů souborů a k nim přidružené datové položky. Čtení informací je nutno nejprve inicializovat - procedurou "Init_Search", která vynuluje všechny výsledky předchozích čtení (při prvním zinicializuje všechny podobjekty) a nastavení automatických oprav, potom změní adresář na pracovní, zadaný parametrem. Metoda "Auto_Get" představuje práci programu v automatickém režimu, kdy sama řeší všechny kolize podle nastavení a chybějící položky nechává prázdné - tato je využívána i v manuálním režimu, kdy ovšem její výsledky lze upravit. "Check_Error", používaná k průchodu s kontrolou chyb, se v případě kolizí nebo chybějících dat vždy zastaví a vrátí řízení nadřazenému procesu (GUI, které zobrazí informaci o chybě a nechá ji uživatele opravit). Některé chyby je ale schopna řešit sama - to v případě, zadal-li uživatel způsob řešení konkrétní chyby v určité položce nějakým způsobem (ignorovat některé zdroje/pevně doplnit daný řetězec). Informace o způsobech řešení chyb jsou uloženy v neveřejných datových položkách třídy a dají se nastavit metodami "Set_Aut_Col_Custm", "Set_Aut_Col_Type" a "Set_Aut_Missing". Pro indikaci stavu práce slouží veřejná položka "Completed" typu boolean.

5.4 Zápis

Při zápisu do souborů se hledí na konfiguraci, podle ní se určuje, zda zapisovat tagy a které verze a zda přejmenovávát soubory. Vždy jsou nejprve zapisovány ID3 tagy verze 1, pak tagy verze 2 a nakonec přejmenovány soubory. Pro zápis tagů je struktura objektů podobná jako při čtení - opět existuje v jednotce "ID3_Write" bázová třída "T_ID3_Writer" a odvozeniny "T_ID3v1_Writer", resp. "T_ID3v2_Writer". Při psaní ID3v1 je tag buď přepsán, nebo jednoduše přidán na konec souboru. Zápis tagů druhé verze je složitější. Podle nastavení je nejprve načten celý původní tag (pokud existuje) a případně přepsány v paměti do nového všechny 'framy', které program nerozpoznává. Verze a nastavení 'desynchronizace' je takto vždy převzato z původního tagu. Pokud soubor ID3v2 informaci původně neobsahuje, je verze nastavena na 2.3 (protože podporou verze 2.4 u většiny programů si vůbec nejsem jistý) a desynchronizace standardně vypnuta (je potřebná jen pro přehrávače, které ID3v2 tagy nerozpoznají a považují je za hudební data, takových programů je dnes naprosté minimum, a navíc šance, že se v tagu vyskytne posloupnost bytů $FF $EO-$FF není u textových tagů příliš velká). Přejmenování souborů ("T_File_Renamer" v jednotce "Renamer") probíhá podle formátu zadaného v nastavení, přičemž pokud soubor daného názvu už existuje, je k jeho názvu připojeno číslo (1) atd., až dokud není nalezeno neexistující jméno.

5.5 Konfigurace, podpůrné jednotky

Nastavení programu je uloženo v jednotce "Config", resp. globální instanci "Cfg" třídy "T_Config", která je viditelná pro všechny unity, které "Config" využívají. Všechny položky, popisované v části 3 dokumentace, mají v této třídě odpovídající datovou položku. Pokud je třeba k některým (seznam závorek, seznam oddělovačů polí) přistupovat navíc jako k množinám, mají navíc položku typu množina, do které jsou všechny prvky při načítání konfigurace ukládány. Třída T_Config má metody "Set_Default" pro obnovení standardního nastavení (napsáno napevno v kódu metody) a "Read_Config" a "Write_Config", které se starají o zápis/čtení konfigurace (je uložena v textovém formátu, jedna položka na řádek - řádek začíná názvem položky, hodnota je oddělená mezerou).

"Data" jsou podpůrnou jednotkou, zajišťující uchovávání dat v paměti - obsahuje objekty "T_Mp3data" (bázový) a "T_Mp3_Filename_Data" (odvozený), resp. ukazatele na ně, tyto jsou potom zapojovány do spojového seznamu třídou "T_Mp3_Info", která obsahuje základní metody pro přidání a odebrání prvků, popř. smazání seznamu a zjištění počtu prvků. K samotným položkám jednotlivých objektů "T_Mp3data" je možno přistupovat buď přímo podle názvu položek, nebo pomocí procedur "Get_Field" a "Set_Field" s parametrem čísla položky - pro procházení všech položek cyklem. Krom tohoto obsahuje unita "Data" navíc definici třídy "T_Tag_Array", která se používá pro čtení a zápis ID3 tagů do paměti - má datovou položku "buf" typu "array of byte" (pole dynamické velikosti), do které jsou celé tagy zapisovány, a několik metod pro načtení řetězců a čísel, resp. jejich ukládání, při možnostech nastavení desynchronizace, max. délky, formátu Unicode atp.

Poslední pomocnou unitou je "Str_Util", užívaný hlavně pro parsování jmen souborů a řídící logiku čtení. Obsahuje třídu "T_Str_util" a její globální instanci "str_tool". Ta má několik metod pro úpravu stringů - transformaci mezer, získání konkrétních polí/slov, dalších slov a polí v cyklu podle zadaného indexu, mazání slov/polí, mazání koncových oddělovačů a mezer a porovnání dvou slov (metody "Compare" "Subset_Compare", používané při rozhodování), kdy se ignorují slova vyjmenovaná v konfiguraci (standardně např. the, and, a ), nehledí se na velká/malá písmena a řetězce "John Lennon" a "Lennon, John" jsou považovány za stejné, navíc "Subset_Compare" ohodnotí např. "Why Does Love Got To Be S" jako podmnožinu "Why Does Love Got To Be So Sad (live at the Fillmore)", a logika rozhodování s tím potom může operovat.

6. Závěr

Tak to je snad všechno o mém zápočtovém programu, detaily lze zjistit v komentářích k jednotlivým souborům, popřípadě přímo čtením kódu (nedoporučuji, občas mám problém se v něm sám vyznat). Tento program jsem se rozhodl psát hlavně kvůli svému vlastnímu nepořádku ve sbírce mp3 souborů, doufám tedy, že bude užitečný i k něčemu jinému než získání zápočtu. Na začátku jsem si představoval program s alespoň trochou umělé inteligence, k čemuž nakonec nedošlo, ale myslím, že na většinu běžně pojmenovaných a 'otagovaných' mp3 souborů by tato verze měla stačit a přejmenovat je správně.

- Ondřej Dušek, 16.9.2005