Passed
Branch develop (29ed49)
by Alexey
01:58
created

DeveloperInfoScraper   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 83
Duplicated Lines 0 %

Test Coverage

Coverage 85.37%

Importance

Changes 0
Metric Value
eloc 37
dl 0
loc 83
ccs 35
cts 41
cp 0.8537
rs 10
c 0
b 0
f 0
wmc 9

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getScriptDataInfo() 0 18 4
A extractIcon() 0 5 2
A __invoke() 0 26 1
A extractCoverImage() 0 5 2
1
<?php
2
declare(strict_types=1);
3
4
/**
5
 * @author   Ne-Lexa
6
 * @license  MIT
7
 * @link     https://github.com/Ne-Lexa/google-play-scraper
8
 */
9
10
namespace Nelexa\GPlay\Scraper;
11
12
use Nelexa\GPlay\Exception\GooglePlayException;
13
use Nelexa\GPlay\GPlayApps;
14
use Nelexa\GPlay\Http\ResponseHandlerInterface;
15
use Nelexa\GPlay\Model\Developer;
16
use Nelexa\GPlay\Model\GoogleImage;
17
use Nelexa\GPlay\Util\ScraperUtil;
18
use Psr\Http\Message\RequestInterface;
19
use Psr\Http\Message\ResponseInterface;
20
use function GuzzleHttp\Psr7\parse_query;
21
22
/**
23
 * @internal
24
 */
25
class DeveloperInfoScraper implements ResponseHandlerInterface
26
{
27
    /**
28
     * @param RequestInterface $request
29
     * @param ResponseInterface $response
30
     * @return mixed
31
     * @throws GooglePlayException
32
     */
33 2
    public function __invoke(RequestInterface $request, ResponseInterface $response)
34
    {
35 2
        $query = parse_query($request->getUri()->getQuery());
36
37 2
        $developerId = $query[GPlayApps::REQ_PARAM_ID];
38 2
        $url = (string)$request->getUri()
39 2
            ->withQuery(http_build_query([GPlayApps::REQ_PARAM_ID => $developerId]));
40
41 2
        $scriptDataInfo = $this->getScriptDataInfo($request, $response);
42
43 2
        $name = $scriptDataInfo[0][0][0];
44
45 2
        $cover = $this->extractCoverImage($scriptDataInfo);
46 2
        $icon = $this->extractIcon($scriptDataInfo);
47 2
        $developerSite = $scriptDataInfo[0][9][2][0][5][2] ?? null;
48 2
        $description = $scriptDataInfo[0][10][1][1] ?? '';
49
50 2
        return new Developer(
51 2
            Developer::newBuilder()
52 2
                ->setId($developerId)
53 2
                ->setUrl($url)
54 2
                ->setName($name)
55 2
                ->setDescription($description)
56 2
                ->setWebsite($developerSite)
57 2
                ->setIcon($icon)
58 2
                ->setCover($cover)
59
        );
60
    }
61
62
    /**
63
     * @param RequestInterface $request
64
     * @param ResponseInterface $response
65
     * @return array
66
     * @throws GooglePlayException
67
     */
68 2
    protected function getScriptDataInfo(RequestInterface $request, ResponseInterface $response): array
69
    {
70 2
        $scriptData = ScraperUtil::extractScriptData($response->getBody()->getContents());
71
72 2
        $scriptDataInfo = null;
73 2
        foreach ($scriptData as $key => $scriptValue) {
74 2
            if (isset($scriptValue[0][21])) {
75 2
                $scriptDataInfo = $scriptValue; // ds:5
76 2
                break;
77
            }
78
        }
79 2
        if ($scriptDataInfo === null) {
80
            throw (new GooglePlayException(sprintf(
81
                'Error parse vendor page %s. Need update library.',
82
                $request->getUri()
83
            )))->setUrl($request->getUri()->__toString());
84
        }
85 2
        return $scriptDataInfo;
86
    }
87
88
    /**
89
     * @param array $scriptDataInfo
90
     * @return GoogleImage|null
91
     */
92 2
    protected function extractCoverImage(array $scriptDataInfo): ?GoogleImage
93
    {
94 2
        return empty($scriptDataInfo[0][9][0][3][2]) ?
95
            null :
96 2
            new GoogleImage($scriptDataInfo[0][9][0][3][2]);
97
    }
98
99
    /**
100
     * @param array $scriptDataInfo
101
     * @return GoogleImage|null
102
     */
103 2
    protected function extractIcon(array $scriptDataInfo): ?GoogleImage
104
    {
105 2
        return empty($scriptDataInfo[0][9][1][3][2]) ?
106
            null :
107 2
            new GoogleImage($scriptDataInfo[0][9][1][3][2]);
108
    }
109
}
110