TopModel   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 228
Duplicated Lines 0 %

Importance

Changes 2
Bugs 1 Features 1
Metric Value
eloc 61
c 2
b 1
f 1
dl 0
loc 228
rs 10
wmc 18

12 Methods

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