Mercurial > audlegacy-plugins
diff src/madplug/fileinfo.c @ 611:3f7a52adfe0e trunk
[svn] merge recent changes from yaz's branch.
- stable shoutcast playback.
- tag handling improvement.
- view track detail on streaming won't crash. (disabled.)
- filepopup for streaming is partially supported. filepopup displays track name and stream name, but not updated automatically.
| author | yaz |
|---|---|
| date | Tue, 06 Feb 2007 12:11:42 -0800 |
| parents | 862190d39e00 |
| children | 85a70ace8c02 |
line wrap: on
line diff
--- a/src/madplug/fileinfo.c Mon Feb 05 12:28:01 2007 -0800 +++ b/src/madplug/fileinfo.c Tue Feb 06 12:11:42 2007 -0800 @@ -62,6 +62,8 @@ if (data == NULL) return; + /* printf ("updating id3: %s: %s\n", frame_name, data); */ + /* * An empty string removes the frame altogether. */ @@ -77,31 +79,37 @@ id3_tag_attachframe(tag, frame); } - if (frame_name == ID3_FRAME_COMMENT) { + // setup ucs4 string + if(audmad_config.sjis) { + ucs4 = id3_latin1_ucs4duplicate((id3_latin1_t *) data); + } + else { + ucs4 = id3_utf8_ucs4duplicate((id3_utf8_t *) data); + } + + // set encoding + field = id3_frame_field(frame, 0); + id3_field_settextencoding(field, audmad_config.sjis ? ID3_FIELD_TEXTENCODING_ISO_8859_1 : + ID3_FIELD_TEXTENCODING_UTF_8); + + // setup genre code + if (!strcmp(frame_name, ID3_FRAME_GENRE)) { + char *tmp; + int index = id3_genre_number(ucs4); + g_free(ucs4); + tmp = g_strdup_printf("%d", index); + ucs4 = id3_latin1_ucs4duplicate((unsigned char *) tmp); + } + + // write string + if (!strcmp(frame_name, ID3_FRAME_COMMENT)) { field = id3_frame_field(frame, 3); field->type = ID3_FIELD_TYPE_STRINGFULL; + res = id3_field_setfullstring(field, ucs4); } else { field = id3_frame_field(frame, 1); field->type = ID3_FIELD_TYPE_STRINGLIST; - } - - id3_field_settextencoding(field, ID3_FIELD_TEXTENCODING_UTF_8); - - ucs4 = id3_utf8_ucs4duplicate((const unsigned char *) data); - - if (frame_name == ID3_FRAME_GENRE) { - char *tmp; - int index = id3_genre_number(ucs4); - g_free(ucs4); - tmp = g_strdup_printf("%d", index); - ucs4 = id3_utf8_ucs4duplicate((unsigned char *) tmp); - } - - if (frame_name == ID3_FRAME_COMMENT) { - res = id3_field_setfullstring(field, ucs4); - } - else { res = id3_field_setstrings(field, 1, &ucs4); } @@ -117,10 +125,10 @@ static void save_cb(GtkWidget * w, gpointer data) { - gchar *text; + gchar *text, *sjis; struct id3_file *id3file; struct id3_tag *id3tag; - char *codeset; + char *encoding; if (info.remote) return; @@ -130,55 +138,78 @@ if (!id3file) { id3tag = id3_tag_new(); id3_tag_clearframes(id3tag); + id3tag->options |= ID3_TAG_OPTION_ID3V1; if (!id3file) { xmms_show_message("File Info", "Couldn't open file!", "Ok", FALSE, NULL, NULL); return; } } - id3tag = id3_file_tag(id3file); + id3_tag_options(id3tag, ID3_TAG_OPTION_ID3V1, ~0); /* enables id3v1 */ +// id3_tag_options(id3tag, ID3_TAG_OPTION_ID3V1, 0); /* disables id3v1 */ if (!id3tag) { id3tag = id3_tag_new(); } + encoding = audmad_config.sjis ? "SJIS" : "UTF-8"; + text = gtk_editable_get_chars(GTK_EDITABLE(title_entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_TITLE, text); + sjis = g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_TITLE, sjis); free(text); + free(sjis); text = gtk_editable_get_chars(GTK_EDITABLE(artist_entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_ARTIST, text); + sjis = g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_ARTIST, sjis); free(text); + free(sjis); text = gtk_editable_get_chars(GTK_EDITABLE(album_entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_ALBUM, text); + sjis = + g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_ALBUM, sjis); free(text); + free(sjis); text = gtk_editable_get_chars(GTK_EDITABLE(year_entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_YEAR, text); + sjis = + g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_YEAR, sjis); free(text); + free(sjis); text = gtk_editable_get_chars(GTK_EDITABLE(comment_entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_COMMENT, text); + sjis = + g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_COMMENT, sjis); free(text); + free(sjis); text = gtk_editable_get_chars(GTK_EDITABLE(tracknum_entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_TRACK, text); + sjis = + g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_TRACK, sjis); free(text); + free(sjis); - text = - gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(genre_combo)->entry), + text = gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(genre_combo)->entry), 0, -1); - update_id3_frame(id3tag, ID3_FRAME_GENRE, text); + sjis = g_convert(text, strlen(text), encoding, "UTF-8", NULL, NULL, NULL); + update_id3_frame(id3tag, ID3_FRAME_GENRE, sjis); free(text); + free(sjis); if (id3_file_update(id3file) != 0) { xmms_show_message("File Info", "Couldn't write tag!", "Ok", FALSE, NULL, NULL); } id3_file_close(id3file); +// gtk_widget_destroy(window); } +#if 0 static void remove_id3_cb(GtkWidget * w, gpointer data) { struct id3_file *id3file; @@ -211,6 +242,277 @@ gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); } +#endif + +static void remove_id3_cb(GtkWidget * w, gpointer data) +{ + struct id3_file *id3file; + struct id3_tag *id3tag; + + /* read tag from file */ + id3file = id3_file_open(info.filename, ID3_FILE_MODE_READWRITE); + if (!id3file) + return; + + id3tag = id3_file_tag(id3file); + if(id3tag) { + /* since current libid3tag cannot delete tag completely, just add a dummy. */ + const char *dummy = ""; + update_id3_frame(id3tag, ID3_FRAME_TITLE, dummy); + update_id3_frame(id3tag, ID3_FRAME_ARTIST, dummy); + update_id3_frame(id3tag, ID3_FRAME_ALBUM, dummy); + update_id3_frame(id3tag, ID3_FRAME_YEAR, dummy); + update_id3_frame(id3tag, ID3_FRAME_TRACK, dummy); + update_id3_frame(id3tag, ID3_FRAME_GENRE, "Other"); + update_id3_frame(id3tag, ID3_FRAME_COMMENT, dummy); + + if (id3_file_update(id3file) != 0) { + xmms_show_message("File Info", "Couldn't write tag!", "OK", FALSE, + NULL, NULL); + } + } + + id3_file_close(id3file); + + gtk_entry_set_text(GTK_ENTRY(title_entry), ""); + gtk_entry_set_text(GTK_ENTRY(artist_entry), ""); + gtk_entry_set_text(GTK_ENTRY(album_entry), ""); + gtk_entry_set_text(GTK_ENTRY(comment_entry), ""); + gtk_entry_set_text(GTK_ENTRY(year_entry), ""); + gtk_entry_set_text(GTK_ENTRY(tracknum_entry), ""); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry), ""); + gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); + +// gtk_widget_destroy(window); +} + +#if 0 +void create_window() +{ + GtkWidget *vbox, *hbox, *left_vbox, *table; + GtkWidget *mpeg_frame, *mpeg_box; + GtkWidget *label, *filename_hbox; + GtkWidget *bbox, *save, *remove_id3, *cancel; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE); + gtk_signal_connect(GTK_OBJECT(window), "destroy", + GTK_SIGNAL_FUNC(close_window), &window); + gtk_container_set_border_width(GTK_CONTAINER(window), 10); + + vbox = gtk_vbox_new(FALSE, 10); + gtk_container_add(GTK_CONTAINER(window), vbox); + + filename_hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(vbox), filename_hbox, FALSE, TRUE, 0); + + label = gtk_label_new("Filename:"); + gtk_box_pack_start(GTK_BOX(filename_hbox), label, FALSE, TRUE, 0); + filename_entry = gtk_entry_new(); + gtk_editable_set_editable(GTK_EDITABLE(filename_entry), FALSE); + gtk_box_pack_start(GTK_BOX(filename_hbox), filename_entry, TRUE, TRUE, + 0); + + hbox = gtk_hbox_new(FALSE, 10); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + + left_vbox = gtk_vbox_new(FALSE, 10); + gtk_box_pack_start(GTK_BOX(hbox), left_vbox, FALSE, FALSE, 0); + + id3_frame = gtk_frame_new("ID3 Tag:"); + gtk_box_pack_start(GTK_BOX(left_vbox), id3_frame, FALSE, FALSE, 0); + + table = gtk_table_new(5, 5, FALSE); + gtk_container_set_border_width(GTK_CONTAINER(table), 5); + gtk_container_add(GTK_CONTAINER(id3_frame), table); + + label = gtk_label_new("Title:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, + GTK_FILL, 5, 5); + + title_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), title_entry, 1, 4, 0, 1, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + label = gtk_label_new("Artist:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, + GTK_FILL, 5, 5); + + artist_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), artist_entry, 1, 4, 1, 2, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + label = gtk_label_new("Album:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL, + GTK_FILL, 5, 5); + + album_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), album_entry, 1, 4, 2, 3, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + label = gtk_label_new("Comment:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, GTK_FILL, + GTK_FILL, 5, 5); + + comment_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), comment_entry, 1, 4, 3, 4, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + label = gtk_label_new("Year:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, GTK_FILL, + GTK_FILL, 5, 5); + + year_entry = gtk_entry_new(); + gtk_widget_set_usize(year_entry, 40, -1); + gtk_table_attach(GTK_TABLE(table), year_entry, 1, 2, 4, 5, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + label = gtk_label_new("Track number:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 2, 3, 4, 5, GTK_FILL, + GTK_FILL, 5, 5); + + tracknum_entry = gtk_entry_new(); + gtk_widget_set_usize(tracknum_entry, 40, -1); + gtk_table_attach(GTK_TABLE(table), tracknum_entry, 3, 4, 4, 5, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + label = gtk_label_new("Genre:"); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6, GTK_FILL, + GTK_FILL, 5, 5); + + genre_combo = gtk_combo_new(); + gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(genre_combo)->entry), + FALSE); + if (!genre_list) { + int i = 0; + const id3_ucs4_t *ucs4 = id3_genre_index(i); + while (ucs4) { + genre_list = + g_list_append(genre_list, id3_ucs4_latin1duplicate(ucs4)); + i++; + ucs4 = id3_genre_index(i); + } + } + gtk_combo_set_popdown_strings(GTK_COMBO(genre_combo), genre_list); + + gtk_table_attach(GTK_TABLE(table), genre_combo, 1, 4, 5, 6, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, + GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); + + bbox = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); + gtk_box_pack_start(GTK_BOX(left_vbox), bbox, FALSE, FALSE, 0); + + save = gtk_button_new_with_label("Save"); + gtk_signal_connect(GTK_OBJECT(save), "clicked", + GTK_SIGNAL_FUNC(save_cb), NULL); + GTK_WIDGET_SET_FLAGS(save, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(bbox), save, TRUE, TRUE, 0); + gtk_widget_grab_default(save); + + remove_id3 = gtk_button_new_with_label("Remove ID3"); + gtk_signal_connect(GTK_OBJECT(remove_id3), "clicked", + GTK_SIGNAL_FUNC(remove_id3_cb), NULL); + GTK_WIDGET_SET_FLAGS(remove_id3, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(bbox), remove_id3, TRUE, TRUE, 0); + + cancel = gtk_button_new_with_label("Cancel"); + gtk_signal_connect_object(GTK_OBJECT(cancel), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT(window)); + GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0); + + mpeg_frame = gtk_frame_new("MPEG Info:"); + gtk_box_pack_start(GTK_BOX(hbox), mpeg_frame, FALSE, FALSE, 0); + + mpeg_box = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(mpeg_frame), mpeg_box); + gtk_container_set_border_width(GTK_CONTAINER(mpeg_box), 10); + gtk_box_set_spacing(GTK_BOX(mpeg_box), 0); + + mpeg_level = gtk_label_new(""); + gtk_widget_set_usize(mpeg_level, 120, -2); + gtk_misc_set_alignment(GTK_MISC(mpeg_level), 0, 0); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_level, FALSE, FALSE, 0); + + mpeg_bitrate = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_bitrate), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_bitrate), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_bitrate, FALSE, FALSE, 0); + + mpeg_samplerate = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_samplerate), 0, 0); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_samplerate, FALSE, FALSE, + 0); + + mpeg_flags = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_flags), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_flags), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_flags, FALSE, FALSE, 0); + + mpeg_frames = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_frames), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_frames), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_frames, FALSE, FALSE, 0); + + mpeg_duration = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_duration), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_duration), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_duration, FALSE, FALSE, 0); + + mpeg_replaygain = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_replaygain), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_replaygain), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_replaygain, FALSE, FALSE, + 0); + mpeg_replaygain2 = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_replaygain2), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_replaygain2), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_replaygain2, FALSE, FALSE, + 0); + mpeg_replaygain3 = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_replaygain3), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_replaygain3), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_replaygain3, FALSE, FALSE, + 0); + mpeg_replaygain4 = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_replaygain4), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_replaygain4), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_replaygain4, FALSE, FALSE, + 0); + mp3gain1 = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mp3gain1), 0, 0); + gtk_label_set_justify(GTK_LABEL(mp3gain1), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mp3gain1, FALSE, FALSE, 0); + mp3gain2 = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mp3gain2), 0, 0); + gtk_label_set_justify(GTK_LABEL(mp3gain2), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mp3gain2, FALSE, FALSE, 0); + + mpeg_fileinfo = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(mpeg_fileinfo), 0, 0); + gtk_label_set_justify(GTK_LABEL(mpeg_fileinfo), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(mpeg_box), mpeg_fileinfo, FALSE, FALSE, 0); + + gtk_widget_show_all(window); +} +#endif static void change_buttons(GtkWidget * object) @@ -500,7 +802,7 @@ #ifndef NOGUI gchar *title; gchar message[128]; - static char const *const layer_str[3] = { "MPEG-1 Layer I", "MPEG-1 Layer II", "MPEG-1 Layer III" }; + static char const *const layer_str[3] = { "I", "II", "III" }; static char const *const mode_str[4] = { ("single channel"), ("dual channel"), "joint stereo", "stereo" }; @@ -509,13 +811,20 @@ #ifdef DEBUG g_message("f: audmad_get_file_info: %s\n", filename); #endif + input_init(&info, filename); + + if (!strncasecmp("http://", filename, strlen("http://")) || + !strncasecmp("https://", filename, strlen("https://"))) { + info.remote = TRUE; + return; //tentative + } + utf_filename = str_to_utf8(filename); create_window(); - input_init(&info, filename); - input_get_info(&info, FALSE); + input_get_info(&info, info.remote ? TRUE : audmad_config.fast_play_time_calc); - title = g_strdup_printf("%s - Audacious", g_basename(filename)); + title = g_strdup_printf("File Info - %s", g_basename(filename)); gtk_window_set_title(GTK_WINDOW(window), title); g_free(title); @@ -545,13 +854,13 @@ id3_frame_to_entry(ID3_FRAME_TRACK, GTK_ENTRY(tracknum_entry)); id3_frame_to_entry(ID3_FRAME_COMMENT, GTK_ENTRY(comment_entry)); - snprintf(message, 127, "%s", layer_str[info.mpeg_layer - 1]); + snprintf(message, 127, "Layer %s", layer_str[info.mpeg_layer - 1]); gtk_label_set_text(GTK_LABEL(mpeg_level), message); if (info.vbr) { snprintf(message, 127, "VBR (avg. %d kbps)", info.bitrate / 1000); } else { - snprintf(message, 127, "%d KBit/s", info.bitrate / 1000); + snprintf(message, 127, "%d kbps", info.bitrate / 1000); } gtk_label_set_text(GTK_LABEL(mpeg_bitrate), message); snprintf(message, 127, "%d Hz", info.freq);
