Passed
Branch master (c893b5)
by axel
03:05
created

TopModel::getScore()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace MalScraper\Model\Top;
4
5
use MalScraper\Helper\Helper;
6
use MalScraper\Model\MainModel;
7
8
/**
9
 * TopModel class.
10
 */
11
class TopModel extends MainModel
12
{
13
    /**
14
     * Either anime or manga.
15
     *
16
     * @var string
17
     */
18
    private $_supertype;
19
20
    /**
21
     * Type.
22
     *
23
     * @var string
24
     */
25
    private $_type;
26
27
    /**
28
     * Page number.
29
     *
30
     * @var string
31
     */
32
    private $_page;
33
34
    /**
35
     * Default constructor.
36
     *
37
     * @param string|int $year
38
     * @param string     $season
39
     * @param string     $parserArea
40
     *
41
     * @return void
42
     */
43
    public function __construct($supertype, $type, $page, $parserArea = '#content')
44
    {
45
        $this->_supertype = $supertype;
46
        $this->_page = 50 * ($page - 1);
47
        if ($this->_supertype == 'anime') {
48
            $this->_type = Helper::getTopAnimeType()[$type];
49
            $this->_url = $this->_myAnimeListUrl.'/topanime.php?type='.$this->_type.'&limit='.$this->_page;
50
        } else {
51
            $this->_type = Helper::getTopMangaType()[$type];
52
            $this->_url = $this->_myAnimeListUrl.'/topmanga.php?type='.$this->_type.'&limit='.$this->_page;
53
        }
54
        $this->_parserArea = $parserArea;
55
56
        parent::errorCheck($this);
57
    }
58
59
    /**
60
     * Default call.
61
     *
62
     * @param string $method
63
     * @param array  $arguments
64
     *
65
     * @return array|string|int
66
     */
67
    public function __call($method, $arguments)
68
    {
69
        if ($this->_error) {
70
            return $this->_error;
71
        }
72
73
        return call_user_func_array([$this, $method], $arguments);
74
    }
75
76
    /**
77
     * Get rank.
78
     *
79
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
80
     *
81
     * @return string
82
     */
83
    private function getRank($each_anime)
84
    {
85
        $rank = $each_anime->find('td span', 0)->plaintext;
86
87
        return trim($rank);
88
    }
89
90
    /**
91
     * Get image.
92
     *
93
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
94
     *
95
     * @return string
96
     */
97
    private function getImage($each_anime)
98
    {
99
        $image = $each_anime->find('td', 1)->find('a img', 0)->getAttribute('data-src');
100
101
        return Helper::imageUrlCleaner($image);
102
    }
103
104
    /**
105
     * Get id.
106
     *
107
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
108
     *
109
     * @return string
110
     */
111
    private function getId($name_area)
112
    {
113
        $id = $name_area->find('div', 0)->id;
114
115
        return str_replace('area', '', $id);
116
    }
117
118
    /**
119
     * Get title.
120
     *
121
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
122
     *
123
     * @return string
124
     */
125
    private function getTitle($name_area)
126
    {
127
        return $name_area->find('a', 0)->plaintext;
128
    }
129
130
    /**
131
     * Get type.
132
     *
133
     * @param array $parsed_info
134
     *
135
     * @return string
136
     */
137
    private function getType($parsed_info)
138
    {
139
        $parsed_info = trim(preg_replace("/([\s])+/", ' ', $parsed_info[0]));
140
        $parsed_info = explode(' ', $parsed_info);
141
142
        return $parsed_info[0];
143
    }
144
145
    /**
146
     * Get episode.
147
     *
148
     * @param array $parsed_info
149
     *
150
     * @return string
151
     */
152
    private function getEpisode($parsed_info)
153
    {
154
        $parsed_info = trim(preg_replace("/([\s])+/", ' ', $parsed_info[0]));
155
        $parsed_info = explode(' ', $parsed_info);
156
        $episode = str_replace('(', '', $parsed_info[1]);
157
158
        return $episode == '?' ? '' : $episode;
159
    }
160
161
    /**
162
     * Get date.
163
     *
164
     * @param array $parsed_info
165
     *
166
     * @return string
167
     */
168
    private function getDate($parsed_info, $type)
169
    {
170
        $date = explode('-', $parsed_info[1]);
171
        if ($type == 'start') {
172
            return trim($date[0]);
173
        } else {
174
            return trim($date[1]);
175
        }
176
    }
177
178
    /**
179
     * Get member.
180
     *
181
     * @param array $parsed_info
182
     *
183
     * @return string
184
     */
185
    private function getMember($parsed_info)
186
    {
187
        return trim(str_replace(['members', 'favorites', ','], '', $parsed_info[2]));
188
    }
189
190
    /**
191
     * Get score.
192
     *
193
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
194
     *
195
     * @return string
196
     */
197
    private function getScore($each_anime)
198
    {
199
        $score = $each_anime->find('td', 2)->plaintext;
200
201
        return trim(str_replace('N/A', '', $score));
202
    }
203
204
    /**
205
     * Get result list.
206
     *
207
     * @return array
208
     */
209
    private function getAllInfo()
210
    {
211
        $data = [];
212
        $data_index = 0;
213
        $top_table = $this->_parser->find('table', 0);
214
        foreach ($top_table->find('tr[class=ranking-list]') as $each_anime) {
215
            $name_area = $each_anime->find('td .detail', 0);
216
            $info_area = $name_area->find('div[class^=information]', 0);
217
            $parsed_info = explode('<br>', $info_area->innertext);
218
219
            $data[$data_index]['rank'] = $this->getRank($each_anime);
220
            $data[$data_index]['image'] = $this->getImage($each_anime);
221
            $data[$data_index]['id'] = $this->getId($name_area);
222
            $data[$data_index]['title'] = $this->getTitle($name_area);
223
            $data[$data_index]['type'] = $this->getType($parsed_info);
224
            if ($this->_supertype == 'anime') {
225
                $data[$data_index]['episode'] = $this->getEpisode($parsed_info);
226
            } else {
227
                $data[$data_index]['volume'] = $this->getEpisode($parsed_info);
228
            }
229
            $data[$data_index]['start_date'] = $this->getDate($parsed_info, 'start');
230
            $data[$data_index]['end_date'] = $this->getDate($parsed_info, 'end');
231
            $data[$data_index]['member'] = $this->getMember($parsed_info);
232
            $data[$data_index]['score'] = $this->getScore($each_anime);
233
234
            $data_index++;
235
        }
236
237
        return $data;
238
    }
239
}
240