Passed
Push — feature/super-model ( 24c950...13c8a0 )
by axel
02:30
created

ProducerModel::getAllInfo()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 36
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 27
nc 3
nop 0
dl 0
loc 36
rs 9.488
c 0
b 0
f 0
1
<?php
2
3
namespace MalScraper\Model\General;
4
5
use MalScraper\Helper\Helper;
6
use MalScraper\Model\MainModel;
7
8
/**
9
 * StudioProducerModel class.
10
 */
11
class ProducerModel extends MainModel
12
{
13
    /**
14
     * Either anime or manga.
15
     *
16
     * @var string
17
     */
18
    private $_type;
19
20
    /**
21
     * Id of the producer.
22
     *
23
     * @var string|int
24
     */
25
	private $_id;
26
27
    /**
28
     * Page number.
29
     *
30
     * @var string|int
31
     */
32
    private $_page;
33
34
    /**
35
     * Default constructor.
36
     *
37
     * @param string|int $id
38
     * @param string $parserArea
39
     *
40
     * @return void
41
     */
42
	public function __construct($type, $id, $page = 1, $parserArea = '#content .js-categories-seasonal')
43
    {
44
        $this->_type = $type;
45
        $this->_id = $id;
46
    	$this->_page = $page;
47
        if ($type == 'anime') {
48
            $this->_url = $this->_myAnimeListUrl.'/anime/producer/'.$id.'/?page='.$page;
49
        } else {
50
            $this->_url = $this->_myAnimeListUrl.'/manga/magazine/'.$id.'/?page='.$page;
51
        }
52
        $this->_parserArea = $parserArea;
53
54
        parent::errorCheck($this);
55
    }
56
57
    /**
58
     * Default call.
59
     *
60
     * @param string $method
61
     * @param array  $arguments
62
     *
63
     * @return array|string|int
64
     */
65
    public function __call($method, $arguments)
66
    {
67
        if ($this->_error)
68
            return $this->_error;
69
        return call_user_func_array([$this, $method], $arguments);
70
    }
71
72
    /**
73
     * Get anime image.
74
     *
75
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
76
     *
77
     * @return string
78
     */
79
    private function getAnimeImage($each_anime)
80
    {
81
        $image = $each_anime->find('div[class=image]', 0)->find('img', 0)->getAttribute('data-src');
82
        return  Helper::imageUrlCleaner($image);
83
    }
84
85
    /**
86
     * Get anime id.
87
     *
88
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
89
     *
90
     * @return string
91
     */
92
    private function getAnimeId($name_area)
93
    {
94
        $anime_id = $name_area->find('p a', 0)->href;
95
        $anime_id = explode('/', $anime_id);
96
        return $anime_id[4];
97
    }
98
99
    /**
100
     * Get anime title.
101
     *
102
     * @param \simplehtmldom_1_5\simple_html_dom $name_area
103
     *
104
     * @return string
105
     */
106
    private function getAnimeTitle($name_area)
107
    {
108
        return $name_area->find('p a', 0)->plaintext;
109
    }
110
111
    /**
112
     * Get producer name.
113
     *
114
     * @param \simplehtmldom_1_5\simple_html_dom $producer_area
115
     *
116
     * @return array
117
     */
118
    private function getAnimeProducer($producer_area)
119
    {
120
        $producer = [];
121
        $producer_area = $producer_area->find('span[class=producer]', 0);
122
        foreach ($producer_area->find('a') as $each_producer) {
123
            $temp_prod = [];
124
125
            $temp_prod['id'] = $this->getAnimeProducerId($each_producer);
126
            $temp_prod['name'] = $this->getAnimeProducerName($each_producer);
127
128
            $producer[] = $temp_prod;
129
        }
130
        return $producer;
131
    }
132
133
    /**
134
     * Get producer id.
135
     *
136
     * @param \simplehtmldom_1_5\simple_html_dom $each_producer
137
     *
138
     * @return string
139
     */
140
    private function getAnimeProducerId($each_producer)
141
    {
142
        $prod_id = $each_producer->href;
143
        $prod_id = explode('/', $prod_id);
144
        if ($this->_type == 'anime')
145
            return $prod_id[3];
146
        return $prod_id[4];
147
    }
148
149
    /**
150
     * Get producer name.
151
     *
152
     * @param \simplehtmldom_1_5\simple_html_dom $each_producer
153
     *
154
     * @return string
155
     */
156
    private function getAnimeProducerName($each_producer)
157
    {
158
        return $each_producer->plaintext;
159
    }
160
161
    /**
162
     * Get anime episode.
163
     *
164
     * @param \simplehtmldom_1_5\simple_html_dom $producer_area
165
     *
166
     * @return string
167
     */
168
    private function getAnimeEpisode($producer_area)
169
    {
170
        $episode = $producer_area->find('div[class=eps]', 0)->plaintext;
171
        return trim(str_replace(['eps', 'ep', 'vols', 'vol'], '', $episode));
172
    }
173
174
    /**
175
     * Get anime source.
176
     *
177
     * @param \simplehtmldom_1_5\simple_html_dom $producer_area
178
     *
179
     * @return string
180
     */
181
    private function getAnimeSource($producer_area)
182
    {
183
        $source = $producer_area->find('span[class=source]', 0)->plaintext;
184
        return trim($source);
185
    }
186
187
    /**
188
     * Get anime genre.
189
     *
190
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
191
     *
192
     * @return array
193
     */
194
    private function getAnimeGenre($each_anime)
195
    {
196
        $genre = [];
197
        $genre_area = $each_anime->find('div[class="genres js-genre"]', 0);
198
        foreach ($genre_area->find('a') as $each_genre) {
199
            $genre[] = $each_genre->plaintext;
200
        }
201
        return $genre;
202
    }
203
204
    /**
205
     * Get anime synopsis.
206
     *
207
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
208
     *
209
     * @return string
210
     */
211
    private function getAnimeSynopsis($each_anime)
212
    {
213
        $synopsis = $each_anime->find('div[class="synopsis js-synopsis"]', 0)->plaintext;
214
        return trim(preg_replace("/([\s])+/", ' ', $synopsis));
215
    }
216
217
    /**
218
     * Get anime licensor.
219
     *
220
     * @param \simplehtmldom_1_5\simple_html_dom $each_anime
221
     *
222
     * @return array
223
     */
224
    private function getAnimeLicensor($each_anime)
225
    {
226
        if ($this->_type == 'anime') {
227
            $licensor = $each_anime->find('div[class="synopsis js-synopsis"] .licensors', 0)->getAttribute('data-licensors');
228
            $licensor = explode(',', $licensor);
229
            return array_filter($licensor);
230
        } else {
231
            $serialization = $each_anime->find('div[class="synopsis js-synopsis"] .serialization a', 0);
232
            return $serialization ? $serialization->plaintext : '';
0 ignored issues
show
Bug Best Practice introduced by
The expression return $serialization ? ...ization->plaintext : '' also could return the type string which is incompatible with the documented return type array.
Loading history...
233
        }
234
    }
235
236
    /**
237
     * Get anime type.
238
     *
239
     * @param \simplehtmldom_1_5\simple_html_dom $info_area
240
     *
241
     * @return string
242
     */
243
    private function getAnimeType($info_area)
244
    {
245
        $type = $info_area->find('.info', 0)->plaintext;
246
        $type = explode('-', $type);
247
        return trim($type[0]);
248
    }
249
250
    /**
251
     * Get anime start.
252
     *
253
     * @param \simplehtmldom_1_5\simple_html_dom $info_area
254
     *
255
     * @return string
256
     */
257
    private function getAnimeStart($info_area)
258
    {
259
        $airing_start = $info_area->find('.info .remain-time', 0)->plaintext;
260
        return trim($airing_start);
261
    }
262
263
    /**
264
     * Get anime member.
265
     *
266
     * @param \simplehtmldom_1_5\simple_html_dom $info_area
267
     *
268
     * @return string
269
     */
270
    private function getAnimeScore($info_area)
271
    {
272
        $score = $info_area->find('.scormem .score', 0)->plaintext;
273
        return trim($score);
274
    }
275
276
    /**
277
     * Get anime score.
278
     *
279
     * @param \simplehtmldom_1_5\simple_html_dom $info_area
280
     *
281
     * @return string
282
     */
283
    private function getAnimeMember($info_area)
284
    {
285
        $member = $info_area->find('.scormem span[class^=member]', 0)->plaintext;
286
        return trim(str_replace(',', '', $member));
287
    }
288
289
    /**
290
     * Get all anime produced by the studio/producer.
291
     *
292
     * @return array
293
     */
294
    private function getAllInfo()
295
    {
296
        $data = [];
297
        $anime_table = $this->_parser->find('div[class="seasonal-anime js-seasonal-anime"]');
298
        foreach ($anime_table as $each_anime) {
299
            $result = [];
300
301
            $name_area = $each_anime->find('div[class=title]', 0);
302
            $producer_area = $each_anime->find('div[class=prodsrc]', 0);
303
            $info_area = $each_anime->find('.information', 0);
304
305
            $result['image'] = $this->getAnimeImage($each_anime);
306
            $result['id'] = $this->getAnimeId($name_area);
307
            $result['title'] = $this->getAnimeTitle($name_area);
308
            $result['genre'] = $this->getAnimeGenre($each_anime);
309
            $result['synopsis'] = $this->getAnimeSynopsis($each_anime);
310
            $result['source'] = $this->getAnimeSource($producer_area);
311
312
            if ($this->_type == 'anime') {
313
                $result['producer'] = $this->getAnimeProducer($producer_area);
314
                $result['episode'] = $this->getAnimeEpisode($producer_area);
315
                $result['licensor'] = $this->getAnimeLicensor($each_anime);
316
                $result['type'] = $this->getAnimeType($info_area);
317
            } else {
318
                $result['author'] = $this->getAnimeProducer($producer_area);
319
                $result['volume'] = $this->getAnimeEpisode($producer_area);
320
                $result['serialization'] = $this->getAnimeLicensor($each_anime);
321
            }
322
323
            $result['airing_start'] = $this->getAnimeStart($info_area);
324
            $result['member'] = $this->getAnimeMember($info_area);
325
            $result['score'] = $this->getAnimeScore($info_area);
326
327
            $data[] = $result;
328
        }
329
        return $data;
330
    }
331
}