Passed
Pull Request — master (#1)
by
unknown
02:45
created

PlayStoreUiScraper::__invoke()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 47
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 36
c 1
b 0
f 0
dl 0
loc 47
rs 9.344
cc 2
nc 2
nop 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Nelexa\GPlay\Scraper;
5
6
use Nelexa\GPlay\GPlayApps;
7
use Nelexa\GPlay\Http\ResponseHandlerInterface;
8
use Nelexa\GPlay\Model\App;
9
use Nelexa\GPlay\Model\Developer;
10
use Nelexa\GPlay\Model\GoogleImage;
11
use Psr\Http\Message\RequestInterface;
12
use Psr\Http\Message\ResponseInterface;
13
use function GuzzleHttp\Psr7\parse_query;
14
15
class PlayStoreUiScraper implements ResponseHandlerInterface, Tokenable
16
{
17
    use TokenTrait;
18
19
    /**
20
     * @param RequestInterface $request
21
     * @param ResponseInterface $response
22
     * @return App[]
23
     */
24
    public function __invoke(RequestInterface $request, ResponseInterface $response)
25
    {
26
        $body = $response->getBody();
27
        $body->rewind();
28
        $contents = substr($body->getContents(), 5);
29
        $json = \GuzzleHttp\json_decode($contents, true);
30
        $json = \GuzzleHttp\json_decode($json[0][2], true);
31
32
        $locale = parse_query($request->getUri()->getQuery())[GPlayApps::REQ_PARAM_LOCALE] ?? GPlayApps::DEFAULT_LOCALE;
33
34
        $apps = [];
35
        foreach ($json[0][0][0] as $data) {
36
            $name = $data[2];
37
            $appId = $data[12][0];
38
            $url = GPlayApps::GOOGLE_PLAY_URL . $data[9][4][2];
39
            $icon = new GoogleImage($data[1][1][0][3][2]);
40
            $developerName = $data[4][0][0][0];
41
            $developerPage = GPlayApps::GOOGLE_PLAY_URL . $data[4][0][0][1][4][2];
42
            $developerId = parse_query(parse_url($developerPage, PHP_URL_QUERY))['id'];
43
            $price = $data[7][0][3][2][1][0][2];
44
            $summary = $data[4][1][1][1][1];
45
            $score = $data[6][0][2][1][1];
46
47
            $apps[] = new App(
48
                App::newBuilder()
49
                    ->setId($appId)
50
                    ->setUrl($url)
51
                    ->setLocale($locale)
52
                    ->setName($name)
53
                    ->setSummary($summary)
54
                    ->setDeveloper(
55
                        new Developer(
56
                            Developer::newBuilder()
57
                                ->setId($developerId)
58
                                ->setUrl($developerPage)
59
                                ->setName($developerName)
60
                        )
61
                    )
62
                    ->setIcon($icon)
63
                    ->setScore($score)
64
                    ->setPriceText($price)
65
            );
66
        }
67
68
        $this->setToken($json[0][0][7][1] ?? null);
69
70
        return $apps;
71
    }
72
}
73