[-]
[+]
|
Changed |
load-tags-from-stream-as-metadata.patch
|
@@ -1,15 +1,124 @@
-Listen for tag events
---- src/librygel-renderer-gst/rygel-playbin-player.vala Fri Jul 21 18:58:26 2017
-+++ src/librygel-renderer-gst/rygel-playbin-player.vala Thu Sep 21 12:38:09 2017
-@@ -563,6 +563,11 @@
- }
- }
- break;
-+
-+ case MessageType.TAG:
-+ Gst.TagList tag_list;
-+ debug ("taglist found\n");
-+ break;
- case MessageType.EOS:
- if (!this.is_rendering_image ()) {
- debug ("EOS");
+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 ()) {
|