@@ -4,14 +4,25 @@ import 'package:dart_rss/domain/atom_feed.dart';
4
4
import 'package:dart_rss/domain/rss1_feed.dart' ;
5
5
import 'package:dart_rss/domain/rss_feed.dart' ;
6
6
import 'package:xml/xml.dart' as xml;
7
+ import 'package:intl/intl.dart' ;
7
8
8
9
extension SafeParseDateTime on DateTime {
9
10
static DateTime safeParse (String str) {
11
+ const dateFormatPatterns = [
12
+ 'EEE, d MMM yyyy HH:mm:ss Z' ,
13
+ ];
14
+
10
15
try {
11
16
return DateTime .parse (str);
12
17
} catch (_) {
13
- return null ;
18
+ for (final pattern in dateFormatPatterns) {
19
+ try {
20
+ final format = DateFormat (pattern);
21
+ return format.parse (str);
22
+ } catch (_) {}
23
+ }
14
24
}
25
+ return null ;
15
26
}
16
27
}
17
28
@@ -40,56 +51,15 @@ class WebFeed {
40
51
switch (rssVersion) {
41
52
case RssVersion .RSS1 :
42
53
final rss1Feed = Rss1Feed .parse (xmlString);
43
- return WebFeed (
44
- title: rss1Feed.title,
45
- description: rss1Feed.description,
46
- links: [rss1Feed.link],
47
- items: rss1Feed.items
48
- .map (
49
- (item) => WebFeedItem (
50
- title: item.title,
51
- body: item.description ?? item.dc? .description,
52
- updated: SafeParseDateTime .safeParse (item.dc? .date),
53
- links: [item.link],
54
- ),
55
- )
56
- .toList (),
57
- );
54
+ return WebFeed .fromRss1 (rss1Feed);
58
55
break ;
59
56
case RssVersion .RSS2 :
60
57
final rss2Feed = RssFeed .parse (xmlString);
61
- return WebFeed (
62
- title: rss2Feed.title,
63
- description: rss2Feed.description,
64
- links: [rss2Feed.link],
65
- items: rss2Feed.items
66
- .map (
67
- (item) => WebFeedItem (
68
- title: item.title,
69
- body: item.description ?? item.dc? .description,
70
- updated: SafeParseDateTime .safeParse (item.dc? .date),
71
- ),
72
- )
73
- .toList (),
74
- );
58
+ return WebFeed .fromRss2 (rss2Feed);
75
59
break ;
76
60
case RssVersion .Atom :
77
61
final atomFeed = AtomFeed .parse (xmlString);
78
- return WebFeed (
79
- title: atomFeed.title,
80
- description: atomFeed.subtitle,
81
- links: atomFeed.links.map ((atomLink) => atomLink.href).toList (),
82
- items: atomFeed.items
83
- .map (
84
- (item) => WebFeedItem (
85
- title: item.title,
86
- body: item.summary,
87
- updated: SafeParseDateTime .safeParse (item.updated),
88
- links: item.links.map ((atomLink) => atomLink.href).toList (),
89
- ),
90
- )
91
- .toList (),
92
- );
62
+ return WebFeed .fromAtom (atomFeed);
93
63
break ;
94
64
case RssVersion .Unknown :
95
65
throw Error .safeToString (
@@ -100,6 +70,62 @@ class WebFeed {
100
70
}
101
71
}
102
72
73
+ static WebFeed fromRss1 (Rss1Feed rss1feed) {
74
+ return WebFeed (
75
+ title: rss1feed.title ?? rss1feed.dc.title ?? '' ,
76
+ description: rss1feed.description ?? rss1feed.dc? .description ?? '' ,
77
+ links: [rss1feed.link],
78
+ items: rss1feed.items
79
+ .map (
80
+ (item) => WebFeedItem (
81
+ title: item.title ?? item.dc? .title ?? '' ,
82
+ body: item.description ?? item.dc? .description ?? '' ,
83
+ updated: SafeParseDateTime .safeParse (item.dc? .date),
84
+ links: [item.link],
85
+ ),
86
+ )
87
+ .toList (),
88
+ );
89
+ }
90
+
91
+ static WebFeed fromRss2 (RssFeed rssFeed) {
92
+ return WebFeed (
93
+ title: rssFeed.title ?? rssFeed.dc.title ?? '' ,
94
+ description: rssFeed.description ?? rssFeed.dc.description ?? '' ,
95
+ links: [rssFeed.link],
96
+ items: rssFeed.items
97
+ .map (
98
+ (item) => WebFeedItem (
99
+ title: item.title ?? item.dc.title ?? '' ,
100
+ body: item.description ?? item.dc.description ?? '' ,
101
+ updated: SafeParseDateTime .safeParse (item.pubDate) ??
102
+ SafeParseDateTime .safeParse (item.dc.date),
103
+ links: [item.link],
104
+ ),
105
+ )
106
+ .toList (),
107
+ );
108
+ }
109
+
110
+ static WebFeed fromAtom (AtomFeed atomFeed) {
111
+ return WebFeed (
112
+ title: atomFeed.title,
113
+ description: atomFeed.subtitle,
114
+ links: atomFeed.links.map ((atomLink) => atomLink.href).toList (),
115
+ items: atomFeed.items
116
+ .map (
117
+ (item) => WebFeedItem (
118
+ title: item.title,
119
+ body: item.summary ?? item.content,
120
+ updated: SafeParseDateTime .safeParse (item.updated) ??
121
+ SafeParseDateTime .safeParse (item.published),
122
+ links: item.links.map ((atomLink) => atomLink.href).toList (),
123
+ ),
124
+ )
125
+ .toList (),
126
+ );
127
+ }
128
+
103
129
static Future <WebFeed > fromUrl (String url) async {
104
130
final response = await http.get (url);
105
131
return fromXmlString (response.body);
0 commit comments