[rhythmbox] metadata: read and write date tags properly
- From: Jonathan Matthew <jmatthew src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rhythmbox] metadata: read and write date tags properly
- Date: Mon, 10 Jun 2013 12:14:54 +0000 (UTC)
commit d78b2db2762becc2556c454e8ae7f12521eb8f1f
Author: Jonathan Matthew <jonathan d14n org>
Date: Mon Jun 10 22:14:31 2013 +1000
metadata: read and write date tags properly
metadata/rb-metadata-gst-common.c | 4 +-
metadata/rb-metadata-gst.c | 65 +++++++++++++++++++++++++++++++++----
2 files changed, 60 insertions(+), 9 deletions(-)
---
diff --git a/metadata/rb-metadata-gst-common.c b/metadata/rb-metadata-gst-common.c
index b384334..32e4c87 100644
--- a/metadata/rb-metadata-gst-common.c
+++ b/metadata/rb-metadata-gst-common.c
@@ -46,7 +46,7 @@ rb_metadata_gst_tag_to_field (const char *tag)
return RB_METADATA_FIELD_ARTIST;
else if (!strcmp (tag, GST_TAG_ALBUM))
return RB_METADATA_FIELD_ALBUM;
- else if (!strcmp (tag, GST_TAG_DATE))
+ else if (!strcmp (tag, GST_TAG_DATE_TIME))
return RB_METADATA_FIELD_DATE;
else if (!strcmp (tag, GST_TAG_GENRE))
return RB_METADATA_FIELD_GENRE;
@@ -128,7 +128,7 @@ rb_metadata_gst_field_to_gst_tag (RBMetaDataField field)
case RB_METADATA_FIELD_ALBUM:
return GST_TAG_ALBUM;
case RB_METADATA_FIELD_DATE:
- return GST_TAG_DATE;
+ return GST_TAG_DATE_TIME;
case RB_METADATA_FIELD_GENRE:
return GST_TAG_GENRE;
case RB_METADATA_FIELD_COMMENT:
diff --git a/metadata/rb-metadata-gst.c b/metadata/rb-metadata-gst.c
index 288a6d8..e64477c 100644
--- a/metadata/rb-metadata-gst.c
+++ b/metadata/rb-metadata-gst.c
@@ -822,6 +822,7 @@ rb_metadata_get (RBMetaData *md, RBMetaDataField field, GValue *ret)
const char *tag;
GValue gstvalue = {0, };
GstClockTime duration;
+ GstDateTime *datetime;
if (md->priv->info == NULL)
return FALSE;
@@ -847,6 +848,31 @@ rb_metadata_get (RBMetaData *md, RBMetaDataField field, GValue *ret)
} else {
return FALSE;
}
+
+ break;
+
+ case RB_METADATA_FIELD_DATE:
+ tags = gst_discoverer_info_get_tags (md->priv->info);
+ if (tags == NULL)
+ return FALSE;
+
+ if (gst_tag_list_get_date_time (tags, GST_TAG_DATE_TIME, &datetime) == FALSE) {
+ return FALSE;
+ } else {
+ GDate date;
+
+ g_date_set_dmy (&date,
+ gst_date_time_has_day (datetime) ? gst_date_time_get_day (datetime) :
1,
+ gst_date_time_has_month (datetime) ? gst_date_time_get_month
(datetime) : 1,
+ gst_date_time_get_year (datetime));
+
+ g_value_init (ret, G_TYPE_ULONG);
+ g_value_set_ulong (ret, g_date_get_julian (&date));
+
+ gst_date_time_unref (datetime);
+ return TRUE;
+ }
+ break;
default:
break;
}
@@ -861,7 +887,6 @@ rb_metadata_get (RBMetaData *md, RBMetaDataField field, GValue *ret)
return FALSE;
}
-
if (rb_metadata_get_field_type (field) == G_TYPE_STRING) {
char *str = NULL;
const char *v;
@@ -909,19 +934,45 @@ rb_metadata_get_media_type (RBMetaData *md)
gboolean
rb_metadata_set (RBMetaData *md, RBMetaDataField field, const GValue *val)
{
+ const char *tag;
+
/* don't write this out */
if (field == RB_METADATA_FIELD_DURATION)
return TRUE;
- if (field == RB_METADATA_FIELD_DATE && g_value_get_ulong (val) == 0) {
- /* we should ask gstreamer to remove the tag,
- * but there is no easy way of doing so
- */
+ tag = rb_metadata_gst_field_to_gst_tag (field);
+ if (field == RB_METADATA_FIELD_DATE) {
+ if (g_value_get_ulong (val) == 0) {
+ /* we should ask gstreamer to remove the tag,
+ * but there is no easy way of doing so
+ */
+ } else {
+ GstDateTime *datetime;
+ GDate date;
+ GValue newval = {0,};
+ g_value_init (&newval, GST_TYPE_DATE_TIME);
+
+ g_date_set_julian (&date, g_value_get_ulong (val));
+ datetime = gst_date_time_new (0.0,
+ g_date_get_year (&date),
+ g_date_get_month (&date),
+ g_date_get_day (&date),
+ 0, 0, 0);
+ g_value_take_boxed (&newval, datetime);
+
+ if (md->priv->tags == NULL) {
+ md->priv->tags = gst_tag_list_new_empty ();
+ }
+
+ gst_tag_list_add_values (md->priv->tags,
+ GST_TAG_MERGE_APPEND,
+ tag, &newval,
+ NULL);
+ g_value_unset (&newval);
+ }
} else {
- const char *tag;
GValue newval = {0,};
- tag = rb_metadata_gst_field_to_gst_tag (field);
g_value_init (&newval, gst_tag_get_type (tag));
if (g_value_transform (val, &newval)) {
rb_debug ("Setting %s",tag);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]