[rygel] media-export: Add Playlist extractor



commit 7950ad8c226d8862002caf3966e781272da9d2b7
Author: Jens Georg <mail jensge org>
Date:   Fri May 13 16:05:59 2016 +0200

    media-export: Add Playlist extractor
    
    Signed-off-by: Jens Georg <mail jensge org>

 src/plugins/media-export/Makefile.am               |    1 +
 .../media-export/rygel-media-export-extract.vala   |    2 +-
 .../media-export/rygel-media-export-extractor.vala |    3 +-
 .../rygel-media-export-playlist-extractor.vala     |   48 ++++++++++++++++++++
 4 files changed, 52 insertions(+), 2 deletions(-)
---
diff --git a/src/plugins/media-export/Makefile.am b/src/plugins/media-export/Makefile.am
index 550d001..c681797 100644
--- a/src/plugins/media-export/Makefile.am
+++ b/src/plugins/media-export/Makefile.am
@@ -11,6 +11,7 @@ pkglibexec_PROGRAMS = mx-extract
 mx_extract_SOURCES = \
        rygel-media-export-extract.vala \
        rygel-media-export-dvd-parser.vala \
+       rygel-media-export-playlist-extractor.vala \
        rygel-media-export-extractor.vala \
        rygel-media-export-generic-extractor.vala
 
diff --git a/src/plugins/media-export/rygel-media-export-extract.vala 
b/src/plugins/media-export/rygel-media-export-extract.vala
index dbd6926..28ee4ea 100644
--- a/src/plugins/media-export/rygel-media-export-extract.vala
+++ b/src/plugins/media-export/rygel-media-export-extract.vala
@@ -90,7 +90,7 @@ async void run () {
                         } else if (!is_text) {
                             extractor = new GenericExtractor (file);
                         } else {
-                            extractor = new Extractor (file);
+                            extractor = new PlaylistExtractor (file);
                         }
                     } else {
                         extractor = new Extractor (file);
diff --git a/src/plugins/media-export/rygel-media-export-extractor.vala 
b/src/plugins/media-export/rygel-media-export-extractor.vala
index db487e5..e669cc0 100644
--- a/src/plugins/media-export/rygel-media-export-extractor.vala
+++ b/src/plugins/media-export/rygel-media-export-extractor.vala
@@ -21,7 +21,8 @@
  */
 
 public errordomain ExtractorError {
-    GENERAL
+    GENERAL,
+    INVALID
 }
 
 public class Rygel.MediaExport.Extractor : Object {
diff --git a/src/plugins/media-export/rygel-media-export-playlist-extractor.vala 
b/src/plugins/media-export/rygel-media-export-playlist-extractor.vala
new file mode 100644
index 0000000..59d40a8
--- /dev/null
+++ b/src/plugins/media-export/rygel-media-export-playlist-extractor.vala
@@ -0,0 +1,48 @@
+using GUPnP;
+
+internal class Rygel.MediaExport.PlaylistExtractor : Extractor {
+    public PlaylistExtractor (File file) {
+        GLib.Object (file: file);
+    }
+
+    public override async void run () throws Error {
+        uint8[] contents;
+
+        if (!yield file.load_contents_async (null, out contents, null)) {
+            throw new ExtractorError.INVALID ("Failed to read file");
+        }
+
+        /* Do some heuristic check if this file looks like XML */
+        var i = 0;
+        while (((char) contents[i]).isspace () && i < contents.length) {
+            i++;
+        }
+
+        if (contents[i] != '<') {
+            throw new ExtractorError.INVALID ("Not an XML file");
+        }
+
+        var didl_s = new MediaCollection.from_string ((string) contents);
+        var author = didl_s.author;
+        var title = didl_s.title;
+
+        if (author == null &&
+            title == null &&
+            didl_s.get_items () == null) {
+            throw new ExtractorError.INVALID ("Not a DIDL-Lite playlist");
+        }
+
+        if (title != null) {
+            this.serialized_info.insert ("Title", "s", title);
+        }
+
+        if (author != null) {
+            this.serialized_info.insert ("Creator", author);
+        }
+
+        this.serialized_info.insert ("DLNAProfile", "s", "DIDL_S");
+        this.serialized_info.insert ("UPnPClass",
+                                     "s",
+                                     UPNP_CLASS_PLAYLIST);
+    }
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]