diff options
author | Jens Georg <mail@jensge.org> | 2023-03-11 19:24:03 +0100 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2023-03-19 11:12:05 +0100 |
commit | 822750e15431d3fcdcb8395f8aa636a24c511c9e (patch) | |
tree | 607324a615a1039b0a501e59793839f55dcd5953 /src | |
parent | a80561d12b7e4779338d0df357b72980f3e19256 (diff) | |
download | rygel-822750e15431d3fcdcb8395f8aa636a24c511c9e.tar.gz |
all: Export disc number
Fixes #223
Diffstat (limited to 'src')
-rw-r--r-- | src/librygel-core/rygel-xml-utils.vala | 18 | ||||
-rw-r--r-- | src/librygel-server/rygel-music-item.vala | 27 | ||||
-rw-r--r-- | src/librygel-server/rygel-subtitle.vala | 14 | ||||
-rw-r--r-- | src/plugins/media-export/rygel-media-export-media-cache.vala | 1 | ||||
-rw-r--r-- | src/plugins/tracker3/rygel-tracker-music-item-factory.vala | 7 | ||||
-rw-r--r-- | src/plugins/tracker3/rygel-tracker-selection-query.vala | 24 |
6 files changed, 68 insertions, 23 deletions
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); |