[rygel] tracker3: Port to new API
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] tracker3: Port to new API
- Date: Sun, 5 Jul 2020 13:38:10 +0000 (UTC)
commit f0f22f58793786aee18dc116bb45d7916320d0bc
Author: Jens Georg <mail jensge org>
Date: Sun May 24 17:37:46 2020 +0200
tracker3: Port to new API
.../rygel-tracker-category-all-container.vala | 23 +++----
.../tracker3/rygel-tracker-insertion-query.vala | 1 +
.../tracker3/rygel-tracker-metadata-container.vala | 14 +----
.../tracker3/rygel-tracker-metadata-values.vala | 7 ++-
src/plugins/tracker3/rygel-tracker-music.vala | 4 +-
src/plugins/tracker3/rygel-tracker-new.vala | 5 +-
.../tracker3/rygel-tracker-plugin-factory.vala | 11 ----
src/plugins/tracker3/rygel-tracker-plugin.vala | 3 +-
.../tracker3/rygel-tracker-root-container.vala | 15 ++++-
.../tracker3/rygel-tracker-search-container.vala | 33 +++++-----
.../tracker3/rygel-tracker-selection-query.vala | 20 +++---
.../tracker3/rygel-tracker-upnp-property-map.vala | 72 +++++++++++++++++++---
12 files changed, 131 insertions(+), 77 deletions(-)
---
diff --git a/src/plugins/tracker3/rygel-tracker-category-all-container.vala
b/src/plugins/tracker3/rygel-tracker-category-all-container.vala
index 64ab3aa7..5a2695b8 100644
--- a/src/plugins/tracker3/rygel-tracker-category-all-container.vala
+++ b/src/plugins/tracker3/rygel-tracker-category-all-container.vala
@@ -33,14 +33,13 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
WritableContainer,
SearchableContainer {
/* class-wide constants */
- private const string TRACKER_SERVICE = "org.freedesktop.Tracker1";
- private const string RESOURCES_PATH = "/org/freedesktop/Tracker1/Resources";
+ private const string TRACKER_SERVICE = "org.freedesktop.Tracker3.Miner.Files";
+ private const string RESOURCES_PATH = "/org/freedesktop/Tracker3/Endpoint";
+ private const string TRACKER_INTERFACE = "org.freedesktop.Tracker3.Endpoint";
public ArrayList<string> create_classes { get; set; }
public ArrayList<string> search_classes { get; set; }
- private Sparql.Connection resources;
-
public CategoryAllContainer (CategoryContainer parent) {
base ("All" + parent.id, parent, "All", parent.item_factory);
@@ -48,13 +47,6 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
this.create_classes.add (item_factory.upnp_class);
this.search_classes = new ArrayList<string> ();
- try {
- this.resources = Sparql.Connection.bus_new ("org.freedesktop.Tracker3.Miner.Files", null);
- } catch (Error io_error) {
- critical (_("Failed to create a Tracker connection: %s"),
- io_error.message);
- }
-
if (item_factory.upload_dir != null) {
try {
var uri = Filename.to_uri (item_factory.upload_dir, null);
@@ -69,7 +61,7 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
try {
var connection = Bus.get_sync (BusType.SESSION);
connection.signal_subscribe (TRACKER_SERVICE,
- TRACKER_SERVICE + ".Resources",
+ TRACKER_INTERFACE,
"GraphUpdated",
RESOURCES_PATH,
this.item_factory.category_iri,
@@ -80,8 +72,9 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
error.message);
}
+ message("RUnnin cleanup query for %s", this.item_factory.category);
var cleanup_query = new CleanupQuery (this.item_factory.category);
- cleanup_query.execute.begin (this.resources);
+ cleanup_query.execute.begin (RootContainer.connection, () => { query.result.close (); } );
}
public async void add_item (MediaFileItem item, Cancellable? cancellable)
@@ -140,7 +133,7 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
var category = this.item_factory.category;
var query = new InsertionQuery (item, category);
- yield query.execute (this.resources);
+ yield query.execute (RootContainer.connection);
return query.id;
}
@@ -148,6 +141,6 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
private async void remove_entry_from_store (string id) throws Error {
var query = new DeletionQuery (id);
- yield query.execute (this.resources);
+ yield query.execute (RootContainer.connection);
}
}
diff --git a/src/plugins/tracker3/rygel-tracker-insertion-query.vala
b/src/plugins/tracker3/rygel-tracker-insertion-query.vala
index e062d058..4d5323a6 100644
--- a/src/plugins/tracker3/rygel-tracker-insertion-query.vala
+++ b/src/plugins/tracker3/rygel-tracker-insertion-query.vala
@@ -152,6 +152,7 @@ public class Rygel.Tracker.InsertionQuery : Query {
}
} catch (Error error) {
}
+ cursor.close ();
} else {
var file = File.new_for_uri (this.uri);
if (file.is_native () &&
diff --git a/src/plugins/tracker3/rygel-tracker-metadata-container.vala
b/src/plugins/tracker3/rygel-tracker-metadata-container.vala
index 1637fef3..72180386 100644
--- a/src/plugins/tracker3/rygel-tracker-metadata-container.vala
+++ b/src/plugins/tracker3/rygel-tracker-metadata-container.vala
@@ -39,7 +39,6 @@ public abstract class Rygel.Tracker.MetadataContainer : Rygel.SimpleContainer {
private string child_class;
- private Sparql.Connection resources;
protected QueryTriplets triplets;
protected MetadataContainer (string id,
@@ -51,15 +50,6 @@ public abstract class Rygel.Tracker.MetadataContainer : Rygel.SimpleContainer {
this.item_factory = item_factory;
this.child_class = child_class;
-
- try {
- this.resources = Sparql.Connection.bus_new ("org.freedesktop.Tracker3.Miner.Files", null);
- } catch (Error error) {
- critical (_("Failed to create Tracker connection: %s"),
- error.message);
-
- return;
- }
}
internal async void fetch_metadata_values () {
@@ -74,7 +64,7 @@ public abstract class Rygel.Tracker.MetadataContainer : Rygel.SimpleContainer {
var query = this.create_query ();
try {
- yield query.execute (this.resources);
+ yield query.execute (RootContainer.connection);
/* Iterate through all the values */
while (query.result.next ()) {
@@ -106,6 +96,8 @@ public abstract class Rygel.Tracker.MetadataContainer : Rygel.SimpleContainer {
this.add_child_container (container);
}
+
+ query.result.close ();
} catch (Error error) {
critical (_("Error getting all values for ā%sā: %s"),
this.id,
diff --git a/src/plugins/tracker3/rygel-tracker-metadata-values.vala
b/src/plugins/tracker3/rygel-tracker-metadata-values.vala
index e9fd1606..1c443df7 100644
--- a/src/plugins/tracker3/rygel-tracker-metadata-values.vala
+++ b/src/plugins/tracker3/rygel-tracker-metadata-values.vala
@@ -48,6 +48,9 @@ public abstract class Rygel.Tracker.MetadataValues : MetadataContainer {
this.triplets.add (new QueryTriplet (SelectionQuery.ITEM_VARIABLE,
"a",
this.item_factory.category));
+ this.triplets.add (new QueryTriplet (SelectionQuery.ITEM_VARIABLE,
+ "nie:isStoredAs",
+ SelectionQuery.STORAGE_VARIABLE));
this.fetch_metadata_values.begin ();
}
@@ -58,7 +61,9 @@ public abstract class Rygel.Tracker.MetadataValues : MetadataContainer {
property_map[this.property] +
" AS ?x");
- return new SelectionQuery (selected, triplets, null, "?x");
+ var q = new SelectionQuery (selected, triplets, null, "?x");
+ critical(q.to_string());
+ return q;
}
protected override SearchContainer create_container (string id,
diff --git a/src/plugins/tracker3/rygel-tracker-music.vala b/src/plugins/tracker3/rygel-tracker-music.vala
index dc81cf00..f0f9abb9 100644
--- a/src/plugins/tracker3/rygel-tracker-music.vala
+++ b/src/plugins/tracker3/rygel-tracker-music.vala
@@ -31,8 +31,8 @@ public class Rygel.Tracker.Music : CategoryContainer {
base (id, parent, title, new MusicItemFactory ());
this.add_child_container (new Artists (this));
- this.add_child_container (new Albums (this));
- this.add_child_container (new Genre (this));
+ //this.add_child_container (new Albums (this));
+ //this.add_child_container (new Genre (this));
this.search_classes.add (AudioItem.UPNP_CLASS);
this.search_classes.add (MusicItem.UPNP_CLASS);
this.add_create_class (AudioItem.UPNP_CLASS);
diff --git a/src/plugins/tracker3/rygel-tracker-new.vala b/src/plugins/tracker3/rygel-tracker-new.vala
index efabcc86..f2055b97 100644
--- a/src/plugins/tracker3/rygel-tracker-new.vala
+++ b/src/plugins/tracker3/rygel-tracker-new.vala
@@ -29,7 +29,6 @@ using Gee;
public class Rygel.Tracker.New : Rygel.Tracker.SearchContainer {
private const string ADDED_PREDICATE = "tracker:added";
private const string ADDED_VARIABLE = "?added";
- private const long THREE_DAYS_AS_SEC = 259200;
public New (MediaContainer parent, ItemFactory item_factory) {
var triplets = new QueryTriplets ();
@@ -42,11 +41,11 @@ public class Rygel.Tracker.New : Rygel.Tracker.SearchContainer {
ADDED_VARIABLE));
var now = new DateTime.now_utc ();
- now.add_days (-3);
+ now = now.add_days (-3);
var three_days_ago = "%sZ".printf (now.format ("%Y-%m-%dT%H:%M:%S"));
var filters = new ArrayList<string> ();
- filters.add (ADDED_VARIABLE + " > \"" + three_days_ago + "\"");
+ filters.add (ADDED_VARIABLE + " > \"" + three_days_ago + "\"^^xsd:dateTime");
base (parent.id + "New",
parent,
diff --git a/src/plugins/tracker3/rygel-tracker-plugin-factory.vala
b/src/plugins/tracker3/rygel-tracker-plugin-factory.vala
index e7c74c92..06f8149b 100644
--- a/src/plugins/tracker3/rygel-tracker-plugin-factory.vala
+++ b/src/plugins/tracker3/rygel-tracker-plugin-factory.vala
@@ -38,22 +38,11 @@ public void module_init (PluginLoader loader) {
}
public class Rygel.Tracker.PluginFactory {
- private const string TRACKER_SERVICE = "org.freedesktop.Tracker1";
- private const string STATISTICS_OBJECT =
- "/org/freedesktop/Tracker1/Statistics";
-
- StatsIface stats;
PluginLoader loader;
public PluginFactory (PluginLoader loader) throws IOError, DBusError {
- this.stats = Bus.get_proxy_sync (BusType.SESSION,
- TRACKER_SERVICE,
- STATISTICS_OBJECT,
- DBusProxyFlags.DO_NOT_LOAD_PROPERTIES);
this.loader = loader;
- this.stats.get ();
-
this.loader.add_plugin (new Tracker.Plugin ());
}
}
diff --git a/src/plugins/tracker3/rygel-tracker-plugin.vala b/src/plugins/tracker3/rygel-tracker-plugin.vala
index d01cb528..84a29369 100644
--- a/src/plugins/tracker3/rygel-tracker-plugin.vala
+++ b/src/plugins/tracker3/rygel-tracker-plugin.vala
@@ -21,9 +21,10 @@
*/
using Gee;
+using Tracker;
public class Rygel.Tracker.Plugin : Rygel.MediaServerPlugin {
- public const string NAME = "Tracker";
+ public const string NAME = "Tracker3";
private static RootContainer root;
diff --git a/src/plugins/tracker3/rygel-tracker-root-container.vala
b/src/plugins/tracker3/rygel-tracker-root-container.vala
index 88a7d3af..c5d3b25a 100644
--- a/src/plugins/tracker3/rygel-tracker-root-container.vala
+++ b/src/plugins/tracker3/rygel-tracker-root-container.vala
@@ -24,11 +24,24 @@
using GUPnP;
using Gee;
+using Tracker;
/**
* Represents the root container for Tracker media content hierarchy.
*/
public class Rygel.Tracker.RootContainer : Rygel.SimpleContainer {
+ private const string TRACKER_SERVICE = "org.freedesktop.Tracker3.Miner.Files";
+
+ public static Sparql.Connection connection;
+
+ static construct {
+ try {
+ RootContainer.connection = Sparql.Connection.bus_new (TRACKER_SERVICE, null);
+ } catch (Error err) {
+ error ("Failed to connect to tracker: %s", err.message);
+ }
+ }
+
public RootContainer (string title) {
base.root (title);
@@ -52,7 +65,7 @@ public class Rygel.Tracker.RootContainer : Rygel.SimpleContainer {
var config = MetaConfig.get_default ();
try {
- value = config.get_bool ("Tracker", key);
+ value = config.get_bool ("Tracker3", key);
} catch (GLib.Error error) {}
return value;
diff --git a/src/plugins/tracker3/rygel-tracker-search-container.vala
b/src/plugins/tracker3/rygel-tracker-search-container.vala
index 4310e090..965d8294 100644
--- a/src/plugins/tracker3/rygel-tracker-search-container.vala
+++ b/src/plugins/tracker3/rygel-tracker-search-container.vala
@@ -38,7 +38,9 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
public SelectionQuery query;
public ItemFactory item_factory;
- private Sparql.Connection resources;
+ static construct {
+ update_id_hash = new HashMap<string, uint> ();
+ }
private static HashMap<string, uint> update_id_hash;
@@ -50,10 +52,6 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
ArrayList<string>? filters = null) {
base (id, parent, title);
- if (unlikely (update_id_hash == null)) {
- update_id_hash = new HashMap<string, uint> ();
- }
-
if (update_id_hash.has_key (this.id)) {
this.update_id = update_id_hash[this.id];
}
@@ -80,6 +78,10 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
(SelectionQuery.ITEM_VARIABLE,
"a",
item_factory.category));
+ our_triplets.add (new QueryTriplet
+ (SelectionQuery.ITEM_VARIABLE,
+ "nie:isStoredAs",
+ SelectionQuery.STORAGE_VARIABLE));
var property_map = UPnPPropertyMap.get_property_map ();
foreach (var property in this.item_factory.properties) {
@@ -88,7 +90,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
var order_by = MODIFIED_PROPERTY +
"(" +
- SelectionQuery.ITEM_VARIABLE +
+ SelectionQuery.STORAGE_VARIABLE +
")";
this.query = new SelectionQuery (variables,
@@ -96,13 +98,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
filters,
order_by);
- try {
- this.resources = Sparql.Connection.bus_new ("org.freedesktop.Tracker3.Miner.Files", null);
-
- this.get_children_count.begin ();
- } catch (Error error) {
- critical (_("Failed to get Tracker connection: %s"), error.message);
- }
+ this.get_children_count.begin ();
}
public override async MediaObjects? get_children (uint offset,
@@ -140,7 +136,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
sort_criteria);
if (query != null) {
- yield query.execute (this.resources);
+ yield query.execute (RootContainer.connection);
/* Iterate through all items */
while (yield query.result.next_async ()) {
@@ -154,6 +150,8 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
query.result);
results.add (item);
}
+
+ query.result.close ();
}
total_matches = results.size;
@@ -217,13 +215,14 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
SelectionQuery.ITEM_VARIABLE +
") AS ?x");
- yield query.execute (this.resources);
+ yield query.execute (RootContainer.connection);
if (query.result.next ()) {
this.child_count = int.parse (query.result.get_string (0));
this.updated ();
}
+ query.result.close ();
} catch (GLib.Error error) {
critical (_("Error getting item count under category ā%sā: %s"),
this.item_factory.category,
@@ -284,10 +283,12 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
foreach (string s in sort_props) {
var key = key_chain_map[s.substring(1)];
- if (key.index_of (SelectionQuery.ITEM_VARIABLE) == 0) {
+ if (key.index_of (SelectionQuery.ITEM_VARIABLE) == 0 ||
+ key.index_of (SelectionQuery.STORAGE_VARIABLE) == 0) {
continue;
}
+
if (s.has_prefix("-")) {
order += "DESC (" +
key + ") ";
diff --git a/src/plugins/tracker3/rygel-tracker-selection-query.vala
b/src/plugins/tracker3/rygel-tracker-selection-query.vala
index 9a0f8282..7fd9c580 100644
--- a/src/plugins/tracker3/rygel-tracker-selection-query.vala
+++ b/src/plugins/tracker3/rygel-tracker-selection-query.vala
@@ -29,17 +29,19 @@ using Tracker;
*/
public class Rygel.Tracker.SelectionQuery : Query {
public const string ITEM_VARIABLE = "?item";
- private const string SHARED_FILTER = "(!BOUND(nmm:uPnPShared(" +
+ public const string STORAGE_VARIABLE = "?storage";
+
+ private const string SHARED_FILTER = ""; /*"(!BOUND(nmm:uPnPShared(" +
ITEM_VARIABLE + ")) ||" +
" nmm:uPnPShared(" +
ITEM_VARIABLE +
") = true) && " +
- "(BOUND(nie:url(" +
- ITEM_VARIABLE + ")))";
+ "(BOUND(nie:isStoredAs(" +
+ ITEM_VARIABLE + ")))";*/
private const string STRICT_SHARED_FILTER = "(BOUND(nmm:dlnaProfile(" +
ITEM_VARIABLE + ")))";
- private const string AVAILABLE_FILTER = "(tracker:available(" +
- ITEM_VARIABLE + ") = true)";
+ private const string AVAILABLE_FILTER = "(tracker:available(nie:isStoredAs(" +
+ ITEM_VARIABLE + ")) = true)";
private string uri_filter;
@@ -77,7 +79,7 @@ public class Rygel.Tracker.SelectionQuery : Query {
var config = MetaConfig.get_default ();
try {
- uris = config.get_string_list ("Tracker", "only-export-from");
+ uris = config.get_string_list ("Tracker3", "only-export-from");
} catch (Error error) {
uris = new ArrayList<string> ();
}
@@ -162,17 +164,17 @@ public class Rygel.Tracker.SelectionQuery : Query {
var filters = new ArrayList<string> ();
filters.add_all (this.filters);
// Make sure we don't expose items that are marked not to be shared
- filters.add (SHARED_FILTER);
+ // filters.add (SHARED_FILTER);
// Make sure we don't expose items on removable media that isn't
// mounted
- filters.add (AVAILABLE_FILTER);
+ //filters.add (AVAILABLE_FILTER);
// If strict sharing is enabled, only expose files that have a DLNA
// profile set
try {
var config = MetaConfig.get_default ();
- if (config.get_bool ("Tracker", "strict-sharing")) {
+ if (config.get_bool ("Tracker3", "strict-sharing")) {
filters.add (STRICT_SHARED_FILTER);
}
} catch (Error error) {};
diff --git a/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
b/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
index 7670b57c..298d0eea 100644
--- a/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
+++ b/src/plugins/tracker3/rygel-tracker-upnp-property-map.vala
@@ -23,6 +23,16 @@
using Gee;
+internal class Rygel.Tracker.QueryVariable {
+ public string base_variable;
+ public string alias;
+
+ public QueryVariable(string base_variable, string alias) {
+ this.base_variable = base_variable;
+ this.alias = alias;
+ }
+}
+
/**
* A map of UPnP properties to tracker property functions, coalesces,
* subqueries or other custom functions
@@ -30,6 +40,7 @@ using Gee;
public class Rygel.Tracker.UPnPPropertyMap : Object {
HashMap<string, ArrayList<string>> property_map;
HashMap<string, string> functions;
+ HashMap<string, QueryVariable> variables;
private static UPnPPropertyMap instance;
public static UPnPPropertyMap get_property_map () {
@@ -43,45 +54,84 @@ public class Rygel.Tracker.UPnPPropertyMap : Object {
private UPnPPropertyMap () {
this.property_map = new HashMap<string, ArrayList<string>> ();
this.functions = new HashMap<string, string> ();
+ this.variables = new HashMap<string, QueryVariable> ();
+
+ this.add_variable ("upnp:class", SelectionQuery.ITEM_VARIABLE, "?_cls");
// Item
this.add_key_chain ("res", "nie:url");
+ this.add_variable ("res", SelectionQuery.STORAGE_VARIABLE, "?_url");
this.add_function ("place_holder",
"tracker:coalesce((SELECT false WHERE { { %s a ?o } " +
"FILTER (?o IN (nfo:FileDataObject, " +
"nfo:RemoteDataObject)) }), true)");
+ this.add_variable ("place_holder", SelectionQuery.STORAGE_VARIABLE, "?_ph");
this.add_key_chain ("fileName", "nfo:fileName");
- this.add_alternative ("dc:title", "nie:title", "nfo:fileName");
+ this.add_variable ("fileName", SelectionQuery.STORAGE_VARIABLE, "?_fn");
+
+ this.add_alternative ("dc:title", "nie:title", "?_fn");
+ this.add_function ("dc:title", "tracker:coalesce(nie:title(%s), nfo:fileName(?storage))");
+ this.add_variable ("dc:title", SelectionQuery.ITEM_VARIABLE, "?_title");
+
this.add_key_chain ("dlnaProfile", "nmm:dlnaProfile");
+ this.add_variable ("dlnaProfile", SelectionQuery.ITEM_VARIABLE, "?_profile");
+
this.add_alternative ("mimeType", "nmm:dlnaMime", "nie:mimeType");
+ this.add_variable ("mimeType", SelectionQuery.ITEM_VARIABLE, "?_mime");
+
this.add_alternative ("res@size", "nfo:fileSize", "nie:byteSize");
- this.add_alternative ("date",
- "nie:contentCreated",
- "nfo:fileLastModified");
+ this.add_variable ("res@size", SelectionQuery.STORAGE_VARIABLE, "?_mime");
+
+ this.add_function ("date", "tracker:coalesce(nie:contentCreated(%s),
nfo:fileLastModified(?storage))");
+ this.add_variable ("date", SelectionQuery.ITEM_VARIABLE, "?_date");
// Music Item
this.add_key_chain ("res@duration", "nfo:duration");
+ this.add_variable ("res@duration", SelectionQuery.ITEM_VARIABLE, "?_duration");
+
this.add_key_chain ("upnp:artist", "nmm:performer", "nmm:artistName");
+ this.add_variable ("upnp:artist", SelectionQuery.ITEM_VARIABLE, "?_artist");
+
this.add_key_chain ("dc:creator", "nmm:performer", "nmm:artistName");
+ this.add_variable ("dc:creator", SelectionQuery.ITEM_VARIABLE, "?_artist");
+
this.add_key_chain ("upnp:album", "nmm:musicAlbum", "nie:title");
+ this.add_variable ("upnp:album", SelectionQuery.ITEM_VARIABLE, "?_album");
+
this.add_key_chain ("upnp:originalTrackNumber", "nmm:trackNumber");
+ this.add_variable ("upnp:originalTrackNumber", SelectionQuery.ITEM_VARIABLE, "?_track");
+
this.add_key_chain ("upnp:genre", "nfo:genre");
+ this.add_variable ("upnp:genre", SelectionQuery.ITEM_VARIABLE, "?_genre");
+
this.add_key_chain ("sampleRate", "nfo:sampleRate");
+ this.add_variable ("sampleRate", SelectionQuery.ITEM_VARIABLE, "?_rate");
+
this.add_key_chain ("upnp:nrAudioChannels", "nfo:channels");
+ this.add_variable ("upnp:nrAudioChannels", SelectionQuery.ITEM_VARIABLE, "?_channels");
+
this.add_key_chain ("upnp:bitsPerSample", "nfo:bitsPerSample");
+ this.add_variable ("upnp:bitsPerSample", SelectionQuery.ITEM_VARIABLE, "?_bps");
+
this.add_key_chain ("upnp:bitrate", "nfo:averageBitrate");
+ this.add_variable ("upnp:bitrate", SelectionQuery.ITEM_VARIABLE, "?_rate");
// Picture & Video Items
this.add_key_chain ("width", "nfo:width");
+ this.add_variable ("width", SelectionQuery.ITEM_VARIABLE, "?_w");
+
this.add_key_chain ("height", "nfo:height");
+ this.add_variable ("height", SelectionQuery.ITEM_VARIABLE, "?_h");
this.add_key_chain ("rygel:originalVolumeNumber",
"nmm:musicAlbumDisc",
"nmm:setNumber");
+ this.add_variable ("rygel:originalVolumeNumber", SelectionQuery.ITEM_VARIABLE, "?_vol");
}
public new string @get (string property) {
- var str = SelectionQuery.ITEM_VARIABLE;
+ var variable = this.variables[property];
+ var str = variable.base_variable;
if (this.property_map.has_key (property)) {
foreach (var key in this.property_map[property]) {
@@ -91,7 +141,11 @@ public class Rygel.Tracker.UPnPPropertyMap : Object {
str = this.functions[property].printf (str);
}
- return str;
+ return str; // + " AS " + variable.alias;
+ }
+
+ private void add_variable (string property, string base_item, string alias) {
+ this.variables[property] = new QueryVariable(base_item, alias);
}
private void add_key_chain (string property, ...) {
@@ -120,7 +174,11 @@ public class Rygel.Tracker.UPnPPropertyMap : Object {
string alternative = list.arg ();
while (alternative != null) {
- str.append_printf ("%s(%%1$s),", alternative);
+ if (alternative.has_prefix ("?")) {
+ str.append (alternative);
+ } else {
+ str.append_printf ("%s(%%1$s),", alternative);
+ }
alternative = list.arg ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]