summaryrefslogtreecommitdiff
path: root/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/tracker3/rygel-tracker-upnp-property-map.vala')
-rw-r--r--src/plugins/tracker3/rygel-tracker-upnp-property-map.vala132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala b/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
new file mode 100644
index 00000000..7670b57c
--- /dev/null
+++ b/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2010 MediaNet Inh.
+ * Copyright (C) 2012 Jens Georg <mail@jensge.org>
+ *
+ * Author: Sunil Mohan Adapa <sunil@medhas.org>
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Rygel is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+using Gee;
+
+/**
+ * A map of UPnP properties to tracker property functions, coalesces,
+ * subqueries or other custom functions
+ */
+public class Rygel.Tracker.UPnPPropertyMap : Object {
+ HashMap<string, ArrayList<string>> property_map;
+ HashMap<string, string> functions;
+ private static UPnPPropertyMap instance;
+
+ public static UPnPPropertyMap get_property_map () {
+ if (unlikely (instance == null)) {
+ instance = new UPnPPropertyMap ();
+ }
+
+ return instance;
+ }
+
+ private UPnPPropertyMap () {
+ this.property_map = new HashMap<string, ArrayList<string>> ();
+ this.functions = new HashMap<string, string> ();
+
+ // Item
+ this.add_key_chain ("res", "nie:url");
+ this.add_function ("place_holder",
+ "tracker:coalesce((SELECT false WHERE { { %s a ?o } " +
+ "FILTER (?o IN (nfo:FileDataObject, " +
+ "nfo:RemoteDataObject)) }), true)");
+ this.add_key_chain ("fileName", "nfo:fileName");
+ this.add_alternative ("dc:title", "nie:title", "nfo:fileName");
+ this.add_key_chain ("dlnaProfile", "nmm:dlnaProfile");
+ this.add_alternative ("mimeType", "nmm:dlnaMime", "nie:mimeType");
+ this.add_alternative ("res@size", "nfo:fileSize", "nie:byteSize");
+ this.add_alternative ("date",
+ "nie:contentCreated",
+ "nfo:fileLastModified");
+
+ // Music Item
+ this.add_key_chain ("res@duration", "nfo:duration");
+ this.add_key_chain ("upnp:artist", "nmm:performer", "nmm:artistName");
+ this.add_key_chain ("dc:creator", "nmm:performer", "nmm:artistName");
+ this.add_key_chain ("upnp:album", "nmm:musicAlbum", "nie:title");
+ this.add_key_chain ("upnp:originalTrackNumber", "nmm:trackNumber");
+ this.add_key_chain ("upnp:genre", "nfo:genre");
+ this.add_key_chain ("sampleRate", "nfo:sampleRate");
+ this.add_key_chain ("upnp:nrAudioChannels", "nfo:channels");
+ this.add_key_chain ("upnp:bitsPerSample", "nfo:bitsPerSample");
+ this.add_key_chain ("upnp:bitrate", "nfo:averageBitrate");
+
+ // Picture & Video Items
+ this.add_key_chain ("width", "nfo:width");
+ this.add_key_chain ("height", "nfo:height");
+
+ this.add_key_chain ("rygel:originalVolumeNumber",
+ "nmm:musicAlbumDisc",
+ "nmm:setNumber");
+ }
+
+ public new string @get (string property) {
+ var str = SelectionQuery.ITEM_VARIABLE;
+
+ if (this.property_map.has_key (property)) {
+ foreach (var key in this.property_map[property]) {
+ str = key + "(" + str + ")";
+ }
+ } else if (this.functions.has_key (property)) {
+ str = this.functions[property].printf (str);
+ }
+
+ return str;
+ }
+
+ private void add_key_chain (string property, ...) {
+ var key_chain = new ArrayList<string> ();
+
+ var list = va_list ();
+ string key = list.arg ();
+
+ while (key != null) {
+ key_chain.add (key);
+
+ key = list.arg ();
+ }
+
+ this.property_map[property] = key_chain;
+ }
+
+ private void add_function (string property, string function) {
+ this.functions[property] = function;
+ }
+
+ private void add_alternative (string property, ...) {
+ var list = va_list ();
+
+ var str = new StringBuilder ("tracker:coalesce(");
+
+ string alternative = list.arg ();
+ while (alternative != null) {
+ str.append_printf ("%s(%%1$s),", alternative);
+ alternative = list.arg ();
+ }
+
+ str.truncate (str.len - 1);
+ str.append (")");
+
+ this.add_function (property, str.str);
+ }
+}