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) diff --git a/app/bootstrap.php b/app/bootstrap.php index 5c2bfd76..7a0454ef 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -8,7 +8,7 @@ * * @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 @@ -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/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..4fe4b5d5 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,6 +14,9 @@ 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" 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 diff --git a/app/views/anime/cover.php b/app/views/anime/cover.php index c30ea8c3..41bd3f4b 100644 --- a/app/views/anime/cover.php +++ b/app/views/anime/cover.php @@ -11,11 +11,11 @@
is_authenticated()) continue; ?> -
+
is_authenticated()): ?> - img($item['anime']['image']); ?> + +
@@ -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 0995fb65..6aa91b08 100644 --- a/app/views/anime/details.php +++ b/app/views/anime/details.php @@ -1,10 +1,10 @@
- <?= $data['title'] ?> cover image +

- +
@@ -15,16 +15,18 @@ - + + + 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 @@ - + @@ -61,6 +61,17 @@ + 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/build/header_comment.txt b/build/header_comment.txt index 506ee880..91b15c5d 100644 --- a/build/header_comment.txt +++ b/build/header_comment.txt @@ -7,7 +7,7 @@ * * @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 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/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; } 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); diff --git a/src/API/AbstractListItem.php b/src/API/AbstractListItem.php index e5c1e524..716f65f4 100644 --- a/src/API/AbstractListItem.php +++ b/src/API/AbstractListItem.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/CacheTrait.php b/src/API/CacheTrait.php new file mode 100644 index 00000000..211c3977 --- /dev/null +++ b/src/API/CacheTrait.php @@ -0,0 +1,73 @@ + + * @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; + } + + /** + * 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 + * + * @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/GuzzleTrait.php b/src/API/GuzzleTrait.php index 9fdb1998..6af78cde 100644 --- a/src/API/GuzzleTrait.php +++ b/src/API/GuzzleTrait.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/JsonAPI.php b/src/API/JsonAPI.php index 5e727f4f..1ea85ca2 100644 --- a/src/API/JsonAPI.php +++ b/src/API/JsonAPI.php @@ -8,7 +8,7 @@ * * @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 @@ -16,6 +16,8 @@ namespace Aviat\AnimeClient\API; +use Aviat\Ion\Json; + /** * Class encapsulating Json API data structure for a request or response */ @@ -40,12 +42,19 @@ class JsonAPI { */ protected $data = []; + /** + * Data array parsed out from a request + * + * @var array + */ + protected $parsedData = []; + /** * Related objects included with the request * * @var array */ - protected $included = []; + public $included = []; /** * Pagination links @@ -54,13 +63,142 @@ class JsonAPI { */ protected $links = []; + /** + * JsonAPI constructor + * + * @param array $initital + */ + public function __construct(array $initial = []) + { + $this->data = $initial; + } + + public function parseFromString(string $json) + { + $this->parse(Json::decode($json)); + } + /** * Parse a JsonAPI response into its components * * @param array $data */ public function parse(array $data) + { + $this->included = static::organizeIncludes($data['included']); + } + + /** + * Return data array after input is parsed + * to inline includes inside of relationship objects + * + * @return array + */ + public function getParsedData(): array { } + + /** + * 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.php b/src/API/Kitsu.php index 30bd94c6..6a17f941 100644 --- a/src/API/Kitsu.php +++ b/src/API/Kitsu.php @@ -8,7 +8,7 @@ * * @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 @@ -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/Auth.php b/src/API/Kitsu/Auth.php index 113d5fd8..04e2e395 100644 --- a/src/API/Kitsu/Auth.php +++ b/src/API/Kitsu/Auth.php @@ -8,7 +8,7 @@ * * @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 @@ -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/Enum/AnimeAiringStatus.php b/src/API/Kitsu/Enum/AnimeAiringStatus.php index a7bf27e9..606d07c6 100644 --- a/src/API/Kitsu/Enum/AnimeAiringStatus.php +++ b/src/API/Kitsu/Enum/AnimeAiringStatus.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/Kitsu/Enum/AnimeWatchingStatus.php b/src/API/Kitsu/Enum/AnimeWatchingStatus.php index 74ecc682..c517ff7d 100644 --- a/src/API/Kitsu/Enum/AnimeWatchingStatus.php +++ b/src/API/Kitsu/Enum/AnimeWatchingStatus.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/Kitsu/Enum/MangaReadingStatus.php b/src/API/Kitsu/Enum/MangaReadingStatus.php index 15351824..5b1de9c7 100644 --- a/src/API/Kitsu/Enum/MangaReadingStatus.php +++ b/src/API/Kitsu/Enum/MangaReadingStatus.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/Kitsu/KitsuModel.php b/src/API/Kitsu/KitsuModel.php index d87899fa..d50cacb6 100644 --- a/src/API/Kitsu/KitsuModel.php +++ b/src/API/Kitsu/KitsuModel.php @@ -8,7 +8,7 @@ * * @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 @@ -16,6 +16,8 @@ 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\{ AnimeTransformer, AnimeListTransformer, MangaTransformer, MangaListTransformer @@ -28,6 +30,7 @@ use GuzzleHttp\Exception\ClientException; * Kitsu API Model */ class KitsuModel { + use CacheTrait; use ContainerAware; use KitsuTrait; @@ -59,6 +62,7 @@ class KitsuModel { * @var MangaListTransformer */ protected $mangaListTransformer; + /** * KitsuModel constructor. @@ -130,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); } @@ -146,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' => [ @@ -155,33 +166,33 @@ class KitsuModel { 'media_type' => 'Anime', 'status' => $status, ], - 'include' => 'media,media.genres', + 'include' => 'media,media.genres,media.mappings,anime.streamingLinks', 'page' => [ 'offset' => 0, - 'limit' => 1000 - ], - 'sort' => '-updated_at' + 'limit' => 500 + ] ] ]; - - $data = $this->getRequest('library-entries', $options); - $included = K::organizeIncludes($data['included']); - - foreach($data['data'] as $i => &$item) + + $cacheItem = $this->cache->getItem($this->getHashForMethodCall($this, __METHOD__, $options)); + + if ( ! $cacheItem->isHit()) { - $item['anime'] = $included['anime'][$item['relationships']['media']['data']['id']]; + $data = $this->getRequest('library-entries', $options); + $included = JsonAPI::organizeIncludes($data['included']); + $included = JsonAPI::inlineIncludedRelationships($included, 'anime'); - $animeGenres = $item['anime']['relationships']['genres']; - - foreach($animeGenres as $id) + foreach($data['data'] as $i => &$item) { - $item['genres'][] = $included['genres'][$id]['name']; + $item['included'] = $included; } + $transformed = $this->animeListTransformer->transformCollection($data['data']); + + $cacheItem->set($transformed); + $cacheItem->save(); } - $transformed = $this->animeListTransformer->transformCollection($data['data']); - - return $transformed; + return $cacheItem->get(); } public function getMangaList($status): array @@ -248,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']; } } @@ -309,11 +325,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/KitsuTrait.php b/src/API/Kitsu/KitsuTrait.php index 4b483ef7..30d97fa1 100644 --- a/src/API/Kitsu/KitsuTrait.php +++ b/src/API/Kitsu/KitsuTrait.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/Kitsu/ListItem.php b/src/API/Kitsu/ListItem.php index 757df26f..57787f15 100644 --- a/src/API/Kitsu/ListItem.php +++ b/src/API/Kitsu/ListItem.php @@ -8,7 +8,7 @@ * * @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 @@ -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 7103e3ba..e153a2a1 100644 --- a/src/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeListTransformer.php @@ -8,7 +8,7 @@ * * @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 @@ -33,21 +33,41 @@ class AnimeListTransformer extends AbstractTransformer { */ public function transform($item) { -/* ?>
$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'], ], @@ -60,16 +80,16 @@ 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, + 'streaming_links' => Kitsu::parseStreamingLinks($included), ], 'watching_status' => $item['attributes']['status'], '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 +103,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 3dbfc8cc..66f344f1 100644 --- a/src/API/Kitsu/Transformer/AnimeTransformer.php +++ b/src/API/Kitsu/Transformer/AnimeTransformer.php @@ -8,7 +8,7 @@ * * @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 @@ -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,14 +33,18 @@ 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']); + + $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'], @@ -48,6 +52,7 @@ class AnimeTransformer extends AbstractTransformer { 'age_rating_guide' => $item['ageRatingGuide'], 'url' => "https://kitsu.io/anime/{$item['slug']}", 'genres' => $item['genres'], + 'streaming_links' => Kitsu::parseStreamingLinks($item['included']) ]; } } \ No newline at end of file diff --git a/src/API/Kitsu/Transformer/MangaListTransformer.php b/src/API/Kitsu/Transformer/MangaListTransformer.php index 7e5e0645..2f9d3e0c 100644 --- a/src/API/Kitsu/Transformer/MangaListTransformer.php +++ b/src/API/Kitsu/Transformer/MangaListTransformer.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/Kitsu/Transformer/MangaTransformer.php b/src/API/Kitsu/Transformer/MangaTransformer.php index df6bfead..c2b0784d 100644 --- a/src/API/Kitsu/Transformer/MangaTransformer.php +++ b/src/API/Kitsu/Transformer/MangaTransformer.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/ListItemInterface.php b/src/API/ListItemInterface.php index 2767bd4c..b0001428 100644 --- a/src/API/ListItemInterface.php +++ b/src/API/ListItemInterface.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/API/MAL.php b/src/API/MAL.php new file mode 100644 index 00000000..ec55f880 --- /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\API\MAL\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/Auth.php b/src/API/MAL/Auth.php deleted file mode 100644 index 33752ff5..00000000 --- a/src/API/MAL/Auth.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2015 - 2016 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/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/MAL/ListItem.php b/src/API/MAL/ListItem.php new file mode 100644 index 00000000..03a04473 --- /dev/null +++ b/src/API/MAL/ListItem.php @@ -0,0 +1,53 @@ + + * @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; + use MALTrait; + + 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 + { + + } +} \ 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 2de5339b..a2861c88 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -1,63 +1,70 @@ - - * @copyright 2015 - 2016 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\AnimeClient\API\MAL\{ + AnimeListTransformer, + ListItem +}; +use Aviat\AnimeClient\API\XML; +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/'; + /** + * @var AnimeListTransformer + */ + protected $animeListTransformer; - /** - * Default settings for Guzzle - * @var array - */ - protected $connectionDefaults = []; + /** + * KitsuModel constructor. + */ + public function __construct(ListItem $listItem) + { + // Set up Guzzle trait + $this->init(); + $this->animeListTransformer = new AnimeListTransformer(); + $this->listItem = $listItem; + } - /** - * 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 createListItem(array $data): bool + { + return FALSE; + } - $info = $response->getBody(); + public function getListItem(string $listId): array + { + return []; + } - if (array_key_exists('access_token', $info)) { - // @TODO save token - return true; - } + public function updateListItem(array $data) + { + $updateData = $this->animeListTransformer->transform($data['data']); + return $this->listItem->update($data['mal_id'], $updateData); + } - 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/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/src/Command/BaseCommand.php b/src/Command/BaseCommand.php index 3d0fa2ff..b8205f71 100644 --- a/src/Command/BaseCommand.php +++ b/src/Command/BaseCommand.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Command/CacheImages.php b/src/Command/CacheImages.php index c3923133..5f9df74f 100644 --- a/src/Command/CacheImages.php +++ b/src/Command/CacheImages.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Command/ClearCache.php b/src/Command/ClearCache.php index b49ea685..d47bc0ba 100644 --- a/src/Command/ClearCache.php +++ b/src/Command/ClearCache.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Controller.php b/src/Controller.php index d776873f..91148358 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); } /** @@ -373,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 a9746973..455921a0 100644 --- a/src/Controller/Anime.php +++ b/src/Controller/Anime.php @@ -8,7 +8,7 @@ * * @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 @@ -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/Collection.php b/src/Controller/Collection.php index 9bdc30c8..de6a5a7a 100644 --- a/src/Controller/Collection.php +++ b/src/Controller/Collection.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Controller/Manga.php b/src/Controller/Manga.php index d2b47ee4..08d93c87 100644 --- a/src/Controller/Manga.php +++ b/src/Controller/Manga.php @@ -8,7 +8,7 @@ * * @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 @@ -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 { 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() + ]); + } } /** diff --git a/src/Helper/Menu.php b/src/Helper/Menu.php index b045d67f..76cbf3e3 100644 --- a/src/Helper/Menu.php +++ b/src/Helper/Menu.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Model/API.php b/src/Model/API.php index 158639ae..40797eb4 100644 --- a/src/Model/API.php +++ b/src/Model/API.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Model/Anime.php b/src/Model/Anime.php index 6b5453d4..7d644bc2 100644 --- a/src/Model/Anime.php +++ b/src/Model/Anime.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Model/AnimeCollection.php b/src/Model/AnimeCollection.php index a779a0fc..83c64123 100644 --- a/src/Model/AnimeCollection.php +++ b/src/Model/AnimeCollection.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Model/Collection.php b/src/Model/Collection.php index 12184c7d..1abf5bfc 100644 --- a/src/Model/Collection.php +++ b/src/Model/Collection.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Model/DB.php b/src/Model/DB.php index 3acd9b77..dcacd4d6 100644 --- a/src/Model/DB.php +++ b/src/Model/DB.php @@ -8,7 +8,7 @@ * * @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 diff --git a/src/Model/Manga.php b/src/Model/Manga.php index 420948a2..38ea4c5c 100644 --- a/src/Model/Manga.php +++ b/src/Model/Manga.php @@ -8,7 +8,7 @@ * * @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 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..84e6f883 --- /dev/null +++ b/tests/API/Kitsu/Transformer/AnimeListTransformerTest.php @@ -0,0 +1,92 @@ +dir = AnimeClient_TestCase::TEST_DATA_DIR . '/Kitsu'; + + $this->beforeTransform = Json::decodeFile("{$this->dir}/animeListItemBeforeTransform.json"); + $this->afterTransform = Json::decodeFile("{$this->dir}/animeListItemAfterTransform.json"); + + $this->transformer = new AnimeListTransformer(); + } + + public function testTransform() + { + $expected = $this->afterTransform; + $actual = $this->transformer->transform($this->beforeTransform); + + // Json::encodeFile("{$this->dir}/animeListItemAfterTransform.json", $actual); + + $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..7d50b096 --- /dev/null +++ b/tests/API/Kitsu/Transformer/AnimeTransformerTest.php @@ -0,0 +1,31 @@ +dir = AnimeClient_TestCase::TEST_DATA_DIR . '/Kitsu'; + + $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; + $actual = $this->transformer->transform($this->beforeTransform); + // Json::encodeFile("{$this->dir}/animeAfterTransform.json", $actual); + + $this->assertEquals($expected, $actual); + } +} \ No newline at end of file diff --git a/tests/API/XMLTest.php b/tests/API/XMLTest.php new file mode 100644 index 00000000..b14d3f5b --- /dev/null +++ b/tests/API/XMLTest.php @@ -0,0 +1,70 @@ +xml = file_get_contents(__DIR__ . '/../test_data/XML/xmlTestFile.xml'); + $this->expectedXml = file_get_contents(__DIR__ . '/../test_data/XML/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/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 @@ -<\/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 new file mode 100644 index 00000000..feae9e8d --- /dev/null +++ b/tests/test_data/Kitsu/animeListItemAfterTransform.json @@ -0,0 +1 @@ +{"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 new file mode 100644 index 00000000..3421281c --- /dev/null +++ b/tests/test_data/Kitsu/animeListItemBeforeTransform.json @@ -0,0 +1,1096 @@ +{ + "id": "15839442", + "type": "libraryEntries", + "links": { + "self": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442" + }, + "attributes": { + "status": "current", + "progress": 0, + "reconsuming": false, + "reconsumeCount": 0, + "notes": null, + "private": false, + "rating": null, + "updatedAt": "2017-01-13T01:32:31.832Z" + }, + "relationships": { + "user": { + "links": { + "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\/15839442\/relationships\/anime", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/anime" + } + }, + "manga": { + "links": { + "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\/15839442\/relationships\/drama", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/drama" + } + }, + "review": { + "links": { + "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\/15839442\/relationships\/media", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/media" + }, + "data": { + "type": "anime", + "id": "12243" + } + }, + "unit": { + "links": { + "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\/15839442\/relationships\/next-unit", + "related": "https:\/\/kitsu.io\/api\/edge\/library-entries\/15839442\/next-unit" + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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": [] + } + } + } + }, + "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" + }, + "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": [] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/tests/test_data/XML/MALExport.xml b/tests/test_data/XML/MALExport.xml new file mode 100644 index 00000000..fdfa4046 --- /dev/null +++ b/tests/test_data/XML/MALExport.xml @@ -0,0 +1,14491 @@ + + + + + + + 315714 + timw4mail + 1 + 629 + 6 + 532 + 9 + 9 + 73 + + + + + 6682 + 11eyes + TV + 12 + 26603827 + 12 + 0000-00-00 + 2010-12-10 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 49 + Aa! Megami-sama! + OVA + 5 + 0 + 5 + 0000-00-00 + 2012-06-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 50 + Aa! Megami-sama! (TV) + TV + 24 + 22401829 + 24 + 2010-07-01 + 0000-00-00 + + 10 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 304 + Aa! Megami-sama! Movie + Movie + 1 + 22401858 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 303 + Aa! Megami-sama!: Chichaitte Koto wa Benri da ne + TV + 48 + 23881830 + 48 + 0000-00-00 + 2010-08-14 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 880 + Aa! Megami-sama!: Sorezore no Tsubasa + TV + 22 + 22401870 + 22 + 0000-00-00 + 2010-07-05 + + 10 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 2198 + Aa! Megami-sama!: Sorezore no Tsubasa Specials + Special + 2 + 22671594 + 2 + 0000-00-00 + 2010-07-05 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 101 + Air + TV + 13 + 20183958 + 13 + 2010-04-10 + 2010-04-10 + + 10 + + Retail DVD + Completed + + 1 + + + 0 + 0 + 0 + + + + 656 + Air in Summer + Special + 2 + 20261101 + 2 + 0000-00-00 + 0000-00-00 + + 8 + + Retail DVD + Completed + + 0 + + + 0 + 0 + 0 + + + + 17082 + Aiura + TV + 12 + 0 + 12 + 2013-04-09 + 2013-06-25 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30123 + Akagami no Shirayuki-hime + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31173 + Akagami no Shirayuki-hime 2nd Season + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25013 + Akatsuki no Yona + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12149 + AKB0048 + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14941 + AKB0048: Next Stage + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5112 + Akikan! + TV + 12 + 0 + 12 + 0000-00-00 + 2012-04-11 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6287 + Akikan!: Kan Ippatsu!? Onsen Panic + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 47 + Akira + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16201 + Aku no Hana + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32828 + Amaama to Inazuma + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 591 + Amaenaide yo!! + TV + 12 + 0 + 12 + 0000-00-00 + 2012-07-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15085 + Amnesia + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6547 + Angel Beats! + TV + 13 + 0 + 13 + 0000-00-00 + 2011-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9989 + Ano Hi Mita Hana no Namae wo Bokutachi wa Mada Shiranai. + TV + 11 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 11433 + Ano Natsu de Matteru + TV + 12 + 0 + 12 + 0000-00-00 + 2012-07-13 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11111 + Another + TV + 12 + 0 + 12 + 0000-00-00 + 2012-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21995 + Ao Haru Ride + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 54 + Appleseed (Movie) + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7647 + Arakawa Under the Bridge + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-02 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9074 + Arakawa Under the Bridge x Bridge + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-16 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 477 + Aria The Animation + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 962 + Aria The Natural + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 3297 + Aria The Origination + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 492 + Armitage III: Dual-Matrix + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12581 + Asa made Jugyou Chu! + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6166 + Asobi ni Iku yo! + TV + 12 + 32005693 + 12 + 0000-00-00 + 2011-05-15 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9736 + Astarotte no Omocha! + TV + 12 + 31307082 + 12 + 0000-00-00 + 2011-06-26 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4999 + Asu no Yoichi! + TV + 12 + 31000809 + 12 + 0000-00-00 + 2011-04-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 66 + Azumanga Daioh + TV + 26 + 20183989 + 26 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 1 + + + 0 + 0 + 0 + + + + 659 + Azumanga Daioh: Gekijou Tanpen + Special + 1 + 23321124 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1593 + Azumanga Web Daioh + ONA + 1 + 23320976 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21185 + Baby Steps + TV + 25 + 0 + 25 + 0000-00-00 + 2014-09-21 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27663 + Baby Steps 2nd Season + TV + 25 + 0 + 25 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2251 + Baccano! + TV + 13 + 25136301 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 6347 + Baka to Test to Shoukanjuu + TV + 13 + 32647833 + 13 + 0000-00-00 + 2011-06-12 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5081 + Bakemonogatari + TV + 15 + 26694491 + 15 + 2010-11-16 + 2010-11-17 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 2986 + Bamboo Blade + TV + 26 + 26300283 + 26 + 2010-11-03 + 2010-11-06 + + 8 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 375 + Bannou Bunka Neko-Musume (1998) + TV + 12 + 33320372 + 12 + 0000-00-00 + 2011-06-30 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3232 + Bannou Bunka Neko-Musume Specials + Special + 2 + 33466362 + 2 + 0000-00-00 + 2011-07-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22789 + Barakamon + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 31904 + Big Order (TV) + TV + 10 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 13535 + Binbougami ga! + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 348 + Binzume Yousei + TV + 13 + 24382561 + 13 + 0000-00-00 + 2010-08-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 530 + Bishoujo Senshi Sailor Moon + TV + 46 + 20184330 + 46 + 0000-00-00 + 0000-00-00 + + 8 + + Hard Drive + Completed + + 1 + + + 0 + 0 + 0 + + + + 14751 + Bishoujo Senshi Sailor Moon Crystal + ONA + 26 + 0 + 26 + 2014-07-06 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31733 + Bishoujo Senshi Sailor Moon Crystal Season III + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 740 + Bishoujo Senshi Sailor Moon R + TV + 43 + 20184339 + 43 + 0000-00-00 + 0000-00-00 + + 7 + + Hard Drive + Completed + + 1 + + + 0 + 0 + 0 + + + + 2937 + Bishoujo Senshi Sailor Moon R: Make Up! Sailor Senshi + Special + 1 + 20250318 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 531 + Bishoujo Senshi Sailor Moon R: The Movie + Movie + 1 + 20184479 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 532 + Bishoujo Senshi Sailor Moon S + TV + 38 + 20184342 + 38 + 0000-00-00 + 0000-00-00 + + 7 + + Hard Drive + Completed + + 1 + + + 0 + 0 + 0 + + + + 997 + Bishoujo Senshi Sailor Moon S: Kaguya Hime no Koibito + Movie + 1 + 20184498 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 1239 + Bishoujo Senshi Sailor Moon SuperS + TV + 39 + 20251523 + 39 + 0000-00-00 + 0000-00-00 + + 5 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1278 + Bishoujo Senshi Sailor Moon SuperS Gaiden: Ami-chan no Hatsukoi + Special + 1 + 20250361 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3076 + Bishoujo Senshi Sailor Moon SuperS Special + Special + 3 + 20251535 + 3 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1240 + Bishoujo Senshi Sailor Moon SuperS: Sailor 9 Senshi Shuuketsu! Black Dream Hole no Kiseki + Movie + 1 + 20184507 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 996 + Bishoujo Senshi Sailor Moon: Sailor Stars + TV + 34 + 20184548 + 34 + 0000-00-00 + 2010-04-15 + + 8 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 22547 + Blade & Soul + TV + 13 + 0 + 13 + 0000-00-00 + 2014-06-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31043 + Boku dake ga Inai Machi + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31964 + Boku no Hero Academia + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16405 + Boku no Imouto wa "Osaka Okan" + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10719 + Boku wa Tomodachi ga Sukunai + TV + 12 + 0 + 12 + 2014-07-31 + 2014-10-12 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 10897 + Boku wa Tomodachi ga Sukunai Episode 0 + OVA + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14967 + Boku wa Tomodachi ga Sukunai Next + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21405 + Bokura wa Minna Kawaisou + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-22 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 357 + Bokusatsu Tenshi Dokuro-chan + OVA + 4 + 20184222 + 4 + 0000-00-00 + 0000-00-00 + + 7 + + Retail DVD + Completed + + 1 + + + 0 + 0 + 0 + + + + 2131 + Bokusatsu Tenshi Dokuro-chan 2 + OVA + 2 + 20184230 + 2 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32866 + Brave Witches + TV + 12 + 0 + 9 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 15605 + Brothers Conflict + TV + 12 + 0 + 9 + 0000-00-00 + 0000-00-00 + + 7 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 1347 + Bubblegum Crisis + OVA + 8 + 0 + 8 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31478 + Bungou Stray Dogs + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32867 + Bungou Stray Dogs 2nd Season + TV + 12 + 0 + 6 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 1689 + Byousoku 5 Centimeter + Movie + 3 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5356 + Canaan + TV + 13 + 26234706 + 13 + 0000-00-00 + 2010-10-30 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 694 + Canvas 2: Niji-iro no Sketch + TV + 24 + 29835975 + 24 + 0000-00-00 + 2011-03-17 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 232 + Cardcaptor Sakura + TV + 70 + 0 + 70 + 2012-08-11 + 2012-10-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10012 + Carnival Phantasm + OVA + 12 + 0 + 12 + 0000-00-00 + 2012-01-26 + + 10 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 28999 + Charlotte + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6024 + Chi's Sweet Home: Atarashii Ouchi + TV + 104 + 33566725 + 104 + 0000-00-00 + 2011-07-04 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14277 + Chitose Get You!! + TV + 26 + 0 + 26 + 0000-00-00 + 2012-12-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 59 + Chobits + TV + 26 + 0 + 26 + 0000-00-00 + 2011-10-09 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16169 + Choboraunyopomi Gekijou Ai Mai Mii + TV + 13 + 0 + 13 + 0000-00-00 + 2013-03-28 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 60 + Chrno Crusade + TV + 24 + 32602611 + 24 + 0000-00-00 + 2011-07-02 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6645 + Chuu Bra!! + TV + 12 + 31441376 + 12 + 0000-00-00 + 2011-05-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14741 + Chuunibyou demo Koi ga Shitai! + TV + 12 + 0 + 12 + 2013-01-26 + 2013-03-01 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18671 + Chuunibyou demo Koi ga Shitai! Ren + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2167 + Clannad + TV + 23 + 20793727 + 23 + 0000-00-00 + 2010-05-03 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 1723 + Clannad Movie + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 5 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4181 + Clannad: After Story + TV + 24 + 25187604 + 24 + 0000-00-00 + 2010-09-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6351 + Clannad: After Story - Mou Hitotsu no Sekai, Kyou-hen + Special + 1 + 25187605 + 1 + 0000-00-00 + 2010-09-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4059 + Clannad: Mou Hitotsu no Sekai, Tomoyo-hen + Special + 1 + 22304652 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 30383 + Classroom☆Crisis + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1575 + Code Geass: Hangyaku no Lelouch + TV + 25 + 26107956 + 25 + 0000-00-00 + 2010-12-12 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2904 + Code Geass: Hangyaku no Lelouch R2 + TV + 25 + 27382373 + 25 + 2010-12-14 + 2010-12-17 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31318 + Comet Lucifer + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 289 + Comic Party + TV + 13 + 32602626 + 13 + 2011-06-04 + 2011-06-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10029 + Coquelicot-zaka kara + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 982 + Cosplay Complex + OVA + 3 + 33625874 + 3 + 0000-00-00 + 2011-07-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1 + Cowboy Bebop + TV + 26 + 22802932 + 26 + 0000-00-00 + 2010-08-21 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5 + Cowboy Bebop: Tengoku no Tobira + Movie + 1 + 0 + 1 + 2012-09-29 + 2012-09-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12549 + Dakara Boku wa, H ga Dekinai. + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-29 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29976 + Dance with Devils + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + It&#039;s sort of a musical... + 0 + + + 0 + 0 + 0 + + + + 26349 + Danna ga Nani wo Itteiru ka Wakaranai Ken + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29067 + Danna ga Nani wo Itteiru ka Wakaranai Ken 2 Sure-me + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16355 + Dansai Bunri no Crime Edge + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11843 + Danshi Koukousei no Nichijou + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15583 + Date A Live + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 1535 + Death Note + TV + 37 + 30307803 + 37 + 0000-00-00 + 2011-04-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24031 + Denki-gai no Honya-san + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8086 + Densetsu no Yuusha no Densetsu + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 295 + Divergence Eve 2: Misaki Chronicles + TV + 13 + 0 + 5 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 22733 + Dragon Collection + TV + 51 + 0 + 51 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9330 + Dragon Crisis! + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 28121 + Dungeon ni Deai wo Motomeru no wa Machigatteiru Darou ka + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6746 + Durarara!! + TV + 24 + 0 + 24 + 2012-11-14 + 2012-12-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27833 + Durarara!!x2 Ketsu + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23199 + Durarara!!x2 Shou + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27831 + Durarara!!x2 Ten + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14073 + Ebiten: Kouritsu Ebisugawa Koukou Tenmonbu + ONA + 10 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 788 + Eiken: Eikenbu yori Ai wo Komete + OVA + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2759 + Evangelion: 1.0 You Are (Not) Alone + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3784 + Evangelion: 2.0 You Can (Not) Advance + Movie + 1 + 0 + 1 + 0000-00-00 + 2013-05-22 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3785 + Evangelion: 3.0 You Can (Not) Redo + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 3167 + Eve no Jikan + ONA + 6 + 0 + 6 + 0000-00-00 + 2014-03-01 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 378 + eX-Driver the Movie + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15883 + Fantasista Doll + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14829 + Fate/kaleid liner Prisma☆Illya + TV + 10 + 0 + 10 + 0000-00-00 + 2013-09-15 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27525 + Fate/kaleid liner Prisma☆Illya 2wei Herz! + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20509 + Fate/kaleid liner Prisma☆Illya 2wei! + TV + 10 + 0 + 10 + 0000-00-00 + 2014-09-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12565 + Fate/Prototype + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 356 + Fate/stay night + TV + 24 + 20184259 + 24 + 0000-00-00 + 0000-00-00 + + 10 + + Retail DVD + Completed + + 6 + + + 0 + 0 + 0 + + + + 25537 + Fate/stay night Movie: Heaven's Feel + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6922 + Fate/stay night Movie: Unlimited Blade Works + Movie + 1 + 20250413 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 22297 + Fate/stay night: Unlimited Blade Works + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27821 + Fate/stay night: Unlimited Blade Works - Prologue + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28701 + Fate/stay night: Unlimited Blade Works 2nd Season + TV + 13 + 0 + 13 + 2015-04-03 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10087 + Fate/Zero + TV + 13 + 0 + 13 + 0000-00-00 + 2011-12-31 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11741 + Fate/Zero 2nd Season + TV + 12 + 0 + 12 + 0000-00-00 + 2012-07-01 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19165 + Fate/Zero Cafe + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 13183 + Fate/Zero Remix + Special + 2 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5973 + Fight Ippatsu! Juuden-chan!! + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + Good for a laugh, but ecchi for the sake of it. + 0 + + + 0 + 0 + 0 + + + + 227 + FLCL + OVA + 6 + 30236601 + 6 + 0000-00-00 + 2011-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 120 + Fruits Basket + TV + 26 + 26511482 + 26 + 0000-00-00 + 2010-11-12 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32696 + Fukigen na Mononokean + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 71 + Full Metal Panic! + TV + 24 + 20184275 + 24 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 4 + + + 0 + 0 + 0 + + + + 73 + Full Metal Panic! The Second Raid + TV + 13 + 20184299 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 3 + + + 0 + 0 + 0 + + + + 1015 + Full Metal Panic! The Second Raid: Wari to Hima na Sentaichou no Ichinichi + Special + 1 + 20184310 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 0 + + + 0 + 0 + 0 + + + + 72 + Full Metal Panic? Fumoffu + TV + 12 + 20184288 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 4 + + + 0 + 0 + 0 + + + + 121 + Fullmetal Alchemist + TV + 51 + 23076095 + 51 + 0000-00-00 + 2010-07-22 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5114 + Fullmetal Alchemist: Brotherhood + TV + 64 + 25136332 + 64 + 0000-00-00 + 2010-10-09 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 603 + Futari wa Precure + TV + 49 + 25136277 + 49 + 2010-11-14 + 2010-12-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22189 + Futsuu no Joshikousei ga [Locodol] Yattemita. + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-20 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4725 + Ga-Rei: Zero + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 2890 + Gake no Ue no Ponyo + Movie + 1 + 23882109 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24765 + Gakkougurashi! + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 30544 + Gakusen Toshi Asterisk + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 383 + Galaxy Angel + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 653 + Galaxy Angel 3 + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 655 + Galaxy Angel 4 + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 13287 + Galaxy Angel Specials + Special + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 652 + Galaxy Angel Z + TV + 9 + 0 + 9 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2206 + Galaxy Angel Z Special + Special + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 28907 + Gate: Jieitai Kanochi nite, Kaku Tatakaeri + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31637 + Gate: Jieitai Kanochi nite, Kaku Tatakaeri 2nd Season + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23289 + Gekkan Shoujo Nozaki-kun + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32607 + Gi(a)rlish Number + TV + 12 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 16918 + Gin no Saji + TV + 11 + 0 + 11 + 0000-00-00 + 2013-10-06 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19363 + Gin no Saji 2nd Season + TV + 11 + 0 + 11 + 0000-00-00 + 2014-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1140 + Giniro no Kami no Agito + Movie + 1 + 22068693 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 241 + Girls Bravo: First Season + TV + 11 + 0 + 11 + 0000-00-00 + 2012-09-15 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 487 + Girls Bravo: Second Season + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14131 + Girls und Panzer + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14811 + GJ-bu + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23079 + Glasslip + TV + 13 + 0 + 13 + 0000-00-00 + 2014-09-25 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21273 + Gochuumon wa Usagi Desu ka? + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 456 + Gokujou Seitokai + TV + 26 + 25136305 + 26 + 0000-00-00 + 2010-10-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21431 + Gokukoku no Brynhildr + TV + 13 + 0 + 13 + 0000-00-00 + 2014-06-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 268 + Golden Boy + OVA + 6 + 0 + 6 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17895 + Golden Time + TV + 24 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 0 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 2494 + Goshuushou-sama Ninomiya-kun + TV + 12 + 29330183 + 12 + 0000-00-00 + 2011-02-19 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8425 + Gosick + TV + 24 + 0 + 24 + 0000-00-00 + 2013-02-16 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 245 + Great Teacher Onizuka + TV + 43 + 24405846 + 43 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17729 + Grisaia no Kajitsu + TV + 13 + 0 + 13 + 0000-00-00 + 2015-01-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29093 + Grisaia no Meikyuu: Caprice no Mayu 0 + Special + 1 + 0 + 1 + 0000-00-00 + 2015-04-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29095 + Grisaia no Rakuen + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 134 + Gunslinger Girl + TV + 13 + 23344353 + 13 + 0000-00-00 + 2010-08-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31630 + Gyakuten Saiban: Sono "Shinjitsu", Igi Ari! + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3299 + H2O: Footprints in the Sand + TV + 12 + 31438351 + 12 + 0000-00-00 + 2011-04-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16 + Hachimitsu to Clover + TV + 24 + 0 + 24 + 2012-11-30 + 2012-12-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1142 + Hachimitsu to Clover II + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-20 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 644 + Hachimitsu to Clover Specials + Special + 2 + 0 + 2 + 2012-12-09 + 2012-12-11 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30721 + Hacka Doll The Animation + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6574 + Hanamaru Youchien + TV + 12 + 26603818 + 12 + 0000-00-00 + 2010-11-14 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21855 + Hanamonogatari + TV + 5 + 0 + 5 + 0000-00-00 + 2014-09-11 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5835 + Hanasakeru Seishounen + TV + 39 + 29437750 + 39 + 0000-00-00 + 2011-03-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32648 + Handa-kun + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1570 + Happiness! + TV + 12 + 31354140 + 12 + 0000-00-00 + 2011-04-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30895 + HaruChika: Haruta to Chika wa Seishun suru + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2026 + Hayate no Gotoku! + TV + 52 + 21677098 + 52 + 2010-06-05 + 2010-06-12 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 14653 + Hayate no Gotoku! Can't Take My Eyes Off You + TV + 12 + 0 + 12 + 2012-10-03 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16982 + Hayate no Gotoku! Cuties + TV + 12 + 0 + 12 + 2013-04-08 + 2013-07-02 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4192 + Hayate no Gotoku!! + TV + 25 + 25136341 + 25 + 0000-00-00 + 2010-10-16 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15225 + Hentai Ouji to Warawanai Neko. + TV + 12 + 0 + 12 + 0000-00-00 + 2013-07-01 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 379 + Heppoko Jikken Animation Excel♥Saga + TV + 26 + 20184245 + 26 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5060 + Hetalia Axis Powers + ONA + 52 + 24964761 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 27989 + Hibike! Euphonium + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31988 + Hibike! Euphonium 2 + TV + 13 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 9 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 8630 + Hidan no Aria + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5630 + Higashi no Eden + TV + 11 + 25889880 + 11 + 0000-00-00 + 2010-10-23 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 6372 + Higashi no Eden Movie I: The King of Eden + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6637 + Higashi no Eden Movie II: Paradise Lost + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 31500 + High School Fleet + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 934 + Higurashi no Naku Koro ni + TV + 26 + 20184844 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1889 + Higurashi no Naku Koro ni Kai + TV + 24 + 20251580 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + Hard Drive + Completed + + 0 + + + 0 + 0 + 0 + + + + 22835 + Himegoto + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28825 + Himouto! Umaru-chan + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 33421 + Hitori no Shita: The Outcast + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20853 + Hitsugi no Chaika + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8426 + Hourou Musuko + TV + 11 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 10935 + Hourou Musuko Specials + Special + 2 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 431 + Howl no Ugoku Shiro + Movie + 1 + 0 + 1 + 2014-10-17 + 2014-10-17 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15377 + Hyakka Ryouran: Samurai Bride + TV + 12 + 0 + 12 + 0000-00-00 + 2013-06-22 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8277 + Hyakka Ryouran: Samurai Girls + TV + 12 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 4550 + Hyakko + TV + 13 + 31309188 + 13 + 0000-00-00 + 2011-04-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7088 + Ichiban Ushiro no Daimaou + TV + 12 + 0 + 12 + 0000-00-00 + 2012-08-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 488 + Ichigo Mashimaro + TV + 12 + 0 + 8 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 17831 + Inu to Hasami wa Tsukaiyou + TV + 12 + 0 + 12 + 0000-00-00 + 2013-09-22 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22123 + Inugami-san to Nekoyama-san + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 249 + InuYasha + TV + 167 + 32808219 + 167 + 0000-00-00 + 2012-03-14 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6811 + InuYasha: Kanketsu-hen + TV + 26 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21327 + Isshuukan Friends. + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-23 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9750 + Itsuka Tenma no Kuro Usagi + TV + 12 + 0 + 12 + 0000-00-00 + 2011-09-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10357 + Jinrui wa Suitai Shimashita + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-17 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29785 + Jitsu wa Watashi wa + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14719 + JoJo no Kimyou na Bouken (TV) + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 20899 + JoJo no Kimyou na Bouken: Stardust Crusaders + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 863 + Joshikousei: Girl's High + TV + 12 + 0 + 12 + 0000-00-00 + 2012-03-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5680 + K-On! + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7791 + K-On!! + TV + 26 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15391 + Kagaku na Yatsura + OVA + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16664 + Kaguya-hime no Monogatari + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 427 + Kaleido Star + TV + 51 + 0 + 51 + 0000-00-00 + 2012-04-07 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 428 + Kaleido Star: Aratanaru Tsubasa - Extra Stage + OVA + 1 + 0 + 1 + 0000-00-00 + 2012-04-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8525 + Kami nomi zo Shiru Sekai + TV + 12 + 31395677 + 12 + 0000-00-00 + 2011-04-26 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10080 + Kami nomi zo Shiru Sekai II + TV + 12 + 31434923 + 12 + 0000-00-00 + 2011-06-27 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16706 + Kami nomi zo Shiru Sekai: Megami-hen + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-07 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21563 + Kamigami no Asobi + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-22 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10372 + Kamisama Dolls + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14713 + Kamisama Hajimemashita + TV + 13 + 0 + 13 + 0000-00-00 + 2012-12-28 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 25681 + Kamisama Hajimemashita◎ + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16009 + Kamisama no Inai Nichiyoubi + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5914 + Kanamemo + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3958 + Kannagi + TV + 13 + 25087416 + 13 + 0000-00-00 + 2010-09-22 + + 9 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 5978 + Kannagi: Moshimo Kannagi ga Attara... + Special + 1 + 0 + 1 + 0000-00-00 + 2012-03-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19685 + Kanojo ga Flag wo Oraretara + TV + 13 + 0 + 13 + 0000-00-00 + 2014-07-02 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3503 + Kanokon + TV + 12 + 0 + 12 + 0000-00-00 + 2012-04-09 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2593 + Kara no Kyoukai 1: Fukan Fuukei + Movie + 1 + 0 + 1 + 0000-00-00 + 2012-12-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3782 + Kara no Kyoukai 2: Satsujin Kousatsu (Zen) + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3783 + Kara no Kyoukai 3: Tsuukaku Zanryuu + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4280 + Kara no Kyoukai 4: Garan no Dou + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4282 + Kara no Kyoukai 5: Mujun Rasen + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5204 + Kara no Kyoukai 6: Boukyaku Rokuon + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5205 + Kara no Kyoukai 7: Satsujin Kousatsu (Kou) + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 14807 + Kara no Kyoukai: Mirai Fukuin + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6954 + Kara no Kyoukai: Shuushou + Special + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 145 + Kareshi Kanojo no Jijou + TV + 26 + 22401816 + 26 + 0000-00-00 + 2010-06-29 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 7711 + Karigurashi no Arrietty + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 667 + Kashimashi: Girl Meets Girl + TV + 12 + 0 + 12 + 2012-04-21 + 2012-04-23 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1691 + Kaze no Stigma + TV + 24 + 0 + 24 + 2012-04-28 + 2012-04-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 572 + Kaze no Tani no Nausicaä + Movie + 1 + 20249809 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16662 + Kaze Tachinu + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6205 + Kämpfer + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-04 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10076 + Kämpfer für die Liebe + Special + 2 + 0 + 2 + 0000-00-00 + 2014-04-18 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3464 + Kemeko Deluxe! + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 516 + Keroro Gunsou + TV + 358 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 18679 + Kill la Kill + TV + 24 + 0 + 24 + 0000-00-00 + 2014-06-27 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 6045 + Kimi ni Todoke + TV + 25 + 0 + 25 + 2012-11-08 + 2012-11-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9656 + Kimi ni Todoke 2nd Season + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-03 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10152 + Kimi ni Todoke 2nd Season: Kataomoi + Special + 1 + 0 + 1 + 0000-00-00 + 2012-11-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16732 + Kiniro Mosaic + TV + 12 + 0 + 12 + 0000-00-00 + 2013-09-21 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18495 + Kitakubu Katsudou Kiroku + TV + 12 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 4 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 31798 + Kiznaiver + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9260 + Kizumonogatari I: Tekketsu-hen + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5678 + Kobato. + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 11887 + Kokoro Connect + TV + 13 + 0 + 13 + 0000-00-00 + 2012-10-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31091 + Komori-san wa Kotowarenai! + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31952 + Kono Bijutsubu ni wa Mondai ga Aru! + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13367 + Kono Naka ni Hitori, Imouto ga Iru! + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30831 + Kono Subarashii Sekai ni Shukufuku wo! + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8841 + Kore wa Zombie Desu ka? + TV + 12 + 29248692 + 12 + 0000-00-00 + 2011-04-04 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10790 + Kore wa Zombie Desu ka? of the Dead + TV + 10 + 0 + 10 + 0000-00-00 + 2013-01-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15379 + Kotoura-san + TV + 12 + 0 + 12 + 0000-00-00 + 2013-03-29 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31804 + Kuma Miko + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8129 + Kuragehime + TV + 11 + 0 + 11 + 0000-00-00 + 2012-06-29 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4898 + Kuroshitsuji + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24011 + Lance N' Masques + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 97 + Last Exile + TV + 26 + 20184563 + 26 + 0000-00-00 + 0000-00-00 + + 10 + + Retail DVD + Completed + + 0 + + + 0 + 0 + 0 + + + + 13655 + Little Busters! + TV + 26 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 14349 + Little Witch Academia + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19489 + Little Witch Academia: Mahoujikake no Parade + Movie + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 17265 + Log Horizon + TV + 25 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 189 + Love Hina + TV + 24 + 0 + 24 + 0000-00-00 + 2014-06-20 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 963 + Love Hina: Motoko no Sentaku, Koi ka Ken... "Naku na" + Special + 1 + 0 + 1 + 0000-00-00 + 2014-06-20 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16353 + Love Lab + TV + 13 + 0 + 13 + 2013-11-23 + 2014-01-04 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15051 + Love Live! School Idol Project + TV + 13 + 0 + 13 + 0000-00-00 + 2013-04-02 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19111 + Love Live! School Idol Project 2nd Season + TV + 13 + 0 + 13 + 0000-00-00 + 2014-06-30 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1887 + Lucky☆Star + TV + 24 + 20184007 + 24 + 2010-04-24 + 2010-04-25 + + 10 + + Retail DVD + Completed + + 2 + + + 0 + 0 + 0 + + + + 4472 + Lucky☆Star: Original na Visual to Animation + OVA + 1 + 20916942 + 1 + 0000-00-00 + 2010-05-08 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 193 + Maburaho + TV + 24 + 30620181 + 24 + 2011-04-06 + 2011-04-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 157 + Mahou Sensei Negima! + TV + 26 + 29148397 + 26 + 0000-00-00 + 2011-02-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19769 + Mahou Sensou + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 76 + Mahou Shoujo Lyrical Nanoha + TV + 13 + 0 + 13 + 0000-00-00 + 2012-06-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9756 + Mahou Shoujo Madoka★Magica + TV + 12 + 0 + 12 + 0000-00-00 + 2012-05-02 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 33795 + Mahou Shoujo Nante Mou Ii Desukara. 2nd Season + TV + 12 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 0 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 21421 + Mahou Shoujo Taisen + TV + 26 + 0 + 26 + 0000-00-00 + 2014-09-30 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20785 + Mahouka Koukou no Rettousei + TV + 26 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10213 + Maji de Watashi ni Koi Shinasai! + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21835 + Majin Bone + TV + 52 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 512 + Majo no Takkyuubin + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16890 + Makai Ouji: Devils and Realist + TV + 12 + 0 + 12 + 0000-00-00 + 2013-10-12 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 860 + Makai Senki Disgaea + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21863 + Mangaka-san to Assistant-san to The Animation + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-23 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14045 + Mangirl! + TV + 13 + 0 + 13 + 0000-00-00 + 2013-03-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14833 + Maoyuu Maou Yuusha + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5030 + Maria†Holic + TV + 12 + 34568383 + 12 + 2011-07-21 + 2011-07-23 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 9712 + Maria†Holic Alive + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10397 + Mashiro-iro Symphony: The Color of Lovers + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-24 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32438 + Mayoiga + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11761 + Medaka Box + TV + 12 + 0 + 12 + 0000-00-00 + 2012-10-27 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14527 + Medaka Box Abnormal + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 330 + Midori no Hibi + TV + 13 + 0 + 13 + 0000-00-00 + 2011-11-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20541 + Mikakunin de Shinkoukei + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-28 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 26085 + Military! + TV + 12 + 0 + 12 + 0000-00-00 + 2015-03-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 585 + Mimi wo Sumaseba + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20033 + Miss Monochrome: The Animation + TV + 13 + 0 + 13 + 0000-00-00 + 2014-01-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30384 + Miss Monochrome: The Animation 2 + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31560 + Miss Monochrome: The Animation 3 + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7627 + Mitsudomoe + TV + 13 + 0 + 13 + 0000-00-00 + 2013-04-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9510 + Mitsudomoe Zouryouchuu! + TV + 8 + 0 + 8 + 0000-00-00 + 2013-04-13 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8424 + MM! + TV + 12 + 32481308 + 12 + 0000-00-00 + 2011-06-04 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22225 + Momo Kyun Sword + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-23 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15315 + Mondaiji-tachi ga Isekai kara Kuru Sou Desu yo? + TV + 10 + 0 + 10 + 0000-00-00 + 2013-03-17 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17074 + Monogatari Series: Second Season + TV + 26 + 0 + 26 + 0000-00-00 + 2014-02-12 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 164 + Mononoke Hime + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30307 + Monster Musume no Iru Nichijou + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9181 + Motto To LOVE-Ru + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 8917 + Mouretsu Pirates + TV + 26 + 0 + 26 + 2012-01-07 + 2012-07-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31442 + Musaigen no Phantom World + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1738 + Muteki Kanban Musume + TV + 12 + 0 + 12 + 2012-11-22 + 2012-12-02 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2926 + Myself; Yourself + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 26351 + Nagato Yuki-chan no Shoushitsu + TV + 16 + 0 + 16 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16910 + Namiuchigiwa no Muromi-san + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 776 + Nanaka 6/17 + TV + 12 + 24619317 + 12 + 2010-09-04 + 2010-09-06 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5865 + Nanaka 6/17 Special + Special + 1 + 24619322 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13585 + Natsuyuki Rendezvous + TV + 11 + 0 + 11 + 0000-00-00 + 2012-10-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12467 + Nazo no Kanojo X + TV + 13 + 0 + 13 + 2012-08-01 + 2012-08-03 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1546 + Negima!? + TV + 26 + 30324894 + 26 + 0000-00-00 + 2011-04-02 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 597 + Neko no Ongaeshi + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 9934 + Nekogami Yaoyorozu + TV + 12 + 0 + 12 + 0000-00-00 + 2011-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15689 + Nekomonogatari: Kuro + TV + 4 + 0 + 4 + 0000-00-00 + 2013-07-25 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30 + Neon Genesis Evangelion + TV + 26 + 20185747 + 26 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 32 + Neon Genesis Evangelion: The End of Evangelion + Movie + 1 + 20185756 + 1 + 0000-00-00 + 0000-00-00 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31404 + Netoge no Yome wa Onnanoko ja Nai to Omotta? + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1210 + NHK ni Youkoso! + TV + 24 + 20185817 + 24 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10165 + Nichijou + TV + 26 + 31795187 + 26 + 0000-00-00 + 2011-09-25 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 229 + Ninin ga Shinobuden + TV + 12 + 20366516 + 12 + 0000-00-00 + 2010-05-19 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 18897 + Nisekoi + TV + 20 + 0 + 20 + 0000-00-00 + 2014-05-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27787 + Nisekoi: + TV + 12 + 0 + 12 + 2015-04-11 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30514 + Nisekoimonogatari + ONA + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 11597 + Nisemonogatari + TV + 11 + 0 + 11 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19815 + No Game No Life + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-25 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 20507 + Noragami + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30503 + Noragami Aragoto + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 615 + Nurse Witch Komugi-chan Magikarte + OVA + 5 + 31681730 + 5 + 0000-00-00 + 2011-05-07 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 920 + Nurse Witch Komugi-chan Magikarte Special + Special + 1 + 31778587 + 1 + 0000-00-00 + 2011-05-07 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6512 + Nyan Koi! + TV + 12 + 33968115 + 12 + 0000-00-00 + 2011-07-13 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5957 + Nyoro-n Churuya-san + ONA + 13 + 0 + 13 + 0000-00-00 + 2012-03-07 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11933 + Oda Nobuna no Yabou + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2152 + Oh! Edo Rocket + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 28819 + Okusama ga Seitokaichou! + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6324 + Omamori Himari + TV + 12 + 0 + 12 + 0000-00-00 + 2012-08-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21557 + Omoide no Marnie + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30276 + One Punch Man + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20931 + Oneechan ga Kita + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-27 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14199 + Oniichan dakedo Ai Sae Areba Kankeinai yo ne! + TV + 12 + 0 + 12 + 0000-00-00 + 2012-12-28 + + 8 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 31143 + Onsen Yousei Hakone-chan + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12355 + Ookami Kodomo no Ame to Yuki + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23673 + Ookami Shoujo to Kuro Ouji + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2966 + Ookami to Koushinryou + TV + 13 + 25136296 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5341 + Ookami to Koushinryou II + TV + 12 + 0 + 12 + 0000-00-00 + 2015-04-11 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32729 + Orange + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28297 + Ore Monogatari!! + TV + 24 + 0 + 24 + 2015-04-11 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8769 + Ore no Imouto ga Konnani Kawaii Wake ga Nai + TV + 12 + 26503760 + 12 + 0000-00-00 + 2010-12-24 + + 10 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 10020 + Ore no Imouto ga Konnani Kawaii Wake ga Nai Specials + ONA + 4 + 0 + 4 + 0000-00-00 + 2011-10-14 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 13659 + Ore no Imouto ga Konnani Kawaii Wake ga Nai. + TV + 13 + 0 + 13 + 2013-04-07 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18857 + Ore no Imouto ga Konnani Kawaii Wake ga Nai. Specials + ONA + 3 + 0 + 3 + 0000-00-00 + 2013-08-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14749 + Ore no Kanojo to Osananajimi ga Shuraba Sugiru + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19221 + Ore no Nounai Sentakushi ga, Gakuen Love Comedy wo Zenryoku de Jama Shiteiru + TV + 10 + 0 + 10 + 0000-00-00 + 2014-01-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 24705 + Ore, Twintail ni Narimasu. + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32013 + Oshiete! Galko-chan + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 785 + Otaku no Video + OVA + 2 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 1569 + Otome wa Boku ni Koishiteru + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-14 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 853 + Ouran Koukou Host Club + TV + 26 + 29731889 + 26 + 0000-00-00 + 2011-03-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29803 + Overlord + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31181 + Owarimonogatari + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11179 + Papa no Iukoto wo Kikinasai! + TV + 12 + 0 + 12 + 0000-00-00 + 2012-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1943 + Paprika + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 326 + Petshop of Horrors + TV + 4 + 0 + 4 + 2012-11-12 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16397 + Photokano + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-05 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 328 + Piano + TV + 10 + 20366535 + 10 + 0000-00-00 + 2010-05-18 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 27775 + Plastic Memories + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10711 + Plastic Neesan + ONA + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 527 + Pokemon + TV + 276 + 0 + 276 + 0000-00-00 + 2014-07-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20159 + Pokemon: The Origin + Special + 4 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 610 + Popotan + TV + 12 + 20956003 + 12 + 0000-00-00 + 2010-05-08 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12021 + Poyopoyo Kansatsu Nikki + TV + 52 + 0 + 52 + 0000-00-00 + 2012-12-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 721 + Princess Tutu + TV + 38 + 31019740 + 38 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 327 + Puchi Puri Yuushi + TV + 26 + 25136273 + 26 + 0000-00-00 + 2010-09-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21325 + Pupipo! + TV + 15 + 0 + 15 + 0000-00-00 + 2014-04-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32360 + Qualidea Code + TV + 12 + 0 + 7 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 6633 + Queen's Blade: Gyokuza wo Tsugu Mono + TV + 12 + 0 + 12 + 2012-11-17 + 2013-02-26 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11859 + Queen's Blade: Rebellion + TV + 12 + 0 + 12 + 2012-11-07 + 2012-11-13 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10611 + R-15 + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 209 + R.O.D the TV + TV + 26 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 758 + RahXephon: Pluralitas Concentio + Movie + 1 + 20249926 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23309 + Rail Wars! + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-22 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30296 + Rakudai Kishi no Cavalry + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 210 + Ranma ½ + TV + 161 + 20184420 + 161 + 0000-00-00 + 0000-00-00 + + 9 + + Hard Drive + Completed + + 5 + + + 0 + 0 + 0 + + + + 1007 + Ranma ½ OVA + OVA + 6 + 20264461 + 6 + 2010-04-18 + 2010-04-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1008 + Ranma ½ Specials + OVA + 2 + 20264544 + 2 + 2010-04-19 + 2010-04-19 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1011 + Ranma ½ Super + OVA + 3 + 20264473 + 3 + 2010-04-19 + 2010-04-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1010 + Ranma ½: Chou Musabetsu Kessen! Ranma Team vs. Densetsu no Houou + Movie + 1 + 20264562 + 1 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 418 + Ranma ½: Chuugoku Nekonron Daikessen! Okite Yaburi no Gekitou-hen!! + Movie + 1 + 20388710 + 1 + 0000-00-00 + 2010-04-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 792 + Ranma ½: Kessen Tougenkyou! Hanayome wo Torimodose! + Movie + 1 + 20264528 + 1 + 0000-00-00 + 2010-04-19 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25859 + Re-Kan! + TV + 13 + 0 + 13 + 2015-04-04 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31240 + Re:Zero kara Hajimeru Isekai Seikatsu + TV + 25 + 0 + 25 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11491 + Recorder to Randoseru Do♪ + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18099 + Recorder to Randoseru Mi☆ + TV + 12 + 0 + 12 + 2013-07-12 + 2013-09-28 + + 0 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13377 + Recorder to Randoseru Re♪ + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-02 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1601 + Red Garden + TV + 22 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 30015 + ReLIFE + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 31716 + Rewrite + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4618 + RideBack + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 980 + Rikujou Bouei-tai Mao-chan + TV + 26 + 0 + 26 + 0000-00-00 + 2013-04-13 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28497 + Rokka no Yuusha + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22865 + Rokujouma no Shinryakusha!? (TV) + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1699 + Romeo x Juliet + TV + 24 + 22429108 + 24 + 0000-00-00 + 2010-07-06 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 2993 + Rosario to Vampire + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4214 + Rosario to Vampire Capu2 + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 64 + Rozen Maiden + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 65 + Rozen Maiden: Träumend + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 21561 + Ryuugajou Nanana no Maizoukin (TV) + TV + 11 + 0 + 11 + 0000-00-00 + 2014-06-19 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20709 + Sabagebu! + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-23 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23277 + Saenai Heroine no Sodatekata + TV + 12 + 0 + 12 + 0000-00-00 + 2015-03-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29317 + Saenai Heroine no Sodatekata: Ai to Seishun no Service Kai + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30749 + Saijaku Muhai no Bahamut + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17777 + Saikin, Imouto no Yousu ga Chotto Okashiinda ga. + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-23 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3772 + Saiko Robot Kombock + TV + 25 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32542 + Sakamoto desu ga? + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 20047 + Sakura Trick + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30187 + Sakurako-san no Ashimoto ni wa Shitai ga Umatteiru + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13759 + Sakurasou no Pet na Kanojo + TV + 24 + 0 + 24 + 0000-00-00 + 2013-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11499 + Sankarea + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 7588 + Saraiya Goyou + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 6203 + Sasameki Koto + TV + 13 + 0 + 13 + 2012-07-02 + 2012-07-03 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1881 + Sasami: Mahou Shoujo Club + TV + 13 + 33325082 + 13 + 0000-00-00 + 2011-06-30 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1882 + Sasami: Mahou Shoujo Club 2 + TV + 13 + 33450610 + 13 + 2011-07-02 + 2011-07-10 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22877 + Seirei Tsukai no Blade Dance + TV + 12 + 0 + 12 + 0000-00-00 + 2014-09-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5909 + Seitokai no Ichizon + TV + 12 + 0 + 12 + 0000-00-00 + 2013-01-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10464 + Seitokai no Ichizon Lv.2 + ONA + 10 + 0 + 10 + 0000-00-00 + 2013-03-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11763 + Sekai de Ichiban Tsuyoku Naritai! + TV + 12 + 0 + 12 + 0000-00-00 + 2014-01-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4063 + Sekirei + TV + 12 + 0 + 12 + 0000-00-00 + 2011-10-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31540 + Sekkou Boys + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22273 + Selector Infected WIXOSS + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 199 + Sen to Chihiro no Kamikakushi + Movie + 1 + 31610471 + 1 + 0000-00-00 + 2011-05-01 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12611 + Sengoku Collection + TV + 26 + 0 + 26 + 0000-00-00 + 2012-09-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10308 + Sengoku Otome: Momoiro Paradox + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 15119 + Senran Kagura + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 533 + Sensei no Ojikan: Doki Doki School Hours + TV + 13 + 0 + 13 + 2012-04-11 + 2012-04-23 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 339 + Serial Experiments Lain + TV + 13 + 20184794 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18119 + Servant x Service + TV + 13 + 0 + 13 + 0000-00-00 + 2013-09-28 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2104 + Seto no Hanayome + TV + 26 + 26108242 + 26 + 0000-00-00 + 2010-10-28 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 355 + Shakugan no Shana + TV + 24 + 0 + 24 + 0000-00-00 + 2012-05-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2787 + Shakugan no Shana II (Second) + TV + 24 + 0 + 24 + 2012-11-23 + 2013-05-19 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6773 + Shakugan no Shana III (Final) + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 23273 + Shigatsu wa Kimi no Uso + TV + 22 + 0 + 22 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 29786 + Shimoneta to Iu Gainen ga Sonzai Shinai Taikutsu na Sekai + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 538 + Shin Tenchi Muyou! + TV + 26 + 32030015 + 26 + 0000-00-00 + 2011-05-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16498 + Shingeki no Kyojin + TV + 25 + 0 + 25 + 0000-00-00 + 2014-07-09 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 169 + Shingetsutan Tsukihime + TV + 12 + 20184809 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + Retail DVD + Completed + + 2 + + + 0 + 0 + 0 + + + + 1727 + Shinkyoku Soukai Polyphonica + TV + 12 + 0 + 12 + 2012-11-13 + 2012-11-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 23233 + Shinmai Maou no Testament + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30363 + Shinmai Maou no Testament Burst + TV + 10 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8557 + Shinryaku! Ika Musume + TV + 12 + 29900617 + 12 + 0000-00-00 + 2011-03-15 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 9888 + Shinryaku! Ika Musume Specials + Special + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10378 + Shinryaku!? Ika Musume + TV + 12 + 0 + 12 + 0000-00-00 + 2011-12-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13125 + Shinsekai yori + TV + 25 + 0 + 25 + 0000-00-00 + 2013-03-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25835 + Shirobako + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12815 + Shirokuma Cafe + TV + 50 + 0 + 50 + 0000-00-00 + 2013-06-08 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32175 + Shounen Maid + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28735 + Shouwa Genroku Rakugo Shinjuu + TV + 13 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 79 + Shuffle! + TV + 24 + 25136285 + 24 + 0000-00-00 + 2010-11-09 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2923 + Shugo Chara! + TV + 51 + 27487568 + 51 + 0000-00-00 + 2010-12-23 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7082 + Shugo Chara! Party! + TV + 25 + 27609373 + 25 + 0000-00-00 + 2011-01-01 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5262 + Shugo Chara!! Doki + TV + 51 + 27609368 + 51 + 2010-12-24 + 2010-12-31 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 836 + Sister Princess + TV + 26 + 25136292 + 26 + 2010-12-23 + 2011-01-15 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4722 + Skip Beat! + TV + 25 + 28769373 + 25 + 0000-00-00 + 2011-01-30 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 534 + Slayers + TV + 26 + 27344992 + 26 + 0000-00-00 + 2011-01-11 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 535 + Slayers Next + TV + 26 + 31592163 + 26 + 0000-00-00 + 2011-05-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1172 + Slayers Try + TV + 26 + 31592199 + 26 + 0000-00-00 + 2011-06-16 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12191 + Smile Precure! + TV + 48 + 0 + 26 + 0000-00-00 + 0000-00-00 + + 8 + + + Watching + + 0 + + + 0 + 0 + 0 + + + + 6802 + So Ra No Wo To + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 20555 + SoniAni: Super Sonico The Animation + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-25 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1816 + Sonic X + TV + 78 + 20185905 + 78 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 23209 + Sora no Method + TV + 13 + 0 + 13 + 0000-00-00 + 2015-01-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5958 + Sora no Otoshimono + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8407 + Sora no Otoshimono: Forte + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 22101 + Soredemo Sekai wa Utsukushii + TV + 12 + 0 + 12 + 0000-00-00 + 2014-06-29 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3588 + Soul Eater + TV + 51 + 30307813 + 51 + 2011-04-11 + 2011-04-20 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21507 + Soul Eater NOT! + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 17849 + Sparrow's Hotel + TV + 12 + 0 + 12 + 2013-04-09 + 2013-06-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 8934 + Star Driver: Kagayaki no Takuto + TV + 25 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 9253 + Steins;Gate + TV + 24 + 0 + 24 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10863 + Steins;Gate: Oukoubakko no Poriomania + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 17821 + Stella Jogakuin Koutou-ka C³-bu + TV + 13 + 0 + 13 + 0000-00-00 + 2013-10-29 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21067 + Strange+ + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-27 + + 6 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3667 + Strike Witches + TV + 12 + 23344462 + 12 + 2010-07-28 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6381 + Strike Witches 2 + TV + 12 + 29293505 + 12 + 0000-00-00 + 2011-02-19 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28621 + Subete ga F ni Naru: The Perfect Insider + TV + 11 + 0 + 11 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1582 + Submarine 707R + OVA + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14289 + Sukitte Ii na yo. + TV + 13 + 0 + 13 + 0000-00-00 + 2012-12-29 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5681 + Summer Wars + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25 + Sunabouzu + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 7311 + Suzumiya Haruhi no Shoushitsu + Movie + 1 + 20250504 + 1 + 0000-00-00 + 2010-12-29 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 849 + Suzumiya Haruhi no Yuuutsu + TV + 14 + 20184737 + 14 + 0000-00-00 + 0000-00-00 + + 9 + + Retail DVD + Completed + + 4 + + + 0 + 0 + 0 + + + + 4382 + Suzumiya Haruhi no Yuuutsu (2009) + TV + 14 + 20184744 + 14 + 0000-00-00 + 2010-09-19 + + 7 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 5118 + Suzumiya Haruhi-chan no Yuuutsu + ONA + 25 + 20279286 + 25 + 2010-04-25 + 2010-04-25 + + 7 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 11757 + Sword Art Online + TV + 25 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 21881 + Sword Art Online II + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 29758 + Taboo Tattoo + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1577 + Taiho Shichau zo + OVA + 4 + 21369063 + 4 + 0000-00-00 + 0000-00-00 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 1372 + Taiho Shichau zo (1996) + TV + 47 + 21096743 + 47 + 0000-00-00 + 2010-09-24 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 2011 + Taiho Shichau zo Special + TV + 20 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3000 + Taiho Shichau zo: Full Throttle + TV + 23 + 27959173 + 23 + 2011-01-03 + 2011-01-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6312 + Taiho Shichau zo: Full Throttle Special + Special + 1 + 27959177 + 1 + 0000-00-00 + 2011-01-08 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4162 + Taiho Shichau zo: Nagisa no Koutsuu Yuudou + Special + 1 + 21531554 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2014 + Taiho Shichau zo: Second Season + TV + 26 + 27225301 + 26 + 2010-12-08 + 2010-12-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16417 + Tamako Market + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32093 + Tanaka-kun wa Itsumo Kedaruge + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 13333 + Tari Tari + TV + 13 + 0 + 13 + 0000-00-00 + 2012-09-24 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 696 + Tenchi Muyou! + TV + 26 + 0 + 26 + 0000-00-00 + 2013-05-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 539 + Tenchi Muyou! Ryououki + OVA + 6 + 31915233 + 6 + 0000-00-00 + 2011-05-12 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 540 + Tenchi Muyou! Ryououki 2nd Season + OVA + 6 + 31915238 + 6 + 2011-05-12 + 2011-05-15 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10351 + Tenchi Muyou! Ryououki 2nd Season Picture Drama + Special + 1 + 31915243 + 1 + 0000-00-00 + 2011-05-15 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 2001 + Tengen Toppa Gurren Lagann + TV + 27 + 22802923 + 27 + 2010-07-29 + 0000-00-00 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 513 + Tenkuu no Shiro Laputa + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3974 + Tetsuwan Birdy Decode + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 3455 + To LOVE-Ru + TV + 26 + 22428941 + 26 + 0000-00-00 + 2010-07-04 + + 8 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 13663 + To LOVE-Ru Darkness + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 5667 + To LOVE-Ru OVA + OVA + 6 + 0 + 6 + 2014-08-01 + 2014-08-01 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6213 + Toaru Kagaku no Railgun + TV + 24 + 0 + 24 + 0000-00-00 + 2013-03-02 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16049 + Toaru Kagaku no Railgun S + TV + 24 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 4654 + Toaru Majutsu no Index + TV + 24 + 0 + 19 + 0000-00-00 + 0000-00-00 + + 8 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 2236 + Toki wo Kakeru Shoujo + Movie + 1 + 20276937 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1043 + Tokyo Babylon + OVA + 2 + 0 + 2 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 6211 + Tokyo Magnitude 8.0 + TV + 11 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 687 + Tokyo Mew Mew + TV + 52 + 0 + 52 + 2013-01-01 + 2013-01-25 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14227 + Tonari no Kaibutsu-kun + TV + 13 + 0 + 13 + 0000-00-00 + 2012-12-24 + + 10 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18139 + Tonari no Seki-kun + TV + 21 + 0 + 21 + 0000-00-00 + 2014-05-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 523 + Tonari no Totoro + Movie + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4224 + Toradora! + TV + 25 + 0 + 25 + 0000-00-00 + 2012-04-16 + + 10 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 6 + Trigun + TV + 26 + 23589390 + 26 + 0000-00-00 + 2010-10-31 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 25157 + Trinity Seven + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 343 + Tsukuyomi: Moon Phase + TV + 25 + 20184781 + 25 + 0000-00-00 + 0000-00-00 + + 10 + + Retail DVD + Completed + + 5 + + + 0 + 0 + 0 + + + + 2580 + Tsukuyomi: Moon Phase Special + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 32681 + Uchuu Patrol Luluco + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12317 + Upotte!! + ONA + 10 + 0 + 10 + 0000-00-00 + 2012-07-07 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1293 + Urusei Yatsura + TV + 195 + 0 + 195 + 0000-00-00 + 2012-08-11 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10162 + Usagi Drop + TV + 11 + 0 + 11 + 0000-00-00 + 2012-07-18 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3457 + Vampire Knight + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 4752 + Vampire Knight Guilty + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 180 + Vandread + TV + 13 + 22401884 + 13 + 2010-06-29 + 2010-06-29 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 1111 + Vandread: Gekitou-hen + OVA + 1 + 22465543 + 1 + 0000-00-00 + 2010-06-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1112 + Vandread: Taidou-hen + OVA + 1 + 22465548 + 1 + 0000-00-00 + 2010-06-30 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 181 + Vandread: The Second Stage + TV + 13 + 22465553 + 13 + 2010-06-30 + 2010-06-30 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 1607 + Venus Versus Virus + TV + 12 + 23344486 + 12 + 2010-07-26 + 0000-00-00 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 14283 + Vividred Operation + TV + 12 + 0 + 12 + 2013-05-23 + 2013-06-10 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31439 + Wagamama High Spec + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 3322 + Wagaya no Oinari-sama. + TV + 24 + 0 + 24 + 0000-00-00 + 2013-02-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30355 + Wakaba*Girl + TV + 13 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 19023 + Wake Up, Girls! + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-31 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 21189 + Wake Up, Girls! Shichinin no Idol + Movie + 1 + 0 + 1 + 0000-00-00 + 2014-01-20 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 19151 + Walkure Romanze + TV + 12 + 0 + 12 + 0000-00-00 + 2014-02-15 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16742 + Watashi ga Motenai no wa Dou Kangaetemo Omaera ga Warui! + TV + 12 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 0 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 21085 + Witch Craft Works + TV + 12 + 0 + 12 + 0000-00-00 + 2014-03-28 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 22117 + Witch Craft Works OVA + OVA + 1 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 935 + Witchblade + TV + 24 + 22429124 + 24 + 0000-00-00 + 2010-07-17 + + 9 + + + Completed + + 2 + + + 0 + 0 + 0 + + + + 6956 + Working!! + TV + 13 + 30953325 + 13 + 0000-00-00 + 2011-04-14 + + 10 + + + Completed + + 3 + + + 0 + 0 + 0 + + + + 25879 + Working!!! + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 31715 + Working!!!: Lord of the Takanashi + Special + 1 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10521 + Working'!! + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 9 + + + Completed + + 1 + + + 0 + 0 + 0 + + + + 14813 + Yahari Ore no Seishun Love Comedy wa Machigatteiru. + TV + 13 + 0 + 13 + 0000-00-00 + 2013-07-05 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 28677 + Yamada-kun to 7-nin no Majo (TV) + TV + 12 + 0 + 12 + 2015-04-18 + 0000-00-00 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 5454 + Yokuwakaru Gendaimahou + TV + 12 + 0 + 12 + 0000-00-00 + 2012-08-18 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 7762 + Yondemasu yo, Azazel-san. + OVA + 4 + 0 + 4 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10216 + Yondemasu yo, Azazel-san. (TV) + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 16241 + Yondemasu yo, Azazel-san. Z + TV + 13 + 0 + 13 + 0000-00-00 + 0000-00-00 + + 7 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18179 + Yowamushi Pedal + TV + 38 + 0 + 10 + 0000-00-00 + 0000-00-00 + + 8 + + + Dropped + + 0 + + + 0 + 0 + 0 + + + + 550 + Yu☆Gi☆Oh! + TV + 27 + 0 + 27 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 10495 + Yuru Yuri + TV + 12 + 0 + 12 + 0000-00-00 + 2011-09-20 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 30279 + Yuru Yuri San☆Hai! + TV + 12 + 0 + 12 + 0000-00-00 + 0000-00-00 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 12403 + Yuru Yuri♪♪ + TV + 12 + 0 + 12 + 0000-00-00 + 2012-09-17 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 14693 + Yurumates 3D Plus + TV + 13 + 0 + 13 + 0000-00-00 + 2012-09-27 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 18677 + Yuusha ni Narenakatta Ore wa Shibushibu Shuushoku wo Ketsui Shimashita. + TV + 12 + 0 + 12 + 0000-00-00 + 2014-01-28 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 15911 + Yuyushiki + TV + 12 + 0 + 12 + 2013-04-09 + 2013-06-26 + + 8 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 1195 + Zero no Tsukaima + TV + 13 + 0 + 13 + 0000-00-00 + 2014-04-06 + + 9 + + + Completed + + 0 + + + 0 + 0 + 0 + + + + 11319 + Zero no Tsukaima F + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 1840 + Zero no Tsukaima: Futatsuki no Kishi + TV + 12 + 0 + 1 + 0000-00-00 + 0000-00-00 + + 0 + + + On-Hold + + 0 + + + 0 + 0 + 0 + + + + 3712 + Zero no Tsukaima: Princesses no Rondo + TV + 12 + 0 + 0 + 0000-00-00 + 0000-00-00 + + 0 + + + Plan to Watch + + 0 + + + 0 + 0 + 0 + + + + 17681 + Zettai Bouei Leviathan + 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/XML/minifiedXmlTestFile.xml b/tests/test_data/XML/minifiedXmlTestFile.xml new file mode 100644 index 00000000..c0490c7c --- /dev/null +++ b/tests/test_data/XML/minifiedXmlTestFile.xml @@ -0,0 +1,2 @@ + +4211watching712.5130115201510232016201Should you say something?test tag, 2nd tag diff --git a/tests/test_data/XML/xmlTestFile.xml b/tests/test_data/XML/xmlTestFile.xml new file mode 100644 index 00000000..b37cf964 --- /dev/null +++ b/tests/test_data/XML/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
Airing Status
Episode Count
Episode Length minutes
Age Rating
Genres @@ -40,6 +42,39 @@

+ 0): ?> +
+

Streaming on:

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

Edit Anime List Item

@@ -77,6 +78,7 @@
  + Type Progress RatedAttributesAttributes Notes Genres
+ + + + + + + + + +

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