Completed
Push — master ( c5110b...a167e6 )
by Valentyn
13:46
created

ImdbReleaseDateParserService   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 3
dl 0
loc 59
ccs 0
cts 29
cp 0
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B getReleaseDates() 0 28 6
A loadImdbReleaseDatesPageHtml() 0 18 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Movies\Service;
6
7
use App\Movies\Entity\Movie;
8
use Symfony\Component\DomCrawler\Crawler;
9
10
class ImdbReleaseDateParserService
11
{
12
    private const IMDB_RELEASE_DATES_URL = 'https://imdb.com/title/{id}/releaseinfo?ref_=tt_dt_dt';
13
14
    private $imdbMapper;
15
16
    public function __construct(ImdbDataMapper $mapper)
17
    {
18
        $this->imdbMapper = $mapper;
19
    }
20
21
    public function getReleaseDates(Movie $movie): array
22
    {
23
        if ($movie->getImdbId() === null) {
24
            return [];
25
        }
26
27
        $html = $this->loadImdbReleaseDatesPageHtml($movie->getImdbId());
28
        $crawler = new Crawler($html, self::IMDB_RELEASE_DATES_URL);
29
30
        $tds = $crawler->filterXPath('//*[@id="release_dates"]//td')->getIterator();
31
32
        $result = [];
33
        $country = '';
34
        foreach ($tds as $td) {
35
            if ($td->getAttribute('class') === 'release_date') {
36
                $result[$country] = $this->imdbMapper->dateToObject($td->textContent);
37
                continue;
38
            }
39
40
            if ($td->hasChildNodes() && $td->getElementsByTagName('a')->item(0) !== null) {
41
                $country = $td->getElementsByTagName('a')->item(0)->textContent;
42
                $country = $this->imdbMapper->countryToCode($country);
43
                continue;
44
            }
45
        }
46
47
        return $result;
48
    }
49
50
    private function loadImdbReleaseDatesPageHtml(string $imdbId): string
51
    {
52
        $endpoint = str_replace('{id}', $imdbId, self::IMDB_RELEASE_DATES_URL);
53
54
        $c = curl_init($endpoint);
55
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
56
57
        $html = curl_exec($c);
58
59
        if (curl_error($c)) {
60
            //todo write to log
61
            return '';
62
        }
63
64
        curl_close($c);
65
66
        return $html;
67
    }
68
}
69