Merge pull request #248 from eai04191/feature/unknown-territory
Add XtubeResolver
This commit is contained in:
commit
dddb47f68a
@ -28,6 +28,7 @@ class MetadataResolver implements Resolver
|
|||||||
'~www\.plurk\.com\/p\/.*~' => PlurkResolver::class,
|
'~www\.plurk\.com\/p\/.*~' => PlurkResolver::class,
|
||||||
'~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class,
|
'~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class,
|
||||||
'~store\.steampowered\.com/app/\d+~' => SteamResolver::class,
|
'~store\.steampowered\.com/app/\d+~' => SteamResolver::class,
|
||||||
|
'~www\.xtube\.com/video-watch/.*-\d+$~'=> XtubeResolver::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
public $mimeTypes = [
|
public $mimeTypes = [
|
||||||
|
41
app/MetadataResolver/XtubeResolver.php
Normal file
41
app/MetadataResolver/XtubeResolver.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\MetadataResolver;
|
||||||
|
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
|
||||||
|
class XtubeResolver implements Resolver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Client
|
||||||
|
*/
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
public function __construct(Client $client)
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resolve(string $url): Metadata
|
||||||
|
{
|
||||||
|
if (preg_match('~www\.xtube\.com/video-watch/.*-(\d+)$~', $url, $matches) !== 1) {
|
||||||
|
throw new \RuntimeException("Unmatched URL Pattern: $url");
|
||||||
|
}
|
||||||
|
$videoid = $matches[1];
|
||||||
|
|
||||||
|
$res = $this->client->get('https://www.xtube.com/webmaster/api/getvideobyid?video_id=' . $videoid);
|
||||||
|
if ($res->getStatusCode() === 200) {
|
||||||
|
$data = json_decode($res->getBody()->getContents(), true);
|
||||||
|
$metadata = new Metadata();
|
||||||
|
|
||||||
|
$metadata->title = $data['title'] ?? '';
|
||||||
|
$metadata->description = strip_tags(str_replace('\n', PHP_EOL, html_entity_decode($data['description'] ?? '')));
|
||||||
|
$metadata->image = str_replace('eSuQ8f', 'eSK08f', $data['thumb'] ?? ''); // 300x169 to 300x210
|
||||||
|
$metadata->tags = array_values(array_unique($data['tags']));
|
||||||
|
|
||||||
|
return $metadata;
|
||||||
|
} else {
|
||||||
|
throw new \RuntimeException("{$res->getStatusCode()}: $url");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
tests/Unit/MetadataResolver/XtubeResolverTest.php
Normal file
51
tests/Unit/MetadataResolver/XtubeResolverTest.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\MetadataResolver;
|
||||||
|
|
||||||
|
use App\MetadataResolver\XtubeResolver;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class XtubeResolverTest extends TestCase
|
||||||
|
{
|
||||||
|
use CreateMockedResolver;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
if (!$this->shouldUseMock()) {
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Xtube/test.json');
|
||||||
|
|
||||||
|
$this->createResolver(XtubeResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://www.xtube.com/video-watch/homegrown-big-tits-18634762');
|
||||||
|
$this->assertEquals('Homegrown Big Tits', $metadata->title);
|
||||||
|
$this->assertEquals('Dedicated to the fans of the beautiful amateur women with big natural tits. All user submitted - you can see big boob amateur hotties fucking and sucking as their tits bounce and sway.', $metadata->description);
|
||||||
|
$this->assertRegExp('~https://cdn\d-s-hw-e5\.xtube\.com/m=eSK08f/videos/201302/07/RF4Nk-S774-/240X180/1\.jpg~', $metadata->image);
|
||||||
|
$this->assertEquals(['bigtits', 'homeg'], $metadata->tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNotMatch()
|
||||||
|
{
|
||||||
|
$this->expectException(\RuntimeException::class);
|
||||||
|
$this->expectExceptionMessage('Unmatched URL Pattern: https://www.xtube.com/gallery/black-celebs-free-7686657');
|
||||||
|
|
||||||
|
$this->createResolver(XtubeResolver::class, '');
|
||||||
|
$this->resolver->resolve('https://www.xtube.com/gallery/black-celebs-free-7686657');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNotOK()
|
||||||
|
{
|
||||||
|
$this->expectException(\RuntimeException::class);
|
||||||
|
$this->expectExceptionMessage('404: https://www.xtube.com/video-watch/notfound-404');
|
||||||
|
|
||||||
|
$this->createResolver(XtubeResolver::class, '', [], 404);
|
||||||
|
$this->resolver->resolve('https://www.xtube.com/video-watch/notfound-404');
|
||||||
|
}
|
||||||
|
}
|
1
tests/fixture/Xtube/test.json
vendored
Normal file
1
tests/fixture/Xtube/test.json
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"duration":"180","views":3146,"video_id":"RF4Nk-S774-","rating":"4.000","ratings":"1","title":"Homegrown Big Tits","description":"Dedicated to the fans of the beautiful amateur women with big natural tits. All user submitted - you can see big boob amateur hotties fucking and sucking as their tits bounce and sway.","url":"https:\/\/www.xtube.com\/video-watch\/homegrown-big-tits-18634762","embedCode":"https:\/\/www.xtube.com\/video-watch\/embedded\/homegrown-big-tits-18634762","default_thumb":"https:\/\/cdn5-s-hw-e5.xtube.com\/m=eSuQ8f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/1.jpg","thumb":"https:\/\/cdn5-s-hw-e5.xtube.com\/m=eSuQ8f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/1.jpg","publish_date":"2013-02-07 17:41:10","tags":{"1396":"bigtits","472012":"homeg"},"thumbs":[{"width":300,"height":210,"src":"https:\/\/cdn4-s-hw-e5.xtube.com\/m=eSK08f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/1.jpg"},{"width":300,"height":210,"src":"https:\/\/cdn4-s-hw-e5.xtube.com\/m=eSK08f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/2.jpg"},{"width":300,"height":210,"src":"https:\/\/cdn10-s-hw-e5.xtube.com\/m=eSK08f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/3.jpg"}]}
|
Loading…
Reference in New Issue
Block a user