|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Serge A. Suchkov 2:5020/400 29 May 2003 15:02:42 To : Oleg Redzuk Subject : Re: xmms + russian -------------------------------------------------------------------------------- Oleg Redzuk wrote: > Hello Alexey. > > Wed Apr 16 2003 22:23, you wrote to Evgeny Kulakov: > > AM> просто id3tag в кодровке cp1251 , советую поставить пропаченный xmms из > AM> asp linux > > А тогда такой вопpос > Выходит что сp1251 стал стандаpт де факто для id3tag? > Как быть то? Всегда использовать 1251 хотя для линукса он не pодной, или > пpописывать тэги в кои8 и иметь гемоpой в windows? > Может есть надежда на юникод или еще какой нить волшебный способ? > Hу чтото типа этого я делал (только за давностью лет для версии 1.2.6) вот патчик - желающие могут выкинуть проверку локали (сейчас она уже давно не везде ru_RU.KOI8-R) и доработать определитель кодировок (у меня он ошибался примерно в 1 случае из 500 ) diff -ur xmms-1.2.6/Input/mpg123/configure.c xmms-1.2.6-ss/Input/mpg123/configure.c - --- xmms-1.2.6/Input/mpg123/configure.c Wed May 9 00:14:13 2001 +++ xmms-1.2.6-ss/Input/mpg123/configure.c Tue Dec 24 15:36:50 2002 @@ -28,7 +28,7 @@ static GtkWidget *streaming_cast_title, *streaming_udp_title; static GtkWidget *streaming_proxy_hbox, *streaming_proxy_auth_hbox, *streaming_save_dirbrowser; static GtkWidget *streaming_save_hbox, *title_id3_box, *title_tag_desc; -static GtkWidget *title_override, *title_id3_entry, *title_id3v2_disable; +static GtkWidget *title_override, *title_id3_entry, *title_id3v2_disable, *title_id3_convert; MPG123Config mpg123_cfg; @@ -108,6 +108,10 @@ mpg123_cfg.title_override = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_override)); mpg123_cfg.disable_id3v2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_id3v2_disable)); + + if(strstr(getenv("LC_MESSAGES"),"ru_RU.KOI8-R")) + mpg123_cfg.title_id3_convert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_id3_convert)); + g_free(mpg123_cfg.id3_format); mpg123_cfg.id3_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(title_id3_entry))); @@ -139,6 +143,10 @@ xmms_cfg_write_boolean(cfg, "MPG123", "use_udp_channel", mpg123_cfg.use_udp_channel); xmms_cfg_write_boolean(cfg, "MPG123", "title_override", mpg123_cfg.title_override); xmms_cfg_write_boolean(cfg, "MPG123", "disable_id3v2", mpg123_cfg.disable_id3v2); + + if(strstr(getenv("LC_MESSAGES"),"ru_RU.KOI8-R")) + xmms_cfg_write_boolean(cfg, "MPG123", "title_id3_convert", mpg123_cfg.title_id3_convert); + xmms_cfg_write_string(cfg, "MPG123", "id3_format", mpg123_cfg.id3_format); xmms_cfg_write_boolean(cfg, "MPG123", "detect_by_content", mpg123_cfg.detect_by_content); #ifdef USE_3DNOW @@ -604,11 +612,18 @@ mpg123_cfg.disable_id3v2); gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_id3v2_disable, FALSE, FALSE, 0); +/* - Convert cp1251 to koi8-r -*/ + if(strstr(getenv("LC_MESSAGES"),"ru_RU.KOI8-R")) { + title_id3_convert = gtk_check_button_new_with_label(_("Convert ID3 tags from cp1251 to koi8-r encoding")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(title_id3_convert), + mpg123_cfg.title_id3_convert); + gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_id3_convert, FALSE, FALSE, 0); + } +/* -- */ title_override = gtk_check_button_new_with_label(_("Override generic titles")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(title_override), mpg123_cfg.title_override); gtk_signal_connect(GTK_OBJECT(title_override), "clicked", title_override_cb, NULL); gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_override, FALSE, FALSE, 0); - title_id3_box = gtk_hbox_new(FALSE, 5); gtk_widget_set_sensitive(title_id3_box, mpg123_cfg.title_override); gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_id3_box, FALSE, FALSE, 0); diff -ur xmms-1.2.6/Input/mpg123/fileinfo.c xmms-1.2.6-ss/Input/mpg123/fileinfo.c - --- xmms-1.2.6/Input/mpg123/fileinfo.c Sat Jun 16 03:08:19 2001 +++ xmms-1.2.6-ss/Input/mpg123/fileinfo.c Tue Dec 24 15:25:46 2002 @@ -419,6 +419,13 @@ if (!strncmp(tag.tag, "TAG", 3)) { id3_found = TRUE; + + if(mpg123_cfg.title_id3_convert && analyze_encoding(tag.title,30) >0){ + xlat( tag.title,30,0); + xlat( tag.artist,30,0); + xlat( tag.album,30,0); + } + set_entry_tag(GTK_ENTRY(title_entry), tag.title, 30); set_entry_tag(GTK_ENTRY(artist_entry), diff -ur xmms-1.2.6/Input/mpg123/mpg123.c xmms-1.2.6-ss/Input/mpg123/mpg123.c - --- xmms-1.2.6/Input/mpg123/mpg123.c Tue Jan 8 18:59:16 2002 +++ xmms-1.2.6-ss/Input/mpg123/mpg123.c Tue Dec 24 16:13:21 2002 @@ -5,6 +5,22 @@ #include <stdlib.h> #include <pthread.h> +const char WinCode[66]={0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0x cd,0xce, + 0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd, + 0xde,0xdf,0xe0, + 0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, + 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe, + 0xff,0xa8,0xb8 + }; + +const char KoiCode[66]={0xe1,0xe2,0xf7,0xe7,0xe4,0xe5,0xf6,0xfa,0xe9,0xea,0xeb,0xec,0xed,0x ee,0xef, + 0xf0,0xf2,0xf3,0xf4,0xf5,0xe6,0xe8,0xe3,0xfe,0xfb,0xfd,0xff,0xf9,0xf8,0xfc, + 0xe0,0xf1,0xc1, + 0xc2,0xd7,0xc7,0xc4,0xc5,0xd6,0xda,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0, + 0xd2,0xd3,0xd4,0xd5,0xc6,0xc8,0xc3,0xde,0xdb,0xdd,0xdf,0xd9,0xd8,0xdc,0xc0, + 0xd1,0xb3,0xa3 + }; + static const long outscale = 32768; static struct frame fr, temp_fr; @@ -66,6 +82,55 @@ N_("Anime"), N_("JPop"), N_("Synthpop") }; +gint analyze_encoding(gchar* Buff, gint len) +{ +int i,j,ret,is_rusUP=0,is_rusDOWN=0; +for(i=0;i<len;i++) { + for(j=0;j<sizeof(WinCode);j++) { + if(WinCode[j]==Buff[i]) { + if(j < 0x20) + is_rusDOWN++; + else + is_rusUP++; + break; + } + } + } +if(is_rusUP+is_rusDOWN) { + ret = is_rusUP-is_rusDOWN; + return ret; +} +else +return 0; +} + +void xlat(gchar* Buff, gint len, gint _enc) +{ +gint i,n,k,j; + +gchar* SrcEnc; +gchar* DstEnc; + +DstEnc = SrcEnc = WinCode; + +if(_enc == 0) { + SrcEnc = WinCode; + DstEnc = KoiCode; +} else { + SrcEnc = KoiCode; + DstEnc = WinCode; +} +for(i=0;i<len;i++) { + for(j=0;j<sizeof(WinCode);j++) { + if(SrcEnc[j]==Buff[i]) { + Buff[i]=DstEnc[j]; + break; + } + } + } +} + + double mpg123_compute_tpf(struct frame *fr) { const int bs[4] = {0, 384, 1152, 1152}; @@ -180,7 +245,8 @@ mpg123_cfg.cast_title_streaming = FALSE; mpg123_cfg.use_udp_channel = TRUE; mpg123_cfg.title_override = FALSE; - mpg123_cfg.disable_id3v2 = FALSE; + mpg123_cfg.title_id3_convert = FALSE; + mpg123_cfg.disable_id3v2 = FALSE; mpg123_cfg.detect_by_content = FALSE; mpg123_cfg.use_3dnow = 0; @@ -207,6 +273,7 @@ xmms_cfg_read_string(cfg, "MPG123", "proxy_pass", &mpg123_cfg.proxy_pass); xmms_cfg_read_boolean(cfg, "MPG123", "title_override", &mpg123_cfg.title_override); + xmms_cfg_read_boolean(cfg, "MPG123", "title_id3_convert", &mpg123_cfg.title_id3_convert); xmms_cfg_read_boolean(cfg, "MPG123", "disable_id3v2", &mpg123_cfg.disable_id3v2); if (!xmms_cfg_read_string(cfg, "MPG123", "id3_format", &mpg123_cfg.id3_format)) mpg123_cfg.id3_format = g_strdup("%p - %t"); @@ -517,16 +584,31 @@ void mpg123_id3v1_to_id3v2(struct id3v1tag_t *v1, struct id3tag_t *v2) { memset(v2,0,sizeof(struct id3tag_t)); + + if(mpg123_cfg.title_id3_convert && analyze_encoding(v1->title,30)>0) + xlat(v1->title,30,0); strncpy(v2->title, v1->title, 30); + + if(mpg123_cfg.title_id3_convert && analyze_encoding(v1->artist,30)>0) + xlat(v1->artist,30,0); strncpy(v2->artist, v1->artist, 30); + + if(mpg123_cfg.title_id3_convert && analyze_encoding(v1->album,30)>0) + xlat(v1->album,30,0); strncpy(v2->album, v1->album, 30); + + if(mpg123_cfg.title_id3_convert && analyze_encoding(v1->u.v1_0.comment,30) >0 ) + xlat(v1->u.v1_0.comment,30,0); strncpy(v2->comment, v1->u.v1_0.comment, 30); + strncpy(v2->genre, get_id3_genre(v1->genre), sizeof (v2->genre)); + g_strstrip(v2->title); g_strstrip(v2->artist); g_strstrip(v2->album); g_strstrip(v2->comment); g_strstrip(v2->genre); + v2->year = atoi(v1->year); /* Check for v1.1 tags. */ @@ -539,7 +621,10 @@ static char* mpg123_getstr(char* str) { if (str && strlen(str) > 0) - return str; + { + return str; + } + return NULL; } diff -ur xmms-1.2.6/Input/mpg123/mpg123.h xmms-1.2.6-ss/Input/mpg123/mpg123.h - --- xmms-1.2.6/Input/mpg123/mpg123.h Wed Sep 19 01:34:19 2001 +++ xmms-1.2.6-ss/Input/mpg123/mpg123.h Tue Dec 24 15:21:12 2002 @@ -39,6 +39,9 @@ #define MPG_MD_DUAL_CHANNEL 2 #define MPG_MD_MONO 3 +extern const char WinCode[66]; +extern const char KoiCode[66]; + struct id3v1tag_t { char tag[3]; /* always "TAG": defines ID3v1 tag 128 bytes before EOF */ char title[30]; @@ -147,6 +150,7 @@ gboolean title_override, disable_id3v2; gboolean detect_by_content; gint use_3dnow; + gboolean title_id3_convert; } MPG123Config; @@ -292,6 +296,8 @@ void mpg123_get_id3v2(id3_t * id3d, struct id3tag_t *tag); gchar *mpg123_format_song_title(struct id3tag_t *tag, gchar *filename); double mpg123_relative_pos(void); +gint analyze_encoding(gchar* Buff, gint len); +void xlat(gchar* Buff, gint len, gint _enc); > > Oleg > > ... Раздался девичий кpик, плавно пеpеходящий в женский... -- Serge A. Suchkov Dipl. Eng. HVOF research group Power Engineering Research Institute Bauman State Technical University, Moscow ----------------------------------------- Phone: +7(095) 263-69-74 E-Mail: ss@e1.bmstu.ru --- ifmail v.2.15dev5 * Origin: BMSTU (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/55258c8323db.html, оценка из 5, голосов 10
|