Passed
Push — feature/super-model ( 6844b5...0f230d )
by axel
02:12
created

TopModel::getEpisode()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 6
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
        return call_user_func_array([$this, $method], $arguments);
72
    }
73
74
    /**
75
     * Get rank.
76
     *
77
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
78
     *
79
     * @return string
80
     */
81
    private function getRank($each_anime)
82
    {
83
        $rank = $each_anime->find('td span', 0)->plaintext;
84
        return trim($rank);
85
    }
86
87
    /**
88
     * Get image.
89
     *
90
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
91
     *
92
     * @return string
93
     */
94
    private function getImage($each_anime)
95
    {
96
        $image = $each_anime->find('td', 1)->find('a img', 0)->getAttribute('data-src');
97
        return Helper::imageUrlCleaner($image);
98
    }
99
100
    /**
101
     * Get id.
102
     *
103
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
104
     *
105
     * @return string
106
     */
107
    private function getId($name_area)
108
    {
109
        $id = $name_area->find('div', 0)->id;
110
        return str_replace('area', '', $id);
111
    }
112
113
    /**
114
     * Get title.
115
     *
116
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
117
     *
118
     * @return string
119
     */
120
    private function getTitle($name_area)
121
    {
122
        return $name_area->find('a', 0)->plaintext;
123
    }
124
125
    /**
126
     * Get type.
127
     *
128
     * @param array $parsed_info
129
     *
130
     * @return string
131
     */
132
    private function getType($parsed_info)
133
    {
134
        $parsed_info = trim(preg_replace("/([\s])+/", ' ', $parsed_info[0]));
135
        $parsed_info = explode(' ', $parsed_info);
136
        return $parsed_info[0];
137
    }
138
139
    /**
140
     * Get episode.
141
     *
142
     * @param array $parsed_info
143
     *
144
     * @return string
145
     */
146
    private function getEpisode($parsed_info)
147
    {
148
        $parsed_info = trim(preg_replace("/([\s])+/", ' ', $parsed_info[0]));
149
        $parsed_info = explode(' ', $parsed_info);
150
        $episode = str_replace('(', '', $parsed_info[1]);
151
        return $episode == '?' ? '' : $episode;
152
    }
153
154
    /**
155
     * Get date.
156
     *
157
     * @param array $parsed_info
158
     *
159
     * @return string
160
     */
161
    private function getDate($parsed_info, $type)
162
    {
163
        $date = explode('-', $parsed_info[1]);
164
        if ($type == 'start') {
165
            return trim($date[0]);
166
        } else {
167
            return trim($date[1]);
168
        }
169
    }
170
171
    /**
172
     * Get member.
173
     *
174
     * @param array $parsed_info
175
     *
176
     * @return string
177
     */
178
    private function getMember($parsed_info)
179
    {
180
        return trim(str_replace(['members', 'favorites', ','], '', $parsed_info[2]));
181
    }
182
183
    /**
184
     * Get score.
185
     *
186
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
187
     *
188
     * @return string
189
     */
190
    private function getScore($each_anime)
191
    {
192
        $score = $each_anime->find('td', 2)->plaintext;
193
        return trim(str_replace('N/A', '', $score));
194
    }
195
196
     /**
197
     * Get result list.
198
     *
199
     * @return array
200
     */
201
    private function getAllInfo()
202
    {
203
        $data = [];
204
        $data_index = 0;
205
        $top_table = $this->_parser->find('table', 0);
206
        foreach ($top_table->find('tr[class=ranking-list]') as $each_anime) {
207
208
            $name_area = $each_anime->find('td .detail', 0);
209
            $info_area = $name_area->find('div[class^=information]', 0);
210
            $parsed_info = explode('<br>', $info_area->innertext);
211
212
            $data[$data_index]['rank'] = $this->getRank($each_anime);
213
            $data[$data_index]['image'] = $this->getImage($each_anime);
214
            $data[$data_index]['id'] = $this->getId($name_area);
215
            $data[$data_index]['title'] = $this->getTitle($name_area);
216
            $data[$data_index]['type'] = $this->getType($parsed_info);
217
            if ($this->_supertype == 'anime') {
218
                $data[$data_index]['episode'] = $this->getEpisode($parsed_info);
219
            } else {
220
                $data[$data_index]['volume'] = $this->getEpisode($parsed_info);
221
            }
222
            $data[$data_index]['start_date'] = $this->getDate($parsed_info, 'start');
223
            $data[$data_index]['end_date'] = $this->getDate($parsed_info, 'end');
224
            $data[$data_index]['member'] = $this->getMember($parsed_info);
225
            $data[$data_index]['score'] = $this->getScore($each_anime);
226
227
            $data_index++;
228
        }
229
230
        return $data;
231
    }
232
233
}