summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2023-03-11 19:24:03 +0100
committerJens Georg <mail@jensge.org>2023-03-19 11:12:05 +0100
commit822750e15431d3fcdcb8395f8aa636a24c511c9e (patch)
tree607324a615a1039b0a501e59793839f55dcd5953
parenta80561d12b7e4779338d0df357b72980f3e19256 (diff)
downloadrygel-822750e15431d3fcdcb8395f8aa636a24c511c9e.tar.gz
all: Export disc number
Fixes #223
-rw-r--r--data/rygel.conf4
-rw-r--r--doc/man/rygel.conf.xml8
-rw-r--r--src/librygel-core/rygel-xml-utils.vala18
-rw-r--r--src/librygel-server/rygel-music-item.vala27
-rw-r--r--src/librygel-server/rygel-subtitle.vala14
-rw-r--r--src/plugins/media-export/rygel-media-export-media-cache.vala1
-rw-r--r--src/plugins/tracker3/rygel-tracker-music-item-factory.vala7
-rw-r--r--src/plugins/tracker3/rygel-tracker-selection-query.vala24
8 files changed, 80 insertions, 23 deletions
diff --git a/data/rygel.conf b/data/rygel.conf
index 15a5232e..807f3a86 100644
--- a/data/rygel.conf
+++ b/data/rygel.conf
@@ -63,6 +63,10 @@ allow-deletion=false
# found. Default is to true which will allow any peer to access anything.
acl-fallback-policy=true
+# If set to true, Rygel will disable various features that improve compatibility
+# with many clients, but break standard conformance
+strict-dlna=false
+
# Plugin specific sections
#
# Some options are generic and some are specific to each plugin.
diff --git a/doc/man/rygel.conf.xml b/doc/man/rygel.conf.xml
index 3427a5da..ea848454 100644
--- a/doc/man/rygel.conf.xml
+++ b/doc/man/rygel.conf.xml
@@ -234,6 +234,14 @@ man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
<para>This is the default policy that is used if no access control provider is found on the D-Bus. Use <userinput>true</userinput> to allow access from every peer, <userinput>false</userinput> to deny all access. If it is not specified, the default fall-back policy is <userinput>true</userinput>.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>
+ <option>strict-dlna</option>
+ </term>
+ <listitem>
+ <para>Disabled by default. Use <userinput>true</userinput> to disable a set of features that improve compatibility with many clients, but break standard conformance</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
<refsect1>
diff --git a/src/librygel-core/rygel-xml-utils.vala b/src/librygel-core/rygel-xml-utils.vala
index 75d7e79f..f347a271 100644
--- a/src/librygel-core/rygel-xml-utils.vala
+++ b/src/librygel-core/rygel-xml-utils.vala
@@ -27,6 +27,24 @@ using Xml;
* XML utility API.
*/
public class Rygel.XMLUtils {
+ public static Xml.Ns* get_namespace (Xml.Node *root, string href, string prefix) {
+
+ Xml.Ns* ns = root->new_ns (href, prefix);
+ if (ns != null) {
+ return ns;
+ }
+
+ // ns was null, so the namespace exists. Go find it.
+ ns = root->ns_def;
+ while (ns != null) {
+ if (ns->prefix == prefix) {
+ return ns;
+ }
+ }
+
+ assert_not_reached ();
+ }
+
/* Copy-paste from gupnp and ported to Vala. */
public static Xml.Node* get_element (Xml.Node *node, ...) {
Xml.Node *ret = node;
diff --git a/src/librygel-server/rygel-music-item.vala b/src/librygel-server/rygel-music-item.vala
index f2b87ae5..db60ecac 100644
--- a/src/librygel-server/rygel-music-item.vala
+++ b/src/librygel-server/rygel-music-item.vala
@@ -36,6 +36,7 @@ public class Rygel.MusicItem : AudioItem {
public new const string UPNP_CLASS = "object.item.audioItem.musicTrack";
public int track_number { get; set; default = -1; }
+ public int disc_number { get; set; default = -1; }
public Thumbnail album_art { get; set; }
@@ -76,8 +77,11 @@ public class Rygel.MusicItem : AudioItem {
switch (property) {
case "upnp:originalTrackNumber":
- return this.compare_int_props (this.track_number,
- item.track_number);
+ return this.compare_int_props (this.track_number,
+ item.track_number);
+ case "upnp:originalDiscNumber":
+ return this.compare_int_props (this.disc_number,
+ item.disc_number);
default:
return base.compare_by_property (item, property);
}
@@ -87,6 +91,7 @@ public class Rygel.MusicItem : AudioItem {
base.apply_didl_lite (didl_object);
this.track_number = didl_object.track_number;
+ //FIXME: this.disc_number = didl_object.disc_number;
if (didl_object.album_art != null && didl_object.album_art.length > 0) {
if (this.album_art == null)
@@ -103,6 +108,24 @@ public class Rygel.MusicItem : AudioItem {
if (this.track_number >= 0) {
didl_item.track_number = this.track_number;
+
+ // Hack for now, probably should move to gupnp-av
+ Xml.Node *node = didl_item.xml_node;
+ Xml.Ns *ns = null;
+
+ bool strict_sharing = false;
+
+ try {
+ strict_sharing = MetaConfig.get_default().get_bool ("general", "strict-dlna");
+ } catch (Error err) {}
+
+ if (strict_sharing) {
+ ns = XMLUtils.get_namespace(node, "http://www.rygel-project.org/ns/", "rygel");
+ } else {
+ ns = didl_item.get_upnp_namespace ();
+ }
+
+ node->new_child (ns, "originalDiscNumber", this.disc_number.to_string ());
}
if (!this.place_holder && this.album_art != null) {
diff --git a/src/librygel-server/rygel-subtitle.vala b/src/librygel-server/rygel-subtitle.vala
index 7b2ce5ea..a5aabe2b 100644
--- a/src/librygel-server/rygel-subtitle.vala
+++ b/src/librygel-server/rygel-subtitle.vala
@@ -47,19 +47,7 @@ public class Rygel.Subtitle {
Xml.Node *item_node = didl_item.xml_node;
Xml.Node *root_node = item_node->doc->get_root_element ();
- weak Xml.Ns sec_ns = root_node->new_ns ("http://www.sec.co.kr/", "sec");
- // sec_ns apparently already existed. Search for the namespace node
- if (sec_ns == null) {
- weak Xml.Ns it = root_node->ns_def;
- while (it != null) {
- if (it.prefix == "sec") {
- sec_ns = it;
-
- break;
- }
- it = it.next;
- }
- }
+ var sec_ns = XMLUtils.get_namespace (root_node, "http://www.sec.co.kr/", "sec");
Xml.Node *sec_node = item_node->new_child (sec_ns,
"CaptionInfoEx",
diff --git a/src/plugins/media-export/rygel-media-export-media-cache.vala b/src/plugins/media-export/rygel-media-export-media-cache.vala
index 7277f053..2544db66 100644
--- a/src/plugins/media-export/rygel-media-export-media-cache.vala
+++ b/src/plugins/media-export/rygel-media-export-media-cache.vala
@@ -991,6 +991,7 @@ public class Rygel.MediaExport.MediaCache : Object {
music_item.genre = statement.column_text (DetailColumn.GENRE);
music_item.track_number = statement.column_int
(DetailColumn.TRACK);
+ music_item.disc_number = statement.column_int (DetailColumn.DISC);
music_item.lookup_album_art ();
}
}
diff --git a/src/plugins/tracker3/rygel-tracker-music-item-factory.vala b/src/plugins/tracker3/rygel-tracker-music-item-factory.vala
index 6eca80e9..2e540430 100644
--- a/src/plugins/tracker3/rygel-tracker-music-item-factory.vala
+++ b/src/plugins/tracker3/rygel-tracker-music-item-factory.vala
@@ -41,6 +41,7 @@ public class Rygel.Tracker.MusicItemFactory : ItemFactory {
CHANNELS,
BITS_PER_SAMPLE,
BITRATE,
+ AUDIO_DISC_NUM,
LAST_KEY
}
@@ -70,6 +71,7 @@ public class Rygel.Tracker.MusicItemFactory : ItemFactory {
this.properties.add ("upnp:nrAudioChannels");
this.properties.add ("upnp:bitsPerSample");
this.properties.add ("upnp:bitrate");
+ this.properties.add ("rygel:originalVolumeNumber");
}
public override MediaFileItem create (string id,
@@ -125,6 +127,11 @@ public class Rygel.Tracker.MusicItemFactory : ItemFactory {
(MusicMetadata.AUDIO_TRACK_NUM);
}
+ if (metadata.is_bound (MusicMetadata.AUDIO_DISC_NUM)) {
+ music.disc_number = (int) metadata.get_integer
+ (MusicMetadata.AUDIO_DISC_NUM);
+ }
+
if (metadata.is_bound (MusicMetadata.AUDIO_ARTIST)) {
music.artist = metadata.get_string (MusicMetadata.AUDIO_ARTIST);
}
diff --git a/src/plugins/tracker3/rygel-tracker-selection-query.vala b/src/plugins/tracker3/rygel-tracker-selection-query.vala
index da7bef64..e4ec96b5 100644
--- a/src/plugins/tracker3/rygel-tracker-selection-query.vala
+++ b/src/plugins/tracker3/rygel-tracker-selection-query.vala
@@ -168,22 +168,30 @@ 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);
- // Make sure we don't expose items on removable media that isn't
- // mounted
- //filters.add (AVAILABLE_FILTER);
+ bool strict = false;
// If strict sharing is enabled, only expose files that have a DLNA
- // profile set
+ // profile set.
+ //
+ // Check global strict sharing first, the old option will override the
+ // global setting
try {
var config = MetaConfig.get_default ();
- if (config.get_bool ("Tracker3", "strict-sharing")) {
- filters.add (STRICT_SHARED_FILTER);
+ if (config.get_bool ("general", "strict-dlna")) {
+ strict = true;
}
} catch (Error error) {};
+ try {
+ var config = MetaConfig.get_default ();
+ strict = config.get_bool ("Tracker3", "strict-sharing");
+ } catch (Error error) {};
+
+ if (strict) {
+ filters.add (STRICT_SHARED_FILTER);
+ }
+
// Limit the files to a set of folders that may have been configured
if (uri_filter != null) {
filters.add (uri_filter);