All in GraphQL #34

Merged
timw4mail merged 87 commits from develop into master 2020-12-01 10:07:49 -05:00
26 changed files with 4763 additions and 3751 deletions
Showing only changes of commit 5340c39466 - Show all commits

View File

@ -222,40 +222,6 @@ trait AnimeTrait {
return $output;
}
/**
* Get the mal id for the anime represented by the kitsu id
* to enable updating MyAnimeList
*
* @param string $kitsuAnimeId The id of the anime on Kitsu
* @return string|null Returns the mal id if it exists, otherwise null
*/
public function getMalIdForAnime(string $kitsuAnimeId): ?string
{
$options = [
'query' => [
'include' => 'mappings'
]
];
$data = $this->requestBuilder->getRequest("anime/{$kitsuAnimeId}", $options);
if ( ! array_key_exists('included', $data))
{
return NULL;
}
$mappings = array_column($data['included'], 'attributes');
foreach($mappings as $map)
{
if ($map['externalSite'] === 'myanimelist/anime')
{
return $map['externalId'];
}
}
return NULL;
}
/**
* Get the full anime list in paginated form
*

View File

@ -242,32 +242,4 @@ trait MangaTrait {
return $this->requestBuilder->setUpRequest('GET', 'library-entries', ['query' => $options]);
}
/**
* Get the mal id for the manga represented by the kitsu id
* to enable updating MyAnimeList
*
* @param string $kitsuMangaId The id of the manga on Kitsu
* @return string|null Returns the mal id if it exists, otherwise null
*/
public function getMalIdForManga(string $kitsuMangaId): ?string
{
$options = [
'query' => [
'include' => 'mappings'
]
];
$data = $this->requestBuilder->getRequest("manga/{$kitsuMangaId}", $options);
$mappings = array_column($data['included'], 'attributes');
foreach($mappings as $map)
{
if ($map['externalSite'] === 'myanimelist/manga')
{
return $map['externalId'];
}
}
return NULL;
}
}

View File

@ -279,27 +279,12 @@ final class Model {
*/
public function getKitsuIdFromMALId(string $malId, string $type='anime'): ?string
{
$options = [
'query' => [
'filter' => [
'external_site' => "myanimelist/{$type}",
'external_id' => $malId
],
'fields' => [
'media' => 'id,slug'
],
'include' => 'item'
]
];
$raw = $this->requestBuilder->runQuery('GetIdByMapping', [
'id' => $malId,
'site' => strtoupper("MYANIMELIST_{$type}"),
]);
$raw = $this->requestBuilder->getRequest('mappings', $options);
if ( ! array_key_exists('included', $raw))
{
return NULL;
}
return $raw['included'][0]['id'];
return $raw['data']['lookupMapping']['id'] ?? NULL;
}
/**

View File

@ -0,0 +1,42 @@
<?php declare(strict_types=1);
/**
* Hummingbird Anime List Client
*
* An API client for Kitsu to manage anime and manga watch lists
*
* PHP version 7.4
*
* @package HummingbirdAnimeClient
* @author Timothy J. Warren <tim@timshomepage.net>
* @copyright 2015 - 2020 Timothy J. Warren
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @version 5.1
* @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient
*/
namespace Aviat\AnimeClient\Tests\API\Kitsu;
use Aviat\AnimeClient\Tests\AnimeClientTestCase;
class ModelTest extends AnimeClientTestCase {
protected $model;
public function setUp(): void
{
parent::setup();
$this->model = $this->container->get('kitsu-model');
}
public function testGetAnimeKitsuIdFromMALId(): void
{
$kitsuId = $this->model->getKitsuIdFromMALId("1", 'anime');
self::assertEquals("1", $kitsuId);
}
public function testGetNullFromMALAnimeId(): void
{
$kitsuId = $this->model->getKitsuIdFromMALId("0", 'anime');
self::assertNull($kitsuId);
}
}

View File

@ -16,9 +16,8 @@
namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer;
use Aviat\AnimeClient\API\Kitsu\Transformer\OldAnimeListTransformer;
use Aviat\AnimeClient\API\Kitsu\Transformer\AnimeListTransformer;
use Aviat\AnimeClient\Tests\AnimeClientTestCase;
use Aviat\Ion\Friend;
use Aviat\Ion\Json;
class AnimeListTransformerTest extends AnimeClientTestCase {
@ -31,9 +30,10 @@ class AnimeListTransformerTest extends AnimeClientTestCase {
parent::setUp();
$this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu';
$this->beforeTransform = Json::decodeFile("{$this->dir}/animeListItemBeforeTransform.json");
$raw = Json::decodeFile("{$this->dir}/animeListItemBeforeTransform.json");
$this->beforeTransform = $raw['data']['findLibraryEntryById'];
$this->transformer = new OldAnimeListTransformer();
$this->transformer = new AnimeListTransformer();
}
public function testTransform()

View File

@ -24,7 +24,6 @@ class AnimeTransformerTest extends AnimeClientTestCase {
protected $dir;
protected $beforeTransform;
protected $afterTransform;
protected $transformer;
public function setUp(): void {
@ -38,8 +37,6 @@ class AnimeTransformerTest extends AnimeClientTestCase {
public function testTransform()
{
$this->markTestSkipped('Skip until fixed with GraphQL snapshot');
$actual = $this->transformer->transform($this->beforeTransform);
$this->assertMatchesSnapshot($actual);
}

View File

@ -16,8 +16,7 @@
namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer;
use Aviat\AnimeClient\API\JsonAPI;
use Aviat\AnimeClient\API\Kitsu\Transformer\OldMangaListTransformer;
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaListTransformer;
use Aviat\AnimeClient\Tests\AnimeClientTestCase;
use Aviat\AnimeClient\Types\{
FormItem,
@ -30,29 +29,17 @@ class MangaListTransformerTest extends AnimeClientTestCase {
protected $dir;
protected $rawBefore;
protected $beforeTransform;
protected $afterTransform;
protected $transformer;
public function setUp(): void {
parent::setUp();
$kitsuModel = $this->container->get('kitsu-model');
$this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu';
// Prep for transform
$rawBefore = Json::decodeFile("{$this->dir}/mangaListBeforeTransform.json");
$included = JsonAPI::organizeIncludes($rawBefore['included']);
$included = JsonAPI::inlineIncludedRelationships($included, 'manga');
foreach($rawBefore['data'] as $i => &$item)
{
$item['included'] = $included;
}
$this->beforeTransform = $rawBefore['data'];
// $this->afterTransform = Json::decodeFile("{$this->dir}/mangaListAfterTransform.json");
$this->transformer = new OldMangaListTransformer();
$raw = Json::decodeFile("{$this->dir}/mangaListBeforeTransform.json");
$this->beforeTransform = $raw['data']['findProfileBySlug']['library']['all']['nodes'];
$this->transformer = new MangaListTransformer();
}
public function testTransform()

View File

@ -16,7 +16,6 @@
namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer;
use Aviat\AnimeClient\API\JsonAPI;
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaTransformer;
use Aviat\AnimeClient\Tests\AnimeClientTestCase;
use Aviat\Ion\Json;
@ -25,26 +24,19 @@ class MangaTransformerTest extends AnimeClientTestCase {
protected $dir;
protected $beforeTransform;
protected $afterTransform;
protected $transformer;
public function setUp(): void {
parent::setUp();
$this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu';
$data = Json::decodeFile("{$this->dir}/mangaBeforeTransform.json");
$baseData = $data['data'][0]['attributes'];
$baseData['included'] = $data['included'];
$baseData['id'] = $data['data'][0]['id'];
$this->beforeTransform = $baseData;
$this->beforeTransform = Json::decodeFile("{$this->dir}/mangaBeforeTransform.json");
$this->transformer = new MangaTransformer();
}
public function testTransform()
{
$this->markTestSkipped('Skip until fixed with GraphQL snapshot');
$actual = $this->transformer->transform($this->beforeTransform);
$this->assertMatchesSnapshot($actual);
}

View File

@ -1,45 +0,0 @@
<?php return Aviat\AnimeClient\Types\AnimeListItem::__set_state(array(
'id' => '15839442',
'mal_id' => '33206',
'episodes' =>
array (
'watched' => '-',
'total' => '-',
'length' => NULL,
),
'airing' =>
array (
'status' => 'Currently Airing',
'started' => '2017-01-12',
'ended' => NULL,
),
'anime' =>
Aviat\AnimeClient\Types\Anime::__set_state(array(
'age_rating' => NULL,
'cover_image' => 'https://media.kitsu.io/anime/poster_images/12243/small.jpg?1481144116',
'genres' =>
array (
0 => 'Comedy',
1 => 'Fantasy',
2 => 'Slice of Life',
),
'id' => '12243',
'show_type' => 'TV',
'slug' => 'kobayashi-san-chi-no-maid-dragon',
'streaming_links' =>
array (
),
'title' => 'Kobayashi-san Chi no Maid Dragon',
'titles' =>
array (
0 => 'Miss Kobayashi\'s Dragon Maid',
1 => '小林さんちのメイドラゴン',
),
)),
'notes' => NULL,
'private' => false,
'rewatching' => false,
'rewatched' => 0,
'user_rating' => '-',
'watching_status' => 'current',
));

View File

@ -1,28 +1,28 @@
empty: false
id: '15839442'
mal_id: '33206'
id: '435513'
mal_id: '209'
episodes:
watched: '-'
total: '-'
length: null
watched: 7
total: 26
length: 1500
airing:
status: 'Currently Airing'
started: '2017-01-12'
ended: null
status: 'Finished Airing'
started: '2003-09-01'
ended: '2004-03-16'
anime:
empty: false
age_rating: null
cover_image: 'https://media.kitsu.io/anime/poster_images/12243/small.jpg?1481144116'
genres: [Comedy, Fantasy, 'Slice of Life']
id: '12243'
age_rating: PG
cover_image: 'https://media.kitsu.io/anime/poster_images/185/small.jpg?1597697520'
genres: { }
id: '185'
show_type: TV
slug: kobayashi-san-chi-no-maid-dragon
streaming_links: { }
title: 'Kobayashi-san Chi no Maid Dragon'
titles: ['Miss Kobayashi''s Dragon Maid', 小林さんちのメイドラゴン]
notes: null
slug: r-o-d
streaming_links: [{ meta: { name: Crunchyroll, link: true, image: streaming-logos/crunchyroll.svg }, link: 'http://www.crunchyroll.com/rod', subs: [en], dubs: [ja] }, { meta: { name: Hulu, link: true, image: streaming-logos/hulu.svg }, link: 'http://www.hulu.com/rod-the-tv', subs: [en], dubs: [ja] }]
title: 'R.O.D the TV'
titles: ['アール・オー・ディー ザ・ティーヴィー']
notes: ''
private: false
rewatching: false
rewatched: 0
user_rating: '-'
watching_status: current
watching_status: CURRENT

View File

@ -1,15 +0,0 @@
<?php return Aviat\AnimeClient\Types\FormItem::__set_state(array(
'id' => 14047981,
'anilist_item_id' => NULL,
'mal_id' => NULL,
'data' =>
Aviat\AnimeClient\Types\FormItemData::__set_state(array(
'notes' => 'Very formulaic.',
'private' => false,
'progress' => 38,
'ratingTwenty' => 16,
'reconsumeCount' => 0,
'reconsuming' => false,
'status' => 'current',
)),
));

View File

@ -1,15 +0,0 @@
<?php return Aviat\AnimeClient\Types\FormItem::__set_state(array(
'id' => 14047981,
'anilist_item_id' => NULL,
'mal_id' => '12345',
'data' =>
Aviat\AnimeClient\Types\FormItemData::__set_state(array(
'notes' => 'Very formulaic.',
'private' => true,
'progress' => 38,
'ratingTwenty' => 16,
'reconsumeCount' => 0,
'reconsuming' => true,
'status' => 'current',
)),
));

View File

@ -1,14 +0,0 @@
<?php return Aviat\AnimeClient\Types\FormItem::__set_state(array(
'id' => 14047983,
'anilist_item_id' => NULL,
'mal_id' => '12347',
'data' =>
Aviat\AnimeClient\Types\FormItemData::__set_state(array(
'notes' => '',
'private' => true,
'progress' => 12,
'reconsumeCount' => 0,
'reconsuming' => true,
'status' => 'current',
)),
));

View File

@ -1,315 +0,0 @@
<?php return Aviat\AnimeClient\Types\AnimePage::__set_state(array(
'characters' =>
array (
),
'staff' =>
array (
),
'age_rating' => 'R',
'age_rating_guide' => 'Violence, Profanity',
'cover_image' => 'https://media.kitsu.io/anime/poster_images/7442/small.jpg?1418580054',
'episode_count' => 25,
'episode_length' => 24,
'genres' =>
array (
),
'id' => 32344,
'included' =>
array (
'categories' =>
array (
23 =>
array (
'name' => 'Super Power',
'slug' => 'super-power',
'description' => NULL,
),
11 =>
array (
'name' => 'Fantasy',
'slug' => 'fantasy',
'description' => '',
),
4 =>
array (
'name' => 'Drama',
'slug' => 'drama',
'description' => '',
),
1 =>
array (
'name' => 'Action',
'slug' => 'action',
'description' => '',
),
),
'mappings' =>
array (
5686 =>
array (
'externalSite' => 'myanimelist/anime',
'externalId' => '16498',
'relationships' =>
array (
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/mappings/5686/relationships/media',
'related' => 'https://kitsu.io/api/edge/mappings/5686/media',
),
),
),
),
14153 =>
array (
'externalSite' => 'thetvdb/series',
'externalId' => '267440',
'relationships' =>
array (
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/mappings/14153/relationships/media',
'related' => 'https://kitsu.io/api/edge/mappings/14153/media',
),
),
),
),
15073 =>
array (
'externalSite' => 'thetvdb/season',
'externalId' => '514060',
'relationships' =>
array (
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/mappings/15073/relationships/media',
'related' => 'https://kitsu.io/api/edge/mappings/15073/media',
),
),
),
),
),
'streamingLinks' =>
array (
103 =>
array (
'url' => 'http://www.crunchyroll.com/attack-on-titan',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
'relationships' =>
array (
'streamer' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/103/relationships/streamer',
'related' => 'https://kitsu.io/api/edge/streaming-links/103/streamer',
),
),
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/103/relationships/media',
'related' => 'https://kitsu.io/api/edge/streaming-links/103/media',
),
),
),
),
102 =>
array (
'url' => 'http://www.hulu.com/attack-on-titan',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
'relationships' =>
array (
'streamer' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/102/relationships/streamer',
'related' => 'https://kitsu.io/api/edge/streaming-links/102/streamer',
),
),
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/102/relationships/media',
'related' => 'https://kitsu.io/api/edge/streaming-links/102/media',
),
),
),
),
101 =>
array (
'url' => 'http://www.funimation.com/shows/attack-on-titan/videos/episodes',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
'relationships' =>
array (
'streamer' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/101/relationships/streamer',
'related' => 'https://kitsu.io/api/edge/streaming-links/101/streamer',
),
),
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/101/relationships/media',
'related' => 'https://kitsu.io/api/edge/streaming-links/101/media',
),
),
),
),
100 =>
array (
'url' => 't',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
'relationships' =>
array (
'streamer' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/100/relationships/streamer',
'related' => 'https://kitsu.io/api/edge/streaming-links/100/streamer',
),
),
'media' =>
array (
'links' =>
array (
'self' => 'https://kitsu.io/api/edge/streaming-links/100/relationships/media',
'related' => 'https://kitsu.io/api/edge/streaming-links/100/media',
),
),
),
),
),
),
'show_type' => 'TV',
'slug' => 'attack-on-titan',
'status' => 'Finished Airing',
'streaming_links' =>
array (
0 =>
array (
'meta' =>
array (
'name' => 'Crunchyroll',
'link' => true,
'image' => 'streaming-logos/crunchyroll.svg',
),
'link' => 'http://www.crunchyroll.com/attack-on-titan',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
),
1 =>
array (
'meta' =>
array (
'name' => 'Funimation',
'link' => true,
'image' => 'streaming-logos/funimation.svg',
),
'link' => 'http://www.funimation.com/shows/attack-on-titan/videos/episodes',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
),
2 =>
array (
'meta' =>
array (
'name' => 'Hulu',
'link' => true,
'image' => 'streaming-logos/hulu.svg',
),
'link' => 'http://www.hulu.com/attack-on-titan',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
),
3 =>
array (
'meta' =>
array (
'name' => 'Netflix',
'link' => false,
'image' => 'streaming-logos/netflix.svg',
),
'link' => 't',
'subs' =>
array (
0 => 'en',
),
'dubs' =>
array (
0 => 'ja',
),
),
),
'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.
(Source: ANN)',
'title' => 'Attack on Titan',
'titles' =>
array (
0 => 'Attack on Titan',
1 => 'Shingeki no Kyojin',
2 => '進撃の巨人',
),
'trailer_id' => 'n4Nj6Y_SNYI',
'url' => 'https://kitsu.io/anime/attack-on-titan',
));

View File

@ -1,60 +1,24 @@
-
empty: false
id: '15084773'
mal_id: '26769'
chapters: { read: 67, total: '-' }
id: '15288185'
mal_id: '28091'
chapters: { read: 94, total: '-' }
volumes: { read: '-', total: '-' }
manga: { empty: false, genres: [Comedy, Romance, School, 'Slice of Life', Thriller], id: '20286', image: 'https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999', slug: bokura-wa-minna-kawaisou, title: 'Bokura wa Minna Kawaisou', titles: { }, type: Manga, url: 'https://kitsu.io/manga/bokura-wa-minna-kawaisou' }
reading_status: current
notes: ''
rereading: false
reread: 0
user_rating: 9
-
empty: false
id: '15085607'
mal_id: '16'
chapters: { read: 17, total: 120 }
volumes: { read: '-', total: 14 }
manga: { empty: false, genres: [Comedy, Ecchi, Harem, Romance, Sports], id: '47', image: 'https://media.kitsu.io/manga/poster_images/47/small.jpg?1434249493', slug: love-hina, title: 'Love Hina', titles: { }, type: Manga, url: 'https://kitsu.io/manga/love-hina' }
reading_status: current
notes: ''
rereading: false
reread: 0
user_rating: 7
-
empty: false
id: '15084529'
mal_id: '35003'
chapters: { read: 16, total: '-' }
volumes: { read: '-', total: '-' }
manga: { empty: false, genres: [Comedy, Ecchi, 'Gender Bender', Romance, School, Sports, Supernatural], id: '11777', image: 'https://media.kitsu.io/manga/poster_images/11777/small.jpg?1438784325', slug: yamada-kun-to-7-nin-no-majo, title: 'Yamada-kun to 7-nin no Majo', titles: ['Yamada-kun and the Seven Witches'], type: Manga, url: 'https://kitsu.io/manga/yamada-kun-to-7-nin-no-majo' }
reading_status: current
notes: ''
rereading: false
reread: 0
user_rating: 9
-
empty: false
id: '15312827'
mal_id: '78523'
chapters: { read: 68, total: '-' }
volumes: { read: '-', total: '-' }
manga: { empty: false, genres: [Romance, School, 'Slice of Life'], id: '27175', image: 'https://media.kitsu.io/manga/poster_images/27175/small.jpg?1464379411', slug: relife, title: ReLIFE, titles: { }, type: Manga, url: 'https://kitsu.io/manga/relife' }
reading_status: current
notes: ''
rereading: false
reread: 0
user_rating: '-'
-
empty: false
id: '15084769'
mal_id: '60815'
chapters: { read: 43, total: '-' }
volumes: { read: '-', total: '-' }
manga: { empty: false, genres: [Comedy, School, 'Slice of Life'], id: '25491', image: 'https://media.kitsu.io/manga/poster_images/25491/small.jpg?1434305043', slug: joshikausei, title: Joshikausei, titles: { }, type: Manga, url: 'https://kitsu.io/manga/joshikausei' }
manga: { empty: false, genres: { }, id: '21733', image: 'https://media.kitsu.io/manga/poster_images/21733/small.jpg?1496845097', slug: tonari-no-seki-kun, title: 'Tonari no Seki-kun', titles: ['My Neighbour Seki', となりの関くん], type: Manga, url: 'https://kitsu.io/manga/tonari-no-seki-kun' }
reading_status: current
notes: ''
rereading: false
reread: 0
user_rating: 8
-
empty: false
id: '15084769'
mal_id: '60815'
chapters: { read: 87, total: '-' }
volumes: { read: '-', total: '-' }
manga: { empty: false, genres: { }, id: '25491', image: 'https://media.kitsu.io/manga/poster_images/25491/small.jpg?1499026452', slug: joshikausei, title: Joshikausei, titles: [女子かう生], type: Manga, url: 'https://kitsu.io/manga/joshikausei' }
reading_status: current
notes: 'Wordless, and it works.'
rereading: false
reread: 0
user_rating: 8

View File

@ -1,86 +0,0 @@
<?php return Aviat\AnimeClient\Types\MangaPage::__set_state(array(
'characters' =>
array (
),
'chapter_count' => '-',
'cover_image' => 'https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999',
'genres' =>
array (
),
'id' => '20286',
'included' =>
array (
'genres' =>
array (
3 =>
array (
'attributes' =>
array (
'name' => 'Comedy',
'slug' => 'comedy',
'description' => NULL,
),
),
24 =>
array (
'attributes' =>
array (
'name' => 'School',
'slug' => 'school',
'description' => NULL,
),
),
16 =>
array (
'attributes' =>
array (
'name' => 'Slice of Life',
'slug' => 'slice-of-life',
'description' => '',
),
),
14 =>
array (
'attributes' =>
array (
'name' => 'Romance',
'slug' => 'romance',
'description' => '',
),
),
18 =>
array (
'attributes' =>
array (
'name' => 'Thriller',
'slug' => 'thriller',
'description' => NULL,
),
),
),
'mappings' =>
array (
48014 =>
array (
'attributes' =>
array (
'externalSite' => 'myanimelist/manga',
'externalId' => '26769',
),
),
),
),
'manga_type' => 'manga',
'staff' =>
array (
),
'synopsis' => 'Usa, a high-school student aspiring to begin a bachelor lifestyle, moves into a new apartment only to discover that he not only shares a room with a perverted roommate that has an obsession for underaged girls, but also that another girl, Ritsu, a love-at-first-sight, is living in the same building as well!
(Source: Kirei Cake)',
'title' => 'Bokura wa Minna Kawaisou',
'titles' =>
array (
0 => NULL,
),
'url' => 'https://kitsu.io/manga/bokura-wa-minna-kawaisou',
'volume_count' => '-',
));

View File

@ -1,19 +1,32 @@
empty: false
characters: { }
chapter_count: '-'
age_rating: PG
age_rating_guide: ''
characters:
main: { 40541: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/40541/original.jpg?1483096805', width: null } }, name: 'Kazunari Usa', slug: kazunari-usa }, 40540: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/40540/original.jpg?1483096805', width: null } }, name: 'Ritsu Kawai', slug: ritsu-kawai } }
background: { 62591: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/62591/original.jpg?1485073100', width: null } }, name: Chinatsu, slug: chinatsu }, 72839: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/72839/original.jpg?1485079724', width: null } }, name: Hayashi, slug: hayashi-ec3a2705-5d5c-493c-b172-bbee2d04b5b9 }, 78362: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/78362/original.jpg?1485081676', width: null } }, name: Houjou, slug: houjou }, 90353: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/90353/original.jpg?1485086356', width: null } }, name: Kurokawa, slug: kurokawa-a493ddf6-0f02-4abf-8b18-ab6ae2198b6e }, 77996: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/77996/original.jpg?1485081552', width: null } }, name: Maemura, slug: maemura }, 55132: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/55132/original.jpg?1483096805', width: null } }, name: 'Mayumi Nishikino', slug: mayumi-nishikino }, 71479: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/71479/original.jpg?1485079211', width: null } }, name: 'Miharu Tsuneda', slug: miharu-tsuneda }, 55134: { image: { original: { height: null, name: original, url: '/images/original/missing.png?1483096805', width: null } }, name: 'Mother Usa', slug: mother-usa }, 55135: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/55135/original.jpg?1483096805', width: null } }, name: 'Sayaka Watanabe', slug: sayaka-watanabe }, 95032: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/95032/original.jpg?1485088329', width: null } }, name: Shirosaki, slug: shirosaki-2ed2e15c-9cee-4756-92f1-027c4820e224 }, 55131: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/55131/original.jpg?1483096805', width: null } }, name: 'Sumiko Kawai', slug: sumiko-kawai }, 74335: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/74335/original.jpg?1485080245', width: null } }, name: 'Tae Shinohara', slug: tae-shinohara }, 55133: { image: { original: { height: null, name: original, url: 'https://media.kitsu.io/characters/images/55133/original.jpg?1483096805', width: null } }, name: Tagami, slug: tagami }, 83463: { image: { original: { height: null, name: original, url: /images/original/missing.png, width: null } }, name: 'Yoko Mabuchi', slug: yoko-mabuchi } }
chapter_count: 90
cover_image: 'https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999'
genres: { }
genres:
- Comedy
- Romance
- 'School Life'
- 'Slice of Life'
links:
Anilist: 'https://anilist.co/anime/56769/'
Kitsu: 'https://kitsu.io/manga/bokura-wa-minna-kawaisou'
MyAnimeList: 'https://myanimelist.net/manga/26769'
id: '20286'
included:
genres: { 3: { attributes: { name: Comedy, slug: comedy, description: null } }, 24: { attributes: { name: School, slug: school, description: null } }, 16: { attributes: { name: 'Slice of Life', slug: slice-of-life, description: '' } }, 14: { attributes: { name: Romance, slug: romance, description: '' } }, 18: { attributes: { name: Thriller, slug: thriller, description: null } } }
mappings: { 48014: { attributes: { externalSite: myanimelist/manga, externalId: '26769' } } }
manga_type: manga
staff: { }
synopsis: |
Usa, a high-school student aspiring to begin a bachelor lifestyle, moves into a new apartment only to discover that he not only shares a room with a perverted roommate that has an obsession for underaged girls, but also that another girl, Ritsu, a love-at-first-sight, is living in the same building as well!
(Source: Kirei Cake)
title: 'Bokura wa Minna Kawaisou'
manga_type: MANGA
status: Completed
staff:
'Story & Art': [{ id: '8712', slug: ruri-miyahara, name: 'Ruri Miyahara', image: { original: 'https://media.kitsu.io/people/images/8712/original.jpg?1533271952' } }]
synopsis: "Usa, a high-school student aspiring to begin a bachelor lifestyle, moves into a new apartment only to discover that he not only shares a room with a perverted roommate that has an obsession for underaged girls, but also that another girl, Ritsu, a love-at-first-sight, is living in the same building as well!\r\n(Source: Kirei Cake)"
title: 'Bokura wa Minna Kawai-sou'
titles:
- null
1: 'The Kawai Complex Guide to Manors and Hostel'
4: 僕らはみんな河合荘
titles_more:
- 'The Kawai Complex Guide to Manors and Hostel'
- 僕らはみんな河合荘
url: 'https://kitsu.io/manga/bokura-wa-minna-kawaisou'
volume_count: '-'
volume_count: 10

View File

@ -1,52 +0,0 @@
{
"title": "Attack on Titan",
"titles": ["Attack on Titan", "Shingeki no Kyojin", "\u9032\u6483\u306e\u5de8\u4eba"],
"status": "Finished Airing",
"cover_image": "https:\/\/media.kitsu.io\/anime\/poster_images\/7442\/small.jpg?1418580054",
"show_type": "TV",
"episode_count": 25,
"episode_length": 24,
"synopsis": "Several hundred years ago, humans were nearly exterminated by titans. Titans are typically several stories tall, seem to have no intelligence, devour human beings and, worst of all, seem to do it for the pleasure rather than as a food source. A small percentage of humanity survived by enclosing themselves in a city protected by extremely high walls, even taller than the biggest of titans. Flash forward to the present and the city has not seen a titan in over 100 years. Teenage boy Eren and his foster sister Mikasa witness something horrific as the city walls are destroyed by a colossal titan that appears out of thin air. As the smaller titans flood the city, the two kids watch in horror as their mother is eaten alive. Eren vows that he will murder every single titan and take revenge for all of mankind.\n\n(Source: ANN)",
"age_rating": "R",
"age_rating_guide": "Violence, Profanity",
"url": "https:\/\/kitsu.io\/anime\/attack-on-titan",
"genres": ["Action", "Drama", "Fantasy", "Super Power"],
"streaming_links": [{
"meta": {
"name": "Crunchyroll",
"link": true,
"image": "streaming-logos\/crunchyroll.svg"
},
"link": "http:\/\/www.crunchyroll.com\/attack-on-titan",
"subs": ["en"],
"dubs": ["ja"]
}, {
"meta": {
"name": "Hulu",
"link": true,
"image": "streaming-logos\/hulu.svg"
},
"link": "http:\/\/www.hulu.com\/attack-on-titan",
"subs": ["en"],
"dubs": ["ja"]
}, {
"meta": {
"name": "Funimation",
"link": true,
"image": "streaming-logos\/funimation.svg"
},
"link": "http:\/\/www.funimation.com\/shows\/attack-on-titan\/videos\/episodes",
"subs": ["en"],
"dubs": ["ja"]
}, {
"meta": {
"name": "Netflix",
"link": false,
"image": "streaming-logos\/netflix.svg"
},
"link": "t",
"subs": ["en"],
"dubs": ["ja"]
}],
"slug": "attack-on-titan"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +0,0 @@
{
"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,
"title": "Kobayashi-san Chi no Maid Dragon",
"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
}

View File

@ -1,12 +0,0 @@
{
"title": "Bokura wa Minna Kawaisou",
"en_title": null,
"jp_title": "Bokura wa Minna Kawaisou",
"cover_image": "https:\/\/media.kitsu.io\/manga\/poster_images\/20286\/small.jpg?1434293999",
"manga_type": "manga",
"chapter_count": "-",
"volume_count": "-",
"synopsis": "Usa, a high-school student aspiring to begin a bachelor lifestyle, moves into a new apartment only to discover that he not only shares a room with a perverted roommate that has an obsession for underaged girls, but also that another girl, Ritsu, a love-at-first-sight, is living in the same building as well!\n(Source: Kirei Cake)",
"url": "https:\/\/kitsu.io\/manga\/bokura-wa-minna-kawaisou",
"genres": ["Comedy","Romance","School","Slice of Life","Thriller"]
}

View File

@ -1,197 +1,465 @@
{
"data": [{
"id": "20286",
"type": "manga",
"links": {
"self": "https://kitsu.io/api/edge/manga/20286"
"data": {
"findMangaBySlug": {
"id": "20286",
"ageRating": "PG",
"ageRatingGuide": "",
"posterImage": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/manga/poster_images/20286/original.jpg?1434293999",
"width": null
},
"attributes": {
"slug": "bokura-wa-minna-kawaisou",
"synopsis": "Usa, a high-school student aspiring to begin a bachelor lifestyle, moves into a new apartment only to discover that he not only shares a room with a perverted roommate that has an obsession for underaged girls, but also that another girl, Ritsu, a love-at-first-sight, is living in the same building as well!\n(Source: Kirei Cake)",
"coverImageTopOffset": 40,
"titles": {
"en_us": null,
"en_jp": "Bokura wa Minna Kawaisou"
},
"canonicalTitle": "Bokura wa Minna Kawaisou",
"abbreviatedTitles": null,
"averageRating": 4.12281805954249,
"ratingFrequencies": {
"0.5": "0",
"1.0": "1",
"1.5": "0",
"2.0": "1",
"2.5": "2",
"3.0": "6",
"3.5": "21",
"4.0": "38",
"4.5": "35",
"5.0": "43",
"nil": "16"
},
"favoritesCount": 0,
"startDate": "2010-01-01",
"endDate": null,
"popularityRank": 262,
"ratingRank": 127,
"ageRating": "PG",
"ageRatingGuide": null,
"posterImage": {
"tiny": "https://media.kitsu.io/manga/poster_images/20286/tiny.jpg?1434293999",
"small": "https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999",
"medium": "https://media.kitsu.io/manga/poster_images/20286/medium.jpg?1434293999",
"large": "https://media.kitsu.io/manga/poster_images/20286/large.jpg?1434293999",
"original": "https://media.kitsu.io/manga/poster_images/20286/original.jpg?1434293999"
},
"coverImage": {
"small": "https://media.kitsu.io/manga/cover_images/20286/small.jpg?1430793688",
"large": "https://media.kitsu.io/manga/cover_images/20286/large.jpg?1430793688",
"original": "https://media.kitsu.io/manga/cover_images/20286/original.jpg?1430793688"
},
"subtype": "manga",
"chapterCount": null,
"volumeCount": 0,
"serialization": "Young King Ours",
"mangaType": "manga"
},
"relationships": {
"genres": {
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/genres",
"related": "https://kitsu.io/api/edge/manga/20286/genres"
},
"data": [{
"type": "genres",
"id": "3"
}, {
"type": "genres",
"id": "24"
}, {
"type": "genres",
"id": "16"
}, {
"type": "genres",
"id": "14"
}, {
"type": "genres",
"id": "18"
}]
},
"castings": {
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/castings",
"related": "https://kitsu.io/api/edge/manga/20286/castings"
}
},
"installments": {
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/installments",
"related": "https://kitsu.io/api/edge/manga/20286/installments"
}
},
"mappings": {
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/mappings",
"related": "https://kitsu.io/api/edge/manga/20286/mappings"
},
"data": [{
"type": "mappings",
"id": "48014"
}]
},
"reviews": {
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/reviews",
"related": "https://kitsu.io/api/edge/manga/20286/reviews"
}
},
"mediaRelationships": {
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/media-relationships",
"related": "https://kitsu.io/api/edge/manga/20286/media-relationships"
}
"views": [
{
"height": null,
"name": "tiny",
"url": "https://media.kitsu.io/manga/poster_images/20286/tiny.jpg?1434293999",
"width": null
},
{
"height": null,
"name": "small",
"url": "https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999",
"width": null
},
{
"height": null,
"name": "medium",
"url": "https://media.kitsu.io/manga/poster_images/20286/medium.jpg?1434293999",
"width": null
},
{
"height": null,
"name": "large",
"url": "https://media.kitsu.io/manga/poster_images/20286/large.jpg?1434293999",
"width": null
}
]
},
"categories": {
"nodes": [
{
"title": {
"en": "Comedy"
}
}
}],
"included": [{
"id": "3",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/3"
},
"attributes": {
"name": "Comedy",
"slug": "comedy",
"description": null
}
}, {
"id": "24",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/24"
},
"attributes": {
"name": "School",
"slug": "school",
"description": null
}
}, {
"id": "16",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/16"
},
"attributes": {
"name": "Slice of Life",
"slug": "slice-of-life",
"description": ""
}
}, {
"id": "14",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/14"
},
"attributes": {
"name": "Romance",
"slug": "romance",
"description": ""
}
}, {
"id": "18",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/18"
},
"attributes": {
"name": "Thriller",
"slug": "thriller",
"description": null
}
}, {
"id": "48014",
"type": "mappings",
"links": {
"self": "https://kitsu.io/api/edge/mappings/48014"
},
"attributes": {
"externalSite": "myanimelist/manga",
"externalId": "26769"
},
"relationships": {
"media": {
"links": {
"self": "https://kitsu.io/api/edge/mappings/48014/relationships/media",
"related": "https://kitsu.io/api/edge/mappings/48014/media"
}
},
{
"title": {
"en": "School Life"
}
},
{
"title": {
"en": "Slice of Life"
}
},
{
"title": {
"en": "Romance"
}
}
]
},
"chapterCount": 90,
"volumeCount": 10,
"characters": {
"nodes": [
{
"character": {
"id": "83463",
"names": {
"canonical": "Yoko Mabuchi",
"alternatives": [
"Yoko-chan"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "/images/original/missing.png",
"width": null
}
},
"slug": "yoko-mabuchi"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "40540",
"names": {
"canonical": "Ritsu Kawai",
"alternatives": [
"Ricchan"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/40540/original.jpg?1483096805",
"width": null
}
},
"slug": "ritsu-kawai"
},
"role": "MAIN"
},
{
"character": {
"id": "40541",
"names": {
"canonical": "Kazunari Usa",
"alternatives": [
"Oddball handler"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/40541/original.jpg?1483096805",
"width": null
}
},
"slug": "kazunari-usa"
},
"role": "MAIN"
},
{
"character": {
"id": "62591",
"names": {
"canonical": "Chinatsu",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/62591/original.jpg?1485073100",
"width": null
}
},
"slug": "chinatsu"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "72839",
"names": {
"canonical": "Hayashi",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/72839/original.jpg?1485079724",
"width": null
}
},
"slug": "hayashi-ec3a2705-5d5c-493c-b172-bbee2d04b5b9"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "78362",
"names": {
"canonical": "Houjou",
"alternatives": [
"Yamamoto"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/78362/original.jpg?1485081676",
"width": null
}
},
"slug": "houjou"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "55131",
"names": {
"canonical": "Sumiko Kawai",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/55131/original.jpg?1483096805",
"width": null
}
},
"slug": "sumiko-kawai"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "90353",
"names": {
"canonical": "Kurokawa",
"alternatives": [
"Saionji"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/90353/original.jpg?1485086356",
"width": null
}
},
"slug": "kurokawa-a493ddf6-0f02-4abf-8b18-ab6ae2198b6e"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "77996",
"names": {
"canonical": "Maemura",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/77996/original.jpg?1485081552",
"width": null
}
},
"slug": "maemura"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "55132",
"names": {
"canonical": "Mayumi Nishikino",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/55132/original.jpg?1483096805",
"width": null
}
},
"slug": "mayumi-nishikino"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "74335",
"names": {
"canonical": "Tae Shinohara",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/74335/original.jpg?1485080245",
"width": null
}
},
"slug": "tae-shinohara"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "95032",
"names": {
"canonical": "Shirosaki",
"alternatives": [
"Shiro"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/95032/original.jpg?1485088329",
"width": null
}
},
"slug": "shirosaki-2ed2e15c-9cee-4756-92f1-027c4820e224"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "55133",
"names": {
"canonical": "Tagami",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/55133/original.jpg?1483096805",
"width": null
}
},
"slug": "tagami"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "71479",
"names": {
"canonical": "Miharu Tsuneda",
"alternatives": [
"Tsuneko"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/71479/original.jpg?1485079211",
"width": null
}
},
"slug": "miharu-tsuneda"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "55134",
"names": {
"canonical": "Mother Usa",
"alternatives": []
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "/images/original/missing.png?1483096805",
"width": null
}
},
"slug": "mother-usa"
},
"role": "BACKGROUND"
},
{
"character": {
"id": "55135",
"names": {
"canonical": "Sayaka Watanabe",
"alternatives": [
"Nabe"
]
},
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/characters/images/55135/original.jpg?1483096805",
"width": null
}
},
"slug": "sayaka-watanabe"
},
"role": "BACKGROUND"
}
],
"pageInfo": {
"endCursor": "MTY",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "MQ"
}
}],
"meta": {
"count": 1
},
"links": {
"first": "https://kitsu.io/api/edge/manga?filter%5Bslug%5D=bokura-wa-minna-kawaisou&include=genres%2Cmappings&page%5Blimit%5D=10&page%5Boffset%5D=0",
"last": "https://kitsu.io/api/edge/manga?filter%5Bslug%5D=bokura-wa-minna-kawaisou&include=genres%2Cmappings&page%5Blimit%5D=10&page%5Boffset%5D=0"
},
"description": {
"en": "Usa, a high-school student aspiring to begin a bachelor lifestyle, moves into a new apartment only to discover that he not only shares a room with a perverted roommate that has an obsession for underaged girls, but also that another girl, Ritsu, a love-at-first-sight, is living in the same building as well!\r\n(Source: Kirei Cake)"
},
"startDate": "2010-04-30",
"endDate": "2017-12-28",
"mappings": {
"nodes": [
{
"externalId": "56769",
"externalSite": "ANILIST_MANGA"
},
{
"externalId": "26769",
"externalSite": "MYANIMELIST_MANGA"
}
]
},
"sfw": true,
"slug": "bokura-wa-minna-kawaisou",
"staff": {
"nodes": [
{
"person": {
"id": "8712",
"birthday": null,
"image": {
"original": {
"height": null,
"name": "original",
"url": "https://media.kitsu.io/people/images/8712/original.jpg?1533271952",
"width": null
},
"views": []
},
"names": {
"alternatives": [],
"canonical": "en",
"localized": {
"en": "Ruri Miyahara",
"ja_jp": "宮原 るり"
}
},
"slug": "ruri-miyahara"
},
"role": "Story \u0026 Art"
}
],
"pageInfo": {
"endCursor": "MQ",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "MQ"
}
},
"status": "FINISHED",
"subtype": "MANGA",
"titles": {
"canonical": "Bokura wa Minna Kawai-sou",
"canonicalLocale": "en_jp",
"localized": {
"en": "The Kawai Complex Guide to Manors and Hostel",
"en_jp": "Bokura wa Minna Kawai-sou",
"en_us": "The Kawai Complex Guide to Manors and Hostel",
"ja_jp": "僕らはみんな河合荘"
}
}
}
}
}

View File

@ -1,126 +0,0 @@
[{
"id": "15084773",
"mal_id": "26769",
"chapters": {
"read": 67,
"total": "-"
},
"volumes": {
"read": "-",
"total": "-"
},
"manga": {
"titles": ["Bokura wa Minna Kawaisou"],
"alternate_title": null,
"slug": "bokura-wa-minna-kawaisou",
"url": "https:\/\/kitsu.io\/manga\/bokura-wa-minna-kawaisou",
"type": "manga",
"image": "https:\/\/media.kitsu.io\/manga\/poster_images\/20286\/small.jpg?1434293999",
"genres": ["Comedy", "Romance", "School", "Slice of Life", "Thriller"]
},
"reading_status": "current",
"notes": "",
"rereading": false,
"reread": 0,
"user_rating": 9
}, {
"id": "15085607",
"mal_id": "16",
"chapters": {
"read": 17,
"total": 120
},
"volumes": {
"read": "-",
"total": 14
},
"manga": {
"titles": ["Love Hina"],
"alternate_title": null,
"slug": "love-hina",
"url": "https:\/\/kitsu.io\/manga\/love-hina",
"type": "manga",
"image": "https:\/\/media.kitsu.io\/manga\/poster_images\/47\/small.jpg?1434249493",
"genres": ["Comedy", "Ecchi", "Harem", "Romance", "Sports"]
},
"reading_status": "current",
"notes": "",
"rereading": false,
"reread": 0,
"user_rating": 7
}, {
"id": "15084529",
"mal_id": "35003",
"chapters": {
"read": 16,
"total": "-"
},
"volumes": {
"read": "-",
"total": "-"
},
"manga": {
"titles": ["Yamada-kun to 7-nin no Majo", "Yamada-kun and the Seven Witches"],
"alternate_title": null,
"slug": "yamada-kun-to-7-nin-no-majo",
"url": "https:\/\/kitsu.io\/manga\/yamada-kun-to-7-nin-no-majo",
"type": "manga",
"image": "https:\/\/media.kitsu.io\/manga\/poster_images\/11777\/small.jpg?1438784325",
"genres": ["Comedy", "Ecchi", "Gender Bender", "Romance", "School", "Sports", "Supernatural"]
},
"reading_status": "current",
"notes": "",
"rereading": false,
"reread": 0,
"user_rating": 9
}, {
"id": "15312827",
"mal_id": "78523",
"chapters": {
"read": 68,
"total": "-"
},
"volumes": {
"read": "-",
"total": "-"
},
"manga": {
"titles": ["ReLIFE"],
"alternate_title": null,
"slug": "relife",
"url": "https:\/\/kitsu.io\/manga\/relife",
"type": "manga",
"image": "https:\/\/media.kitsu.io\/manga\/poster_images\/27175\/small.jpg?1464379411",
"genres": ["Romance", "School", "Slice of Life"]
},
"reading_status": "current",
"notes": "",
"rereading": false,
"reread": 0,
"user_rating": "-"
}, {
"id": "15084769",
"mal_id": "60815",
"chapters": {
"read": 43,
"total": "-"
},
"volumes": {
"read": "-",
"total": "-"
},
"manga": {
"titles": ["Joshikausei"],
"alternate_title": null,
"slug": "joshikausei",
"url": "https:\/\/kitsu.io\/manga\/joshikausei",
"type": "manga",
"image": "https:\/\/media.kitsu.io\/manga\/poster_images\/25491\/small.jpg?1434305043",
"genres": ["Comedy", "School", "Slice of Life"]
},
"reading_status": "current",
"notes": "",
"rereading": false,
"reread": 0,
"user_rating": 8
}]

File diff suppressed because it is too large Load Diff