GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( fc6845...7741ae )
by Christian
03:01
created

src/Crawler/EventInfoCrawler.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * (c) Christian Gripp <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Core23\LastFm\Crawler;
13
14
use Core23\LastFm\Model\Artist;
15
use Core23\LastFm\Model\EventInfo;
16
use Core23\LastFm\Model\Venue;
17
use Core23\LastFm\Model\VenueAddress;
18
use Symfony\Component\DomCrawler\Crawler;
19
20
final class EventInfoCrawler extends AbstractCrawler implements EventInfoCrawlerInterface
21
{
22
    /**
23
     * {@inheritdoc}
24
     */
25
    public function getEventInfo(int $id): ?EventInfo
26
    {
27
        $node = $this->crawlEvent($id);
28
29
        if (null === $node) {
30
            return null;
31
        }
32
33
        $timeNode = $node->filter('.qa-event-date');
34
35
        return new EventInfo(
36
            $id,
37
            $this->parseString($node->filter('h1.header-title')) ?? '',
38
            $this->parseString($node->filter('.qa-event-description'), true),
39
            $this->parseDate($timeNode->filter('[itemprop="startDate"]')),
40
            $this->parseDate($timeNode->filter('[itemprop="endDate"]')),
41
            $this->parseString($node->filter('.qa-event-link a')),
42
            $this->parseImage($node->filter('.event-poster-preview')),
43
            $this->parseUrl($node->filter('link[rel="canonical"]')),
44
            $node->filter('.namespace--events_festival_overview')->count() > 0,
45
            $this->readVenues($node),
46
            $this->readArtists($node)
47
        );
48
    }
49
50
    /**
51
     * @param Crawler $node
52
     *
53
     * @return Artist[]
54
     */
55
    private function readArtists(Crawler $node): array
56
    {
57
        $artistNode = $node->filter('.grid-items');
58
59
        return $artistNode->filter('.grid-items-item')->each(function (Crawler $node): Artist {
0 ignored issues
show
Expected 1 space after closing parenthesis; found 0
Loading history...
60
            $image = $this->parseImage($node->filter('.grid-items-cover-image-image img'));
61
62
            return new Artist(
63
                $this->parseString($node->filter('.grid-items-item-main-text')) ?? '',
64
                null,
65
                $image ? [$image] : [],
66
                $this->parseUrl($node->filter('.grid-items-item-main-text a'))
67
            );
68
        });
69
    }
70
71
    /**
72
     * @param Crawler $node
73
     *
74
     * @return Venue
75
     */
76
    private function readVenues(Crawler $node): Venue
77
    {
78
        $venueNode   = $node->filter('.event-detail');
79
        $addressNode = $venueNode->filter('.event-detail-address');
80
81
        $adress = new VenueAddress(
82
            $this->parseString($addressNode->filter('[itemprop="streetAddress"]')),
83
            $this->parseString($addressNode->filter('[itemprop="postalCode"]')),
84
            $this->parseString($addressNode->filter('[itemprop="addressLocality"]')),
85
            $this->parseString($addressNode->filter('[itemprop="addressCountry"]'))
86
        );
87
88
        return new Venue(
89
            $this->parseString($venueNode->filter('[itemprop="name"]')) ?? '',
90
            $this->parseUrl($venueNode->filter('.event-detail .qa-event-link a')),
91
            $this->parseString($venueNode->filter('.event-detail-tel span')),
92
            $adress
93
        );
94
    }
95
96
    /**
97
     * @param int $id
98
     *
99
     * @return Crawler|null
100
     */
101
    private function crawlEvent(int $id): ?Crawler
102
    {
103
        $url = 'https://www.last.fm/de/event/'.$id;
104
105
        return $this->crawl($url);
106
    }
107
}
108