Skip to content

Commit 0a8e430

Browse files
committed
support media:group
1 parent 8228b2c commit 0a8e430

File tree

8 files changed

+187
-5
lines changed

8 files changed

+187
-5
lines changed

lib/domain/media/category.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:xml/xml.dart';
2+
3+
class Category {
4+
final String scheme;
5+
final String label;
6+
final String value;
7+
8+
Category({
9+
this.scheme,
10+
this.label,
11+
this.value,
12+
});
13+
14+
factory Category.parse(XmlElement element) {
15+
if (element == null) {
16+
return null;
17+
}
18+
return new Category(
19+
scheme: element.getAttribute("scheme"),
20+
label: element.getAttribute("label"),
21+
value: element.text,
22+
);
23+
}
24+
}

lib/domain/media/credit.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'package:xml/xml.dart';
2+
3+
class Credit {
4+
final String role;
5+
final String scheme;
6+
final String value;
7+
8+
Credit({
9+
this.role,
10+
this.scheme,
11+
this.value,
12+
});
13+
14+
factory Credit.parse(XmlElement element) {
15+
return new Credit(
16+
role: element.getAttribute("role"),
17+
scheme: element.getAttribute("scheme"),
18+
value: element.text,
19+
);
20+
}
21+
}

lib/domain/media/group.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'package:webfeed/domain/media/category.dart';
2+
import 'package:webfeed/domain/media/content.dart';
3+
import 'package:webfeed/domain/media/credit.dart';
4+
import 'package:webfeed/domain/media/rating.dart';
5+
import 'package:webfeed/util/helpers.dart';
6+
import 'package:xml/xml.dart';
7+
8+
class Group {
9+
final List<Content> contents;
10+
final List<Credit> credits;
11+
final Category category;
12+
final Rating rating;
13+
14+
Group({
15+
this.contents,
16+
this.credits,
17+
this.category,
18+
this.rating,
19+
});
20+
21+
factory Group.parse(XmlElement element) {
22+
if (element == null) {
23+
return null;
24+
}
25+
return new Group(
26+
contents: element.findElements("media:content").map((e) {
27+
return new Content.parse(e);
28+
}).toList(),
29+
credits: element.findElements("media:credit").map((e) {
30+
return new Credit.parse(e);
31+
}).toList(),
32+
category: new Category.parse(
33+
findElementOrNull(element, "media:category"),
34+
),
35+
rating: new Rating.parse(
36+
findElementOrNull(element, "media:rating"),
37+
),
38+
);
39+
}
40+
}

lib/domain/media/media.dart

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,43 @@
1+
import 'package:webfeed/domain/media/category.dart';
12
import 'package:webfeed/domain/media/content.dart';
3+
import 'package:webfeed/domain/media/credit.dart';
4+
import 'package:webfeed/domain/media/group.dart';
5+
import 'package:webfeed/domain/media/rating.dart';
6+
import 'package:webfeed/util/helpers.dart';
27
import 'package:xml/xml.dart';
38

49
class Media {
10+
final Group group;
511
final List<Content> contents;
12+
final List<Credit> credits;
13+
final Category category;
14+
final Rating rating;
615

7-
Media({this.contents});
16+
Media({
17+
this.group,
18+
this.contents,
19+
this.credits,
20+
this.category,
21+
this.rating,
22+
});
823

924
factory Media.parse(XmlElement element) {
10-
var contents = element.findAllElements("media:content").map((e) {
11-
return new Content.parse(e);
12-
}).toList();
1325
return new Media(
14-
contents: contents,
26+
group: new Group.parse(
27+
findElementOrNull(element, "media:group"),
28+
),
29+
contents: element.findElements("media:content").map((e) {
30+
return new Content.parse(e);
31+
}).toList(),
32+
credits: element.findElements("media:credit").map((e) {
33+
return new Credit.parse(e);
34+
}).toList(),
35+
category: new Category.parse(
36+
findElementOrNull(element, "media:category"),
37+
),
38+
rating: new Rating.parse(
39+
findElementOrNull(element, "media:rating"),
40+
),
1541
);
1642
}
1743
}

lib/domain/media/rating.dart

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

lib/util/helpers.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ import 'dart:core';
22

33
import 'package:xml/xml.dart';
44

5+
XmlElement findElementOrNull(XmlElement element, String name) {
6+
try {
7+
return element.findAllElements(name).first;
8+
} on StateError {
9+
return null;
10+
}
11+
}
12+
513
String xmlGetString(XmlElement element, String name, {strict: true}) {
614
try {
715
return element.findElements(name).first.text;

test/rss_test.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ void main() {
9090
expect(item.link, "http://www.foo.com");
9191
expect(item.pubDate, "Mon, 27 Aug 2001 16:08:56 PST");
9292

93+
expect(item.media.group.contents.length, 5);
94+
expect(item.media.group.credits.length, 2);
95+
expect(item.media.group.category.value, "music/artist name/album/song");
96+
expect(item.media.group.rating.value, "nonadult");
97+
9398
expect(item.media.contents.length, 2);
9499
var mediaContent = item.media.contents.first;
95100
expect(mediaContent.url, "http://www.foo.com/video.mov");
@@ -102,5 +107,18 @@ void main() {
102107
expect(mediaContent.framerate, 25);
103108
expect(mediaContent.samplingrate, 44.1);
104109
expect(mediaContent.channels, 2);
110+
111+
expect(item.media.credits.length, 2);
112+
var mediaCredit = item.media.credits.first;
113+
expect(mediaCredit.role, "owner1");
114+
expect(mediaCredit.scheme, "urn:yvs");
115+
expect(mediaCredit.value, "copyright holder of the entity");
116+
117+
expect(item.media.category.scheme, "http://search.yahoo.com/mrss/category_ schema");
118+
expect(item.media.category.label, "Music");
119+
expect(item.media.category.value, "music/artist/album/song");
120+
121+
expect(item.media.rating.scheme, "urn:simple");
122+
expect(item.media.rating.value, "adult");
105123
});
106124
}

test/xml/RSS-Media.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,30 @@
1010
<pubDate>Mon, 27 Aug 2001 16:08:56 PST</pubDate>
1111
<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" />
1212
<media:content url="http://www.foo.com/video2.mov" fileSize="2000" bitrate="128" type="video/quicktime" expression="full" />
13+
<media:credit role="owner1" scheme="urn:yvs">copyright holder of the entity</media:credit>
14+
<media:credit role="owner2" scheme="urn:yvs">copyright holder of the entity</media:credit>
15+
<media:category scheme="http://search.yahoo.com/mrss/category_ schema" label="Music">music/artist/album/song</media:category>
16+
<media:rating scheme="urn:simple">adult</media:rating>
17+
<media:group>
18+
<media:content url="http://www.foo.com/song64kbps.mp3"
19+
fileSize="1000" bitrate="64" type="audio/mpeg"
20+
isDefault="true" expression="full" />
21+
<media:content url="http://www.foo.com/song128kbps.mp3"
22+
fileSize="2000" bitrate="128" type="audio/mpeg"
23+
expression="full" />
24+
<media:content url="http://www.foo.com/song256kbps.mp3"
25+
fileSize="4000" bitrate="256" type="audio/mpeg"
26+
expression="full" />
27+
<media:content url="http://www.foo.com/song512kbps.mp3.torrent"
28+
fileSize="8000" type="application/x-bittorrent;enclosed=audio/mpeg"
29+
expression="full" />
30+
<media:content url="http://www.foo.com/song.wav"
31+
fileSize="16000" type="audio/x-wav" expression="full" />
32+
<media:credit role="musician">band member 1</media:credit>
33+
<media:credit role="musician">band member 2</media:credit>
34+
<media:category>music/artist name/album/song</media:category>
35+
<media:rating>nonadult</media:rating>
36+
</media:group>
1337
<media:community>
1438
<media:starRating average="3.5" count="20" min="1" max="10" />
1539
<media:statistics views="5" favorites="5" />

0 commit comments

Comments
 (0)