diff options
author | waker <wakeroid@gmail.com> | 2011-03-09 18:00:44 +0100 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2011-03-09 18:00:44 +0100 |
commit | 5366568bfad42c89723b591d73f0d88270a23b19 (patch) | |
tree | fe4b070ad2a057a8449a5bdc77781643144c7ca1 | |
parent | 298961916acac828df8de8ac740eacc2df0a5e40 (diff) |
fixed adding custom metadata fields;
don't set genre to None when loading id3v1/2 with genre unset;
fixed writing apev2 with custom fields
-rw-r--r-- | junklib.c | 37 | ||||
-rw-r--r-- | plugins/gtkui/trkproperties.c | 49 |
2 files changed, 61 insertions, 25 deletions
@@ -837,14 +837,11 @@ junk_id3v1_read (playItem_t *it, DB_FILE *fp) { // "RX" = "Remix" (id3v2) if (genreid == 0xff) { - genre = "None"; + //genre = "None"; } else if (genreid <= 147) { genre = junk_genretbl[genreid]; } - else { - genre = ""; - } // add meta // trace ("%s - %s - %s - %s - %s - %s\n", title, artist, album, year, comment, genre); @@ -863,7 +860,7 @@ junk_id3v1_read (playItem_t *it, DB_FILE *fp) { if (*comment) { pl_add_meta (it, "comment", convstr_id3v1 (comment, strlen (comment))); } - if (*genre) { + if (genre && *genre) { pl_add_meta (it, "genre", convstr_id3v1 (genre, strlen (genre))); } if (tracknum != 0) { @@ -2349,6 +2346,28 @@ junk_apev2_remove_frames (DB_apev2_tag_t *tag, const char *frame_id) { return 0; } +int +junk_apev2_remove_all_text_frames (DB_apev2_tag_t *tag) { + DB_apev2_frame_t *prev = NULL; + for (DB_apev2_frame_t *f = tag->frames; f; ) { + DB_apev2_frame_t *next = f->next; + int valuetype = ((f->flags >> 1) & 3); + if (valuetype == 0) { + if (prev) { + prev->next = f->next; + } + else { + tag->frames = f->next; + } + free (f); + } + else { + prev = f; + } + f = next; + } + return 0; +} DB_apev2_frame_t * junk_apev2_add_text_frame (DB_apev2_tag_t *tag, const char *frame_id, const char *value) { trace ("adding apev2 frame %s %s\n", frame_id, value); @@ -2885,7 +2904,7 @@ junk_id3v2_add_genre (playItem_t *it, char *genre) { genre_str = junk_genretbl[genre_id]; } else if (genre_id == 0xff) { - genre_str = "None"; + // genre_str = "None"; } if (genre_str) { pl_add_meta (it, "genre", genre_str); @@ -3618,6 +3637,10 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const deadbeef->junk_apev2_free (&apev2); memset (&apev2, 0, sizeof (apev2)); } + + // remove all text frames + junk_apev2_remove_all_text_frames (&apev2); + // add all basic frames DB_metaInfo_t *meta = pl_get_metadata_head (it); while (meta) { @@ -3626,7 +3649,6 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const for (i = 0; frame_mapping[i]; i += FRAME_MAPPINGS) { if (!strcasecmp (meta->key, frame_mapping[i+MAP_DDB]) && frame_mapping[i+MAP_APEV2]) { trace ("apev2 writing known field: %s=%s\n", meta->key, meta->value); - junk_apev2_remove_frames (&apev2, frame_mapping[i+MAP_APEV2]); junk_apev2_add_text_frame (&apev2, frame_mapping[i+MAP_APEV2], meta->value); break; } @@ -3636,7 +3658,6 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const && strcasecmp (meta->key, "track") && strcasecmp (meta->key, "numtracks")) { trace ("apev2 writing unknown field: %s=%s\n", meta->key, meta->value); - junk_apev2_remove_frames (&apev2, meta->key); junk_apev2_add_text_frame (&apev2, meta->key, meta->value); } } diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c index 66849dcc..1fb129f9 100644 --- a/plugins/gtkui/trkproperties.c +++ b/plugins/gtkui/trkproperties.c @@ -250,11 +250,6 @@ static const char *hc_props[] = { NULL }; -static inline float -amp_to_db (float amp) { - return 20*log10 (amp); -} - void add_field (GtkListStore *store, const char *key, const char *title, int is_prop) { // get value to edit @@ -471,14 +466,41 @@ show_track_properties_dlg (DB_playItem_t *it) { gtk_window_present (GTK_WINDOW (widget)); } +static gboolean +set_metadata_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { + GValue mult = {0,}; + gtk_tree_model_get_value (model, iter, 3, &mult); + int smult = g_value_get_int (&mult); + if (!smult) { + GValue key = {0,}, value = {0,}; + gtk_tree_model_get_value (model, iter, 2, &key); + gtk_tree_model_get_value (model, iter, 1, &value); + const char *skey = g_value_get_string (&key); + const char *svalue = g_value_get_string (&value); + if (*svalue) { + for (int i = 0; i < numtracks; i++) { + deadbeef->pl_replace_meta (tracks[i], skey, svalue); + } + } + else { + for (int i = 0; i < numtracks; i++) { + deadbeef->pl_delete_meta (tracks[i], skey); + } + } + } + + return FALSE; +} + void on_write_tags_clicked (GtkButton *button, gpointer user_data) { deadbeef->pl_lock (); - // put all metainfo into track GtkTreeView *tree = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist")); GtkTreeModel *model = GTK_TREE_MODEL (gtk_tree_view_get_model (tree)); + + // delete all metadata properties that are not in the listview for (int i = 0; i < numtracks; i++) { DB_metaInfo_t *meta = deadbeef->pl_get_metadata_head (tracks[i]); while (meta) { @@ -493,22 +515,13 @@ on_write_tags_clicked (GtkButton *button, const char *skey = g_value_get_string (&key); if (!strcmp (skey, meta->key)) { - GValue multvalue = {0,}; - gtk_tree_model_get_value (model, &iter, 3, &multvalue); - mult = g_value_get_int (&multvalue); - // keep field if multiple values are set, replace otherwise - if (!mult) { - GValue value = {0,}; - gtk_tree_model_get_value (model, &iter, 1, &value); - const char *svalue = g_value_get_string (&value); - deadbeef->pl_replace_meta (tracks[i], meta->key, svalue); - } + // field found, don't delete break; } res = gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter); } if (!res) { - // delete this field (not in list) + // field not found, delete deadbeef->pl_delete_metadata (tracks[i], meta); } } @@ -516,6 +529,8 @@ on_write_tags_clicked (GtkButton *button, } } + // put all metainfo into track + gtk_tree_model_foreach (model, set_metadata_cb, NULL); for (int t = 0; t < numtracks; t++) { DB_playItem_t *track = tracks[t]; const char *decoder_id = deadbeef->pl_find_meta (track, ":DECODER"); |