Merge pull request #261 from eai04191/feature/resolver-dlsite-affiliate
DLsiteResolver アフィリエイトURLに対応
This commit is contained in:
		| @@ -52,6 +52,20 @@ class DLsiteResolver implements Resolver | |||||||
|  |  | ||||||
|     public function resolve(string $url): Metadata |     public function resolve(string $url): Metadata | ||||||
|     { |     { | ||||||
|  |         //アフィリエイトの場合は普通のURLに変換 | ||||||
|  |         if (strpos($url, '/dlaf/=/link/') !== false) { | ||||||
|  |             preg_match('~www\.dlsite\.com/(?P<genre>.+)/dlaf/=/link/work/aid/.+/id/(?P<titleId>..\d+)(\.html)?~', $url, $matches); | ||||||
|  |             $url = "https://www.dlsite.com/{$matches['genre']}/work/=/product_id/{$matches['titleId']}.html"; | ||||||
|  |         } | ||||||
|  |         if (strpos($url, '/dlaf/=/aid/') !== false) { | ||||||
|  |             preg_match('~www\.dlsite\.com/.+/dlaf/=/aid/.+/url/(?P<url>.+)~', $url, $matches); | ||||||
|  |             $affiliate_url = urldecode($matches['url']); | ||||||
|  |             if (preg_match('~www\.dlsite\.com/.+/(work|announce)/=/product_id/..\d+(\.html)?~', $affiliate_url, $matches)) { | ||||||
|  |                 $url = $affiliate_url; | ||||||
|  |             } else { | ||||||
|  |                 throw new \RuntimeException("アフィリエイト先のリンクがDLsiteのタイトルではありません: $affiliate_url"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         //スマホページの場合はPCページに正規化 |         //スマホページの場合はPCページに正規化 | ||||||
|         if (strpos($url, '-touch') !== false) { |         if (strpos($url, '-touch') !== false) { | ||||||
|   | |||||||
| @@ -16,6 +16,8 @@ class MetadataResolver implements Resolver | |||||||
|         '~ec\.toranoana\.(jp|shop)/(tora|joshi)(_[rd]+)?/(ec|digi)/item/~' => ToranoanaResolver::class, |         '~ec\.toranoana\.(jp|shop)/(tora|joshi)(_[rd]+)?/(ec|digi)/item/~' => ToranoanaResolver::class, | ||||||
|         '~iwara\.tv/(videos|images)/.*~' => IwaraResolver::class, |         '~iwara\.tv/(videos|images)/.*~' => IwaraResolver::class, | ||||||
|         '~www\.dlsite\.com/.*/(work|announce)/=/product_id/..\d+(\.html)?~' => DLsiteResolver::class, |         '~www\.dlsite\.com/.*/(work|announce)/=/product_id/..\d+(\.html)?~' => DLsiteResolver::class, | ||||||
|  |         '~www\.dlsite\.com/.*/dlaf/=/link/(work|announce)/aid/.+/..\d+(\.html)?~' => DLsiteResolver::class, | ||||||
|  |         '~www\.dlsite\.com/.*/dlaf/=/aid/.+/url/.+~' => DLsiteResolver::class, | ||||||
|         '~dlsite\.jp/...tw/..\d+~' => DLsiteResolver::class, |         '~dlsite\.jp/...tw/..\d+~' => DLsiteResolver::class, | ||||||
|         '~www\.pixiv\.net/member_illust\.php\?illust_id=\d+~' => PixivResolver::class, |         '~www\.pixiv\.net/member_illust\.php\?illust_id=\d+~' => PixivResolver::class, | ||||||
|         '~www\.pixiv\.net/user/\d+/series/\d+~' => PixivResolver::class, |         '~www\.pixiv\.net/user/\d+/series/\d+~' => PixivResolver::class, | ||||||
|   | |||||||
| @@ -227,6 +227,48 @@ class DLsiteResolverTest extends TestCase | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public function testAffiliateLink() | ||||||
|  |     { | ||||||
|  |         $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html'); | ||||||
|  |  | ||||||
|  |         $this->createResolver(DLsiteResolver::class, $responseText); | ||||||
|  |  | ||||||
|  |         $metadata = $this->resolver->resolve('https://www.dlsite.com/home/dlaf/=/link/work/aid/eai04191/id/RJ221761.html'); | ||||||
|  |         $this->assertEquals('ひつじ、数えてあげるっ', $metadata->title); | ||||||
|  |         $this->assertEquals('サークル名: Butterfly Dream' . PHP_EOL . '眠れないあなたに彼女が羊を数えてくれる音声です。', $metadata->description); | ||||||
|  |         $this->assertEquals('https://img.dlsite.jp/modpub/images2/work/doujin/RJ222000/RJ221761_img_main.jpg', $metadata->image); | ||||||
|  |         $this->assertEquals(['癒し', 'バイノーラル/ダミヘ', '日常/生活', 'ほのぼの', '恋人同士'], $metadata->tags); | ||||||
|  |         if ($this->shouldUseMock()) { | ||||||
|  |             $this->assertSame('https://www.dlsite.com/home/work/=/product_id/RJ221761.html', (string) $this->handler->getLastRequest()->getUri()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public function testAffiliateUrl() | ||||||
|  |     { | ||||||
|  |         $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html'); | ||||||
|  |  | ||||||
|  |         $this->createResolver(DLsiteResolver::class, $responseText); | ||||||
|  |  | ||||||
|  |         $metadata = $this->resolver->resolve('http://www.dlsite.com/home/dlaf/=/aid/eai04191/url/https%3A%2F%2Fwww.dlsite.com%2Fhome%2Fwork%2F=%2Fproduct_id%2FRJ221761.html'); | ||||||
|  |         $this->assertEquals('ひつじ、数えてあげるっ', $metadata->title); | ||||||
|  |         $this->assertEquals('サークル名: Butterfly Dream' . PHP_EOL . '眠れないあなたに彼女が羊を数えてくれる音声です。', $metadata->description); | ||||||
|  |         $this->assertEquals('https://img.dlsite.jp/modpub/images2/work/doujin/RJ222000/RJ221761_img_main.jpg', $metadata->image); | ||||||
|  |         $this->assertEquals(['癒し', 'バイノーラル/ダミヘ', '日常/生活', 'ほのぼの', '恋人同士'], $metadata->tags); | ||||||
|  |         if ($this->shouldUseMock()) { | ||||||
|  |             $this->assertSame('https://www.dlsite.com/home/work/=/product_id/RJ221761.html', (string) $this->handler->getLastRequest()->getUri()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public function testAffiliateBadUrl() | ||||||
|  |     { | ||||||
|  |         $this->createResolver(DLsiteResolver::class, ''); | ||||||
|  |  | ||||||
|  |         $this->expectException(\RuntimeException::class); | ||||||
|  |         $this->expectExceptionMessage('アフィリエイト先のリンクがDLsiteのタイトルではありません: https://www.dlsite.com/home/'); | ||||||
|  |  | ||||||
|  |         $this->resolver->resolve('http://www.dlsite.com/home/dlaf/=/aid/eai04191/url/https%3A%2F%2Fwww.dlsite.com%2Fhome%2F'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public function testHTMLdescription() |     public function testHTMLdescription() | ||||||
|     { |     { | ||||||
|         $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHTMLdescription.html'); |         $responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHTMLdescription.html'); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 shibafu
					shibafu