From 0a8e4309b023e31c4368aee35552f9c45d850f52 Mon Sep 17 00:00:00 2001 From: Wito Chandra Date: Thu, 13 Sep 2018 01:35:13 +0700 Subject: [PATCH] support media:group --- lib/domain/media/category.dart | 24 ++++++++++++++++++++ lib/domain/media/credit.dart | 21 ++++++++++++++++++ lib/domain/media/group.dart | 40 ++++++++++++++++++++++++++++++++++ lib/domain/media/media.dart | 36 +++++++++++++++++++++++++----- lib/domain/media/rating.dart | 21 ++++++++++++++++++ lib/util/helpers.dart | 8 +++++++ test/rss_test.dart | 18 +++++++++++++++ test/xml/RSS-Media.xml | 24 ++++++++++++++++++++ 8 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 lib/domain/media/category.dart create mode 100644 lib/domain/media/credit.dart create mode 100644 lib/domain/media/group.dart create mode 100644 lib/domain/media/rating.dart diff --git a/lib/domain/media/category.dart b/lib/domain/media/category.dart new file mode 100644 index 0000000..4796cd7 --- /dev/null +++ b/lib/domain/media/category.dart @@ -0,0 +1,24 @@ +import 'package:xml/xml.dart'; + +class Category { + final String scheme; + final String label; + final String value; + + Category({ + this.scheme, + this.label, + this.value, + }); + + factory Category.parse(XmlElement element) { + if (element == null) { + return null; + } + return new Category( + scheme: element.getAttribute("scheme"), + label: element.getAttribute("label"), + value: element.text, + ); + } +} diff --git a/lib/domain/media/credit.dart b/lib/domain/media/credit.dart new file mode 100644 index 0000000..70a5e50 --- /dev/null +++ b/lib/domain/media/credit.dart @@ -0,0 +1,21 @@ +import 'package:xml/xml.dart'; + +class Credit { + final String role; + final String scheme; + final String value; + + Credit({ + this.role, + this.scheme, + this.value, + }); + + factory Credit.parse(XmlElement element) { + return new Credit( + role: element.getAttribute("role"), + scheme: element.getAttribute("scheme"), + value: element.text, + ); + } +} diff --git a/lib/domain/media/group.dart b/lib/domain/media/group.dart new file mode 100644 index 0000000..1a9a1cb --- /dev/null +++ b/lib/domain/media/group.dart @@ -0,0 +1,40 @@ +import 'package:webfeed/domain/media/category.dart'; +import 'package:webfeed/domain/media/content.dart'; +import 'package:webfeed/domain/media/credit.dart'; +import 'package:webfeed/domain/media/rating.dart'; +import 'package:webfeed/util/helpers.dart'; +import 'package:xml/xml.dart'; + +class Group { + final List contents; + final List credits; + final Category category; + final Rating rating; + + Group({ + this.contents, + this.credits, + this.category, + this.rating, + }); + + factory Group.parse(XmlElement element) { + if (element == null) { + return null; + } + return new Group( + contents: element.findElements("media:content").map((e) { + return new Content.parse(e); + }).toList(), + credits: element.findElements("media:credit").map((e) { + return new Credit.parse(e); + }).toList(), + category: new Category.parse( + findElementOrNull(element, "media:category"), + ), + rating: new Rating.parse( + findElementOrNull(element, "media:rating"), + ), + ); + } +} diff --git a/lib/domain/media/media.dart b/lib/domain/media/media.dart index fa23e0e..2815ec0 100644 --- a/lib/domain/media/media.dart +++ b/lib/domain/media/media.dart @@ -1,17 +1,43 @@ +import 'package:webfeed/domain/media/category.dart'; import 'package:webfeed/domain/media/content.dart'; +import 'package:webfeed/domain/media/credit.dart'; +import 'package:webfeed/domain/media/group.dart'; +import 'package:webfeed/domain/media/rating.dart'; +import 'package:webfeed/util/helpers.dart'; import 'package:xml/xml.dart'; class Media { + final Group group; final List contents; + final List credits; + final Category category; + final Rating rating; - Media({this.contents}); + Media({ + this.group, + this.contents, + this.credits, + this.category, + this.rating, + }); factory Media.parse(XmlElement element) { - var contents = element.findAllElements("media:content").map((e) { - return new Content.parse(e); - }).toList(); return new Media( - contents: contents, + group: new Group.parse( + findElementOrNull(element, "media:group"), + ), + contents: element.findElements("media:content").map((e) { + return new Content.parse(e); + }).toList(), + credits: element.findElements("media:credit").map((e) { + return new Credit.parse(e); + }).toList(), + category: new Category.parse( + findElementOrNull(element, "media:category"), + ), + rating: new Rating.parse( + findElementOrNull(element, "media:rating"), + ), ); } } diff --git a/lib/domain/media/rating.dart b/lib/domain/media/rating.dart new file mode 100644 index 0000000..77c2b12 --- /dev/null +++ b/lib/domain/media/rating.dart @@ -0,0 +1,21 @@ +import 'package:xml/xml.dart'; + +class Rating { + final String scheme; + final String value; + + Rating({ + this.scheme, + this.value, + }); + + factory Rating.parse(XmlElement element) { + if (element == null) { + return null; + } + return new Rating( + scheme: element.getAttribute("scheme"), + value: element.text, + ); + } +} diff --git a/lib/util/helpers.dart b/lib/util/helpers.dart index 53620d2..37c7710 100644 --- a/lib/util/helpers.dart +++ b/lib/util/helpers.dart @@ -2,6 +2,14 @@ import 'dart:core'; import 'package:xml/xml.dart'; +XmlElement findElementOrNull(XmlElement element, String name) { + try { + return element.findAllElements(name).first; + } on StateError { + return null; + } +} + String xmlGetString(XmlElement element, String name, {strict: true}) { try { return element.findElements(name).first.text; diff --git a/test/rss_test.dart b/test/rss_test.dart index b0b762c..bc59ea0 100644 --- a/test/rss_test.dart +++ b/test/rss_test.dart @@ -90,6 +90,11 @@ void main() { expect(item.link, "http://www.foo.com"); expect(item.pubDate, "Mon, 27 Aug 2001 16:08:56 PST"); + expect(item.media.group.contents.length, 5); + expect(item.media.group.credits.length, 2); + expect(item.media.group.category.value, "music/artist name/album/song"); + expect(item.media.group.rating.value, "nonadult"); + expect(item.media.contents.length, 2); var mediaContent = item.media.contents.first; expect(mediaContent.url, "http://www.foo.com/video.mov"); @@ -102,5 +107,18 @@ void main() { expect(mediaContent.framerate, 25); expect(mediaContent.samplingrate, 44.1); expect(mediaContent.channels, 2); + + expect(item.media.credits.length, 2); + var mediaCredit = item.media.credits.first; + expect(mediaCredit.role, "owner1"); + expect(mediaCredit.scheme, "urn:yvs"); + expect(mediaCredit.value, "copyright holder of the entity"); + + expect(item.media.category.scheme, "http://search.yahoo.com/mrss/category_ schema"); + expect(item.media.category.label, "Music"); + expect(item.media.category.value, "music/artist/album/song"); + + expect(item.media.rating.scheme, "urn:simple"); + expect(item.media.rating.value, "adult"); }); } diff --git a/test/xml/RSS-Media.xml b/test/xml/RSS-Media.xml index 0a16c59..db6da03 100644 --- a/test/xml/RSS-Media.xml +++ b/test/xml/RSS-Media.xml @@ -10,6 +10,30 @@ Mon, 27 Aug 2001 16:08:56 PST + copyright holder of the entity + copyright holder of the entity + music/artist/album/song + adult + + + + + + + band member 1 + band member 2 + music/artist name/album/song + nonadult +