aboutsummaryrefslogtreecommitdiff
path: root/src/idop.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-07-11 11:45:17 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-07-11 11:45:17 +0300
commitc3052454045484d22ba4d94722016162c222fb17 (patch)
treeaf70ba549577d8a508afff53e565c47d479b06a0 /src/idop.c
parent3eca38aa7fa33362df0acc9c17493ad027809437 (diff)
downloadidest-c3052454045484d22ba4d94722016162c222fb17.tar.gz
idest-c3052454045484d22ba4d94722016162c222fb17.tar.bz2
Include comment classes (short descriptions) to the output.
* src/idest.h (ed_item): New members lang & class. (field_to_string): New proto. (ed_list_add_item): Change signature. * src/idop.c (add_stringlist): Change signature. Optionally return the total length of strings added to the list. All uses changed. (field_to_string): New function. (ed_item_set_comment_fields): New function. * src/main.c (ed_list_add_item): Add comment classes.
Diffstat (limited to 'src/idop.c')
-rw-r--r--src/idop.c106
1 files changed, 100 insertions, 6 deletions
diff --git a/src/idop.c b/src/idop.c
index 7310aad..5eb2609 100644
--- a/src/idop.c
+++ b/src/idop.c
@@ -54,7 +54,7 @@ set_frame_value(struct id3_frame *frame, const char *value)
54 field = id3_frame_field(frame, 0); 54 field = id3_frame_field(frame, 0);
55 id3_field_settextencoding(field, encoding); 55 id3_field_settextencoding(field, encoding);
56 /* FIXME: Field 1: Language */ 56 /* FIXME: Field 1: Language */
57 /* FIXME: Field 2: String */ 57 /* FIXME: Field 2: Short descr */
58 /* Field 3: Comment */ 58 /* Field 3: Comment */
59 field = id3_frame_field(frame, 3); 59 field = id3_frame_field(frame, 3);
60 if (latin1_option) 60 if (latin1_option)
@@ -202,10 +202,12 @@ idest_ucs4_cvt(id3_ucs4_t const *ucs4)
202} 202}
203 203
204static void 204static void
205add_stringlist(gl_list_t list, struct id3_frame *frame, 205add_stringlist(gl_list_t list, union id3_field *field, int isgenre,
206 union id3_field *field) 206 size_t *psize)
207{ 207{
208 unsigned i, nstrings = id3_field_getnstrings(field); 208 unsigned i, nstrings = id3_field_getnstrings(field);
209 size_t size = 0;
210
209 for (i = 0; i < nstrings; i++) { 211 for (i = 0; i < nstrings; i++) {
210 id3_ucs4_t const *ucs4; 212 id3_ucs4_t const *ucs4;
211 char *str; 213 char *str;
@@ -213,11 +215,84 @@ add_stringlist(gl_list_t list, struct id3_frame *frame,
213 ucs4 = id3_field_getstrings(field, i); 215 ucs4 = id3_field_getstrings(field, i);
214 if (!ucs4) 216 if (!ucs4)
215 continue; 217 continue;
216 if (strcmp(frame->id, ID3_FRAME_GENRE) == 0) 218 if (isgenre)
217 ucs4 = id3_genre_name(ucs4); 219 ucs4 = id3_genre_name(ucs4);
218 str = idest_ucs4_cvt(ucs4); 220 str = idest_ucs4_cvt(ucs4);
221 size += strlen(str);
219 gl_list_add_last(list, str); 222 gl_list_add_last(list, str);
220 } 223 }
224 if (psize)
225 *psize = size;
226}
227
228char *
229field_to_string(union id3_field *field, int isgenre)
230{
231 id3_ucs4_t const *ucs4;
232 char *ret = NULL;
233 char buf[128];
234
235 switch (id3_field_type(field)) {
236 case ID3_FIELD_TYPE_TEXTENCODING:
237 case ID3_FIELD_TYPE_INT8:
238 case ID3_FIELD_TYPE_INT16:
239 case ID3_FIELD_TYPE_INT24:
240 case ID3_FIELD_TYPE_INT32:
241 case ID3_FIELD_TYPE_INT32PLUS:
242 snprintf(buf, sizeof(buf), "%ld", field->number.value);
243 ret = xstrdup(buf);
244 break;
245
246 case ID3_FIELD_TYPE_LATIN1:
247 case ID3_FIELD_TYPE_LATIN1FULL:
248 /* FIXME */
249 ret = xstrdup(id3_field_getlatin1(field));
250 break;
251
252 case ID3_FIELD_TYPE_LATIN1LIST:
253 /* FIXME */
254 break;
255
256 case ID3_FIELD_TYPE_STRING:
257 ucs4 = id3_field_getstring(field);;
258 if (ucs4)
259 ret = idest_ucs4_cvt(ucs4);
260 break;
261
262 case ID3_FIELD_TYPE_STRINGFULL:
263 ucs4 = id3_field_getfullstring(field);
264 ret = idest_ucs4_cvt(ucs4);
265 break;
266
267 case ID3_FIELD_TYPE_STRINGLIST: {
268 gl_list_t list;
269 size_t sz;
270 gl_list_iterator_t itr;
271 const void *p;
272
273 list = new_string_list(true);
274 add_stringlist(list, field, isgenre, &sz);
275 ret = xmalloc(sz + 1);
276 ret[0] = 0;
277 itr = gl_list_iterator(list);
278 while (gl_list_iterator_next(&itr, &p, NULL))
279 strcat(ret, p);
280 gl_list_iterator_free(&itr);
281 gl_list_free(list);
282 break;
283 }
284
285 case ID3_FIELD_TYPE_LANGUAGE:
286 case ID3_FIELD_TYPE_FRAMEID:
287 case ID3_FIELD_TYPE_DATE:
288 ret = xstrdup(field->immediate.value);
289 break;
290
291 case ID3_FIELD_TYPE_BINARYDATA:
292 /* FIXME */
293 break;
294 }
295 return ret;
221} 296}
222 297
223static void 298static void
@@ -241,7 +316,9 @@ add_field(gl_list_t list, struct id3_frame *frame, union id3_field *field)
241 gl_list_add_last(list, str); 316 gl_list_add_last(list, str);
242 break; 317 break;
243 case ID3_FIELD_TYPE_STRINGLIST: 318 case ID3_FIELD_TYPE_STRINGLIST:
244 add_stringlist(list, frame, field); 319 add_stringlist(list, field,
320 strcmp(frame->id, ID3_FRAME_GENRE) == 0,
321 NULL);
245 break; 322 break;
246 case ID3_FIELD_TYPE_LANGUAGE: 323 case ID3_FIELD_TYPE_LANGUAGE:
247 case ID3_FIELD_TYPE_FRAMEID: 324 case ID3_FIELD_TYPE_FRAMEID:
@@ -255,6 +332,23 @@ add_field(gl_list_t list, struct id3_frame *frame, union id3_field *field)
255 } 332 }
256} 333}
257 334
335void
336ed_item_set_comment_fields(struct ed_item *itm, struct id3_frame *frame)
337{
338 union id3_field *field;
339
340 if (strcmp(frame->id, ID3_FRAME_COMMENT) == 0) {
341 field = id3_frame_field(frame, 1);
342 if (!field)
343 return;
344 itm->lang = field_to_string(field, 0);
345 field = id3_frame_field(frame, 2);
346 if (!field)
347 return;
348 itm->class = field_to_string(field, 0);
349 }
350}
351
258static gl_list_t 352static gl_list_t
259frame_to_list(struct id3_frame *frame) 353frame_to_list(struct id3_frame *frame)
260{ 354{
@@ -277,7 +371,7 @@ show_tags(struct id3_tag *tag)
277 for (i = 0; (frame = id3_tag_findframe(tag, NULL, i)); i++) { 371 for (i = 0; (frame = id3_tag_findframe(tag, NULL, i)); i++) {
278 gl_list_t list = frame_to_list(frame); 372 gl_list_t list = frame_to_list(frame);
279 if (gl_list_size(list) > 0) 373 if (gl_list_size(list) > 0)
280 ed_list_add_item(frame->id, list); 374 ed_list_add_item(frame, list);
281 else 375 else
282 gl_list_free(list); 376 gl_list_free(list);
283 } 377 }

Return to:

Send suggestions and report system problems to the System administrator.