Skip to content

Commit f41e27a

Browse files
nikhiltrifreekmurze
authored andcommitted
Add support for flipboard and conform to RSS 2.0 (fixes spatie#19) (spatie#92)
* Add description to Feeds * Add language to Feeds * Correct PHPDoc * Add enclosure to FeedItems * Add category to FeedItems * Update date formats to conform to RSS 2.0 spec * Make enclosure property optional in view
1 parent a273e4e commit f41e27a

9 files changed

+158
-23
lines changed

resources/views/feed.blade.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@
2323
<summary type="html">
2424
<![CDATA[{!! $item->summary !!}]]>
2525
</summary>
26-
<updated>{{ $item->updated->toAtomString() }}</updated>
26+
@if($item->__isset('enclosure'))
27+
<enclosure url="{{ url($item->enclosure) }}" length="{{ $item->enclosureLength }}" type="{{ $item->enclosureType }}" />
28+
@endif
29+
<category type="html">
30+
<![CDATA[{!! $item->category ?? '' !!}]]>
31+
</category>
32+
<updated>{{ $item->updated->toRssString() }}</updated>
2733
</entry>
2834
@endforeach
2935
</feed>

src/Feed.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ class Feed implements Responsable
1313
/** @var string */
1414
protected $title;
1515

16+
/** @var string */
17+
protected $description;
18+
19+
/** @var string */
20+
protected $language;
21+
1622
/** @var string */
1723
protected $url;
1824

@@ -22,9 +28,11 @@ class Feed implements Responsable
2228
/** @var \Illuminate\Support\Collection */
2329
protected $items;
2430

25-
public function __construct($title, $url, $resolver, $view)
31+
public function __construct($title, $url, $resolver, $view, $description, $language)
2632
{
2733
$this->title = $title;
34+
$this->description = $description;
35+
$this->language = $language;
2836
$this->url = $url;
2937
$this->view = $view;
3038

@@ -37,6 +45,8 @@ public function toResponse($request): Response
3745
'id' => url($this->url),
3846
'link' => url($this->url),
3947
'title' => $this->title,
48+
'description' => $this->description,
49+
'language' => $this->language,
4050
'updated' => $this->lastUpdated(),
4151
];
4252

@@ -98,6 +108,6 @@ protected function lastUpdated(): string
98108

99109
return $this->items->sortBy(function ($feedItem) {
100110
return $feedItem->updated;
101-
})->last()->updated->toAtomString();
111+
})->last()->updated->toRssString();
102112
}
103113
}

src/FeedItem.php

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,24 @@ class FeedItem
2020
/** @var string */
2121
protected $summary;
2222

23-
/** @var @var string */
23+
/** @var string */
2424
protected $link;
2525

26+
/** @var string */
27+
protected $enclosure;
28+
29+
/** @var int */
30+
protected $enclosureLength;
31+
32+
/** @var string */
33+
protected $enclosureType;
34+
2635
/** @var string */
2736
protected $author;
2837

38+
/** @var string */
39+
protected $category;
40+
2941
public function __construct(array $data = [])
3042
{
3143
foreach ($data as $key => $value) {
@@ -73,13 +85,41 @@ public function link(string $link)
7385
return $this;
7486
}
7587

88+
public function enclosure(string $enclosure)
89+
{
90+
$this->enclosure = $enclosure;
91+
92+
return $this;
93+
}
94+
95+
public function enclosureLength(int $enclosureLength)
96+
{
97+
$this->enclosureLength = $enclosureLength;
98+
99+
return $this;
100+
}
101+
102+
public function enclosureType(string $enclosureType)
103+
{
104+
$this->enclosureType = $enclosureType;
105+
106+
return $this;
107+
}
108+
76109
public function author(string $author)
77110
{
78111
$this->author = $author;
79112

80113
return $this;
81114
}
82115

116+
public function category(string $category)
117+
{
118+
$this->category = $category;
119+
120+
return $this;
121+
}
122+
83123
public function validate()
84124
{
85125
$requiredFields = ['id', 'title', 'updated', 'summary', 'link', 'author'];
@@ -99,4 +139,9 @@ public function __get($key)
99139

100140
return $this->$key;
101141
}
142+
143+
public function __isset($key)
144+
{
145+
return isset($this->$key);
146+
}
102147
}

src/Http/FeedController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ public function __invoke()
1717

1818
abort_unless($feed, 404);
1919

20-
return new Feed($feed['title'], request()->url(), $feed['items'], $feed['view'] ?? 'feed::feed');
20+
return new Feed($feed['title'], request()->url(), $feed['items'], $feed['view'] ?? 'feed::feed', $feed['description'] ?? '', $feed['language'] ?? '');
2121
}
2222
}

tests/DummyItem.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@ public function toFeedItem()
1414
'id' => 1,
1515
'title' => 'feedItemTitle',
1616
'summary' => 'feedItemSummary',
17+
'enclosure' => 'http://localhost/image1.jpg',
18+
'enclosureLength' => 31300,
19+
'enclosureType' => 'image/jpeg',
1720
'updated' => Carbon::now(),
1821
'link' => 'https://localhost/news/testItem1',
1922
'author' => 'feedItemAuthor',
23+
'category' => 'feedItemCategory',
2024
]);
2125
}
2226
}

tests/TestCase.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,28 @@ protected function getEnvironmentSetUp($app)
3737
'url' => '/feed1',
3838
'title' => 'Feed 1',
3939
'description' => 'This is feed 1 from the unit tests',
40+
'language' => 'en-US',
4041
],
4142
[
4243
'items' => 'Spatie\Feed\Test\DummyRepository@getAll',
4344
'url' => '/feed2',
4445
'title' => 'Feed 2',
4546
'description' => 'This is feed 2 from the unit tests',
47+
'language' => 'en-US',
4648
],
4749
[
4850
'items' => ['Spatie\Feed\Test\DummyRepository@getAllWithArguments', 'first'],
4951
'url' => '/feed3',
5052
'title' => 'Feed 3',
5153
'description' => 'This is feed 3 from the unit tests',
54+
'language' => 'en-US',
5255
],
5356
[
5457
'items' => 'Spatie\Feed\Test\DummyRepository@getAll',
5558
'url' => '/feed-with-custom-view',
5659
'title' => 'Feed with Custom View',
5760
'description' => 'This is a feed that uses custom views from the unit tests',
61+
'language' => 'en-US',
5862
'view' => 'feed::links',
5963
],
6064
];

tests/__snapshots__/FeedTest__all_feed_items_have_expected_data__1.php

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
<id>http://localhost/feedBaseUrl/feed1</id>
44
<link href="http://localhost/feedBaseUrl/feed1"></link>
55
<title><![CDATA[Feed 1]]></title>
6-
<updated>2016-01-01T00:00:00+01:00</updated>
6+
<description>This is feed 1 from the unit tests</description>
7+
<language>en-US</language>
8+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
79
<entry>
810
<title><![CDATA[feedItemTitle]]></title>
911
<link rel="alternate" href="https://localhost/news/testItem1" />
@@ -14,7 +16,11 @@
1416
<summary type="html">
1517
<![CDATA[feedItemSummary]]>
1618
</summary>
17-
<updated>2016-01-01T00:00:00+01:00</updated>
19+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
20+
<category type="html">
21+
<![CDATA[feedItemCategory]]>
22+
</category>
23+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
1824
</entry>
1925
<entry>
2026
<title><![CDATA[feedItemTitle]]></title>
@@ -26,7 +32,11 @@
2632
<summary type="html">
2733
<![CDATA[feedItemSummary]]>
2834
</summary>
29-
<updated>2016-01-01T00:00:00+01:00</updated>
35+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
36+
<category type="html">
37+
<![CDATA[feedItemCategory]]>
38+
</category>
39+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
3040
</entry>
3141
<entry>
3242
<title><![CDATA[feedItemTitle]]></title>
@@ -38,7 +48,11 @@
3848
<summary type="html">
3949
<![CDATA[feedItemSummary]]>
4050
</summary>
41-
<updated>2016-01-01T00:00:00+01:00</updated>
51+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
52+
<category type="html">
53+
<![CDATA[feedItemCategory]]>
54+
</category>
55+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
4256
</entry>
4357
<entry>
4458
<title><![CDATA[feedItemTitle]]></title>
@@ -50,7 +64,11 @@
5064
<summary type="html">
5165
<![CDATA[feedItemSummary]]>
5266
</summary>
53-
<updated>2016-01-01T00:00:00+01:00</updated>
67+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
68+
<category type="html">
69+
<![CDATA[feedItemCategory]]>
70+
</category>
71+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
5472
</entry>
5573
<entry>
5674
<title><![CDATA[feedItemTitle]]></title>
@@ -62,7 +80,11 @@
6280
<summary type="html">
6381
<![CDATA[feedItemSummary]]>
6482
</summary>
65-
<updated>2016-01-01T00:00:00+01:00</updated>
83+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
84+
<category type="html">
85+
<![CDATA[feedItemCategory]]>
86+
</category>
87+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
6688
</entry>
6789
</feed>
6890
';

tests/__snapshots__/FeedTest__all_feed_items_have_expected_data__2.php

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
<id>http://localhost/feedBaseUrl/feed2</id>
44
<link href="http://localhost/feedBaseUrl/feed2"></link>
55
<title><![CDATA[Feed 2]]></title>
6-
<updated>2016-01-01T00:00:00+01:00</updated>
6+
<description>This is feed 2 from the unit tests</description>
7+
<language>en-US</language>
8+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
79
<entry>
810
<title><![CDATA[feedItemTitle]]></title>
911
<link rel="alternate" href="https://localhost/news/testItem1" />
@@ -14,7 +16,11 @@
1416
<summary type="html">
1517
<![CDATA[feedItemSummary]]>
1618
</summary>
17-
<updated>2016-01-01T00:00:00+01:00</updated>
19+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
20+
<category type="html">
21+
<![CDATA[feedItemCategory]]>
22+
</category>
23+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
1824
</entry>
1925
<entry>
2026
<title><![CDATA[feedItemTitle]]></title>
@@ -26,7 +32,11 @@
2632
<summary type="html">
2733
<![CDATA[feedItemSummary]]>
2834
</summary>
29-
<updated>2016-01-01T00:00:00+01:00</updated>
35+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
36+
<category type="html">
37+
<![CDATA[feedItemCategory]]>
38+
</category>
39+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
3040
</entry>
3141
<entry>
3242
<title><![CDATA[feedItemTitle]]></title>
@@ -38,7 +48,11 @@
3848
<summary type="html">
3949
<![CDATA[feedItemSummary]]>
4050
</summary>
41-
<updated>2016-01-01T00:00:00+01:00</updated>
51+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
52+
<category type="html">
53+
<![CDATA[feedItemCategory]]>
54+
</category>
55+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
4256
</entry>
4357
<entry>
4458
<title><![CDATA[feedItemTitle]]></title>
@@ -50,7 +64,11 @@
5064
<summary type="html">
5165
<![CDATA[feedItemSummary]]>
5266
</summary>
53-
<updated>2016-01-01T00:00:00+01:00</updated>
67+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
68+
<category type="html">
69+
<![CDATA[feedItemCategory]]>
70+
</category>
71+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
5472
</entry>
5573
<entry>
5674
<title><![CDATA[feedItemTitle]]></title>
@@ -62,7 +80,11 @@
6280
<summary type="html">
6381
<![CDATA[feedItemSummary]]>
6482
</summary>
65-
<updated>2016-01-01T00:00:00+01:00</updated>
83+
<enclosure url="http://localhost/image1.jpg" length="31300" type="image/jpeg" />
84+
<category type="html">
85+
<![CDATA[feedItemCategory]]>
86+
</category>
87+
<updated>Fri, 01 Jan 2016 00:00:00 +0100</updated>
6688
</entry>
6789
</feed>
6890
';

0 commit comments

Comments
 (0)