From c061a51f8f95930674ac74c205f819d634c8dac1 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Sat, 15 Jun 2019 04:57:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?SteamResolver=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/MetadataResolver.php | 1 + app/MetadataResolver/SteamResolver.php | 41 +++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 app/MetadataResolver/SteamResolver.php diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index c47608a..4ff1669 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -27,6 +27,7 @@ class MetadataResolver implements Resolver '~ci-en\.jp/creator/\d+/article/\d+~' => CienResolver::class, '~www\.plurk\.com\/p\/.*~' => PlurkResolver::class, '~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class, + '~store\.steampowered\.com/app/\d+~' => SteamResolver::class, ]; public $mimeTypes = [ diff --git a/app/MetadataResolver/SteamResolver.php b/app/MetadataResolver/SteamResolver.php new file mode 100644 index 0000000..c9bef92 --- /dev/null +++ b/app/MetadataResolver/SteamResolver.php @@ -0,0 +1,41 @@ +client = $client; + } + + public function resolve(string $url): Metadata + { + if (preg_match('~store\.steampowered\.com/app/(\d+)~', $url, $matches) !== 1) { + throw new \RuntimeException("Unmatched URL Pattern: $url"); + } + $appid = $matches[1]; + + $res = $this->client->get('https://store.steampowered.com/api/appdetails/?l=japanese&appids=' . $appid); + if ($res->getStatusCode() === 200) { + $json = json_decode($res->getBody()->getContents(), true); + $data = $json[$appid]['data']; + $metadata = new Metadata(); + + $metadata->title = $data['name'] ?? ''; + $metadata->description = strip_tags(str_replace('
', PHP_EOL, html_entity_decode($data['short_description'] ?? ''))); + $metadata->image = $data['header_image'] ?? ''; + + return $metadata; + } else { + throw new \RuntimeException("{$res->getStatusCode()}: $url"); + } + } +} From 9306a4376caabf993249644c6f12187cd51d31c3 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Sat, 15 Jun 2019 07:26:15 +0900 Subject: [PATCH 2/5] =?UTF-8?q?200=E3=81=A7=E3=82=82=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E6=99=82=E3=81=8C=E3=81=82=E3=82=8B=E3=81=AE?= =?UTF-8?q?=E3=81=A7success=E3=82=82=E8=A6=8B=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit やり方これであってるのか? --- app/MetadataResolver/SteamResolver.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/MetadataResolver/SteamResolver.php b/app/MetadataResolver/SteamResolver.php index c9bef92..d9f11f3 100644 --- a/app/MetadataResolver/SteamResolver.php +++ b/app/MetadataResolver/SteamResolver.php @@ -26,6 +26,9 @@ class SteamResolver implements Resolver $res = $this->client->get('https://store.steampowered.com/api/appdetails/?l=japanese&appids=' . $appid); if ($res->getStatusCode() === 200) { $json = json_decode($res->getBody()->getContents(), true); + if($json[$appid]['success'] === false){ + throw new \RuntimeException("API response [$appid][success] is false: $url"); + } $data = $json[$appid]['data']; $metadata = new Metadata(); From fbecd97c03adc8ca4f6198f660856775a8b0d7fc Mon Sep 17 00:00:00 2001 From: eai04191 Date: Sat, 15 Jun 2019 07:35:33 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E3=81=84=E3=81=84=E5=8A=A0=E6=B8=9Bpush?= =?UTF-8?q?=E5=89=8D=E3=81=AB=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=81=99=E3=82=8B=E7=BF=92=E6=85=A3=E3=82=92=E3=81=A4?= =?UTF-8?q?=E3=81=91=E3=82=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/SteamResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/MetadataResolver/SteamResolver.php b/app/MetadataResolver/SteamResolver.php index d9f11f3..987c97b 100644 --- a/app/MetadataResolver/SteamResolver.php +++ b/app/MetadataResolver/SteamResolver.php @@ -26,7 +26,7 @@ class SteamResolver implements Resolver $res = $this->client->get('https://store.steampowered.com/api/appdetails/?l=japanese&appids=' . $appid); if ($res->getStatusCode() === 200) { $json = json_decode($res->getBody()->getContents(), true); - if($json[$appid]['success'] === false){ + if ($json[$appid]['success'] === false) { throw new \RuntimeException("API response [$appid][success] is false: $url"); } $data = $json[$appid]['data']; From fe09f769e3cc9ba01601c6905d10ce61c5d15652 Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 16 Jun 2019 22:33:15 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MetadataResolver/SteamResolverTest.php | 55 +++++++++++++++++++ tests/fixture/Steam/test.json | 10 ++++ tests/fixture/Steam/testNotFound.json | 1 + tests/fixture/Steam/testR18.json | 10 ++++ 4 files changed, 76 insertions(+) create mode 100644 tests/Unit/MetadataResolver/SteamResolverTest.php create mode 100644 tests/fixture/Steam/test.json create mode 100644 tests/fixture/Steam/testNotFound.json create mode 100644 tests/fixture/Steam/testR18.json diff --git a/tests/Unit/MetadataResolver/SteamResolverTest.php b/tests/Unit/MetadataResolver/SteamResolverTest.php new file mode 100644 index 0000000..81c6653 --- /dev/null +++ b/tests/Unit/MetadataResolver/SteamResolverTest.php @@ -0,0 +1,55 @@ +shouldUseMock()) { + sleep(1); + } + } + + public function test() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/Steam/test.json'); + + $this->createResolver(SteamResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://store.steampowered.com/app/333600'); + $this->assertEquals('NEKOPARA Vol. 1', $metadata->title); + $this->assertEquals('水無月嘉祥(みなづき かしょう)は伝統ある老舗和菓子屋である実家を出て、 パティシエとして自身のケーキ屋『ラ・ソレイユ』を一人で開店する。 しかし実家から送った引っ越し荷物の中に、 実家で飼っていた人型ネコのショコラとバニラが紛れ込んでいた。', $metadata->description); + $this->assertEquals('https://steamcdn-a.akamaihd.net/steam/apps/333600/header.jpg?t=1558382831', $metadata->image); + } + + public function testR18() + { + $responseText = file_get_contents(__DIR__ . '/../../fixture/Steam/testR18.json'); + + $this->createResolver(SteamResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://store.steampowered.com/app/1077580'); + $this->assertEquals('Broke Girl | 負債千金', $metadata->title); + $this->assertEquals('苦労知らずに育ったお嬢様は一夜にして1000万の借金を背負うことになった。借金を返済するために働かなければならない。しかし世間には悪意が満ちており、男達はお金で彼女を誘うか凌辱することしか考えていない。', $metadata->description); + $this->assertEquals('https://steamcdn-a.akamaihd.net/steam/apps/1077580/header.jpg?t=1559506319', $metadata->image); + } + + public function testNotFound() + { + $this->expectException(\RuntimeException::class); + + $responseText = file_get_contents(__DIR__ . '/../../fixture/Steam/testNotFound.json'); + + $this->createResolver(SteamResolver::class, $responseText); + + $this->resolver->resolve('https://store.steampowered.com/app/1'); + } +} diff --git a/tests/fixture/Steam/test.json b/tests/fixture/Steam/test.json new file mode 100644 index 0000000..3c238f4 --- /dev/null +++ b/tests/fixture/Steam/test.json @@ -0,0 +1,10 @@ +{ + "333600": { + "success": true, + "data": { + "name": "NEKOPARA Vol. 1", + "short_description": "水無月嘉祥(みなづき かしょう)は伝統ある老舗和菓子屋である実家を出て、 パティシエとして自身のケーキ屋『ラ・ソレイユ』を一人で開店する。 しかし実家から送った引っ越し荷物の中に、 実家で飼っていた人型ネコのショコラとバニラが紛れ込んでいた。", + "header_image": "https://steamcdn-a.akamaihd.net/steam/apps/333600/header.jpg?t=1558382831" + } + } +} diff --git a/tests/fixture/Steam/testNotFound.json b/tests/fixture/Steam/testNotFound.json new file mode 100644 index 0000000..0c538d2 --- /dev/null +++ b/tests/fixture/Steam/testNotFound.json @@ -0,0 +1 @@ +{"1":{"success":false}} \ No newline at end of file diff --git a/tests/fixture/Steam/testR18.json b/tests/fixture/Steam/testR18.json new file mode 100644 index 0000000..5edf5a1 --- /dev/null +++ b/tests/fixture/Steam/testR18.json @@ -0,0 +1,10 @@ +{ + "1077580": { + "success": true, + "data": { + "name": "Broke Girl | 負債千金", + "short_description": "苦労知らずに育ったお嬢様は一夜にして1000万の借金を背負うことになった。借金を返済するために働かなければならない。しかし世間には悪意が満ちており、男達はお金で彼女を誘うか凌辱することしか考えていない。", + "header_image": "https://steamcdn-a.akamaihd.net/steam/apps/1077580/header.jpg?t=1559506319" + } + } +} From 16e5341de1b1f50683480b188883cca4170b0d25 Mon Sep 17 00:00:00 2001 From: eai04191 Date: Mon, 17 Jun 2019 04:29:54 +0900 Subject: [PATCH 5/5] =?UTF-8?q?assertStringStartsWith=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit モックを使わないテストがコケることがあるので --- tests/Unit/MetadataResolver/SteamResolverTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/MetadataResolver/SteamResolverTest.php b/tests/Unit/MetadataResolver/SteamResolverTest.php index 81c6653..dadaf47 100644 --- a/tests/Unit/MetadataResolver/SteamResolverTest.php +++ b/tests/Unit/MetadataResolver/SteamResolverTest.php @@ -27,7 +27,7 @@ class SteamResolverTest extends TestCase $metadata = $this->resolver->resolve('https://store.steampowered.com/app/333600'); $this->assertEquals('NEKOPARA Vol. 1', $metadata->title); $this->assertEquals('水無月嘉祥(みなづき かしょう)は伝統ある老舗和菓子屋である実家を出て、 パティシエとして自身のケーキ屋『ラ・ソレイユ』を一人で開店する。 しかし実家から送った引っ越し荷物の中に、 実家で飼っていた人型ネコのショコラとバニラが紛れ込んでいた。', $metadata->description); - $this->assertEquals('https://steamcdn-a.akamaihd.net/steam/apps/333600/header.jpg?t=1558382831', $metadata->image); + $this->assertStringStartsWith('https://steamcdn-a.akamaihd.net/steam/apps/333600/header.jpg?t=', $metadata->image); } public function testR18() @@ -39,7 +39,7 @@ class SteamResolverTest extends TestCase $metadata = $this->resolver->resolve('https://store.steampowered.com/app/1077580'); $this->assertEquals('Broke Girl | 負債千金', $metadata->title); $this->assertEquals('苦労知らずに育ったお嬢様は一夜にして1000万の借金を背負うことになった。借金を返済するために働かなければならない。しかし世間には悪意が満ちており、男達はお金で彼女を誘うか凌辱することしか考えていない。', $metadata->description); - $this->assertEquals('https://steamcdn-a.akamaihd.net/steam/apps/1077580/header.jpg?t=1559506319', $metadata->image); + $this->assertStringStartsWith('https://steamcdn-a.akamaihd.net/steam/apps/1077580/header.jpg?t=', $metadata->image); } public function testNotFound()