diff --git a/app/controllers/AnimeController.php b/app/controllers/AnimeController.php index a0c26f5f..1cd15d84 100644 --- a/app/controllers/AnimeController.php +++ b/app/controllers/AnimeController.php @@ -37,18 +37,12 @@ class AnimeController extends BaseController { public function collection() { - $this->collection_model->get_collection_seed(); + $data = $this->collection_model->get_collection(); - $this->outputHTML('anime_list', [ + $this->outputHTML('anime_collection', [ 'title' => "Tim's Anime Collection", - 'sections' => [] + 'sections' => $data ]); } - - public function login() - { - $data = $this->model->authenticate(); - //print_r($data); - } } // End of AnimeController.php \ No newline at end of file diff --git a/app/models/AnimeCollectionModel.php b/app/models/AnimeCollectionModel.php index c446db1e..fb8853e7 100644 --- a/app/models/AnimeCollectionModel.php +++ b/app/models/AnimeCollectionModel.php @@ -4,7 +4,7 @@ * Model for getting anime collection data */ class AnimeCollectionModel extends BaseModel { - + protected $base_url = ""; private $db; private $anime_model; private $db_config; @@ -16,13 +16,168 @@ class AnimeCollectionModel extends BaseModel { $this->anime_model = new AnimeModel(); - //parent::__construct(); + parent::__construct(); + + // Do an import if an import file exists + $this->json_import(); } + /** + * Get collection from the database, and organize by media type + * + * @return array + */ public function get_collection() { - // TODO: show collection from database + $raw_collection = $this->_get_collection(); + + $collection = []; + + foreach($raw_collection as $row) + { + if (array_key_exists($row['media'], $collection)) + { + $collection[$row['media']][] = $row; + } + else + { + $collection[$row['media']] = [$row]; + } + } + + return $collection; } + /** + * Get full collection from the database + * + * @return array + */ + private function _get_collection() + { + $query = $this->db->select('hummingbird_id, slug, title, alternate_title, show_type, age_rating, episode_count, episode_length, cover_image, notes, media.type as media') + ->from('anime_set a') + ->join('media', 'media.id=a.media_id', 'inner') + ->order_by('media') + ->order_by('title') + ->get(); + + return $query->fetchAll(PDO::FETCH_ASSOC); + } + + /** + * Import anime into collection from a json file + * + * @return void + */ + private function json_import() + { + if ( ! file_exists('import.json')) return; + + $anime = json_decode(file_get_contents("import.json")); + + foreach($anime as $item) + { + $this->db->set([ + 'hummingbird_id' => $item->id, + 'slug' => $item->slug, + 'title' => $item->title, + 'alternate_title' => $item->alternate_title, + 'show_type' => $item->show_type, + 'age_rating' => $item->age_rating, + 'cover_image' => $this->get_cached_image($item->cover_image, $item->slug, 'anime'), + 'episode_count' => $item->episode_count, + 'episode_length' => $item->episode_length + ])->insert('anime_set'); + } + + // Delete the import file + unlink('import.json'); + + // Update genre info + $this->update_genres(); + } + + /** + * Update genre information + * + * @return void + */ + private function update_genres() + { + $genres = []; + $flipped_genres = []; + + $links = []; + + // Get existing genres + $query = $this->db->select('id, genre') + ->from('genres') + ->get(); + foreach($query->fetchAll(PDO::FETCH_ASSOC) as $genre) + { + $genres[$genre['id']] = $genre['genre']; + } + + // Get existing link table entries + $query = $this->db->select('hummingbird_id, genre_id') + ->from('genre_anime_set_link') + ->get(); + foreach($query->fetchAll(PDO::FETCH_ASSOC) as $link) + { + if (array_key_exists($link['hummingbird_id'], $links)) + { + $links[$link['hummingbird_id']][] = $link['genre_id']; + } + else + { + $links[$link['hummingbird_id']] = [$link['genre_id']]; + } + } + + // Get the anime collection + $collection = $this->_get_collection(); + foreach($collection as $anime) + { + // Get api information + $api = $this->anime_model->get_anime($anime['hummingbird_id']); + + + foreach($api['genres'] as $genre) + { + // Add genres that don't currently exist + if ( ! in_array($genre['name'], $genres)) + { + $this->db->set('genre', $genre['name']) + ->insert('genres'); + + $genres[] = $genre['name']; + } + + + // Update link table + + // Get id of genre to put in link table + $flipped_genres = array_flip($genres); + + $insert_array = [ + 'hummingbird_id' => $anime['hummingbird_id'], + 'genre_id' => $flipped_genres[$genre['name']] + ]; + + if (array_key_exists($anime['hummingbird_id'], $links)) + { + if ( ! in_array($flipped_genres[$genre['name']], $links[$anime['hummingbird_id']])) + { + $this->db->set($insert_array)->insert('genre_anime_set_link'); + } + } + else + { + $this->db->set($insert_array)->insert('genre_anime_set_link'); + } + } + } + } } // End of AnimeCollectionModel.php \ No newline at end of file diff --git a/app/models/AnimeModel.php b/app/models/AnimeModel.php index 78958ae2..7eda6267 100644 --- a/app/models/AnimeModel.php +++ b/app/models/AnimeModel.php @@ -133,7 +133,7 @@ class AnimeModel extends BaseModel { { $output = $response->json(); $output_json = json_encode($output); - + if (file_get_contents($cache_file) !== $output_json) { // Cache the call in case of downtime @@ -149,6 +149,25 @@ class AnimeModel extends BaseModel { return $output; } + /** + * Get information about an anime from its id + * + * @param string $anime_id + * @return array + */ + public function get_anime($anime_id) + { + $config = [ + 'query' => [ + 'id' => $anime_id + ] + ]; + + $response = $this->client->get($this->_url("/anime/{$anime_id}"), $config); + + return $response->json(); + } + /** * Search for anime by name * diff --git a/app/views/anime_collection.php b/app/views/anime_collection.php index e69de29b..422e1b53 100644 --- a/app/views/anime_collection.php +++ b/app/views/anime_collection.php @@ -0,0 +1,31 @@ + +
+