LINUX.ORG.RU

mpd и русские теги


0

0

mpd не хочет отдавать в правильной кодировке русские теги (отдаёт в битой какой-то). Писал id3v1_encoding "cp1251" - не помогло (вообще ни чего не поменялось). Потом взял mp3info и переконвертировал все теги в utf8 при помощи iconv. Результат остался тот же.. То что выводит mpc можно переконвертировать в cp866, потом удалить символы псевдографики и получается нечто читабельное. Решил что проблема в libId3tag, проверил написав программку которая получала теги при помощи libId3tag - действительно libId3tag отдаёт такую ерунду, т.е. mpd вроде как и не виноват.. Куда копать и что делать? Плееры которые читают теги при помощи taglib работают правильно. Можно ли как-то прикрутить taglib к mpd(самому править исходники mpd влом, мож есть уже патч)?

s/переконвертировать в cp866/переконвертировать из utf8 в cp866/

TaranSergey
() автор топика

Вот патч, добавляющий поддержку перекодировки idv2 и idv1 (проверено в mpd 0.12 и 0.13) через опцию "id3v1_encoding" в конфиге.

--- mpd-0.12.1/src/tag.c	2006-10-11 07:56:58.000000000 +0800
+++ /home/brian/development/cool-karaoke/mpd-0.12.1/src/tag.c	2006-11-03 11:20:53.000000000 +0800
@@ -130,17 +130,36 @@
 {
 	struct id3_frame const *frame;
 	id3_ucs4_t const *ucs4;
-	id3_utf8_t *utf8;
+	id3_utf8_t *utf8 = NULL;
 	id3_latin1_t *isostr;
 	union id3_field const *field;
 	unsigned int nstrings;
 	int i;
 	char *encoding;
+	enum id3_field_textencoding id3_encoding = 0xff;
+	int need_conv = 0;
 
 	frame = id3_tag_findframe(tag, id, 0);
 	if (!frame || frame->nfields < 2)
 		return mpdTag;
 
+	field = id3_frame_field(frame, 0);
+	if (id3_field_type(field) == ID3_FIELD_TYPE_TEXTENCODING)
+		id3_encoding = field->number.value;
+
+	if (isId3v1(tag) || id3_encoding == 0xff || id3_encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1) {
+		/* encoding not found or equal to ISO-8859-1
+		 *  - ISO-8859-1 means local locale... */
+		need_conv = 1;
+		encoding = getConfigParamValue(CONF_ID3V1_ENCODING);
+		
+		if (encoding) {
+			if (!strcmp(encoding, "UTF-8"))
+				need_conv = 0;
+		} else
+			need_conv = 0; /* Defaulting to UTF-8 */
+	}
+
 	field = &frame->fields[1];
 	nstrings = id3_field_getnstrings(field);
 
@@ -152,6 +171,7 @@
 		if (type == TAG_ITEM_GENRE)
 			ucs4 = id3_genre_name(ucs4);
 
+#if 0
 		if (isId3v1(tag) &&
 		    (encoding = getConfigParamValue(CONF_ID3V1_ENCODING))) {
 			isostr = id3_ucs4_latin1duplicate(ucs4);
@@ -171,12 +191,27 @@
 			if (mpd_unlikely(!utf8))
 				continue;
 		}
+#else
+		if (need_conv) {
+			char* isostr;
+
+			isostr = id3_ucs4_latin1duplicate(ucs4);
+			setCharSetConversion("UTF-8", encoding);
+			utf8 = convStrDup(isostr);
+			free(isostr);
+		}
+
+		if (!utf8)
+			utf8 = id3_ucs4_utf8duplicate(ucs4);
+
+#endif
 
 		if (mpdTag == NULL)
 			mpdTag = newMpdTag();
 		addItemToMpdTag(mpdTag, type, (char *)utf8);
 
 		free(utf8);
+		utf8 = NULL;
 	}
 
 	return mpdTag;

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