diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index 64cdefb..e53f7d6 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -28,6 +28,7 @@ class MetadataResolver implements Resolver '~www\.plurk\.com\/p\/.*~' => PlurkResolver::class, '~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class, '~store\.steampowered\.com/app/\d+~' => SteamResolver::class, + '~www\.xtube\.com/video-watch/.*-\d+$~'=> XtubeResolver::class, ]; public $mimeTypes = [ diff --git a/app/MetadataResolver/XtubeResolver.php b/app/MetadataResolver/XtubeResolver.php new file mode 100644 index 0000000..d56cce0 --- /dev/null +++ b/app/MetadataResolver/XtubeResolver.php @@ -0,0 +1,41 @@ +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"); + } + } +} diff --git a/tests/Unit/MetadataResolver/XtubeResolverTest.php b/tests/Unit/MetadataResolver/XtubeResolverTest.php new file mode 100644 index 0000000..828ec3f --- /dev/null +++ b/tests/Unit/MetadataResolver/XtubeResolverTest.php @@ -0,0 +1,51 @@ +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'); + } +} diff --git a/tests/fixture/Xtube/test.json b/tests/fixture/Xtube/test.json new file mode 100644 index 0000000..ad7b553 --- /dev/null +++ b/tests/fixture/Xtube/test.json @@ -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"}]} \ No newline at end of file