alltube/tests/VideoDownloadTest.php

484 lines
12 KiB
PHP
Raw Normal View History

2015-08-29 21:46:57 +02:00
<?php
/**
2016-09-08 00:28:28 +02:00
* VideoDownloadTest class.
2016-08-01 13:29:13 +02:00
*/
2016-12-05 13:12:27 +01:00
2016-03-30 01:49:08 +02:00
namespace Alltube\Test;
use Alltube\Config;
2016-10-18 10:45:54 +02:00
use Alltube\VideoDownload;
2015-08-29 21:46:57 +02:00
/**
2016-09-08 00:28:28 +02:00
* Unit tests for the VideoDownload class.
2016-08-01 13:29:13 +02:00
*/
2016-03-30 01:49:08 +02:00
class VideoDownloadTest extends \PHPUnit_Framework_TestCase
2015-08-29 21:46:57 +02:00
{
2016-08-01 13:29:13 +02:00
/**
2016-09-08 00:28:28 +02:00
* VideoDownload instance.
*
2016-08-01 13:29:13 +02:00
* @var VideoDownload
*/
private $download;
/**
2016-09-08 00:28:28 +02:00
* Initialize properties used by test.
2016-08-01 13:29:13 +02:00
*/
2016-04-08 19:06:41 +02:00
protected function setUp()
{
$this->download = new VideoDownload(Config::getInstance('config_test.yml'));
2016-04-08 19:06:41 +02:00
}
2016-08-01 13:29:13 +02:00
/**
2016-09-08 00:28:28 +02:00
* Destroy properties after test.
2016-08-01 13:29:13 +02:00
*/
protected function tearDown()
{
Config::destroyInstance();
}
/**
* Test VideoDownload constructor with wrong youtube-dl path.
*
* @return void
* @expectedException Exception
*/
public function testConstructorWithMissingYoutubedl()
{
new VideoDownload(
2016-10-18 10:45:54 +02:00
new Config(['youtubedl' => 'foo'])
);
}
/**
* Test VideoDownload constructor with wrong Python path.
*
* @return void
* @expectedException Exception
*/
public function testConstructorWithMissingPython()
{
new VideoDownload(
2016-10-18 10:45:54 +02:00
new Config(['python' => 'foo'])
);
}
2015-08-29 21:46:57 +02:00
/**
2016-09-08 00:28:28 +02:00
* Test listExtractors function.
2015-10-29 18:40:22 +01:00
*
2015-08-29 21:46:57 +02:00
* @return void
*/
public function testListExtractors()
{
2016-04-08 19:06:41 +02:00
$extractors = $this->download->listExtractors();
$this->assertContains('youtube', $extractors);
2015-08-29 21:46:57 +02:00
}
/**
2016-09-08 00:28:28 +02:00
* Test getURL function.
2015-10-29 18:40:22 +01:00
*
2017-01-02 23:08:51 +01:00
* @param string $url URL
* @param string $format Format
* @param string $filename Filename
* @param string $extension File extension
* @param string $domain Domain
2015-10-29 18:40:22 +01:00
*
2016-09-08 00:28:28 +02:00
* @return void
2015-10-29 18:40:22 +01:00
* @dataProvider urlProvider
* @dataProvider m3uUrlProvider
* @dataProvider rtmpUrlProvider
* @dataProvider remuxUrlProvider
*/
2017-01-02 23:08:51 +01:00
public function testGetURL($url, $format, $filename, $extension, $domain)
{
2016-04-08 19:06:41 +02:00
$videoURL = $this->download->getURL($url, $format);
2017-04-25 00:40:24 +02:00
$this->assertContains($domain, $videoURL[0]);
}
/**
2016-10-20 23:03:13 +02:00
* Test getURL function with a protected video.
*
* @return void
*/
public function testGetURLWithPassword()
{
2017-04-25 00:40:24 +02:00
$videoURL = $this->download->getURL('http://vimeo.com/68375962', null, 'youtube-dl');
$this->assertContains('vimeocdn.com', $videoURL[0]);
}
/**
* Test getURL function with a protected video and no password.
*
* @return void
* @expectedException \Alltube\PasswordException
*/
public function testGetURLWithMissingPassword()
{
$this->download->getURL('http://vimeo.com/68375962');
}
/**
* Test getURL function with a protected video and a wrong password.
*
* @return void
* @expectedException Exception
*/
public function testGetURLWithWrongPassword()
{
$this->download->getURL('http://vimeo.com/68375962', null, 'foo');
}
/**
2016-09-08 00:28:28 +02:00
* Test getURL function errors.
2015-10-29 18:40:22 +01:00
*
* @param string $url URL
2015-10-29 18:40:22 +01:00
*
2016-09-08 00:28:28 +02:00
* @return void
* @expectedException Exception
2015-10-29 21:23:02 +01:00
* @dataProvider ErrorUrlProvider
*/
public function testGetURLError($url)
{
2016-04-08 20:08:04 +02:00
$this->download->getURL($url);
}
/**
2016-09-08 00:28:28 +02:00
* Provides URLs for tests.
2015-10-29 18:40:22 +01:00
*
2016-08-01 13:29:13 +02:00
* @return array[]
*/
2015-10-29 18:40:22 +01:00
public function urlProvider()
{
2016-09-08 00:28:28 +02:00
return [
[
'https://www.youtube.com/watch?v=M7IpKCZ47pU', 'best[protocol^=http]',
2017-01-02 23:08:51 +01:00
"It's Not Me, It's You - Hearts Under Fire-M7IpKCZ47pU",
'mp4',
2016-07-30 00:47:46 +02:00
'googlevideo.com',
2016-09-08 00:28:28 +02:00
],
[
'https://www.youtube.com/watch?v=RJJ6FCAXvKg', 22,
"'Heart Attack' - Demi Lovato ".
2017-01-02 23:08:51 +01:00
'(Sam Tsui & Against The Current)-RJJ6FCAXvKg',
'mp4',
2016-07-30 00:47:46 +02:00
'googlevideo.com',
2016-09-08 00:28:28 +02:00
],
[
'https://vimeo.com/24195442', 'best[protocol^=http]',
2017-01-02 23:08:51 +01:00
'Carving the Mountains-24195442',
'mp4',
2016-07-30 00:47:46 +02:00
'vimeocdn.com',
2016-09-08 00:28:28 +02:00
],
[
2016-07-30 14:01:00 +02:00
'http://www.bbc.co.uk/programmes/b039g8p7', 'bestaudio/best',
2017-01-02 23:08:51 +01:00
'Leonard Cohen, Kaleidoscope - BBC Radio 4-b039d07m',
'flv',
2016-07-30 14:01:00 +02:00
'bbcodspdns.fcod.llnwd.net',
2016-09-08 00:28:28 +02:00
],
[
2016-07-30 14:01:00 +02:00
'http://www.rtl2.de/sendung/grip-das-motormagazin/folge/folge-203-0', 'bestaudio/best',
2017-01-02 23:08:51 +01:00
'GRIP sucht den Sommerkönig-folge-203-0',
'f4v',
2016-07-30 14:01:00 +02:00
'edgefcs.net',
2016-09-08 00:28:28 +02:00
],
2016-12-27 00:10:18 +01:00
];
}
/**
* Provides M3U8 URLs for tests.
*
* @return array[]
*/
2017-04-25 00:40:24 +02:00
public function remuxUrlProvider()
{
return [
[
'https://www.youtube.com/watch?v=M7IpKCZ47pU', 'bestvideo+bestaudio',
"It's Not Me, It's You - Hearts Under Fire-M7IpKCZ47pU",
'mp4',
'googlevideo.com',
],
];
}
/**
* Provides URLs for remux tests.
*
* @return array[]
*/
2017-01-16 13:47:29 +01:00
public function m3uUrlProvider()
2016-12-27 00:10:18 +01:00
{
return [
2016-12-26 15:50:26 +01:00
[
'https://twitter.com/verge/status/813055465324056576/video/1', 'best',
2017-01-16 11:23:47 +01:00
'The Verge - This tiny origami robot can self-fold and complete tasks-813055465324056576',
'mp4',
2016-12-26 15:50:26 +01:00
'video.twimg.com',
2016-12-26 15:53:03 +01:00
],
2016-09-08 00:28:28 +02:00
];
}
/**
* Provides RTMP URLs for tests.
*
* @return array[]
*/
public function rtmpUrlProvider()
{
return [
[
2017-05-04 23:28:29 +02:00
'http://www.canalc2.tv/video/12163', 'rtmp',
'Terrasses du Numérique-12163',
'flv',
'vod-flash.u-strasbg.fr',
],
];
}
/**
2016-09-08 00:28:28 +02:00
* Provides incorrect URLs for tests.
2015-10-29 18:40:22 +01:00
*
2016-08-01 13:29:13 +02:00
* @return array[]
*/
2015-10-29 18:40:22 +01:00
public function errorUrlProvider()
{
2016-09-08 00:28:28 +02:00
return [
['http://example.com/video'],
];
}
/**
2016-09-08 00:28:28 +02:00
* Test getJSON function.
2015-10-29 18:40:22 +01:00
*
* @param string $url URL
* @param string $format Format
2015-10-29 18:40:22 +01:00
*
2016-09-08 00:28:28 +02:00
* @return void
* @dataProvider urlProvider
2017-01-16 13:47:29 +01:00
* @dataProvider m3uUrlProvider
* @dataProvider rtmpUrlProvider
*/
public function testGetJSON($url, $format)
{
2016-04-08 19:06:41 +02:00
$info = $this->download->getJSON($url, $format);
$this->assertObjectHasAttribute('webpage_url', $info);
$this->assertObjectHasAttribute('url', $info);
$this->assertObjectHasAttribute('ext', $info);
$this->assertObjectHasAttribute('title', $info);
$this->assertObjectHasAttribute('extractor_key', $info);
$this->assertObjectHasAttribute('formats', $info);
}
/**
2016-09-08 00:28:28 +02:00
* Test getJSON function errors.
2015-10-29 18:40:22 +01:00
*
* @param string $url URL
2015-10-29 18:40:22 +01:00
*
2016-09-08 00:28:28 +02:00
* @return void
* @expectedException Exception
2015-10-29 21:23:02 +01:00
* @dataProvider ErrorURLProvider
2015-08-29 21:46:57 +02:00
*/
public function testGetJSONError($url)
2015-08-29 21:46:57 +02:00
{
2017-01-16 18:51:42 +01:00
$this->download->getJSON($url);
2015-08-29 21:46:57 +02:00
}
2016-07-30 00:47:46 +02:00
/**
2016-09-08 00:28:28 +02:00
* Test getFilename function.
2016-07-30 00:47:46 +02:00
*
2017-01-02 23:08:51 +01:00
* @param string $url URL
* @param string $format Format
* @param string $filename Filename
* @param string $extension File extension
2016-07-30 00:47:46 +02:00
*
2016-09-08 00:28:28 +02:00
* @return void
2016-07-30 00:47:46 +02:00
* @dataProvider urlProvider
2017-01-16 13:47:29 +01:00
* @dataProvider m3uUrlProvider
* @dataProvider rtmpUrlProvider
* @dataProvider remuxUrlProvider
2016-07-30 00:47:46 +02:00
*/
2017-01-02 23:08:51 +01:00
public function testGetFilename($url, $format, $filename, $extension)
2016-07-30 00:47:46 +02:00
{
$videoFilename = $this->download->getFilename($url, $format);
2017-01-02 23:08:51 +01:00
$this->assertEquals($videoFilename, $filename.'.'.$extension);
2016-07-30 00:47:46 +02:00
}
/**
2016-09-08 00:28:28 +02:00
* Test getFilename function errors.
2016-07-30 00:47:46 +02:00
*
* @param string $url URL
*
2016-09-08 00:28:28 +02:00
* @return void
2016-07-30 00:47:46 +02:00
* @expectedException Exception
* @dataProvider ErrorUrlProvider
*/
public function testGetFilenameError($url)
{
$this->download->getFilename($url);
}
/**
2016-09-08 00:28:28 +02:00
* Test getAudioFilename function.
2016-07-30 00:47:46 +02:00
*
2017-01-16 18:54:03 +01:00
* @param string $url URL
* @param string $format Format
* @param string $filename Filename
2016-07-30 00:47:46 +02:00
*
2016-09-08 00:28:28 +02:00
* @return void
2016-07-30 00:47:46 +02:00
* @dataProvider urlProvider
2017-01-16 13:47:29 +01:00
* @dataProvider m3uUrlProvider
* @dataProvider rtmpUrlProvider
* @dataProvider remuxUrlProvider
2016-07-30 00:47:46 +02:00
*/
2017-01-02 23:08:51 +01:00
public function testGetAudioFilename($url, $format, $filename)
2016-07-30 00:47:46 +02:00
{
$videoFilename = $this->download->getAudioFilename($url, $format);
2017-01-02 23:08:51 +01:00
$this->assertEquals($videoFilename, $filename.'.mp3');
2016-07-30 00:47:46 +02:00
}
/**
2016-09-08 00:28:28 +02:00
* Test getAudioStream function.
2016-07-30 00:47:46 +02:00
*
* @param string $url URL
* @param string $format Format
*
2016-09-08 00:28:28 +02:00
* @return void
2016-07-30 00:47:46 +02:00
* @dataProvider urlProvider
*/
public function testGetAudioStream($url, $format)
{
2016-07-30 14:01:00 +02:00
$stream = $this->download->getAudioStream($url, $format);
$this->assertInternalType('resource', $stream);
2016-08-01 18:42:08 +02:00
$this->assertFalse(feof($stream));
2016-07-30 00:47:46 +02:00
}
/**
2016-09-08 00:28:28 +02:00
* Test getAudioStream function without avconv.
2016-07-30 00:47:46 +02:00
*
* @param string $url URL
* @param string $format Format
*
2016-09-08 00:28:28 +02:00
* @return void
2016-07-30 00:47:46 +02:00
* @expectedException Exception
* @dataProvider urlProvider
*/
public function testGetAudioStreamAvconvError($url, $format)
{
$download = new VideoDownload(new Config(['avconv'=>'foobar']));
$download->getAudioStream($url, $format);
2016-07-30 00:47:46 +02:00
}
2016-07-30 14:01:00 +02:00
/**
2016-09-08 00:28:28 +02:00
* Test getAudioStream function without curl or rtmpdump.
2016-07-30 14:01:00 +02:00
*
* @param string $url URL
* @param string $format Format
*
2016-09-08 00:28:28 +02:00
* @return void
2016-07-30 14:01:00 +02:00
* @expectedException Exception
* @dataProvider rtmpUrlProvider
2016-07-30 14:01:00 +02:00
*/
public function testGetAudioStreamRtmpError($url, $format)
2016-07-30 14:01:00 +02:00
{
$download = new VideoDownload(new Config(['rtmpdump'=>'foobar']));
$download->getAudioStream($url, $format);
2016-07-30 14:01:00 +02:00
}
/**
* Test getAudioStream function with a M3U8 file.
*
2016-12-27 00:36:30 +01:00
* @param string $url URL
* @param string $format Format
*
* @return void
* @expectedException Exception
2017-01-16 13:47:29 +01:00
* @dataProvider m3uUrlProvider
2016-12-27 00:36:30 +01:00
*/
public function testGetAudioStreamM3uError($url, $format)
{
$this->download->getAudioStream($url, $format);
}
2017-04-26 00:08:35 +02:00
/**
2017-04-26 00:10:00 +02:00
* Assert that a stream is valid.
2017-04-26 00:08:35 +02:00
*
* @param resource $stream Stream
*
* @return void
*/
private function assertStream($stream)
{
$this->assertInternalType('resource', $stream);
$this->assertFalse(feof($stream));
}
2016-12-27 00:36:30 +01:00
/**
* Test getM3uStream function.
*
* @param string $url URL
* @param string $format Format
*
* @return void
2017-01-16 13:47:29 +01:00
* @dataProvider m3uUrlProvider
2016-12-27 00:36:30 +01:00
*/
public function testGetM3uStream($url, $format)
{
2017-04-26 00:08:35 +02:00
$this->assertStream(
$this->download->getM3uStream(
$this->download->getJSON($url, $format)
)
);
2016-12-27 00:36:30 +01:00
}
2017-04-25 00:40:24 +02:00
/**
* Test getRemuxStream function.
*
* @param string $url URL
* @param string $format Format
*
* @return void
* @dataProvider remuxUrlProvider
*/
public function testGetRemuxStream($url, $format)
{
$urls = $this->download->getURL($url, $format);
if (count($urls) > 1) {
2017-04-26 00:08:35 +02:00
$this->assertStream($this->download->getRemuxStream($urls));
2017-04-25 00:40:24 +02:00
}
}
/**
* Test getRtmpStream function.
*
* @param string $url URL
* @param string $format Format
*
* @return void
* @dataProvider rtmpUrlProvider
*/
public function testGetRtmpStream($url, $format)
{
2017-04-26 00:08:35 +02:00
$this->assertStream(
$this->download->getRtmpStream(
$this->download->getJSON($url, $format)
)
);
}
2016-12-27 00:36:30 +01:00
/**
* Test getM3uStream function without avconv.
*
* @param string $url URL
* @param string $format Format
*
* @return void
* @expectedException Exception
2017-01-16 13:47:29 +01:00
* @dataProvider m3uUrlProvider
*/
2016-12-27 00:36:30 +01:00
public function testGetM3uStreamAvconvError($url, $format)
{
$download = new VideoDownload(new Config(['avconv'=>'foobar']));
$video = $download->getJSON($url, $format);
$download->getM3uStream($video);
}
2015-08-29 21:46:57 +02:00
}