Skip to content

Commit 9f01e1e

Browse files
committed
support enclosure & refactoring
1 parent a2bbf23 commit 9f01e1e

File tree

7 files changed

+59
-60
lines changed

7 files changed

+59
-60
lines changed

lib/domain/rss_category.dart

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
11
import 'package:xml/xml.dart';
22

33
class RssCategory {
4-
String domain;
5-
String value;
4+
final String domain;
5+
final String value;
66

77
RssCategory(this.domain, this.value);
88

9-
factory RssCategory.parse(XmlElement node) {
10-
var domain = node.getAttribute("domain");
11-
var value = node.text;
9+
factory RssCategory.parse(XmlElement element) {
10+
if (element == null) {
11+
return null;
12+
}
13+
var domain = element.getAttribute("domain");
14+
var value = element.text;
1215

1316
return new RssCategory(domain, value);
1417
}
15-
16-
@override
17-
String toString() {
18-
return '''
19-
domain: $domain
20-
value: $value
21-
''';
22-
}
2318
}

lib/domain/rss_content.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ class RssContent {
1616

1717
RssContent(this.value, this.images);
1818

19-
factory RssContent.parse(XmlElement node) {
20-
final content = node.text;
19+
factory RssContent.parse(XmlElement element) {
20+
if (element == null) {
21+
return null;
22+
}
23+
final content = element.text;
2124
final images = <String>[];
2225
_imagesRegExp.allMatches(content).forEach((match) {
2326
images.add(match.group(1));

lib/domain/rss_enclosure.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:xml/xml.dart';
2+
3+
class RssEnclosure {
4+
final String url;
5+
final String type;
6+
final int length;
7+
8+
RssEnclosure(this.url, this.type, this.length);
9+
10+
factory RssEnclosure.parse(XmlElement element) {
11+
if (element == null) {
12+
return null;
13+
}
14+
var url = element.getAttribute("url");
15+
var type = element.getAttribute("type");
16+
var length = int.tryParse(element.getAttribute("length") ?? "0");
17+
return new RssEnclosure(url, type, length);
18+
}
19+
}

lib/domain/rss_item.dart

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import 'package:webfeed/domain/media/media.dart';
22
import 'package:webfeed/domain/rss_category.dart';
33
import 'package:webfeed/domain/rss_content.dart';
4+
import 'package:webfeed/domain/rss_enclosure.dart';
45
import 'package:webfeed/domain/rss_source.dart';
56
import 'package:webfeed/util/helpers.dart';
67
import 'package:xml/xml.dart';
8+
import 'package:webfeed/util/helpers.dart';
79

810
class RssItem {
911
final String title;
@@ -18,6 +20,7 @@ class RssItem {
1820
final RssSource source;
1921
final RssContent content;
2022
final Media media;
23+
final RssEnclosure enclosure;
2124

2225
RssItem({
2326
this.title,
@@ -31,45 +34,25 @@ class RssItem {
3134
this.source,
3235
this.content,
3336
this.media,
37+
this.enclosure,
3438
});
3539

3640
factory RssItem.parse(XmlElement element) {
37-
var title = xmlGetString(element, "title", strict: false);
38-
var description = xmlGetString(element, "description", strict: false);
39-
var link = xmlGetString(element, "link", strict: false);
40-
41-
var categories = element.findElements("category").map((element) {
42-
return new RssCategory.parse(element);
43-
}).toList();
44-
45-
var guid = xmlGetString(element, "guid", strict: false);
46-
var pubDate = xmlGetString(element, "pubDate", strict: false);
47-
var author = xmlGetString(element, "author", strict: false);
48-
var comments = xmlGetString(element, "comments", strict: false);
49-
50-
RssSource source;
51-
try {
52-
source = new RssSource.parse(element.findElements("source").first);
53-
} on StateError {}
54-
55-
RssContent content;
56-
try {
57-
content =
58-
new RssContent.parse(element.findElements("content:encoded").first);
59-
} on StateError {}
60-
6141
return new RssItem(
62-
title: title,
63-
description: description,
64-
link: link,
65-
categories: categories,
66-
guid: guid,
67-
pubDate: pubDate,
68-
author: author,
69-
comments: comments,
70-
source: source,
71-
content: content,
42+
title: findElementOrNull(element, "title")?.text,
43+
description: findElementOrNull(element, "description")?.text,
44+
link: findElementOrNull(element, "link")?.text,
45+
categories: element.findElements("category").map((element) {
46+
return new RssCategory.parse(element);
47+
}).toList(),
48+
guid: findElementOrNull(element, "guid")?.text,
49+
pubDate: findElementOrNull(element, "pubDate")?.text,
50+
author: findElementOrNull(element, "author")?.text,
51+
comments: findElementOrNull(element, "comments")?.text,
52+
source: RssSource.parse(findElementOrNull(element, "source")),
53+
content: RssContent.parse(findElementOrNull(element, "content:encoded")),
7254
media: Media.parse(element),
55+
enclosure: RssEnclosure.parse(findElementOrNull(element, "enclosure")),
7356
);
7457
}
7558

lib/domain/rss_source.dart

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,13 @@ class RssSource {
66

77
RssSource(this.url, this.value);
88

9-
factory RssSource.parse(XmlElement node) {
10-
var url = node.getAttribute("url");
11-
var value = node.text;
9+
factory RssSource.parse(XmlElement element) {
10+
if (element == null) {
11+
return null;
12+
}
13+
var url = element.getAttribute("url");
14+
var value = element.text;
1215

1316
return new RssSource(url, value);
1417
}
15-
16-
@override
17-
String toString() {
18-
return '''
19-
url: $url
20-
value: $value
21-
''';
22-
}
2318
}

test/rss_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ void main() {
7272
expect(feed.items.first.source.url, "https://foo.bar.news/1?source");
7373
expect(feed.items.first.source.value, "Foo Bar");
7474
expect(feed.items.first.comments, "https://foo.bar.news/1/comments");
75+
expect(feed.items.first.enclosure.url, "http://www.scripting.com/mp3s/weatherReportSuite.mp3");
76+
expect(feed.items.first.enclosure.length, 12216320);
77+
expect(feed.items.first.enclosure.type, "audio/mpeg");
7578

7679
expect(feed.items.first.content.value, "<img width=\"1000\" height=\"690\" src=\"https://test.com/image_link\"/> Test content<br />");
7780
expect(feed.items.first.content.images.first, "https://test.com/image_link");

test/xml/RSS.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<source url="https://foo.bar.news/1?source">Foo Bar</source>
4848
<comments>https://foo.bar.news/1/comments</comments>
4949
<content:encoded><![CDATA[<img width="1000" height="690" src="https://test.com/image_link"/> Test content<br />]]></content:encoded>
50+
<enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg" />
5051
</item>
5152
<item>
5253
<title>Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC</title>

0 commit comments

Comments
 (0)