Passed
Push — feature/super-model ( 13c8a0...a850c4 )
by axel
01:59
created

CharacterModel::getVaName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
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
 * 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
        return call_user_func_array([$this, $method], $arguments);
50
    }
51
52
    /**
53
     * Get character id.
54
     *
55
     * @return string
56
     */
57
    private function getId()
58
    {
59
        return $this->_id;
60
    }
61
62
    /**
63
     * Get character image.
64
     *
65
     * @return string
66
     */
67
    private function getImage()
68
    {
69
        $image = $this->_parser->find('#content table tr', 0);
70
        $image = $image->find('td', 0)->find('div', 0)->find('a', 0)->find('img', 0);
71
        return $image ? $image->src : '';
0 ignored issues
show
Bug Best Practice introduced by
The expression return $image ? $image->src : '' also could return the type boolean which is incompatible with the documented return type string.
Loading history...
72
    }
73
74
    /**
75
     * Get character image.
76
     *
77
     * @return string
78
     */
79
    private function getNickname()
80
    {
81
        $nickname = $this->_parser->find('h1', 0)->plaintext;
82
        $nickname = trim(preg_replace('/\s+/', ' ', $nickname));
83
        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

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

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