Passed
Push — feature/super-model ( a850c4...c51526 )
by axel
03:11
created

SearchAnimeMangaModel::__call()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 2
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace MalScraper\Model\Search;
4
5
use MalScraper\Helper\Helper;
6
use MalScraper\Model\MainModel;
7
8
/**
9
 * SearchAnimeMangaModel class.
10
 */
11
class SearchAnimeMangaModel extends MainModel
12
{
13
    /**
14
     * Either anime or manga.
15
     *
16
     * @var string
17
     */
18
	private $_type;
19
20
    /**
21
     * Search query.
22
     *
23
     * @var string
24
     */
25
    protected $_query;
26
27
    /**
28
     * Page number.
29
     *
30
     * @var int
31
     */
32
    private $_page;
33
34
    /**
35
     * Default constructor.
36
     *
37
     * @param string $type
38
     * @param string $query
39
     * @param int $page
40
     * @param string $parserArea
41
     *
42
     * @return void
43
     */
44
	public function __construct($type, $query, $page, $parserArea = 'div[class^=js-categories-seasonal]')
45
    {
46
        $this->_type = $type;
47
    	$this->_query = $query;
48
        $this->_page = 50 * ($page - 1);
49
50
        if ($type == 'anime') {
51
            $this->_url = $this->_myAnimeListUrl.'/anime.php?q='.$query.'&show='.$this->_page;
52
        } else {
53
            $this->_url = $this->_myAnimeListUrl.'/manga.php?q='.$query.'&show='.$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
        return call_user_func_array([$this, $method], $arguments);
73
    }
74
75
    /**
76
     * Get image.
77
     *
78
     * @param \simplehtmldom_1_5\simple_html_dom $result_area
79
     *
80
     * @return string
81
     */
82
    private function getImage($result_area)
83
    {
84
        $image = $result_area->find('td', 0)->find('a img', 0)->getAttribute('data-src');
85
        return Helper::imageUrlCleaner($image);
86
    }
87
88
    /**
89
     * Get id.
90
     *
91
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
92
     *
93
     * @return string
94
     */
95
    private function getId($name_area)
96
    {
97
        $id = $name_area->find('div[id^=sarea]', 0)->id;
98
        return str_replace('sarea', '', $id);
99
    }
100
101
    /**
102
     * Get title.
103
     *
104
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
105
     *
106
     * @return string
107
     */
108
    private function getTitle($name_area)
109
    {
110
        return $name_area->find('strong', 0)->plaintext;
111
    }
112
113
    /**
114
     * Get summary.
115
     *
116
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
117
     *
118
     * @return string
119
     */
120
    private function getSummary($name_area)
121
    {
122
        $summary = $name_area->find('.pt4', 0)->plaintext;
123
        return str_replace('read more.', '', $summary);
124
    }
125
126
    /**
127
     * Get type.
128
     *
129
     * @param \simplehtmldom_1_5\simple_html_dom $result_area
130
     *
131
     * @return string
132
     */
133
    private function getType($result_area)
134
    {
135
        $type = $result_area->find('td', 2)->plaintext;
136
        return trim($type);
137
    }
138
139
    /**
140
     * Get episode.
141
     *
142
     * @param \simplehtmldom_1_5\simple_html_dom $result_area
143
     *
144
     * @return string
145
     */
146
    private function getEpisode($result_area)
147
    {
148
        $episode = $result_area->find('td', 3)->plaintext;
149
        $episode = trim($episode);
150
        return $episode == '-' ? '' : $episode;
151
    }
152
153
    /**
154
     * Get score.
155
     *
156
     * @param \simplehtmldom_1_5\simple_html_dom $result_area
157
     *
158
     * @return string
159
     */
160
    private function getScore($result_area)
161
    {
162
        $score = $result_area->find('td', 4)->plaintext;
163
        $score = trim($score);
164
        return $score == 'N/A' ? '' : $score;
165
    }
166
167
    /**
168
     * Get list of all genre.
169
     *
170
     * @return array
171
     */
172
    private function getAllInfo()
173
    {
174
        $data = [];
175
        $result_table = $this->_parser->find('table', 0);
176
        $result_area = $result_table->find('tr', 0)->next_sibling();
177
        while (true) {
178
            $result = [];
179
180
            $name_area = $result_area->find('td', 1);
181
182
            $result['image'] = $this->getImage($result_area);
183
            $result['id'] = $this->getId($name_area);
184
            $result['title'] = $this->getTitle($name_area);
185
            $result['summary'] = $this->getSummary($name_area);
186
            $result['type'] = $this->getType($result_area);
187
188
            if ($this->_type == 'anime') {
189
                $result['episode'] = $this->getEpisode($result_area);
190
            } else {
191
                $result['volume'] = $this->getEpisode($result_area);
192
            }
193
194
            $result['score'] = $this->getScore($result_area);
195
196
            $data[] = $result;
197
198
            $result_area = $result_area->next_sibling();
199
            if (!$result_area) {
200
                break;
201
            }
202
        }
203
        return $data;
204
    }
205
}