ProducerModel::getAllInfo()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 37
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

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