From 822750e15431d3fcdcb8395f8aa636a24c511c9e Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Sat, 11 Mar 2023 19:24:03 +0100 Subject: all: Export disc number Fixes #223 --- data/rygel.conf | 4 ++++ doc/man/rygel.conf.xml | 8 +++++++ src/librygel-core/rygel-xml-utils.vala | 18 +++++++++++++++ src/librygel-server/rygel-music-item.vala | 27 ++++++++++++++++++++-- src/librygel-server/rygel-subtitle.vala | 14 +---------- .../rygel-media-export-media-cache.vala | 1 + .../tracker3/rygel-tracker-music-item-factory.vala | 7 ++++++ .../tracker3/rygel-tracker-selection-query.vala | 24 ++++++++++++------- 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/ This is the default policy that is used if no access control provider is found on the D-Bus. Use true to allow access from every peer, false to deny all access. If it is not specified, the default fall-back policy is true. + + + + + + Disabled by default. Use true to disable a set of features that improve compatibility with many clients, but break standard conformance + + 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 (); 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); -- cgit v1.2.1