CharacterModel   A
last analyzed

Complexity

Total Complexity 27

Size/Duplication

Total Lines 283
Duplicated Lines 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 94
c 1
b 1
f 0
dl 0
loc 283
rs 10
wmc 27

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getId() 0 3 1
A getVaId() 0 6 1
A getVaRole() 0 3 1
A getVaName() 0 3 1
A getNickname() 0 10 2
A getMedia() 0 23 4
A getName() 0 13 3
A getAbout() 0 18 2
A getVa() 0 24 4
A __call() 0 7 2
A getAllInfo() 0 16 1
A getFavorite() 0 8 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, $nick);
87
        if ($nick) {
88
            return substr($nick[0], 1, strlen($nick[0]) - 2);
89
        }
90
91
        return '';
92
    }
93
94
    /**
95
     * Get character name.
96
     *
97
     * @param bool $isKanji
98
     *
99
     * @return string
100
     */
101
    private function getName($isKanji = false)
102
    {
103
        $html = $this->_parser->find('#content table tr', 0);
104
        $html = $html->find('td', 0)->next_sibling()->find('div[class=normal_header]', 0);
105
106
        $name_kanji = $html->find('small', 0);
107
        $name_kanji = $name_kanji ? $name_kanji->plaintext : '';
108
109
        if ($isKanji) {
110
            return preg_replace('/(\(|\))/', '', $name_kanji);
111
        }
112
113
        return trim(str_replace($name_kanji, '', $html->plaintext));
114
    }
115
116
    /**
117
     * Get number of user who favorite the character.
118
     *
119
     * @return string
120
     */
121
    private function getFavorite()
122
    {
123
        $favorite = $this->_parser->find('#content table tr', 0)->find('td', 0)->plaintext;
124
        preg_match('/(Member Favorites: ).+/', $favorite, $parsed_favorite);
125
        $favorite = trim($parsed_favorite[0]);
126
        $parsed_favorite = explode(': ', $favorite);
127
128
        return str_replace(',', '', $parsed_favorite[1]);
129
    }
130
131
    /**
132
     * Get character about.
133
     *
134
     * @return string
135
     */
136
    private function getAbout()
137
    {
138
        $html = $this->_parser->find('#content table tr', 0)->find('td', 0)->next_sibling();
139
140
        preg_match('/(<div class="normal_header" style="height: 15px;">).*(<div class="normal_header">)/', $html, $about);
141
142
        $html = $html->find('div[class=normal_header]', 0);
143
        $about = str_replace($html->outertext, '', $about[0]);
144
        $about = str_replace('<div class="normal_header">', '', $about);
145
146
        preg_match('/(No biography written)/', $about, $temp_about);
147
        if (!$temp_about) {
148
            $about = str_replace(['<br>', '<br />', '  '], ["\n", "\n", ' '], $about);
149
            $about = strip_tags($about);
150
151
            return preg_replace('/\n[^\S\n]*/', "\n", $about);
152
        } else {
153
            return;
154
        }
155
    }
156
157
    /**
158
     * Get character role in anime/manga.
159
     *
160
     * @param string $type Either anime or manga
161
     *
162
     * @return array
163
     */
164
    private function getMedia($type = 'anime')
165
    {
166
        $mediaography = [];
167
        $mediaography_index = 0;
168
169
        $html = $this->_parser->find('#content table tr', 0)->find('td', 0);
170
        $mediaography_area = $type == 'anime' ? $html->find('table', 0) : $html->find('table', 1);
171
        if ($mediaography_area) {
172
            $mediaography_area = $mediaography_area->find('tr');
173
            foreach ($mediaography_area as $each_media) {
174
                $media_image = $each_media->find('td', 0);
175
                $media_area = $each_media->find('td', 1);
176
177
                $mediaography[$mediaography_index]['image'] = $this->getVaImage($media_image);
178
                $mediaography[$mediaography_index]['id'] = $this->getVaId($media_area);
179
                $mediaography[$mediaography_index]['title'] = $this->getVaName($media_area);
180
                $mediaography[$mediaography_index]['role'] = $this->getVaRole($media_area);
181
182
                $mediaography_index++;
183
            }
184
        }
185
186
        return $mediaography;
187
    }
188
189
    /**
190
     * Get character voice actor list.
191
     *
192
     * @return array
193
     */
194
    private function getVa()
195
    {
196
        $va = [];
197
        $va_index = 0;
198
        $html = $this->_parser->find('#content table tr', 0)->find('td', 0)->next_sibling();
199
        $va_area = $html->find('div[class=normal_header]', 1)->next_sibling();
200
        if ($va_area->tag == 'table') {
201
            while (true) {
202
                $va_name_area = $va_area->find('td', 1);
203
                $va[$va_index]['id'] = $this->getVaId($va_name_area);
204
                $va[$va_index]['name'] = $this->getVaName($va_name_area);
205
                $va[$va_index]['role'] = $this->getVaRole($va_name_area);
206
                $va[$va_index]['image'] = $this->getVaImage($va_area);
207
208
                $va_area = $va_area->next_sibling();
209
                if ($va_area->tag != 'table') {
210
                    break;
211
                } else {
212
                    $va_index++;
213
                }
214
            }
215
        }
216
217
        return $va;
218
    }
219
220
    /**
221
     * Get Va Id.
222
     *
223
     * @param \simplehtmldom_1_5\simple_html_dom $va_name_area
224
     *
225
     * @return string
226
     */
227
    private function getVaId($va_name_area)
228
    {
229
        $va_id = $va_name_area->find('a', 0)->href;
230
        $parsed_va_id = explode('/', $va_id);
231
232
        return $parsed_va_id[4];
233
    }
234
235
    /**
236
     * Get Va Name.
237
     *
238
     * @param \simplehtmldom_1_5\simple_html_dom $va_name_area
239
     *
240
     * @return string
241
     */
242
    private function getVaName($va_name_area)
243
    {
244
        return $va_name_area->find('a', 0)->plaintext;
245
    }
246
247
    /**
248
     * Get Va role.
249
     *
250
     * @param \simplehtmldom_1_5\simple_html_dom $va_name_area
251
     *
252
     * @return string
253
     */
254
    private function getVaRole($va_name_area)
255
    {
256
        return $va_name_area->find('div small', 0)->plaintext;
257
    }
258
259
    /**
260
     * Get Va image.
261
     *
262
     * @param \simplehtmldom_1_5\simple_html_dom $va_area
263
     *
264
     * @return string
265
     */
266
    private function getVaImage($va_area)
267
    {
268
        $va_image = $va_area->find('img', 0)->src;
269
270
        return Helper::imageUrlCleaner($va_image);
271
    }
272
273
    /**
274
     * Get character all information.
275
     *
276
     * @return array
277
     */
278
    private function getAllInfo()
279
    {
280
        $data = [
281
            'id'           => $this->getId(),
282
            'image'        => $this->getImage(),
283
            'nickname'     => $this->getNickname(),
284
            'name'         => $this->getName(),
285
            'name_kanji'   => $this->getName(true),
286
            'favorite'     => $this->getFavorite(),
287
            'about'        => $this->getAbout(),
288
            'animeography' => $this->getMedia('anime'),
289
            'mangaography' => $this->getMedia('manga'),
290
            'va'           => $this->getVa(),
291
        ];
292
293
        return $data;
294
    }
295
}
296