[gupnp-av] Add helper function for iso8601
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gupnp-av] Add helper function for iso8601
- Date: Sun, 1 May 2022 07:59:35 +0000 (UTC)
commit 416009efb19e3247b295852d9d46a823559bcc34
Author: Jens Georg <mail jensge org>
Date: Sun May 1 09:58:02 2022 +0200
Add helper function for iso8601
DLNA expects a certain subset of ISO8601 which this function provides
libgupnp-av/gupnp-didl-lite-object.c | 46 ++++++++++++++++++++++++++++++++++++
libgupnp-av/gupnp-didl-lite-object.h | 3 +++
vala/GUPnPAV-1.0.metadata | 1 +
3 files changed, 50 insertions(+)
---
diff --git a/libgupnp-av/gupnp-didl-lite-object.c b/libgupnp-av/gupnp-didl-lite-object.c
index 67a683c..fd3090b 100644
--- a/libgupnp-av/gupnp-didl-lite-object.c
+++ b/libgupnp-av/gupnp-didl-lite-object.c
@@ -2645,3 +2645,49 @@ gupnp_didl_lite_object_get_xml_string (GUPnPDIDLLiteObject *object)
return ret;
}
+
+/**
+ * gupnp_format_date_time_for_didl_lite:
+ * @date_time: DateTime to format
+ *
+ * Get the representation of DateTime as an ISO8601 string.
+ *
+ * DLNA requires a specific subset of ISO8601
+ * Returns: (transfer full): @date_time formatted as an ISO8601 string
+ */
+char *
+gupnp_format_date_time_for_didl_lite (GDateTime *date_time, gboolean date_only)
+{
+ g_return_val_if_fail (date_time != NULL, NULL);
+
+ if (date_only) {
+ return g_date_time_format (date_time, "%F");
+ }
+
+ const char *format = "%FT%H:%M:%S";
+ char *base_string = g_date_time_format (date_time, format);
+ GString *iso_string = g_string_new (base_string);
+
+ // Check if we have sub-second precision. If so, we use that as well,
+ // but cannot use %f since that will use microsecond precision, but DLNA
+ // only allows for millisecond so we append the milliseconds manually
+ if (g_date_time_get_microsecond (date_time) % G_TIME_SPAN_SECOND != 0) {
+ g_string_append_printf (
+ iso_string,
+ ".%03d",
+ g_date_time_get_microsecond (date_time) / 1000);
+ }
+
+ GTimeSpan utc_offset = g_date_time_get_utc_offset (date_time);
+ if (utc_offset == 0) {
+ g_string_append (iso_string, "Z");
+ } else {
+ char *time_zone = g_date_time_format (date_time, "%:z");
+ g_string_append (iso_string, time_zone);
+ g_free (time_zone);
+ }
+
+ g_free (base_string);
+
+ return g_string_free (iso_string, FALSE);
+}
diff --git a/libgupnp-av/gupnp-didl-lite-object.h b/libgupnp-av/gupnp-didl-lite-object.h
index be250f0..e7719c2 100644
--- a/libgupnp-av/gupnp-didl-lite-object.h
+++ b/libgupnp-av/gupnp-didl-lite-object.h
@@ -277,6 +277,9 @@ gupnp_didl_lite_object_apply_fragments
char *
gupnp_didl_lite_object_get_xml_string (GUPnPDIDLLiteObject *object);
+char *
+gupnp_format_date_time_for_didl_lite (GDateTime *date_time, gboolean date_only);
+
G_END_DECLS
#endif /* __GUPNP_DIDL_LITE_OBJECT_H__ */
diff --git a/vala/GUPnPAV-1.0.metadata b/vala/GUPnPAV-1.0.metadata
index 0f6b360..82a19e7 100644
--- a/vala/GUPnPAV-1.0.metadata
+++ b/vala/GUPnPAV-1.0.metadata
@@ -12,3 +12,4 @@ SearchCriteriaParser
.expression skip
ProtocolError skip
protocol_error_quark skip
+format_date_time_for_didl_lite.date_only default=false
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]