From 036396a3827db53b215ba68fe26838e4d41bdbfc Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 11 Jan 2017 10:30:53 -0500 Subject: [PATCH 01/14] Update header comments --- app/bootstrap.php | 6 ++---- build/header_comment.txt | 5 ++--- src/API/AbstractListItem.php | 6 ++---- src/API/GuzzleTrait.php | 6 ++---- src/API/JsonAPI.php | 6 ++---- src/API/Kitsu.php | 6 ++---- src/API/Kitsu/Auth.php | 6 ++---- src/API/Kitsu/Enum/AnimeAiringStatus.php | 6 ++---- src/API/Kitsu/Enum/AnimeWatchingStatus.php | 6 ++---- src/API/Kitsu/Enum/MangaReadingStatus.php | 6 ++---- src/API/Kitsu/KitsuModel.php | 6 ++---- src/API/Kitsu/KitsuTrait.php | 6 ++---- src/API/Kitsu/ListItem.php | 6 ++---- src/API/Kitsu/Transformer/AnimeListTransformer.php | 6 ++---- src/API/Kitsu/Transformer/AnimeTransformer.php | 6 ++---- src/API/Kitsu/Transformer/MangaListTransformer.php | 6 ++---- src/API/Kitsu/Transformer/MangaTransformer.php | 6 ++---- src/API/ListItemInterface.php | 6 ++---- src/API/MAL/Auth.php | 6 ++---- src/API/MAL/Model.php | 6 ++---- src/Command/BaseCommand.php | 6 ++---- src/Command/CacheImages.php | 6 ++---- src/Command/ClearCache.php | 6 ++---- src/Controller/Anime.php | 6 ++---- src/Controller/Collection.php | 6 ++---- src/Controller/Manga.php | 6 ++---- src/Helper/Menu.php | 6 ++---- src/Model/API.php | 6 ++---- src/Model/Anime.php | 6 ++---- src/Model/AnimeCollection.php | 6 ++---- src/Model/Collection.php | 6 ++---- src/Model/DB.php | 6 ++---- src/Model/Manga.php | 6 ++---- 33 files changed, 66 insertions(+), 131 deletions(-) diff --git a/app/bootstrap.php b/app/bootstrap.php index 5c2bfd76..93319c9a 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient; + */namespace Aviat\AnimeClient; use Aura\Html\HelperLocatorFactory; use Aura\Router\RouterContainer; diff --git a/build/header_comment.txt b/build/header_comment.txt index 506ee880..ee592ce8 100644 --- a/build/header_comment.txt +++ b/build/header_comment.txt @@ -7,9 +7,8 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - + */ \ No newline at end of file diff --git a/src/API/AbstractListItem.php b/src/API/AbstractListItem.php index e5c1e524..9ef30bd4 100644 --- a/src/API/AbstractListItem.php +++ b/src/API/AbstractListItem.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API; + */namespace Aviat\AnimeClient\API; abstract class AbstractListItem implements ListItemInterface { diff --git a/src/API/GuzzleTrait.php b/src/API/GuzzleTrait.php index 9fdb1998..d126137a 100644 --- a/src/API/GuzzleTrait.php +++ b/src/API/GuzzleTrait.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API; + */namespace Aviat\AnimeClient\API; /** * Base trait for api interaction diff --git a/src/API/JsonAPI.php b/src/API/JsonAPI.php index 5e727f4f..12f7d276 100644 --- a/src/API/JsonAPI.php +++ b/src/API/JsonAPI.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API; + */namespace Aviat\AnimeClient\API; /** * Class encapsulating Json API data structure for a request or response diff --git a/src/API/Kitsu.php b/src/API/Kitsu.php index 30bd94c6..f5506b4a 100644 --- a/src/API/Kitsu.php +++ b/src/API/Kitsu.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API; + */namespace Aviat\AnimeClient\API; use Aviat\AnimeClient\API\Kitsu\Enum\{ AnimeAiringStatus, diff --git a/src/API/Kitsu/Auth.php b/src/API/Kitsu/Auth.php index 113d5fd8..2c0183f2 100644 --- a/src/API/Kitsu/Auth.php +++ b/src/API/Kitsu/Auth.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu; + */namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; diff --git a/src/API/Kitsu/Enum/AnimeAiringStatus.php b/src/API/Kitsu/Enum/AnimeAiringStatus.php index a7bf27e9..42ed9d8d 100644 --- a/src/API/Kitsu/Enum/AnimeAiringStatus.php +++ b/src/API/Kitsu/Enum/AnimeAiringStatus.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Enum; + */namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/Enum/AnimeWatchingStatus.php b/src/API/Kitsu/Enum/AnimeWatchingStatus.php index 74ecc682..db836ebe 100644 --- a/src/API/Kitsu/Enum/AnimeWatchingStatus.php +++ b/src/API/Kitsu/Enum/AnimeWatchingStatus.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Enum; + */namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/Enum/MangaReadingStatus.php b/src/API/Kitsu/Enum/MangaReadingStatus.php index 15351824..f468732f 100644 --- a/src/API/Kitsu/Enum/MangaReadingStatus.php +++ b/src/API/Kitsu/Enum/MangaReadingStatus.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Enum; + */namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/KitsuModel.php b/src/API/Kitsu/KitsuModel.php index d87899fa..a658ddf1 100644 --- a/src/API/Kitsu/KitsuModel.php +++ b/src/API/Kitsu/KitsuModel.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu; + */namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\Kitsu as K; use Aviat\AnimeClient\API\Kitsu\Transformer\{ diff --git a/src/API/Kitsu/KitsuTrait.php b/src/API/Kitsu/KitsuTrait.php index 4b483ef7..51187d78 100644 --- a/src/API/Kitsu/KitsuTrait.php +++ b/src/API/Kitsu/KitsuTrait.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu; + */namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; use Aviat\AnimeClient\API\GuzzleTrait; diff --git a/src/API/Kitsu/ListItem.php b/src/API/Kitsu/ListItem.php index 757df26f..8767e4e0 100644 --- a/src/API/Kitsu/ListItem.php +++ b/src/API/Kitsu/ListItem.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu; + */namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\AbstractListItem; use Aviat\Ion\Di\ContainerAware; diff --git a/src/API/Kitsu/Transformer/AnimeListTransformer.php b/src/API/Kitsu/Transformer/AnimeListTransformer.php index 7103e3ba..37cdf585 100644 --- a/src/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeListTransformer.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/Kitsu/Transformer/AnimeTransformer.php b/src/API/Kitsu/Transformer/AnimeTransformer.php index 3dbfc8cc..2755d640 100644 --- a/src/API/Kitsu/Transformer/AnimeTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeTransformer.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/Kitsu/Transformer/MangaListTransformer.php b/src/API/Kitsu/Transformer/MangaListTransformer.php index 7e5e0645..76292b33 100644 --- a/src/API/Kitsu/Transformer/MangaListTransformer.php +++ b/src/API/Kitsu/Transformer/MangaListTransformer.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; use Aviat\Ion\StringWrapper; diff --git a/src/API/Kitsu/Transformer/MangaTransformer.php b/src/API/Kitsu/Transformer/MangaTransformer.php index df6bfead..5a7ce973 100644 --- a/src/API/Kitsu/Transformer/MangaTransformer.php +++ b/src/API/Kitsu/Transformer/MangaTransformer.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/ListItemInterface.php b/src/API/ListItemInterface.php index 2767bd4c..fa926288 100644 --- a/src/API/ListItemInterface.php +++ b/src/API/ListItemInterface.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API; + */namespace Aviat\AnimeClient\API; use GuzzleHttp\Psr7\Response; diff --git a/src/API/MAL/Auth.php b/src/API/MAL/Auth.php index 33752ff5..c71a3ff5 100644 --- a/src/API/MAL/Auth.php +++ b/src/API/MAL/Auth.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\MAL; + */namespace Aviat\AnimeClient\API\MAL; use Aviat\AnimeClient\AnimeClient; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; diff --git a/src/API/MAL/Model.php b/src/API/MAL/Model.php index 2de5339b..38ceaf96 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu; + */namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\Model\API; diff --git a/src/Command/BaseCommand.php b/src/Command/BaseCommand.php index 3d0fa2ff..65d0eb21 100644 --- a/src/Command/BaseCommand.php +++ b/src/Command/BaseCommand.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Command; + */namespace Aviat\AnimeClient\Command; use Aura\Session\SessionFactory; use Aviat\AnimeClient\AnimeClient; diff --git a/src/Command/CacheImages.php b/src/Command/CacheImages.php index c3923133..ba79a083 100644 --- a/src/Command/CacheImages.php +++ b/src/Command/CacheImages.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Command; + */namespace Aviat\AnimeClient\Command; use Aviat\AnimeClient\Util; diff --git a/src/Command/ClearCache.php b/src/Command/ClearCache.php index b49ea685..5228e2e3 100644 --- a/src/Command/ClearCache.php +++ b/src/Command/ClearCache.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Command; + */namespace Aviat\AnimeClient\Command; /** * Clears the API Cache diff --git a/src/Controller/Anime.php b/src/Controller/Anime.php index a9746973..9fd05205 100644 --- a/src/Controller/Anime.php +++ b/src/Controller/Anime.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Controller; + */namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/Controller/Collection.php b/src/Controller/Collection.php index 9bdc30c8..fb1e80a3 100644 --- a/src/Controller/Collection.php +++ b/src/Controller/Collection.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Controller; + */namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\Model\Anime as AnimeModel; diff --git a/src/Controller/Manga.php b/src/Controller/Manga.php index d2b47ee4..fdbdf873 100644 --- a/src/Controller/Manga.php +++ b/src/Controller/Manga.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Controller; + */namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/Helper/Menu.php b/src/Helper/Menu.php index b045d67f..59cd6285 100644 --- a/src/Helper/Menu.php +++ b/src/Helper/Menu.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Helper; + */namespace Aviat\AnimeClient\Helper; use Aviat\AnimeClient\MenuGenerator; diff --git a/src/Model/API.php b/src/Model/API.php index 158639ae..09d7157c 100644 --- a/src/Model/API.php +++ b/src/Model/API.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Model; + */namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; use Aviat\Ion\Model; diff --git a/src/Model/Anime.php b/src/Model/Anime.php index 6b5453d4..438c6c2a 100644 --- a/src/Model/Anime.php +++ b/src/Model/Anime.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Model; + */namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\Kitsu\Enum\AnimeWatchingStatus; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Json; diff --git a/src/Model/AnimeCollection.php b/src/Model/AnimeCollection.php index a779a0fc..f1d25109 100644 --- a/src/Model/AnimeCollection.php +++ b/src/Model/AnimeCollection.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Model; + */namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Json; diff --git a/src/Model/Collection.php b/src/Model/Collection.php index 12184c7d..ce8673dc 100644 --- a/src/Model/Collection.php +++ b/src/Model/Collection.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Model; + */namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Model\DB; diff --git a/src/Model/DB.php b/src/Model/DB.php index 3acd9b77..60b412f1 100644 --- a/src/Model/DB.php +++ b/src/Model/DB.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Model; + */namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Model; diff --git a/src/Model/Manga.php b/src/Model/Manga.php index 420948a2..6ffa481f 100644 --- a/src/Model/Manga.php +++ b/src/Model/Manga.php @@ -8,13 +8,11 @@ * * @package AnimeListClient * @author Timothy J. Warren - * @copyright 2015 - 2016 Timothy J. Warren + * @copyright 2015 - 2017 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\Model; + */namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\Kitsu\Enum\MangaReadingStatus; use Aviat\AnimeClient\API\Kitsu\Transformer; From 3f34ecee2859351bc1ad37206c19a043fc4e0d66 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 11 Jan 2017 10:34:24 -0500 Subject: [PATCH 02/14] Update header comments, with proper newlines --- app/bootstrap.php | 5 ++++- build/header_comment.txt | 4 +++- src/API/AbstractListItem.php | 5 ++++- src/API/GuzzleTrait.php | 5 ++++- src/API/JsonAPI.php | 5 ++++- src/API/Kitsu.php | 5 ++++- src/API/Kitsu/Auth.php | 5 ++++- src/API/Kitsu/Enum/AnimeAiringStatus.php | 5 ++++- src/API/Kitsu/Enum/AnimeWatchingStatus.php | 5 ++++- src/API/Kitsu/Enum/MangaReadingStatus.php | 5 ++++- src/API/Kitsu/KitsuModel.php | 5 ++++- src/API/Kitsu/KitsuTrait.php | 5 ++++- src/API/Kitsu/ListItem.php | 5 ++++- src/API/Kitsu/Transformer/AnimeListTransformer.php | 5 ++++- src/API/Kitsu/Transformer/AnimeTransformer.php | 5 ++++- src/API/Kitsu/Transformer/MangaListTransformer.php | 5 ++++- src/API/Kitsu/Transformer/MangaTransformer.php | 5 ++++- src/API/ListItemInterface.php | 5 ++++- src/API/MAL/Auth.php | 5 ++++- src/API/MAL/Model.php | 5 ++++- src/Command/BaseCommand.php | 5 ++++- src/Command/CacheImages.php | 5 ++++- src/Command/ClearCache.php | 5 ++++- src/Controller/Anime.php | 5 ++++- src/Controller/Collection.php | 5 ++++- src/Controller/Manga.php | 5 ++++- src/Helper/Menu.php | 5 ++++- src/Model/API.php | 5 ++++- src/Model/Anime.php | 5 ++++- src/Model/AnimeCollection.php | 5 ++++- src/Model/Collection.php | 5 ++++- src/Model/DB.php | 5 ++++- src/Model/Manga.php | 5 ++++- 33 files changed, 131 insertions(+), 33 deletions(-) diff --git a/app/bootstrap.php b/app/bootstrap.php index 93319c9a..8790c541 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient; + */ + + +namespace Aviat\AnimeClient; use Aura\Html\HelperLocatorFactory; use Aura\Router\RouterContainer; diff --git a/build/header_comment.txt b/build/header_comment.txt index ee592ce8..684e98bc 100644 --- a/build/header_comment.txt +++ b/build/header_comment.txt @@ -11,4 +11,6 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ \ No newline at end of file + */ + + diff --git a/src/API/AbstractListItem.php b/src/API/AbstractListItem.php index 9ef30bd4..0717689e 100644 --- a/src/API/AbstractListItem.php +++ b/src/API/AbstractListItem.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API; + */ + + +namespace Aviat\AnimeClient\API; abstract class AbstractListItem implements ListItemInterface { diff --git a/src/API/GuzzleTrait.php b/src/API/GuzzleTrait.php index d126137a..19165856 100644 --- a/src/API/GuzzleTrait.php +++ b/src/API/GuzzleTrait.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API; + */ + + +namespace Aviat\AnimeClient\API; /** * Base trait for api interaction diff --git a/src/API/JsonAPI.php b/src/API/JsonAPI.php index 12f7d276..024509d4 100644 --- a/src/API/JsonAPI.php +++ b/src/API/JsonAPI.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API; + */ + + +namespace Aviat\AnimeClient\API; /** * Class encapsulating Json API data structure for a request or response diff --git a/src/API/Kitsu.php b/src/API/Kitsu.php index f5506b4a..97941696 100644 --- a/src/API/Kitsu.php +++ b/src/API/Kitsu.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API; + */ + + +namespace Aviat\AnimeClient\API; use Aviat\AnimeClient\API\Kitsu\Enum\{ AnimeAiringStatus, diff --git a/src/API/Kitsu/Auth.php b/src/API/Kitsu/Auth.php index 2c0183f2..e9bc9ea7 100644 --- a/src/API/Kitsu/Auth.php +++ b/src/API/Kitsu/Auth.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu; + */ + + +namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; diff --git a/src/API/Kitsu/Enum/AnimeAiringStatus.php b/src/API/Kitsu/Enum/AnimeAiringStatus.php index 42ed9d8d..00113393 100644 --- a/src/API/Kitsu/Enum/AnimeAiringStatus.php +++ b/src/API/Kitsu/Enum/AnimeAiringStatus.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Enum; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/Enum/AnimeWatchingStatus.php b/src/API/Kitsu/Enum/AnimeWatchingStatus.php index db836ebe..06030fe7 100644 --- a/src/API/Kitsu/Enum/AnimeWatchingStatus.php +++ b/src/API/Kitsu/Enum/AnimeWatchingStatus.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Enum; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/Enum/MangaReadingStatus.php b/src/API/Kitsu/Enum/MangaReadingStatus.php index f468732f..a93a6d95 100644 --- a/src/API/Kitsu/Enum/MangaReadingStatus.php +++ b/src/API/Kitsu/Enum/MangaReadingStatus.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Enum; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/KitsuModel.php b/src/API/Kitsu/KitsuModel.php index a658ddf1..400f4289 100644 --- a/src/API/Kitsu/KitsuModel.php +++ b/src/API/Kitsu/KitsuModel.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu; + */ + + +namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\Kitsu as K; use Aviat\AnimeClient\API\Kitsu\Transformer\{ diff --git a/src/API/Kitsu/KitsuTrait.php b/src/API/Kitsu/KitsuTrait.php index 51187d78..b8f7d390 100644 --- a/src/API/Kitsu/KitsuTrait.php +++ b/src/API/Kitsu/KitsuTrait.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu; + */ + + +namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; use Aviat\AnimeClient\API\GuzzleTrait; diff --git a/src/API/Kitsu/ListItem.php b/src/API/Kitsu/ListItem.php index 8767e4e0..b3e565bb 100644 --- a/src/API/Kitsu/ListItem.php +++ b/src/API/Kitsu/ListItem.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu; + */ + + +namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\AbstractListItem; use Aviat\Ion\Di\ContainerAware; diff --git a/src/API/Kitsu/Transformer/AnimeListTransformer.php b/src/API/Kitsu/Transformer/AnimeListTransformer.php index 37cdf585..916acf99 100644 --- a/src/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeListTransformer.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/Kitsu/Transformer/AnimeTransformer.php b/src/API/Kitsu/Transformer/AnimeTransformer.php index 2755d640..9089c452 100644 --- a/src/API/Kitsu/Transformer/AnimeTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeTransformer.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/Kitsu/Transformer/MangaListTransformer.php b/src/API/Kitsu/Transformer/MangaListTransformer.php index 76292b33..328b9af7 100644 --- a/src/API/Kitsu/Transformer/MangaListTransformer.php +++ b/src/API/Kitsu/Transformer/MangaListTransformer.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; use Aviat\Ion\StringWrapper; diff --git a/src/API/Kitsu/Transformer/MangaTransformer.php b/src/API/Kitsu/Transformer/MangaTransformer.php index 5a7ce973..aa67608e 100644 --- a/src/API/Kitsu/Transformer/MangaTransformer.php +++ b/src/API/Kitsu/Transformer/MangaTransformer.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu\Transformer; + */ + + +namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/ListItemInterface.php b/src/API/ListItemInterface.php index fa926288..e88fc95f 100644 --- a/src/API/ListItemInterface.php +++ b/src/API/ListItemInterface.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API; + */ + + +namespace Aviat\AnimeClient\API; use GuzzleHttp\Psr7\Response; diff --git a/src/API/MAL/Auth.php b/src/API/MAL/Auth.php index c71a3ff5..645c66d2 100644 --- a/src/API/MAL/Auth.php +++ b/src/API/MAL/Auth.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\MAL; + */ + + +namespace Aviat\AnimeClient\API\MAL; use Aviat\AnimeClient\AnimeClient; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; diff --git a/src/API/MAL/Model.php b/src/API/MAL/Model.php index 38ceaf96..c6e38b41 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\API\Kitsu; + */ + + +namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\Model\API; diff --git a/src/Command/BaseCommand.php b/src/Command/BaseCommand.php index 65d0eb21..5d3eb0c1 100644 --- a/src/Command/BaseCommand.php +++ b/src/Command/BaseCommand.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Command; + */ + + +namespace Aviat\AnimeClient\Command; use Aura\Session\SessionFactory; use Aviat\AnimeClient\AnimeClient; diff --git a/src/Command/CacheImages.php b/src/Command/CacheImages.php index ba79a083..37f3bb1e 100644 --- a/src/Command/CacheImages.php +++ b/src/Command/CacheImages.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Command; + */ + + +namespace Aviat\AnimeClient\Command; use Aviat\AnimeClient\Util; diff --git a/src/Command/ClearCache.php b/src/Command/ClearCache.php index 5228e2e3..5516de1a 100644 --- a/src/Command/ClearCache.php +++ b/src/Command/ClearCache.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Command; + */ + + +namespace Aviat\AnimeClient\Command; /** * Clears the API Cache diff --git a/src/Controller/Anime.php b/src/Controller/Anime.php index 9fd05205..149013e4 100644 --- a/src/Controller/Anime.php +++ b/src/Controller/Anime.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Controller; + */ + + +namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/Controller/Collection.php b/src/Controller/Collection.php index fb1e80a3..587cfe83 100644 --- a/src/Controller/Collection.php +++ b/src/Controller/Collection.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Controller; + */ + + +namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\Model\Anime as AnimeModel; diff --git a/src/Controller/Manga.php b/src/Controller/Manga.php index fdbdf873..efcd3544 100644 --- a/src/Controller/Manga.php +++ b/src/Controller/Manga.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Controller; + */ + + +namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/Helper/Menu.php b/src/Helper/Menu.php index 59cd6285..2b388938 100644 --- a/src/Helper/Menu.php +++ b/src/Helper/Menu.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Helper; + */ + + +namespace Aviat\AnimeClient\Helper; use Aviat\AnimeClient\MenuGenerator; diff --git a/src/Model/API.php b/src/Model/API.php index 09d7157c..96fc2fa7 100644 --- a/src/Model/API.php +++ b/src/Model/API.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Model; + */ + + +namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; use Aviat\Ion\Model; diff --git a/src/Model/Anime.php b/src/Model/Anime.php index 438c6c2a..ce11164d 100644 --- a/src/Model/Anime.php +++ b/src/Model/Anime.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Model; + */ + + +namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\Kitsu\Enum\AnimeWatchingStatus; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Json; diff --git a/src/Model/AnimeCollection.php b/src/Model/AnimeCollection.php index f1d25109..e38b4756 100644 --- a/src/Model/AnimeCollection.php +++ b/src/Model/AnimeCollection.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Model; + */ + + +namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Json; diff --git a/src/Model/Collection.php b/src/Model/Collection.php index ce8673dc..6fcd0af1 100644 --- a/src/Model/Collection.php +++ b/src/Model/Collection.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Model; + */ + + +namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Model\DB; diff --git a/src/Model/DB.php b/src/Model/DB.php index 60b412f1..56bfecaf 100644 --- a/src/Model/DB.php +++ b/src/Model/DB.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Model; + */ + + +namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Model; diff --git a/src/Model/Manga.php b/src/Model/Manga.php index 6ffa481f..87f918be 100644 --- a/src/Model/Manga.php +++ b/src/Model/Manga.php @@ -12,7 +12,10 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://github.com/timw4mail/HummingBirdAnimeClient - */namespace Aviat\AnimeClient\Model; + */ + + +namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\Kitsu\Enum\MangaReadingStatus; use Aviat\AnimeClient\API\Kitsu\Transformer; From e6e9c9424bbb427ffa1cd5d3143fa575f8ffa355 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 11 Jan 2017 19:35:51 -0500 Subject: [PATCH 03/14] Start of integration with My Anime List --- src/API/MAL.php | 49 +++++ src/API/MAL/Enum/AnimeWatchingStatus.php | 30 ++++ src/API/MAL/Enum/MangaReadingStatus.php | 30 ++++ src/API/XML.php | 220 +++++++++++++++++++++++ tests/API/XMLTest.php | 84 +++++++++ tests/test_data/minifiedXmlTestFile.xml | 2 + tests/test_data/xmlTestFile.xml | 22 +++ 7 files changed, 437 insertions(+) create mode 100644 src/API/MAL.php create mode 100644 src/API/MAL/Enum/AnimeWatchingStatus.php create mode 100644 src/API/MAL/Enum/MangaReadingStatus.php create mode 100644 src/API/XML.php create mode 100644 tests/API/XMLTest.php create mode 100644 tests/test_data/minifiedXmlTestFile.xml create mode 100644 tests/test_data/xmlTestFile.xml diff --git a/src/API/MAL.php b/src/API/MAL.php new file mode 100644 index 00000000..d6eb2199 --- /dev/null +++ b/src/API/MAL.php @@ -0,0 +1,49 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API; + +use Aviat\AnimeClient\Enum\{AnimeWatchingStatus, MangaReadingStatus}; + +/** + * Constants and mappings for the My Anime List API + */ +class MAL { + const AUTH_URL = 'https://myanimelist.net/api/account/verify_credentials.xml'; + const BASE_URL = 'https://myanimelist.net/api/'; + + public static function getIdToWatchingStatusMap() + { + return [ + 1 => AnimeWatchingStatus::WATCHING, + 2 => AnimeWatchingStatus::COMPLETED, + 3 => AnimeWatchingStatus::ON_HOLD, + 4 => AnimeWatchingStatus::DROPPED, + 5 => AnimeWatchingStatus::PLAN_TO_WATCH + ]; + } + + public static function getIdToReadingStatusMap() + { + return [ + 1 => MangaReadingStatus::READING, + 2 => MangaReadingStatus::COMPLETED, + 3 => MangaReadingStatus::ON_HOLD, + 4 => MangaReadingStatus::DROPPED, + 5 => MangaReadingStatus::PLAN_TO_READ + ]; + } +} \ No newline at end of file diff --git a/src/API/MAL/Enum/AnimeWatchingStatus.php b/src/API/MAL/Enum/AnimeWatchingStatus.php new file mode 100644 index 00000000..b12e2657 --- /dev/null +++ b/src/API/MAL/Enum/AnimeWatchingStatus.php @@ -0,0 +1,30 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API\MAL\Enum; + +use Aviat\Ion\Enum as BaseEnum; + +/** + * Possible values for watching status for the current anime + */ +class AnimeWatchingStatus extends BaseEnum { + const WATCHING = 'watching'; + const COMPLETED = 'completed'; + const ON_HOLD = 'onhold'; + const DROPPED = 'dropped'; + const PLAN_TO_WATCH = 'plantowatch'; +} \ No newline at end of file diff --git a/src/API/MAL/Enum/MangaReadingStatus.php b/src/API/MAL/Enum/MangaReadingStatus.php new file mode 100644 index 00000000..edf82ddd --- /dev/null +++ b/src/API/MAL/Enum/MangaReadingStatus.php @@ -0,0 +1,30 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API\MAL\Enum; + +use Aviat\Ion\Enum as BaseEnum; + +/** + * Possible values for watching status for the current anime + */ +class MangaReadingStatus extends BaseEnum { + const READING = 'reading'; + const COMPLETED = 'completed'; + const ON_HOLD = 'onhold'; + const DROPPED = 'dropped'; + const PLAN_TO_READ = 'plantoread'; +} \ No newline at end of file diff --git a/src/API/XML.php b/src/API/XML.php new file mode 100644 index 00000000..e8148737 --- /dev/null +++ b/src/API/XML.php @@ -0,0 +1,220 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API; + +use DOMDocument, DOMNode, DOMNodelist; + +/** + * XML <=> PHP Array codec + */ +class XML { + + /** + * XML representation of the data + * + * @var string + */ + private $xml; + + /** + * PHP array version of the data + * + * @var array + */ + private $data; + + /** + * XML constructor + */ + public function __construct(string $xml = '', array $data = []) + { + $this->setXML($xml)->setData($data); + } + + /** + * Serialize the data to an xml string + */ + public function __toString(): string + { + return static::toXML($this->getData()); + } + + /** + * Get the data parsed from the XML + * + * @return array + */ + public function getData(): array + { + return $this->data; + } + + /** + * Set the data to create xml from + * + * @param array $data + * @return $this + */ + public function setData(array $data): self + { + $this->data = $data; + return $this; + } + + /** + * Get the xml created from the data + * + * @return string + */ + public function getXML(): string + { + return $this->xml; + } + + /** + * Set the xml to parse the data from + * + * @param string $xml + * @return $this + */ + public function setXML(string $xml): self + { + $this->xml = $xml; + return $this; + } + + /** + * Parse an xml document string to a php array + * + * @param string $xml + * @return array + */ + public static function toArray(string $xml): array + { + $data = []; + + // Get rid of unimportant text nodes by removing + // whitespace characters from between xml tags, + // except for the xml declaration tag, Which looks + // something like: + /* */ + $xml = preg_replace('/([^\?])>\s+<', $xml); + + $dom = new DOMDocument(); + $dom->loadXML($xml); + $root = $dom->documentElement; + + $data[$root->tagName] = []; + + if ($root->hasChildNodes()) + { + static::childNodesToArray($data[$root->tagName], $root->childNodes); + } + + return $data; + } + + /** + * Transform the array into XML + * + * @param array $data + * @return string + */ + public static function toXML(array $data): string + { + $dom = new DOMDocument(); + $dom->encoding = 'UTF-8'; + + static::arrayPropertiesToXmlNodes($dom, $dom, $data); + + return $dom->saveXML(); + } + + /** + * Parse the xml document string to a php array + * + * @return array + */ + public function parse(): array + { + $xml = $this->getXML(); + $data = static::toArray($xml); + return $this->setData($data)->getData(); + } + + /** + * Transform the array into XML + * + * @return string + */ + public function createXML(): string + { + return static::toXML($this->getData()); + } + + /** + * Recursively create array structure based on xml structure + * + * @param array &$root A reference to the current array location + * @param DOMNodeList $nodeList The current NodeList object + * @return void + */ + private static function childNodesToArray(array &$root, DOMNodelist $nodeList) + { + $length = $nodeList->length; + for ($i = 0; $i < $length; $i++) + { + $el = $nodeList->item($i); + if (is_a($el->childNodes->item(0), 'DomText') || ( ! $el->hasChildNodes())) + { + $root[$el->nodeName] = $el->textContent; + } + else + { + $root[$el->nodeName] = []; + static::childNodesToArray($root[$el->nodeName], $el->childNodes); + } + } + } + + /** + * Recursively create xml nodes from array properties + * + * @param DOMDocument $dom The current DOM object + * @param DOMNode $parent The parent element to append children to + * @param array $data The data for the current node + * @return void + */ + private static function arrayPropertiesToXmlNodes(DOMDocument &$dom, DOMNode &$parent, array $data) + { + foreach($data as $key => $props) + { + $node = $dom->createElement($key); + if (is_array($props)) + { + static::arrayPropertiesToXmlNodes($dom, $node, $props); + } + else + { + $tNode = $dom->createTextNode((string)$props); + $node->appendChild($tNode); + } + + $parent->appendChild($node); + } + } +} \ No newline at end of file diff --git a/tests/API/XMLTest.php b/tests/API/XMLTest.php new file mode 100644 index 00000000..50cebb37 --- /dev/null +++ b/tests/API/XMLTest.php @@ -0,0 +1,84 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\API; + +use Aviat\AnimeClient\API\XML; +use PHPUnit\Framework\TestCase; + +class XMLTest extends TestCase { + + public function setUp() + { + $this->xml = file_get_contents(__DIR__ . '/../test_data/xmlTestFile.xml'); + $this->expectedXml = file_get_contents(__DIR__ . '/../test_data/minifiedXmlTestFile.xml'); + + $this->array = [ + 'entry' => [ + 'foo' => [ + 'bar' => [ + 'baz' => 42 + ] + ], + 'episode' => '11', + 'status' => 'watching', + 'score' => '7', + 'storage_type' => '1', + 'storage_value' => '2.5', + 'times_rewatched' => '1', + 'rewatch_value' => '3', + 'date_start' => '01152015', + 'date_finish' => '10232016', + 'priority' => '2', + 'enable_discussion' => '0', + 'enable_rewatching' => '1', + 'comments' => 'Should you say something?', + 'tags' => 'test tag, 2nd tag' + ] + ]; + + $this->object = new XML(); + } + + public function testToArray() + { + $this->assertEquals($this->array, XML::toArray($this->xml)); + } + + public function testParse() + { + $this->object->setXML($this->xml); + $this->assertEquals($this->array, $this->object->parse()); + } + + public function testToXML() + { + $this->assertEquals($this->expectedXml, XML::toXML($this->array)); + } + + public function testCreateXML() + { + $this->object->setData($this->array); + $this->assertEquals($this->expectedXml, $this->object->createXML()); + } + + public function testToString() + { + $this->object->setData($this->array); + $this->assertEquals($this->expectedXml, $this->object->__toString()); + $this->assertEquals($this->expectedXml, (string) $this->object); + } +} \ No newline at end of file diff --git a/tests/test_data/minifiedXmlTestFile.xml b/tests/test_data/minifiedXmlTestFile.xml new file mode 100644 index 00000000..c0490c7c --- /dev/null +++ b/tests/test_data/minifiedXmlTestFile.xml @@ -0,0 +1,2 @@ + +4211watching712.5130115201510232016201Should you say something?test tag, 2nd tag diff --git a/tests/test_data/xmlTestFile.xml b/tests/test_data/xmlTestFile.xml new file mode 100644 index 00000000..b37cf964 --- /dev/null +++ b/tests/test_data/xmlTestFile.xml @@ -0,0 +1,22 @@ + + + + + 42 + + + 11 + watching + 7 + 1 + 2.5 + 1 + 3 + 01152015 + 10232016 + 2 + 0 + 1 + Should you say something? + test tag, 2nd tag + \ No newline at end of file From 951187783be566c4295e29952d58b25217e716ff Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 11 Jan 2017 19:37:14 -0500 Subject: [PATCH 04/14] Third time's a charm for updating the header comment? --- build/header_comment.txt | 1 - src/API/AbstractListItem.php | 1 - src/API/GuzzleTrait.php | 1 - src/API/JsonAPI.php | 29 ++++++++++++++++++- src/API/Kitsu.php | 1 - src/API/Kitsu/Auth.php | 1 - src/API/Kitsu/Enum/AnimeAiringStatus.php | 1 - src/API/Kitsu/Enum/AnimeWatchingStatus.php | 1 - src/API/Kitsu/Enum/MangaReadingStatus.php | 1 - src/API/Kitsu/KitsuModel.php | 1 - src/API/Kitsu/KitsuTrait.php | 1 - src/API/Kitsu/ListItem.php | 1 - .../Transformer/AnimeListTransformer.php | 1 - .../Kitsu/Transformer/AnimeTransformer.php | 1 - .../Transformer/MangaListTransformer.php | 1 - .../Kitsu/Transformer/MangaTransformer.php | 1 - src/API/ListItemInterface.php | 1 - src/API/MAL/Auth.php | 1 - src/API/MAL/Model.php | 1 - src/Command/BaseCommand.php | 1 - src/Command/CacheImages.php | 1 - src/Command/ClearCache.php | 1 - src/Controller/Anime.php | 1 - src/Controller/Collection.php | 1 - src/Controller/Manga.php | 1 - src/Helper/Menu.php | 1 - src/Model/API.php | 1 - src/Model/Anime.php | 1 - src/Model/AnimeCollection.php | 1 - src/Model/Collection.php | 1 - src/Model/DB.php | 1 - src/Model/Manga.php | 1 - 32 files changed, 28 insertions(+), 32 deletions(-) diff --git a/build/header_comment.txt b/build/header_comment.txt index 684e98bc..91b15c5d 100644 --- a/build/header_comment.txt +++ b/build/header_comment.txt @@ -13,4 +13,3 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - diff --git a/src/API/AbstractListItem.php b/src/API/AbstractListItem.php index 0717689e..716f65f4 100644 --- a/src/API/AbstractListItem.php +++ b/src/API/AbstractListItem.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API; abstract class AbstractListItem implements ListItemInterface { diff --git a/src/API/GuzzleTrait.php b/src/API/GuzzleTrait.php index 19165856..6af78cde 100644 --- a/src/API/GuzzleTrait.php +++ b/src/API/GuzzleTrait.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API; /** diff --git a/src/API/JsonAPI.php b/src/API/JsonAPI.php index 024509d4..f2848474 100644 --- a/src/API/JsonAPI.php +++ b/src/API/JsonAPI.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API; /** @@ -41,6 +40,13 @@ class JsonAPI { */ protected $data = []; + /** + * Data array parsed out from a request + * + * @var array + */ + protected $parsedData = []; + /** * Related objects included with the request * @@ -55,6 +61,16 @@ class JsonAPI { */ protected $links = []; + /** + * JsonAPI constructor + * + * @param array $initital + */ + public function __construct(array $initial = []) + { + $this->data = $initial; + } + /** * Parse a JsonAPI response into its components * @@ -64,4 +80,15 @@ class JsonAPI { { } + + /** + * Return data array after input is parsed + * to inline includes inside of relationship objects + * + * @return array + */ + public function getParsedData(): array + { + + } } \ No newline at end of file diff --git a/src/API/Kitsu.php b/src/API/Kitsu.php index 97941696..9e0fc161 100644 --- a/src/API/Kitsu.php +++ b/src/API/Kitsu.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API; use Aviat\AnimeClient\API\Kitsu\Enum\{ diff --git a/src/API/Kitsu/Auth.php b/src/API/Kitsu/Auth.php index e9bc9ea7..c6ac74ab 100644 --- a/src/API/Kitsu/Auth.php +++ b/src/API/Kitsu/Auth.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; diff --git a/src/API/Kitsu/Enum/AnimeAiringStatus.php b/src/API/Kitsu/Enum/AnimeAiringStatus.php index 00113393..606d07c6 100644 --- a/src/API/Kitsu/Enum/AnimeAiringStatus.php +++ b/src/API/Kitsu/Enum/AnimeAiringStatus.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/Enum/AnimeWatchingStatus.php b/src/API/Kitsu/Enum/AnimeWatchingStatus.php index 06030fe7..c517ff7d 100644 --- a/src/API/Kitsu/Enum/AnimeWatchingStatus.php +++ b/src/API/Kitsu/Enum/AnimeWatchingStatus.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/Enum/MangaReadingStatus.php b/src/API/Kitsu/Enum/MangaReadingStatus.php index a93a6d95..5b1de9c7 100644 --- a/src/API/Kitsu/Enum/MangaReadingStatus.php +++ b/src/API/Kitsu/Enum/MangaReadingStatus.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Enum; use Aviat\Ion\Enum as BaseEnum; diff --git a/src/API/Kitsu/KitsuModel.php b/src/API/Kitsu/KitsuModel.php index 400f4289..967392ee 100644 --- a/src/API/Kitsu/KitsuModel.php +++ b/src/API/Kitsu/KitsuModel.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\Kitsu as K; diff --git a/src/API/Kitsu/KitsuTrait.php b/src/API/Kitsu/KitsuTrait.php index b8f7d390..30d97fa1 100644 --- a/src/API/Kitsu/KitsuTrait.php +++ b/src/API/Kitsu/KitsuTrait.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; diff --git a/src/API/Kitsu/ListItem.php b/src/API/Kitsu/ListItem.php index b3e565bb..f21101f8 100644 --- a/src/API/Kitsu/ListItem.php +++ b/src/API/Kitsu/ListItem.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\AbstractListItem; diff --git a/src/API/Kitsu/Transformer/AnimeListTransformer.php b/src/API/Kitsu/Transformer/AnimeListTransformer.php index 916acf99..7d05e76e 100644 --- a/src/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeListTransformer.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/API/Kitsu/Transformer/AnimeTransformer.php b/src/API/Kitsu/Transformer/AnimeTransformer.php index 9089c452..92c7ee7b 100644 --- a/src/API/Kitsu/Transformer/AnimeTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeTransformer.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/API/Kitsu/Transformer/MangaListTransformer.php b/src/API/Kitsu/Transformer/MangaListTransformer.php index 328b9af7..2f9d3e0c 100644 --- a/src/API/Kitsu/Transformer/MangaListTransformer.php +++ b/src/API/Kitsu/Transformer/MangaListTransformer.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\AnimeClient\API\Kitsu; diff --git a/src/API/Kitsu/Transformer/MangaTransformer.php b/src/API/Kitsu/Transformer/MangaTransformer.php index aa67608e..c2b0784d 100644 --- a/src/API/Kitsu/Transformer/MangaTransformer.php +++ b/src/API/Kitsu/Transformer/MangaTransformer.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu\Transformer; use Aviat\Ion\Transformer\AbstractTransformer; diff --git a/src/API/ListItemInterface.php b/src/API/ListItemInterface.php index e88fc95f..b0001428 100644 --- a/src/API/ListItemInterface.php +++ b/src/API/ListItemInterface.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API; use GuzzleHttp\Psr7\Response; diff --git a/src/API/MAL/Auth.php b/src/API/MAL/Auth.php index 645c66d2..4f03508c 100644 --- a/src/API/MAL/Auth.php +++ b/src/API/MAL/Auth.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\MAL; use Aviat\AnimeClient\AnimeClient; diff --git a/src/API/MAL/Model.php b/src/API/MAL/Model.php index c6e38b41..47f948f4 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\Model\API; diff --git a/src/Command/BaseCommand.php b/src/Command/BaseCommand.php index 5d3eb0c1..b8205f71 100644 --- a/src/Command/BaseCommand.php +++ b/src/Command/BaseCommand.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Command; use Aura\Session\SessionFactory; diff --git a/src/Command/CacheImages.php b/src/Command/CacheImages.php index 37f3bb1e..5f9df74f 100644 --- a/src/Command/CacheImages.php +++ b/src/Command/CacheImages.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Command; use Aviat\AnimeClient\Util; diff --git a/src/Command/ClearCache.php b/src/Command/ClearCache.php index 5516de1a..d47bc0ba 100644 --- a/src/Command/ClearCache.php +++ b/src/Command/ClearCache.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Command; /** diff --git a/src/Controller/Anime.php b/src/Controller/Anime.php index 149013e4..674171a4 100644 --- a/src/Controller/Anime.php +++ b/src/Controller/Anime.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller as BaseController; diff --git a/src/Controller/Collection.php b/src/Controller/Collection.php index 587cfe83..de6a5a7a 100644 --- a/src/Controller/Collection.php +++ b/src/Controller/Collection.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller as BaseController; diff --git a/src/Controller/Manga.php b/src/Controller/Manga.php index efcd3544..96cc2959 100644 --- a/src/Controller/Manga.php +++ b/src/Controller/Manga.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Controller; diff --git a/src/Helper/Menu.php b/src/Helper/Menu.php index 2b388938..76cbf3e3 100644 --- a/src/Helper/Menu.php +++ b/src/Helper/Menu.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Helper; use Aviat\AnimeClient\MenuGenerator; diff --git a/src/Model/API.php b/src/Model/API.php index 96fc2fa7..40797eb4 100644 --- a/src/Model/API.php +++ b/src/Model/API.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; diff --git a/src/Model/Anime.php b/src/Model/Anime.php index ce11164d..7d644bc2 100644 --- a/src/Model/Anime.php +++ b/src/Model/Anime.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\Kitsu\Enum\AnimeWatchingStatus; use Aviat\Ion\Di\ContainerInterface; diff --git a/src/Model/AnimeCollection.php b/src/Model/AnimeCollection.php index e38b4756..83c64123 100644 --- a/src/Model/AnimeCollection.php +++ b/src/Model/AnimeCollection.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; diff --git a/src/Model/Collection.php b/src/Model/Collection.php index 6fcd0af1..1abf5bfc 100644 --- a/src/Model/Collection.php +++ b/src/Model/Collection.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; diff --git a/src/Model/DB.php b/src/Model/DB.php index 56bfecaf..dcacd4d6 100644 --- a/src/Model/DB.php +++ b/src/Model/DB.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Model; use Aviat\Ion\Di\ContainerInterface; diff --git a/src/Model/Manga.php b/src/Model/Manga.php index 87f918be..38ea4c5c 100644 --- a/src/Model/Manga.php +++ b/src/Model/Manga.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\Kitsu\Enum\MangaReadingStatus; From 2e3cc1837bf7f4be0a17c4b62daef28df6416f74 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 11 Jan 2017 22:26:43 -0500 Subject: [PATCH 05/14] Update config files --- app/config/cache.toml.example | 4 ++++ app/config/config.toml.example | 5 +---- app/config/mal.toml.example | 6 ++++++ app/config/redis.toml.example | 16 ---------------- 4 files changed, 11 insertions(+), 20 deletions(-) create mode 100644 app/config/mal.toml.example delete mode 100644 app/config/redis.toml.example diff --git a/app/config/cache.toml.example b/app/config/cache.toml.example index 283f45fa..8822d336 100644 --- a/app/config/cache.toml.example +++ b/app/config/cache.toml.example @@ -2,6 +2,10 @@ # Cache Setup # ################################################################################ +# See https://git.timshomepage.net/timw4mail/banker for more information + +# Available drivers are memcache, memcached, redis or null +# Null cache driver means no caching driver = "redis" [connection] diff --git a/app/config/config.toml.example b/app/config/config.toml.example index 0f3b679e..15637e7a 100644 --- a/app/config/config.toml.example +++ b/app/config/config.toml.example @@ -3,7 +3,7 @@ ################################################################################ # Username for anime and manga lists -hummingbird_username = "timw4mail" +kitsu_username = "timw4mail" # Whose list is it? whose_list = "Tim" @@ -14,8 +14,5 @@ show_anime_collection = true # do you wish to show the manga collection? show_manga_collection = false -# cache driver for api calls (NullDriver, SQLDriver, RedisDriver) -cache_driver = "NullDriver" - # path to public directory on the server asset_dir = "/../../public" \ No newline at end of file diff --git a/app/config/mal.toml.example b/app/config/mal.toml.example new file mode 100644 index 00000000..0e3233e0 --- /dev/null +++ b/app/config/mal.toml.example @@ -0,0 +1,6 @@ +################################################################################ +# My Anime LIst Integration Config # +################################################################################ + +username = "timw4mail" +password = "mysecretpassword" \ No newline at end of file diff --git a/app/config/redis.toml.example b/app/config/redis.toml.example deleted file mode 100644 index a3f7b996..00000000 --- a/app/config/redis.toml.example +++ /dev/null @@ -1,16 +0,0 @@ -################################################################################ -# Redis Cache Configuration # -################################################################################ - -# Host or socket to connect to -# Socket must be prefixed with 'unix:' -host = "127.0.0.1" - -# Connection port -#port = 6379 - -# Connection password -#password = "" - -# Database number -database = 13 \ No newline at end of file From adbed10173413ded996dede8f2ddd97bcdb00261 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 11 Jan 2017 22:27:36 -0500 Subject: [PATCH 06/14] Add test data files --- tests/test_data/MALExport.xml | 14491 ++++++++++++++++++++++++++ tests/test_data/jsonApiExample.json | 1152 ++ 2 files changed, 15643 insertions(+) create mode 100644 tests/test_data/MALExport.xml create mode 100644 tests/test_data/jsonApiExample.json diff --git a/tests/test_data/MALExport.xml b/tests/test_data/MALExport.xml new file mode 100644 index 00000000..fdfa4046 --- /dev/null +++ b/tests/test_data/MALExport.xml @@ -0,0 +1,14491 @@ + + + + + + + 315714 + timw4mail + 1 + 629 + 6 + 532 + 9 + 9 + 73 + + + + + 6682 + + TV + 12 + 26603827 + 12 + 0000-00-00 + 2010-12-10 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 49 + + OVA + 5 + 0 + 5 + 0000-00-00 + 2012-06-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 50 + + TV + 24 + 22401829 + 24 + 2010-07-01 + 0000-00-00 + + 10 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 304 + + Movie + 1 + 22401858 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 303 + + TV + 48 + 23881830 + 48 + 0000-00-00 + 2010-08-14 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 880 + + TV + 22 + 22401870 + 22 + 0000-00-00 + 2010-07-05 + + 10 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 2198 + + Special + 2 + 22671594 + 2 + 0000-00-00 + 2010-07-05 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 101 + + TV + 13 + 20183958 + 13 + 2010-04-10 + 2010-04-10 + + 10 + + Retail DVD + Completed + + 1 + + + 0 + 0 + 0 + + + + 656 + + Special + 2 + 20261101 + 2 + 0000-00-00 + 0000-00-00 + + 8 + + Retail DVD + Completed + + 0 + + + 0 + 0 + 0 + + + + 17082 + + TV + 12 + 0 + 12 + 2013-04-09 + 2013-06-25 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30123 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31173 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25013 + + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12149 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14941 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5112 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-04-11 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6287 + + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 47 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16201 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32828 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 591 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-07-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15085 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6547 + + TV + 13 + 0 + 13 + 0000-00-00 + 2011-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9989 + + TV + 11 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 11433 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-07-13 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11111 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21995 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 54 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7647 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-02 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9074 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-16 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 477 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 962 + + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 3297 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 492 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12581 + + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6166 + + TV + 12 + 32005693 + 12 + 0000-00-00 + 2011-05-15 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9736 + + TV + 12 + 31307082 + 12 + 0000-00-00 + 2011-06-26 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4999 + + TV + 12 + 31000809 + 12 + 0000-00-00 + 2011-04-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 66 + + TV + 26 + 20183989 + 26 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 1 + + + 0 + 0 + 0 + + + + 659 + + Special + 1 + 23321124 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1593 + + ONA + 1 + 23320976 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21185 + + TV + 25 + 0 + 25 + 0000-00-00 + 2014-09-21 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27663 + + TV + 25 + 0 + 25 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2251 + + TV + 13 + 25136301 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 6347 + + TV + 13 + 32647833 + 13 + 0000-00-00 + 2011-06-12 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5081 + + TV + 15 + 26694491 + 15 + 2010-11-16 + 2010-11-17 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 2986 + + TV + 26 + 26300283 + 26 + 2010-11-03 + 2010-11-06 + + 8 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 375 + + TV + 12 + 33320372 + 12 + 0000-00-00 + 2011-06-30 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3232 + + Special + 2 + 33466362 + 2 + 0000-00-00 + 2011-07-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22789 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 31904 + + TV + 10 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 13535 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 348 + + TV + 13 + 24382561 + 13 + 0000-00-00 + 2010-08-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 530 + + TV + 46 + 20184330 + 46 + 0000-00-00 + 0000-00-00 + + 8 + + Hard Drive + Completed + + 1 + + + 0 + 0 + 0 + + + + 14751 + + ONA + 26 + 0 + 26 + 2014-07-06 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31733 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 740 + + TV + 43 + 20184339 + 43 + 0000-00-00 + 0000-00-00 + + 7 + + Hard Drive + Completed + + 1 + + + 0 + 0 + 0 + + + + 2937 + + Special + 1 + 20250318 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 531 + + Movie + 1 + 20184479 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 532 + + TV + 38 + 20184342 + 38 + 0000-00-00 + 0000-00-00 + + 7 + + Hard Drive + Completed + + 1 + + + 0 + 0 + 0 + + + + 997 + + Movie + 1 + 20184498 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 1239 + + TV + 39 + 20251523 + 39 + 0000-00-00 + 0000-00-00 + + 5 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1278 + + Special + 1 + 20250361 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3076 + + Special + 3 + 20251535 + 3 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1240 + + Movie + 1 + 20184507 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 996 + + TV + 34 + 20184548 + 34 + 0000-00-00 + 2010-04-15 + + 8 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 22547 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-06-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31043 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31964 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16405 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10719 + + TV + 12 + 0 + 12 + 2014-07-31 + 2014-10-12 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 10897 + + OVA + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14967 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21405 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-22 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 357 + + OVA + 4 + 20184222 + 4 + 0000-00-00 + 0000-00-00 + + 7 + + Retail DVD + Completed + + 1 + + + 0 + 0 + 0 + + + + 2131 + + OVA + 2 + 20184230 + 2 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32866 + + TV + 12 + 0 + 9 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 15605 + + TV + 12 + 0 + 9 + 0000-00-00 + 0000-00-00 + + 7 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 1347 + + OVA + 8 + 0 + 8 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31478 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32867 + + TV + 12 + 0 + 6 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 1689 + + Movie + 3 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5356 + + TV + 13 + 26234706 + 13 + 0000-00-00 + 2010-10-30 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 694 + + TV + 24 + 29835975 + 24 + 0000-00-00 + 2011-03-17 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 232 + + TV + 70 + 0 + 70 + 2012-08-11 + 2012-10-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10012 + + OVA + 12 + 0 + 12 + 0000-00-00 + 2012-01-26 + + 10 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 28999 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6024 + + TV + 104 + 33566725 + 104 + 0000-00-00 + 2011-07-04 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14277 + + TV + 26 + 0 + 26 + 0000-00-00 + 2012-12-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 59 + + TV + 26 + 0 + 26 + 0000-00-00 + 2011-10-09 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16169 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-03-28 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 60 + + TV + 24 + 32602611 + 24 + 0000-00-00 + 2011-07-02 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6645 + + TV + 12 + 31441376 + 12 + 0000-00-00 + 2011-05-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14741 + + TV + 12 + 0 + 12 + 2013-01-26 + 2013-03-01 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18671 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2167 + + TV + 23 + 20793727 + 23 + 0000-00-00 + 2010-05-03 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 1723 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4181 + + TV + 24 + 25187604 + 24 + 0000-00-00 + 2010-09-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6351 + + Special + 1 + 25187605 + 1 + 0000-00-00 + 2010-09-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4059 + + Special + 1 + 22304652 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 30383 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1575 + + TV + 25 + 26107956 + 25 + 0000-00-00 + 2010-12-12 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2904 + + TV + 25 + 27382373 + 25 + 2010-12-14 + 2010-12-17 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31318 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 289 + + TV + 13 + 32602626 + 13 + 2011-06-04 + 2011-06-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10029 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 982 + + OVA + 3 + 33625874 + 3 + 0000-00-00 + 2011-07-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1 + + TV + 26 + 22802932 + 26 + 0000-00-00 + 2010-08-21 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5 + + Movie + 1 + 0 + 1 + 2012-09-29 + 2012-09-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12549 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-29 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29976 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 26349 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29067 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16355 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11843 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15583 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 1535 + + TV + 37 + 30307803 + 37 + 0000-00-00 + 2011-04-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24031 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8086 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 295 + + TV + 13 + 0 + 5 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 22733 + + TV + 51 + 0 + 51 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9330 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 28121 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6746 + + TV + 24 + 0 + 24 + 2012-11-14 + 2012-12-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27833 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23199 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27831 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14073 + + ONA + 10 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 788 + + OVA + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2759 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3784 + + Movie + 1 + 0 + 1 + 0000-00-00 + 2013-05-22 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3785 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 3167 + + ONA + 6 + 0 + 6 + 0000-00-00 + 2014-03-01 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 378 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15883 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14829 + + TV + 10 + 0 + 10 + 0000-00-00 + 2013-09-15 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27525 + + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20509 + + TV + 10 + 0 + 10 + 0000-00-00 + 2014-09-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12565 + + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 356 + + TV + 24 + 20184259 + 24 + 0000-00-00 + 0000-00-00 + + 10 + + Retail DVD + Completed + + 6 + + + 0 + 0 + 0 + + + + 25537 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6922 + + Movie + 1 + 20250413 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 22297 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27821 + + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28701 + + TV + 13 + 0 + 13 + 2015-04-03 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10087 + + TV + 13 + 0 + 13 + 0000-00-00 + 2011-12-31 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11741 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-07-01 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19165 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 13183 + + Special + 2 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5973 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 227 + + OVA + 6 + 30236601 + 6 + 0000-00-00 + 2011-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 120 + + TV + 26 + 26511482 + 26 + 0000-00-00 + 2010-11-12 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32696 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 71 + + TV + 24 + 20184275 + 24 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 4 + + + 0 + 0 + 0 + + + + 73 + + TV + 13 + 20184299 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 3 + + + 0 + 0 + 0 + + + + 1015 + + Special + 1 + 20184310 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 0 + + + 0 + 0 + 0 + + + + 72 + + TV + 12 + 20184288 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 4 + + + 0 + 0 + 0 + + + + 121 + + TV + 51 + 23076095 + 51 + 0000-00-00 + 2010-07-22 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5114 + + TV + 64 + 25136332 + 64 + 0000-00-00 + 2010-10-09 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 603 + + TV + 49 + 25136277 + 49 + 2010-11-14 + 2010-12-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22189 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-20 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4725 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 2890 + + Movie + 1 + 23882109 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24765 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 30544 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 383 + + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 653 + + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 655 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 13287 + + Special + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 652 + + TV + 9 + 0 + 9 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2206 + + Special + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 28907 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31637 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23289 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32607 + + TV + 12 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 16918 + + TV + 11 + 0 + 11 + 0000-00-00 + 2013-10-06 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19363 + + TV + 11 + 0 + 11 + 0000-00-00 + 2014-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1140 + + Movie + 1 + 22068693 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 241 + + TV + 11 + 0 + 11 + 0000-00-00 + 2012-09-15 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 487 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14131 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14811 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23079 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-09-25 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21273 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 456 + + TV + 26 + 25136305 + 26 + 0000-00-00 + 2010-10-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21431 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-06-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 268 + + OVA + 6 + 0 + 6 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17895 + + TV + 24 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 0 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 2494 + + TV + 12 + 29330183 + 12 + 0000-00-00 + 2011-02-19 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8425 + + TV + 24 + 0 + 24 + 0000-00-00 + 2013-02-16 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 245 + + TV + 43 + 24405846 + 43 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17729 + + TV + 13 + 0 + 13 + 0000-00-00 + 2015-01-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29093 + + Special + 1 + 0 + 1 + 0000-00-00 + 2015-04-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29095 + + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 134 + + TV + 13 + 23344353 + 13 + 0000-00-00 + 2010-08-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31630 + + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3299 + + TV + 12 + 31438351 + 12 + 0000-00-00 + 2011-04-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16 + + TV + 24 + 0 + 24 + 2012-11-30 + 2012-12-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1142 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-20 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 644 + + Special + 2 + 0 + 2 + 2012-12-09 + 2012-12-11 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30721 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6574 + + TV + 12 + 26603818 + 12 + 0000-00-00 + 2010-11-14 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21855 + + TV + 5 + 0 + 5 + 0000-00-00 + 2014-09-11 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5835 + + TV + 39 + 29437750 + 39 + 0000-00-00 + 2011-03-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32648 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1570 + + TV + 12 + 31354140 + 12 + 0000-00-00 + 2011-04-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30895 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2026 + + TV + 52 + 21677098 + 52 + 2010-06-05 + 2010-06-12 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 14653 + + TV + 12 + 0 + 12 + 2012-10-03 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16982 + + TV + 12 + 0 + 12 + 2013-04-08 + 2013-07-02 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4192 + + TV + 25 + 25136341 + 25 + 0000-00-00 + 2010-10-16 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15225 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-07-01 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 379 + + TV + 26 + 20184245 + 26 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5060 + + ONA + 52 + 24964761 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 27989 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31988 + + TV + 13 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 9 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 8630 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5630 + + TV + 11 + 25889880 + 11 + 0000-00-00 + 2010-10-23 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 6372 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6637 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 31500 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 934 + + TV + 26 + 20184844 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1889 + + TV + 24 + 20251580 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 22835 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28825 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 33421 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20853 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8426 + + TV + 11 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 10935 + + Special + 2 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 431 + + Movie + 1 + 0 + 1 + 2014-10-17 + 2014-10-17 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15377 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-06-22 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8277 + + TV + 12 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 4550 + + TV + 13 + 31309188 + 13 + 0000-00-00 + 2011-04-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7088 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-08-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 488 + + TV + 12 + 0 + 8 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 17831 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-09-22 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22123 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 249 + + TV + 167 + 32808219 + 167 + 0000-00-00 + 2012-03-14 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6811 + + TV + 26 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21327 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-23 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9750 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-09-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10357 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-17 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29785 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14719 + + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 20899 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 863 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-03-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5680 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7791 + + TV + 26 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15391 + + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16664 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 427 + + TV + 51 + 0 + 51 + 0000-00-00 + 2012-04-07 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 428 + + OVA + 1 + 0 + 1 + 0000-00-00 + 2012-04-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8525 + + TV + 12 + 31395677 + 12 + 0000-00-00 + 2011-04-26 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10080 + + TV + 12 + 31434923 + 12 + 0000-00-00 + 2011-06-27 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16706 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-07 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21563 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-22 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10372 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14713 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-12-28 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 25681 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16009 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5914 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3958 + + TV + 13 + 25087416 + 13 + 0000-00-00 + 2010-09-22 + + 9 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 5978 + + Special + 1 + 0 + 1 + 0000-00-00 + 2012-03-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19685 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-07-02 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3503 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-04-09 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2593 + + Movie + 1 + 0 + 1 + 0000-00-00 + 2012-12-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3782 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3783 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4280 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4282 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5204 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5205 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14807 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6954 + + Special + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 145 + + TV + 26 + 22401816 + 26 + 0000-00-00 + 2010-06-29 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 7711 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 667 + + TV + 12 + 0 + 12 + 2012-04-21 + 2012-04-23 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1691 + + TV + 24 + 0 + 24 + 2012-04-28 + 2012-04-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 572 + + Movie + 1 + 20249809 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16662 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6205 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-04 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10076 + + Special + 2 + 0 + 2 + 0000-00-00 + 2014-04-18 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3464 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 516 + + TV + 358 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 18679 + + TV + 24 + 0 + 24 + 0000-00-00 + 2014-06-27 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 6045 + + TV + 25 + 0 + 25 + 2012-11-08 + 2012-11-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9656 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-03 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10152 + + Special + 1 + 0 + 1 + 0000-00-00 + 2012-11-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16732 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-09-21 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18495 + + TV + 12 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 4 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 31798 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9260 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5678 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 11887 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-10-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31091 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31952 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13367 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30831 + + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8841 + + TV + 12 + 29248692 + 12 + 0000-00-00 + 2011-04-04 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10790 + + TV + 10 + 0 + 10 + 0000-00-00 + 2013-01-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15379 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-29 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31804 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8129 + + TV + 11 + 0 + 11 + 0000-00-00 + 2012-06-29 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4898 + + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24011 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 97 + + TV + 26 + 20184563 + 26 + 0000-00-00 + 0000-00-00 + + 10 + + Retail DVD + Completed + + 0 + + + 0 + 0 + 0 + + + + 13655 + + TV + 26 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 14349 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19489 + + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 17265 + + TV + 25 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 189 + + TV + 24 + 0 + 24 + 0000-00-00 + 2014-06-20 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 963 + + Special + 1 + 0 + 1 + 0000-00-00 + 2014-06-20 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16353 + + TV + 13 + 0 + 13 + 2013-11-23 + 2014-01-04 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15051 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-04-02 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19111 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-06-30 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1887 + + TV + 24 + 20184007 + 24 + 2010-04-24 + 2010-04-25 + + 10 + + Retail DVD + Completed + + 2 + + + 0 + 0 + 0 + + + + 4472 + + OVA + 1 + 20916942 + 1 + 0000-00-00 + 2010-05-08 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 193 + + TV + 24 + 30620181 + 24 + 2011-04-06 + 2011-04-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 157 + + TV + 26 + 29148397 + 26 + 0000-00-00 + 2011-02-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19769 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 76 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9756 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-05-02 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 33795 + + TV + 12 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 21421 + + TV + 26 + 0 + 26 + 0000-00-00 + 2014-09-30 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20785 + + TV + 26 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10213 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21835 + + TV + 52 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 512 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16890 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-12 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 860 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21863 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-23 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14045 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-03-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14833 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5030 + + TV + 12 + 34568383 + 12 + 2011-07-21 + 2011-07-23 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 9712 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10397 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32438 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11761 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-10-27 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14527 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 330 + + TV + 13 + 0 + 13 + 0000-00-00 + 2011-11-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20541 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-28 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 26085 + + TV + 12 + 0 + 12 + 0000-00-00 + 2015-03-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 585 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20033 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-01-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30384 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31560 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7627 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-04-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9510 + + TV + 8 + 0 + 8 + 0000-00-00 + 2013-04-13 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8424 + + TV + 12 + 32481308 + 12 + 0000-00-00 + 2011-06-04 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22225 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-23 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15315 + + TV + 10 + 0 + 10 + 0000-00-00 + 2013-03-17 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17074 + + TV + 26 + 0 + 26 + 0000-00-00 + 2014-02-12 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 164 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30307 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9181 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 8917 + + TV + 26 + 0 + 26 + 2012-01-07 + 2012-07-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31442 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1738 + + TV + 12 + 0 + 12 + 2012-11-22 + 2012-12-02 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2926 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 26351 + + TV + 16 + 0 + 16 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16910 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 776 + + TV + 12 + 24619317 + 12 + 2010-09-04 + 2010-09-06 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5865 + + Special + 1 + 24619322 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13585 + + TV + 11 + 0 + 11 + 0000-00-00 + 2012-10-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12467 + + TV + 13 + 0 + 13 + 2012-08-01 + 2012-08-03 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1546 + + TV + 26 + 30324894 + 26 + 0000-00-00 + 2011-04-02 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 597 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9934 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15689 + + TV + 4 + 0 + 4 + 0000-00-00 + 2013-07-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30 + + TV + 26 + 20185747 + 26 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 32 + + Movie + 1 + 20185756 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31404 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1210 + + TV + 24 + 20185817 + 24 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10165 + + TV + 26 + 31795187 + 26 + 0000-00-00 + 2011-09-25 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 229 + + TV + 12 + 20366516 + 12 + 0000-00-00 + 2010-05-19 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 18897 + + TV + 20 + 0 + 20 + 0000-00-00 + 2014-05-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27787 + + TV + 12 + 0 + 12 + 2015-04-11 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30514 + + ONA + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 11597 + + TV + 11 + 0 + 11 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19815 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-25 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 20507 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30503 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 615 + + OVA + 5 + 31681730 + 5 + 0000-00-00 + 2011-05-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 920 + + Special + 1 + 31778587 + 1 + 0000-00-00 + 2011-05-07 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6512 + + TV + 12 + 33968115 + 12 + 0000-00-00 + 2011-07-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5957 + + ONA + 13 + 0 + 13 + 0000-00-00 + 2012-03-07 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11933 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2152 + + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 28819 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6324 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-08-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21557 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30276 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20931 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-27 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14199 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-28 + + 8 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 31143 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12355 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23673 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2966 + + TV + 13 + 25136296 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5341 + + TV + 12 + 0 + 12 + 0000-00-00 + 2015-04-11 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32729 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28297 + + TV + 24 + 0 + 24 + 2015-04-11 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8769 + + TV + 12 + 26503760 + 12 + 0000-00-00 + 2010-12-24 + + 10 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 10020 + + ONA + 4 + 0 + 4 + 0000-00-00 + 2011-10-14 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 13659 + + TV + 13 + 0 + 13 + 2013-04-07 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18857 + + ONA + 3 + 0 + 3 + 0000-00-00 + 2013-08-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14749 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19221 + + TV + 10 + 0 + 10 + 0000-00-00 + 2014-01-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24705 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32013 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 785 + + OVA + 2 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 1569 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-14 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 853 + + TV + 26 + 29731889 + 26 + 0000-00-00 + 2011-03-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29803 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31181 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11179 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1943 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 326 + + TV + 4 + 0 + 4 + 2012-11-12 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16397 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 328 + + TV + 10 + 20366535 + 10 + 0000-00-00 + 2010-05-18 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27775 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10711 + + ONA + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 527 + + TV + 276 + 0 + 276 + 0000-00-00 + 2014-07-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20159 + + Special + 4 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 610 + + TV + 12 + 20956003 + 12 + 0000-00-00 + 2010-05-08 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12021 + + TV + 52 + 0 + 52 + 0000-00-00 + 2012-12-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 721 + + TV + 38 + 31019740 + 38 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 327 + + TV + 26 + 25136273 + 26 + 0000-00-00 + 2010-09-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21325 + + TV + 15 + 0 + 15 + 0000-00-00 + 2014-04-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32360 + + TV + 12 + 0 + 7 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 6633 + + TV + 12 + 0 + 12 + 2012-11-17 + 2013-02-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11859 + + TV + 12 + 0 + 12 + 2012-11-07 + 2012-11-13 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10611 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 209 + + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 758 + + Movie + 1 + 20249926 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23309 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-22 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30296 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 210 + + TV + 161 + 20184420 + 161 + 0000-00-00 + 0000-00-00 + + 9 + + Hard Drive + Completed + + 5 + + + 0 + 0 + 0 + + + + 1007 + + OVA + 6 + 20264461 + 6 + 2010-04-18 + 2010-04-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1008 + + OVA + 2 + 20264544 + 2 + 2010-04-19 + 2010-04-19 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1011 + + OVA + 3 + 20264473 + 3 + 2010-04-19 + 2010-04-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1010 + + Movie + 1 + 20264562 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 418 + + Movie + 1 + 20388710 + 1 + 0000-00-00 + 2010-04-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 792 + + Movie + 1 + 20264528 + 1 + 0000-00-00 + 2010-04-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25859 + + TV + 13 + 0 + 13 + 2015-04-04 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31240 + + TV + 25 + 0 + 25 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11491 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18099 + + TV + 12 + 0 + 12 + 2013-07-12 + 2013-09-28 + + 0 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13377 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-02 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1601 + + TV + 22 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 30015 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 31716 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4618 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 980 + + TV + 26 + 0 + 26 + 0000-00-00 + 2013-04-13 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28497 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22865 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1699 + + TV + 24 + 22429108 + 24 + 0000-00-00 + 2010-07-06 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 2993 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4214 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 64 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 65 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 21561 + + TV + 11 + 0 + 11 + 0000-00-00 + 2014-06-19 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20709 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-23 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23277 + + TV + 12 + 0 + 12 + 0000-00-00 + 2015-03-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29317 + + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30749 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17777 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-23 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3772 + + TV + 25 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32542 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20047 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30187 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13759 + + TV + 24 + 0 + 24 + 0000-00-00 + 2013-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11499 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 7588 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6203 + + TV + 13 + 0 + 13 + 2012-07-02 + 2012-07-03 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1881 + + TV + 13 + 33325082 + 13 + 0000-00-00 + 2011-06-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1882 + + TV + 13 + 33450610 + 13 + 2011-07-02 + 2011-07-10 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22877 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5909 + + TV + 12 + 0 + 12 + 0000-00-00 + 2013-01-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10464 + + ONA + 10 + 0 + 10 + 0000-00-00 + 2013-03-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11763 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-01-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4063 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-10-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31540 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22273 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 199 + + Movie + 1 + 31610471 + 1 + 0000-00-00 + 2011-05-01 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12611 + + TV + 26 + 0 + 26 + 0000-00-00 + 2012-09-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10308 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 15119 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 533 + + TV + 13 + 0 + 13 + 2012-04-11 + 2012-04-23 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 339 + + TV + 13 + 20184794 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18119 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-09-28 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2104 + + TV + 26 + 26108242 + 26 + 0000-00-00 + 2010-10-28 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 355 + + TV + 24 + 0 + 24 + 0000-00-00 + 2012-05-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2787 + + TV + 24 + 0 + 24 + 2012-11-23 + 2013-05-19 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6773 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 23273 + + TV + 22 + 0 + 22 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29786 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 538 + + TV + 26 + 32030015 + 26 + 0000-00-00 + 2011-05-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16498 + + TV + 25 + 0 + 25 + 0000-00-00 + 2014-07-09 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 169 + + TV + 12 + 20184809 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + Retail DVD + Completed + + 2 + + + 0 + 0 + 0 + + + + 1727 + + TV + 12 + 0 + 12 + 2012-11-13 + 2012-11-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23233 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30363 + + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8557 + + TV + 12 + 29900617 + 12 + 0000-00-00 + 2011-03-15 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 9888 + + Special + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10378 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13125 + + TV + 25 + 0 + 25 + 0000-00-00 + 2013-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25835 + + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12815 + + TV + 50 + 0 + 50 + 0000-00-00 + 2013-06-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32175 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28735 + + TV + 13 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 79 + + TV + 24 + 25136285 + 24 + 0000-00-00 + 2010-11-09 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2923 + + TV + 51 + 27487568 + 51 + 0000-00-00 + 2010-12-23 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7082 + + TV + 25 + 27609373 + 25 + 0000-00-00 + 2011-01-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5262 + + TV + 51 + 27609368 + 51 + 2010-12-24 + 2010-12-31 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 836 + + TV + 26 + 25136292 + 26 + 2010-12-23 + 2011-01-15 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4722 + + TV + 25 + 28769373 + 25 + 0000-00-00 + 2011-01-30 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 534 + + TV + 26 + 27344992 + 26 + 0000-00-00 + 2011-01-11 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 535 + + TV + 26 + 31592163 + 26 + 0000-00-00 + 2011-05-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1172 + + TV + 26 + 31592199 + 26 + 0000-00-00 + 2011-06-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12191 + + TV + 48 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 6802 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 20555 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-25 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1816 + + TV + 78 + 20185905 + 78 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 23209 + + TV + 13 + 0 + 13 + 0000-00-00 + 2015-01-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5958 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8407 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 22101 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3588 + + TV + 51 + 30307813 + 51 + 2011-04-11 + 2011-04-20 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21507 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 17849 + + TV + 12 + 0 + 12 + 2013-04-09 + 2013-06-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8934 + + TV + 25 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 9253 + + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10863 + + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17821 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-10-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21067 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-27 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3667 + + TV + 12 + 23344462 + 12 + 2010-07-28 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6381 + + TV + 12 + 29293505 + 12 + 0000-00-00 + 2011-02-19 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28621 + + TV + 11 + 0 + 11 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1582 + + OVA + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14289 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-12-29 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5681 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 7311 + + Movie + 1 + 20250504 + 1 + 0000-00-00 + 2010-12-29 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 849 + + TV + 14 + 20184737 + 14 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 4 + + + 0 + 0 + 0 + + + + 4382 + + TV + 14 + 20184744 + 14 + 0000-00-00 + 2010-09-19 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 5118 + + ONA + 25 + 20279286 + 25 + 2010-04-25 + 2010-04-25 + + 7 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 11757 + + TV + 25 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 21881 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 29758 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1577 + + OVA + 4 + 21369063 + 4 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 1372 + + TV + 47 + 21096743 + 47 + 0000-00-00 + 2010-09-24 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 2011 + + TV + 20 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3000 + + TV + 23 + 27959173 + 23 + 2011-01-03 + 2011-01-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6312 + + Special + 1 + 27959177 + 1 + 0000-00-00 + 2011-01-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4162 + + Special + 1 + 21531554 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2014 + + TV + 26 + 27225301 + 26 + 2010-12-08 + 2010-12-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16417 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32093 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13333 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-09-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 696 + + TV + 26 + 0 + 26 + 0000-00-00 + 2013-05-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 539 + + OVA + 6 + 31915233 + 6 + 0000-00-00 + 2011-05-12 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 540 + + OVA + 6 + 31915238 + 6 + 2011-05-12 + 2011-05-15 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10351 + + Special + 1 + 31915243 + 1 + 0000-00-00 + 2011-05-15 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2001 + + TV + 27 + 22802923 + 27 + 2010-07-29 + 0000-00-00 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 513 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3974 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 3455 + + TV + 26 + 22428941 + 26 + 0000-00-00 + 2010-07-04 + + 8 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 13663 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5667 + + OVA + 6 + 0 + 6 + 2014-08-01 + 2014-08-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6213 + + TV + 24 + 0 + 24 + 0000-00-00 + 2013-03-02 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16049 + + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 4654 + + TV + 24 + 0 + 19 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 2236 + + Movie + 1 + 20276937 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1043 + + OVA + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6211 + + TV + 11 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 687 + + TV + 52 + 0 + 52 + 2013-01-01 + 2013-01-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14227 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-12-24 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18139 + + TV + 21 + 0 + 21 + 0000-00-00 + 2014-05-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 523 + + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4224 + + TV + 25 + 0 + 25 + 0000-00-00 + 2012-04-16 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 6 + + TV + 26 + 23589390 + 26 + 0000-00-00 + 2010-10-31 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25157 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 343 + + TV + 25 + 20184781 + 25 + 0000-00-00 + 0000-00-00 + + 10 + + Retail DVD + Completed + + 5 + + + 0 + 0 + 0 + + + + 2580 + + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32681 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12317 + + ONA + 10 + 0 + 10 + 0000-00-00 + 2012-07-07 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1293 + + TV + 195 + 0 + 195 + 0000-00-00 + 2012-08-11 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10162 + + TV + 11 + 0 + 11 + 0000-00-00 + 2012-07-18 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3457 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4752 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 180 + + TV + 13 + 22401884 + 13 + 2010-06-29 + 2010-06-29 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 1111 + + OVA + 1 + 22465543 + 1 + 0000-00-00 + 2010-06-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1112 + + OVA + 1 + 22465548 + 1 + 0000-00-00 + 2010-06-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 181 + + TV + 13 + 22465553 + 13 + 2010-06-30 + 2010-06-30 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 1607 + + TV + 12 + 23344486 + 12 + 2010-07-26 + 0000-00-00 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 14283 + + TV + 12 + 0 + 12 + 2013-05-23 + 2013-06-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31439 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3322 + + TV + 24 + 0 + 24 + 0000-00-00 + 2013-02-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30355 + + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 19023 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-31 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21189 + + Movie + 1 + 0 + 1 + 0000-00-00 + 2014-01-20 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19151 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-02-15 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16742 + + TV + 12 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 21085 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22117 + + OVA + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 935 + + TV + 24 + 22429124 + 24 + 0000-00-00 + 2010-07-17 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 6956 + + TV + 13 + 30953325 + 13 + 0000-00-00 + 2011-04-14 + + 10 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 25879 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31715 + + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10521 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 14813 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28677 + + TV + 12 + 0 + 12 + 2015-04-18 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5454 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-08-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7762 + + OVA + 4 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10216 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16241 + + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18179 + + TV + 38 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 8 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 550 + + TV + 27 + 0 + 27 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10495 + + TV + 12 + 0 + 12 + 0000-00-00 + 2011-09-20 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30279 + + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12403 + + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-17 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14693 + + TV + 13 + 0 + 13 + 0000-00-00 + 2012-09-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18677 + + TV + 12 + 0 + 12 + 0000-00-00 + 2014-01-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15911 + + TV + 12 + 0 + 12 + 2013-04-09 + 2013-06-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1195 + + TV + 13 + 0 + 13 + 0000-00-00 + 2014-04-06 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11319 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 1840 + + TV + 12 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 3712 + + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 17681 + + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-07 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + \ No newline at end of file diff --git a/tests/test_data/jsonApiExample.json b/tests/test_data/jsonApiExample.json new file mode 100644 index 00000000..9edb991d --- /dev/null +++ b/tests/test_data/jsonApiExample.json @@ -0,0 +1,1152 @@ +{ + "data": [{ + "id": "13016665", + "type": "libraryEntries", + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665" + }, + "attributes": { + "status": "completed", + "progress": 13, + "reconsuming": false, + "reconsumeCount": 0, + "notes": "", + "private": false, + "rating": "4.5", + "updatedAt": "2017-01-10T02:00:25.890Z" + }, + "relationships": { + "user": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/user", + "related": "https://kitsu.io/api/edge/library-entries/13016665/user" + } + }, + "anime": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/anime", + "related": "https://kitsu.io/api/edge/library-entries/13016665/anime" + } + }, + "manga": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/manga", + "related": "https://kitsu.io/api/edge/library-entries/13016665/manga" + } + }, + "drama": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/drama", + "related": "https://kitsu.io/api/edge/library-entries/13016665/drama" + } + }, + "review": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/review", + "related": "https://kitsu.io/api/edge/library-entries/13016665/review" + } + }, + "media": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/media", + "related": "https://kitsu.io/api/edge/library-entries/13016665/media" + }, + "data": { + "type": "anime", + "id": "11474" + } + }, + "unit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/unit", + "related": "https://kitsu.io/api/edge/library-entries/13016665/unit" + } + }, + "nextUnit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/13016665/relationships/next-unit", + "related": "https://kitsu.io/api/edge/library-entries/13016665/next-unit" + } + } + } + }, { + "id": "9825168", + "type": "libraryEntries", + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168" + }, + "attributes": { + "status": "completed", + "progress": 1, + "reconsuming": false, + "reconsumeCount": 0, + "notes": null, + "private": false, + "rating": "3.5", + "updatedAt": "2017-01-06T02:56:23.973Z" + }, + "relationships": { + "user": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/user", + "related": "https://kitsu.io/api/edge/library-entries/9825168/user" + } + }, + "anime": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/anime", + "related": "https://kitsu.io/api/edge/library-entries/9825168/anime" + } + }, + "manga": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/manga", + "related": "https://kitsu.io/api/edge/library-entries/9825168/manga" + } + }, + "drama": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/drama", + "related": "https://kitsu.io/api/edge/library-entries/9825168/drama" + } + }, + "review": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/review", + "related": "https://kitsu.io/api/edge/library-entries/9825168/review" + } + }, + "media": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/media", + "related": "https://kitsu.io/api/edge/library-entries/9825168/media" + }, + "data": { + "type": "anime", + "id": "10802" + } + }, + "unit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/unit", + "related": "https://kitsu.io/api/edge/library-entries/9825168/unit" + } + }, + "nextUnit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/9825168/relationships/next-unit", + "related": "https://kitsu.io/api/edge/library-entries/9825168/next-unit" + } + } + } + }, { + "id": "14341603", + "type": "libraryEntries", + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603" + }, + "attributes": { + "status": "completed", + "progress": 12, + "reconsuming": false, + "reconsumeCount": 0, + "notes": null, + "private": false, + "rating": "4.0", + "updatedAt": "2017-01-01T21:54:17.368Z" + }, + "relationships": { + "user": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/user", + "related": "https://kitsu.io/api/edge/library-entries/14341603/user" + } + }, + "anime": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/anime", + "related": "https://kitsu.io/api/edge/library-entries/14341603/anime" + } + }, + "manga": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/manga", + "related": "https://kitsu.io/api/edge/library-entries/14341603/manga" + } + }, + "drama": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/drama", + "related": "https://kitsu.io/api/edge/library-entries/14341603/drama" + } + }, + "review": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/review", + "related": "https://kitsu.io/api/edge/library-entries/14341603/review" + } + }, + "media": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/media", + "related": "https://kitsu.io/api/edge/library-entries/14341603/media" + }, + "data": { + "type": "anime", + "id": "11887" + } + }, + "unit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/unit", + "related": "https://kitsu.io/api/edge/library-entries/14341603/unit" + } + }, + "nextUnit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341603/relationships/next-unit", + "related": "https://kitsu.io/api/edge/library-entries/14341603/next-unit" + } + } + } + }, { + "id": "14341572", + "type": "libraryEntries", + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572" + }, + "attributes": { + "status": "completed", + "progress": 13, + "reconsuming": false, + "reconsumeCount": 0, + "notes": "", + "private": false, + "rating": "4.5", + "updatedAt": "2017-01-01T21:04:03.487Z" + }, + "relationships": { + "user": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/user", + "related": "https://kitsu.io/api/edge/library-entries/14341572/user" + } + }, + "anime": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/anime", + "related": "https://kitsu.io/api/edge/library-entries/14341572/anime" + } + }, + "manga": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/manga", + "related": "https://kitsu.io/api/edge/library-entries/14341572/manga" + } + }, + "drama": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/drama", + "related": "https://kitsu.io/api/edge/library-entries/14341572/drama" + } + }, + "review": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/review", + "related": "https://kitsu.io/api/edge/library-entries/14341572/review" + } + }, + "media": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/media", + "related": "https://kitsu.io/api/edge/library-entries/14341572/media" + }, + "data": { + "type": "anime", + "id": "12024" + } + }, + "unit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/unit", + "related": "https://kitsu.io/api/edge/library-entries/14341572/unit" + } + }, + "nextUnit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341572/relationships/next-unit", + "related": "https://kitsu.io/api/edge/library-entries/14341572/next-unit" + } + } + } + }, { + "id": "14341590", + "type": "libraryEntries", + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590" + }, + "attributes": { + "status": "completed", + "progress": 12, + "reconsuming": false, + "reconsumeCount": 0, + "notes": null, + "private": false, + "rating": "4.0", + "updatedAt": "2017-01-01T20:58:23.974Z" + }, + "relationships": { + "user": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/user", + "related": "https://kitsu.io/api/edge/library-entries/14341590/user" + } + }, + "anime": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/anime", + "related": "https://kitsu.io/api/edge/library-entries/14341590/anime" + } + }, + "manga": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/manga", + "related": "https://kitsu.io/api/edge/library-entries/14341590/manga" + } + }, + "drama": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/drama", + "related": "https://kitsu.io/api/edge/library-entries/14341590/drama" + } + }, + "review": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/review", + "related": "https://kitsu.io/api/edge/library-entries/14341590/review" + } + }, + "media": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/media", + "related": "https://kitsu.io/api/edge/library-entries/14341590/media" + }, + "data": { + "type": "anime", + "id": "12465" + } + }, + "unit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/unit", + "related": "https://kitsu.io/api/edge/library-entries/14341590/unit" + } + }, + "nextUnit": { + "links": { + "self": "https://kitsu.io/api/edge/library-entries/14341590/relationships/next-unit", + "related": "https://kitsu.io/api/edge/library-entries/14341590/next-unit" + } + } + } + }], + "included": [{ + "id": "11474", + "type": "anime", + "links": { + "self": "https://kitsu.io/api/edge/anime/11474" + }, + "attributes": { + "slug": "hibike-euphonium-2", + "synopsis": "Second season of Hibike! Euphonium.", + "coverImageTopOffset": 120, + "titles": { + "en": "Sound! Euphonium 2", + "en_jp": "Hibike! Euphonium 2", + "ja_jp": "響け!ユーフォニアム 2" + }, + "canonicalTitle": "Hibike! Euphonium 2", + "abbreviatedTitles": null, + "averageRating": 4.16843264284762, + "ratingFrequencies": { + "0.5": "1", + "1.0": "1", + "1.5": "2", + "2.0": "8", + "2.5": "13", + "3.0": "42", + "3.5": "90", + "4.0": "193", + "4.5": "180", + "5.0": "193", + "nil": "1972" + }, + "startDate": "2016-10-06", + "endDate": null, + "posterImage": { + "tiny": "https://media.kitsu.io/anime/poster_images/11474/tiny.jpg?1470781430", + "small": "https://media.kitsu.io/anime/poster_images/11474/small.jpg?1470781430", + "medium": "https://media.kitsu.io/anime/poster_images/11474/medium.jpg?1470781430", + "large": "https://media.kitsu.io/anime/poster_images/11474/large.jpg?1470781430", + "original": "https://media.kitsu.io/anime/poster_images/11474/original.jpg?1470781430" + }, + "coverImage": { + "small": "https://media.kitsu.io/anime/cover_images/11474/small.jpg?1476203965", + "large": "https://media.kitsu.io/anime/cover_images/11474/large.jpg?1476203965", + "original": "https://media.kitsu.io/anime/cover_images/11474/original.jpg?1476203965" + }, + "episodeCount": 13, + "episodeLength": 25, + "subtype": "TV", + "youtubeVideoId": "d2Di5swwzxg", + "ageRating": "PG", + "ageRatingGuide": "", + "showType": "TV", + "nsfw": false + }, + "relationships": { + "genres": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/genres", + "related": "https://kitsu.io/api/edge/anime/11474/genres" + }, + "data": [{ + "type": "genres", + "id": "24" + }, { + "type": "genres", + "id": "35" + }, { + "type": "genres", + "id": "4" + }] + }, + "castings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/castings", + "related": "https://kitsu.io/api/edge/anime/11474/castings" + } + }, + "installments": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/installments", + "related": "https://kitsu.io/api/edge/anime/11474/installments" + } + }, + "mappings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/mappings", + "related": "https://kitsu.io/api/edge/anime/11474/mappings" + }, + "data": [{ + "type": "mappings", + "id": "3155" + }] + }, + "reviews": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/reviews", + "related": "https://kitsu.io/api/edge/anime/11474/reviews" + } + }, + "episodes": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/episodes", + "related": "https://kitsu.io/api/edge/anime/11474/episodes" + } + }, + "streamingLinks": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11474/relationships/streaming-links", + "related": "https://kitsu.io/api/edge/anime/11474/streaming-links" + } + } + } + }, { + "id": "10802", + "type": "anime", + "links": { + "self": "https://kitsu.io/api/edge/anime/10802" + }, + "attributes": { + "slug": "nisekoimonogatari", + "synopsis": "Trailer for a fake anime created by Shaft as an April Fool's Day joke.", + "coverImageTopOffset": 80, + "titles": { + "en": "", + "en_jp": "Nisekoimonogatari", + "ja_jp": "" + }, + "canonicalTitle": "Nisekoimonogatari", + "abbreviatedTitles": null, + "averageRating": 3.48579934352873, + "ratingFrequencies": { + "0.5": "22", + "1.0": "10", + "1.5": "16", + "2.0": "32", + "2.5": "74", + "3.0": "97", + "3.5": "118", + "4.0": "72", + "4.5": "34", + "5.0": "136", + "nil": "597", + "0.89": "-1", + "3.63": "-1", + "4.11": "-1", + "0.068": "-1", + "0.205": "-1", + "0.274": "-2", + "0.479": "-1", + "0.548": "-1", + "1.096": "-2", + "1.164": "-1", + "1.438": "-1", + "1.918": "-1", + "2.055": "-1", + "3.973": "-1", + "4.178": "-3", + "4.247": "-1", + "4.726": "-1", + "4.932": "-3", + "1.0958904109589": "3", + "0.89041095890411": "2", + "1.02739726027397": "1", + "1.16438356164384": "2", + "1.43835616438356": "2", + "1.57534246575342": "1", + "1.91780821917808": "1", + "2.05479452054794": "2", + "2.12328767123288": "1", + "2.73972602739726": "1", + "2.80821917808219": "2", + "2.94520547945205": "1", + "3.15068493150685": "1", + "3.35616438356164": "2", + "3.63013698630137": "2", + "3.97260273972603": "1", + "4.10958904109589": "2", + "4.17808219178082": "3", + "4.24657534246575": "1", + "4.38356164383562": "2", + "4.65753424657534": "1", + "4.72602739726027": "2", + "4.86301369863014": "1", + "4.93150684931507": "10", + "0.205479452054795": "1", + "0.273972602739726": "2", + "0.479452054794521": "2", + "0.547945205479452": "2", + "0.753424657534246": "1", + "0.0684931506849315": "1" + }, + "startDate": "2015-04-01", + "endDate": null, + "posterImage": { + "tiny": "https://media.kitsu.io/anime/poster_images/10802/tiny.jpg?1427974534", + "small": "https://media.kitsu.io/anime/poster_images/10802/small.jpg?1427974534", + "medium": "https://media.kitsu.io/anime/poster_images/10802/medium.jpg?1427974534", + "large": "https://media.kitsu.io/anime/poster_images/10802/large.jpg?1427974534", + "original": "https://media.kitsu.io/anime/poster_images/10802/original.jpg?1427974534" + }, + "coverImage": { + "small": "https://media.kitsu.io/anime/cover_images/10802/small.jpg?1427928458", + "large": "https://media.kitsu.io/anime/cover_images/10802/large.jpg?1427928458", + "original": "https://media.kitsu.io/anime/cover_images/10802/original.jpg?1427928458" + }, + "episodeCount": 1, + "episodeLength": 1, + "subtype": "ONA", + "youtubeVideoId": "", + "ageRating": "PG", + "ageRatingGuide": "Teens 13 or older", + "showType": "ONA", + "nsfw": false + }, + "relationships": { + "genres": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/genres", + "related": "https://kitsu.io/api/edge/anime/10802/genres" + }, + "data": [{ + "type": "genres", + "id": "3" + }] + }, + "castings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/castings", + "related": "https://kitsu.io/api/edge/anime/10802/castings" + } + }, + "installments": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/installments", + "related": "https://kitsu.io/api/edge/anime/10802/installments" + } + }, + "mappings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/mappings", + "related": "https://kitsu.io/api/edge/anime/10802/mappings" + }, + "data": [{ + "type": "mappings", + "id": "1755" + }] + }, + "reviews": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/reviews", + "related": "https://kitsu.io/api/edge/anime/10802/reviews" + } + }, + "episodes": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/episodes", + "related": "https://kitsu.io/api/edge/anime/10802/episodes" + } + }, + "streamingLinks": { + "links": { + "self": "https://kitsu.io/api/edge/anime/10802/relationships/streaming-links", + "related": "https://kitsu.io/api/edge/anime/10802/streaming-links" + } + } + } + }, { + "id": "11887", + "type": "anime", + "links": { + "self": "https://kitsu.io/api/edge/anime/11887" + }, + "attributes": { + "slug": "brave-witches", + "synopsis": "In September 1944, allied forces led by the 501st Joint Fighter Wing \"Strike Witches\" successfully eliminate the Neuroi threat from the skies of the Republic of Gallia, thus ensuring the security of western Europe. Taking advantage of this victory, allied forces begin a full-fledged push toward central and eastern Europe. From a base in Petersburg in the Empire of Orussia, the 502nd Joint Fighter Wing \"Brave Witches,\" upon whom mankind has placed its hopes, flies with courage in the cold skies of eastern Europe.\n\n(Source: MAL News)", + "coverImageTopOffset": 380, + "titles": { + "en": "", + "en_jp": "Brave Witches", + "ja_jp": "ブレイブウィッチーズ" + }, + "canonicalTitle": "Brave Witches", + "abbreviatedTitles": null, + "averageRating": 3.58468881638491, + "ratingFrequencies": { + "0.5": "1", + "1.0": "4", + "1.5": "8", + "2.0": "12", + "2.5": "17", + "3.0": "33", + "3.5": "41", + "4.0": "32", + "4.5": "9", + "5.0": "19", + "nil": "620" + }, + "startDate": "2016-10-06", + "endDate": null, + "posterImage": { + "tiny": "https://media.kitsu.io/anime/poster_images/11887/tiny.jpg?1476481854", + "small": "https://media.kitsu.io/anime/poster_images/11887/small.jpg?1476481854", + "medium": "https://media.kitsu.io/anime/poster_images/11887/medium.jpg?1476481854", + "large": "https://media.kitsu.io/anime/poster_images/11887/large.jpg?1476481854", + "original": "https://media.kitsu.io/anime/poster_images/11887/original.png?1476481854" + }, + "coverImage": { + "small": "https://media.kitsu.io/anime/cover_images/11887/small.jpg?1479834725", + "large": "https://media.kitsu.io/anime/cover_images/11887/large.jpg?1479834725", + "original": "https://media.kitsu.io/anime/cover_images/11887/original.jpg?1479834725" + }, + "episodeCount": 12, + "episodeLength": 24, + "subtype": "TV", + "youtubeVideoId": "VLUqd-jEBuE", + "ageRating": "R", + "ageRatingGuide": "Mild Nudity", + "showType": "TV", + "nsfw": false + }, + "relationships": { + "genres": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/genres", + "related": "https://kitsu.io/api/edge/anime/11887/genres" + }, + "data": [{ + "type": "genres", + "id": "5" + }, { + "type": "genres", + "id": "8" + }, { + "type": "genres", + "id": "28" + }, { + "type": "genres", + "id": "1" + }, { + "type": "genres", + "id": "25" + }] + }, + "castings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/castings", + "related": "https://kitsu.io/api/edge/anime/11887/castings" + } + }, + "installments": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/installments", + "related": "https://kitsu.io/api/edge/anime/11887/installments" + } + }, + "mappings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/mappings", + "related": "https://kitsu.io/api/edge/anime/11887/mappings" + }, + "data": [{ + "type": "mappings", + "id": "2593" + }] + }, + "reviews": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/reviews", + "related": "https://kitsu.io/api/edge/anime/11887/reviews" + } + }, + "episodes": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/episodes", + "related": "https://kitsu.io/api/edge/anime/11887/episodes" + } + }, + "streamingLinks": { + "links": { + "self": "https://kitsu.io/api/edge/anime/11887/relationships/streaming-links", + "related": "https://kitsu.io/api/edge/anime/11887/streaming-links" + } + } + } + }, { + "id": "12024", + "type": "anime", + "links": { + "self": "https://kitsu.io/api/edge/anime/12024" + }, + "attributes": { + "slug": "www-working", + "synopsis": "Daisuke Higashida is a serious first-year student at Higashizaka High School. He lives a peaceful everyday life even though he is not satisfied with the family who doesn't laugh at all and makes him tired. However, his father's company goes bankrupt one day, and he can no longer afford allowances, cellphone bills, and commuter tickets. When his father orders him to take up a part-time job, Daisuke decides to work at a nearby family restaurant in order to avoid traveling 15 kilometers to school by bicycle.", + "coverImageTopOffset": 165, + "titles": { + "en": "WWW.WAGNARIA!!", + "en_jp": "WWW.Working!!", + "ja_jp": "" + }, + "canonicalTitle": "WWW.Working!!", + "abbreviatedTitles": null, + "averageRating": 3.82383742243783, + "ratingFrequencies": { + "1.0": "2", + "1.5": "7", + "2.0": "19", + "2.5": "28", + "3.0": "68", + "3.5": "114", + "4.0": "144", + "4.5": "78", + "5.0": "74", + "nil": "1182" + }, + "startDate": "2016-10-01", + "endDate": "2016-12-24", + "posterImage": { + "tiny": "https://media.kitsu.io/anime/poster_images/12024/tiny.jpg?1473990267", + "small": "https://media.kitsu.io/anime/poster_images/12024/small.jpg?1473990267", + "medium": "https://media.kitsu.io/anime/poster_images/12024/medium.jpg?1473990267", + "large": "https://media.kitsu.io/anime/poster_images/12024/large.jpg?1473990267", + "original": "https://media.kitsu.io/anime/poster_images/12024/original.jpg?1473990267" + }, + "coverImage": { + "small": "https://media.kitsu.io/anime/cover_images/12024/small.jpg?1479834612", + "large": "https://media.kitsu.io/anime/cover_images/12024/large.jpg?1479834612", + "original": "https://media.kitsu.io/anime/cover_images/12024/original.png?1479834612" + }, + "episodeCount": 13, + "episodeLength": 23, + "subtype": "TV", + "youtubeVideoId": "", + "ageRating": "PG", + "ageRatingGuide": "Teens 13 or older", + "showType": "TV", + "nsfw": false + }, + "relationships": { + "genres": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/genres", + "related": "https://kitsu.io/api/edge/anime/12024/genres" + }, + "data": [{ + "type": "genres", + "id": "3" + }, { + "type": "genres", + "id": "16" + }] + }, + "castings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/castings", + "related": "https://kitsu.io/api/edge/anime/12024/castings" + } + }, + "installments": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/installments", + "related": "https://kitsu.io/api/edge/anime/12024/installments" + } + }, + "mappings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/mappings", + "related": "https://kitsu.io/api/edge/anime/12024/mappings" + }, + "data": [{ + "type": "mappings", + "id": "2538" + }] + }, + "reviews": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/reviews", + "related": "https://kitsu.io/api/edge/anime/12024/reviews" + } + }, + "episodes": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/episodes", + "related": "https://kitsu.io/api/edge/anime/12024/episodes" + } + }, + "streamingLinks": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12024/relationships/streaming-links", + "related": "https://kitsu.io/api/edge/anime/12024/streaming-links" + } + } + } + }, { + "id": "12465", + "type": "anime", + "links": { + "self": "https://kitsu.io/api/edge/anime/12465" + }, + "attributes": { + "slug": "bishoujo-yuugi-unit-crane-game-girls-galaxy", + "synopsis": "Second season of Bishoujo Yuugi Unit Crane Game Girls.", + "coverImageTopOffset": 0, + "titles": { + "en": "Crane Game Girls Galaxy", + "en_jp": "Bishoujo Yuugi Unit Crane Game Girls Galaxy", + "ja_jp": "美少女遊戯ユニット クレーンゲールギャラクシー" + }, + "canonicalTitle": "Bishoujo Yuugi Unit Crane Game Girls Galaxy", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "2", + "1.0": "2", + "1.5": "0", + "2.0": "4", + "2.5": "6", + "3.0": "2", + "3.5": "4", + "4.0": "1", + "4.5": "2", + "nil": "66" + }, + "startDate": "2016-10-05", + "endDate": null, + "posterImage": { + "tiny": "https://media.kitsu.io/anime/poster_images/12465/tiny.jpg?1473601756", + "small": "https://media.kitsu.io/anime/poster_images/12465/small.jpg?1473601756", + "medium": "https://media.kitsu.io/anime/poster_images/12465/medium.jpg?1473601756", + "large": "https://media.kitsu.io/anime/poster_images/12465/large.jpg?1473601756", + "original": "https://media.kitsu.io/anime/poster_images/12465/original.png?1473601756" + }, + "coverImage": null, + "episodeCount": null, + "episodeLength": 13, + "subtype": "TV", + "youtubeVideoId": "", + "ageRating": "PG", + "ageRatingGuide": "Children", + "showType": "TV", + "nsfw": false + }, + "relationships": { + "genres": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/genres", + "related": "https://kitsu.io/api/edge/anime/12465/genres" + }, + "data": [{ + "type": "genres", + "id": "3" + }] + }, + "castings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/castings", + "related": "https://kitsu.io/api/edge/anime/12465/castings" + } + }, + "installments": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/installments", + "related": "https://kitsu.io/api/edge/anime/12465/installments" + } + }, + "mappings": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/mappings", + "related": "https://kitsu.io/api/edge/anime/12465/mappings" + }, + "data": [{ + "type": "mappings", + "id": "9871" + }] + }, + "reviews": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/reviews", + "related": "https://kitsu.io/api/edge/anime/12465/reviews" + } + }, + "episodes": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/episodes", + "related": "https://kitsu.io/api/edge/anime/12465/episodes" + } + }, + "streamingLinks": { + "links": { + "self": "https://kitsu.io/api/edge/anime/12465/relationships/streaming-links", + "related": "https://kitsu.io/api/edge/anime/12465/streaming-links" + } + } + } + }, { + "id": "24", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/24" + }, + "attributes": { + "name": "School", + "slug": "school", + "description": null + } + }, { + "id": "35", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/35" + }, + "attributes": { + "name": "Music", + "slug": "music", + "description": null + } + }, { + "id": "4", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/4" + }, + "attributes": { + "name": "Drama", + "slug": "drama", + "description": "" + } + }, { + "id": "3", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/3" + }, + "attributes": { + "name": "Comedy", + "slug": "comedy", + "description": null + } + }, { + "id": "5", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/5" + }, + "attributes": { + "name": "Sci-Fi", + "slug": "sci-fi", + "description": null + } + }, { + "id": "8", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/8" + }, + "attributes": { + "name": "Magic", + "slug": "magic", + "description": null + } + }, { + "id": "28", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/28" + }, + "attributes": { + "name": "Military", + "slug": "military", + "description": null + } + }, { + "id": "1", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/1" + }, + "attributes": { + "name": "Action", + "slug": "action", + "description": "" + } + }, { + "id": "25", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/25" + }, + "attributes": { + "name": "Ecchi", + "slug": "ecchi", + "description": "" + } + }, { + "id": "16", + "type": "genres", + "links": { + "self": "https://kitsu.io/api/edge/genres/16" + }, + "attributes": { + "name": "Slice of Life", + "slug": "slice-of-life", + "description": "" + } + }, { + "id": "3155", + "type": "mappings", + "links": { + "self": "https://kitsu.io/api/edge/mappings/3155" + }, + "attributes": { + "externalSite": "myanimelist/anime", + "externalId": "31988" + }, + "relationships": { + "media": { + "links": { + "self": "https://kitsu.io/api/edge/mappings/3155/relationships/media", + "related": "https://kitsu.io/api/edge/mappings/3155/media" + } + } + } + }, { + "id": "1755", + "type": "mappings", + "links": { + "self": "https://kitsu.io/api/edge/mappings/1755" + }, + "attributes": { + "externalSite": "myanimelist/anime", + "externalId": "30514" + }, + "relationships": { + "media": { + "links": { + "self": "https://kitsu.io/api/edge/mappings/1755/relationships/media", + "related": "https://kitsu.io/api/edge/mappings/1755/media" + } + } + } + }, { + "id": "2593", + "type": "mappings", + "links": { + "self": "https://kitsu.io/api/edge/mappings/2593" + }, + "attributes": { + "externalSite": "myanimelist/anime", + "externalId": "32866" + }, + "relationships": { + "media": { + "links": { + "self": "https://kitsu.io/api/edge/mappings/2593/relationships/media", + "related": "https://kitsu.io/api/edge/mappings/2593/media" + } + } + } + }, { + "id": "2538", + "type": "mappings", + "links": { + "self": "https://kitsu.io/api/edge/mappings/2538" + }, + "attributes": { + "externalSite": "myanimelist/anime", + "externalId": "33094" + }, + "relationships": { + "media": { + "links": { + "self": "https://kitsu.io/api/edge/mappings/2538/relationships/media", + "related": "https://kitsu.io/api/edge/mappings/2538/media" + } + } + } + }, { + "id": "9871", + "type": "mappings", + "links": { + "self": "https://kitsu.io/api/edge/mappings/9871" + }, + "attributes": { + "externalSite": "myanimelist/anime", + "externalId": "33541" + }, + "relationships": { + "media": { + "links": { + "self": "https://kitsu.io/api/edge/mappings/9871/relationships/media", + "related": "https://kitsu.io/api/edge/mappings/9871/media" + } + } + } + }], + "links": { + "first": "https://kitsu.io/api/edge/library-entries?filter%5Bmedia_type%5D=Anime&filter%5Bstatus%5D=3&filter%5Buser_id%5D=2644&include=media%2Cmedia.genres%2Cmedia.mappings&page%5Blimit%5D=5&page%5Boffset%5D=0&sort=-updated_at", + "next": "https://kitsu.io/api/edge/library-entries?filter%5Bmedia_type%5D=Anime&filter%5Bstatus%5D=3&filter%5Buser_id%5D=2644&include=media%2Cmedia.genres%2Cmedia.mappings&page%5Blimit%5D=5&page%5Boffset%5D=5&sort=-updated_at", + "last": "https://kitsu.io/api/edge/library-entries?filter%5Bmedia_type%5D=Anime&filter%5Bstatus%5D=3&filter%5Buser_id%5D=2644&include=media%2Cmedia.genres%2Cmedia.mappings&page%5Blimit%5D=5&page%5Boffset%5D=555&sort=-updated_at" + } +} \ No newline at end of file From f10b0f5284c6fdab8424b3c70c5d375ee86d378b Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Thu, 12 Jan 2017 11:31:49 -0500 Subject: [PATCH 07/14] Update Changelog and Readme --- CHANGELOG.md | 3 +++ README.md | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94d2d7f6..ce2c5c1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Version 4 +* Updated to use Kitsu API after discontinuation of Hummingbird + ## Version 3 * Converted user configuration to toml files * Added a caching layer for api calls, which resets upon updates from the diff --git a/README.md b/README.md index 445e2996..0f4ce9af 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ A self-hosted client that allows custom formatting of data from the hummingbird api -[![Build Status](https://jenkins.timshomepage.net/buildStatus/icon?job=animeclient)](https://jenkins.timshomepage.net/job/animeclient/) [![Build Status](https://travis-ci.org/timw4mail/HummingBirdAnimeClient.svg?branch=master)](https://travis-ci.org/timw4mail/HummingBirdAnimeClient) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/timw4mail/HummingBirdAnimeClient/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/timw4mail/HummingBirdAnimeClient/?branch=master) From 270f9ab167bb840b15316701103a63e744c1541f Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Thu, 12 Jan 2017 15:41:20 -0500 Subject: [PATCH 08/14] Really ugly progress commit --- app/bootstrap.php | 1 - app/config/config.toml.example | 6 + app/views/anime/cover.php | 4 +- app/views/anime/details.php | 5 +- app/views/anime/edit.php | 1 + build/phpunit.xml | 1 - composer.json | 8 +- phpunit.xml | 41 +- src/API/JsonAPI.php | 114 +++++- src/API/Kitsu/Auth.php | 12 +- src/API/Kitsu/KitsuModel.php | 22 +- .../Transformer/AnimeListTransformer.php | 41 +- .../Kitsu/Transformer/AnimeTransformer.php | 6 +- src/API/MAL.php | 2 +- src/API/MAL/ListItem.php | 52 +++ src/API/MAL/MALTrait.php | 190 +++++++++ src/API/MAL/Model.php | 88 ++-- .../MAL/Transformer/AnimeListTransformer.php | 46 +++ .../MAL/Transformer/MALToKitsuTransformer.php | 33 ++ src/Controller.php | 3 +- src/Util.php | 1 - tests/API/JsonAPITest.php | 48 +++ .../Transformer/AnimeListTransformerTest.php | 90 ++++ .../Transformer/AnimeTransformerTest.php | 30 ++ tests/API/XMLTest.php | 18 +- tests/AnimeClient_TestCase.php | 9 +- tests/ControllerTest.php | 10 +- tests/test_data/JsonAPI/inlineIncluded.json | 1 + .../{ => JsonAPI}/jsonApiExample.json | 0 .../test_data/JsonAPI/organizedIncludes.json | 385 ++++++++++++++++++ .../Kitsu/animeListItemAfterTransform.json | 28 ++ .../Kitsu/animeListItemBeforeTransform.json | 155 +++++++ tests/test_data/{ => XML}/MALExport.xml | 0 .../{ => XML}/minifiedXmlTestFile.xml | 0 tests/test_data/{ => XML}/xmlTestFile.xml | 0 35 files changed, 1305 insertions(+), 146 deletions(-) create mode 100644 src/API/MAL/ListItem.php create mode 100644 src/API/MAL/MALTrait.php create mode 100644 src/API/MAL/Transformer/AnimeListTransformer.php create mode 100644 src/API/MAL/Transformer/MALToKitsuTransformer.php create mode 100644 tests/API/JsonAPITest.php create mode 100644 tests/API/Kitsu/Transformer/AnimeListTransformerTest.php create mode 100644 tests/API/Kitsu/Transformer/AnimeTransformerTest.php create mode 100644 tests/test_data/JsonAPI/inlineIncluded.json rename tests/test_data/{ => JsonAPI}/jsonApiExample.json (100%) create mode 100644 tests/test_data/JsonAPI/organizedIncludes.json create mode 100644 tests/test_data/Kitsu/animeListItemAfterTransform.json create mode 100644 tests/test_data/Kitsu/animeListItemBeforeTransform.json rename tests/test_data/{ => XML}/MALExport.xml (100%) rename tests/test_data/{ => XML}/minifiedXmlTestFile.xml (100%) rename tests/test_data/{ => XML}/xmlTestFile.xml (100%) diff --git a/app/bootstrap.php b/app/bootstrap.php index 8790c541..8f6dd9f4 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -14,7 +14,6 @@ * @link https://github.com/timw4mail/HummingBirdAnimeClient */ - namespace Aviat\AnimeClient; use Aura\Html\HelperLocatorFactory; diff --git a/app/config/config.toml.example b/app/config/config.toml.example index 15637e7a..4fe4b5d5 100644 --- a/app/config/config.toml.example +++ b/app/config/config.toml.example @@ -14,5 +14,11 @@ show_anime_collection = true # do you wish to show the manga collection? show_manga_collection = false +# do you have a My Anime List account set up in mal.toml? +use_mal_api = false + +# cache driver for api calls (NullDriver, SQLDriver, RedisDriver) +cache_driver = "NullDriver" + # path to public directory on the server asset_dir = "/../../public" \ No newline at end of file diff --git a/app/views/anime/cover.php b/app/views/anime/cover.php index c30ea8c3..1f34380b 100644 --- a/app/views/anime/cover.php +++ b/app/views/anime/cover.php @@ -11,11 +11,11 @@
is_authenticated()) continue; ?> -
\ No newline at end of file diff --git a/app/views/anime/edit.php b/app/views/anime/edit.php index e96c6d25..28a0673e 100644 --- a/app/views/anime/edit.php +++ b/app/views/anime/edit.php @@ -77,6 +77,7 @@   + diff --git a/build/phpunit.xml b/build/phpunit.xml index c4e9b784..537121c8 100644 --- a/build/phpunit.xml +++ b/build/phpunit.xml @@ -4,7 +4,6 @@ stopOnFailure="false" bootstrap="../tests/bootstrap.php" beStrictAboutTestsThatDoNotTestAnything="true" - checkForUnintentionallyCoveredCode="true" > diff --git a/composer.json b/composer.json index 5381e2d1..789f6eb1 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,6 @@ } }, "require": { - "abeautifulsite/simpleimage": "2.5.*", "aura/html": "2.*", "aura/router": "3.*", "aura/session": "2.*", @@ -35,15 +34,16 @@ "theseer/phpdox": "0.8.1.1", "phploc/phploc": "^3.0", "phpmd/phpmd": "^2.4", - "phpunit/phpunit": "^5.4", + "phpunit/phpunit": "^5.7", "robmorgan/phinx": "^0.6.4", "humbug/humbug": "~1.0@dev", - "consolidation/robo": "~1.0@RC", + "consolidation/robo": "~1.0", "henrikbjorn/lurker": "^1.1.0", "symfony/var-dumper": "^3.1", "squizlabs/php_codesniffer": "^3.0.0@beta" }, "scripts": { - "build:css": "cd public && npm run build && cd .." + "build:css": "cd public && npm run build && cd ..", + "watch:css": "cd public && npm run watch" } } \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index 73a77ae7..476b10c8 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,25 +1,24 @@ - - - src - - - - - tests - - - - - - - - - + + + src + + + + + tests + + + + + + + + + \ No newline at end of file diff --git a/src/API/JsonAPI.php b/src/API/JsonAPI.php index f2848474..1ea85ca2 100644 --- a/src/API/JsonAPI.php +++ b/src/API/JsonAPI.php @@ -16,6 +16,8 @@ namespace Aviat\AnimeClient\API; +use Aviat\Ion\Json; + /** * Class encapsulating Json API data structure for a request or response */ @@ -52,7 +54,7 @@ class JsonAPI { * * @var array */ - protected $included = []; + public $included = []; /** * Pagination links @@ -70,6 +72,11 @@ class JsonAPI { { $this->data = $initial; } + + public function parseFromString(string $json) + { + $this->parse(Json::decode($json)); + } /** * Parse a JsonAPI response into its components @@ -78,7 +85,7 @@ class JsonAPI { */ public function parse(array $data) { - + $this->included = static::organizeIncludes($data['included']); } /** @@ -91,4 +98,107 @@ class JsonAPI { { } + + /** + * Take inlined included data and inline it into the main object's relationships + * + * @param array $mainObject + * @param array $included + * @return array + */ + public static function inlineIncludedIntoMainObject(array $mainObject, array $included): array + { + $output = clone $mainObject; + } + + /** + * Take organized includes and inline them, where applicable + * + * @param array $included + * @param string $key The key of the include to inline the other included values into + * @return array + */ + public static function inlineIncludedRelationships(array $included, string $key): array + { + $inlined = [ + $key => [] + ]; + + foreach ($included[$key] as $itemId => $item) + { + // Duplicate the item for the output + $inlined[$key][$itemId] = $item; + + foreach($item['relationships'] as $type => $ids) + { + $inlined[$key][$itemId]['relationships'][$type] = []; + foreach($ids as $id) + { + $inlined[$key][$itemId]['relationships'][$type][$id] = $included[$type][$id]; + } + } + } + + return $inlined; + } + + /** + * Reorganizes 'included' data to be keyed by + * type => [ + * id => data/attributes, + * ] + * + * @param array $includes + * @return array + */ + public static function organizeIncludes(array $includes): array + { + $organized = []; + + foreach ($includes as $item) + { + $type = $item['type']; + $id = $item['id']; + $organized[$type] = $organized[$type] ?? []; + $organized[$type][$id] = $item['attributes']; + + if (array_key_exists('relationships', $item)) + { + $organized[$type][$id]['relationships'] = static::organizeRelationships($item['relationships']); + } + } + + return $organized; + } + + /** + * Reorganize relationship mappings to make them simpler to use + * + * Remove verbose structure, and just map: + * type => [ idArray ] + * + * @param array $relationships + * @return array + */ + public static function organizeRelationships(array $relationships): array + { + $organized = []; + + foreach($relationships as $key => $data) + { + if ( ! array_key_exists('data', $data)) + { + continue; + } + + $organized[$key] = $organized[$key] ?? []; + + foreach ($data['data'] as $item) + { + $organized[$key][] = $item['id']; + } + } + + return $organized; + } } \ No newline at end of file diff --git a/src/API/Kitsu/Auth.php b/src/API/Kitsu/Auth.php index c6ac74ab..04e2e395 100644 --- a/src/API/Kitsu/Auth.php +++ b/src/API/Kitsu/Auth.php @@ -18,6 +18,7 @@ namespace Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\AnimeClient; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; +use Exception; /** * Kitsu API Authentication @@ -64,7 +65,16 @@ class Auth { { $config = $this->container->get('config'); $username = $config->get(['kitsu_username']); - $auth_token = $this->model->authenticate($username, $password); + + try + { + $auth_token = $this->model->authenticate($username, $password); + } + catch (Exception $e) + { + return FALSE; + } + if (FALSE !== $auth_token) { diff --git a/src/API/Kitsu/KitsuModel.php b/src/API/Kitsu/KitsuModel.php index 967392ee..e1adfa08 100644 --- a/src/API/Kitsu/KitsuModel.php +++ b/src/API/Kitsu/KitsuModel.php @@ -16,6 +16,7 @@ namespace Aviat\AnimeClient\API\Kitsu; +use Aviat\AnimeClient\API\JsonAPI; use Aviat\AnimeClient\API\Kitsu as K; use Aviat\AnimeClient\API\Kitsu\Transformer\{ AnimeTransformer, AnimeListTransformer, MangaTransformer, MangaListTransformer @@ -155,30 +156,23 @@ class KitsuModel { 'media_type' => 'Anime', 'status' => $status, ], - 'include' => 'media,media.genres', + 'include' => 'media,media.genres,media.mappings', 'page' => [ 'offset' => 0, - 'limit' => 1000 + 'limit' => 500 ], 'sort' => '-updated_at' ] ]; $data = $this->getRequest('library-entries', $options); - $included = K::organizeIncludes($data['included']); + $included = JsonAPI::organizeIncludes($data['included']); + $included = JsonAPI::inlineIncludedRelationships($included, 'anime'); foreach($data['data'] as $i => &$item) { - $item['anime'] = $included['anime'][$item['relationships']['media']['data']['id']]; - - $animeGenres = $item['anime']['relationships']['genres']; - - foreach($animeGenres as $id) - { - $item['genres'][] = $included['genres'][$id]['name']; - } + $item['included'] =& $included; } - $transformed = $this->animeListTransformer->transformCollection($data['data']); return $transformed; @@ -309,11 +303,7 @@ class KitsuModel { ]; $data = $this->getRequest($type, $options); - $baseData = $data['data'][0]['attributes']; - $rawGenres = array_pluck($data['included'], 'attributes'); - $genres = array_pluck($rawGenres, 'name'); - $baseData['genres'] = $genres; $baseData['included'] = $data['included']; return $baseData; } diff --git a/src/API/Kitsu/Transformer/AnimeListTransformer.php b/src/API/Kitsu/Transformer/AnimeListTransformer.php index 7d05e76e..6f1817cf 100644 --- a/src/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeListTransformer.php @@ -33,19 +33,35 @@ class AnimeListTransformer extends AbstractTransformer { */ public function transform($item) { -/* ?>
$item['id'], + 'mal_id' => $MALid, 'episodes' => [ 'watched' => $item['attributes']['progress'], 'total' => $total_episodes, @@ -60,7 +76,6 @@ class AnimeListTransformer extends AbstractTransformer { 'age_rating' => $anime['ageRating'], 'titles' => Kitsu::filterTitles($anime), 'slug' => $anime['slug'], - 'url' => $anime['url'] ?? '', 'type' => $this->string($anime['showType'])->upperCaseFirst()->__toString(), 'image' => $anime['posterImage']['small'], 'genres' => $genres, @@ -69,7 +84,7 @@ class AnimeListTransformer extends AbstractTransformer { 'notes' => $item['attributes']['notes'], 'rewatching' => (bool) $item['attributes']['reconsuming'], 'rewatched' => (int) $item['attributes']['reconsumeCount'], - 'user_rating' => ($rating === 0) ? '-' : $rating, + 'user_rating' => ($rating === 0) ? '-' : (int) $rating, 'private' => (bool) $item['attributes']['private'] ?? false, ]; } @@ -83,18 +98,8 @@ class AnimeListTransformer extends AbstractTransformer { */ public function untransform($item) { - // Messy mapping of boolean values to their API string equivalents - $privacy = 'false'; - if (array_key_exists('private', $item) && $item['private']) - { - $privacy = 'true'; - } - - $rewatching = 'false'; - if (array_key_exists('rewatching', $item) && $item['rewatching']) - { - $rewatching = 'true'; - } + $privacy = (array_key_exists('private', $item) && $item['private']); + $rewatching = (array_key_exists('rewatching', $item) && $item['rewatching']); $untransformed = [ 'id' => $item['id'], diff --git a/src/API/Kitsu/Transformer/AnimeTransformer.php b/src/API/Kitsu/Transformer/AnimeTransformer.php index 92c7ee7b..e4339886 100644 --- a/src/API/Kitsu/Transformer/AnimeTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeTransformer.php @@ -16,7 +16,7 @@ namespace Aviat\AnimeClient\API\Kitsu\Transformer; -use Aviat\AnimeClient\API\Kitsu; +use Aviat\AnimeClient\API\{JsonAPI, Kitsu}; use Aviat\Ion\Transformer\AbstractTransformer; /** @@ -33,7 +33,8 @@ class AnimeTransformer extends AbstractTransformer { */ public function transform($item) { - $item['genres'] = $item['genres'] ?? []; + $item['included'] = JsonAPI::organizeIncludes($item['included']); + $item['genres'] = array_column($item['included']['genres'], 'name') ?? []; sort($item['genres']); return [ @@ -48,6 +49,7 @@ class AnimeTransformer extends AbstractTransformer { 'age_rating_guide' => $item['ageRatingGuide'], 'url' => "https://kitsu.io/anime/{$item['slug']}", 'genres' => $item['genres'], + 'included' => $item['included'] ]; } } \ No newline at end of file diff --git a/src/API/MAL.php b/src/API/MAL.php index d6eb2199..ec55f880 100644 --- a/src/API/MAL.php +++ b/src/API/MAL.php @@ -16,7 +16,7 @@ namespace Aviat\AnimeClient\API; -use Aviat\AnimeClient\Enum\{AnimeWatchingStatus, MangaReadingStatus}; +use Aviat\AnimeClient\API\MAL\Enum\{AnimeWatchingStatus, MangaReadingStatus}; /** * Constants and mappings for the My Anime List API diff --git a/src/API/MAL/ListItem.php b/src/API/MAL/ListItem.php new file mode 100644 index 00000000..d5506f9a --- /dev/null +++ b/src/API/MAL/ListItem.php @@ -0,0 +1,52 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API\MAL; + +use Aviat\AnimeClient\API\AbstractListItem; +use Aviat\Ion\Di\ContainerAware; + +/** + * CRUD operations for MAL list items + */ +class ListItem extends AbstractListItem { + use ContainerAware; + + public function __construct() + { + $this->init(); + } + + public function create(array $data): bool + { + return FALSE; + } + + public function delete(string $id): bool + { + return FALSE; + } + + public function get(string $id): array + { + return []; + } + + public function update(string $id, array $data): Response + { + // @TODO implement + } +} \ No newline at end of file diff --git a/src/API/MAL/MALTrait.php b/src/API/MAL/MALTrait.php new file mode 100644 index 00000000..4d50931e --- /dev/null +++ b/src/API/MAL/MALTrait.php @@ -0,0 +1,190 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API\MAL; + +use Aviat\AnimeClient\API\{ + GuzzleTrait, + MAL as M, + XML +}; +use GuzzleHttp\Client; +use GuzzleHttp\Cookie\CookieJar; +use GuzzleHttp\Psr7\Response; +use InvalidArgumentException; + +trait MALTrait { + use GuzzleTrait; + + /** + * The base url for api requests + * @var string $base_url + */ + protected $baseUrl = M::BASE_URL; + + /** + * HTTP headers to send with every request + * + * @var array + */ + protected $defaultHeaders = [ + 'User-Agent' => "Tim's Anime Client/4.0" + ]; + + /** + * Set up the class properties + * + * @return void + */ + protected function init() + { + $defaults = [ + 'cookies' => $this->cookieJar, + 'headers' => $this->defaultHeaders, + 'timeout' => 25, + 'connect_timeout' => 25 + ]; + + $this->cookieJar = new CookieJar(); + $this->client = new Client([ + 'base_uri' => $this->baseUrl, + 'cookies' => TRUE, + 'http_errors' => TRUE, + 'defaults' => $defaults + ]); + } + + /** + * Make a request via Guzzle + * + * @param string $type + * @param string $url + * @param array $options + * @return Response + */ + private function getResponse(string $type, string $url, array $options = []) + { + $type = strtoupper($type); + $validTypes = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']; + + if ( ! in_array($type, $validTypes)) + { + throw new InvalidArgumentException('Invalid http request type'); + } + + $config = $this->container->get('config'); + $logger = $this->container->getLogger('request'); + + $defaultOptions = [ + 'auth' => [ + $config->get(['mal','username']), + $config->get(['mal','password']) + ], + 'headers' => $this->defaultHeaders + ]; + + $options = array_merge($defaultOptions, $options); + + $logger->debug(Json::encode([$type, $url])); + $logger->debug(Json::encode($options)); + + return $this->client->request($type, $url, $options); + } + + /** + * Make a request via Guzzle + * + * @param string $type + * @param string $url + * @param array $options + * @return array + */ + private function request(string $type, string $url, array $options = []): array + { + $logger = null; + if ($this->getContainer()) + { + $logger = $this->container->getLogger('request'); + } + + $response = $this->getResponse($type, $url, $options); + + if ((int) $response->getStatusCode() > 299 || (int) $response->getStatusCode() < 200) + { + if ($logger) + { + $logger->warning('Non 200 response for api call'); + $logger->warning($response->getBody()); + } + + // throw new RuntimeException($response->getBody()); + } + + return XML::toArray((string) $response->getBody()); + } + + /** + * Remove some boilerplate for get requests + * + * @param array $args + * @return array + */ + protected function getRequest(...$args): array + { + return $this->request('GET', ...$args); + } + + /** + * Remove some boilerplate for post requests + * + * @param array $args + * @return array + */ + protected function postRequest(...$args): array + { + $logger = null; + if ($this->getContainer()) + { + $logger = $this->container->getLogger('request'); + } + + $response = $this->getResponse('POST', ...$args); + $validResponseCodes = [200, 201]; + + if ( ! in_array((int) $response->getStatusCode(), $validResponseCodes)) + { + if ($logger) + { + $logger->warning('Non 201 response for POST api call'); + $logger->warning($response->getBody()); + } + } + + return XML::toArray((string) $response->getBody()); + } + + /** + * Remove some boilerplate for delete requests + * + * @param array $args + * @return bool + */ + protected function deleteRequest(...$args): bool + { + $response = $this->getResponse('DELETE', ...$args); + return ((int) $response->getStatusCode() === 204); + } +} \ No newline at end of file diff --git a/src/API/MAL/Model.php b/src/API/MAL/Model.php index 47f948f4..b7f0f0c9 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -1,63 +1,49 @@ - - * @copyright 2015 - 2017 Timothy J. Warren - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 4.0 - * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\Kitsu; + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ -use Aviat\AnimeClient\Model\API; +namespace Aviat\AnimeClient\API\MAL; + +use Aviat\AnimeClient\API\MAL as M; +use Aviat\Ion\Di\ContainerAware; /** * MyAnimeList API Model */ -class Model extends API { +class Model { + + use ContainerAware; + use MALTrait; - /** - * Base url for Kitsu API - */ - protected $baseUrl = 'https://myanimelist.net/api/'; + public function createListItem(array $data): bool + { - /** - * Default settings for Guzzle - * @var array - */ - protected $connectionDefaults = []; + } - /** - * Get the access token from the Kitsu API - * - * @param string $username - * @param string $password - * @return bool|string - */ - public function authenticate(string $username, string $password) - { - $response = $this->post('account/', [ - 'body' => http_build_query([ - 'grant_type' => 'password', - 'username' => $username, - 'password' => $password - ]) - ]); + public function getListItem(string $listId): array + { - $info = $response->getBody(); + } - if (array_key_exists('access_token', $info)) { - // @TODO save token - return true; - } + public function updateListItem(array $data) + { - return false; - } + } + + public function deleteListItem(string $id): bool + { + + } } \ No newline at end of file diff --git a/src/API/MAL/Transformer/AnimeListTransformer.php b/src/API/MAL/Transformer/AnimeListTransformer.php new file mode 100644 index 00000000..881adaf5 --- /dev/null +++ b/src/API/MAL/Transformer/AnimeListTransformer.php @@ -0,0 +1,46 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API\MAL; + +use Aviat\Ion\Transformer\AbstractTransformer; + +/** + * Transformer for updating MAL List + */ +class AnimeListTransformer extends AbstractTransformer { + + public function transform($item) + { + $rewatching = 'false'; + if (array_key_exists('rewatching', $item) && $item['rewatching']) + { + $rewatching = 'true'; + } + + return [ + 'id' => $item['id'], + 'data' => [ + 'status' => $item['watching_status'], + 'rating' => $item['user_rating'], + 'rewatch_value' => (int) $rewatching, + 'times_rewatched' => $item['rewatched'], + 'comments' => $item['notes'], + 'episode' => $item['episodes_watched'] + ] + ]; + } +} \ No newline at end of file diff --git a/src/API/MAL/Transformer/MALToKitsuTransformer.php b/src/API/MAL/Transformer/MALToKitsuTransformer.php new file mode 100644 index 00000000..dc8fed17 --- /dev/null +++ b/src/API/MAL/Transformer/MALToKitsuTransformer.php @@ -0,0 +1,33 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API\MAL; + +use Aviat\Ion\Transformer\AbstractTransformer; + +class MALToKitsuTransformer extends AbstractTransformer { + + + public function transform($item) + { + + } + + public function untransform($item) + { + + } +} \ No newline at end of file diff --git a/src/Controller.php b/src/Controller.php index d776873f..708e1984 100644 --- a/src/Controller.php +++ b/src/Controller.php @@ -304,7 +304,8 @@ class Controller { return $this->session_redirect(); } - $this->login("Invalid username or password."); + $this->set_flash_message('Invalid username or password.'); + $this->redirect($this->urlGenerator->url('login'), 303); } /** diff --git a/src/Util.php b/src/Util.php index e4743034..ac038b45 100644 --- a/src/Util.php +++ b/src/Util.php @@ -16,7 +16,6 @@ namespace Aviat\AnimeClient; -use abeautifulsite\SimpleImage; use Aviat\Ion\ConfigInterface; use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; use DomainException; diff --git a/tests/API/JsonAPITest.php b/tests/API/JsonAPITest.php new file mode 100644 index 00000000..396d1ade --- /dev/null +++ b/tests/API/JsonAPITest.php @@ -0,0 +1,48 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\API; + +use Aviat\AnimeClient\API\JsonAPI; +use Aviat\Ion\Json; +use PHPUnit\Framework\TestCase; + +class JsonAPITest extends TestCase { + + public function setUp() + { + $dir = __DIR__ . '/../test_data/JsonAPI'; + $this->startData = Json::decodeFile("{$dir}/jsonApiExample.json"); + $this->organizedIncludes = Json::decodeFile("{$dir}/organizedIncludes.json"); + $this->inlineIncluded = Json::decodeFile("{$dir}/inlineIncluded.json"); + } + + public function testOrganizeIncludes() + { + $expected = $this->organizedIncludes; + $actual = JsonAPI::organizeIncludes($this->startData['included']); + + $this->assertEquals($expected, $actual); + } + + public function testInlineIncludedRelationships() + { + $expected = $this->inlineIncluded; + $actual = JsonAPI::inlineIncludedRelationships($this->organizedIncludes, 'anime'); + + $this->assertEquals($expected, $actual); + } +} \ No newline at end of file diff --git a/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php b/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php new file mode 100644 index 00000000..18cc3803 --- /dev/null +++ b/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php @@ -0,0 +1,90 @@ +beforeTransform = Json::decodeFile("{$dir}/animeListItemBeforeTransform.json"); + $this->afterTransform = Json::decodeFile("{$dir}/animeListItemAfterTransform.json"); + + $this->transformer = new AnimeListTransformer(); + } + + public function testTransform() + { + $expected = $this->afterTransform; + $actual = $this->transformer->transform($this->beforeTransform); + + $this->assertEquals($expected, $actual); + } + + public function dataUntransform() + { + return [[ + 'input' => [ + 'id' => 14047981, + 'watching_status' => 'current', + 'user_rating' => 8, + 'episodes_watched' => 38, + 'rewatched' => 0, + 'notes' => 'Very formulaic.', + 'edit' => true + ], + 'expected' => [ + 'id' => 14047981, + 'data' => [ + 'status' => 'current', + 'rating' => 4, + 'reconsuming' => false, + 'reconsumeCount' => 0, + 'notes' => 'Very formulaic.', + 'progress' => 38, + 'private' => false + ] + ] + ], [ + 'input' => [ + 'id' => 14047981, + 'watching_status' => 'current', + 'user_rating' => 8, + 'episodes_watched' => 38, + 'rewatched' => 0, + 'notes' => 'Very formulaic.', + 'edit' => 'true', + 'private' => 'On', + 'rewatching' => 'On' + ], + 'expected' => [ + 'id' => 14047981, + 'data' => [ + 'status' => 'current', + 'rating' => 4, + 'reconsuming' => true, + 'reconsumeCount' => 0, + 'notes' => 'Very formulaic.', + 'progress' => 38, + 'private' => true, + ] + ] + ]]; + } + + /** + * @dataProvider dataUntransform + */ + public function testUntransform($input, $expected) + { + $actual = $this->transformer->untransform($input); + $this->assertEquals($expected, $actual); + } +} \ No newline at end of file diff --git a/tests/API/Kitsu/Transformer/AnimeTransformerTest.php b/tests/API/Kitsu/Transformer/AnimeTransformerTest.php new file mode 100644 index 00000000..b72eb2e1 --- /dev/null +++ b/tests/API/Kitsu/Transformer/AnimeTransformerTest.php @@ -0,0 +1,30 @@ +beforeTransform = Json::decodeFile("{$dir}/animeBeforeTransform.json"); + //$this->afterTransform = Json::decodeFile("{$dir}/animeAfterTransform.json"); + + $this->transformer = new AnimeTransformer(); + } + + public function testTransform() + { + /*$expected = $this->afterTransform; + $actual = $this->transformer->transform($this->beforeTransform); + + $this->assertEquals($expected, $actual);*/ + } +} \ No newline at end of file diff --git a/tests/API/XMLTest.php b/tests/API/XMLTest.php index 50cebb37..b14d3f5b 100644 --- a/tests/API/XMLTest.php +++ b/tests/API/XMLTest.php @@ -1,18 +1,4 @@ - * @copyright 2015 - 2017 Timothy J. Warren - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 4.0 - * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ namespace Aviat\AnimeClient\Tests\API; @@ -23,8 +9,8 @@ class XMLTest extends TestCase { public function setUp() { - $this->xml = file_get_contents(__DIR__ . '/../test_data/xmlTestFile.xml'); - $this->expectedXml = file_get_contents(__DIR__ . '/../test_data/minifiedXmlTestFile.xml'); + $this->xml = file_get_contents(__DIR__ . '/../test_data/XML/xmlTestFile.xml'); + $this->expectedXml = file_get_contents(__DIR__ . '/../test_data/XML/minifiedXmlTestFile.xml'); $this->array = [ 'entry' => [ diff --git a/tests/AnimeClient_TestCase.php b/tests/AnimeClient_TestCase.php index d565c738..76cfc0c3 100644 --- a/tests/AnimeClient_TestCase.php +++ b/tests/AnimeClient_TestCase.php @@ -7,8 +7,11 @@ use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr7\Response; -use Zend\Diactoros\Response as HttpResponse; -use Zend\Diactoros\ServerRequestFactory; +use PHPUnit\Framework\TestCase; +use Zend\Diactoros\{ + Response as HttpResponse, + ServerRequestFactory +}; define('ROOT_DIR', __DIR__ . '/../'); define('TEST_DATA_DIR', __DIR__ . '/test_data'); @@ -17,7 +20,7 @@ define('TEST_VIEW_DIR', __DIR__ . '/test_views'); /** * Base class for TestCases */ -class AnimeClient_TestCase extends PHPUnit_Framework_TestCase { +class AnimeClient_TestCase extends TestCase { // Test directory constants const ROOT_DIR = ROOT_DIR; const SRC_DIR = AnimeClient::SRC_DIR; diff --git a/tests/ControllerTest.php b/tests/ControllerTest.php index 8c0e3a6e..b63b3598 100644 --- a/tests/ControllerTest.php +++ b/tests/ControllerTest.php @@ -1,10 +1,12 @@ - Date: Fri, 13 Jan 2017 16:48:08 -0500 Subject: [PATCH 09/14] Update transformer tests --- .../Transformer/AnimeListTransformerTest.php | 8 +- .../Transformer/AnimeTransformerTest.php | 11 +- .../test_data/Kitsu/animeAfterTransform.json | 51 + .../test_data/Kitsu/animeBeforeTransform.json | 291 +++++ .../Kitsu/animeListItemAfterTransform.json | 29 +- .../Kitsu/animeListItemBeforeTransform.json | 1135 +++++++++++++++-- 6 files changed, 1392 insertions(+), 133 deletions(-) create mode 100644 tests/test_data/Kitsu/animeAfterTransform.json create mode 100644 tests/test_data/Kitsu/animeBeforeTransform.json diff --git a/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php b/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php index 18cc3803..84e6f883 100644 --- a/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php +++ b/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php @@ -12,10 +12,10 @@ class AnimeListTransformerTest extends AnimeClient_TestCase { public function setUp() { parent::setUp(); - $dir = AnimeClient_TestCase::TEST_DATA_DIR . '/Kitsu'; + $this->dir = AnimeClient_TestCase::TEST_DATA_DIR . '/Kitsu'; - $this->beforeTransform = Json::decodeFile("{$dir}/animeListItemBeforeTransform.json"); - $this->afterTransform = Json::decodeFile("{$dir}/animeListItemAfterTransform.json"); + $this->beforeTransform = Json::decodeFile("{$this->dir}/animeListItemBeforeTransform.json"); + $this->afterTransform = Json::decodeFile("{$this->dir}/animeListItemAfterTransform.json"); $this->transformer = new AnimeListTransformer(); } @@ -25,6 +25,8 @@ class AnimeListTransformerTest extends AnimeClient_TestCase { $expected = $this->afterTransform; $actual = $this->transformer->transform($this->beforeTransform); + // Json::encodeFile("{$this->dir}/animeListItemAfterTransform.json", $actual); + $this->assertEquals($expected, $actual); } diff --git a/tests/API/Kitsu/Transformer/AnimeTransformerTest.php b/tests/API/Kitsu/Transformer/AnimeTransformerTest.php index b72eb2e1..7d50b096 100644 --- a/tests/API/Kitsu/Transformer/AnimeTransformerTest.php +++ b/tests/API/Kitsu/Transformer/AnimeTransformerTest.php @@ -12,19 +12,20 @@ class AnimeTransformerTest extends AnimeClient_TestCase { public function setUp() { parent::setUp(); - $dir = AnimeClient_TestCase::TEST_DATA_DIR . '/Kitsu'; + $this->dir = AnimeClient_TestCase::TEST_DATA_DIR . '/Kitsu'; - //$this->beforeTransform = Json::decodeFile("{$dir}/animeBeforeTransform.json"); - //$this->afterTransform = Json::decodeFile("{$dir}/animeAfterTransform.json"); + $this->beforeTransform = Json::decodeFile("{$this->dir}/animeBeforeTransform.json"); + $this->afterTransform = Json::decodeFile("{$this->dir}/animeAfterTransform.json"); $this->transformer = new AnimeTransformer(); } public function testTransform() { - /*$expected = $this->afterTransform; + $expected = $this->afterTransform; $actual = $this->transformer->transform($this->beforeTransform); + // Json::encodeFile("{$this->dir}/animeAfterTransform.json", $actual); - $this->assertEquals($expected, $actual);*/ + $this->assertEquals($expected, $actual); } } \ No newline at end of file diff --git a/tests/test_data/Kitsu/animeAfterTransform.json b/tests/test_data/Kitsu/animeAfterTransform.json new file mode 100644 index 00000000..0ac1b38f --- /dev/null +++ b/tests/test_data/Kitsu/animeAfterTransform.json @@ -0,0 +1,51 @@ +{ + "title": "Attack on Titan", + "titles": ["Attack on Titan", "Shingeki no Kyojin", "\u9032\u6483\u306e\u5de8\u4eba"], + "status": "Finished Airing", + "cover_image": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/small.jpg?1418580054", + "show_type": "TV", + "episode_count": 25, + "episode_length": 24, + "synopsis": "Several hundred years ago, humans were nearly exterminated by titans. Titans are typically several stories tall, seem to have no intelligence, devour human beings and, worst of all, seem to do it for the pleasure rather than as a food source. A small percentage of humanity survived by enclosing themselves in a city protected by extremely high walls, even taller than the biggest of titans. Flash forward to the present and the city has not seen a titan in over 100 years. Teenage boy Eren and his foster sister Mikasa witness something horrific as the city walls are destroyed by a colossal titan that appears out of thin air. As the smaller titans flood the city, the two kids watch in horror as their mother is eaten alive. Eren vows that he will murder every single titan and take revenge for all of mankind.\n\n(Source: ANN)", + "age_rating": "R", + "age_rating_guide": "Violence, Profanity", + "url": "https:\/\/kitsu.io\/anime\/attack-on-titan", + "genres": ["Action", "Drama", "Fantasy", "Super Power"], + "streaming_links": [{ + "meta": { + "name": "Crunchyroll", + "link": true, + "logo": "<\/path><\/path><\/g><\/svg>" + }, + "link": "http:\/\/www.crunchyroll.com\/attack-on-titan", + "subs": ["en"], + "dubs": ["ja"] + }, { + "meta": { + "name": "Hulu", + "link": true, + "logo": "<\/path><\/svg>" + }, + "link": "http:\/\/www.hulu.com\/attack-on-titan", + "subs": ["en"], + "dubs": ["ja"] + }, { + "meta": { + "name": "Funimation", + "link": true, + "logo": "<\/path><\/svg>" + }, + "link": "http:\/\/www.funimation.com\/shows\/attack-on-titan\/videos\/episodes", + "subs": ["en"], + "dubs": ["ja"] + }, { + "meta": { + "name": "Netflix", + "link": false, + "logo": "<\/path><\/svg>" + }, + "link": "t", + "subs": ["en"], + "dubs": ["ja"] + }] +} \ No newline at end of file diff --git a/tests/test_data/Kitsu/animeBeforeTransform.json b/tests/test_data/Kitsu/animeBeforeTransform.json new file mode 100644 index 00000000..2a996e20 --- /dev/null +++ b/tests/test_data/Kitsu/animeBeforeTransform.json @@ -0,0 +1,291 @@ +{ + "slug": "attack-on-titan", + "synopsis": "Several hundred years ago, humans were nearly exterminated by titans. Titans are typically several stories tall, seem to have no intelligence, devour human beings and, worst of all, seem to do it for the pleasure rather than as a food source. A small percentage of humanity survived by enclosing themselves in a city protected by extremely high walls, even taller than the biggest of titans. Flash forward to the present and the city has not seen a titan in over 100 years. Teenage boy Eren and his foster sister Mikasa witness something horrific as the city walls are destroyed by a colossal titan that appears out of thin air. As the smaller titans flood the city, the two kids watch in horror as their mother is eaten alive. Eren vows that he will murder every single titan and take revenge for all of mankind.\n\n(Source: ANN)", + "coverImageTopOffset": 263, + "titles": { + "en": "Attack on Titan", + "en_jp": "Shingeki no Kyojin", + "ja_jp": "\u9032\u6483\u306e\u5de8\u4eba" + }, + "canonicalTitle": "Attack on Titan", + "abbreviatedTitles": null, + "averageRating": 4.2678183033371, + "ratingFrequencies": { + "0.0": "3", + "0.5": "126", + "1.0": "292", + "1.5": "172", + "2.0": "394", + "2.5": "817", + "3.0": "2423", + "3.5": "3210", + "4.0": "5871", + "4.5": "6159", + "5.0": "13117", + "nil": "18571", + "0.479": "-1", + "4.658": "-3", + "4.726": "-1", + "4.932": "-1", + "2.05479452054794": "1", + "2.53424657534247": "1", + "4.10958904109589": "1", + "4.65753424657534": "3", + "4.72602739726027": "3", + "4.86301369863014": "1", + "4.93150684931507": "2", + "0.273972602739726": "1", + "0.410958904109589": "2", + "0.479452054794521": "1", + "0.684931506849315": "1" + }, + "startDate": "2013-04-07", + "endDate": "2013-09-28", + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/tiny.jpg?1418580054", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/small.jpg?1418580054", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/medium.jpg?1418580054", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/large.jpg?1418580054", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/original.jpg?1418580054" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/7442\/small.jpg?1471880659", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/7442\/large.jpg?1471880659", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/7442\/original.png?1471880659" + }, + "episodeCount": 25, + "episodeLength": 24, + "subtype": "TV", + "youtubeVideoId": "n4Nj6Y_SNYI", + "ageRating": "R", + "ageRatingGuide": "Violence, Profanity", + "showType": "TV", + "nsfw": false, + "included": [ + { + "id": "23", + "type": "genres", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/genres\/23" + }, + "attributes": { + "name": "Super Power", + "slug": "super-power", + "description": null + } + }, + { + "id": "11", + "type": "genres", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/genres\/11" + }, + "attributes": { + "name": "Fantasy", + "slug": "fantasy", + "description": "" + } + }, + { + "id": "4", + "type": "genres", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/genres\/4" + }, + "attributes": { + "name": "Drama", + "slug": "drama", + "description": "" + } + }, + { + "id": "1", + "type": "genres", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/genres\/1" + }, + "attributes": { + "name": "Action", + "slug": "action", + "description": "" + } + }, + { + "id": "5686", + "type": "mappings", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/mappings\/5686" + }, + "attributes": { + "externalSite": "myanimelist\/anime", + "externalId": "16498" + }, + "relationships": { + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/mappings\/5686\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/mappings\/5686\/media" + } + } + } + }, + { + "id": "14153", + "type": "mappings", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/mappings\/14153" + }, + "attributes": { + "externalSite": "thetvdb\/series", + "externalId": "267440" + }, + "relationships": { + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/mappings\/14153\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/mappings\/14153\/media" + } + } + } + }, + { + "id": "15073", + "type": "mappings", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/mappings\/15073" + }, + "attributes": { + "externalSite": "thetvdb\/season", + "externalId": "514060" + }, + "relationships": { + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/mappings\/15073\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/mappings\/15073\/media" + } + } + } + }, + { + "id": "103", + "type": "streamingLinks", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/103" + }, + "attributes": { + "url": "http:\/\/www.crunchyroll.com\/attack-on-titan", + "subs": [ + "en" + ], + "dubs": [ + "ja" + ] + }, + "relationships": { + "streamer": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/103\/relationships\/streamer", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/103\/streamer" + } + }, + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/103\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/103\/media" + } + } + } + }, + { + "id": "102", + "type": "streamingLinks", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/102" + }, + "attributes": { + "url": "http:\/\/www.hulu.com\/attack-on-titan", + "subs": [ + "en" + ], + "dubs": [ + "ja" + ] + }, + "relationships": { + "streamer": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/102\/relationships\/streamer", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/102\/streamer" + } + }, + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/102\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/102\/media" + } + } + } + }, + { + "id": "101", + "type": "streamingLinks", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/101" + }, + "attributes": { + "url": "http:\/\/www.funimation.com\/shows\/attack-on-titan\/videos\/episodes", + "subs": [ + "en" + ], + "dubs": [ + "ja" + ] + }, + "relationships": { + "streamer": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/101\/relationships\/streamer", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/101\/streamer" + } + }, + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/101\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/101\/media" + } + } + } + }, + { + "id": "100", + "type": "streamingLinks", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/100" + }, + "attributes": { + "url": "t", + "subs": [ + "en" + ], + "dubs": [ + "ja" + ] + }, + "relationships": { + "streamer": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/100\/relationships\/streamer", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/100\/streamer" + } + }, + "media": { + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/100\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/streaming-links\/100\/media" + } + } + } + } + ] +} \ No newline at end of file diff --git a/tests/test_data/Kitsu/animeListItemAfterTransform.json b/tests/test_data/Kitsu/animeListItemAfterTransform.json index c54e9bc9..feae9e8d 100644 --- a/tests/test_data/Kitsu/animeListItemAfterTransform.json +++ b/tests/test_data/Kitsu/animeListItemAfterTransform.json @@ -1,28 +1 @@ -{ - "id": "14047981", - "mal_id": null, - "episodes": { - "watched": 38, - "total": 48, - "length": 24 - }, - "airing": { - "status": "Finished Airing", - "started": "2012-02-05", - "ended": "2013-01-27" - }, - "anime": { - "age_rating": "PG", - "titles": ["Smile Precure!", "Glitter Force", "\u30b9\u30de\u30a4\u30eb\u30d7\u30ea\u30ad\u30e5\u30a2\uff01"], - "slug": "smile-precure", - "type": "TV", - "image": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/small.jpg?1408459122", - "genres": ["Magic", "Kids", "Mahou Shoujo", "Fantasy"] - }, - "watching_status": "current", - "notes": "Very formulaic.", - "rewatching": false, - "rewatched": 0, - "user_rating": 8, - "private": false -} \ No newline at end of file +{"id":"15839442","mal_id":"33206","episodes":{"watched":0,"total":"-","length":null},"airing":{"status":"Currently Airing","started":"2017-01-12","ended":null},"anime":{"age_rating":null,"titles":["Kobayashi-san Chi no Maid Dragon","Miss Kobayashi's Dragon Maid","\u5c0f\u6797\u3055\u3093\u3061\u306e\u30e1\u30a4\u30c9\u30e9\u30b4\u30f3"],"slug":"kobayashi-san-chi-no-maid-dragon","type":"TV","image":"https:\/\/media.kitsu.io\/anime\/poster_images\/12243\/small.jpg?1481144116","genres":["Comedy","Fantasy","Slice of Life"],"streaming_links":[]},"watching_status":"current","notes":null,"rewatching":false,"rewatched":0,"user_rating":"-","private":false} \ No newline at end of file diff --git a/tests/test_data/Kitsu/animeListItemBeforeTransform.json b/tests/test_data/Kitsu/animeListItemBeforeTransform.json index 0b2c0a53..3421281c 100644 --- a/tests/test_data/Kitsu/animeListItemBeforeTransform.json +++ b/tests/test_data/Kitsu/animeListItemBeforeTransform.json @@ -1,153 +1,1094 @@ { - "id": "14047981", + "id": "15839442", "type": "libraryEntries", "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442" }, "attributes": { "status": "current", - "progress": 38, + "progress": 0, "reconsuming": false, "reconsumeCount": 0, - "notes": "Very formulaic.", + "notes": null, "private": false, - "rating": "4.0", - "updatedAt": "2017-01-12T18:24:24.867Z" + "rating": null, + "updatedAt": "2017-01-13T01:32:31.832Z" }, "relationships": { "user": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/user", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/user" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/user", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/user" } }, "anime": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/anime", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/anime" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/anime", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/anime" } }, "manga": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/manga", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/manga" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/manga", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/manga" } }, "drama": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/drama", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/drama" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/drama", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/drama" } }, "review": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/review", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/review" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/review", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/review" } }, "media": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/media", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/media" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/media" }, "data": { "type": "anime", - "id": "6687" + "id": "12243" } }, "unit": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/unit", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/unit" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/unit", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/unit" } }, "nextUnit": { "links": { - "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/relationships\/next-unit", - "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/14047981\/next-unit" + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/relationships\/next-unit", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/next-unit" } } }, - "anime": { - "slug": "smile-precure", - "synopsis": "Once upon a time, there was a kingdom of fairy tales called \"M\u00e4rchenland\", where many fairy tale characters live together in joy. Suddenly, the evil emperor Pierrot made an invasion on M\u00e4rchenland, sealing its Queen in the process. To revive the Queen, the symbol of happiness called Cure Decor, \"the Queen's scattered power of light of happiness\", is required. To collect the Cure Decor, a fairy named Candy searches for the Pretty Cures on Earth. There, Candy meets a girl, who decides to collect the Cure Decor. Now, will the world earn a \"happy ending\"?", - "coverImageTopOffset": 100, - "titles": { - "en": "Glitter Force", - "en_jp": "Smile Precure!", - "ja_jp": "\u30b9\u30de\u30a4\u30eb\u30d7\u30ea\u30ad\u30e5\u30a2\uff01" - }, - "canonicalTitle": "Smile Precure!", - "abbreviatedTitles": null, - "averageRating": 3.6674651842659, - "ratingFrequencies": { - "0.5": "4", - "1.0": "8", - "1.5": "3", - "2.0": "17", - "2.5": "30", - "3.0": "54", - "3.5": "69", - "4.0": "96", - "4.5": "42", - "5.0": "57", - "nil": "594" - }, - "startDate": "2012-02-05", - "endDate": "2013-01-27", - "posterImage": { - "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/tiny.jpg?1408459122", - "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/small.jpg?1408459122", - "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/medium.jpg?1408459122", - "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/large.jpg?1408459122", - "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/original.jpg?1408459122" - }, - "coverImage": { - "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/6687\/small.jpg?1452609041", - "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/6687\/large.jpg?1452609041", - "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/6687\/original.png?1452609041" - }, - "episodeCount": 48, - "episodeLength": 24, - "subtype": "TV", - "youtubeVideoId": "", - "ageRating": "PG", - "ageRatingGuide": "Children", - "showType": "TV", - "nsfw": false, - "relationships": { - "genres": { - "8": { - "name": "Magic", - "slug": "magic", - "description": null + "included": { + "anime": { + "12243": { + "slug": "kobayashi-san-chi-no-maid-dragon", + "synopsis": "Kobayashi lives alone in an apartment, until one day, Tooru appeared and they ended up living together. Tooru looks down on humans as inferior and foolish, but having been saved by Kobayashi-san, she does everything she can to repay the debt and help her with various things, although not everything goes according to plan.\r\n\r\nA mythical everyday life comedy about a hard working office lady living with a dragon girl.", + "coverImageTopOffset": 0, + "titles": { + "en": "Miss Kobayashi's Dragon Maid", + "en_jp": "Kobayashi-san Chi no Maid Dragon", + "ja_jp": "\u5c0f\u6797\u3055\u3093\u3061\u306e\u30e1\u30a4\u30c9\u30e9\u30b4\u30f3" }, - "40": { - "name": "Kids", - "slug": "kids", - "description": null + "canonicalTitle": "Kobayashi-san Chi no Maid Dragon", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "0", + "1.0": "1", + "1.5": "0", + "2.0": "2", + "2.5": "2", + "3.0": "6", + "3.5": "10", + "4.0": "8", + "4.5": "1", + "5.0": "15", + "nil": "214" }, - "47": { - "name": "Mahou Shoujo", - "slug": "mahou-shoujo", - "description": "Magical Girls" + "startDate": "2017-01-12", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12243\/tiny.jpg?1481144116", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12243\/small.jpg?1481144116", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12243\/medium.jpg?1481144116", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12243\/large.jpg?1481144116", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12243\/original.jpg?1481144116" }, - "11": { - "name": "Fantasy", - "slug": "fantasy", - "description": "" + "coverImage": null, + "episodeCount": null, + "episodeLength": null, + "subtype": "TV", + "youtubeVideoId": "Vx-cdrHiGd0", + "ageRating": null, + "ageRatingGuide": "", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "11": { + "name": "Fantasy", + "slug": "fantasy", + "description": "" + }, + "16": { + "name": "Slice of Life", + "slug": "slice-of-life", + "description": "" + } + }, + "mappings": { + "10780": { + "externalSite": "myanimelist\/anime", + "externalId": "33206", + "relationships": [] + } + } } }, - "mappings": { - "778": { - "externalSite": "myanimelist\/anime", - "externalId": "12191", - "relationships": [] + "6687": { + "slug": "smile-precure", + "synopsis": "Once upon a time, there was a kingdom of fairy tales called \"M\u00e4rchenland\", where many fairy tale characters live together in joy. Suddenly, the evil emperor Pierrot made an invasion on M\u00e4rchenland, sealing its Queen in the process. To revive the Queen, the symbol of happiness called Cure Decor, \"the Queen's scattered power of light of happiness\", is required. To collect the Cure Decor, a fairy named Candy searches for the Pretty Cures on Earth. There, Candy meets a girl, who decides to collect the Cure Decor. Now, will the world earn a \"happy ending\"?", + "coverImageTopOffset": 100, + "titles": { + "en": "Glitter Force", + "en_jp": "Smile Precure!", + "ja_jp": "\u30b9\u30de\u30a4\u30eb\u30d7\u30ea\u30ad\u30e5\u30a2\uff01" }, - "12547": { - "externalSite": "thetvdb\/series", - "externalId": "255904", - "relationships": [] + "canonicalTitle": "Smile Precure!", + "abbreviatedTitles": null, + "averageRating": 3.6674651842659, + "ratingFrequencies": { + "0.5": "4", + "1.0": "8", + "1.5": "3", + "2.0": "17", + "2.5": "30", + "3.0": "54", + "3.5": "69", + "4.0": "96", + "4.5": "42", + "5.0": "57", + "nil": "594" + }, + "startDate": "2012-02-05", + "endDate": "2013-01-27", + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/tiny.jpg?1408459122", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/small.jpg?1408459122", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/medium.jpg?1408459122", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/large.jpg?1408459122", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/6687\/original.jpg?1408459122" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/6687\/small.jpg?1452609041", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/6687\/large.jpg?1452609041", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/6687\/original.png?1452609041" + }, + "episodeCount": 48, + "episodeLength": 24, + "subtype": "TV", + "youtubeVideoId": "", + "ageRating": "PG", + "ageRatingGuide": "Children", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "8": { + "name": "Magic", + "slug": "magic", + "description": null + }, + "40": { + "name": "Kids", + "slug": "kids", + "description": null + }, + "47": { + "name": "Mahou Shoujo", + "slug": "mahou-shoujo", + "description": "Magical Girls" + }, + "11": { + "name": "Fantasy", + "slug": "fantasy", + "description": "" + } + }, + "mappings": { + "778": { + "externalSite": "myanimelist\/anime", + "externalId": "12191", + "relationships": [] + }, + "12547": { + "externalSite": "thetvdb\/series", + "externalId": "255904", + "relationships": [] + } + } + } + }, + "12596": { + "slug": "idol-jihen", + "synopsis": "", + "coverImageTopOffset": 0, + "titles": { + "en": null, + "en_jp": "Idol Jihen", + "ja_jp": null + }, + "canonicalTitle": "Idol Jihen", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "1", + "2.0": "2", + "2.5": "2", + "3.0": "3", + "3.5": "2", + "5.0": "1", + "nil": "19" + }, + "startDate": "2017-01-01", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12596\/tiny.jpg?1475248797", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12596\/small.jpg?1475248797", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12596\/medium.jpg?1475248797", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12596\/large.jpg?1475248797", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12596\/original.jpg?1475248797" + }, + "coverImage": null, + "episodeCount": null, + "episodeLength": 0, + "subtype": "TV", + "youtubeVideoId": null, + "ageRating": null, + "ageRatingGuide": null, + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "35": { + "name": "Music", + "slug": "music", + "description": null + } + }, + "mappings": { + "6246": { + "externalSite": "myanimelist\/anime", + "externalId": "34028", + "relationships": [] + } + } + } + }, + "12529": { + "slug": "demi-chan-wa-kataritai", + "synopsis": "Monsters of legend walk among us, going by the name \u201cdemi-humans.\u201d Ever since he's discovered the \u201cdemis,\u201d one young man has become obsessed with them. So when he gets a job as a teacher at a high school for demi-girls, it's a dream come true! But these demis, who include a rambunctious vampire, a bashful headless girl, and a succubus, have all the problems normal teenagers have, on top of their supernatural conditions. How to handle a classroom full of them?!\n\n(Source: Kodansha Comics)", + "coverImageTopOffset": 200, + "titles": { + "en": "", + "en_jp": "Demi-chan wa Kataritai", + "ja_jp": "" + }, + "canonicalTitle": "Demi-chan wa Kataritai", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "1.5": "1", + "3.0": "8", + "3.5": "15", + "4.0": "28", + "4.5": "9", + "5.0": "7", + "nil": "201" + }, + "startDate": "2017-01-08", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12529\/tiny.jpg?1480530358", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12529\/small.jpg?1480530358", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12529\/medium.jpg?1480530358", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12529\/large.jpg?1480530358", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12529\/original.png?1480530358" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/12529\/small.jpg?1480537767", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/12529\/large.jpg?1480537767", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/12529\/original.png?1480537767" + }, + "episodeCount": null, + "episodeLength": null, + "subtype": "TV", + "youtubeVideoId": "", + "ageRating": null, + "ageRatingGuide": "", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "9": { + "name": "Supernatural", + "slug": "supernatural", + "description": null + }, + "24": { + "name": "School", + "slug": "school", + "description": null + } + }, + "mappings": { + "8667": { + "externalSite": "myanimelist\/anime", + "externalId": "33988", + "relationships": [] + } + } + } + }, + "11937": { + "slug": "kono-subarashii-sekai-ni-shukufuku-wo-2", + "synopsis": "Second season of Kono Subarashii Sekai ni Shukufuku wo!", + "coverImageTopOffset": 240, + "titles": { + "en": "KonoSuba: God's Blessing on This Wonderful World! Second Season", + "en_jp": "Kono Subarashii Sekai ni Shukufuku wo! 2", + "ja_jp": "\u3053\u306e\u7d20\u6674\u3089\u3057\u3044\u4e16\u754c\u306b\u795d\u798f\u3092! 2" + }, + "canonicalTitle": "Kono Subarashii Sekai ni Shukufuku wo! 2", + "abbreviatedTitles": null, + "averageRating": 4.2956263163849, + "ratingFrequencies": { + "0.5": "0", + "1.0": "1", + "1.5": "0", + "2.0": "1", + "2.5": "6", + "3.0": "4", + "3.5": "15", + "4.0": "14", + "4.5": "25", + "5.0": "85", + "nil": "1795" + }, + "startDate": "2017-01-11", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/11937\/tiny.jpg?1480974549", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/11937\/small.jpg?1480974549", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/11937\/medium.jpg?1480974549", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/11937\/large.jpg?1480974549", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/11937\/original.jpg?1480974549" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/11937\/small.jpg?1480444804", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/11937\/large.jpg?1480444804", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/11937\/original.png?1480444804" + }, + "episodeCount": null, + "episodeLength": null, + "subtype": "TV", + "youtubeVideoId": "OAnW7RA3tIY", + "ageRating": "PG", + "ageRatingGuide": "Teens 13 or older", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "2": { + "name": "Adventure", + "slug": "adventure", + "description": null + }, + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "8": { + "name": "Magic", + "slug": "magic", + "description": null + }, + "9": { + "name": "Supernatural", + "slug": "supernatural", + "description": null + }, + "11": { + "name": "Fantasy", + "slug": "fantasy", + "description": "" + } + }, + "mappings": { + "2826": { + "externalSite": "myanimelist\/anime", + "externalId": "32937", + "relationships": [] + } + } + } + }, + "12687": { + "slug": "nyanko-days", + "synopsis": "It's an everyday life of a shy girl called Tomoko Konagai and three \"cats\" Maa, Roo, Shii. These cats are girls with cats' ears and can speak human language.\n\n(Source: MAL News)", + "coverImageTopOffset": 0, + "titles": { + "en": null, + "en_jp": "Nyanko Days", + "ja_jp": "\u306b\u3083\u3093\u3053\u30c7\u30a4\u30ba" + }, + "canonicalTitle": "Nyanko Days", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "1", + "1.0": "1", + "1.5": "1", + "2.0": "1", + "2.5": "1", + "3.0": "6", + "3.5": "1", + "4.0": "3", + "4.5": "1", + "5.0": "2", + "nil": "39" + }, + "startDate": "2017-01-01", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12687\/tiny.jpg?1477621209", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12687\/small.jpg?1477621209", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12687\/medium.jpg?1477621209", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12687\/large.jpg?1477621209", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12687\/original.jpg?1477621209" + }, + "coverImage": null, + "episodeCount": null, + "episodeLength": null, + "subtype": "TV", + "youtubeVideoId": "", + "ageRating": null, + "ageRatingGuide": null, + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "16": { + "name": "Slice of Life", + "slug": "slice-of-life", + "description": "" + } + }, + "mappings": { + "10686": { + "externalSite": "myanimelist\/anime", + "externalId": "34148", + "relationships": [] + } + } + } + }, + "12267": { + "slug": "masamune-kun-no-revenge", + "synopsis": "As a child, Masamune Makabe once suffered greatly at the hands of a wealthy and beautiful girl named Aki Adagaki, who nicknamed him \"Piggy\" due to his chubby appearance. Seeking revenge against his tormentor, Masamune works hard to improve himself and returns as an incredibly handsome, albeit narcissistic, high school student. When he encounters Aki once again, he is prepared to exact vengeance.\r\n\r\nWith the aid of the rich girl's maid, Yoshino Koiwai, Masamune slowly begins to build his relationship with Aki, intending to break her heart when the time is right. However, as his friendship with Aki begins to grow, Masamune starts to question the objectives of his devious plans, and if bringing them to fruition is what his heart truly desires.\r\n\r\n(Source: MAL Rewrite)", + "coverImageTopOffset": 100, + "titles": { + "en": "Masamune-kun's Revenge", + "en_jp": "Masamune-kun no Revenge", + "ja_jp": "\u653f\u5b97\u304f\u3093\u306e\u30ea\u30d9\u30f3\u30b8" + }, + "canonicalTitle": "Masamune-kun no Revenge", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "0", + "1.5": "1", + "2.0": "5", + "2.5": "5", + "3.0": "14", + "3.5": "25", + "4.0": "33", + "4.5": "11", + "5.0": "22", + "nil": "569" + }, + "startDate": "2017-01-05", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12267\/tiny.jpg?1474666437", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12267\/small.jpg?1474666437", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12267\/medium.jpg?1474666437", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12267\/large.jpg?1474666437", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12267\/original.png?1474666437" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/12267\/small.jpg?1466985168", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/12267\/large.jpg?1466985168", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/12267\/original.jpg?1466985168" + }, + "episodeCount": null, + "episodeLength": null, + "subtype": "TV", + "youtubeVideoId": "XmfXcVLA1d8", + "ageRating": null, + "ageRatingGuide": "", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "24": { + "name": "School", + "slug": "school", + "description": null + }, + "34": { + "name": "Harem", + "slug": "harem", + "description": null + }, + "14": { + "name": "Romance", + "slug": "romance", + "description": "" + } + }, + "mappings": { + "7026": { + "externalSite": "myanimelist\/anime", + "externalId": "33487", + "relationships": [] + } + } + } + }, + "12497": { + "slug": "gabriel-dropout", + "synopsis": "Chief Angel has come to Earth! However, she became so used to the life on Earth that she skips school and keeps playing online games, thus into self-destruction. It's a school comedy that Gabriel turns into a lazy angel!\r\n\r\n(Source: MAL News)", + "coverImageTopOffset": 0, + "titles": { + "en": null, + "en_jp": "Gabriel DropOut", + "ja_jp": null + }, + "canonicalTitle": "Gabriel DropOut", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "1.5": "1", + "2.5": "1", + "3.0": "8", + "3.5": "11", + "4.0": "12", + "4.5": "3", + "5.0": "9", + "nil": "98" + }, + "startDate": "2017-01-09", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12497\/tiny.jpg?1477681044", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12497\/small.jpg?1477681044", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12497\/medium.jpg?1477681044", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12497\/large.jpg?1477681044", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12497\/original.jpg?1477681044" + }, + "coverImage": null, + "episodeCount": null, + "episodeLength": null, + "subtype": "TV", + "youtubeVideoId": "4eADGP3b9j0", + "ageRating": null, + "ageRatingGuide": null, + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "9": { + "name": "Supernatural", + "slug": "supernatural", + "description": null + }, + "24": { + "name": "School", + "slug": "school", + "description": null + } + }, + "mappings": { + "9049": { + "externalSite": "myanimelist\/anime", + "externalId": "33731", + "relationships": [] + } + } + } + }, + "12710": { + "slug": "fate-grand-order-first-order", + "synopsis": "The story is set in the year 2015, during the final era over which magic still held sway. The humanity survival and security organization Caldea was established to observe the world that can only be seen by magic and the world that can only be measured by science \u2014 as well as to prevent the final extinction of mankind.\r\n\r\nThanks to the efforts of many researchers, the path of human history has been ensured for 100 years into the future. However, without warning, the realm of the future that was under constant observation by Caldea vanished. The extinction of humanity in 2017 was observed \u2014 no, confirmed.\r\n\r\nThe apparent cause of the extinction was in the Japanese city of Fuyuki in 2004. In that city, there was an \"unobservable realm\" which had never existed until now.\r\n\r\nCaldea issued the Grand Order for a \"Holy Grail Expedition,\" to investigate, uncover, and possibly destroy the singularity that apparently will cause the extinction of humanity.\r\n\r\n(Source: ANN)", + "coverImageTopOffset": 0, + "titles": { + "en": "", + "en_jp": "Fate\/Grand Order -First Order-", + "ja_jp": "" + }, + "canonicalTitle": "Fate\/Grand Order -First Order-", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "3", + "1.0": "9", + "1.5": "14", + "2.0": "13", + "2.5": "17", + "3.0": "53", + "3.5": "73", + "4.0": "57", + "4.5": "14", + "5.0": "20", + "nil": "120" + }, + "startDate": "2016-12-31", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12710\/tiny.jpg?1478137267", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12710\/small.jpg?1478137267", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12710\/medium.jpg?1478137267", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12710\/large.jpg?1478137267", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12710\/original.jpeg?1478137267" + }, + "coverImage": null, + "episodeCount": 1, + "episodeLength": null, + "subtype": "special", + "youtubeVideoId": "gd1gYH8g2Vg", + "ageRating": null, + "ageRatingGuide": "", + "showType": "special", + "nsfw": false, + "relationships": { + "genres": { + "8": { + "name": "Magic", + "slug": "magic", + "description": null + }, + "9": { + "name": "Supernatural", + "slug": "supernatural", + "description": null + }, + "11": { + "name": "Fantasy", + "slug": "fantasy", + "description": "" + }, + "1": { + "name": "Action", + "slug": "action", + "description": "" + } + }, + "mappings": { + "6914": { + "externalSite": "myanimelist\/anime", + "externalId": "34321", + "relationships": [] + } + } + } + }, + "11172": { + "slug": "classicaloid", + "synopsis": "Kanae's got a two oddball houseguests in her beloved grandmother's mansion: Moz and Beetho-san. However, these guys, with their crazy antics and supernatural musical powers, claim to be Classicaloid versions of maestros Mozart and Beethoven! Their powerful \u201cmujik\u201d arrangements evoke more than just emotions: they can make the stars fall, spirits dance, or even summon\u2026 giant robots? Friend or foe, Kanae is stuck with them, even as more classicaloids begin to invade her life. Will their presence usher in a new musical renaissance in her sleepy town, or will their explosive euphonics cut the standing ovation short?\n\n(Source: Sentai Filmworks)", + "coverImageTopOffset": 0, + "titles": { + "en": null, + "en_jp": "Classicaloid", + "ja_jp": null + }, + "canonicalTitle": "Classicaloid", + "abbreviatedTitles": null, + "averageRating": 3.3375220536964, + "ratingFrequencies": { + "0.5": "5", + "1.0": "6", + "1.5": "8", + "2.0": "9", + "2.5": "19", + "3.0": "20", + "3.5": "13", + "4.0": "5", + "4.5": "3", + "5.0": "13", + "nil": "586" + }, + "startDate": "2016-10-08", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/11172\/tiny.jpg?1473684531", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/11172\/small.jpg?1473684531", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/11172\/medium.jpg?1473684531", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/11172\/large.jpg?1473684531", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/11172\/original.jpg?1473684531" + }, + "coverImage": null, + "episodeCount": 25, + "episodeLength": 24, + "subtype": "TV", + "youtubeVideoId": "3U2YT9b4QjI", + "ageRating": null, + "ageRatingGuide": null, + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + }, + "35": { + "name": "Music", + "slug": "music", + "description": null + } + }, + "mappings": { + "1113": { + "externalSite": "myanimelist\/anime", + "externalId": "31157", + "relationships": [] + } + } + } + }, + "12260": { + "slug": "shuumatsu-no-izetta", + "synopsis": "The time is pre World War II that looks like Europe in an imaginary world. A large scale war abrupts and bloody battles are taking place through out the world. Eylstadt is a small country without a strong military force or natural resources. Fin\u00e9 who is the crown queen of Eylstadt decides to use a secret weapon against larger countries which was unheard of at that time to battle against larger countries. The secret weapon was using a witch named Izetta and her magical force to fight the war. Izetta is young (same age as Fin\u00e9) and the last surviving witch with burning red hair.\r\n\r\n(Source: Crunchyroll)", + "coverImageTopOffset": 0, + "titles": { + "en": "Izetta: The Last Witch", + "en_jp": "Shuumatsu no Izetta", + "ja_jp": "\u7d42\u672b\u306e\u30a4\u30bc\u30c3\u30bf" + }, + "canonicalTitle": "Shuumatsu no Izetta", + "abbreviatedTitles": null, + "averageRating": 3.6080106339216, + "ratingFrequencies": { + "0.5": "3", + "1.0": "10", + "1.5": "21", + "2.0": "48", + "2.5": "98", + "3.0": "169", + "3.5": "199", + "4.0": "143", + "4.5": "66", + "5.0": "77", + "nil": "2381" + }, + "startDate": "2016-10-01", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/12260\/tiny.jpg?1475958976", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/12260\/small.jpg?1475958976", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/12260\/medium.jpg?1475958976", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/12260\/large.jpg?1475958976", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/12260\/original.png?1475958976" + }, + "coverImage": null, + "episodeCount": 12, + "episodeLength": 25, + "subtype": "TV", + "youtubeVideoId": "piEEGQdBho8", + "ageRating": null, + "ageRatingGuide": "", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "8": { + "name": "Magic", + "slug": "magic", + "description": null + }, + "27": { + "name": "Historical", + "slug": "historical", + "description": null + }, + "28": { + "name": "Military", + "slug": "military", + "description": null + }, + "4": { + "name": "Drama", + "slug": "drama", + "description": "" + }, + "1": { + "name": "Action", + "slug": "action", + "description": "" + } + }, + "mappings": { + "3376": { + "externalSite": "myanimelist\/anime", + "externalId": "33433", + "relationships": [] + } + } + } + }, + "11945": { + "slug": "nyanbo", + "synopsis": "NHK announced that \"Nyanbo,\" a cat version of the \"Danbo\" cardboard robot character within Kiyohiko Azuma's Yotsuba&! manga, is inspiring a television anime that will premiere on NHK-E TV in October.\r\n\r\n(Source: ANN)", + "coverImageTopOffset": 20, + "titles": { + "en": "", + "en_jp": "Nyanbo!", + "ja_jp": "\u306b\u3083\u3093\u307c\u30fc!" + }, + "canonicalTitle": "Nyanbo!", + "abbreviatedTitles": null, + "averageRating": null, + "ratingFrequencies": { + "0.5": "1", + "1.0": "1", + "1.5": "3", + "2.0": "3", + "2.5": "3", + "3.0": "12", + "3.5": "4", + "4.0": "5", + "4.5": "1", + "5.0": "5", + "nil": "146" + }, + "startDate": "2016-09-27", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/11945\/tiny.jpg?1458335123", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/11945\/small.jpg?1458335123", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/11945\/medium.jpg?1458335123", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/11945\/large.jpg?1458335123", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/11945\/original.png?1458335123" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/11945\/small.jpg?1458335194", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/11945\/large.jpg?1458335194", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/11945\/original.jpg?1458335194" + }, + "episodeCount": 26, + "episodeLength": 5, + "subtype": "TV", + "youtubeVideoId": "", + "ageRating": "PG", + "ageRatingGuide": "Children", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "3": { + "name": "Comedy", + "slug": "comedy", + "description": null + } + }, + "mappings": { + "9580": { + "externalSite": "myanimelist\/anime", + "externalId": "32805", + "relationships": [] + } + } + } + }, + "11882": { + "slug": "bungou-stray-dogs-2", + "synopsis": "Second season of Bungou Stray Dogs.", + "coverImageTopOffset": 80, + "titles": { + "en": "", + "en_jp": "Bungou Stray Dogs 2nd Season", + "ja_jp": "" + }, + "canonicalTitle": "Bungou Stray Dogs 2nd Season", + "abbreviatedTitles": null, + "averageRating": 4.1712266171588, + "ratingFrequencies": { + "0.5": "1", + "1.0": "5", + "1.5": "2", + "2.0": "12", + "2.5": "15", + "3.0": "52", + "3.5": "119", + "4.0": "261", + "4.5": "173", + "5.0": "244", + "nil": "2175" + }, + "startDate": "2016-10-06", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/11882\/tiny.jpg?1466782284", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/11882\/small.jpg?1466782284", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/11882\/medium.jpg?1466782284", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/11882\/large.jpg?1466782284", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/11882\/original.jpg?1466782284" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/11882\/small.jpg?1462734002", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/11882\/large.jpg?1462734002", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/11882\/original.jpg?1462734002" + }, + "episodeCount": 12, + "episodeLength": 24, + "subtype": "TV", + "youtubeVideoId": "aeX94e7V0_w", + "ageRating": "R", + "ageRatingGuide": "", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "7": { + "name": "Mystery", + "slug": "mystery", + "description": null + }, + "9": { + "name": "Supernatural", + "slug": "supernatural", + "description": null + }, + "4": { + "name": "Drama", + "slug": "drama", + "description": "" + }, + "1": { + "name": "Action", + "slug": "action", + "description": "" + } + }, + "mappings": { + "3158": { + "externalSite": "myanimelist\/anime", + "externalId": "32867", + "relationships": [] + } + } + } + }, + "11363": { + "slug": "mahou-shoujo-ikusei-keikaku", + "synopsis": "The highly popular social network game \"Magical Girl Raising Project\" is a miraculous game that produces real Magical Girls with a chance of 1 in 10000 for each person. Girls who are lucky enough to gain the power of magic spend fulfilling days. But one day, the administration arbitrarily announces that \"There are too many magical girls so they will be halved\". The curtain will now be raised on the relentless and merciless survival game between 16 magical girls.\r\n\r\n(Source: Baka-Tsuki)", + "coverImageTopOffset": 300, + "titles": { + "en": "Magical Girl Raising Project", + "en_jp": "Mahou Shoujo Ikusei Keikaku", + "ja_jp": "" + }, + "canonicalTitle": "Mahou Shoujo Ikusei Keikaku", + "abbreviatedTitles": null, + "averageRating": 3.5054257833898, + "ratingFrequencies": { + "0.5": "4", + "1.0": "16", + "1.5": "13", + "2.0": "33", + "2.5": "54", + "3.0": "99", + "3.5": "141", + "4.0": "121", + "4.5": "55", + "5.0": "45", + "nil": "1458" + }, + "startDate": "2016-10-02", + "endDate": null, + "posterImage": { + "tiny": "https:\/\/media.kitsu.io\/anime\/poster_images\/11363\/tiny.jpg?1469134150", + "small": "https:\/\/media.kitsu.io\/anime\/poster_images\/11363\/small.jpg?1469134150", + "medium": "https:\/\/media.kitsu.io\/anime\/poster_images\/11363\/medium.jpg?1469134150", + "large": "https:\/\/media.kitsu.io\/anime\/poster_images\/11363\/large.jpg?1469134150", + "original": "https:\/\/media.kitsu.io\/anime\/poster_images\/11363\/original.jpg?1469134150" + }, + "coverImage": { + "small": "https:\/\/media.kitsu.io\/anime\/cover_images\/11363\/small.jpg?1480567882", + "large": "https:\/\/media.kitsu.io\/anime\/cover_images\/11363\/large.jpg?1480567882", + "original": "https:\/\/media.kitsu.io\/anime\/cover_images\/11363\/original.jpg?1480567882" + }, + "episodeCount": 12, + "episodeLength": 24, + "subtype": "TV", + "youtubeVideoId": "p4YXswlZHrA", + "ageRating": "PG", + "ageRatingGuide": "Teens 13 or older", + "showType": "TV", + "nsfw": false, + "relationships": { + "genres": { + "9": { + "name": "Supernatural", + "slug": "supernatural", + "description": null + }, + "21": { + "name": "Thriller", + "slug": "thriller", + "description": null + }, + "47": { + "name": "Mahou Shoujo", + "slug": "mahou-shoujo", + "description": "Magical Girls" + }, + "11": { + "name": "Fantasy", + "slug": "fantasy", + "description": "" + }, + "1": { + "name": "Action", + "slug": "action", + "description": "" + } + }, + "mappings": { + "342": { + "externalSite": "myanimelist\/anime", + "externalId": "33003", + "relationships": [] + } + } } } } From abfa97d99c3e57efe33d4e2eef835e9c57a1fb2d Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Fri, 13 Jan 2017 16:49:46 -0500 Subject: [PATCH 10/14] Update views to show streaming links --- app/views/anime/cover.php | 21 +++++++++++++++++++- app/views/anime/details.php | 38 ++++++++++++++++++++++++++++++++++--- app/views/anime/edit.php | 1 + app/views/anime/list.php | 13 ++++++++++++- public/css/base.css | 19 ++++++++++++------- public/css/base.myth.css | 19 ++++++++++++------- 6 files changed, 92 insertions(+), 19 deletions(-) diff --git a/app/views/anime/cover.php b/app/views/anime/cover.php index 1f34380b..41bd3f4b 100644 --- a/app/views/anime/cover.php +++ b/app/views/anime/cover.php @@ -11,7 +11,7 @@
is_authenticated()) continue; ?> -
+
is_authenticated()): ?> @@ -32,6 +32,7 @@ +
@@ -41,11 +42,29 @@
+ 0): ?>
Rewatched time(s)
+ + 0): ?> +
+ + + +
+ +
Rating: / 10
Episodes: diff --git a/app/views/anime/details.php b/app/views/anime/details.php index 5e68c447..6aa91b08 100644 --- a/app/views/anime/details.php +++ b/app/views/anime/details.php @@ -1,10 +1,10 @@
- <?= $data['title'] ?> cover image +

- +
@@ -42,7 +42,39 @@

- */ ?> + 0): ?> +
+

Streaming on:

+
Airing Status
+ + + + + + + + + + + + + + + + + + + */ ?>
\ No newline at end of file diff --git a/app/views/anime/edit.php b/app/views/anime/edit.php index 28a0673e..7d234129 100644 --- a/app/views/anime/edit.php +++ b/app/views/anime/edit.php @@ -1,4 +1,5 @@ is_authenticated()): ?> + */ ?>

Edit Anime List Item

diff --git a/app/views/anime/list.php b/app/views/anime/list.php index 3f2471af..ebb473e3 100644 --- a/app/views/anime/list.php +++ b/app/views/anime/list.php @@ -19,7 +19,7 @@ Type Progress Rated - Attributes + Attributes Notes Genres @@ -61,6 +61,17 @@ + + + + + + + + + + +

html($item['notes']) ?>

diff --git a/public/css/base.css b/public/css/base.css index 13befd89..c3bcb7b6 100644 --- a/public/css/base.css +++ b/public/css/base.css @@ -794,6 +794,10 @@ a:hover, a:active { background-color:#db7d12; } +.full_width { + width: 100%; +} + /* ----------------------------------------------------------------------------- CSS loading icon ------------------------------------------------------------------------------*/ @@ -1208,7 +1212,7 @@ a:hover, a:active { text-align:center; color: greenyellow; position:absolute; - top:5px; + top:147px; left:0; height:100%; width:100%; @@ -1248,8 +1252,9 @@ a:hover, a:active { } .details .cover { - max-width: 300px; - max-height: 435px; + display: block; + width: 284px; + height: 402px; } .details h2 { @@ -1261,11 +1266,11 @@ a:hover, a:active { margin: 1rem; } -.details table { +.details .media_details { max-width:300px; } -.details td { +.details .media_details td { padding:0 15px; padding:0 1.5rem; } @@ -1274,13 +1279,13 @@ a:hover, a:active { text-align:justify; } -.details td:nth-child(odd) { +.details .media_details td:nth-child(odd) { width:1%; white-space:nowrap; text-align:right; } -.details td:nth-child(even) { +.details .media_details td:nth-child(even) { text-align:left; } diff --git a/public/css/base.myth.css b/public/css/base.myth.css index 80b0902f..3f481fb7 100644 --- a/public/css/base.myth.css +++ b/public/css/base.myth.css @@ -115,6 +115,10 @@ a:hover, a:active { background-color: var(--edit-link-hover-color); } +.full_width { + width: 100%; +} + /* ----------------------------------------------------------------------------- CSS loading icon ------------------------------------------------------------------------------*/ @@ -471,7 +475,7 @@ a:hover, a:active { text-align:center; color: greenyellow; position:absolute; - top:5px; + top:147px; left:0; height:100%; width:100%; @@ -505,8 +509,9 @@ a:hover, a:active { } .details .cover { - max-width: 300px; - max-height: 435px; + display: block; + width: 284px; + height: 402px; } .details h2 { @@ -517,10 +522,10 @@ a:hover, a:active { margin: 1rem; } -.details table { +.details .media_details { max-width:300px; } - .details td { + .details .media_details td { padding:0 1.5rem; } @@ -528,12 +533,12 @@ a:hover, a:active { text-align:justify; } -.details td:nth-child(odd) { +.details .media_details td:nth-child(odd) { width:1%; white-space:nowrap; text-align:right; } -.details td:nth-child(even) { +.details .media_details td:nth-child(even) { text-align:left; } From 29d8207c63666af9bfccf6032dc302d46ba8dd69 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Fri, 13 Jan 2017 16:51:31 -0500 Subject: [PATCH 11/14] Update search to bring in My anime list id for future integration --- public/js/anime_edit.js | 9 +++++---- public/js/manga_edit.js | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/public/js/anime_edit.js b/public/js/anime_edit.js index c4e53e15..37bb5a68 100644 --- a/public/js/anime_edit.js +++ b/public/js/anime_edit.js @@ -6,15 +6,16 @@ 'use strict'; // Action to increment episode count - _.on('body.anime.list', 'click', '.plus_one', function() { - let parent_sel = _.closestParent(this, 'article'); + _.on('body.anime.list', 'click', '.plus_one', e => { + let parent_sel = _.closestParent(e.target, 'article'); let watched_count = parseInt(_.$('.completed_number', parent_sel)[0].textContent, 10); let total_count = parseInt(_.$('.total_number', parent_sel)[0].textContent, 10); let title = _.$('.name a', parent_sel)[0].textContent; // Setup the update data let data = { - id: parent_sel.id, + id: parent_sel.dataset.kitsuId, + mal_id: parent_sel.dataset.malId, data: { progress: watched_count + 1 } @@ -41,7 +42,7 @@ _.hide(parent_sel); } - _.showMessage('success', `Sucessfully updated ${title}`); + _.showMessage('success', `Successfully updated ${title}`); _.$('.completed_number', parent_sel)[0].textContent = ++watched_count; _.scrollToTop(); }, diff --git a/public/js/manga_edit.js b/public/js/manga_edit.js index afe712ce..33b93ca6 100644 --- a/public/js/manga_edit.js +++ b/public/js/manga_edit.js @@ -5,9 +5,9 @@ 'use strict'; - _.on('.manga.list', 'click', '.edit_buttons button', function() { - let this_sel = this; - let parent_sel = _.closestParent(this, 'article'); + _.on('.manga.list', 'click', '.edit_buttons button', e => { + let this_sel = e.target; + let parent_sel = _.closestParent(e.target, 'article'); let manga_id = parent_sel.id.replace("manga-", ""); let type = this_sel.classList.contains("plus_one_chapter") ? 'chapter' : 'volume'; let completed = parseInt(_.$(`.${type}s_read`, parent_sel)[0].textContent, 10); From 68bee55f6a1fa0dff90ed7df903e8135c72f2a8d Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Fri, 13 Jan 2017 16:52:12 -0500 Subject: [PATCH 12/14] Cache API errors at the dispatcher level, so a more appropriate error page can be displayed --- src/Dispatcher.php | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Dispatcher.php b/src/Dispatcher.php index 6857e1ff..9b5892aa 100644 --- a/src/Dispatcher.php +++ b/src/Dispatcher.php @@ -18,6 +18,7 @@ namespace Aviat\AnimeClient; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Friend; +use GuzzleHttp\Exception\ServerException; /** * Basic routing/ dispatch @@ -128,9 +129,23 @@ class Dispatcher extends RoutingBase { $actionMethod = $error_route['action_method']; $params = $error_route['params']; } - - // Actually instantiate the controller - $this->call($controllerName, $actionMethod, $params); + + // Try to catch API errors in a presentable fashion + try + { + // Actually instantiate the controller + $this->call($controllerName, $actionMethod, $params); + } + catch (ServerException $e) + { + $response = $e->getResponse(); + $this->call(AnimeClient::DEFAULT_CONTROLLER, AnimeClient::ERROR_MESSAGE_METHOD, [ + $response->getStatusCode(), + 'API Error', + 'There was a problem getting data from an external source.', + (string) $response->getBody() + ]); + } } /** From d79370deb9b50d9c60906ee03dd95f96a600d84b Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Fri, 13 Jan 2017 16:53:56 -0500 Subject: [PATCH 13/14] Streaming links, caching, and more MAL integration --- app/bootstrap.php | 21 ++- src/API/CacheTrait.php | 63 ++++++++ src/API/Kitsu.php | 139 ++++++++++-------- src/API/Kitsu/KitsuModel.php | 60 +++++--- src/API/Kitsu/ListItem.php | 3 +- .../Transformer/AnimeListTransformer.php | 23 +-- .../Kitsu/Transformer/AnimeTransformer.php | 9 +- src/API/MAL/Auth.php | 108 -------------- src/API/MAL/ListItem.php | 3 +- src/API/MAL/Model.php | 29 +++- 10 files changed, 248 insertions(+), 210 deletions(-) create mode 100644 src/API/CacheTrait.php delete mode 100644 src/API/MAL/Auth.php diff --git a/app/bootstrap.php b/app/bootstrap.php index 8f6dd9f4..7a0454ef 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -19,9 +19,15 @@ namespace Aviat\AnimeClient; use Aura\Html\HelperLocatorFactory; use Aura\Router\RouterContainer; use Aura\Session\SessionFactory; -use Aviat\AnimeClient\API\Kitsu\Auth as KitsuAuth; -use Aviat\AnimeClient\API\Kitsu\ListItem as KitsuListItem; -use Aviat\AnimeClient\API\Kitsu\KitsuModel; +use Aviat\AnimeClient\API\Kitsu\{ + Auth as KitsuAuth, + ListItem as KitsuListItem, + KitsuModel +}; +use Aviat\AnimeClient\API\MAL\{ + ListItem as MALListItem, + Model as MALModel +}; use Aviat\AnimeClient\Model; use Aviat\Banker\Pool; use Aviat\Ion\Config; @@ -111,6 +117,15 @@ return function(array $config_array = []) { $listItem->setContainer($container); $model = new KitsuModel($listItem); $model->setContainer($container); + $cache = $container->get('cache'); + $model->setCache($cache); + return $model; + }); + $container->set('mal-model', function($container) { + $listItem = new MALListItem(); + $listItem->setContainer($container); + $model = new MALModel($listItem); + $model->setContainer($container); return $model; }); $container->set('api-model', function($container) { diff --git a/src/API/CacheTrait.php b/src/API/CacheTrait.php new file mode 100644 index 00000000..6ce11410 --- /dev/null +++ b/src/API/CacheTrait.php @@ -0,0 +1,63 @@ + + * @copyright 2015 - 2017 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 4.0 + * @link https://github.com/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\API; + +use Aviat\Banker\Pool; +use Aviat\Ion\Di\ContainerAware; + +/** + * Helper methods for dealing with the Cache + */ +trait CacheTrait { + + /** + * @var Aviat\Banker\Pool + */ + protected $cache; + + /** + * Inject the cache object + * + * @param Pool $cache + * @return $this + */ + public function setCache(Pool $cache): self + { + $this->cache = $cache; + return $this; + } + + /** + * Generate a hash as a cache key from the current method call + * + * @param object $object + * @param string $method + * @param array $args + * @return string + */ + public function getHashForMethodCall($object, string $method, array $args = []): string + { + $classname = get_class($object); + $keyObj = [ + 'class' => $classname, + 'method' => $method, + 'args' => $args, + ]; + $hash = sha1(json_encode($keyObj)); + return $hash; + } +} \ No newline at end of file diff --git a/src/API/Kitsu.php b/src/API/Kitsu.php index 9e0fc161..6a17f941 100644 --- a/src/API/Kitsu.php +++ b/src/API/Kitsu.php @@ -24,7 +24,7 @@ use Aviat\AnimeClient\API\Kitsu\Enum\{ use DateTimeImmutable; /** - * Constants and mappings for the Kitsu API + * Data massaging helpers for the Kitsu API */ class Kitsu { const AUTH_URL = 'https://kitsu.io/api/oauth/token'; @@ -45,6 +45,11 @@ class Kitsu { ]; } + /** + * Map of Kitsu Manga status to label for select menus + * + * @return array + */ public static function getStatusToMangaSelectMap() { return [ @@ -84,6 +89,78 @@ class Kitsu { return AnimeAiringStatus::NOT_YET_AIRED; } } + + /** + * Get the name and logo for the streaming service of the current link + * + * @param string $hostname + * @return array + */ + protected static function getServiceMetaData(string $hostname = null): array + { + switch($hostname) + { + case 'www.crunchyroll.com': + return [ + 'name' => 'Crunchyroll', + 'link' => true, + 'logo' => '' + ]; + + case 'www.funimation.com': + return [ + 'name' => 'Funimation', + 'link' => true, + 'logo' => '' + ]; + + case 'www.hulu.com': + return [ + 'name' => 'Hulu', + 'link' => true, + 'logo' => '' + ]; + + // Default to Netflix, because the API links are broken, + // and there's no other real identifier for Netflix + default: + return [ + 'name' => 'Netflix', + 'link' => false, + 'logo' => '' + ]; + } + } + + /** + * Reorganize streaming links + * + * @param array $included + * @return array + */ + public static function parseStreamingLinks(array $included): array + { + if ( ! array_key_exists('streamingLinks', $included)) + { + return []; + } + + $links = []; + + foreach ($included['streamingLinks'] as $streamingLink) + { + $host = parse_url($streamingLink['url'], \PHP_URL_HOST); + + $links[] = [ + 'meta' => static::getServiceMetaData($host), + 'link' => $streamingLink['url'], + 'subs' => $streamingLink['subs'], + 'dubs' => $streamingLink['dubs'] + ]; + } + + return $links; + } /** * Filter out duplicate and very similar names from @@ -110,66 +187,6 @@ class Kitsu { return $valid; } - /** - * Reorganizes 'included' data to be keyed by - * type => [ - * id => data/attributes, - * ] - * - * @param array $includes - * @return array - */ - public static function organizeIncludes(array $includes): array - { - $organized = []; - - foreach ($includes as $item) - { - $type = $item['type']; - $id = $item['id']; - $organized[$type] = $organized[$type] ?? []; - $organized[$type][$id] = $item['attributes']; - - if (array_key_exists('relationships', $item)) - { - $organized[$type][$id]['relationships'] = self::organizeRelationships($item['relationships']); - } - } - - return $organized; - } - - /** - * Reorganize relationship mappings to make them simpler to use - * - * Remove verbose structure, and just map: - * type => [ idArray ] - * - * @param array $relationships - * @return array - */ - public static function organizeRelationships(array $relationships): array - { - $organized = []; - - foreach($relationships as $key => $data) - { - if ( ! array_key_exists('data', $data)) - { - continue; - } - - $organized[$key] = $organized[$key] ?? []; - - foreach ($data['data'] as $item) - { - $organized[$key][] = $item['id']; - } - } - - return $organized; - } - /** * Determine if an alternate title is unique enough to list * diff --git a/src/API/Kitsu/KitsuModel.php b/src/API/Kitsu/KitsuModel.php index e1adfa08..d50cacb6 100644 --- a/src/API/Kitsu/KitsuModel.php +++ b/src/API/Kitsu/KitsuModel.php @@ -16,6 +16,7 @@ namespace Aviat\AnimeClient\API\Kitsu; +use Aviat\AnimeClient\API\CacheTrait; use Aviat\AnimeClient\API\JsonAPI; use Aviat\AnimeClient\API\Kitsu as K; use Aviat\AnimeClient\API\Kitsu\Transformer\{ @@ -29,6 +30,7 @@ use GuzzleHttp\Exception\ClientException; * Kitsu API Model */ class KitsuModel { + use CacheTrait; use ContainerAware; use KitsuTrait; @@ -60,6 +62,7 @@ class KitsuModel { * @var MangaListTransformer */ protected $mangaListTransformer; + /** * KitsuModel constructor. @@ -131,6 +134,7 @@ class KitsuModel { */ public function getAnime(string $animeId): array { + // @TODO catch non-existent anime $baseData = $this->getRawMediaData('anime', $animeId); return $this->animeTransformer->transform($baseData); } @@ -147,7 +151,13 @@ class KitsuModel { return $this->mangaTransformer->transform($baseData); } - public function getAnimeList($status): array + /** + * Get the anime list for the configured user + * + * @param string $status - The watching status to filter the list with + * @return array + */ + public function getAnimeList(string $status): array { $options = [ 'query' => [ @@ -156,26 +166,33 @@ class KitsuModel { 'media_type' => 'Anime', 'status' => $status, ], - 'include' => 'media,media.genres,media.mappings', + 'include' => 'media,media.genres,media.mappings,anime.streamingLinks', 'page' => [ 'offset' => 0, 'limit' => 500 - ], - 'sort' => '-updated_at' + ] ] ]; - - $data = $this->getRequest('library-entries', $options); - $included = JsonAPI::organizeIncludes($data['included']); - $included = JsonAPI::inlineIncludedRelationships($included, 'anime'); - - foreach($data['data'] as $i => &$item) + + $cacheItem = $this->cache->getItem($this->getHashForMethodCall($this, __METHOD__, $options)); + + if ( ! $cacheItem->isHit()) { - $item['included'] =& $included; - } - $transformed = $this->animeListTransformer->transformCollection($data['data']); + $data = $this->getRequest('library-entries', $options); + $included = JsonAPI::organizeIncludes($data['included']); + $included = JsonAPI::inlineIncludedRelationships($included, 'anime'); - return $transformed; + foreach($data['data'] as $i => &$item) + { + $item['included'] = $included; + } + $transformed = $this->animeListTransformer->transformCollection($data['data']); + + $cacheItem->set($transformed); + $cacheItem->save(); + } + + return $cacheItem->get(); } public function getMangaList($status): array @@ -242,19 +259,24 @@ class KitsuModel { public function getListItem(string $listId): array { $baseData = $this->listItem->get($listId); + $included = JsonAPI::organizeIncludes($baseData['included']); - switch ($baseData['included'][0]['type']) + + switch (TRUE) { - case 'anime': - $baseData['data']['anime'] = $baseData['included'][0]; + case in_array('anime', array_keys($included)): + $included = JsonAPI::inlineIncludedRelationships($included, 'anime'); + $baseData['data']['included'] = $included; return $this->animeListTransformer->transform($baseData['data']); - case 'manga': + case in_array('manga', array_keys($included)): + $included = JsonAPI::inlineIncludedRelationships($included, 'manga'); + $baseData['data']['included'] = $included; $baseData['data']['manga'] = $baseData['included'][0]; return $this->mangaListTransformer->transform($baseData['data']); default: - return $baseData['data']['attributes']; + return $baseData['data']; } } diff --git a/src/API/Kitsu/ListItem.php b/src/API/Kitsu/ListItem.php index f21101f8..57787f15 100644 --- a/src/API/Kitsu/ListItem.php +++ b/src/API/Kitsu/ListItem.php @@ -37,7 +37,6 @@ class ListItem extends AbstractListItem { public function create(array $data): bool { -/*?>
getResponse('POST', 'library-entries', [ 'body' => Json::encode([ 'data' => [ @@ -77,7 +76,7 @@ class ListItem extends AbstractListItem { { return $this->getRequest("library-entries/{$id}", [ 'query' => [ - 'include' => 'media' + 'include' => 'media,media.genres,media.mappings' ] ]); } diff --git a/src/API/Kitsu/Transformer/AnimeListTransformer.php b/src/API/Kitsu/Transformer/AnimeListTransformer.php index 6f1817cf..e153a2a1 100644 --- a/src/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeListTransformer.php @@ -33,28 +33,30 @@ class AnimeListTransformer extends AbstractTransformer { */ public function transform($item) { - $included = $item['included'] ?? []; +/* ?>
$item['id'], 'mal_id' => $MALid, 'episodes' => [ - 'watched' => $item['attributes']['progress'], + 'watched' => (int) $item['attributes']['progress'] !== '0' + ? (int) $item['attributes']['progress'] + : '-', 'total' => $total_episodes, 'length' => $anime['episodeLength'], ], @@ -79,6 +83,7 @@ class AnimeListTransformer extends AbstractTransformer { 'type' => $this->string($anime['showType'])->upperCaseFirst()->__toString(), 'image' => $anime['posterImage']['small'], 'genres' => $genres, + 'streaming_links' => Kitsu::parseStreamingLinks($included), ], 'watching_status' => $item['attributes']['status'], 'notes' => $item['attributes']['notes'], diff --git a/src/API/Kitsu/Transformer/AnimeTransformer.php b/src/API/Kitsu/Transformer/AnimeTransformer.php index e4339886..66f344f1 100644 --- a/src/API/Kitsu/Transformer/AnimeTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeTransformer.php @@ -36,12 +36,15 @@ class AnimeTransformer extends AbstractTransformer { $item['included'] = JsonAPI::organizeIncludes($item['included']); $item['genres'] = array_column($item['included']['genres'], 'name') ?? []; sort($item['genres']); + + $titles = Kitsu::filterTitles($item); return [ - 'titles' => Kitsu::filterTitles($item), + 'title' => $titles[0], + 'titles' => $titles, 'status' => Kitsu::getAiringStatus($item['startDate'], $item['endDate']), 'cover_image' => $item['posterImage']['small'], - 'show_type' => $item['showType'], + 'show_type' => $this->string($item['showType'])->upperCaseFirst()->__toString(), 'episode_count' => $item['episodeCount'], 'episode_length' => $item['episodeLength'], 'synopsis' => $item['synopsis'], @@ -49,7 +52,7 @@ class AnimeTransformer extends AbstractTransformer { 'age_rating_guide' => $item['ageRatingGuide'], 'url' => "https://kitsu.io/anime/{$item['slug']}", 'genres' => $item['genres'], - 'included' => $item['included'] + 'streaming_links' => Kitsu::parseStreamingLinks($item['included']) ]; } } \ No newline at end of file diff --git a/src/API/MAL/Auth.php b/src/API/MAL/Auth.php deleted file mode 100644 index 4f03508c..00000000 --- a/src/API/MAL/Auth.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2015 - 2017 Timothy J. Warren - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 4.0 - * @link https://github.com/timw4mail/HummingBirdAnimeClient - */ - -namespace Aviat\AnimeClient\API\MAL; - -use Aviat\AnimeClient\AnimeClient; -use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; - -/** - * MAL API Authentication - */ -class Auth { - - use \Aviat\Ion\Di\ContainerAware; - - /** - * Anime API Model - * - * @var \Aviat\AnimeClient\Model\API - */ - protected $model; - - /** - * Session object - * - * @var Aura\Session\Segment - */ - protected $segment; - - /** - * Constructor - * - * @param ContainerInterface $container - */ - public function __construct(ContainerInterface $container) - { - $this->setContainer($container); - $this->segment = $container->get('session') - ->getSegment(AnimeClient::SESSION_SEGMENT); - $this->model = $container->get('api-model'); - } - - /** - * Make the appropriate authentication call, - * and save the resulting auth token if successful - * - * @param string $password - * @return boolean - */ - public function authenticate($password) - { - $username = $this->container->get('config') - ->get('hummingbird_username'); - $auth_token = $this->model->authenticate($username, $password); - - if (FALSE !== $auth_token) - { - $this->segment->set('auth_token', $auth_token); - return TRUE; - } - - return FALSE; - } - - /** - * Check whether the current user is authenticated - * - * @return boolean - */ - public function is_authenticated() - { - return ($this->get_auth_token() !== FALSE); - } - - /** - * Clear authentication values - * - * @return void - */ - public function logout() - { - $this->segment->clear(); - } - - /** - * Retrieve the authentication token from the session - * - * @return string|false - */ - public function get_auth_token() - { - return $this->segment->get('auth_token', FALSE); - } -} -// End of KitsuAuth.php \ No newline at end of file diff --git a/src/API/MAL/ListItem.php b/src/API/MAL/ListItem.php index d5506f9a..03a04473 100644 --- a/src/API/MAL/ListItem.php +++ b/src/API/MAL/ListItem.php @@ -24,6 +24,7 @@ use Aviat\Ion\Di\ContainerAware; */ class ListItem extends AbstractListItem { use ContainerAware; + use MALTrait; public function __construct() { @@ -47,6 +48,6 @@ class ListItem extends AbstractListItem { public function update(string $id, array $data): Response { - // @TODO implement + } } \ No newline at end of file diff --git a/src/API/MAL/Model.php b/src/API/MAL/Model.php index b7f0f0c9..a2861c88 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -17,29 +17,50 @@ namespace Aviat\AnimeClient\API\MAL; use Aviat\AnimeClient\API\MAL as M; +use Aviat\AnimeClient\API\MAL\{ + AnimeListTransformer, + ListItem +}; +use Aviat\AnimeClient\API\XML; use Aviat\Ion\Di\ContainerAware; /** * MyAnimeList API Model */ class Model { - use ContainerAware; use MALTrait; + /** + * @var AnimeListTransformer + */ + protected $animeListTransformer; + + /** + * KitsuModel constructor. + */ + public function __construct(ListItem $listItem) + { + // Set up Guzzle trait + $this->init(); + $this->animeListTransformer = new AnimeListTransformer(); + $this->listItem = $listItem; + } + public function createListItem(array $data): bool { - + return FALSE; } public function getListItem(string $listId): array { - + return []; } public function updateListItem(array $data) { - + $updateData = $this->animeListTransformer->transform($data['data']); + return $this->listItem->update($data['mal_id'], $updateData); } public function deleteListItem(string $id): bool From a266c68f9b42a3bb769f16715cf2f419f8de77d7 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Mon, 16 Jan 2017 11:26:19 -0500 Subject: [PATCH 14/14] Restore cache clearing functionality --- app/views/main-menu.php | 4 ++-- src/API/CacheTrait.php | 10 ++++++++++ src/Controller.php | 2 +- src/Controller/Anime.php | 8 ++++---- src/Controller/Manga.php | 8 ++++---- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/views/main-menu.php b/app/views/main-menu.php index 6f3b99f9..3e0111ca 100644 --- a/app/views/main-menu.php +++ b/app/views/main-menu.php @@ -17,13 +17,13 @@ [Manga List] - is_authenticated()): ?> + is_authenticated()): ?>     - + is_authenticated()): ?> Logout diff --git a/src/API/CacheTrait.php b/src/API/CacheTrait.php index 6ce11410..211c3977 100644 --- a/src/API/CacheTrait.php +++ b/src/API/CacheTrait.php @@ -41,6 +41,16 @@ trait CacheTrait { return $this; } + /** + * Get the cache object if it exists + * + * @return Pool + */ + public function getCache() + { + return $this->cache; + } + /** * Generate a hash as a cache key from the current method call * diff --git a/src/Controller.php b/src/Controller.php index 708e1984..91148358 100644 --- a/src/Controller.php +++ b/src/Controller.php @@ -374,7 +374,7 @@ class Controller { */ public function clearCache() { - $this->cache->purge(); + $this->cache->clear(); $this->outputHTML('blank', [ 'title' => 'Cache cleared' ], NULL, 200); diff --git a/src/Controller/Anime.php b/src/Controller/Anime.php index 674171a4..455921a0 100644 --- a/src/Controller/Anime.php +++ b/src/Controller/Anime.php @@ -159,7 +159,7 @@ class Anime extends BaseController { if ($result) { $this->set_flash_message('Added new anime to list', 'success'); - // $this->cache->purge(); + $this->cache->clear(); } else { @@ -233,7 +233,7 @@ class Anime extends BaseController { if ($full_result['statusCode'] === 200) { $this->set_flash_message("Successfully updated.", 'success'); - // $this->cache->purge(); + $this->cache->clear(); } else { @@ -261,7 +261,7 @@ class Anime extends BaseController { $response = $this->model->updateLibraryItem($data); - // $this->cache->purge(); + $this->cache->clear(); $this->outputJSON($response['body'], $response['statusCode']); } @@ -278,7 +278,7 @@ class Anime extends BaseController { if ((bool)$response === TRUE) { $this->set_flash_message("Successfully deleted anime.", 'success'); - // $this->cache->purge(); + $this->cache->clear(); } else { diff --git a/src/Controller/Manga.php b/src/Controller/Manga.php index 96cc2959..08d93c87 100644 --- a/src/Controller/Manga.php +++ b/src/Controller/Manga.php @@ -142,7 +142,7 @@ class Manga extends Controller { if ($result) { $this->set_flash_message('Added new manga to list', 'success'); - // $this->cache->purge(); + $this->cache->clear(); } else { @@ -203,7 +203,7 @@ class Manga extends Controller { if ($full_result['statusCode'] === 200) { $this->set_flash_message("Successfully updated manga.", 'success'); - // $this->cache->purge(); + $this->cache->clear(); } else { @@ -232,7 +232,7 @@ class Manga extends Controller { $response = $this->model->updateLibraryItem($data); - // $this->cache->purge(); + $this->cache->clear(); $this->outputJSON($response['body'], $response['statusCode']); } @@ -250,7 +250,7 @@ class Manga extends Controller { if ($response) { $this->set_flash_message("Successfully deleted manga.", 'success'); - //$this->cache->purge(); + $this->cache->clear(); } else {