| @@ -22,16 +22,21 @@ class AtomFeed { | |||||
| String rights; | String rights; | ||||
| String subtitle; | String subtitle; | ||||
| AtomFeed(this.id, this.title, this.updated, this.items, | |||||
| {this.links, | |||||
| this.authors, | |||||
| this.contributors, | |||||
| this.categories, | |||||
| this.generator, | |||||
| this.icon, | |||||
| this.logo, | |||||
| this.rights, | |||||
| this.subtitle}); | |||||
| AtomFeed({ | |||||
| this.id, | |||||
| this.title, | |||||
| this.updated, | |||||
| this.items, | |||||
| this.links, | |||||
| this.authors, | |||||
| this.contributors, | |||||
| this.categories, | |||||
| this.generator, | |||||
| this.icon, | |||||
| this.logo, | |||||
| this.rights, | |||||
| this.subtitle, | |||||
| }); | |||||
| factory AtomFeed.parse(String xmlString) { | factory AtomFeed.parse(String xmlString) { | ||||
| var document = parse(xmlString); | var document = parse(xmlString); | ||||
| @@ -41,9 +46,9 @@ class AtomFeed { | |||||
| } on StateError { | } on StateError { | ||||
| throw new ArgumentError("feed not found"); | throw new ArgumentError("feed not found"); | ||||
| } | } | ||||
| var id = xmlGetString(feedElement, "id"); | |||||
| var title = xmlGetString(feedElement, "title"); | |||||
| var updated = xmlGetString(feedElement, "updated"); | |||||
| var id = xmlGetString(feedElement, "id", strict: false); | |||||
| var title = xmlGetString(feedElement, "title", strict: false); | |||||
| var updated = xmlGetString(feedElement, "updated", strict: false); | |||||
| var items = feedElement.findElements("entry").map((element) { | var items = feedElement.findElements("entry").map((element) { | ||||
| return new AtomItem.parse(element); | return new AtomItem.parse(element); | ||||
| @@ -76,7 +81,11 @@ class AtomFeed { | |||||
| var rights = xmlGetString(feedElement, "rights", strict: false); | var rights = xmlGetString(feedElement, "rights", strict: false); | ||||
| var subtitle = xmlGetString(feedElement, "subtitle", strict: false); | var subtitle = xmlGetString(feedElement, "subtitle", strict: false); | ||||
| return new AtomFeed(id, title, updated, items, | |||||
| return new AtomFeed( | |||||
| id: id, | |||||
| title: title, | |||||
| updated: updated, | |||||
| items: items, | |||||
| links: links, | links: links, | ||||
| authors: authors, | authors: authors, | ||||
| contributors: contributors, | contributors: contributors, | ||||
| @@ -2,39 +2,46 @@ import 'package:webfeed/domain/atom_category.dart'; | |||||
| import 'package:webfeed/domain/atom_link.dart'; | import 'package:webfeed/domain/atom_link.dart'; | ||||
| import 'package:webfeed/domain/atom_person.dart'; | import 'package:webfeed/domain/atom_person.dart'; | ||||
| import 'package:webfeed/domain/atom_source.dart'; | import 'package:webfeed/domain/atom_source.dart'; | ||||
| import 'package:webfeed/domain/media/media.dart'; | |||||
| import 'package:webfeed/util/helpers.dart'; | import 'package:webfeed/util/helpers.dart'; | ||||
| import 'package:xml/xml.dart'; | import 'package:xml/xml.dart'; | ||||
| class AtomItem { | class AtomItem { | ||||
| String id; | |||||
| String title; | |||||
| String updated; | |||||
| final String id; | |||||
| final String title; | |||||
| final String updated; | |||||
| List<AtomPerson> authors; | |||||
| List<AtomLink> links; | |||||
| List<AtomCategory> categories; | |||||
| List<AtomPerson> contributors; | |||||
| AtomSource source; | |||||
| String published; | |||||
| String content; | |||||
| String summary; | |||||
| String rights; | |||||
| final List<AtomPerson> authors; | |||||
| final List<AtomLink> links; | |||||
| final List<AtomCategory> categories; | |||||
| final List<AtomPerson> contributors; | |||||
| final AtomSource source; | |||||
| final String published; | |||||
| final String content; | |||||
| final String summary; | |||||
| final String rights; | |||||
| final Media media; | |||||
| AtomItem(this.id, this.title, this.updated, | |||||
| {this.authors, | |||||
| this.links, | |||||
| this.categories, | |||||
| this.contributors, | |||||
| this.source, | |||||
| this.published, | |||||
| this.content, | |||||
| this.summary, | |||||
| this.rights}); | |||||
| AtomItem({ | |||||
| this.id, | |||||
| this.title, | |||||
| this.updated, | |||||
| this.authors, | |||||
| this.links, | |||||
| this.categories, | |||||
| this.contributors, | |||||
| this.source, | |||||
| this.published, | |||||
| this.content, | |||||
| this.summary, | |||||
| this.rights, | |||||
| this.media, | |||||
| }); | |||||
| factory AtomItem.parse(XmlElement element) { | factory AtomItem.parse(XmlElement element) { | ||||
| var id = xmlGetString(element, "id"); | |||||
| var title = xmlGetString(element, "title"); | |||||
| var updated = xmlGetString(element, "updated"); | |||||
| var id = xmlGetString(element, "id", strict: false); | |||||
| var title = xmlGetString(element, "title", strict: false); | |||||
| var updated = xmlGetString(element, "updated", strict: false); | |||||
| var authors = element.findElements("author").map((element) { | var authors = element.findElements("author").map((element) { | ||||
| return new AtomPerson.parse(element); | return new AtomPerson.parse(element); | ||||
| @@ -62,16 +69,21 @@ class AtomItem { | |||||
| var summary = xmlGetString(element, "summary", strict: false); | var summary = xmlGetString(element, "summary", strict: false); | ||||
| var rights = xmlGetString(element, "rights", strict: false); | var rights = xmlGetString(element, "rights", strict: false); | ||||
| return new AtomItem(id, title, updated, | |||||
| authors: authors, | |||||
| links: links, | |||||
| categories: categories, | |||||
| contributors: contributors, | |||||
| source: source, | |||||
| published: published, | |||||
| content: content, | |||||
| summary: summary, | |||||
| rights: rights); | |||||
| return new AtomItem( | |||||
| id: id, | |||||
| title: title, | |||||
| updated: updated, | |||||
| authors: authors, | |||||
| links: links, | |||||
| categories: categories, | |||||
| contributors: contributors, | |||||
| source: source, | |||||
| published: published, | |||||
| content: content, | |||||
| summary: summary, | |||||
| rights: rights, | |||||
| media: new Media.parse(element), | |||||
| ); | |||||
| } | } | ||||
| @override | @override | ||||
| @@ -0,0 +1,34 @@ | |||||
| import 'package:webfeed/domain/media/star_rating.dart'; | |||||
| import 'package:webfeed/domain/media/statistics.dart'; | |||||
| import 'package:webfeed/domain/media/tags.dart'; | |||||
| import 'package:webfeed/util/helpers.dart'; | |||||
| import 'package:xml/xml.dart'; | |||||
| class Community { | |||||
| final StarRating starRating; | |||||
| final Statistics statistics; | |||||
| final Tags tags; | |||||
| Community({ | |||||
| this.starRating, | |||||
| this.statistics, | |||||
| this.tags, | |||||
| }); | |||||
| factory Community.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Community( | |||||
| starRating: new StarRating.parse( | |||||
| findElementOrNull(element, "media:starRating"), | |||||
| ), | |||||
| statistics: new Statistics.parse( | |||||
| findElementOrNull(element, "media:statistics"), | |||||
| ), | |||||
| tags: new Tags.parse( | |||||
| findElementOrNull(element, "media:tags"), | |||||
| ), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Copyright { | |||||
| final String url; | |||||
| final String value; | |||||
| Copyright({ | |||||
| this.url, | |||||
| this.value, | |||||
| }); | |||||
| factory Copyright.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Copyright( | |||||
| url: element.getAttribute("url"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Description { | |||||
| final String type; | |||||
| final String value; | |||||
| Description({ | |||||
| this.type, | |||||
| this.value, | |||||
| }); | |||||
| factory Description.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Description( | |||||
| type: element.getAttribute("type"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,30 @@ | |||||
| import 'package:webfeed/domain/media/param.dart'; | |||||
| import 'package:xml/xml.dart'; | |||||
| class Embed { | |||||
| final String url; | |||||
| final int width; | |||||
| final int height; | |||||
| final List<Param> params; | |||||
| Embed({ | |||||
| this.url, | |||||
| this.width, | |||||
| this.height, | |||||
| this.params, | |||||
| }); | |||||
| factory Embed.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Embed( | |||||
| url: element.getAttribute("url"), | |||||
| width: int.tryParse(element.getAttribute("width") ?? "0"), | |||||
| height: int.tryParse(element.getAttribute("height") ?? "0"), | |||||
| params: element.findElements("media:param").map((e) { | |||||
| return new Param.parse(e); | |||||
| }).toList(), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Hash { | |||||
| final String algo; | |||||
| final String value; | |||||
| Hash({ | |||||
| this.algo, | |||||
| this.value, | |||||
| }); | |||||
| factory Hash.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Hash( | |||||
| algo: element.getAttribute("algo"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class License { | |||||
| final String type; | |||||
| final String href; | |||||
| final String value; | |||||
| License({ | |||||
| this.type, | |||||
| this.href, | |||||
| this.value, | |||||
| }); | |||||
| factory License.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new License( | |||||
| type: element.getAttribute("type"), | |||||
| href: element.getAttribute("href"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -1,8 +1,24 @@ | |||||
| import 'package:webfeed/domain/media/category.dart'; | import 'package:webfeed/domain/media/category.dart'; | ||||
| import 'package:webfeed/domain/media/community.dart'; | |||||
| import 'package:webfeed/domain/media/content.dart'; | import 'package:webfeed/domain/media/content.dart'; | ||||
| import 'package:webfeed/domain/media/copyright.dart'; | |||||
| import 'package:webfeed/domain/media/credit.dart'; | import 'package:webfeed/domain/media/credit.dart'; | ||||
| import 'package:webfeed/domain/media/description.dart'; | |||||
| import 'package:webfeed/domain/media/embed.dart'; | |||||
| import 'package:webfeed/domain/media/group.dart'; | import 'package:webfeed/domain/media/group.dart'; | ||||
| import 'package:webfeed/domain/media/hash.dart'; | |||||
| import 'package:webfeed/domain/media/license.dart'; | |||||
| import 'package:webfeed/domain/media/peer_link.dart'; | |||||
| import 'package:webfeed/domain/media/player.dart'; | |||||
| import 'package:webfeed/domain/media/price.dart'; | |||||
| import 'package:webfeed/domain/media/rating.dart'; | import 'package:webfeed/domain/media/rating.dart'; | ||||
| import 'package:webfeed/domain/media/restriction.dart'; | |||||
| import 'package:webfeed/domain/media/rights.dart'; | |||||
| import 'package:webfeed/domain/media/scene.dart'; | |||||
| import 'package:webfeed/domain/media/status.dart'; | |||||
| import 'package:webfeed/domain/media/text.dart'; | |||||
| import 'package:webfeed/domain/media/thumbnail.dart'; | |||||
| import 'package:webfeed/domain/media/title.dart'; | |||||
| import 'package:webfeed/util/helpers.dart'; | import 'package:webfeed/util/helpers.dart'; | ||||
| import 'package:xml/xml.dart'; | import 'package:xml/xml.dart'; | ||||
| @@ -12,6 +28,26 @@ class Media { | |||||
| final List<Credit> credits; | final List<Credit> credits; | ||||
| final Category category; | final Category category; | ||||
| final Rating rating; | final Rating rating; | ||||
| final Title title; | |||||
| final Description description; | |||||
| final String keywords; | |||||
| final List<Thumbnail> thumbnails; | |||||
| final Hash hash; | |||||
| final Player player; | |||||
| final Copyright copyright; | |||||
| final Text text; | |||||
| final Restriction restriction; | |||||
| final Community community; | |||||
| final List<String> comments; | |||||
| final Embed embed; | |||||
| final List<String> responses; | |||||
| final List<String> backLinks; | |||||
| final Status status; | |||||
| final List<Price> prices; | |||||
| final License license; | |||||
| final PeerLink peerLink; | |||||
| final Rights rights; | |||||
| final List<Scene> scenes; | |||||
| Media({ | Media({ | ||||
| this.group, | this.group, | ||||
| @@ -19,6 +55,26 @@ class Media { | |||||
| this.credits, | this.credits, | ||||
| this.category, | this.category, | ||||
| this.rating, | this.rating, | ||||
| this.title, | |||||
| this.description, | |||||
| this.keywords, | |||||
| this.thumbnails, | |||||
| this.hash, | |||||
| this.player, | |||||
| this.copyright, | |||||
| this.text, | |||||
| this.restriction, | |||||
| this.community, | |||||
| this.comments, | |||||
| this.embed, | |||||
| this.responses, | |||||
| this.backLinks, | |||||
| this.status, | |||||
| this.prices, | |||||
| this.license, | |||||
| this.peerLink, | |||||
| this.rights, | |||||
| this.scenes, | |||||
| }); | }); | ||||
| factory Media.parse(XmlElement element) { | factory Media.parse(XmlElement element) { | ||||
| @@ -38,6 +94,76 @@ class Media { | |||||
| rating: new Rating.parse( | rating: new Rating.parse( | ||||
| findElementOrNull(element, "media:rating"), | findElementOrNull(element, "media:rating"), | ||||
| ), | ), | ||||
| title: new Title.parse( | |||||
| findElementOrNull(element, "media:title"), | |||||
| ), | |||||
| description: new Description.parse( | |||||
| findElementOrNull(element, "media:description"), | |||||
| ), | |||||
| keywords: findElementOrNull(element, "media:keywords")?.text, | |||||
| thumbnails: element.findElements("media:thumbnail").map((e) { | |||||
| return new Thumbnail.parse(e); | |||||
| }).toList(), | |||||
| hash: new Hash.parse( | |||||
| findElementOrNull(element, "media:hash"), | |||||
| ), | |||||
| player: new Player.parse( | |||||
| findElementOrNull(element, "media:player"), | |||||
| ), | |||||
| copyright: new Copyright.parse( | |||||
| findElementOrNull(element, "media:copyright"), | |||||
| ), | |||||
| text: new Text.parse( | |||||
| findElementOrNull(element, "media:text"), | |||||
| ), | |||||
| restriction: new Restriction.parse( | |||||
| findElementOrNull(element, "media:restriction"), | |||||
| ), | |||||
| community: new Community.parse( | |||||
| findElementOrNull(element, "media:community"), | |||||
| ), | |||||
| comments: findElementOrNull(element, "media:comments") | |||||
| ?.findElements("media:comment") | |||||
| ?.map((e) { | |||||
| return e.text; | |||||
| })?.toList() ?? | |||||
| [], | |||||
| embed: new Embed.parse( | |||||
| findElementOrNull(element, "media:embed"), | |||||
| ), | |||||
| responses: findElementOrNull(element, "media:responses") | |||||
| ?.findElements("media:response") | |||||
| ?.map((e) { | |||||
| return e.text; | |||||
| })?.toList() ?? | |||||
| [], | |||||
| backLinks: findElementOrNull(element, "media:backLinks") | |||||
| ?.findElements("media:backLink") | |||||
| ?.map((e) { | |||||
| return e.text; | |||||
| })?.toList() ?? | |||||
| [], | |||||
| status: new Status.parse( | |||||
| findElementOrNull(element, "media:status"), | |||||
| ), | |||||
| prices: element.findElements("media:price").map((e) { | |||||
| return new Price.parse(e); | |||||
| }).toList(), | |||||
| license: new License.parse( | |||||
| findElementOrNull(element, "media:license"), | |||||
| ), | |||||
| peerLink: new PeerLink.parse( | |||||
| findElementOrNull(element, "media:peerLink"), | |||||
| ), | |||||
| rights: new Rights.parse( | |||||
| findElementOrNull(element, "media:rights"), | |||||
| ), | |||||
| scenes: findElementOrNull(element, "media:scenes") | |||||
| ?.findElements("media:scene") | |||||
| ?.map((e) { | |||||
| return new Scene.parse(e); | |||||
| })?.toList() ?? | |||||
| [], | |||||
| ); | ); | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Param { | |||||
| final String name; | |||||
| final String value; | |||||
| Param({ | |||||
| this.name, | |||||
| this.value, | |||||
| }); | |||||
| factory Param.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Param( | |||||
| name: element.getAttribute("name"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class PeerLink { | |||||
| final String type; | |||||
| final String href; | |||||
| final String value; | |||||
| PeerLink({ | |||||
| this.type, | |||||
| this.href, | |||||
| this.value, | |||||
| }); | |||||
| factory PeerLink.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new PeerLink( | |||||
| type: element.getAttribute("type"), | |||||
| href: element.getAttribute("href"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,27 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Player { | |||||
| final String url; | |||||
| final int width; | |||||
| final int height; | |||||
| final String value; | |||||
| Player({ | |||||
| this.url, | |||||
| this.width, | |||||
| this.height, | |||||
| this.value, | |||||
| }); | |||||
| factory Player.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Player( | |||||
| url: element.getAttribute("url"), | |||||
| width: int.tryParse(element.getAttribute("width") ?? "0"), | |||||
| height: int.tryParse(element.getAttribute("height") ?? "0"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Price { | |||||
| final double price; | |||||
| final String type; | |||||
| final String info; | |||||
| final String currency; | |||||
| Price({ | |||||
| this.price, | |||||
| this.type, | |||||
| this.info, | |||||
| this.currency, | |||||
| }); | |||||
| factory Price.parse(XmlElement element) { | |||||
| return new Price( | |||||
| price: double.tryParse(element.getAttribute("price") ?? "0"), | |||||
| type: element.getAttribute("type"), | |||||
| info: element.getAttribute("info"), | |||||
| currency: element.getAttribute("currency"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Restriction { | |||||
| final String relationship; | |||||
| final String type; | |||||
| final String value; | |||||
| Restriction({ | |||||
| this.relationship, | |||||
| this.type, | |||||
| this.value, | |||||
| }); | |||||
| factory Restriction.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Restriction( | |||||
| relationship: element.getAttribute("relationship"), | |||||
| type: element.getAttribute("type"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,18 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Rights { | |||||
| final String status; | |||||
| Rights({ | |||||
| this.status, | |||||
| }); | |||||
| factory Rights.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Rights( | |||||
| status: element.getAttribute("status"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| import 'package:webfeed/util/helpers.dart'; | |||||
| import 'package:xml/xml.dart'; | |||||
| class Scene { | |||||
| final String title; | |||||
| final String description; | |||||
| final String startTime; | |||||
| final String endTime; | |||||
| Scene({ | |||||
| this.title, | |||||
| this.description, | |||||
| this.startTime, | |||||
| this.endTime, | |||||
| }); | |||||
| factory Scene.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Scene( | |||||
| title: findElementOrNull(element, "sceneTitle")?.text, | |||||
| description: findElementOrNull(element, "sceneDescription")?.text, | |||||
| startTime: findElementOrNull(element, "sceneStartTime")?.text, | |||||
| endTime: findElementOrNull(element, "sceneEndTime")?.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class StarRating { | |||||
| final double average; | |||||
| final int count; | |||||
| final int min; | |||||
| final int max; | |||||
| StarRating({ | |||||
| this.average, | |||||
| this.count, | |||||
| this.min, | |||||
| this.max, | |||||
| }); | |||||
| factory StarRating.parse(XmlElement element) { | |||||
| return new StarRating( | |||||
| average: double.tryParse(element.getAttribute("average") ?? "0"), | |||||
| count: int.tryParse(element.getAttribute("count") ?? "0"), | |||||
| min: int.tryParse(element.getAttribute("min") ?? "0"), | |||||
| max: int.tryParse(element.getAttribute("max") ?? "0"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,18 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Statistics { | |||||
| final int views; | |||||
| final int favorites; | |||||
| Statistics({ | |||||
| this.views, | |||||
| this.favorites, | |||||
| }); | |||||
| factory Statistics.parse(XmlElement element) { | |||||
| return new Statistics( | |||||
| views: int.tryParse(element.getAttribute("views") ?? "0"), | |||||
| favorites: int.tryParse(element.getAttribute("favorites") ?? "0"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Status { | |||||
| final String state; | |||||
| final String reason; | |||||
| Status({ | |||||
| this.state, | |||||
| this.reason, | |||||
| }); | |||||
| factory Status.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Status( | |||||
| state: element.getAttribute("state"), | |||||
| reason: element.getAttribute("reason"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Tags { | |||||
| final String tags; | |||||
| final int weight; | |||||
| Tags({ | |||||
| this.tags, | |||||
| this.weight, | |||||
| }); | |||||
| factory Tags.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Tags( | |||||
| tags: element.text, | |||||
| weight: int.tryParse(element.getAttribute("weight") ?? "1"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,30 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Text { | |||||
| final String type; | |||||
| final String lang; | |||||
| final String start; | |||||
| final String end; | |||||
| final String value; | |||||
| Text({ | |||||
| this.type, | |||||
| this.lang, | |||||
| this.start, | |||||
| this.end, | |||||
| this.value, | |||||
| }); | |||||
| factory Text.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Text( | |||||
| type: element.getAttribute("type"), | |||||
| lang: element.getAttribute("lang"), | |||||
| start: element.getAttribute("start"), | |||||
| end: element.getAttribute("end"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Thumbnail { | |||||
| final String url; | |||||
| final String width; | |||||
| final String height; | |||||
| final String time; | |||||
| Thumbnail({ | |||||
| this.url, | |||||
| this.width, | |||||
| this.height, | |||||
| this.time, | |||||
| }); | |||||
| factory Thumbnail.parse(XmlElement element) { | |||||
| return new Thumbnail( | |||||
| url: element.getAttribute("url"), | |||||
| width: element.getAttribute("width"), | |||||
| height: element.getAttribute("height"), | |||||
| time: element.getAttribute("time"), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| import 'package:xml/xml.dart'; | |||||
| class Title { | |||||
| final String type; | |||||
| final String value; | |||||
| Title({ | |||||
| this.type, | |||||
| this.value, | |||||
| }); | |||||
| factory Title.parse(XmlElement element) { | |||||
| if (element == null) { | |||||
| return null; | |||||
| } | |||||
| return new Title( | |||||
| type: element.getAttribute("type"), | |||||
| value: element.text, | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -28,21 +28,26 @@ class RssFeed { | |||||
| final String webMaster; | final String webMaster; | ||||
| final int ttl; | final int ttl; | ||||
| RssFeed(this.title, this.description, this.link, this.items, | |||||
| {this.image, | |||||
| this.cloud, | |||||
| this.categories, | |||||
| this.skipDays, | |||||
| this.skipHours, | |||||
| this.lastBuildDate, | |||||
| this.language, | |||||
| this.generator, | |||||
| this.copyright, | |||||
| this.docs, | |||||
| this.managingEditor, | |||||
| this.rating, | |||||
| this.webMaster, | |||||
| this.ttl}); | |||||
| RssFeed({ | |||||
| this.title, | |||||
| this.description, | |||||
| this.link, | |||||
| this.items, | |||||
| this.image, | |||||
| this.cloud, | |||||
| this.categories, | |||||
| this.skipDays, | |||||
| this.skipHours, | |||||
| this.lastBuildDate, | |||||
| this.language, | |||||
| this.generator, | |||||
| this.copyright, | |||||
| this.docs, | |||||
| this.managingEditor, | |||||
| this.rating, | |||||
| this.webMaster, | |||||
| this.ttl, | |||||
| }); | |||||
| factory RssFeed.parse(String xmlString) { | factory RssFeed.parse(String xmlString) { | ||||
| var document = parse(xmlString); | var document = parse(xmlString); | ||||
| @@ -52,7 +57,7 @@ class RssFeed { | |||||
| } on StateError { | } on StateError { | ||||
| throw new ArgumentError("channel not found"); | throw new ArgumentError("channel not found"); | ||||
| } | } | ||||
| var title = xmlGetString(channelElement, "title"); | |||||
| var title = xmlGetString(channelElement, "title", strict: false); | |||||
| var description = | var description = | ||||
| xmlGetString(channelElement, "description", strict: false); | xmlGetString(channelElement, "description", strict: false); | ||||
| var link = xmlGetString(channelElement, "link", strict: false); | var link = xmlGetString(channelElement, "link", strict: false); | ||||
| @@ -106,21 +111,26 @@ class RssFeed { | |||||
| var webMaster = xmlGetString(channelElement, "webMaster", strict: false); | var webMaster = xmlGetString(channelElement, "webMaster", strict: false); | ||||
| var ttl = xmlGetInt(channelElement, "ttl", strict: false); | var ttl = xmlGetInt(channelElement, "ttl", strict: false); | ||||
| return new RssFeed(title, description, link, feeds, | |||||
| image: image, | |||||
| cloud: cloud, | |||||
| categories: categories, | |||||
| skipDays: skipDays, | |||||
| skipHours: skipHours, | |||||
| lastBuildDate: lastBuildDate, | |||||
| language: language, | |||||
| generator: generator, | |||||
| copyright: copyright, | |||||
| docs: docs, | |||||
| managingEditor: managingEditor, | |||||
| rating: rating, | |||||
| webMaster: webMaster, | |||||
| ttl: ttl); | |||||
| return new RssFeed( | |||||
| title: title, | |||||
| description: description, | |||||
| link: link, | |||||
| items: feeds, | |||||
| image: image, | |||||
| cloud: cloud, | |||||
| categories: categories, | |||||
| skipDays: skipDays, | |||||
| skipHours: skipHours, | |||||
| lastBuildDate: lastBuildDate, | |||||
| language: language, | |||||
| generator: generator, | |||||
| copyright: copyright, | |||||
| docs: docs, | |||||
| managingEditor: managingEditor, | |||||
| rating: rating, | |||||
| webMaster: webMaster, | |||||
| ttl: ttl, | |||||
| ); | |||||
| } | } | ||||
| @override | @override | ||||
| @@ -5,7 +5,7 @@ import 'package:test/test.dart'; | |||||
| import 'package:webfeed/webfeed.dart'; | import 'package:webfeed/webfeed.dart'; | ||||
| void main() { | void main() { | ||||
| test("parsing Invalid.xml", () { | |||||
| test("parse Invalid.xml", () { | |||||
| var xmlString = new File("test/xml/Invalid.xml").readAsStringSync(); | var xmlString = new File("test/xml/Invalid.xml").readAsStringSync(); | ||||
| try { | try { | ||||
| @@ -14,7 +14,7 @@ void main() { | |||||
| } on ArgumentError {} | } on ArgumentError {} | ||||
| }); | }); | ||||
| test("parsing Atom.xml", () { | |||||
| test("parse Atom.xml", () { | |||||
| var xmlString = new File("test/xml/Atom.xml").readAsStringSync(); | var xmlString = new File("test/xml/Atom.xml").readAsStringSync(); | ||||
| var feed = new AtomFeed.parse(xmlString); | var feed = new AtomFeed.parse(xmlString); | ||||
| @@ -88,4 +88,135 @@ void main() { | |||||
| expect(item.content, "This is content 1"); | expect(item.content, "This is content 1"); | ||||
| expect(item.rights, "This is rights 1"); | expect(item.rights, "This is rights 1"); | ||||
| }); | }); | ||||
| test("parse Atom-Media.xml", (){ | |||||
| var xmlString = new File("test/xml/Atom-Media.xml").readAsStringSync(); | |||||
| var feed = new AtomFeed.parse(xmlString); | |||||
| expect(feed.id, "foo-bar-id"); | |||||
| expect(feed.title, "Foo bar news"); | |||||
| expect(feed.updated, "2018-04-06T13:02:46Z"); | |||||
| expect(feed.items.length, 1); | |||||
| var item = feed.items.first; | |||||
| 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"); | |||||
| expect(mediaContent.type, "video/quicktime"); | |||||
| expect(mediaContent.fileSize, 2000); | |||||
| expect(mediaContent.medium, "video"); | |||||
| expect(mediaContent.isDefault, true); | |||||
| expect(mediaContent.expression, "full"); | |||||
| expect(mediaContent.bitrate, 128); | |||||
| 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"); | |||||
| expect(item.media.title.type, "plain"); | |||||
| expect(item.media.title.value, "The Judy's -- The Moo Song"); | |||||
| expect(item.media.description.type, "plain"); | |||||
| expect(item.media.description.value, "This was some really bizarre band I listened to as a young lad."); | |||||
| expect(item.media.keywords, "kitty, cat, big dog, yarn, fluffy"); | |||||
| expect(item.media.thumbnails.length, 2); | |||||
| var mediaThumbnail = item.media.thumbnails.first; | |||||
| expect(mediaThumbnail.url, "http://www.foo.com/keyframe1.jpg"); | |||||
| expect(mediaThumbnail.width, "75"); | |||||
| expect(mediaThumbnail.height, "50"); | |||||
| expect(mediaThumbnail.time, "12:05:01.123"); | |||||
| expect(item.media.hash.algo, "md5"); | |||||
| expect(item.media.hash.value, "dfdec888b72151965a34b4b59031290a"); | |||||
| expect(item.media.player.url, "http://www.foo.com/player?id=1111"); | |||||
| expect(item.media.player.width, 400); | |||||
| expect(item.media.player.height, 200); | |||||
| expect(item.media.player.value, ""); | |||||
| expect(item.media.copyright.url, "http://blah.com/additional-info.html"); | |||||
| expect(item.media.copyright.value, "2005 FooBar Media"); | |||||
| expect(item.media.text.type, "plain"); | |||||
| expect(item.media.text.lang, "en"); | |||||
| expect(item.media.text.start, "00:00:03.000"); | |||||
| expect(item.media.text.end, "00:00:10.000"); | |||||
| expect(item.media.text.value, " Oh, say, can you see"); | |||||
| expect(item.media.restriction.relationship, "allow"); | |||||
| expect(item.media.restriction.type, "country"); | |||||
| expect(item.media.restriction.value, "au us"); | |||||
| expect(item.media.community.starRating.average, 3.5); | |||||
| expect(item.media.community.starRating.count, 20); | |||||
| expect(item.media.community.starRating.min, 1); | |||||
| expect(item.media.community.starRating.max, 10); | |||||
| expect(item.media.community.statistics.views, 5); | |||||
| expect(item.media.community.statistics.favorites, 4); | |||||
| expect(item.media.community.tags.tags, "news: 5, abc:3"); | |||||
| expect(item.media.community.tags.weight, 1); | |||||
| expect(item.media.comments.length, 2); | |||||
| expect(item.media.comments.first, "comment1"); | |||||
| expect(item.media.comments.last, "comment2"); | |||||
| expect(item.media.embed.url, "http://www.foo.com/player.swf"); | |||||
| expect(item.media.embed.width, 512); | |||||
| expect(item.media.embed.height, 323); | |||||
| expect(item.media.embed.params.length, 5); | |||||
| expect(item.media.embed.params.first.name, "type"); | |||||
| expect(item.media.embed.params.first.value, "application/x-shockwave-flash"); | |||||
| expect(item.media.responses.length, 2); | |||||
| expect(item.media.responses.first, "http://www.response1.com"); | |||||
| expect(item.media.responses.last, "http://www.response2.com"); | |||||
| expect(item.media.backLinks.length, 2); | |||||
| expect(item.media.backLinks.first, "http://www.backlink1.com"); | |||||
| expect(item.media.backLinks.last, "http://www.backlink2.com"); | |||||
| expect(item.media.status.state, "active"); | |||||
| expect(item.media.status.reason, null); | |||||
| expect(item.media.prices.length, 2); | |||||
| expect(item.media.prices.first.price, 19.99); | |||||
| expect(item.media.prices.first.type, "rent"); | |||||
| expect(item.media.prices.first.info, "http://www.dummy.jp/package_info.html"); | |||||
| expect(item.media.prices.first.currency, "EUR"); | |||||
| expect(item.media.license.type, "text/html"); | |||||
| expect(item.media.license.href, "http://www.licensehost.com/license"); | |||||
| expect(item.media.license.value, " Sample license for a video"); | |||||
| expect(item.media.peerLink.type, "application/x-bittorrent"); | |||||
| expect(item.media.peerLink.href, "http://www.foo.org/sampleFile.torrent"); | |||||
| expect(item.media.peerLink.value, ""); | |||||
| expect(item.media.rights.status, "official"); | |||||
| expect(item.media.scenes.length, 2); | |||||
| expect(item.media.scenes.first.title, "sceneTitle1"); | |||||
| expect(item.media.scenes.first.description, "sceneDesc1"); | |||||
| expect(item.media.scenes.first.startTime, "00:15"); | |||||
| expect(item.media.scenes.first.endTime, "00:45"); | |||||
| }); | |||||
| } | } | ||||
| @@ -5,7 +5,7 @@ import 'package:test/test.dart'; | |||||
| import 'package:webfeed/webfeed.dart'; | import 'package:webfeed/webfeed.dart'; | ||||
| void main() { | void main() { | ||||
| test("parsing Invalid.xml", () { | |||||
| test("parse Invalid.xml", () { | |||||
| var xmlString = new File("test/xml/Invalid.xml").readAsStringSync(); | var xmlString = new File("test/xml/Invalid.xml").readAsStringSync(); | ||||
| try { | try { | ||||
| @@ -13,7 +13,7 @@ void main() { | |||||
| fail("Should throw Argument Error"); | fail("Should throw Argument Error"); | ||||
| } on ArgumentError {} | } on ArgumentError {} | ||||
| }); | }); | ||||
| test("parsing RSS.xml", () { | |||||
| test("parse RSS.xml", () { | |||||
| var xmlString = new File("test/xml/RSS.xml").readAsStringSync(); | var xmlString = new File("test/xml/RSS.xml").readAsStringSync(); | ||||
| var feed = new RssFeed.parse(xmlString); | var feed = new RssFeed.parse(xmlString); | ||||
| @@ -76,7 +76,7 @@ void main() { | |||||
| expect(feed.items.first.content.value, "<img width=\"1000\" height=\"690\" src=\"https://test.com/image_link\"/> Test content<br />"); | expect(feed.items.first.content.value, "<img width=\"1000\" height=\"690\" src=\"https://test.com/image_link\"/> Test content<br />"); | ||||
| expect(feed.items.first.content.images.first, "https://test.com/image_link"); | expect(feed.items.first.content.images.first, "https://test.com/image_link"); | ||||
| }); | }); | ||||
| test("parsing RSS-Media.xml", (){ | |||||
| test("parse RSS-Media.xml", (){ | |||||
| var xmlString = new File("test/xml/RSS-Media.xml").readAsStringSync(); | var xmlString = new File("test/xml/RSS-Media.xml").readAsStringSync(); | ||||
| var feed = new RssFeed.parse(xmlString); | var feed = new RssFeed.parse(xmlString); | ||||
| @@ -120,5 +120,94 @@ void main() { | |||||
| expect(item.media.rating.scheme, "urn:simple"); | expect(item.media.rating.scheme, "urn:simple"); | ||||
| expect(item.media.rating.value, "adult"); | expect(item.media.rating.value, "adult"); | ||||
| expect(item.media.title.type, "plain"); | |||||
| expect(item.media.title.value, "The Judy's -- The Moo Song"); | |||||
| expect(item.media.description.type, "plain"); | |||||
| expect(item.media.description.value, "This was some really bizarre band I listened to as a young lad."); | |||||
| expect(item.media.keywords, "kitty, cat, big dog, yarn, fluffy"); | |||||
| expect(item.media.thumbnails.length, 2); | |||||
| var mediaThumbnail = item.media.thumbnails.first; | |||||
| expect(mediaThumbnail.url, "http://www.foo.com/keyframe1.jpg"); | |||||
| expect(mediaThumbnail.width, "75"); | |||||
| expect(mediaThumbnail.height, "50"); | |||||
| expect(mediaThumbnail.time, "12:05:01.123"); | |||||
| expect(item.media.hash.algo, "md5"); | |||||
| expect(item.media.hash.value, "dfdec888b72151965a34b4b59031290a"); | |||||
| expect(item.media.player.url, "http://www.foo.com/player?id=1111"); | |||||
| expect(item.media.player.width, 400); | |||||
| expect(item.media.player.height, 200); | |||||
| expect(item.media.player.value, ""); | |||||
| expect(item.media.copyright.url, "http://blah.com/additional-info.html"); | |||||
| expect(item.media.copyright.value, "2005 FooBar Media"); | |||||
| expect(item.media.text.type, "plain"); | |||||
| expect(item.media.text.lang, "en"); | |||||
| expect(item.media.text.start, "00:00:03.000"); | |||||
| expect(item.media.text.end, "00:00:10.000"); | |||||
| expect(item.media.text.value, " Oh, say, can you see"); | |||||
| expect(item.media.restriction.relationship, "allow"); | |||||
| expect(item.media.restriction.type, "country"); | |||||
| expect(item.media.restriction.value, "au us"); | |||||
| expect(item.media.community.starRating.average, 3.5); | |||||
| expect(item.media.community.starRating.count, 20); | |||||
| expect(item.media.community.starRating.min, 1); | |||||
| expect(item.media.community.starRating.max, 10); | |||||
| expect(item.media.community.statistics.views, 5); | |||||
| expect(item.media.community.statistics.favorites, 4); | |||||
| expect(item.media.community.tags.tags, "news: 5, abc:3"); | |||||
| expect(item.media.community.tags.weight, 1); | |||||
| expect(item.media.comments.length, 2); | |||||
| expect(item.media.comments.first, "comment1"); | |||||
| expect(item.media.comments.last, "comment2"); | |||||
| expect(item.media.embed.url, "http://www.foo.com/player.swf"); | |||||
| expect(item.media.embed.width, 512); | |||||
| expect(item.media.embed.height, 323); | |||||
| expect(item.media.embed.params.length, 5); | |||||
| expect(item.media.embed.params.first.name, "type"); | |||||
| expect(item.media.embed.params.first.value, "application/x-shockwave-flash"); | |||||
| expect(item.media.responses.length, 2); | |||||
| expect(item.media.responses.first, "http://www.response1.com"); | |||||
| expect(item.media.responses.last, "http://www.response2.com"); | |||||
| expect(item.media.backLinks.length, 2); | |||||
| expect(item.media.backLinks.first, "http://www.backlink1.com"); | |||||
| expect(item.media.backLinks.last, "http://www.backlink2.com"); | |||||
| expect(item.media.status.state, "active"); | |||||
| expect(item.media.status.reason, null); | |||||
| expect(item.media.prices.length, 2); | |||||
| expect(item.media.prices.first.price, 19.99); | |||||
| expect(item.media.prices.first.type, "rent"); | |||||
| expect(item.media.prices.first.info, "http://www.dummy.jp/package_info.html"); | |||||
| expect(item.media.prices.first.currency, "EUR"); | |||||
| expect(item.media.license.type, "text/html"); | |||||
| expect(item.media.license.href, "http://www.licensehost.com/license"); | |||||
| expect(item.media.license.value, " Sample license for a video"); | |||||
| expect(item.media.peerLink.type, "application/x-bittorrent"); | |||||
| expect(item.media.peerLink.href, "http://www.foo.org/sampleFile.torrent"); | |||||
| expect(item.media.peerLink.value, ""); | |||||
| expect(item.media.rights.status, "official"); | |||||
| expect(item.media.scenes.length, 2); | |||||
| expect(item.media.scenes.first.title, "sceneTitle1"); | |||||
| expect(item.media.scenes.first.description, "sceneDesc1"); | |||||
| expect(item.media.scenes.first.startTime, "00:15"); | |||||
| expect(item.media.scenes.first.endTime, "00:45"); | |||||
| }); | }); | ||||
| } | } | ||||
| @@ -0,0 +1,118 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <feed xmlns="http://www.w3.org/2005/Atom"> | |||||
| <id>foo-bar-id</id> | |||||
| <title type="text">Foo bar news</title> | |||||
| <updated>2018-04-06T13:02:46Z</updated> | |||||
| <link rel="foo" type="text/html" hreflang="en" href="http://foo.bar.news/" title="Foo bar news html" length="1000"/> | |||||
| <link rel="bar" type="application/atom+xml" hreflang="pt" href="http://foo.bar.news/feed.atom" title="Foo bar news atom" length="100"/> | |||||
| <author> | |||||
| <name>Alice</name> | |||||
| <uri>http://foo.bar.news/people/alice</uri> | |||||
| <email>alice@foo.bar.news</email> | |||||
| </author> | |||||
| <author> | |||||
| <name>Bob</name> | |||||
| <uri>http://foo.bar.news/people/bob</uri> | |||||
| <email>bob@foo.bar.news</email> | |||||
| </author> | |||||
| <contributor> | |||||
| <name>Charlie</name> | |||||
| <uri>http://foo.bar.news/people/charlie</uri> | |||||
| <email>charlie@foo.bar.news</email> | |||||
| </contributor> | |||||
| <contributor> | |||||
| <name>David</name> | |||||
| <uri>http://foo.bar.news/people/david</uri> | |||||
| <email>david@foo.bar.news</email> | |||||
| </contributor> | |||||
| <category term="foo category" scheme="this-is-foo-scheme" label="this is foo label"/> | |||||
| <category term="bar category" scheme="this-is-bar-scheme" label="this is bar label"/> | |||||
| <generator uri="http://foo.bar.news/generator" version="1.0">Foo bar generator</generator> | |||||
| <icon>http://foo.bar.news/icon.png</icon> | |||||
| <logo>http://foo.bar.news/logo.png</logo> | |||||
| <subtitle>This is subtitle</subtitle> | |||||
| <entry> | |||||
| <id>foo-bar-entry-id-1</id> | |||||
| <title>Foo bar item 1</title> | |||||
| <media:content url="http://www.foo.com/video.mov" fileSize="2000" medium="video" isDefault="true" expression="full" bitrate="128" framerate="25" samplingrate="44.1" channels="2" type="video/quicktime" /> | |||||
| <media:content url="http://www.foo.com/video2.mov" fileSize="2000" bitrate="128" type="video/quicktime" expression="full" /> | |||||
| <media:credit role="owner1" scheme="urn:yvs">copyright holder of the entity</media:credit> | |||||
| <media:credit role="owner2" scheme="urn:yvs">copyright holder of the entity</media:credit> | |||||
| <media:category scheme="http://search.yahoo.com/mrss/category_ schema" label="Music">music/artist/album/song</media:category> | |||||
| <media:rating scheme="urn:simple">adult</media:rating> | |||||
| <media:group> | |||||
| <media:content url="http://www.foo.com/song64kbps.mp3" fileSize="1000" bitrate="64" type="audio/mpeg" isDefault="true" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song128kbps.mp3" fileSize="2000" bitrate="128" type="audio/mpeg" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song256kbps.mp3" fileSize="4000" bitrate="256" type="audio/mpeg" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song512kbps.mp3.torrent" fileSize="8000" type="application/x-bittorrent;enclosed=audio/mpeg" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song.wav" fileSize="16000" type="audio/x-wav" expression="full" /> | |||||
| <media:credit role="musician">band member 1</media:credit> | |||||
| <media:credit role="musician">band member 2</media:credit> | |||||
| <media:category>music/artist name/album/song</media:category> | |||||
| <media:rating>nonadult</media:rating> | |||||
| </media:group> | |||||
| <media:title type="plain">The Judy's -- The Moo Song</media:title> | |||||
| <media:description type="plain">This was some really bizarre band I listened to as a young lad.</media:description> | |||||
| <media:keywords>kitty, cat, big dog, yarn, fluffy</media:keywords> | |||||
| <media:thumbnail url="http://www.foo.com/keyframe1.jpg" width="75" height="50" time="12:05:01.123" /> | |||||
| <media:thumbnail url="http://www.foo.com/keyframe2.jpg" width="150" height="100" time="12:05:01.125" /> | |||||
| <media:hash algo="md5">dfdec888b72151965a34b4b59031290a</media:hash> | |||||
| <media:player url="http://www.foo.com/player?id=1111" height="200" width="400" /> | |||||
| <media:copyright url="http://blah.com/additional-info.html">2005 FooBar Media</media:copyright> | |||||
| <media:text type="plain" lang="en" start="00:00:03.000" end="00:00:10.000"> Oh, say, can you see</media:text> | |||||
| <media:restriction relationship="allow" type="country">au us</media:restriction> | |||||
| <media:community> | |||||
| <media:starRating average="3.5" count="20" min="1" max="10" /> | |||||
| <media:statistics views="5" favorites="4" /> | |||||
| <media:tags>news: 5, abc:3</media:tags> | |||||
| </media:community> | |||||
| <media:comments> | |||||
| <media:comment>comment1</media:comment> | |||||
| <media:comment>comment2</media:comment> | |||||
| </media:comments> | |||||
| <media:embed url="http://www.foo.com/player.swf" width="512" height="323"> | |||||
| <media:param name="type">application/x-shockwave-flash</media:param> | |||||
| <media:param name="width">512</media:param> | |||||
| <media:param name="height">323</media:param> | |||||
| <media:param name="allowFullScreen">true</media:param> | |||||
| <media:param name="flashVars"> id=12345&vid=678912i&lang=en-us&intl=us&thumbUrl=http://www.foo.com/thumbnail.jpg | |||||
| </media:param> | |||||
| </media:embed> | |||||
| <media:responses> | |||||
| <media:response>http://www.response1.com</media:response> | |||||
| <media:response>http://www.response2.com</media:response> | |||||
| </media:responses> | |||||
| <media:backLinks> | |||||
| <media:backLink>http://www.backlink1.com</media:backLink> | |||||
| <media:backLink>http://www.backlink2.com</media:backLink> | |||||
| </media:backLinks> | |||||
| <media:status state="active" /> | |||||
| <media:price type="rent" price="19.99" info="http://www.dummy.jp/package_info.html" currency="EUR" /> | |||||
| <media:price type="buy" price="39.99" currency="EUR" /> | |||||
| <media:license type="text/html" href="http://www.licensehost.com/license"> Sample license for a video</media:license> | |||||
| <media:subTitle type="application/smil" lang="en-us" href="http://www.foo.org/subtitle.smil" /> | |||||
| <media:peerLink type="application/x-bittorrent" href="http://www.foo.org/sampleFile.torrent" /> | |||||
| <media:location description="My house" start="00:01" end="01:00"> | |||||
| <georss:where> | |||||
| <gml:Point> | |||||
| <gml:pos>35.669998 139.770004</gml:pos> | |||||
| </gml:Point> | |||||
| </georss:where> | |||||
| </media:location> | |||||
| <media:rights status="official" /> | |||||
| <media:scenes> | |||||
| <media:scene> | |||||
| <sceneTitle>sceneTitle1</sceneTitle> | |||||
| <sceneDescription>sceneDesc1</sceneDescription> | |||||
| <sceneStartTime>00:15</sceneStartTime> | |||||
| <sceneEndTime>00:45</sceneEndTime> | |||||
| </media:scene> | |||||
| <media:scene> | |||||
| <sceneTitle>sceneTitle2</sceneTitle> | |||||
| <sceneDescription>sceneDesc2</sceneDescription> | |||||
| <sceneStartTime>00:15</sceneStartTime> | |||||
| <sceneEndTime>00:55</sceneEndTime> | |||||
| </media:scene> | |||||
| </media:scenes> | |||||
| </entry> | |||||
| </feed> | |||||
| @@ -1,5 +1,6 @@ | |||||
| <rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" | |||||
| xmlns:georss="http://www.georss.org/georss" | |||||
| <rss version="2.0" | |||||
| xmlns:media="http://search.yahoo.com/mrss/" | |||||
| xmlns:georss="http://www.georss.org/georss" | |||||
| xmlns:gml="http://www.opengis.net/gml"> | xmlns:gml="http://www.opengis.net/gml"> | ||||
| <channel> | <channel> | ||||
| @@ -15,28 +16,29 @@ | |||||
| <media:category scheme="http://search.yahoo.com/mrss/category_ schema" label="Music">music/artist/album/song</media:category> | <media:category scheme="http://search.yahoo.com/mrss/category_ schema" label="Music">music/artist/album/song</media:category> | ||||
| <media:rating scheme="urn:simple">adult</media:rating> | <media:rating scheme="urn:simple">adult</media:rating> | ||||
| <media:group> | <media:group> | ||||
| <media:content url="http://www.foo.com/song64kbps.mp3" | |||||
| fileSize="1000" bitrate="64" type="audio/mpeg" | |||||
| isDefault="true" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song128kbps.mp3" | |||||
| fileSize="2000" bitrate="128" type="audio/mpeg" | |||||
| expression="full" /> | |||||
| <media:content url="http://www.foo.com/song256kbps.mp3" | |||||
| fileSize="4000" bitrate="256" type="audio/mpeg" | |||||
| expression="full" /> | |||||
| <media:content url="http://www.foo.com/song512kbps.mp3.torrent" | |||||
| fileSize="8000" type="application/x-bittorrent;enclosed=audio/mpeg" | |||||
| expression="full" /> | |||||
| <media:content url="http://www.foo.com/song.wav" | |||||
| fileSize="16000" type="audio/x-wav" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song64kbps.mp3" fileSize="1000" bitrate="64" type="audio/mpeg" isDefault="true" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song128kbps.mp3" fileSize="2000" bitrate="128" type="audio/mpeg" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song256kbps.mp3" fileSize="4000" bitrate="256" type="audio/mpeg" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song512kbps.mp3.torrent" fileSize="8000" type="application/x-bittorrent;enclosed=audio/mpeg" expression="full" /> | |||||
| <media:content url="http://www.foo.com/song.wav" fileSize="16000" type="audio/x-wav" expression="full" /> | |||||
| <media:credit role="musician">band member 1</media:credit> | <media:credit role="musician">band member 1</media:credit> | ||||
| <media:credit role="musician">band member 2</media:credit> | <media:credit role="musician">band member 2</media:credit> | ||||
| <media:category>music/artist name/album/song</media:category> | <media:category>music/artist name/album/song</media:category> | ||||
| <media:rating>nonadult</media:rating> | <media:rating>nonadult</media:rating> | ||||
| </media:group> | </media:group> | ||||
| <media:title type="plain">The Judy's -- The Moo Song</media:title> | |||||
| <media:description type="plain">This was some really bizarre band I listened to as a young lad.</media:description> | |||||
| <media:keywords>kitty, cat, big dog, yarn, fluffy</media:keywords> | |||||
| <media:thumbnail url="http://www.foo.com/keyframe1.jpg" width="75" height="50" time="12:05:01.123" /> | |||||
| <media:thumbnail url="http://www.foo.com/keyframe2.jpg" width="150" height="100" time="12:05:01.125" /> | |||||
| <media:hash algo="md5">dfdec888b72151965a34b4b59031290a</media:hash> | |||||
| <media:player url="http://www.foo.com/player?id=1111" height="200" width="400" /> | |||||
| <media:copyright url="http://blah.com/additional-info.html">2005 FooBar Media</media:copyright> | |||||
| <media:text type="plain" lang="en" start="00:00:03.000" end="00:00:10.000"> Oh, say, can you see</media:text> | |||||
| <media:restriction relationship="allow" type="country">au us</media:restriction> | |||||
| <media:community> | <media:community> | ||||
| <media:starRating average="3.5" count="20" min="1" max="10" /> | <media:starRating average="3.5" count="20" min="1" max="10" /> | ||||
| <media:statistics views="5" favorites="5" /> | |||||
| <media:statistics views="5" favorites="4" /> | |||||
| <media:tags>news: 5, abc:3</media:tags> | <media:tags>news: 5, abc:3</media:tags> | ||||
| </media:community> | </media:community> | ||||
| <media:comments> | <media:comments> | ||||
| @@ -48,8 +50,7 @@ | |||||
| <media:param name="width">512</media:param> | <media:param name="width">512</media:param> | ||||
| <media:param name="height">323</media:param> | <media:param name="height">323</media:param> | ||||
| <media:param name="allowFullScreen">true</media:param> | <media:param name="allowFullScreen">true</media:param> | ||||
| <media:param name="flashVars"> | |||||
| id=12345&vid=678912i&lang=en-us&intl=us&thumbUrl=http://www.foo.com/thumbnail.jpg | |||||
| <media:param name="flashVars"> id=12345&vid=678912i&lang=en-us&intl=us&thumbUrl=http://www.foo.com/thumbnail.jpg | |||||
| </media:param> | </media:param> | ||||
| </media:embed> | </media:embed> | ||||
| <media:responses> | <media:responses> | ||||
| @@ -61,18 +62,19 @@ | |||||
| <media:backLink>http://www.backlink2.com</media:backLink> | <media:backLink>http://www.backlink2.com</media:backLink> | ||||
| </media:backLinks> | </media:backLinks> | ||||
| <media:status state="active" /> | <media:status state="active" /> | ||||
| <media:price type="rent" price="19.99" currency="EUR" /> | |||||
| <media:price type="rent" price="19.99" info="http://www.dummy.jp/package_info.html" currency="EUR" /> | |||||
| <media:price type="buy" price="39.99" currency="EUR" /> | |||||
| <media:license type="text/html" href="http://www.licensehost.com/license"> Sample license for a video</media:license> | <media:license type="text/html" href="http://www.licensehost.com/license"> Sample license for a video</media:license> | ||||
| <media:subTitle type="application/smil" lang="en-us" href="http://www.foo.org/subtitle.smil" /> | <media:subTitle type="application/smil" lang="en-us" href="http://www.foo.org/subtitle.smil" /> | ||||
| <media:peerLink type="application/x-bittorrent " href="http://www.foo.org/sampleFile.torrent" /> | |||||
| <media:peerLink type="application/x-bittorrent" href="http://www.foo.org/sampleFile.torrent" /> | |||||
| <media:location description="My house" start="00:01" end="01:00"> | <media:location description="My house" start="00:01" end="01:00"> | ||||
| <georss:where> | <georss:where> | ||||
| <gml:Point> | <gml:Point> | ||||
| <gml:pos>35.669998 139.770004</gml:pos> | |||||
| <gml:pos>35.669998 139.770004</gml:pos> | |||||
| </gml:Point> | </gml:Point> | ||||
| </georss:where> | </georss:where> | ||||
| </media:location> | </media:location> | ||||
| <media:restriction type="sharing" relationship="deny" /> | |||||
| <media:rights status="official" /> | |||||
| <media:scenes> | <media:scenes> | ||||
| <media:scene> | <media:scene> | ||||
| <sceneTitle>sceneTitle1</sceneTitle> | <sceneTitle>sceneTitle1</sceneTitle> | ||||
| @@ -80,6 +82,12 @@ | |||||
| <sceneStartTime>00:15</sceneStartTime> | <sceneStartTime>00:15</sceneStartTime> | ||||
| <sceneEndTime>00:45</sceneEndTime> | <sceneEndTime>00:45</sceneEndTime> | ||||
| </media:scene> | </media:scene> | ||||
| <media:scene> | |||||
| <sceneTitle>sceneTitle2</sceneTitle> | |||||
| <sceneDescription>sceneDesc2</sceneDescription> | |||||
| <sceneStartTime>00:15</sceneStartTime> | |||||
| <sceneEndTime>00:55</sceneEndTime> | |||||
| </media:scene> | |||||
| </media:scenes> | </media:scenes> | ||||
| </item> | </item> | ||||
| </channel> | </channel> | ||||