alltube/tests/VideoTest.php

545 lines
15 KiB
PHP
Raw Normal View History

2015-08-29 19:46:57 +00:00
<?php
2015-08-29 19:46:57 +00:00
/**
* VideoTest class.
2016-08-01 11:29:13 +00:00
*/
2016-12-05 12:12:27 +00:00
2016-03-29 23:49:08 +00:00
namespace Alltube\Test;
use Alltube\Config;
use Alltube\Exception\ConfigException;
use Alltube\Library\Downloader;
use Alltube\Library\Exception\AlltubeLibraryException;
use Alltube\Library\Exception\AvconvException;
use Alltube\Library\Exception\InvalidProtocolConversionException;
use Alltube\Library\Exception\PasswordException;
use Alltube\Library\Exception\PlaylistConversionException;
use Alltube\Library\Exception\RemuxException;
use Alltube\Library\Exception\WrongPasswordException;
use Alltube\Library\Exception\YoutubedlException;
use Alltube\Library\Video;
2015-08-29 19:46:57 +00:00
/**
* Unit tests for the Video class.
* @requires download
* @todo Split Downloader and Video tests.
2016-08-01 11:29:13 +00:00
*/
class VideoTest extends BaseTest
2015-08-29 19:46:57 +00:00
{
/**
* Downloader instance used in tests.
*
* @var Downloader
*/
private $downloader;
/**
* Video format used in tests.
*
* @var string
*/
private $format;
/**
* Prepare tests.
* @throws ConfigException
*/
protected function setUp(): void
{
parent::setUp();
// So ffmpeg does not spam the output with broken pipe errors.
$config = new Config(['ffmpegVerbosity' => 'fatal']);
$this->downloader = $config->getDownloader();
$this->format = 'best';
}
/**
* Test getExtractors function.
*
* @return void
* @throws AlltubeLibraryException
*/
public function testGetExtractors()
{
$this->assertContains('youtube', $this->downloader->getExtractors());
}
/**
* Test getUrl function.
2015-10-29 17:40:22 +00:00
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
* @param string $format Format
* @param string $filename Filename
2017-01-02 22:08:51 +00:00
* @param string $extension File extension
2020-05-13 19:33:05 +00:00
* @param string $domain Domain
2015-10-29 17:40:22 +00:00
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
2015-10-29 17:40:22 +00:00
* @dataProvider urlProvider
* @dataProvider m3uUrlProvider
* @dataProvider remuxUrlProvider
*/
public function testgetUrl(
2020-10-17 20:22:17 +00:00
string $url,
string $format,
string $filename,
string $extension,
string $domain
2017-12-05 13:52:20 +00:00
) {
$video = new Video($this->downloader, $url, $format);
foreach ($video->getUrl() as $videoURL) {
2019-11-30 13:08:18 +00:00
$this->assertStringContainsString($domain, $videoURL);
}
}
/**
* Test getUrl function with a protected video.
*
* @return void
* @throws AlltubeLibraryException
*/
public function testgetUrlWithPassword()
{
$video = new Video($this->downloader, 'http://vimeo.com/68375962', 'best', 'youtube-dl');
foreach ($video->getUrl() as $videoURL) {
2019-11-30 13:08:18 +00:00
$this->assertStringContainsString('vimeocdn.com', $videoURL);
}
}
/**
* Test getUrl function with a protected video and no password.
*
* @return void
* @throws AlltubeLibraryException
*/
public function testgetUrlWithMissingPassword()
{
$this->expectException(PasswordException::class);
$video = new Video($this->downloader, 'http://vimeo.com/68375962', $this->format);
$video->getUrl();
}
/**
* Test getUrl function with a protected video and a wrong password.
*
* @return void
* @throws AlltubeLibraryException
*/
public function testgetUrlWithWrongPassword()
{
$this->expectException(WrongPasswordException::class);
$video = new Video($this->downloader, 'http://vimeo.com/68375962', 'best', 'foo');
$video->getUrl();
}
/**
* Test getUrl function errors.
2015-10-29 17:40:22 +00:00
*
* @param string $url URL
2015-10-29 17:40:22 +00:00
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
* @dataProvider ErrorUrlProvider
*/
2020-09-27 17:56:19 +00:00
public function testgetUrlError(string $url)
{
$this->expectException(YoutubedlException::class);
$video = new Video($this->downloader, $url, $this->format);
$video->getUrl();
}
/**
2016-09-07 22:28:28 +00:00
* Provides URLs for tests.
2015-10-29 17:40:22 +00:00
*
2016-08-01 11:29:13 +00:00
* @return array[]
*/
2015-10-29 17:40:22 +00:00
public function urlProvider()
{
2020-05-13 19:33:05 +00:00
return [
2016-09-07 22:28:28 +00:00
[
'https://www.youtube.com/watch?v=M7IpKCZ47pU', 'best[protocol^=http]',
2017-05-30 22:57:39 +00:00
'It_s_Not_Me_It_s_You_-_Hearts_Under_Fire-M7IpKCZ47pU',
2017-01-02 22:08:51 +00:00
'mp4',
2016-07-29 22:47:46 +00:00
'googlevideo.com',
2016-09-07 22:28:28 +00:00
],
[
2020-10-17 20:09:01 +00:00
'https://www.youtube.com/watch?v=RJJ6FCAXvKg', '18',
'Heart_Attack_-_Demi_Lovato_' .
'Sam_Tsui_Against_The_Current-RJJ6FCAXvKg',
2017-01-02 22:08:51 +00:00
'mp4',
2016-07-29 22:47:46 +00:00
'googlevideo.com',
2016-09-07 22:28:28 +00:00
],
[
2016-07-30 12:01:00 +00:00
'http://www.bbc.co.uk/programmes/b039g8p7', 'bestaudio/best',
2018-09-03 08:42:20 +00:00
'Kaleidoscope_Leonard_Cohen-b039d07m',
2017-01-02 22:08:51 +00:00
'flv',
2016-07-30 12:01:00 +00:00
'bbcodspdns.fcod.llnwd.net',
2016-09-07 22:28:28 +00:00
],
[
2019-11-30 13:08:18 +00:00
'https://vimeo.com/24195442', 'http-720p',
'Carving_the_Mountains-24195442',
'mp4',
'akamaized.net',
]
];
2016-12-26 23:10:18 +00:00
}
/**
* Provides URLs for remux tests.
2016-12-26 23:10:18 +00:00
*
* @return array[]
*/
2017-04-24 22:40:24 +00:00
public function remuxUrlProvider()
{
return [
[
'https://www.youtube.com/watch?v=M7IpKCZ47pU', 'bestvideo+bestaudio',
2017-05-30 22:57:39 +00:00
'It_s_Not_Me_It_s_You_-_Hearts_Under_Fire-M7IpKCZ47pU',
2017-04-24 22:40:24 +00:00
'mp4',
'googlevideo.com',
],
];
}
/**
* Provides M3U8 URLs for tests.
2017-04-24 22:40:24 +00:00
*
* @return array[]
*/
2017-01-16 12:47:29 +00:00
public function m3uUrlProvider()
2016-12-26 23:10:18 +00:00
{
2020-05-13 19:33:05 +00:00
return [
[
2017-12-10 17:47:42 +00:00
'https://twitter.com/verge/status/813055465324056576/video/1', 'hls-2176',
'The_Verge_-_This_tiny_origami_robot_can_self-fold_and_complete_tasks-813055465324056576',
2017-01-16 10:23:47 +00:00
'mp4',
2016-12-26 14:50:26 +00:00
'video.twimg.com',
]
];
}
/**
* Provides RTMP URLs for tests.
*
* @return array[]
*/
public function rtmpUrlProvider()
{
return [
[
'http://www.rtvnh.nl/video/131946', 'rtmp-264',
'Ketting_van_strandgasten-131946',
2017-05-04 21:28:29 +00:00
'flv',
'lb-nh-vod.cdn.streamgate.nl',
],
];
}
/**
2016-09-07 22:28:28 +00:00
* Provides incorrect URLs for tests.
2015-10-29 17:40:22 +00:00
*
2016-08-01 11:29:13 +00:00
* @return array[]
*/
2015-10-29 17:40:22 +00:00
public function errorUrlProvider()
{
2016-09-07 22:28:28 +00:00
return [
['http://example.com/video'],
];
}
/**
2016-09-07 22:28:28 +00:00
* Test getJSON function.
2015-10-29 17:40:22 +00:00
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
* @param string $format Format
2015-10-29 17:40:22 +00:00
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
* @dataProvider urlProvider
2017-01-16 12:47:29 +00:00
* @dataProvider m3uUrlProvider
*/
2020-09-27 17:56:19 +00:00
public function testGetJson(string $url, string $format)
{
$video = new Video($this->downloader, $url, $format);
$info = $video->getJson();
$this->assertObjectHasAttribute('webpage_url', $info);
$this->assertObjectHasAttribute('url', $info);
$this->assertObjectHasAttribute('ext', $info);
$this->assertObjectHasAttribute('title', $info);
$this->assertObjectHasAttribute('extractor_key', $info);
$this->assertObjectHasAttribute('format', $info);
}
/**
2016-09-07 22:28:28 +00:00
* Test getJSON function errors.
2015-10-29 17:40:22 +00:00
*
* @param string $url URL
2015-10-29 17:40:22 +00:00
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
* @dataProvider ErrorURLProvider
2015-08-29 19:46:57 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetJsonError(string $url)
2015-08-29 19:46:57 +00:00
{
$this->expectException(YoutubedlException::class);
$video = new Video($this->downloader, $url, $this->format);
$video->getJson();
2015-08-29 19:46:57 +00:00
}
2016-07-29 22:47:46 +00:00
/**
2016-09-07 22:28:28 +00:00
* Test getFilename function.
2016-07-29 22:47:46 +00:00
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
* @param string $format Format
* @param string $filename Filename
2017-01-02 22:08:51 +00:00
* @param string $extension File extension
2016-07-29 22:47:46 +00:00
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
2016-07-29 22:47:46 +00:00
* @dataProvider urlProvider
2017-01-16 12:47:29 +00:00
* @dataProvider m3uUrlProvider
* @dataProvider remuxUrlProvider
2016-07-29 22:47:46 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetFilename(string $url, string $format, string $filename, string $extension)
2016-07-29 22:47:46 +00:00
{
$video = new Video($this->downloader, $url, $format);
$this->assertEquals($video->getFilename(), $filename . '.' . $extension);
2016-07-29 22:47:46 +00:00
}
/**
2016-09-07 22:28:28 +00:00
* Test getFilename function errors.
2016-07-29 22:47:46 +00:00
*
* @param string $url URL
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
* @dataProvider ErrorUrlProvider
2016-07-29 22:47:46 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetFilenameError(string $url)
2016-07-29 22:47:46 +00:00
{
$this->expectException(YoutubedlException::class);
$video = new Video($this->downloader, $url, $this->format);
$video->getFilename();
2016-07-29 22:47:46 +00:00
}
/**
2016-09-07 22:28:28 +00:00
* Test getAudioStream function.
2016-07-29 22:47:46 +00:00
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
2016-07-29 22:47:46 +00:00
* @param string $format Format
*
2016-09-07 22:28:28 +00:00
* @return void
* @throws AlltubeLibraryException
2020-09-27 17:56:19 +00:00
* @dataProvider urlProvider
2016-07-29 22:47:46 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetAudioStream(string $url, string $format)
2016-07-29 22:47:46 +00:00
{
$video = new Video($this->downloader, $url, $format);
$this->assertStream($this->downloader->getAudioStream($video));
2016-07-29 22:47:46 +00:00
}
/**
* Test getAudioStream function without ffmpeg.
2016-07-29 22:47:46 +00:00
*
* @param string $url URL
2016-07-29 22:47:46 +00:00
* @param string $format Format
*
2016-09-07 22:28:28 +00:00
* @return void
2020-09-27 17:56:19 +00:00
* @throws AlltubeLibraryException
* @throws ConfigException
* @dataProvider urlProvider
2016-07-29 22:47:46 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetAudioStreamFfmpegError(string $url, string $format)
2016-07-29 22:47:46 +00:00
{
$this->expectException(AvconvException::class);
$config = new Config(['ffmpeg' => 'foobar']);
$downloader = $config->getDownloader();
$video = new Video($this->downloader, $url, $format, $this->format);
$downloader->getAudioStream($video);
2016-07-29 22:47:46 +00:00
}
2016-07-30 12:01:00 +00:00
/**
* Test getAudioStream function with a M3U8 file.
*
* @param string $url URL
2016-12-26 23:36:30 +00:00
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
2017-01-16 12:47:29 +00:00
* @dataProvider m3uUrlProvider
2016-12-26 23:36:30 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetAudioStreamM3uError(string $url, string $format)
2016-12-26 23:36:30 +00:00
{
$this->expectException(InvalidProtocolConversionException::class);
$video = new Video($this->downloader, $url, $format);
$this->downloader->getAudioStream($video);
2016-12-26 23:36:30 +00:00
}
/**
* Test getAudioStream function with a DASH URL.
*
* @return void
* @throws AlltubeLibraryException
*/
public function testGetAudioStreamDashError()
{
$this->expectException(InvalidProtocolConversionException::class);
$video = new Video($this->downloader, 'https://vimeo.com/251997032', 'bestaudio/best');
$this->downloader->getAudioStream($video);
}
/**
* Test getAudioStream function with a playlist.
*
* @return void
* @throws AlltubeLibraryException
*/
public function testGetAudioStreamPlaylistError()
{
$this->expectException(PlaylistConversionException::class);
$video = new Video(
$this->downloader,
2018-05-26 12:38:42 +00:00
'https://www.youtube.com/playlist?list=PLgdySZU6KUXL_8Jq5aUkyNV7wCa-4wZsC',
'best'
);
$this->downloader->getAudioStream($video);
}
2017-04-25 22:08:35 +00:00
/**
2017-04-25 22:10:00 +00:00
* Assert that a stream is valid.
2017-04-25 22:08:35 +00:00
*
* @param resource $stream Stream
*
* @return void
*/
private function assertStream($stream)
{
2019-11-30 13:08:18 +00:00
$this->assertIsResource($stream);
2017-04-25 22:08:35 +00:00
$this->assertFalse(feof($stream));
}
2016-12-26 23:36:30 +00:00
/**
* Test getM3uStream function.
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
2016-12-26 23:36:30 +00:00
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
2020-09-27 17:56:19 +00:00
* @dataProvider m3uUrlProvider
2016-12-26 23:36:30 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetM3uStream(string $url, string $format)
2016-12-26 23:36:30 +00:00
{
$video = new Video($this->downloader, $url, $format);
$this->assertStream($this->downloader->getM3uStream($video));
2016-12-26 23:36:30 +00:00
}
2017-04-24 22:40:24 +00:00
/**
* Test getRemuxStream function.
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
2017-04-24 22:40:24 +00:00
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
2020-09-27 17:56:19 +00:00
* @dataProvider remuxUrlProvider
2017-04-24 22:40:24 +00:00
*/
2020-09-27 17:56:19 +00:00
public function testGetRemuxStream(string $url, string $format)
2017-04-24 22:40:24 +00:00
{
$video = new Video($this->downloader, $url, $format);
$this->assertStream($this->downloader->getRemuxStream($video));
}
/**
* Test getRemuxStream function with a video with only one URL.
*
* @param string $url URL
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
* @dataProvider urlProvider
*/
2020-09-27 17:56:19 +00:00
public function testGetRemuxStreamWithWrongVideo(string $url, string $format)
{
$this->expectException(RemuxException::class);
$video = new Video($this->downloader, $url, $format);
$this->downloader->getRemuxStream($video);
2017-04-24 22:40:24 +00:00
}
/**
* Test getRtmpStream function.
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
* @dataProvider rtmpUrlProvider
*/
2020-09-27 17:56:19 +00:00
public function testGetRtmpStream(string $url, string $format)
{
$this->markTestIncomplete('We need to find another RTMP video.');
$video = new Video($this->downloader, $url, $format);
$this->assertStream($this->downloader->getRtmpStream($video));
}
2016-12-26 23:36:30 +00:00
/**
* Test getM3uStream function without ffmpeg.
2016-12-26 23:36:30 +00:00
*
* @param string $url URL
2016-12-26 23:36:30 +00:00
* @param string $format Format
*
* @return void
2020-09-27 17:56:19 +00:00
* @throws AlltubeLibraryException
* @throws ConfigException
2017-01-16 12:47:29 +00:00
* @dataProvider m3uUrlProvider
*/
2020-09-27 17:56:19 +00:00
public function testGetM3uStreamFfmpegError(string $url, string $format)
{
$this->expectException(AvconvException::class);
$config = new Config(['ffmpeg' => 'foobar']);
$downloader = $config->getDownloader();
$video = new Video($downloader, $url, $format);
$downloader->getM3uStream($video);
}
2017-05-02 15:04:55 +00:00
/**
* Test getConvertedStream function without ffmpeg.
*
2020-05-13 19:33:05 +00:00
* @param string $url URL
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
2020-09-27 17:56:19 +00:00
* @dataProvider urlProvider
*/
2020-09-27 17:56:19 +00:00
public function testGetConvertedStream(string $url, string $format)
{
$video = new Video($this->downloader, $url, $format);
$this->assertStream($this->downloader->getConvertedStream($video, 32, 'flv'));
}
/**
* Test getConvertedStream function with a M3U8 file.
*
* @param string $url URL
* @param string $format Format
*
* @return void
* @throws AlltubeLibraryException
* @dataProvider m3uUrlProvider
*/
2020-09-27 17:56:19 +00:00
public function testGetConvertedStreamM3uError(string $url, string $format)
{
$this->expectException(InvalidProtocolConversionException::class);
$video = new Video($this->downloader, $url, $format);
$this->downloader->getConvertedStream($video, 32, 'flv');
}
2015-08-29 19:46:57 +00:00
}