diff --git a/lib/domain/atom_feed.dart b/lib/domain/atom_feed.dart index e3d4df2..421323c 100644 --- a/lib/domain/atom_feed.dart +++ b/lib/domain/atom_feed.dart @@ -48,9 +48,9 @@ class AtomFeed { } return AtomFeed( - id: findElementOrNull(feedElement, 'id')?.text, - title: findElementOrNull(feedElement, 'title')?.text, - updated: findElementOrNull(feedElement, 'updated')?.text, + id: findElementOrNull(feedElement, 'id')?.value, + title: findElementOrNull(feedElement, 'title')?.value, + updated: findElementOrNull(feedElement, 'updated')?.value, items: feedElement .findElements('entry') .map((element) => AtomItem.parse(element)) @@ -73,10 +73,10 @@ class AtomFeed { .toList(), generator: AtomGenerator.parse(findElementOrNull(feedElement, 'generator')), - icon: findElementOrNull(feedElement, 'icon')?.text, - logo: findElementOrNull(feedElement, 'logo')?.text, - rights: findElementOrNull(feedElement, 'rights')?.text, - subtitle: findElementOrNull(feedElement, 'subtitle')?.text, + icon: findElementOrNull(feedElement, 'icon')?.value, + logo: findElementOrNull(feedElement, 'logo')?.value, + rights: findElementOrNull(feedElement, 'rights')?.value, + subtitle: findElementOrNull(feedElement, 'subtitle')?.value, ); } } diff --git a/lib/domain/atom_generator.dart b/lib/domain/atom_generator.dart index a94bc2e..a61d859 100644 --- a/lib/domain/atom_generator.dart +++ b/lib/domain/atom_generator.dart @@ -13,7 +13,7 @@ class AtomGenerator { } final uri = element.getAttribute('uri'); final version = element.getAttribute('version'); - final value = element.text; + final value = element.value; return AtomGenerator(uri, version, value); } } diff --git a/lib/domain/atom_item.dart b/lib/domain/atom_item.dart index bb13c3c..ab89a66 100644 --- a/lib/domain/atom_item.dart +++ b/lib/domain/atom_item.dart @@ -40,9 +40,9 @@ class AtomItem { factory AtomItem.parse(XmlElement element) { return AtomItem( - id: findElementOrNull(element, 'id')?.text, - title: findElementOrNull(element, 'title')?.text, - updated: findElementOrNull(element, 'updated')?.text, + id: findElementOrNull(element, 'id')?.value, + title: findElementOrNull(element, 'title')?.value, + updated: findElementOrNull(element, 'updated')?.value, authors: element .findElements('author') .map((element) => AtomPerson.parse(element)) @@ -60,10 +60,10 @@ class AtomItem { .map((element) => AtomPerson.parse(element)) .toList(), source: AtomSource.parse(findElementOrNull(element, 'source')), - published: findElementOrNull(element, 'published')?.text, - content: findElementOrNull(element, 'content')?.text, - summary: findElementOrNull(element, 'summary')?.text, - rights: findElementOrNull(element, 'rights')?.text, + published: findElementOrNull(element, 'published')?.value, + content: findElementOrNull(element, 'content')?.value, + summary: findElementOrNull(element, 'summary')?.value, + rights: findElementOrNull(element, 'rights')?.value, media: Media.parse(element), ); } diff --git a/lib/domain/atom_person.dart b/lib/domain/atom_person.dart index e5c4725..49b93df 100644 --- a/lib/domain/atom_person.dart +++ b/lib/domain/atom_person.dart @@ -9,9 +9,9 @@ class AtomPerson { const AtomPerson(this.name, this.uri, this.email); factory AtomPerson.parse(XmlElement element) { - final name = findElementOrNull(element, 'name')?.text; - final uri = findElementOrNull(element, 'uri')?.text; - final email = findElementOrNull(element, 'email')?.text; + final name = findElementOrNull(element, 'name')?.value; + final uri = findElementOrNull(element, 'uri')?.value; + final email = findElementOrNull(element, 'email')?.value; return AtomPerson(name, uri, email); } } diff --git a/lib/domain/atom_source.dart b/lib/domain/atom_source.dart index b95334a..4e1bb59 100644 --- a/lib/domain/atom_source.dart +++ b/lib/domain/atom_source.dart @@ -12,9 +12,9 @@ class AtomSource { if (element == null) { return null; } - final id = findElementOrNull(element, 'id')?.text; - final title = findElementOrNull(element, 'title')?.text; - final updated = findElementOrNull(element, 'updated')?.text; + final id = findElementOrNull(element, 'id')?.value; + final title = findElementOrNull(element, 'title')?.value; + final updated = findElementOrNull(element, 'updated')?.value; return AtomSource(id, title, updated); } } diff --git a/lib/domain/dart_rss.dart b/lib/domain/dart_rss.dart index 9017a27..5e5531a 100644 --- a/lib/domain/dart_rss.dart +++ b/lib/domain/dart_rss.dart @@ -1,8 +1,6 @@ import 'package:dart_rss/dart_rss.dart'; import 'package:http/http.dart' as http; -import 'package:dart_rss/domain/atom_feed.dart'; import 'package:dart_rss/domain/rss1_feed.dart'; -import 'package:dart_rss/domain/rss_feed.dart'; import 'package:xml/xml.dart' as xml; import 'package:intl/intl.dart'; @@ -142,7 +140,7 @@ class WebFeed { : rssRefs.first.getAttribute('version')?.contains('2'); xmlns = feedRefs.isEmpty ? false - : feedRefs.first.getAttribute('xmlns')?.toLowerCase()?.contains('atom'); + : feedRefs.first.getAttribute('xmlns')?.toLowerCase().contains('atom'); if (rdfRefs.isNotEmpty) { return RssVersion.RSS1; diff --git a/lib/domain/dublin_core/dublin_core.dart b/lib/domain/dublin_core/dublin_core.dart index 2a3e8f6..c540258 100644 --- a/lib/domain/dublin_core/dublin_core.dart +++ b/lib/domain/dublin_core/dublin_core.dart @@ -41,24 +41,27 @@ class DublinCore { factory DublinCore.parse(XmlElement element) { final subjects = findAllDirectElementsOrNull(element, 'dc:subject'); return DublinCore( - title: findElementOrNull(element, 'dc:title')?.text, - description: findElementOrNull(element, 'dc:description')?.text, - creator: findElementOrNull(element, 'dc:creator')?.text, - subject: findElementOrNull(element, 'dc:subject')?.text, + title: findElementOrNull(element, 'dc:title')?.value, + description: findElementOrNull(element, 'dc:description')?.value, + creator: findElementOrNull(element, 'dc:creator')?.value, + subject: findElementOrNull(element, 'dc:subject')?.value, subjects: subjects == null ? [] - : subjects.map((subjectElement) => subjectElement.text).toList(), - publisher: findElementOrNull(element, 'dc:publisher')?.text, - contributor: findElementOrNull(element, 'dc:contributor')?.text, - date: findElementOrNull(element, 'dc:date')?.text, - type: findElementOrNull(element, 'dc:type')?.text, - format: findElementOrNull(element, 'dc:format')?.text, - identifier: findElementOrNull(element, 'dc:identifier')?.text, - source: findElementOrNull(element, 'dc:source')?.text, - language: findElementOrNull(element, 'dc:language')?.text, - relation: findElementOrNull(element, 'dc:relation')?.text, - coverage: findElementOrNull(element, 'dc:coverage')?.text, - rights: findElementOrNull(element, 'dc:rights')?.text, + : subjects + .where((element) => element.value != null) + .map((subjectElement) => subjectElement.value!) + .toList(), + publisher: findElementOrNull(element, 'dc:publisher')?.value, + contributor: findElementOrNull(element, 'dc:contributor')?.value, + date: findElementOrNull(element, 'dc:date')?.value, + type: findElementOrNull(element, 'dc:type')?.value, + format: findElementOrNull(element, 'dc:format')?.value, + identifier: findElementOrNull(element, 'dc:identifier')?.value, + source: findElementOrNull(element, 'dc:source')?.value, + language: findElementOrNull(element, 'dc:language')?.value, + relation: findElementOrNull(element, 'dc:relation')?.value, + coverage: findElementOrNull(element, 'dc:coverage')?.value, + rights: findElementOrNull(element, 'dc:rights')?.value, ); } } diff --git a/lib/domain/media/category.dart b/lib/domain/media/category.dart index 329865c..94cf9b1 100644 --- a/lib/domain/media/category.dart +++ b/lib/domain/media/category.dart @@ -18,7 +18,7 @@ class Category { return Category( scheme: element.getAttribute('scheme'), label: element.getAttribute('label'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/copyright.dart b/lib/domain/media/copyright.dart index f0cfe1b..a44cbd1 100644 --- a/lib/domain/media/copyright.dart +++ b/lib/domain/media/copyright.dart @@ -15,7 +15,7 @@ class Copyright { } return Copyright( url: element.getAttribute('url'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/credit.dart b/lib/domain/media/credit.dart index 2f1c94e..f786ceb 100644 --- a/lib/domain/media/credit.dart +++ b/lib/domain/media/credit.dart @@ -15,7 +15,7 @@ class Credit { return Credit( role: element.getAttribute('role'), scheme: element.getAttribute('scheme'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/description.dart b/lib/domain/media/description.dart index 80bc427..5744eab 100644 --- a/lib/domain/media/description.dart +++ b/lib/domain/media/description.dart @@ -15,7 +15,7 @@ class Description { } return Description( type: element.getAttribute('type'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/hash.dart b/lib/domain/media/hash.dart index 000706c..8990452 100644 --- a/lib/domain/media/hash.dart +++ b/lib/domain/media/hash.dart @@ -15,7 +15,7 @@ class Hash { } return Hash( algo: element.getAttribute('algo'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/license.dart b/lib/domain/media/license.dart index b521676..c97be5d 100644 --- a/lib/domain/media/license.dart +++ b/lib/domain/media/license.dart @@ -18,7 +18,7 @@ class License { return License( type: element.getAttribute('type'), href: element.getAttribute('href'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/media.dart b/lib/domain/media/media.dart index f108493..1ccedce 100644 --- a/lib/domain/media/media.dart +++ b/lib/domain/media/media.dart @@ -93,7 +93,7 @@ class Media { title: Title.parse(findElementOrNull(element, 'media:title')), description: Description.parse(findElementOrNull(element, 'media:description')), - keywords: findElementOrNull(element, 'media:keywords')?.text, + keywords: findElementOrNull(element, 'media:keywords')?.value, thumbnails: element .findElements('media:thumbnail') .map((e) => Thumbnail.parse(e)) @@ -107,19 +107,21 @@ class Media { community: Community.parse(findElementOrNull(element, 'media:community')), comments: findElementOrNull(element, 'media:comments') ?.findElements('media:comment') - ?.map((e) => e.text) - ?.toList() ?? + .map((e) => e.value!) + .toList() ?? [], embed: Embed.parse(findElementOrNull(element, 'media:embed')), responses: findElementOrNull(element, 'media:responses') ?.findElements('media:response') - ?.map((e) => e.text) - ?.toList() ?? + .where((e) => e.value != null) + .map((e) => e.value!) + .toList() ?? [], backLinks: findElementOrNull(element, 'media:backLinks') ?.findElements('media:backLink') - ?.map((e) => e.text) - ?.toList() ?? + .where((e) => e.value != null) + .map((e) => e.value!) + .toList() ?? [], status: Status.parse(findElementOrNull(element, 'media:status')), prices: element @@ -131,8 +133,8 @@ class Media { rights: Rights.parse(findElementOrNull(element, 'media:rights')), scenes: findElementOrNull(element, 'media:scenes') ?.findElements('media:scene') - ?.map((e) => Scene.parse(e)) - ?.toList() ?? + .map((e) => Scene.parse(e)) + .toList() ?? [], ); } diff --git a/lib/domain/media/param.dart b/lib/domain/media/param.dart index 2b18933..6b893cc 100644 --- a/lib/domain/media/param.dart +++ b/lib/domain/media/param.dart @@ -12,7 +12,7 @@ class Param { factory Param.parse(XmlElement element) { return Param( name: element.getAttribute('name'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/peer_link.dart b/lib/domain/media/peer_link.dart index 31b915f..5cba955 100644 --- a/lib/domain/media/peer_link.dart +++ b/lib/domain/media/peer_link.dart @@ -18,7 +18,7 @@ class PeerLink { return PeerLink( type: element.getAttribute('type'), href: element.getAttribute('href'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/player.dart b/lib/domain/media/player.dart index de29a8c..b17c6a0 100644 --- a/lib/domain/media/player.dart +++ b/lib/domain/media/player.dart @@ -21,7 +21,7 @@ class Player { url: element.getAttribute('url'), width: int.tryParse(element.getAttribute('width') ?? '0') ?? 0, height: int.tryParse(element.getAttribute('height') ?? '0') ?? 0, - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/rating.dart b/lib/domain/media/rating.dart index 1c4ce10..75ef159 100644 --- a/lib/domain/media/rating.dart +++ b/lib/domain/media/rating.dart @@ -15,7 +15,7 @@ class Rating { } return Rating( scheme: element.getAttribute('scheme'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/restriction.dart b/lib/domain/media/restriction.dart index 472f225..bff69a1 100644 --- a/lib/domain/media/restriction.dart +++ b/lib/domain/media/restriction.dart @@ -18,7 +18,7 @@ class Restriction { return Restriction( relationship: element.getAttribute('relationship'), type: element.getAttribute('type'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/scene.dart b/lib/domain/media/scene.dart index 2d5f9ef..b10aaf9 100644 --- a/lib/domain/media/scene.dart +++ b/lib/domain/media/scene.dart @@ -16,10 +16,10 @@ class Scene { factory Scene.parse(XmlElement element) { return Scene( - title: findElementOrNull(element, 'sceneTitle')?.text, - description: findElementOrNull(element, 'sceneDescription')?.text, - startTime: findElementOrNull(element, 'sceneStartTime')?.text, - endTime: findElementOrNull(element, 'sceneEndTime')?.text, + title: findElementOrNull(element, 'sceneTitle')?.value, + description: findElementOrNull(element, 'sceneDescription')?.value, + startTime: findElementOrNull(element, 'sceneStartTime')?.value, + endTime: findElementOrNull(element, 'sceneEndTime')?.value, ); } } diff --git a/lib/domain/media/tags.dart b/lib/domain/media/tags.dart index 33e644d..4f65d82 100644 --- a/lib/domain/media/tags.dart +++ b/lib/domain/media/tags.dart @@ -14,7 +14,7 @@ class Tags { return null; } return Tags( - tags: element.text, + tags: element.value, weight: int.tryParse(element.getAttribute('weight') ?? '1') ?? 1, ); } diff --git a/lib/domain/media/text.dart b/lib/domain/media/text.dart index a34fa22..fe51f48 100644 --- a/lib/domain/media/text.dart +++ b/lib/domain/media/text.dart @@ -24,7 +24,7 @@ class Text { lang: element.getAttribute('lang'), start: element.getAttribute('start'), end: element.getAttribute('end'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/media/title.dart b/lib/domain/media/title.dart index 283288d..a181297 100644 --- a/lib/domain/media/title.dart +++ b/lib/domain/media/title.dart @@ -15,7 +15,7 @@ class Title { } return Title( type: element.getAttribute('type'), - value: element.text, + value: element.value, ); } } diff --git a/lib/domain/podcast_index/rss_podcast_index_funding.dart b/lib/domain/podcast_index/rss_podcast_index_funding.dart index 4cc9b86..aad0ca3 100644 --- a/lib/domain/podcast_index/rss_podcast_index_funding.dart +++ b/lib/domain/podcast_index/rss_podcast_index_funding.dart @@ -14,7 +14,7 @@ class RssPodcastIndexFunding { return RssPodcastIndexFunding( url: element.getAttribute('url'), - value: element.text.trim(), + value: element.value?.trim(), ); } } diff --git a/lib/domain/podcast_index/rss_podcast_index_locked.dart b/lib/domain/podcast_index/rss_podcast_index_locked.dart index ce3b605..9c2399a 100644 --- a/lib/domain/podcast_index/rss_podcast_index_locked.dart +++ b/lib/domain/podcast_index/rss_podcast_index_locked.dart @@ -14,7 +14,7 @@ class RssPodcastIndexLocked { return RssPodcastIndexLocked( owner: element.getAttribute('owner'), - locked: element.text == 'yes' ? true : false, + locked: element.value == 'yes' ? true : false, ); } } diff --git a/lib/domain/podcast_index/rss_podcast_index_soudbite.dart b/lib/domain/podcast_index/rss_podcast_index_soudbite.dart index e7f7ac8..f287593 100644 --- a/lib/domain/podcast_index/rss_podcast_index_soudbite.dart +++ b/lib/domain/podcast_index/rss_podcast_index_soudbite.dart @@ -19,7 +19,7 @@ class RssPodcastIndexSoundbite { return RssPodcastIndexSoundbite( startTime: double.parse(element.getAttribute('startTime') ?? '0.0'), duration: double.parse(element.getAttribute('duration') ?? '0.0'), - value: element.text.trim(), + value: element.value?.trim(), ); } } diff --git a/lib/domain/rss1_feed.dart b/lib/domain/rss1_feed.dart index 3bd4a58..57ad82b 100644 --- a/lib/domain/rss1_feed.dart +++ b/lib/domain/rss1_feed.dart @@ -64,9 +64,9 @@ class Rss1Feed { final channel = rdfElement.findElements('channel'); return Rss1Feed( - title: findElementOrNull(rdfElement, 'title')?.text, - link: findElementOrNull(rdfElement, 'link')?.text, - description: findElementOrNull(rdfElement, 'description')?.text, + title: findElementOrNull(rdfElement, 'title')?.value, + link: findElementOrNull(rdfElement, 'link')?.value, + description: findElementOrNull(rdfElement, 'description')?.value, items: rdfElement .findElements('item') .map((element) => Rss1Item.parse(element)) @@ -74,12 +74,14 @@ class Rss1Feed { image: findElementOrNull(rdfElement, 'image')?.getAttribute('rdf:resource'), updatePeriod: _parseUpdatePeriod( - findElementOrNull(rdfElement, 'sy:updatePeriod')?.text), + findElementOrNull(rdfElement, 'sy:updatePeriod')?.value), updateFrequency: - parseInt(findElementOrNull(rdfElement, 'sy:updateFrequency')?.text), + parseInt(findElementOrNull(rdfElement, 'sy:updateFrequency')?.value), updateBase: - parseDateTime(findElementOrNull(rdfElement, 'sy:updateBase')?.text), - dc: channel.isEmpty ? null : DublinCore.parse(rdfElement.findElements('channel').first), + parseDateTime(findElementOrNull(rdfElement, 'sy:updateBase')?.value), + dc: channel.isEmpty + ? null + : DublinCore.parse(rdfElement.findElements('channel').first), ); } } diff --git a/lib/domain/rss1_item.dart b/lib/domain/rss1_item.dart index a9a4cbd..46ec778 100644 --- a/lib/domain/rss1_item.dart +++ b/lib/domain/rss1_item.dart @@ -21,9 +21,9 @@ class Rss1Item { factory Rss1Item.parse(XmlElement element) { return Rss1Item( - title: findElementOrNull(element, 'title')?.text, - description: findElementOrNull(element, 'description')?.text, - link: findElementOrNull(element, 'link')?.text, + title: findElementOrNull(element, 'title')?.value, + description: findElementOrNull(element, 'description')?.value, + link: findElementOrNull(element, 'link')?.value, dc: DublinCore.parse(element), content: RssContent.parse(findElementOrNull(element, 'content:encoded')), ); diff --git a/lib/domain/rss_category.dart b/lib/domain/rss_category.dart index 854933a..f267ecd 100644 --- a/lib/domain/rss_category.dart +++ b/lib/domain/rss_category.dart @@ -8,7 +8,7 @@ class RssCategory { factory RssCategory.parse(XmlElement element) { final domain = element.getAttribute('domain'); - final value = element.text; + final value = element.value; return RssCategory(domain, value); } } diff --git a/lib/domain/rss_content.dart b/lib/domain/rss_content.dart index a0a8f57..a464293 100644 --- a/lib/domain/rss_content.dart +++ b/lib/domain/rss_content.dart @@ -20,13 +20,17 @@ class RssContent { if (element == null) { return null; } - final content = element.text; + final content = element.value; final images = []; - _imagesRegExp.allMatches(content).forEach((match) { - final matchGroup = match.group(1); - if (matchGroup != null) images.add(matchGroup); - }); - return RssContent(content, images); + if (content != null) { + _imagesRegExp.allMatches(content).forEach((match) { + final matchGroup = match.group(1); + if (matchGroup != null) images.add(matchGroup); + }); + return RssContent(content, images); + } else { + return null; + } } @override diff --git a/lib/domain/rss_feed.dart b/lib/domain/rss_feed.dart index d481ee6..dacafba 100644 --- a/lib/domain/rss_feed.dart +++ b/lib/domain/rss_feed.dart @@ -71,33 +71,44 @@ class RssFeed { } return RssFeed( - title: findElementOrNull(channelElement, 'title')?.text, - author: findElementOrNull(channelElement, 'author')?.text, - description: findElementOrNull(channelElement, 'description')?.text, - link: findElementOrNull(channelElement, 'link')?.text, - items: channelElement.findElements('item').map((element) => RssItem.parse(element)).toList(), + title: findElementOrNull(channelElement, 'title')?.value, + author: findElementOrNull(channelElement, 'author')?.value, + description: findElementOrNull(channelElement, 'description')?.value, + link: findElementOrNull(channelElement, 'link')?.value, + items: channelElement + .findElements('item') + .map((element) => RssItem.parse(element)) + .toList(), image: RssImage.parse(findElementOrNull(channelElement, 'image')), cloud: RssCloud.parse(findElementOrNull(channelElement, 'cloud')), - categories: channelElement.findElements('category').map((element) => RssCategory.parse(element)).toList(), + categories: channelElement + .findElements('category') + .map((element) => RssCategory.parse(element)) + .toList(), skipDays: findElementOrNull(channelElement, 'skipDays') ?.findAllElements('day') - .map((element) => element.text) + .where((element) => element.value != null) + .map((element) => element.value!) .toList() ?? [], skipHours: findElementOrNull(channelElement, 'skipHours') ?.findAllElements('hour') - .map((element) => int.tryParse(element.text) ?? 0) + .where((element) => element.value != null) + .map((element) => int.tryParse(element.value!) ?? 0) .toList() ?? [], - lastBuildDate: findElementOrNull(channelElement, 'lastBuildDate')?.text, - language: findElementOrNull(channelElement, 'language')?.text, - generator: findElementOrNull(channelElement, 'generator')?.text, - copyright: findElementOrNull(channelElement, 'copyright')?.text, - docs: findElementOrNull(channelElement, 'docs')?.text, - managingEditor: findElementOrNull(channelElement, 'managingEditor')?.text, - rating: findElementOrNull(channelElement, 'rating')?.text, - webMaster: findElementOrNull(channelElement, 'webMaster')?.text, - ttl: int.tryParse(findElementOrNull(channelElement, 'ttl')?.text ?? '0') ?? 0, + lastBuildDate: findElementOrNull(channelElement, 'lastBuildDate')?.value, + language: findElementOrNull(channelElement, 'language')?.value, + generator: findElementOrNull(channelElement, 'generator')?.value, + copyright: findElementOrNull(channelElement, 'copyright')?.value, + docs: findElementOrNull(channelElement, 'docs')?.value, + managingEditor: + findElementOrNull(channelElement, 'managingEditor')?.value, + rating: findElementOrNull(channelElement, 'rating')?.value, + webMaster: findElementOrNull(channelElement, 'webMaster')?.value, + ttl: int.tryParse( + findElementOrNull(channelElement, 'ttl')?.value ?? '0') ?? + 0, dc: DublinCore.parse(channelElement), itunes: RssItunes.parse(channelElement), podcastIndex: RssPodcastIndex.parse(channelElement), diff --git a/lib/domain/rss_image.dart b/lib/domain/rss_image.dart index 41656cd..9a52d8f 100644 --- a/lib/domain/rss_image.dart +++ b/lib/domain/rss_image.dart @@ -12,9 +12,9 @@ class RssImage { if (element == null) { return null; } - final title = findElementOrNull(element, 'title')?.text; - final url = findElementOrNull(element, 'url')?.text; - final link = findElementOrNull(element, 'link')?.text; + final title = findElementOrNull(element, 'title')?.value; + final url = findElementOrNull(element, 'url')?.value; + final link = findElementOrNull(element, 'link')?.value; return RssImage(title, url, link); } diff --git a/lib/domain/rss_item.dart b/lib/domain/rss_item.dart index dd801f1..a490805 100644 --- a/lib/domain/rss_item.dart +++ b/lib/domain/rss_item.dart @@ -48,14 +48,17 @@ class RssItem { factory RssItem.parse(XmlElement element) { return RssItem( - title: findElementOrNull(element, 'title')?.text, - description: findElementOrNull(element, 'description')?.text, - link: findElementOrNull(element, 'link')?.text, - categories: element.findElements('category').map((element) => RssCategory.parse(element)).toList(), - guid: findElementOrNull(element, 'guid')?.text, - pubDate: findElementOrNull(element, 'pubDate')?.text, - author: findElementOrNull(element, 'author')?.text, - comments: findElementOrNull(element, 'comments')?.text, + title: findElementOrNull(element, 'title')?.value, + description: findElementOrNull(element, 'description')?.value, + link: findElementOrNull(element, 'link')?.value, + categories: element + .findElements('category') + .map((element) => RssCategory.parse(element)) + .toList(), + guid: findElementOrNull(element, 'guid')?.value, + pubDate: findElementOrNull(element, 'pubDate')?.value, + author: findElementOrNull(element, 'author')?.value, + comments: findElementOrNull(element, 'comments')?.value, source: RssSource.parse(findElementOrNull(element, 'source')), content: RssContent.parse(findElementOrNull(element, 'content:encoded')), media: Media.parse(element), diff --git a/lib/domain/rss_item_itunes.dart b/lib/domain/rss_item_itunes.dart index 89e5def..e86993a 100644 --- a/lib/domain/rss_item_itunes.dart +++ b/lib/domain/rss_item_itunes.dart @@ -37,26 +37,29 @@ class RssItemItunes { }); factory RssItemItunes.parse(XmlElement element) { - final episodeStr = findElementOrNull(element, 'itunes:episode')?.text?.trim(); - final seasonStr = findElementOrNull(element, 'itunes:season')?.text?.trim(); - final durationStr = findElementOrNull(element, 'itunes:duration')?.text?.trim(); + final episodeStr = + findElementOrNull(element, 'itunes:episode')?.value?.trim(); + final seasonStr = + findElementOrNull(element, 'itunes:season')?.value?.trim(); + final durationStr = + findElementOrNull(element, 'itunes:duration')?.value?.trim(); return RssItemItunes( - title: findElementOrNull(element, 'itunes:title')?.text?.trim(), + title: findElementOrNull(element, 'itunes:title')?.value?.trim(), episode: episodeStr == null ? null : int.tryParse(episodeStr), season: seasonStr == null ? null : int.tryParse(seasonStr), duration: durationStr == null ? null : parseDuration(durationStr), episodeType: newRssItunesEpisodeType( findElementOrNull(element, 'itunes:episodeType')), - author: findElementOrNull(element, 'itunes:author')?.text?.trim(), - summary: findElementOrNull(element, 'itunes:summary')?.text?.trim(), + author: findElementOrNull(element, 'itunes:author')?.value?.trim(), + summary: findElementOrNull(element, 'itunes:summary')?.value?.trim(), explicit: parseBoolLiteral(element, 'itunes:explicit'), - subtitle: findElementOrNull(element, 'itunes:subtitle')?.text?.trim(), + subtitle: findElementOrNull(element, 'itunes:subtitle')?.value?.trim(), keywords: findElementOrNull(element, 'itunes:keywords') - ?.text + ?.value ?.split(',') - ?.map((keyword) => keyword.trim()) - ?.toList() ?? + .map((keyword) => keyword.trim()) + .toList() ?? const [], image: RssItunesImage.parse(findElementOrNull(element, 'itunes:image')), category: RssItunesCategory.parse( diff --git a/lib/domain/rss_itunes.dart b/lib/domain/rss_itunes.dart index e21aded..da27869 100644 --- a/lib/domain/rss_itunes.dart +++ b/lib/domain/rss_itunes.dart @@ -41,17 +41,17 @@ class RssItunes { factory RssItunes.parse(XmlElement element) { final categories = findAllDirectElementsOrNull(element, 'itunes:category'); return RssItunes( - author: findElementOrNull(element, 'itunes:author')?.text?.trim(), - summary: findElementOrNull(element, 'itunes:summary')?.text?.trim(), + author: findElementOrNull(element, 'itunes:author')?.value?.trim(), + summary: findElementOrNull(element, 'itunes:summary')?.value?.trim(), explicit: parseBoolLiteral(element, 'itunes:explicit'), - title: findElementOrNull(element, 'itunes:title')?.text?.trim(), - subtitle: findElementOrNull(element, 'itunes:subtitle')?.text?.trim(), + title: findElementOrNull(element, 'itunes:title')?.value?.trim(), + subtitle: findElementOrNull(element, 'itunes:subtitle')?.value?.trim(), owner: RssItunesOwner.parse(findElementOrNull(element, 'itunes:owner')), keywords: findElementOrNull(element, 'itunes:keywords') - ?.text + ?.value ?.split(',') - ?.map((keyword) => keyword.trim()) - ?.toList() ?? + .map((keyword) => keyword.trim()) + .toList() ?? const [], image: RssItunesImage.parse(findElementOrNull(element, 'itunes:image')), categories: @@ -59,10 +59,9 @@ class RssItunes { const [], type: newRssItunesType(findElementOrNull(element, 'itunes:type')), newFeedUrl: - findElementOrNull(element, 'itunes:new-feed-url')?.text?.trim(), + findElementOrNull(element, 'itunes:new-feed-url')?.value?.trim(), block: parseBoolLiteral(element, 'itunes:block'), complete: parseBoolLiteral(element, 'itunes:complete'), ); } } - diff --git a/lib/domain/rss_itunes_category.dart b/lib/domain/rss_itunes_category.dart index df39050..402027c 100644 --- a/lib/domain/rss_itunes_category.dart +++ b/lib/domain/rss_itunes_category.dart @@ -22,7 +22,7 @@ class RssItunesCategory { category: element.getAttribute('text')?.trim(), subCategories: subCategories ?.map((ele) => ele.getAttribute('text')?.trim()) - ?.toList() ?? + .toList() ?? [], ); } diff --git a/lib/domain/rss_itunes_episode_type.dart b/lib/domain/rss_itunes_episode_type.dart index 2c6de10..911a357 100644 --- a/lib/domain/rss_itunes_episode_type.dart +++ b/lib/domain/rss_itunes_episode_type.dart @@ -1,12 +1,12 @@ import 'package:xml/xml.dart'; -enum RssItunesEpisodeType {full, trailer, bonus} +enum RssItunesEpisodeType { full, trailer, bonus } RssItunesEpisodeType? newRssItunesEpisodeType(XmlElement? element) { // "full" is default type if (element == null) return RssItunesEpisodeType.full; - switch (element.text) { + switch (element.value) { case 'full': return RssItunesEpisodeType.full; case 'trailer': diff --git a/lib/domain/rss_itunes_owner.dart b/lib/domain/rss_itunes_owner.dart index 72e2d69..8cf595a 100644 --- a/lib/domain/rss_itunes_owner.dart +++ b/lib/domain/rss_itunes_owner.dart @@ -11,8 +11,8 @@ class RssItunesOwner { static RssItunesOwner? parse(XmlElement? element) { if (element == null) return null; return RssItunesOwner( - name: findElementOrNull(element, 'itunes:name')?.text?.trim(), - email: findElementOrNull(element, 'itunes:email')?.text?.trim(), + name: findElementOrNull(element, 'itunes:name')?.value?.trim(), + email: findElementOrNull(element, 'itunes:email')?.value?.trim(), ); } } diff --git a/lib/domain/rss_itunes_type.dart b/lib/domain/rss_itunes_type.dart index b4c5021..a380848 100644 --- a/lib/domain/rss_itunes_type.dart +++ b/lib/domain/rss_itunes_type.dart @@ -6,7 +6,7 @@ RssItunesType? newRssItunesType(XmlElement? element) { // "episodic" is default type if (element == null) return RssItunesType.episodic; - switch (element.text) { + switch (element.value) { case 'episodic': return RssItunesType.episodic; case 'serial': diff --git a/lib/domain/rss_source.dart b/lib/domain/rss_source.dart index e7a69d4..ca8873c 100644 --- a/lib/domain/rss_source.dart +++ b/lib/domain/rss_source.dart @@ -7,12 +7,12 @@ class RssSource { const RssSource(this.url, this.value); static RssSource? parse(XmlElement? element) { - if (element == null) { + if (element == null || element.value == null) { return null; } final url = element.getAttribute('url'); - final value = element.text; + final value = element.value; - return RssSource(url, value); + return RssSource(url, value!); } } diff --git a/lib/util/helpers.dart b/lib/util/helpers.dart index 2982959..d585f93 100644 --- a/lib/util/helpers.dart +++ b/lib/util/helpers.dart @@ -21,7 +21,7 @@ List? findAllDirectElementsOrNull(XmlElement element, String name, } bool? parseBoolLiteral(XmlElement element, String tagName) { - final v = findElementOrNull(element, tagName)?.text?.toLowerCase()?.trim(); + final v = findElementOrNull(element, tagName)?.value?.toLowerCase().trim(); if (v == null) return null; return ['yes', 'true'].contains(v); } diff --git a/pubspec.yaml b/pubspec.yaml index 70808d3..b18b348 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,9 +5,9 @@ homepage: https://github.com/sudame/dart-rss environment: sdk: ">=2.12.0-259.9.beta <3.0.0" dependencies: - xml: ^5.0.2 + xml: ^6.3.0 http: ^0.13.0 - intl: ^0.17.0 + intl: ^0.18.1 dev_dependencies: test: ^1.16.4 diff --git a/test/rss_test.dart b/test/rss_test.dart index 648416a..0c8ee18 100644 --- a/test/rss_test.dart +++ b/test/rss_test.dart @@ -350,10 +350,10 @@ void main() { expect(item.itunes!.title, 'awesome title'); expect(item.itunes!.block, false); }); - test("parse RSS-PodcastIndex-R1.xml", () { - var xmlString = new File("test/xml/RSS-PodcastIndex-R1.xml").readAsStringSync(); + test('parse RSS-PodcastIndex-R1.xml', () { + var xmlString = File('test/xml/RSS-PodcastIndex-R1.xml').readAsStringSync(); - var feed = new RssFeed.parse(xmlString); + var feed = RssFeed.parse(xmlString); expect(feed.title, 'Podcasting 2.0 Namespace Example'); expect(