зеркало из https://github.com/nextcloud/news.git
Родитель
df4cbdb81d
Коммит
bff164146b
|
@ -1,3 +1,6 @@
|
|||
owncloud-news (4.0.2)
|
||||
* **Enhancement**: Transform YouTube urls to allow subscribing to channels and playlists
|
||||
|
||||
owncloud-news (4.0.1)
|
||||
* **Bugfix**: Fix heise.de encoding issues
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@ use \OCA\News\Utility\ProxyConfigParser;
|
|||
|
||||
use \OCA\News\Fetcher\Fetcher;
|
||||
use \OCA\News\Fetcher\FeedFetcher;
|
||||
use \OCA\News\Fetcher\YoutubeFetcher;
|
||||
|
||||
use \OCA\News\ArticleEnhancer\Enhancer;
|
||||
use \OCA\News\ArticleEnhancer\GlobalArticleEnhancer;
|
||||
|
@ -466,6 +467,7 @@ class Application extends App {
|
|||
|
||||
// register fetchers in order
|
||||
// the most generic fetcher should be the last one
|
||||
$fetcher->registerFetcher($c->query('YoutubeFetcher'));
|
||||
$fetcher->registerFetcher($c->query('FeedFetcher'));
|
||||
|
||||
return $fetcher;
|
||||
|
@ -480,6 +482,12 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('YoutubeFetcher', function($c) {
|
||||
return new YoutubeFetcher(
|
||||
$c->query('FeedFetcher')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('StatusFlag', function() {
|
||||
return new StatusFlag();
|
||||
});
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - News
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later. See the COPYING file.
|
||||
*
|
||||
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||
* @copyright Bernhard Posselt 2012, 2014
|
||||
*/
|
||||
|
||||
namespace OCA\News\Fetcher;
|
||||
|
||||
|
||||
class YoutubeFetcher implements IFeedFetcher {
|
||||
|
||||
private $feedFetcher;
|
||||
|
||||
public function __construct(FeedFetcher $feedFetcher){
|
||||
$this->feedFetcher = $feedFetcher;
|
||||
}
|
||||
|
||||
|
||||
private function buildUrl($url) {
|
||||
$baseRegex = '%(?:https?://|//)?(?:www.)?youtube.com';
|
||||
$playRegex = $baseRegex . '.*?list=([^&]*)%';
|
||||
|
||||
if (preg_match($playRegex, $url, $matches)) {
|
||||
$id = $matches[1];
|
||||
return 'http://gdata.youtube.com/feeds/api/playlists/' . $id;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This fetcher handles all the remaining urls therefore always returns true
|
||||
*/
|
||||
public function canHandle($url){
|
||||
return $this->buildUrl($url) !== false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fetch a feed from remote
|
||||
* @param string $url remote url of the feed
|
||||
* @param boolean $getFavicon if the favicon should also be fetched,
|
||||
* defaults to true
|
||||
* @param string $lastModified a last modified value from an http header
|
||||
* defaults to false. If lastModified matches the http header from the feed
|
||||
* no results are fetched
|
||||
* @param string $etag an etag from an http header.
|
||||
* If lastModified matches the http header from the feed
|
||||
* no results are fetched
|
||||
* @throws FetcherException if it fails
|
||||
* @return array an array containing the new feed and its items, first
|
||||
* element being the Feed and second element being an array of Items
|
||||
*/
|
||||
public function fetch($url, $getFavicon=true, $lastModified=null,
|
||||
$etag=null) {
|
||||
$transformedUrl = $this->buildUrl($url);
|
||||
|
||||
$result = $this->feedFetcher->fetch(
|
||||
$transformedUrl, $getFavicon, $lastModified, $etag
|
||||
);
|
||||
|
||||
// reset feed url so we know the correct added url for the feed
|
||||
$result[0]->setUrl($url);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - News
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later. See the COPYING file.
|
||||
*
|
||||
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||
* @copyright Bernhard Posselt 2012, 2014
|
||||
*/
|
||||
|
||||
namespace OCA\News\Fetcher;
|
||||
|
||||
use \OCA\News\Db\Feed;
|
||||
|
||||
|
||||
class YoutubeFetcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
private $fetcher;
|
||||
private $feedFetcher;
|
||||
|
||||
public function setUp() {
|
||||
$this->feedFetcher = $this->getMockBuilder(
|
||||
'\OCA\News\Fetcher\FeedFetcher')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->fetcher = new YoutubeFetcher($this->feedFetcher);
|
||||
}
|
||||
|
||||
|
||||
public function testCanHandleFails() {
|
||||
$url = 'http://youtube.com';
|
||||
$this->assertFalse($this->fetcher->canHandle($url));
|
||||
}
|
||||
|
||||
|
||||
public function testCanHandle() {
|
||||
$url = 'http://youtube.com/test/?test=a&list=b&b=c';
|
||||
$this->assertTrue($this->fetcher->canHandle($url));
|
||||
}
|
||||
|
||||
|
||||
public function testPlaylistUrl() {
|
||||
$url = 'http://youtube.com/something/weird?a=b&list=sobo3&c=1';
|
||||
$transformedUrl = 'http://gdata.youtube.com/feeds/api/playlists/sobo3';
|
||||
$favicon = true;
|
||||
$modified = 3;
|
||||
$etag = 5;
|
||||
$feed = new Feed();
|
||||
$feed->setUrl('http://google.de');
|
||||
$result = [$feed, []];
|
||||
|
||||
$this->feedFetcher->expects($this->once())
|
||||
->method('fetch')
|
||||
->with(
|
||||
$this->equalTo($transformedUrl),
|
||||
$this->equalTo($favicon),
|
||||
$this->equalTo($modified),
|
||||
$this->equalTo($etag)
|
||||
)
|
||||
->will($this->returnValue($result));
|
||||
$feed = $this->fetcher->fetch($url, $favicon, $modified, $etag);
|
||||
|
||||
$this->assertEquals($url, $result[0]->getUrl());
|
||||
}
|
||||
|
||||
|
||||
}
|
Загрузка…
Ссылка в новой задаче