Passed
Push — develop ( c893b5...77095f )
by axel
03:30
created

CharacterModel   A

Complexity

Total Complexity 27

Size/Duplication

Total Lines 281
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 93
dl 0
loc 281
rs 10
c 0
b 0
f 0
wmc 27

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getNickname() 0 7 2
A getMedia() 0 23 4
A getVaId() 0 6 1
A getName() 0 13 3
A getAbout() 0 18 2
A getVa() 0 24 4
A __call() 0 7 2
A getVaRole() 0 3 1
A getAllInfo() 0 16 1
A getFavorite() 0 8 1
A getId() 0 3 1
A getVaName() 0 3 1
A getVaImage() 0 5 1
A getImage() 0 6 2
1
<?php
2
3
namespace MalScraper\Model\General;
4
5
use MalScraper\Helper\Helper;
6
use MalScraper\Model\MainModel;
7
8
/**
9
 * CharacterModel class.
10
 */
11
class CharacterModel extends MainModel
12
{
13
    /**
14
     * Id of the character.
15
     *
16
     * @var string|int
17
     */
18
    private $_id;
19
20
    /**
21
     * Default constructor.
22
     *
23
     * @param string|int $id
24
     * @param string     $parserArea
25
     *
26
     * @return void
27
     */
28
    public function __construct($id, $parserArea = '#contentWrapper')
29
    {
30
        $this->_id = $id;
31
        $this->_url = $this->_myAnimeListUrl.'/character/'.$id;
32
        $this->_parserArea = $parserArea;
33
34
        parent::errorCheck($this);
35
    }
36
37
    /**
38
     * Default call.
39
     *
40
     * @param string $method
41
     * @param array  $arguments
42
     *
43
     * @return array|string|int
44
     */
45
    public function __call($method, $arguments)
46
    {
47
        if ($this->_error) {
48
            return $this->_error;
49
        }
50
51
        return call_user_func_array([$this, $method], $arguments);
52
    }
53
54
    /**
55
     * Get character id.
56
     *
57
     * @return string
58
     */
59
    private function getId()
60
    {
61
        return $this->_id;
62
    }
63
64
    /**
65
     * Get character image.
66
     *
67
     * @return string|bool
68
     */
69
    private function getImage()
70
    {
71
        $image = $this->_parser->find('#content table tr', 0);
72
        $image = $image->find('td', 0)->find('div', 0)->find('a', 0)->find('img', 0);
73
74
        return $image ? $image->src : '';
75
    }
76
77
    /**
78
     * Get character image.
79
     *
80
     * @return string
81
     */
82
    private function getNickname()
83
    {
84
        $nickname = $this->_parser->find('h1', 0)->plaintext;
85
        $nickname = trim(preg_replace('/\s+/', ' ', $nickname));
86
        preg_match('/\"([^"])*/', $nickname, $nickname);
0 ignored issues
show
Bug introduced by
$nickname of type string is incompatible with the type array|null expected by parameter $matches of preg_match(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

86
        preg_match('/\"([^"])*/', $nickname, /** @scrutinizer ignore-type */ $nickname);
Loading history...
87
        if ($nickname) {
88
            return substr($nickname[0], 1, strlen($nickname[0]) - 2);
89
        }
90
    }
91
92
    /**
93
     * Get character name.
94
     *
95
     * @param bool $isKanji
96
     *
97
     * @return string
98
     */
99
    private function getName($isKanji = false)
100
    {
101
        $html = $this->_parser->find('#content table tr', 0);
102
        $html = $html->find('td', 0)->next_sibling()->find('div[class=normal_header]', 0);
103
104
        $name_kanji = $html->find('small', 0);
105
        $name_kanji = $name_kanji ? $name_kanji->plaintext : '';
106
107
        if ($isKanji) {
108
            return preg_replace('/(\(|\))/', '', $name_kanji);
109
        }
110
111
        return trim(str_replace($name_kanji, '', $html->plaintext));
112
    }
113
114
    /**
115
     * Get number of user who favorite the character.
116
     *
117
     * @return string
118
     */
119
    private function getFavorite()
120
    {
121
        $favorite = $this->_parser->find('#content table tr', 0)->find('td', 0)->plaintext;
122
        preg_match('/(Member Favorites: ).+/', $favorite, $parsed_favorite);
123
        $favorite = trim($parsed_favorite[0]);
124
        $parsed_favorite = explode(': ', $favorite);
125
126
        return str_replace(',', '', $parsed_favorite[1]);
127
    }
128
129
    /**
130
     * Get character about.
131
     *
132
     * @return string
133
     */
134
    private function getAbout()
135
    {
136
        $html = $this->_parser->find('#content table tr', 0)->find('td', 0)->next_sibling();
137
138
        preg_match('/(<div class="normal_header" style="height: 15px;">).*(<div class="normal_header">)/', $html, $about);
139
140
        $html = $html->find('div[class=normal_header]', 0);
141
        $about = str_replace($html->outertext, '', $about[0]);
142
        $about = str_replace('<div class="normal_header">', '', $about);
143
144
        preg_match('/(No biography written)/', $about, $temp_about);
145
        if (!$temp_about) {
146
            $about = str_replace(['<br>', '<br />', '  '], ["\n", "\n", ' '], $about);
147
            $about = strip_tags($about);
148
149
            return preg_replace('/\n[^\S\n]*/', "\n", $about);
150
        } else {
151
            return;
152
        }
153
    }
154
155
    /**
156
     * Get character role in anime/manga.
157
     *
158
     * @param string $type Either anime or manga
159
     *
160
     * @return array
161
     */
162
    private function getMedia($type = 'anime')
163
    {
164
        $mediaography = [];
165
        $mediaography_index = 0;
166
167
        $html = $this->_parser->find('#content table tr', 0)->find('td', 0);
168
        $mediaography_area = $type == 'anime' ? $html->find('table', 0) : $html->find('table', 1);
169
        $mediaography_area = $mediaography_area->find('tr');
0 ignored issues
show
Bug introduced by
The method find() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

169
        /** @scrutinizer ignore-call */ 
170
        $mediaography_area = $mediaography_area->find('tr');

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
170
        if ($mediaography_area) {
171
            foreach ($mediaography_area as $each_media) {
172
                $media_image = $each_media->find('td', 0);
173
                $media_area = $each_media->find('td', 1);
174
175
                $mediaography[$mediaography_index]['image'] = $this->getVaImage($media_image);
176
                $mediaography[$mediaography_index]['id'] = $this->getVaId($media_area);
177
                $mediaography[$mediaography_index]['title'] = $this->getVaName($media_area);
178
                $mediaography[$mediaography_index]['role'] = $this->getVaRole($media_area);
179
180
                $mediaography_index++;
181
            }
182
        }
183
184
        return $mediaography;
185
    }
186
187
    /**
188
     * Get character voice actor list.
189
     *
190
     * @return array
191
     */
192
    private function getVa()
193
    {
194
        $va = [];
195
        $va_index = 0;
196
        $html = $this->_parser->find('#content table tr', 0)->find('td', 0)->next_sibling();
197
        $va_area = $html->find('div[class=normal_header]', 1)->next_sibling();
198
        if ($va_area->tag == 'table') {
199
            while (true) {
200
                $va_name_area = $va_area->find('td', 1);
201
                $va[$va_index]['id'] = $this->getVaId($va_name_area);
202
                $va[$va_index]['name'] = $this->getVaName($va_name_area);
203
                $va[$va_index]['role'] = $this->getVaRole($va_name_area);
204
                $va[$va_index]['image'] = $this->getVaImage($va_area);
205
206
                $va_area = $va_area->next_sibling();
207
                if ($va_area->tag != 'table') {
208
                    break;
209
                } else {
210
                    $va_index++;
211
                }
212
            }
213
        }
214
215
        return $va;
216
    }
217
218
    /**
219
     * Get Va Id.
220
     *
221
     * @param \simplehtmldom_1_5\simple_html_dom $va_name_area
222
     *
223
     * @return string
224
     */
225
    private function getVaId($va_name_area)
226
    {
227
        $va_id = $va_name_area->find('a', 0)->href;
228
        $parsed_va_id = explode('/', $va_id);
229
230
        return $parsed_va_id[4];
231
    }
232
233
    /**
234
     * Get Va Name.
235
     *
236
     * @param \simplehtmldom_1_5\simple_html_dom $va_name_area
237
     *
238
     * @return string
239
     */
240
    private function getVaName($va_name_area)
241
    {
242
        return $va_name_area->find('a', 0)->plaintext;
243
    }
244
245
    /**
246
     * Get Va role.
247
     *
248
     * @param \simplehtmldom_1_5\simple_html_dom $va_name_area
249
     *
250
     * @return string
251
     */
252
    private function getVaRole($va_name_area)
253
    {
254
        return $va_name_area->find('div small', 0)->plaintext;
255
    }
256
257
    /**
258
     * Get Va image.
259
     *
260
     * @param \simplehtmldom_1_5\simple_html_dom $va_area
261
     *
262
     * @return string
263
     */
264
    private function getVaImage($va_area)
265
    {
266
        $va_image = $va_area->find('img', 0)->src;
267
268
        return Helper::imageUrlCleaner($va_image);
269
    }
270
271
    /**
272
     * Get character all information.
273
     *
274
     * @return array
275
     */
276
    private function getAllInfo()
277
    {
278
        $data = [
279
            'id'           => $this->getId(),
280
            'image'        => $this->getImage(),
281
            'nickname'     => $this->getNickname(),
282
            'name'         => $this->getName(),
283
            'name_kanji'   => $this->getName(true),
284
            'favorite'     => $this->getFavorite(),
285
            'about'        => $this->getAbout(),
286
            'animeography' => $this->getMedia('anime'),
287
            'mangaography' => $this->getMedia('manga'),
288
            'va'           => $this->getVa(),
289
        ];
290
291
        return $data;
292
    }
293
}
294