More GraphQL conversion, test updates, see #33
Some checks failed
timw4mail/HummingBirdAnimeClient/pipeline/pr-master There was a failure building this commit

This commit is contained in:
Timothy Warren 2020-10-21 14:51:17 -04:00
parent 1e3bfa7a0a
commit 5340c39466
26 changed files with 4763 additions and 3751 deletions

View File

@ -222,40 +222,6 @@ trait AnimeTrait {
return $output; 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 * 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]); 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 public function getKitsuIdFromMALId(string $malId, string $type='anime'): ?string
{ {
$options = [ $raw = $this->requestBuilder->runQuery('GetIdByMapping', [
'query' => [ 'id' => $malId,
'filter' => [ 'site' => strtoupper("MYANIMELIST_{$type}"),
'external_site' => "myanimelist/{$type}", ]);
'external_id' => $malId
],
'fields' => [
'media' => 'id,slug'
],
'include' => 'item'
]
];
$raw = $this->requestBuilder->getRequest('mappings', $options); return $raw['data']['lookupMapping']['id'] ?? NULL;
if ( ! array_key_exists('included', $raw))
{
return NULL;
}
return $raw['included'][0]['id'];
} }
/** /**

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; 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\AnimeClient\Tests\AnimeClientTestCase;
use Aviat\Ion\Friend;
use Aviat\Ion\Json; use Aviat\Ion\Json;
class AnimeListTransformerTest extends AnimeClientTestCase { class AnimeListTransformerTest extends AnimeClientTestCase {
@ -31,9 +30,10 @@ class AnimeListTransformerTest extends AnimeClientTestCase {
parent::setUp(); parent::setUp();
$this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu'; $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() public function testTransform()

View File

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

View File

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

View File

@ -16,7 +16,6 @@
namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer; namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer;
use Aviat\AnimeClient\API\JsonAPI;
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaTransformer; use Aviat\AnimeClient\API\Kitsu\Transformer\MangaTransformer;
use Aviat\AnimeClient\Tests\AnimeClientTestCase; use Aviat\AnimeClient\Tests\AnimeClientTestCase;
use Aviat\Ion\Json; use Aviat\Ion\Json;
@ -25,26 +24,19 @@ class MangaTransformerTest extends AnimeClientTestCase {
protected $dir; protected $dir;
protected $beforeTransform; protected $beforeTransform;
protected $afterTransform;
protected $transformer; protected $transformer;
public function setUp(): void { public function setUp(): void {
parent::setUp(); parent::setUp();
$this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu'; $this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu';
$data = Json::decodeFile("{$this->dir}/mangaBeforeTransform.json"); $this->beforeTransform = 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->transformer = new MangaTransformer(); $this->transformer = new MangaTransformer();
} }
public function testTransform() public function testTransform()
{ {
$this->markTestSkipped('Skip until fixed with GraphQL snapshot');
$actual = $this->transformer->transform($this->beforeTransform); $actual = $this->transformer->transform($this->beforeTransform);
$this->assertMatchesSnapshot($actual); $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 empty: false
id: '15839442' id: '435513'
mal_id: '33206' mal_id: '209'
episodes: episodes:
watched: '-' watched: 7
total: '-' total: 26
length: null length: 1500
airing: airing:
status: 'Currently Airing' status: 'Finished Airing'
started: '2017-01-12' started: '2003-09-01'
ended: null ended: '2004-03-16'
anime: anime:
empty: false empty: false
age_rating: null age_rating: PG
cover_image: 'https://media.kitsu.io/anime/poster_images/12243/small.jpg?1481144116' cover_image: 'https://media.kitsu.io/anime/poster_images/185/small.jpg?1597697520'
genres: [Comedy, Fantasy, 'Slice of Life'] genres: { }
id: '12243' id: '185'
show_type: TV show_type: TV
slug: kobayashi-san-chi-no-maid-dragon slug: r-o-d
streaming_links: { } 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: 'Kobayashi-san Chi no Maid Dragon' title: 'R.O.D the TV'
titles: ['Miss Kobayashi''s Dragon Maid', 小林さんちのメイドラゴン] titles: ['アール・オー・ディー ザ・ティーヴィー']
notes: null notes: ''
private: false private: false
rewatching: false rewatching: false
rewatched: 0 rewatched: 0
user_rating: '-' 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 empty: false
id: '15084773' id: '15288185'
mal_id: '26769' mal_id: '28091'
chapters: { read: 67, total: '-' } chapters: { read: 94, total: '-' }
volumes: { read: '-', 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' } 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: 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' }
reading_status: current reading_status: current
notes: '' notes: ''
rereading: false rereading: false
reread: 0 reread: 0
user_rating: 8 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 empty: false
characters: { } age_rating: PG
chapter_count: '-' 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' 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' id: '20286'
included: manga_type: MANGA
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 } } } status: Completed
mappings: { 48014: { attributes: { externalSite: myanimelist/manga, externalId: '26769' } } } staff:
manga_type: manga 'Story & Art': [{ id: '8712', slug: ruri-miyahara, name: 'Ruri Miyahara', image: { original: 'https://media.kitsu.io/people/images/8712/original.jpg?1533271952' } }]
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!\r\n(Source: Kirei Cake)"
synopsis: | title: 'Bokura wa Minna Kawai-sou'
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: 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' 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": [{ "data": {
"findMangaBySlug": {
"id": "20286", "id": "20286",
"type": "manga",
"links": {
"self": "https://kitsu.io/api/edge/manga/20286"
},
"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", "ageRating": "PG",
"ageRatingGuide": null, "ageRatingGuide": "",
"posterImage": { "posterImage": {
"tiny": "https://media.kitsu.io/manga/poster_images/20286/tiny.jpg?1434293999", "original": {
"small": "https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999", "height": null,
"medium": "https://media.kitsu.io/manga/poster_images/20286/medium.jpg?1434293999", "name": "original",
"large": "https://media.kitsu.io/manga/poster_images/20286/large.jpg?1434293999", "url": "https://media.kitsu.io/manga/poster_images/20286/original.jpg?1434293999",
"original": "https://media.kitsu.io/manga/poster_images/20286/original.jpg?1434293999" "width": null
}, },
"coverImage": { "views": [
"small": "https://media.kitsu.io/manga/cover_images/20286/small.jpg?1430793688", {
"large": "https://media.kitsu.io/manga/cover_images/20286/large.jpg?1430793688", "height": null,
"original": "https://media.kitsu.io/manga/cover_images/20286/original.jpg?1430793688" "name": "tiny",
"url": "https://media.kitsu.io/manga/poster_images/20286/tiny.jpg?1434293999",
"width": null
}, },
"subtype": "manga", {
"chapterCount": null, "height": null,
"volumeCount": 0, "name": "small",
"serialization": "Young King Ours", "url": "https://media.kitsu.io/manga/poster_images/20286/small.jpg?1434293999",
"mangaType": "manga" "width": null
}, },
"relationships": { {
"genres": { "height": null,
"links": { "name": "medium",
"self": "https://kitsu.io/api/edge/manga/20286/relationships/genres", "url": "https://media.kitsu.io/manga/poster_images/20286/medium.jpg?1434293999",
"related": "https://kitsu.io/api/edge/manga/20286/genres" "width": null
}, },
"data": [{ {
"type": "genres", "height": null,
"id": "3" "name": "large",
}, { "url": "https://media.kitsu.io/manga/poster_images/20286/large.jpg?1434293999",
"type": "genres", "width": null
"id": "24" }
}, { ]
"type": "genres",
"id": "16"
}, {
"type": "genres",
"id": "14"
}, {
"type": "genres",
"id": "18"
}]
}, },
"castings": { "categories": {
"links": { "nodes": [
"self": "https://kitsu.io/api/edge/manga/20286/relationships/castings", {
"related": "https://kitsu.io/api/edge/manga/20286/castings" "title": {
"en": "Comedy"
} }
}, },
"installments": { {
"links": { "title": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/installments", "en": "School Life"
"related": "https://kitsu.io/api/edge/manga/20286/installments"
} }
}, },
{
"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"
}
},
"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": { "mappings": {
"links": { "nodes": [
"self": "https://kitsu.io/api/edge/manga/20286/relationships/mappings", {
"related": "https://kitsu.io/api/edge/manga/20286/mappings" "externalId": "56769",
"externalSite": "ANILIST_MANGA"
}, },
"data": [{ {
"type": "mappings", "externalId": "26769",
"id": "48014" "externalSite": "MYANIMELIST_MANGA"
}] }
]
}, },
"reviews": { "sfw": true,
"links": { "slug": "bokura-wa-minna-kawaisou",
"self": "https://kitsu.io/api/edge/manga/20286/relationships/reviews", "staff": {
"related": "https://kitsu.io/api/edge/manga/20286/reviews" "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": "宮原 るり"
} }
}, },
"mediaRelationships": { "slug": "ruri-miyahara"
"links": {
"self": "https://kitsu.io/api/edge/manga/20286/relationships/media-relationships",
"related": "https://kitsu.io/api/edge/manga/20286/media-relationships"
}
}
}
}],
"included": [{
"id": "3",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/3"
}, },
"attributes": { "role": "Story \u0026 Art"
"name": "Comedy", }
"slug": "comedy", ],
"description": null "pageInfo": {
"endCursor": "MQ",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "MQ"
} }
}, {
"id": "24",
"type": "genres",
"links": {
"self": "https://kitsu.io/api/edge/genres/24"
}, },
"attributes": { "status": "FINISHED",
"name": "School", "subtype": "MANGA",
"slug": "school", "titles": {
"description": null "canonical": "Bokura wa Minna Kawai-sou",
} "canonicalLocale": "en_jp",
}, { "localized": {
"id": "16", "en": "The Kawai Complex Guide to Manors and Hostel",
"type": "genres", "en_jp": "Bokura wa Minna Kawai-sou",
"links": { "en_us": "The Kawai Complex Guide to Manors and Hostel",
"self": "https://kitsu.io/api/edge/genres/16" "ja_jp": "僕らはみんな河合荘"
},
"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"
} }
} }
} }
}],
"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"
} }
} }

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