mirror of
https://github.com/chylex/Nextcloud-News.git
synced 2025-05-12 16:34:05 +02:00
Basic Media-RSS support (#599)
Signed-off-by: Éloi Rivard <azmeuk@gmail.com>
This commit is contained in:
parent
cdd15c1818
commit
306d3cdc60
appinfo
docs/plugins
lib
templates
tests
@ -350,6 +350,16 @@
|
|||||||
<type>clob</type>
|
<type>clob</type>
|
||||||
<notnull>false</notnull>
|
<notnull>false</notnull>
|
||||||
</field>
|
</field>
|
||||||
|
<field>
|
||||||
|
<name>media_thumbnail</name>
|
||||||
|
<type>clob</type>
|
||||||
|
<notnull>false</notnull>
|
||||||
|
</field>
|
||||||
|
<field>
|
||||||
|
<name>media_description</name>
|
||||||
|
<type>clob</type>
|
||||||
|
<notnull>false</notnull>
|
||||||
|
</field>
|
||||||
<field>
|
<field>
|
||||||
<name>feed_id</name>
|
<name>feed_id</name>
|
||||||
<type>integer</type>
|
<type>integer</type>
|
||||||
|
@ -112,6 +112,8 @@ The **addArticleAction** method expects a function with the following parameters
|
|||||||
* **body**: the html content
|
* **body**: the html content
|
||||||
* **enclosureMime**: if an enclosure is added, this is the mime type
|
* **enclosureMime**: if an enclosure is added, this is the mime type
|
||||||
* **enclosureLink**: this is the source of the enclosure
|
* **enclosureLink**: this is the source of the enclosure
|
||||||
|
* **mediaThumbnail**: if there is a media attached, this is its thumbnail
|
||||||
|
* **mediaDescription**: if there is a media attached, this is its description
|
||||||
* **feedId**: the feed id it belongs to
|
* **feedId**: the feed id it belongs to
|
||||||
* **unread**: if the article is unread (bool)
|
* **unread**: if the article is unread (bool)
|
||||||
* **starred**: if the article is starred (bool)
|
* **starred**: if the article is starred (bool)
|
||||||
|
@ -41,6 +41,10 @@ class Item extends Entity implements IAPI, \JsonSerializable
|
|||||||
protected $enclosureMime;
|
protected $enclosureMime;
|
||||||
/** @var string|null */
|
/** @var string|null */
|
||||||
protected $enclosureLink;
|
protected $enclosureLink;
|
||||||
|
/** @var string|null */
|
||||||
|
protected $mediaThumbnail;
|
||||||
|
/** @var string|null */
|
||||||
|
protected $mediaDescription;
|
||||||
/** @var int */
|
/** @var int */
|
||||||
protected $feedId;
|
protected $feedId;
|
||||||
/** @var int */
|
/** @var int */
|
||||||
@ -84,6 +88,8 @@ class Item extends Entity implements IAPI, \JsonSerializable
|
|||||||
$item->setBody($import['body']);
|
$item->setBody($import['body']);
|
||||||
$item->setEnclosureMime($import['enclosureMime']);
|
$item->setEnclosureMime($import['enclosureMime']);
|
||||||
$item->setEnclosureLink($import['enclosureLink']);
|
$item->setEnclosureLink($import['enclosureLink']);
|
||||||
|
$item->setMediaThumbnail($import['mediaThumbnail']);
|
||||||
|
$item->setMediaDescription($import['mediaDescription']);
|
||||||
$item->setRtl($import['rtl']);
|
$item->setRtl($import['rtl']);
|
||||||
$item->setUnread($import['unread']);
|
$item->setUnread($import['unread']);
|
||||||
$item->setStarred($import['starred']);
|
$item->setStarred($import['starred']);
|
||||||
@ -259,6 +265,8 @@ class Item extends Entity implements IAPI, \JsonSerializable
|
|||||||
'body' => $this->getBody(),
|
'body' => $this->getBody(),
|
||||||
'enclosureMime' => $this->getEnclosureMime(),
|
'enclosureMime' => $this->getEnclosureMime(),
|
||||||
'enclosureLink' => $this->getEnclosureLink(),
|
'enclosureLink' => $this->getEnclosureLink(),
|
||||||
|
'mediaThumbnail' => $this->getMediaThumbnail(),
|
||||||
|
'mediaDescription' => $this->getMediaDescription(),
|
||||||
'feedId' => $this->getFeedId(),
|
'feedId' => $this->getFeedId(),
|
||||||
'unread' => $this->isUnread(),
|
'unread' => $this->isUnread(),
|
||||||
'starred' => $this->isStarred(),
|
'starred' => $this->isStarred(),
|
||||||
@ -315,6 +323,22 @@ class Item extends Entity implements IAPI, \JsonSerializable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setMediaThumbnail(string $mediaThumbnail = null)
|
||||||
|
{
|
||||||
|
if ($this->mediaThumbnail !== $mediaThumbnail) {
|
||||||
|
$this->mediaThumbnail = $mediaThumbnail;
|
||||||
|
$this->markFieldUpdated('mediaThumbnail');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMediaDescription(string $mediaDescription = null)
|
||||||
|
{
|
||||||
|
if ($this->mediaDescription !== $mediaDescription) {
|
||||||
|
$this->mediaDescription = $mediaDescription;
|
||||||
|
$this->markFieldUpdated('mediaDescription');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function setFeedId(int $feedId)
|
public function setFeedId(int $feedId)
|
||||||
{
|
{
|
||||||
if ($this->feedId !== $feedId) {
|
if ($this->feedId !== $feedId) {
|
||||||
@ -446,6 +470,8 @@ class Item extends Entity implements IAPI, \JsonSerializable
|
|||||||
'body' => $this->getBody(),
|
'body' => $this->getBody(),
|
||||||
'enclosureMime' => $this->getEnclosureMime(),
|
'enclosureMime' => $this->getEnclosureMime(),
|
||||||
'enclosureLink' => $this->getEnclosureLink(),
|
'enclosureLink' => $this->getEnclosureLink(),
|
||||||
|
'mediaThumbnail' => $this->getMediaThumbnail(),
|
||||||
|
'mediaDescription' => $this->getMediaDescription(),
|
||||||
'feedId' => $this->getFeedId(),
|
'feedId' => $this->getFeedId(),
|
||||||
'unread' => $this->isUnread(),
|
'unread' => $this->isUnread(),
|
||||||
'starred' => $this->isStarred(),
|
'starred' => $this->isStarred(),
|
||||||
@ -468,6 +494,8 @@ class Item extends Entity implements IAPI, \JsonSerializable
|
|||||||
'body' => $this->getBody(),
|
'body' => $this->getBody(),
|
||||||
'enclosureMime' => $this->getEnclosureMime(),
|
'enclosureMime' => $this->getEnclosureMime(),
|
||||||
'enclosureLink' => $this->getEnclosureLink(),
|
'enclosureLink' => $this->getEnclosureLink(),
|
||||||
|
'mediaThumbnail' => $this->getMediaThumbnail(),
|
||||||
|
'mediaDescription' => $this->getMediaDescription(),
|
||||||
'unread' => $this->isUnread(),
|
'unread' => $this->isUnread(),
|
||||||
'starred' => $this->isStarred(),
|
'starred' => $this->isStarred(),
|
||||||
'feedLink' => $feeds['feed' . $this->getFeedId()]->getLink(),
|
'feedLink' => $feeds['feed' . $this->getFeedId()]->getLink(),
|
||||||
|
@ -256,11 +256,19 @@ class FeedFetcher implements IFeedFetcher
|
|||||||
if ($parsedItem->hasMedia()) {
|
if ($parsedItem->hasMedia()) {
|
||||||
// TODO: Fix multiple media support
|
// TODO: Fix multiple media support
|
||||||
foreach ($parsedItem->getMedias() as $media) {
|
foreach ($parsedItem->getMedias() as $media) {
|
||||||
if (!$item->isSupportedMime($media->getType())) {
|
if (!$item->isSupportedMime($media->getType())
|
||||||
|
&& !$media->getThumbnail()
|
||||||
|
&& !$media->getDescription()
|
||||||
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$item->setEnclosureMime($media->getType());
|
$item->setEnclosureMime($media->getType());
|
||||||
$item->setEnclosureLink($media->getUrl());
|
$item->setEnclosureLink($media->getUrl());
|
||||||
|
$item->setMediaThumbnail($media->getThumbnail());
|
||||||
|
if ($media->getDescription()) {
|
||||||
|
$description = str_replace("\n", "<br>", $media->getDescription());
|
||||||
|
$item->setMediaDescription($description);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +144,12 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="enclosure thumbnail" ng-if="item.mediaThumbnail">
|
||||||
|
<a ng-href="{{ ::item.enclosureLink }}"><img ng-src="{{ item.mediaThumbnail|trustUrl }}" alt="" /></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="enclosure description" ng-if="item.mediaDescription" news-bind-html-unsafe="item.mediaDescription"></div>
|
||||||
|
|
||||||
<div class="body" news-bind-html-unsafe="item.body" ng-attr-dir="{{item.rtl && 'rtl'}}"></div>
|
<div class="body" news-bind-html-unsafe="item.body" ng-attr-dir="{{item.rtl && 'rtl'}}"></div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -30,6 +30,8 @@ class ItemFixture extends Item
|
|||||||
'body' => 'this is a body',
|
'body' => 'this is a body',
|
||||||
'enclosureMime' => 'video/mpeg',
|
'enclosureMime' => 'video/mpeg',
|
||||||
'enclosureLink' => 'http://google.de/web.webm',
|
'enclosureLink' => 'http://google.de/web.webm',
|
||||||
|
'mediaThumbnail' => 'https://i3.ytimg.com/vi/Zgge1O9wdPY/hqdefault.jpg',
|
||||||
|
'mediaDescription' => 'The best video ever',
|
||||||
'feedId' => 0,
|
'feedId' => 0,
|
||||||
'unread' => true,
|
'unread' => true,
|
||||||
'starred' => false,
|
'starred' => false,
|
||||||
|
@ -131,10 +131,12 @@ class ExportControllerTest extends TestCase
|
|||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
'[{"guid":"guid","url":null,"title":null,' .
|
'[{"guid":"guid","url":null,"title":null,' .
|
||||||
'"author":null,"pubDate":null,"updatedDate":null,"body":null,"enclosureMime":null,' .
|
'"author":null,"pubDate":null,"updatedDate":null,"body":null,"enclosureMime":null,' .
|
||||||
'"enclosureLink":null,"unread":false,"starred":false,' .
|
'"enclosureLink":null,"mediaThumbnail":null,"mediaDescription":null,'.
|
||||||
|
'"unread":false,"starred":false,' .
|
||||||
'"feedLink":"http:\/\/goo","rtl":false},{"guid":"guid","url":null,' .
|
'"feedLink":"http:\/\/goo","rtl":false},{"guid":"guid","url":null,' .
|
||||||
'"title":null,"author":null,"pubDate":null,"updatedDate":null,"body":null,' .
|
'"title":null,"author":null,"pubDate":null,"updatedDate":null,"body":null,' .
|
||||||
'"enclosureMime":null,"enclosureLink":null,"unread":false,' .
|
'"enclosureMime":null,"enclosureLink":null,"mediaThumbnail":null,'.
|
||||||
|
'"mediaDescription":null,"unread":false,' .
|
||||||
'"starred":false,"feedLink":"http:\/\/gee","rtl":false}]',
|
'"starred":false,"feedLink":"http:\/\/gee","rtl":false}]',
|
||||||
$return->render()
|
$return->render()
|
||||||
);
|
);
|
||||||
|
@ -79,6 +79,8 @@ class ItemTest extends TestCase
|
|||||||
$item->setBody('body');
|
$item->setBody('body');
|
||||||
$item->setEnclosureMime('audio/ogg');
|
$item->setEnclosureMime('audio/ogg');
|
||||||
$item->setEnclosureLink('enclink');
|
$item->setEnclosureLink('enclink');
|
||||||
|
$item->setMediaThumbnail('https://i2.ytimg.com/vi/E6B3uvhrcQk/hqdefault.jpg');
|
||||||
|
$item->setMediaDescription('The best video ever');
|
||||||
$item->setRtl(true);
|
$item->setRtl(true);
|
||||||
$item->setFeedId(1);
|
$item->setFeedId(1);
|
||||||
$item->setStatus(0);
|
$item->setStatus(0);
|
||||||
@ -101,6 +103,8 @@ class ItemTest extends TestCase
|
|||||||
'body' => 'body',
|
'body' => 'body',
|
||||||
'enclosureMime' => 'audio/ogg',
|
'enclosureMime' => 'audio/ogg',
|
||||||
'enclosureLink' => 'enclink',
|
'enclosureLink' => 'enclink',
|
||||||
|
'mediaThumbnail' => 'https://i2.ytimg.com/vi/E6B3uvhrcQk/hqdefault.jpg',
|
||||||
|
'mediaDescription' => 'The best video ever',
|
||||||
'feedId' => 1,
|
'feedId' => 1,
|
||||||
'unread' => true,
|
'unread' => true,
|
||||||
'starred' => true,
|
'starred' => true,
|
||||||
@ -127,6 +131,8 @@ class ItemTest extends TestCase
|
|||||||
$item->setBody('<body><div>this is a test</body>');
|
$item->setBody('<body><div>this is a test</body>');
|
||||||
$item->setEnclosureMime('audio/ogg');
|
$item->setEnclosureMime('audio/ogg');
|
||||||
$item->setEnclosureLink('enclink');
|
$item->setEnclosureLink('enclink');
|
||||||
|
$item->setMediaThumbnail('https://i2.ytimg.com/vi/E6B3uvhrcQk/hqdefault.jpg');
|
||||||
|
$item->setMediaDescription('The best video ever');
|
||||||
$item->setFeedId(1);
|
$item->setFeedId(1);
|
||||||
$item->setStatus(0);
|
$item->setStatus(0);
|
||||||
$item->setRtl(true);
|
$item->setRtl(true);
|
||||||
@ -148,6 +154,8 @@ class ItemTest extends TestCase
|
|||||||
'body' => '<body><div>this is a test</body>',
|
'body' => '<body><div>this is a test</body>',
|
||||||
'enclosureMime' => 'audio/ogg',
|
'enclosureMime' => 'audio/ogg',
|
||||||
'enclosureLink' => 'enclink',
|
'enclosureLink' => 'enclink',
|
||||||
|
'mediaThumbnail' => 'https://i2.ytimg.com/vi/E6B3uvhrcQk/hqdefault.jpg',
|
||||||
|
'mediaDescription' => 'The best video ever',
|
||||||
'feedId' => 1,
|
'feedId' => 1,
|
||||||
'unread' => true,
|
'unread' => true,
|
||||||
'starred' => true,
|
'starred' => true,
|
||||||
@ -173,6 +181,8 @@ class ItemTest extends TestCase
|
|||||||
$item->setBody('body');
|
$item->setBody('body');
|
||||||
$item->setEnclosureMime('audio/ogg');
|
$item->setEnclosureMime('audio/ogg');
|
||||||
$item->setEnclosureLink('enclink');
|
$item->setEnclosureLink('enclink');
|
||||||
|
$item->setMediaThumbnail('https://i2.ytimg.com/vi/E6B3uvhrcQk/hqdefault.jpg');
|
||||||
|
$item->setMediaDescription('The best video ever');
|
||||||
$item->setFeedId(1);
|
$item->setFeedId(1);
|
||||||
$item->setRtl(true);
|
$item->setRtl(true);
|
||||||
$item->setStatus(0);
|
$item->setStatus(0);
|
||||||
@ -195,6 +205,8 @@ class ItemTest extends TestCase
|
|||||||
'body' => 'body',
|
'body' => 'body',
|
||||||
'enclosureMime' => 'audio/ogg',
|
'enclosureMime' => 'audio/ogg',
|
||||||
'enclosureLink' => 'enclink',
|
'enclosureLink' => 'enclink',
|
||||||
|
'mediaThumbnail' => 'https://i2.ytimg.com/vi/E6B3uvhrcQk/hqdefault.jpg',
|
||||||
|
'mediaDescription' => 'The best video ever',
|
||||||
'unread' => false,
|
'unread' => false,
|
||||||
'starred' => true,
|
'starred' => true,
|
||||||
'feedLink' => 'http://test',
|
'feedLink' => 'http://test',
|
||||||
@ -257,6 +269,8 @@ class ItemTest extends TestCase
|
|||||||
'body' => $item->getBody(),
|
'body' => $item->getBody(),
|
||||||
'enclosureMime' => $item->getEnclosureMime(),
|
'enclosureMime' => $item->getEnclosureMime(),
|
||||||
'enclosureLink' => $item->getEnclosureLink(),
|
'enclosureLink' => $item->getEnclosureLink(),
|
||||||
|
'mediaThumbnail' => $item->getMediaThumbnail(),
|
||||||
|
'mediaDescription' => $item->getMediaDescription(),
|
||||||
'unread' => $item->isUnread(),
|
'unread' => $item->isUnread(),
|
||||||
'starred' => $item->isStarred(),
|
'starred' => $item->isStarred(),
|
||||||
'rtl' => $item->getRtl()
|
'rtl' => $item->getRtl()
|
||||||
@ -282,6 +296,8 @@ class ItemTest extends TestCase
|
|||||||
'body' => $item->getBody(),
|
'body' => $item->getBody(),
|
||||||
'enclosureMime' => $item->getEnclosureMime(),
|
'enclosureMime' => $item->getEnclosureMime(),
|
||||||
'enclosureLink' => $item->getEnclosureLink(),
|
'enclosureLink' => $item->getEnclosureLink(),
|
||||||
|
'mediaThumbnail' => $item->getMediaThumbnail(),
|
||||||
|
'mediaDescription' => $item->getMediaDescription(),
|
||||||
'unread' => $item->isUnread(),
|
'unread' => $item->isUnread(),
|
||||||
'starred' => $item->isStarred(),
|
'starred' => $item->isStarred(),
|
||||||
'rtl' => $item->getRtl()
|
'rtl' => $item->getRtl()
|
||||||
|
Loading…
Reference in New Issue
Block a user