timw4mail /
HummingBirdAnimeClient
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php declare(strict_types=1); |
||
| 2 | /** |
||
| 3 | * Anime List Client |
||
| 4 | * |
||
| 5 | * An API client for Kitsu and MyAnimeList to manage anime and manga watch lists |
||
| 6 | * |
||
| 7 | * PHP version 7 |
||
| 8 | * |
||
| 9 | * @package AnimeListClient |
||
| 10 | * @author Timothy J. Warren <[email protected]> |
||
| 11 | * @copyright 2015 - 2017 Timothy J. Warren |
||
| 12 | * @license http://www.opensource.org/licenses/mit-license.html MIT License |
||
| 13 | * @version 4.0 |
||
| 14 | * @link https://github.com/timw4mail/HummingBirdAnimeClient |
||
| 15 | */ |
||
| 16 | |||
| 17 | namespace Aviat\AnimeClient\Model; |
||
| 18 | |||
| 19 | use Aviat\AnimeClient\API\Kitsu; |
||
| 20 | use Aviat\Ion\Di\ContainerInterface; |
||
| 21 | use Aviat\Ion\Json; |
||
| 22 | use PDO; |
||
| 23 | |||
| 24 | /** |
||
| 25 | * Model for getting anime collection data |
||
| 26 | */ |
||
| 27 | class AnimeCollection extends Collection { |
||
| 28 | |||
| 29 | /** |
||
| 30 | * Get collection from the database, and organize by media type |
||
| 31 | * |
||
| 32 | * @return array |
||
| 33 | */ |
||
| 34 | public function get_collection() |
||
| 35 | { |
||
| 36 | $raw_collection = $this->_get_collection(); |
||
| 37 | |||
| 38 | $collection = []; |
||
| 39 | |||
| 40 | foreach ($raw_collection as $row) |
||
| 41 | { |
||
| 42 | if (array_key_exists($row['media'], $collection)) |
||
| 43 | { |
||
| 44 | $collection[$row['media']][] = $row; |
||
| 45 | } |
||
| 46 | else |
||
| 47 | { |
||
| 48 | $collection[$row['media']] = [$row]; |
||
| 49 | } |
||
| 50 | } |
||
| 51 | |||
| 52 | return $collection; |
||
| 53 | } |
||
| 54 | |||
| 55 | /** |
||
| 56 | * Get list of media types |
||
| 57 | * |
||
| 58 | * @return array |
||
| 59 | */ |
||
| 60 | public function get_media_type_list() |
||
| 61 | { |
||
| 62 | $output = []; |
||
| 63 | |||
| 64 | $query = $this->db->select('id, type') |
||
| 65 | ->from('media') |
||
| 66 | ->get(); |
||
| 67 | |||
| 68 | foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $row) |
||
| 69 | { |
||
| 70 | $output[$row['id']] = $row['type']; |
||
| 71 | } |
||
| 72 | |||
| 73 | return $output; |
||
| 74 | } |
||
| 75 | |||
| 76 | /** |
||
| 77 | * Get item from collection for editing |
||
| 78 | * |
||
| 79 | * @param int $id |
||
| 80 | * @return array |
||
| 81 | */ |
||
| 82 | public function get_collection_entry($id) |
||
| 83 | { |
||
| 84 | $query = $this->db->from('anime_set') |
||
| 85 | ->where('hummingbird_id', (int)$id) |
||
| 86 | ->get(); |
||
| 87 | |||
| 88 | return $query->fetch(PDO::FETCH_ASSOC); |
||
| 89 | } |
||
| 90 | |||
| 91 | /** |
||
| 92 | * Get full collection from the database |
||
| 93 | * |
||
| 94 | * @return array |
||
| 95 | */ |
||
| 96 | private function _get_collection() |
||
| 97 | { |
||
| 98 | if ( ! $this->valid_database) |
||
| 99 | { |
||
| 100 | return []; |
||
| 101 | } |
||
| 102 | |||
| 103 | $query = $this->db->select('hummingbird_id, slug, title, alternate_title, show_type, |
||
| 104 | age_rating, episode_count, episode_length, cover_image, notes, media.type as media') |
||
| 105 | ->from('anime_set a') |
||
| 106 | ->join('media', 'media.id=a.media_id', 'inner') |
||
| 107 | ->order_by('media') |
||
| 108 | ->order_by('title') |
||
| 109 | ->get(); |
||
| 110 | |||
| 111 | return $query->fetchAll(PDO::FETCH_ASSOC); |
||
| 112 | } |
||
| 113 | |||
| 114 | /** |
||
| 115 | * Add an item to the anime collection |
||
| 116 | * |
||
| 117 | * @param array $data |
||
| 118 | * @return void |
||
| 119 | */ |
||
| 120 | public function add($data) |
||
| 121 | { |
||
| 122 | $anime = (object)$this->anime_model->getAnimeById($data['id']); |
||
| 123 | $util = $this->container->get('util'); |
||
|
0 ignored issues
–
show
|
|||
| 124 | |||
| 125 | $this->db->set([ |
||
| 126 | 'hummingbird_id' => $data['id'], |
||
| 127 | 'slug' => $anime->slug, |
||
| 128 | 'title' => array_shift($anime->titles), |
||
| 129 | 'alternate_title' => implode('<br />', $anime->titles), |
||
| 130 | 'show_type' => $anime->show_type, |
||
| 131 | 'age_rating' => $anime->age_rating, |
||
| 132 | 'cover_image' => $anime->cover_image, |
||
| 133 | 'episode_count' => $anime->episode_count, |
||
| 134 | 'episode_length' => $anime->episode_length, |
||
| 135 | 'media_id' => $data['media_id'], |
||
| 136 | 'notes' => $data['notes'] |
||
| 137 | ])->insert('anime_set'); |
||
| 138 | |||
| 139 | $this->update_genre($data['id']); |
||
| 140 | } |
||
| 141 | |||
| 142 | /** |
||
| 143 | * Update a collection item |
||
| 144 | * |
||
| 145 | * @param array $data |
||
| 146 | * @return void |
||
| 147 | */ |
||
| 148 | public function update($data) |
||
| 149 | { |
||
| 150 | // If there's no id to update, don't update |
||
| 151 | if ( ! array_key_exists('hummingbird_id', $data)) |
||
| 152 | { |
||
| 153 | return; |
||
| 154 | } |
||
| 155 | |||
| 156 | $id = $data['hummingbird_id']; |
||
| 157 | unset($data['hummingbird_id']); |
||
| 158 | |||
| 159 | $this->db->set($data) |
||
| 160 | ->where('hummingbird_id', $id) |
||
| 161 | ->update('anime_set'); |
||
| 162 | } |
||
| 163 | |||
| 164 | /** |
||
| 165 | * Remove a collection item |
||
| 166 | * |
||
| 167 | * @param array $data |
||
| 168 | * @return void |
||
| 169 | */ |
||
| 170 | public function delete($data) |
||
| 171 | { |
||
| 172 | // If there's no id to update, don't delete |
||
| 173 | if ( ! array_key_exists('hummingbird_id', $data)) |
||
| 174 | { |
||
| 175 | return; |
||
| 176 | } |
||
| 177 | |||
| 178 | $this->db->where('hummingbird_id', $data['hummingbird_id']) |
||
| 179 | ->delete('genre_anime_set_link'); |
||
| 180 | |||
| 181 | $this->db->where('hummingbird_id', $data['hummingbird_id']) |
||
| 182 | ->delete('anime_set'); |
||
| 183 | } |
||
| 184 | |||
| 185 | /** |
||
| 186 | * Get the details of a collection item |
||
| 187 | * |
||
| 188 | * @param int $hummingbird_id |
||
| 189 | * @return array |
||
| 190 | */ |
||
| 191 | public function get($hummingbird_id) |
||
| 192 | { |
||
| 193 | $query = $this->db->from('anime_set') |
||
| 194 | ->where('hummingbird_id', $hummingbird_id) |
||
| 195 | ->get(); |
||
| 196 | |||
| 197 | return $query->fetch(PDO::FETCH_ASSOC); |
||
| 198 | } |
||
| 199 | |||
| 200 | /** |
||
| 201 | * Update genre information for selected anime |
||
| 202 | * |
||
| 203 | * @param int $anime_id The current anime |
||
| 204 | * @return void |
||
| 205 | */ |
||
| 206 | private function update_genre($anime_id) |
||
| 207 | { |
||
| 208 | $genre_info = $this->get_genre_data(); |
||
| 209 | extract($genre_info); |
||
| 210 | |||
| 211 | // Get api information |
||
| 212 | $anime = $this->anime_model->getAnimeById($anime_id); |
||
| 213 | |||
| 214 | foreach ($anime['genres'] as $genre) |
||
| 215 | { |
||
| 216 | // Add genres that don't currently exist |
||
| 217 | if ( ! in_array($genre, $genres)) |
||
| 218 | { |
||
| 219 | $this->db->set('genre', $genre) |
||
| 220 | ->insert('genres'); |
||
| 221 | |||
| 222 | $genres[] = $genre; |
||
| 223 | } |
||
| 224 | |||
| 225 | // Update link table |
||
| 226 | // Get id of genre to put in link table |
||
| 227 | $flipped_genres = array_flip($genres); |
||
| 228 | |||
| 229 | $insert_array = [ |
||
| 230 | 'hummingbird_id' => $anime_id, |
||
| 231 | 'genre_id' => $flipped_genres[$genre] |
||
| 232 | ]; |
||
| 233 | |||
| 234 | if (array_key_exists($anime_id, $links)) |
||
| 235 | { |
||
| 236 | if ( ! in_array($flipped_genres[$genre], $links[$anime_id])) |
||
| 237 | { |
||
| 238 | $this->db->set($insert_array)->insert('genre_anime_set_link'); |
||
| 239 | } |
||
| 240 | } |
||
| 241 | else |
||
| 242 | { |
||
| 243 | $this->db->set($insert_array)->insert('genre_anime_set_link'); |
||
| 244 | } |
||
| 245 | } |
||
| 246 | } |
||
| 247 | |||
| 248 | /** |
||
| 249 | * Get list of existing genres |
||
| 250 | * |
||
| 251 | * @return array |
||
| 252 | */ |
||
| 253 | private function get_genre_data() |
||
| 254 | { |
||
| 255 | $genres = []; |
||
| 256 | $links = []; |
||
| 257 | |||
| 258 | // Get existing genres |
||
| 259 | $query = $this->db->select('id, genre') |
||
| 260 | ->from('genres') |
||
| 261 | ->get(); |
||
| 262 | foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $genre) |
||
| 263 | { |
||
| 264 | $genres[$genre['id']] = $genre['genre']; |
||
| 265 | } |
||
| 266 | |||
| 267 | // Get existing link table entries |
||
| 268 | $query = $this->db->select('hummingbird_id, genre_id') |
||
| 269 | ->from('genre_anime_set_link') |
||
| 270 | ->get(); |
||
| 271 | foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $link) |
||
| 272 | { |
||
| 273 | if (array_key_exists($link['hummingbird_id'], $links)) |
||
| 274 | { |
||
| 275 | $links[$link['hummingbird_id']][] = $link['genre_id']; |
||
| 276 | } |
||
| 277 | else |
||
| 278 | { |
||
| 279 | $links[$link['hummingbird_id']] = [$link['genre_id']]; |
||
| 280 | } |
||
| 281 | } |
||
| 282 | |||
| 283 | return [ |
||
| 284 | 'genres' => $genres, |
||
| 285 | 'links' => $links |
||
| 286 | ]; |
||
| 287 | } |
||
| 288 | |||
| 289 | /** |
||
| 290 | * Update genre information for the entire collection |
||
| 291 | * |
||
| 292 | * @return void |
||
| 293 | */ |
||
| 294 | private function update_genres() |
||
|
0 ignored issues
–
show
|
|||
| 295 | { |
||
| 296 | // Get the anime collection |
||
| 297 | $collection = $this->_get_collection(); |
||
| 298 | foreach ($collection as $anime) |
||
| 299 | { |
||
| 300 | // Get api information |
||
| 301 | $this->update_genre($anime['hummingbird_id']); |
||
| 302 | } |
||
| 303 | } |
||
| 304 | } |
||
| 305 | // End of AnimeCollectionModel.php |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVarassignment in line 1 and the$higherassignment in line 2 are dead. The first because$myVaris never used and the second because$higheris always overwritten for every possible time line.