ALT Linux Sisyphus discussions
 help / color / mirror / Atom feed
* [sisyphus] I: Russian and Unicode ID3 tags
@ 2005-08-02 22:38 Mikhail Yakshin
  2005-08-03  2:50 ` Ivan Fedorov
                   ` (6 more replies)
  0 siblings, 7 replies; 64+ messages in thread
From: Mikhail Yakshin @ 2005-08-02 22:38 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussion list, ALT Devel discussion list

Приветствую всех!

Извиняюсь за кросспост, просто меня уже не такое уж маленькое число 
людей просило дописать эту статью, и вот я ее выкладываю, надеясь на 
некий резонанс. Буду рад любым замечаниям, предложениям и вообще помощи.

Предисловие
===========

Так получилось, что у меня выдалось сколько-то свободного времени и я
решил немножко позаниматься всякими около-юникодными делами, начав с
того, что поставил себе локаль ru_RU.UTF-8 и решив немножко
поразбираться с тем бардаком, который я подспудно подозревал,
наличествует в том, что в mp3-файлах называется тэгами ID3.

Тогда я даже близко не подозревал о размерах этого самого
бардака. Начну издалека.

Ogg/Vorbis
==========

Есть хороший и замечательный по всех отношениях, но относительно
малораспространенный формат Ogg/Vorbis. В нем возможность вставлять
метаинформацию в файл сделана ужасно просто, тупо, но зато работает
везде и всегда. В начало файла вставляются пары "имя=значение", где
список "имен" - well known, т.е. есть те, которые зафиксированы
стандартом и их понимают все, а те приложения, которым нужно, могут
добавлять свои расширения. Значения всегда являются текстовыми
юникодными строчками, закодированные в utf8. Работает железно, за
исключением, может быть, самых сильно мозгоповрежденных приложений,
принимающих utf8 за usascii, но им ничего не поможет вообще.

Разнообразие ID3
================

С mp3 все, к сожалению, на порядки хуже. Тем, кто придумывал тэги ID3,
стоит оторвать все, что только можно, только не поможет уже: стандарт
закреплен, плодить и пытаться внедрять новые стандарты сейчас -
фактически нереально.

Стандарт повествует нам о том, что если только брать современные, не
вымершие еще повсеместно варианты тэгов, есть как минимум id3v1 и
id3v2 - это знают почти все, даже многие знают, чем они отличаются. На
самом деле все хуже. Бывает как минимум id3v1, id3v1.1, id3v2.3 и
id3v2.4, которые друг с дружкой не очень совместимы. Дальше - еще
хуже.

С id3v1.* все понятно - полудохлый стандарт, умеет только
фиксированное количество полей небольшой длины и только в 8-битной
кодировке, как правило, совпадающей с 8-битной национальной кодовой
страницей локальной системы (хотя стандарт декларирует там
использование только кодировки iso8859-1).

С id3v2.* все хуже: стандарт дает возможность для каждой текстовой
строчки определить свою кодировку. В состав кодировок входят, как ни
странно, iso8859-1, utf16-be, utf16-le и utf8.

Наиболее распространенным вариантом, особенно для русских тэгов, без
сомнения, является вариант записи их в 8-битной национальной кодировке
системы (для русских - это windows-1251) в тэг формата id3v2.*, указав
кодировку iso8859-1. Это формально не соответствует стандарту вообще,
но де-факто - это уже давно так. В Windows-системах 8-битная кодировка
задается тупо, соответствующей 8-битной кодовой странице (для русского
языка - только windows-1251), в почти всех железных плеерах есть некий
выбор региона, который, в частности и устанавливает эту кодировку.

Анализ бардака с помощью test suite
===================================

К сожалению, фришный софт отнюдь не всегда учитывает эти реалии. Да по
большому счету - и проверить-то это толком не проверишь - потому как
зайдя на http://www.id3.org/ можно увидеть, что у них планируется
некий test suite, но он еще в разработке, да и потом, когда будет - он
будет за деньги.

Поэтому как первый шаг разбирательства в этом бардаке я создал свой
test suite. Он представляет собой набор маленьких mp3-файлов с
различными тэгами. Файлы называются так:

[язык]-[версия ID3]-[кодировка].mp3

[язык] - это "rus" для русских тэгов (использующих символы кириллицы)
и "fra" для "псевдофранцузских" тэгов (использующих символы набора
latin1, в том числе не только usascii);

[версия ID3] - это "1" для 1.x, "23" для 2.3, "24" для 2.4;

[кодировка] - это "iso8859-1", "utf16-le", "utf16-be" и "utf8";

Не все комбинации возможны, допустимы или интересны для
исследования. Те файлы, что находятся в директории non-standard -
нестандартны и их поддержка не обязательна.

Как это работает
================

Работает это на самом деле очень просто: вся пачка файлов загружается
в исследуемый продукт и смотрится, какие файлы прочитались, какие -
нет. Для файлов с русскими тэгами должны появляться легко опознаваемые
фразы на русском языке ("Русский трек" - "Русский альбом" - "Русский
артист"), для файлов с псевдофранцузскими тэгами должны появляться
тэги с обилием символов с диакритическими значками - точечками,
кружочками и прочими загогулинами. Для тэгов, записанных в 8-битной
кодировке (помеченных как iso8859-1), в случае русских тэгов в
продукте должна быть выставлена русская перекодировка, в случае
псевдофранцузских - французская или паневропейская.

Обращаю внимание на то, что тестируется _чтение_ тэгов из файлов, а
никак не возможность записи.

Сам test suite можно взять здесь [4K]:

http://www.lrn.ru/~greycat/suite.zip

Результаты тестирования
=======================

То, что выяснилось в результате, можно посмотреть в tab-separated
файле-табличке здесь:

http://www.lrn.ru/~greycat/compat.txt

Результаты неутешительны. Более-менее прилично умеет обращаться с
тэгами из протестированного софта только виндовый freeware
foobar2000. Он же умеет писать большинство вариантов тэгов и имеет
вменяемые переключатели, в каком формате читать и писать.

В Unix-системах к нему приближаются eyeD3 на Python и приложения на
libtag. И первым, и вторым мешает отсутствие перекодировки 8-битных
кодировок не только в де-юре стандартной iso8859-1.

Такие популярные плееры, как xmms, winamp2 и Windows Media Player -
терпят сокрушительное поражение. Некоторые версии тэгов в файлах
приводят даже к полной нечитаемости этих файлов в некоторых из
плееров.

Выводы
======

Так как наша задача не просто предаваться унынию, а как-то это фиксить
и идти дальше, по этому поводу возникают следующие мысли:

1. Необходимо оттестировать как можно больше приложений и железок с
целью выяснения наиболее адекватных на данный момент форматов. Пока
мне оными представляются:

* для русских и чистых usascii тэгов - id3v2.3 или 2.4 в windows-1251,
замаскированной под iso8859-1;

* для всех остальных тэгов - id3v2.4 в utf16-le;

Здесь я был бы рад любой помощи. Если у вас есть какие-то приложения и
железки, которые я не охватил - тестируйте и присылайте изменения к
моей табличке, пожалуйста.

2. Необходимо создать хотя бы одну полноценно работающую
библиотеку. На данный момент у нас есть:

* libid3tag - очень древняя штука, толком ничего не умеет; к
сожалению, некоторый софт ее до сих пор использует;

* id3lib - ужасная поделка, работает только с ID3, не поддерживает
ID3v2.4 вообще, заброшена уже несколько лет как; к сожалению,
достаточно популярна, например, перспективный для некоторых плеер
beep, а также тэггер EasyTag пытаются ее использовать;

* taglib - наиболее перспективная с моей точки зрения библиотека, хотя
и обладает рядом недостатков и не очень вменяемым апстримом, думаю,
можно будет довести ее до ума. В качестве достоинств стоит назвать
относительно нормальную объектную модель и большое число приложений
уже завязано на нее (в том числе - KDE, amarok и Juk).

По сути, от библиотеки нам требуется:

1) Некая глобальная - лучше всего не зависящая от приложений
перекодировка 8-битных тэгов, и ID3v1, и ID3v2. В некоторых
приложениях, например, amarok, такая перекодировка сделана, но только
для ID3v1 тэгов. Предлагаю сделать некий конфиг, вроде ~/.tagrc,
откуда библиотека будет получать строчку настройки вроде "8bitencoding
= windows-1251" и руководствоваться ею для всех приложений.

2) Вменяемые утилиты командной строки, уважающие установки локали
терминала пользователя, корректно выводящие, скажем, и 8-битные, и
юникодные тэги и в ru_RU.UTF-8, и в ru_RU.KOI8-R. Сейчас в taglib есть
tagreader / tagwriter, которые это делают, но они работают нормально
только с usascii тэгами.

И все.

3. Необходимо исправить некие переходные границы в районе
KDE/Qt/QString, где почему-то происходит преобразование в 8-битную
кодировку и всякие умляуты превращаются в русские буквы. Думаю, это
мелкая техническая проблема, решаемая относительно просто - здесь хотя
бы нет никаких идеологических решений. Баги в Сизиф я повешу скоро,
если zerg@ не успеет быстрее это пофиксить.

4. Необходимо просмотреть внимательно список совместимости,
получившийся на 1 этапе и вычистить Сизиф от совершенно ненужных
приложений, дублирующих друг друга, да при этом еще и не проходящих по
test suite. Первые кандидаты на выкидывание - mp3info, id3v2, xmms,
kid3, id3editor. Вторые в ряду - beep, easytag, moc, lamip, orpheus -
если они кому-то нужны, то их, видимо, стоит достаточно срочно фиксить
так, чтобы они поддерживали весь test suite - самым простым будет,
видимо, переделка их на работу с "правильной библиотекой" из
п.1. Разумеется, крайне желательно пропихнуть этот глобальный
переворот в апстрим.

Rationale таких жестких мер очень прост: я хочу быть уверен в том, что
если я передаю какие-то файлы человеку, который тоже использует Сизиф,
но у него не такой плеер, как у меня - он гарантированно увидит мои
тэги. Неподдерживание стандартных (как де юре, так и де факто) тэгов -
major bug.

5. От приложений, выполняющих кроме работы с тэгами какие-то другие
полезные функции, например, mpg123 - стоит отодрать поддержку чтения
ID3-тэгов, чтобы не смущать народ. В том же mc сделать чтение
ID3-тэгов через вменяемые утилиты командной строки, разработанные в
п.1, а не через mpg123.

6. В некоем гипотетическом светлом будущем - свести всю работу с
тэгами в одну библиотеку, а все старые и дублирующиеся библиотеки -
изъять из Сизифа. Все приложения будут иметь user-friendly дефолты,
типа тех, что я указал выше.

MusicBrainz
===========

Параллельно я собираю новый MusicBrainz-тэггер - Picard, который,
разумеется, умеет тоже работать только в стандартных iso8859-1, utf16
и utf8. Он требует неимоверного количества библиотек и работа идет
очень медленно, но когда он появится в Сизифе - можно будет полноценно
обрабатывать свои коллекции через MusicBrainz.

Список литературы
=================

1. http://www.id3.org/develop.html
2. http://id3lib.sourceforge.net/
3. http://developer.kde.org/~wheeler/taglib.html
4. http://www.musicbrainz.org/

-- 
WBR, Mikhail Yakshin AKA GreyCat
ALT Linux [http://www.altlinux.ru] [xmpp:greycat@altlinux.org]


^ permalink raw reply	[flat|nested] 64+ messages in thread

end of thread, other threads:[~2005-08-09  6:27 UTC | newest]

Thread overview: 64+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-08-02 22:38 [sisyphus] I: Russian and Unicode ID3 tags Mikhail Yakshin
2005-08-03  2:50 ` Ivan Fedorov
2005-08-03  5:49   ` Mikhail Yakshin
2005-08-03  6:09     ` [sisyphus] " Michael Shigorin
2005-08-03  7:20     ` [sisyphus] " Vitaly Lipatov
2005-08-03  8:17       ` Mikhail Yakshin
2005-08-03  3:37 ` Andrey Rahmatullin
2005-08-03  5:50   ` Mikhail Yakshin
2005-08-03  4:49 ` Mike Lykov
2005-08-03  5:34   ` [sisyphus] " Michael Shigorin
2005-08-03  6:12     ` Mikhail Yakshin
2005-08-03  7:49       ` Michael Shigorin
2005-08-03  8:30         ` Mikhail Yakshin
2005-08-03  9:26           ` [sisyphus] [JT] " Michael Shigorin
2005-08-03 10:00             ` Mikhail Yakshin
2005-08-03 10:33               ` [sisyphus] " Michael Shigorin
2005-08-03 10:07             ` [sisyphus] " Mikhail Zabaluev
2005-08-03 18:16       ` [sisyphus] " Dmitry Marochko
2005-08-03 18:22         ` Michael Shigorin
2005-08-03 18:32           ` Dmitry Marochko
2005-08-03 19:24             ` Alexey Rusakov
2005-08-04  9:28           ` Igor Zubkov
2005-08-05 14:41             ` Michael Shigorin
2005-08-05 21:43               ` Igor Zubkov
2005-08-06 17:06                 ` Michael Shigorin
2005-08-07 12:42                   ` Maxim Bodyansky
2005-08-08 10:08                   ` Led
2005-08-08 11:52                     ` Michael Shigorin
2005-08-08 11:56                       ` Led
2005-08-08 13:11                         ` Michael Shigorin
2005-08-08 13:17                           ` Led
2005-08-08 13:22                             ` Michael Shigorin
2005-08-08 13:54                               ` Led
2005-08-08 14:03                                 ` Michael Shigorin
2005-08-08 14:07                                   ` Led
2005-08-08 17:09                                 ` Arioch
2005-08-09  6:27                                   ` Led
2005-08-08 19:45                                 ` Igor Zubkov
2005-08-03  5:31 ` Michael Shigorin
2005-08-03  7:36 ` [sisyphus] Re: [devel] I: Russian and Unicode ID3 tags -- Stop The Madness Mikhail Zabaluev
2005-08-03  7:54   ` Mikhail Yakshin
2005-08-04  9:32     ` [sisyphus] mpg321 and rus (was: I: Russian and Unicode ID3 tags -- Stop The Madness ) Igor Zubkov
2005-08-03  8:55   ` [sisyphus] [JT] Re: I: Russian and Unicode ID3 tags -- Stop The _Madness_ Michael Shigorin
2005-08-03  9:42     ` Mikhail Zabaluev
2005-08-03 10:22       ` [sisyphus] " Michael Shigorin
2005-08-03 20:40   ` [sisyphus] Re: [devel] I: Russian and Unicode ID3 tags -- Stop The Madness Igor Zubkov
2005-08-04  7:09     ` [sisyphus] [JT] " Michael Shigorin
2005-08-04 16:03 ` [sisyphus] I: Russian and Unicode ID3 tags Led
2005-08-05 18:13   ` Dmitry Marochko
2005-08-06  7:05     ` Alexey Rusakov
2005-08-06  7:48       ` [sisyphus] I: Russian and Unicode ID3 tags [JT] Dmitry Marochko
2005-08-07 12:39         ` [sisyphus] " Arioch
2005-08-08  6:46         ` [sisyphus] " Epiphanov Sergei
2005-08-08  9:10           ` Led
2005-08-08  8:24       ` [sisyphus] I: Russian and Unicode ID3 tags Mikhail Yakshin
2005-08-08  9:07     ` Led
2005-08-08 14:17       ` Mikhail Yakshin
2005-08-08 14:50         ` Mikhail Yakshin
2005-08-08 15:10           ` Led
2005-08-08 15:27             ` [sisyphus] " Michael Shigorin
2005-08-08 15:52               ` Led
2005-08-08 16:04                 ` Michael Isachenkov
2005-08-07 12:32 ` Arioch
2005-08-08  8:27   ` Mikhail Yakshin

ALT Linux Sisyphus discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/sisyphus/0 sisyphus/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 sisyphus sisyphus/ http://lore.altlinux.org/sisyphus \
		sisyphus@altlinux.ru sisyphus@altlinux.org sisyphus@lists.altlinux.org sisyphus@lists.altlinux.ru sisyphus@lists.altlinux.com sisyphus@linuxteam.iplabs.ru sisyphus@list.linux-os.ru
	public-inbox-index sisyphus

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.sisyphus


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git