summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-03-09 18:00:44 +0100
committerGravatar waker <wakeroid@gmail.com>2011-03-09 18:00:44 +0100
commit5366568bfad42c89723b591d73f0d88270a23b19 (patch)
treefe4b070ad2a057a8449a5bdc77781643144c7ca1
parent298961916acac828df8de8ac740eacc2df0a5e40 (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.c37
-rw-r--r--plugins/gtkui/trkproperties.c49
2 files changed, 61 insertions, 25 deletions
diff --git a/junklib.c b/junklib.c
index 667bcdcb..74db30f7 100644
--- a/junklib.c
+++ b/junklib.c
@@ -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");