Search
SailfishOS Open Build Service
>
Projects
>
home:wdehoog
>
rygel-test
> load-tags-from-stream-as-metadata.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File load-tags-from-stream-as-metadata.patch of Package rygel-test
Listen for tag events and add some to meta-data --- src/librygel-renderer-gst/rygel-playbin-player.vala Fri Jul 21 18:58:26 2017 +++ src/librygel-renderer-gst/rygel-playbin-player.vala Thu Oct 12 11:42:35 2017 @@ -510,6 +510,108 @@ structure.get_name () == "image/png"; } + // copied from rygel-player-controller.vala + /*protected string xml_escape (string input) { + var result = input.replace ("\"", """); + result = result.replace ("<", "<"); + result = result.replace (">", ">"); + result = result.replace ("'", "'"); + result = result.replace ("&", "&"); + + return result; + }*/ + + // copied from rygel-player-default-controller.vala + private const string DIDL_FRAME_TEMPLATE = "<DIDL-Lite " + + "xmlns:dc=\"http://purl.org/dc/elements/1.1/\" " + + "xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" " + + "xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\" " + + "xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\">" + + "%s</DIDL-Lite>"; + + private void modify_didl_for_new_tag (string title, string artist) { + DIDLLiteObject didl_object = null; + var didl_parser = new DIDLLiteParser (); + string class; + + if((title == null || title.length == 0) + && (artist == null || artist.length == 0)) + return; + + didl_parser.object_available.connect ((object) => { + didl_object = object; + }); + + try { + didl_parser.parse_didl (this.metadata); + } catch (Error parse_err) { + return; + } + + if (didl_object == null) + return; + + // only modify for internet radio stations + class = didl_object.get_upnp_class(); + if(class == null || class != "object.item.audioItem.audioBroadcast") + return; + + if(title != null && title.length > 0) + didl_object.title = title; + if(artist != null && artist.length > 0) + didl_object.artist = artist; + + //debug ("modify_didl_for_new_tag before: %s\n", this.metadata); + this.metadata = DIDL_FRAME_TEMPLATE.printf(didl_object.get_xml_string()); + //debug ("modify_didl_for_new_tag after: %s\n", this.metadata); + } + + private void handle_tags (Gst.TagList tag_list) { + int i,j,n; + string tag; + string value = ""; + string title = ""; + string artist = ""; + uint size, uintv; + + n = tag_list.n_tags(); + for(i=0;i<n;i++) { + tag = tag_list.nth_tag_name(i); + /*size = tag_list.get_tag_size(tag); + debug ("tag[%d]=%s of size %u\n", i, tag, size); + for(j=0;j<size;j++) { + if(tag_list.get_string_index (tag, j, out value)) + debug (" value[%d]=%s\n", j, value); + else if(tag_list.get_uint_index (tag, j, out uintv)) + debug (" value[%d]=%u\n", j, uintv); + }*/ + switch (tag) { + case "title": + case "organization": + case "genre": + case "audio-codec": + tag_list.get_string(tag, out value); + debug ("tag: %s = %s\n", tag, value); + break; + case "nominal-bitrate": + tag_list.get_uint(tag, out uintv); + debug ("tag: %s = %u\n", tag, uintv); + break; + default: + break; + } + switch (tag) { + case "title": + title = value; + break; + case "organization": + artist = value; + break; + } + } + modify_didl_for_new_tag(title, artist); + } + private void bus_handler (Gst.Bus bus, Message message) { switch (message.type) { @@ -562,6 +664,11 @@ this.playback_state = "PLAYING"; } } + break; + case MessageType.TAG: + Gst.TagList tag_list; + message.parse_tag (out tag_list); + handle_tags(tag_list); break; case MessageType.EOS: if (!this.is_rendering_image ()) {