LINUX.ORG.RU

Поддержка русского в XMMS


0

0

Появился патч Input плагина mpg123 для xmms, осуществляющий перекодировку windows-1251/koi8-r id3 тагов mp3 файлов. Патч универсальный (в отличие от russian-xmms) и, возможно, его включат в офицальную версию xmms. Перекодировка осуществляется средствами iconv.

Просьба направлять письма о успешном и неуспешном тестировании Kir Kostuchenko (mailto:kir@users.sourceforge.net), автору патча. Отзывы о успешном использовании патча необходимы для передачи майнтейнерам xmms.

>>> Патч

★★★★★

Проверено:

вот чёрт - а я позавчера свой патч писал весь вечер - мать его так!!
почему всё всегда так не вовремя? :((

sergey_volosat
()

Да ладно. Такие патчи пишутся очень просто, пару строк добавить надо

anonymous
()

iconv

iconv затыкается, когда встречает незнакомый символ :-(. Или в новых версиях уже исправили?

DKorolkov
()

Вроде все работает. У меня glibc 2.2.4, gcc-3.0.1.

Немного неудобно, что пришлось свой xmms-1.2.5 переименовывать в xmms-new. Обычно делается наоборот. То есть непатченый называется xmms-old например, а патченый xmms-1.2.5. Тогда просто приклабываешь патчик и все.

Banshee
()

Сделали бы лучше патч который сам определяет в какой кодировке у тебя ID3 таги и соответствующим образом их отображает. А то при за-enable'нном патче ID3 таги в koi8r не отображаются нормально

anonymous
()

2last_anonymous:

Почти все mp3 с тегами в cp1251. Кроме того, нужно оперделить еще что там за кодировка, что довольно сложно при небольшом обьеме текстовой информации в тегах.

На мой взгляд было бы гораздо лучше прикрутить соотв. опцию в настроки.

Banshee
()

Если вы кодируете в Linux, надо кодировать в Unicode тэги id3v2, а не в koi8-r id3v1. id3v1 вообще не поддерживает 8битный текст, но поскольку, в основном, все mp3 с кодировкой cp1251, думаю нет смысла делать опцию, которая только внесет разнобой.

Пожалуйста, отправьте mail с указанием OS/distro, если вы удачно используете patch.

anonymous
()

Вообще-то текущую кодировку систему можно определить програмно:
   const char* charset;
#ifdef _NL_CTYPE_CODESET_NAME
   charset = nl_langinfo (_NL_CTYPE_CODESET_NAME);
#elif defined(CODESET)
   charset = nl_langinfo (CODESET);
#else
   {
           char* locale = setlocale(LC_CTYPE,NULL);
           char* tmp = strchr(locale,'.');
           if (tmp)
                   charset = tmp+1;
   }
#elif

 Дальша забить таблицу, отображающую один чарсет в другой, который
чаще всего используется для данного языка в mp3 тегах.

 Еще - чарсет "windows-1251" появился только в glibc2.2. В предыдущ.
glibc (ну и в 2.2 конечно) он известен только  как "CP1251".

 Еще - совеременная glibc поддерживает транслитерацию для тех символов,
в ф-ии iconv, которые не доступны в целевом чарсете - для этого надо
к имени целевого (или исходного - не помню) чарсета добавить
"//TRANSLIT" (вроде так). Посему лучше детектить, поддерживает
ли glibc такую фичу примерно так:
 if ((void*)iconv_open("iso8859-1//TRANSLIT","iso8859-1//TRANSLIT&quo
t;) == ((void*)-1)) { can_use_translit = 0; }

hvv
()

Вообще-то текущую кодировку систему можно определить програмно:
#include <langinfo.h>
..
   char* charset;
#ifdef _NL_CTYPE_CODESET_NAME
   charset = nl_langinfo (_NL_CTYPE_CODESET_NAME);
#elif defined(CODESET)
   charset = nl_langinfo (CODESET);
#else
   {
           char* locale = setlocale(LC_CTYPE,NULL);
           char* tmp = strchr(locale,'.');
           if (tmp)
                   charset = tmp+1;
   }
#elif

 Дальша забить таблицу, отображающую один чарсет в другой, который
чаще всего используется для данного языка в mp3 тегах.

 Еще - чарсет "windows-1251" появился только в glibc2.2. В предыдущ.
glibc (ну и в 2.2 конечно) он известен только  как "CP1251".

 Еще - совеременная glibc поддерживает транслитерацию для тех символов,
в ф-ии iconv, которые не доступны в целевом чарсете - для этого надо
к имени целевого (или исходного - не помню) чарсета добавить
"//TRANSLIT" (вроде так). Посему лучше детектить, поддерживает
ли glibc такую фичу примерно так:
 can_use_translit = ((void*)iconv_open("iso8859-1//TRANSLIT","iso8859-1//TRANSLIT&quo
t;) != ((void*)-1));

hvv
()

Vlad, а это точно в glibc? Ибо эта фишка была только вstandalone libiconv, из-за чего я очень сокрушался в свое время - нак удобно было в транслит все переводить...

Так я и забыл таблицу русского транслита автору сбагрить...

BaT ★★★★★
()

у меня iconv затыкается, встретив украинскую "i". судя по всему, это должно решится перекодировкой koi8-u <--> cp1251, но как тогда быть с русской "Ы"??

sergey_volosat
()

Тимур, насчет glibc 100% не уверен так как просто помню радостный комментарий в sisyphus@ кого-то. Сам не проверял. Но на системе со стоящей glibc это легко проверить вызвав 'iconv -f iso8859-1//TRANSLIT -t iso8859-1//TRANSLIT'. У меня таких систем под руками нет..

hvv
()

Да Влад, ты прав, //TRANSLIT в glibc все-таки работает... Правда, как-то странно, если сравнивать с libiconv, но сойдет...

Я тогда, пока не забыл, обоим русский отошлю... Заживем :)

Мне нравится обратная фича в Pango, которую мне Owen показывал - в input widget пишешь на транслите, а выходит нормальный русский :)

BaT ★★★★★
()
Ответ на: комментарий от sergey_volosat

Как насчет KOI8-RU? Боюсь, это единственный подходящий вариант...

BaT ★★★★★
()

Тимур, транслитерацию русского бы пробить сюда: http://www.cl.cam.ac.uk/~mgk25/download/transtab.tar.gz
Вроде многие на основе именно этого пакета реализуют транслитерацию.
И кстати, на транслитерацию русского есть даже стандарт:
ISO 9:1995 Information and documentation -- Transliteration of Cyrillic characters into Latin characters -- Slavic and non-Slavic languages
так что на него можно ссылаться если он разумен. Если нет - что-нить делать со стандартом. :)

hvv
()

Автору патча: еще надо сделать так, чтобы убрать вот это:
+    if( out_left != in_left ) {
+       printf( "We don't support multi byte encoding. "
+                "in_left: %d, out_left: %d\n", in_left, out_left );
+        free( out );
+        return 0;
+    }
Так как даже из-за транслитерации длины могут не совпасть, не говоря
уж о всяких японских и пр. кодировках. Если интерфейсы не расчитаны на это,
то  надо переписать id3_charset.c чтобы они это поддерживали. Иначе патч
будет кривым и идеологически некорректным.

hvv
()

Всячески пробовал вызывать iconv, чтобы добиться транслитерации слова 'привет', что не так?

$ iconv -f KOI8-R -t iso8859-1//TRANSLIT
привет
??????

$ iconv -f KOI8-R//TRANSLIT -t iso8859-1
привет
iconv: illegal input sequence at position 0
$ dpkg -l libc6
...
libc6 2.2.4-2

anonymous
()
Ответ на: комментарий от anonymous

Русской транслитерации на данный момент нет... Я сделал ее для libiconv, судя повсему - glibc тоже имеет для этого механизм, поэтому попробую толкнуть и туда...

BaT ★★★★★
()

> char* locale = setlocale(LC_CTYPE,NULL);
> char* tmp = strchr(locale,'.');
> if (tmp)
>    charset = tmp+1;


ты про вариант ln_CN@CITY забыл, а также про то,
что setlocale может выдавать полную локаль: 

uk_UA.KOI8-U;LC_CTYPE=uk_UA.KOI8-U;LC_NUMERIC=uk_UA.KOI8-U;.....
если програма игралась с локализацией, или некотрые переменные
LC_* имеют отличные от LANG значения.

Надо приблизительно так:

char *charset;
void free_charset(void)
{
  g_free(charset);
}

...
char *p;
int len;

...
p = strchr (locale, '@');
if(!p)
  p = strchr (locale, ';');
len = p ? (p - locale) : strlen (locale);
if ((p = strchr (locale, '.')))
{
 charset = g_strndup (p + 1, len - (p -locale) + 1);
 g_strdown (charset);
}else
 charset = g_strndup ("iso8859-1"); 
g_atexit (free_charset);

PS.
> у меня iconv затыкается, встретив украинскую "i". 
> судя по всему, это должно решится перекодировкой koi8-u <--> cp1251,
> но как тогда быть с русской "Ы"??
KOI8-U включает все буквы из KOI8-R.

LVM

anonymous
()

BaT, hvv, sergey_volosat, LVM напишите пожалуйста мне ваши mail на <kir@users.sf.net> я попытаюсь принять все предложения и разошлю вам новый патч для проверки. Особенно, надо обратить внимание на koi8-u и koi8-ru. koi8-ru нет в iconv-glibc.

anonymous
()

2 LVM: и что, LC_CTYPE тоже может иметь такую сложную форму? Как она будет трактоваться? :)
По-любому, на системах где сложная форма будет работать есть и nl_langinfo.

hvv
()

Странно, а просто перекодировать ID3 из 1251 в koi8-r в самих файлах, никому в голову не приходило?

anonymous
()

Приходило, но виндузятники обидятся.

У меня в сети 18Gb музыки, из них 2Gb на моей машине. Да и моя музыка разшарена через самбу.

anonymous
()

Или если покупаешь диск с mp3 - на винт списывать и перекодировать теги - место на винте жалко.

anonymous
()
Ответ на: комментарий от anonymous

Мдя... а я пользуюсь nl_langinfo(CODESET). См. info libc. И никаких извращений над строками.

Кстати, если кому нужны русские titles и нормальный поиск русского в skipstone - сегодня я его добил. см. http://softlenin.chat.ru

LeninGad
()
Ответ на: комментарий от LeninGad

Lenin, не поверишь, но есть еще системы, на которых glibc не используется :) Не будем говорить про xBSD, но вот Solaris например....

LVM: Если уж совсем глубоко копать то LC_* и LANG вообще стандартов твердых нет, что очень неплохо раскритикованно на http://www.sensi.org/locale/

Впрочем, нас, похоже и Unicode не спасет... Надо сделать мировую революцию и везде насадить русский язык! Вот тогда проблем точно не будет :))))

Ооп-с, мне уже в школу пора...

BaT ★★★★★
()
Ответ на: комментарий от BaT

Дык я вообще-то про glibc сказал только на предмет info... Все-таки туда большинству присутствующих заглянуть проще. А про nl_langinfo там написано, типа вааще стандарт... Ну уж X/Open точно... И все современные Унихи должны уметь. Неужели гон?

LeninGad
()

В Соляре 8 iconv есть. сам видел. И пользовал. Причем на Sparc.

anonymous
()

>>В Соляре 8 iconv есть. сам видел. И пользовал. Причем на Sparc.

Да, на соляре есть iconv, но он не поддерживает cp1251 ни в каком виде. Так что этим нужно самому заниматься.

Banshee
()

nl_langinfo есть точно в люликсе, соляре и irix'е. во фре не было, но в 5(?) появилась...

drF_ckoff ★★
()

Nu, esli uzh vsem len' posmotret':

http://www.sensi.org/~alec/locale/locale_p.html#critique

Более того, в "чистом" POSIX вообще невозможно узнать (получить) имя Charset после вызова setlocale(). Единственный способ, узнать Charset текущей locale - это воспользоваться не-POSIX функцией XPG (но определенной в Single UNIX, SVID и Unix98) : nl_langinfo(CODESET) (определена в файле <langinfo.h> ).

Doctor: Nas4et FreeBSD eto to4no? A to u menja pod rukoi sei4as net... Da i po lubomu, etim podmnozhestvo *NIX ne ograni4ivaetsja...

LeninGad: nl_langinfo() ne imeet nikakogo otnoshenija k iconv(), poetomu nali4ie odnogo ne garantiruet drugogo... V 4astnosti, ja naprimer voobshe ispol'zuu standalone libiconv(), kotoraja nikak ne zavjazana na ostal'nuu localizaciu sistemy...

BaT ★★★★★
()

А я для себя делаю mp3 с тегами в koi8-r, а не свои файлы слушаю
редко и перекодирую теги таким вот скриптом (mp3info берется
http://ibiblio.org/mp3info/, эта утилита есть в Debian unstable, в
stable другая, но с тем же названием):

#!/bin/sh

DECODE='iconv -f CP1251 -t KOI8-R'

for filename in *.mp3
do

TITLE=`mp3info -p "%t" $filename | $DECODE`
ARTIST=`mp3info -p "%a" $filename | $DECODE`
ALBUM=`mp3info -p "%l" $filename | $DECODE`
COMMENT=`mp3info -p "%c" $filename | $DECODE`

mp3info -t "$TITLE" $filename
mp3info -a "$ARTIST" $filename
mp3info -l "$ALBUM" $filename
mp3info -c "$COMMENT" $filename

done

anonymous
()

2BaT
>Впрочем, нас, похоже и Unicode не спасет... Надо сделать мировую революцию и >везде насадить русский язык! Вот тогда проблем точно не будет :))))

Повбывав бы...

[lvm@mystery lvm]$ echo $LANG
uk_UA.KOI8-U

anonymous
()

Хммм... Скачал, пропатчил, подумал... И понял, что мне-то оно не надо :)

Супер-простое решение: у меня просто в настройках XMMS указаны фонты в 1251 кодировке :)

anonymous
()

>Супер-простое решение: у меня просто в настройках XMMS указаны фонты >в 1251 кодировке :) Точно супер решение. Т.е. везде делать революцию не надо, а всего лишь сделать нормальный выбор кодировок. Хошь такую - хошь такую :)

anonymous
()

из мануала (HP-UX):
AUTHOR
nl_langinfo() was developed by OSF and HP.

Casus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.