From c43f25244e2206fe5c2905cedc712d5993c12519 Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 19:49:12 +0800 Subject: [PATCH 1/8] dev(narugo1992): add aggregate search and show commands --- animedex/agg/__init__.py | 22 + animedex/agg/_fanout.py | 137 + animedex/agg/_prefix_id.py | 149 + animedex/agg/_type_routes.py | 274 + animedex/agg/search.py | 92 + animedex/agg/show.py | 44 + animedex/backends/anilist/__init__.py | 20 +- animedex/backends/anilist/_queries.py | 4 +- animedex/backends/kitsu/models.py | 35 + animedex/backends/shikimori/__init__.py | 45 +- animedex/diag/selftest.py | 10 + animedex/entry/anilist.py | 1 + animedex/entry/cli.py | 6 +- animedex/entry/search.py | 66 + animedex/entry/shikimori.py | 4 + animedex/entry/show.py | 52 + animedex/models/__init__.py | 3 + animedex/models/aggregate.py | 104 + animedex/render/json_renderer.py | 5 + animedex/render/tty.py | 61 + docs/source/_static/gifs/README.md | 4 +- docs/source/_static/gifs/aggregate.gif | Bin 0 -> 249200 bytes docs/source/_static/gifs/aggregate.tape | 42 + docs/source/api_doc/agg/_fanout.rst | 30 + docs/source/api_doc/agg/_prefix_id.rst | 43 + docs/source/api_doc/agg/_type_routes.rst | 74 + docs/source/api_doc/agg/index.rst | 27 + docs/source/api_doc/agg/search.rst | 18 + docs/source/api_doc/agg/show.rst | 18 + .../source/api_doc/backends/anilist/index.rst | 6 + docs/source/api_doc/backends/kitsu/models.rst | 6 +- .../api_doc/backends/shikimori/index.rst | 24 + docs/source/api_doc/entry/index.rst | 2 + docs/source/api_doc/entry/search.rst | 18 + docs/source/api_doc/entry/show.rst | 18 + docs/source/api_doc/index.rst | 2 +- docs/source/api_doc/models/aggregate.rst | 26 + docs/source/api_doc/models/index.rst | 1 + docs/source/tutorials/aggregate.rst | 138 + docs/source/tutorials/index.rst | 1 + test/agg/__init__.py | 1 + test/agg/test_fanout.py | 60 + test/agg/test_prefix_id.py | 52 + test/agg/test_search_show.py | 98 + test/agg/test_type_routes.py | 49 + test/entry/test_search.py | 221 + test/entry/test_show.py | 146 + .../graphql/23-search-frieren-type-anime.yaml | 57 + .../graphql/24-search-berserk-type-manga.yaml | 57 + .../graphql/25-character-search-frieren.yaml | 50 + .../graphql/26-staff-search-yamada.yaml | 50 + .../graphql/27-studio-search-madhouse.yaml | 50 + .../graphql/28-manga-search-berserk.yaml | 57 + .../anilist/search/01-search-frieren.yaml | 15 +- .../substring_search/17-synthetic-503.yaml | 21 + .../anime_full_errors/01-upstream-error.yaml | 36 + .../anime_search/17-frieren-tv-limit2.yaml | 229 + .../characters_search/02-frieren-limit2.yaml | 81 + .../people_search/02-miyazaki-limit2.yaml | 75 + .../producers_search/02-aniplex-limit2.yaml | 76 + .../kitsu/anime_search/17-frieren-limit2.yaml | 384 + .../kitsu/characters/02-frieren-limit2.yaml | 158 + .../kitsu/manga_search/02-berserk-limit2.yaml | 366 + .../kitsu/people/02-miyazaki-limit2.yaml | 45 + .../kitsu/producers/02-ghibli-limit2.yaml | 66 + .../animes_search/17-frieren-limit2.yaml | 70 + .../characters_by_id/01-frieren-184947.yaml | 277 + .../characters_search/01-frieren.yaml | 47 + .../characters_search/02-frieren-limit2.yaml | 47 + .../mangas_search/02-berserk-limit2.yaml | 70 + .../people_search/02-miyazaki-limit2.yaml | 182 + .../publishers/02-all-limit-1000.yaml | 3104 ++++++ .../publishers/03-kodansha-limit1000.yaml | 3104 ++++++ .../shikimori/studios/02-all-limit-1000.yaml | 9463 +++++++++++++++++ .../studios/03-ghibli-limit1000.yaml | 9463 +++++++++++++++++ test/models/test_aggregate.py | 49 + test/render/test_json_renderer.py | 18 + test/render/test_tty_phase2.py | 28 + tools/fixtures/prewarm_aggregate_cache.py | 93 + 79 files changed, 30124 insertions(+), 23 deletions(-) create mode 100644 animedex/agg/__init__.py create mode 100644 animedex/agg/_fanout.py create mode 100644 animedex/agg/_prefix_id.py create mode 100644 animedex/agg/_type_routes.py create mode 100644 animedex/agg/search.py create mode 100644 animedex/agg/show.py create mode 100644 animedex/entry/search.py create mode 100644 animedex/entry/show.py create mode 100644 animedex/models/aggregate.py create mode 100644 docs/source/_static/gifs/aggregate.gif create mode 100644 docs/source/_static/gifs/aggregate.tape create mode 100644 docs/source/api_doc/agg/_fanout.rst create mode 100644 docs/source/api_doc/agg/_prefix_id.rst create mode 100644 docs/source/api_doc/agg/_type_routes.rst create mode 100644 docs/source/api_doc/agg/index.rst create mode 100644 docs/source/api_doc/agg/search.rst create mode 100644 docs/source/api_doc/agg/show.rst create mode 100644 docs/source/api_doc/entry/search.rst create mode 100644 docs/source/api_doc/entry/show.rst create mode 100644 docs/source/api_doc/models/aggregate.rst create mode 100644 docs/source/tutorials/aggregate.rst create mode 100644 test/agg/__init__.py create mode 100644 test/agg/test_fanout.py create mode 100644 test/agg/test_prefix_id.py create mode 100644 test/agg/test_search_show.py create mode 100644 test/agg/test_type_routes.py create mode 100644 test/entry/test_search.py create mode 100644 test/entry/test_show.py create mode 100644 test/fixtures/anilist/graphql/23-search-frieren-type-anime.yaml create mode 100644 test/fixtures/anilist/graphql/24-search-berserk-type-manga.yaml create mode 100644 test/fixtures/anilist/graphql/25-character-search-frieren.yaml create mode 100644 test/fixtures/anilist/graphql/26-staff-search-yamada.yaml create mode 100644 test/fixtures/anilist/graphql/27-studio-search-madhouse.yaml create mode 100644 test/fixtures/anilist/graphql/28-manga-search-berserk.yaml create mode 100644 test/fixtures/ann/substring_search/17-synthetic-503.yaml create mode 100644 test/fixtures/jikan/anime_full_errors/01-upstream-error.yaml create mode 100644 test/fixtures/jikan/anime_search/17-frieren-tv-limit2.yaml create mode 100644 test/fixtures/jikan/characters_search/02-frieren-limit2.yaml create mode 100644 test/fixtures/jikan/people_search/02-miyazaki-limit2.yaml create mode 100644 test/fixtures/jikan/producers_search/02-aniplex-limit2.yaml create mode 100644 test/fixtures/kitsu/anime_search/17-frieren-limit2.yaml create mode 100644 test/fixtures/kitsu/characters/02-frieren-limit2.yaml create mode 100644 test/fixtures/kitsu/manga_search/02-berserk-limit2.yaml create mode 100644 test/fixtures/kitsu/people/02-miyazaki-limit2.yaml create mode 100644 test/fixtures/kitsu/producers/02-ghibli-limit2.yaml create mode 100644 test/fixtures/shikimori/animes_search/17-frieren-limit2.yaml create mode 100644 test/fixtures/shikimori/characters_by_id/01-frieren-184947.yaml create mode 100644 test/fixtures/shikimori/characters_search/01-frieren.yaml create mode 100644 test/fixtures/shikimori/characters_search/02-frieren-limit2.yaml create mode 100644 test/fixtures/shikimori/mangas_search/02-berserk-limit2.yaml create mode 100644 test/fixtures/shikimori/people_search/02-miyazaki-limit2.yaml create mode 100644 test/fixtures/shikimori/publishers/02-all-limit-1000.yaml create mode 100644 test/fixtures/shikimori/publishers/03-kodansha-limit1000.yaml create mode 100644 test/fixtures/shikimori/studios/02-all-limit-1000.yaml create mode 100644 test/fixtures/shikimori/studios/03-ghibli-limit1000.yaml create mode 100644 test/models/test_aggregate.py create mode 100644 tools/fixtures/prewarm_aggregate_cache.py diff --git a/animedex/agg/__init__.py b/animedex/agg/__init__.py new file mode 100644 index 0000000..8e6392a --- /dev/null +++ b/animedex/agg/__init__.py @@ -0,0 +1,22 @@ +"""Cross-source aggregate commands. + +The aggregate package composes existing high-level backend helpers. +It owns prefix-encoded entity references, type-to-backend routing, +and generic fan-out handling for partial source failures. +""" + +from animedex.agg.search import search +from animedex.agg.show import show + +__all__ = ["search", "show"] + + +def selftest() -> bool: + """Smoke-test the aggregate package exports. + + :return: ``True`` on success. + :rtype: bool + """ + assert callable(search) + assert callable(show) + return True diff --git a/animedex/agg/_fanout.py b/animedex/agg/_fanout.py new file mode 100644 index 0000000..ea550a7 --- /dev/null +++ b/animedex/agg/_fanout.py @@ -0,0 +1,137 @@ +"""Shared concurrent fan-out helper for aggregate commands.""" + +from __future__ import annotations + +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import Any, Callable, Dict, Iterable, List, Tuple + +from animedex.models.aggregate import AggregateResult, AggregateSourceStatus +from animedex.models.common import ApiError + + +SourceCallable = Callable[[], List[Any]] + + +def _http_status_from_message(message: str) -> int | None: + """Best-effort status extraction from backend ``ApiError`` text.""" + for token in message.replace("(", " ").replace(")", " ").split(): + if token.isdigit() and len(token) == 3: + value = int(token) + if 100 <= value <= 599: + return value + return None + + +def fanout(sources: Dict[str, SourceCallable], *, concurrent: bool = True) -> AggregateResult: + """Run source callables and collect successes plus failures. + + :param sources: Source name to zero-argument callable returning + JSON-ready row dicts. + :type sources: dict[str, Callable[[], list[dict]]] + :param concurrent: Whether to run sources in parallel. + :type concurrent: bool + :return: Aggregate result envelope. + :rtype: AggregateResult + """ + if not sources: + return AggregateResult(items=[], sources={}) + if not concurrent or len(sources) == 1: + pairs = [_run_one(name, fn) for name, fn in sources.items()] + else: + pairs = [] + with ThreadPoolExecutor(max_workers=len(sources)) as executor: + future_map = {executor.submit(_run_one, name, fn): name for name, fn in sources.items()} + for future in as_completed(future_map): + pairs.append(future.result()) + items: List[dict] = [] + statuses: Dict[str, AggregateSourceStatus] = {} + for name, rows, status in sorted(pairs, key=lambda item: list(sources).index(item[0])): + items.extend(rows) + statuses[name] = status + return AggregateResult(items=items, sources=statuses) + + +def _run_one(name: str, fn: SourceCallable) -> Tuple[str, List[Any], AggregateSourceStatus]: + start = time.perf_counter() + try: + rows = list(fn()) + except ApiError as exc: + duration_ms = int((time.perf_counter() - start) * 1000) + message = str(exc) + return ( + name, + [], + AggregateSourceStatus( + status="failed", + items=0, + reason=exc.reason or "upstream-error", + message=message, + http_status=_http_status_from_message(message), + duration_ms=duration_ms, + ), + ) + except Exception as exc: + duration_ms = int((time.perf_counter() - start) * 1000) + return ( + name, + [], + AggregateSourceStatus( + status="failed", + items=0, + reason="upstream-error", + message=f"{type(exc).__name__}: {exc}", + duration_ms=duration_ms, + ), + ) + duration_ms = int((time.perf_counter() - start) * 1000) + return ( + name, + rows, + AggregateSourceStatus(status="ok", items=len(rows), duration_ms=duration_ms), + ) + + +def select_sources(available: Iterable[str], requested: str | None) -> List[str]: + """Resolve a comma-separated source allowlist. + + :param available: Allowed source names. + :type available: iterable[str] + :param requested: Comma-separated source list or ``None``. + :type requested: str or None + :return: Selected sources in available-source order. + :rtype: list[str] + :raises ApiError: When an unknown source is requested. + """ + available_list = list(available) + if requested is None or not requested.strip(): + return available_list + wanted = [part.strip() for part in requested.split(",") if part.strip()] + unknown = [name for name in wanted if name not in available_list] + if unknown: + raise ApiError( + f"unknown source(s): {', '.join(unknown)}; supported sources: {', '.join(available_list)}", + backend="aggregate", + reason="bad-args", + ) + return [name for name in available_list if name in wanted] + + +def selftest() -> bool: + """Smoke-test success, failure, and source selection paths. + + :return: ``True`` on success. + :rtype: bool + """ + result = fanout( + { + "a": lambda: [{"_source": "a"}], + "b": lambda: (_ for _ in ()).throw(ApiError("boom", backend="b", reason="upstream-error")), + }, + concurrent=False, + ) + assert len(result.items) == 1 + assert result.sources["a"].status == "ok" + assert result.sources["b"].status == "failed" + assert select_sources(["a", "b"], "b") == ["b"] + return True diff --git a/animedex/agg/_prefix_id.py b/animedex/agg/_prefix_id.py new file mode 100644 index 0000000..fa1f729 --- /dev/null +++ b/animedex/agg/_prefix_id.py @@ -0,0 +1,149 @@ +"""Prefix-encoded entity references for aggregate commands.""" + +from __future__ import annotations + +import re +from dataclasses import dataclass +from typing import Dict, Iterable, Optional, Set + +from animedex.models.common import ApiError + + +_PREFIX_TO_BACKEND: Dict[str, str] = { + "anilist": "anilist", + "mal": "jikan", + "myanimelist": "jikan", + "jikan": "jikan", + "kitsu": "kitsu", + "shikimori": "shikimori", + "mangadex": "mangadex", + "ann": "ann", + "animenewsnetwork": "ann", +} +_DEFERRED_PREFIXES: Set[str] = {"anidb"} +_NUMERIC_BACKENDS = {"anilist", "jikan", "kitsu", "shikimori", "ann"} +_UUID_RE = re.compile(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") + + +@dataclass(frozen=True) +class ParsedPrefixId: + """Parsed ``prefix:id`` reference. + + :ivar prefix: User-supplied prefix, normalised to lower-case. + :vartype prefix: str + :ivar backend: Backend module name selected by the prefix. + :vartype backend: str + :ivar id: Backend-native ID string. + :vartype id: str + """ + + prefix: str + backend: str + id: str + + +def known_prefixes() -> Iterable[str]: + """Return the supported non-deferred prefixes. + + :return: Prefix names sorted for display. + :rtype: iterable[str] + """ + return tuple(sorted(_PREFIX_TO_BACKEND)) + + +def parse(prefix_id: str) -> ParsedPrefixId: + """Parse and validate a ``prefix:id`` reference. + + :param prefix_id: Reference such as ``"anilist:154587"``. + :type prefix_id: str + :return: Parsed reference. + :rtype: ParsedPrefixId + :raises ApiError: When the prefix or ID format is invalid. + """ + if ":" not in prefix_id: + raise ApiError( + f"entity reference must be prefix:id, got {prefix_id!r}", + backend="aggregate", + reason="bad-args", + ) + prefix, raw_id = prefix_id.split(":", 1) + prefix = prefix.strip().lower() + raw_id = raw_id.strip() + if not prefix or not raw_id: + raise ApiError("entity reference must include both prefix and id", backend="aggregate", reason="bad-args") + if prefix in _DEFERRED_PREFIXES: + raise ApiError( + "anidb references are recognised but the AniDB high-level helpers are not shipped yet", + backend="anidb", + reason="auth-required", + ) + backend = _PREFIX_TO_BACKEND.get(prefix) + if backend is None: + expected = ", ".join(sorted([*_PREFIX_TO_BACKEND, *_DEFERRED_PREFIXES])) + raise ApiError( + f"unknown prefix {prefix!r}; expected one of: {expected}", backend="aggregate", reason="bad-args" + ) + validate_id(backend, raw_id) + return ParsedPrefixId(prefix=prefix, backend=backend, id=raw_id) + + +def validate_id(backend: str, raw_id: str) -> None: + """Validate backend-native ID format. + + :param backend: Backend module name. + :type backend: str + :param raw_id: Backend-native ID string. + :type raw_id: str + :raises ApiError: When ``raw_id`` is invalid for ``backend``. + """ + if backend in _NUMERIC_BACKENDS: + if not raw_id.isdigit(): + raise ApiError( + f"ID is not numeric for backend {backend!r}: {raw_id!r}", + backend=backend, + reason="bad-args", + ) + elif backend == "mangadex" and _UUID_RE.match(raw_id) is None: + raise ApiError( + f"ID is not a MangaDex UUID: {raw_id!r}", + backend="mangadex", + reason="bad-args", + ) + + +def prefix_for_backend(backend: str, native_id: object) -> Optional[str]: + """Compose the canonical prefix ID for a backend-native ID. + + :param backend: Backend name. + :type backend: str + :param native_id: Backend-native ID value. + :type native_id: object + :return: ``prefix:id`` or ``None`` when no public prefix exists. + :rtype: str or None + """ + if native_id is None: + return None + if backend == "jikan": + return f"mal:{native_id}" + if backend in {"anilist", "kitsu", "shikimori", "mangadex", "ann"}: + return f"{backend}:{native_id}" + return None + + +def selftest() -> bool: + """Smoke-test prefix parsing and validation. + + :return: ``True`` on success. + :rtype: bool + """ + assert parse("mal:52991").backend == "jikan" + assert parse("myanimelist:52991").backend == "jikan" + assert parse("mangadex:dc8bbc4c-eb7a-4d27-b96a-9aa8c8db4adb").backend == "mangadex" + assert prefix_for_backend("jikan", 52991) == "mal:52991" + try: + parse("anilist:abc") + except ApiError as exc: + assert exc.reason == "bad-args" + else: # pragma: no cover + raise AssertionError("invalid numeric id accepted") + return True diff --git a/animedex/agg/_type_routes.py b/animedex/agg/_type_routes.py new file mode 100644 index 0000000..20dcd68 --- /dev/null +++ b/animedex/agg/_type_routes.py @@ -0,0 +1,274 @@ +"""Entity type routing for aggregate search/show.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Callable, Dict, Iterable, Optional + +from animedex.config import Config +from animedex.models.common import ApiError + + +ENTITY_TYPES = ("anime", "manga", "character", "person", "studio", "publisher") + + +@dataclass(frozen=True) +class SearchRoute: + """One backend search route for an entity type.""" + + backend: str + function_name: str + query_arg: str = "q" + limit_arg: Optional[str] = None + all_items: bool = False + + +@dataclass(frozen=True) +class ShowRoute: + """One backend show route for an entity type.""" + + backend: str + function_name: str + id_arg: str + + +_SEARCH_ROUTES: Dict[str, tuple[SearchRoute, ...]] = { + "anime": ( + SearchRoute("anilist", "search", limit_arg="per_page"), + SearchRoute("ann", "search"), + SearchRoute("jikan", "search", limit_arg="limit"), + SearchRoute("kitsu", "search", limit_arg="limit"), + SearchRoute("shikimori", "search", limit_arg="limit"), + ), + "manga": ( + SearchRoute("anilist", "manga_search", limit_arg="per_page"), + SearchRoute("jikan", "manga_search", limit_arg="limit"), + SearchRoute("kitsu", "manga_search", limit_arg="limit"), + SearchRoute("mangadex", "search", query_arg="title", limit_arg="limit"), + SearchRoute("shikimori", "manga_search", limit_arg="limit"), + ), + "character": ( + SearchRoute("anilist", "character_search", limit_arg="per_page"), + SearchRoute("jikan", "character_search", limit_arg="limit"), + SearchRoute("kitsu", "character_search", limit_arg="limit"), + SearchRoute("shikimori", "character_search", limit_arg="limit"), + ), + "person": ( + SearchRoute("anilist", "staff_search", limit_arg="per_page"), + SearchRoute("jikan", "person_search", limit_arg="limit"), + SearchRoute("kitsu", "person_search", limit_arg="limit"), + SearchRoute("shikimori", "people_search", limit_arg="limit"), + ), + "studio": ( + SearchRoute("anilist", "studio_search", limit_arg="per_page"), + SearchRoute("jikan", "producer_search", limit_arg="limit"), + SearchRoute("kitsu", "producers", limit_arg="limit", all_items=True), + SearchRoute("shikimori", "studios", all_items=True), + ), + "publisher": (SearchRoute("shikimori", "publishers", all_items=True),), +} + + +_SHOW_ROUTES: Dict[str, Dict[str, ShowRoute]] = { + "anime": { + "anilist": ShowRoute("anilist", "show", "id"), + "ann": ShowRoute("ann", "show", "anime_id"), + "jikan": ShowRoute("jikan", "show", "mal_id"), + "kitsu": ShowRoute("kitsu", "show", "id"), + "shikimori": ShowRoute("shikimori", "show", "anime_id"), + }, + "manga": { + "anilist": ShowRoute("anilist", "show", "id"), + "jikan": ShowRoute("jikan", "manga_show", "mal_id"), + "kitsu": ShowRoute("kitsu", "manga_show", "id"), + "mangadex": ShowRoute("mangadex", "show", "id"), + "shikimori": ShowRoute("shikimori", "manga_show", "manga_id"), + }, + "character": { + "anilist": ShowRoute("anilist", "character", "id"), + "jikan": ShowRoute("jikan", "character_show", "mal_id"), + "kitsu": ShowRoute("kitsu", "character", "id"), + "shikimori": ShowRoute("shikimori", "character", "character_id"), + }, + "person": { + "anilist": ShowRoute("anilist", "staff", "id"), + "jikan": ShowRoute("jikan", "person_show", "mal_id"), + "kitsu": ShowRoute("kitsu", "person", "id"), + "shikimori": ShowRoute("shikimori", "person", "person_id"), + }, + "studio": { + "anilist": ShowRoute("anilist", "studio", "id"), + "jikan": ShowRoute("jikan", "producer_show", "mal_id"), + "kitsu": ShowRoute("kitsu", "producer", "id"), + "shikimori": ShowRoute("shikimori", "studio", "studio_id"), + }, + "publisher": {"shikimori": ShowRoute("shikimori", "publisher", "publisher_id")}, +} + + +def validate_entity_type(entity_type: str) -> str: + """Validate and normalise an entity type. + + :param entity_type: User-supplied entity type. + :type entity_type: str + :return: Normalised type. + :rtype: str + :raises ApiError: When the type is unknown. + """ + value = entity_type.lower() + if value not in ENTITY_TYPES: + raise ApiError( + f"unknown type {entity_type!r}; supported types: {', '.join(ENTITY_TYPES)}", + backend="aggregate", + reason="bad-args", + ) + return value + + +def search_routes_for(entity_type: str) -> tuple[SearchRoute, ...]: + """Return search routes for ``entity_type``. + + :param entity_type: Normalised entity type. + :type entity_type: str + :return: Search routes. + :rtype: tuple[SearchRoute, ...] + """ + return _SEARCH_ROUTES[validate_entity_type(entity_type)] + + +def show_route_for(entity_type: str, backend: str) -> ShowRoute: + """Return show route for an entity type/backend pair. + + :param entity_type: Entity type. + :type entity_type: str + :param backend: Backend name. + :type backend: str + :return: Show route. + :rtype: ShowRoute + :raises ApiError: When the pair is unsupported. + """ + entity_type = validate_entity_type(entity_type) + routes = _SHOW_ROUTES[entity_type] + route = routes.get(backend) + if route is None: + supported = ", ".join(sorted(routes)) or "none" + raise ApiError( + f"type {entity_type!r} is not supported by backend {backend!r}; supported backends: {supported}", + backend=backend, + reason="bad-args", + ) + return route + + +def backends_for_type(entity_type: str) -> Iterable[str]: + """Return default fan-out backends for ``entity_type``. + + :param entity_type: Entity type. + :type entity_type: str + :return: Backend names in fan-out order. + :rtype: iterable[str] + """ + return tuple(route.backend for route in search_routes_for(entity_type)) + + +def import_backend(backend: str): + """Import a backend module by short name. + + :param backend: Backend name. + :type backend: str + :return: Imported module. + :rtype: module + """ + import importlib + + return importlib.import_module(f"animedex.backends.{backend}") + + +def call_search_route(route: SearchRoute, query: str, limit: int, *, config: Optional[Config] = None, **kw): + """Call a search route. + + :param route: Search route. + :type route: SearchRoute + :param query: Search query. + :type query: str + :param limit: Per-source limit. + :type limit: int + :param config: Optional config. + :type config: Config or None + :return: Backend result list. + :rtype: list + """ + fn: Callable = getattr(import_backend(route.backend), route.function_name) + kwargs = dict(kw) + if route.all_items: + rows = fn(config=config, **kwargs) + else: + kwargs[route.query_arg] = query + if route.limit_arg: + kwargs[route.limit_arg] = limit + rows = fn(config=config, **kwargs) + if route.backend == "ann" and hasattr(rows, "anime"): + rows = rows.anime + rows = list(rows) + if route.all_items: + rows = _filter_rows(rows, query) + rows = rows[:limit] + return rows + + +def call_show_route(route: ShowRoute, raw_id: str, *, config: Optional[Config] = None, **kw): + """Call a show route. + + :param route: Show route. + :type route: ShowRoute + :param raw_id: Backend-native ID string. + :type raw_id: str + :param config: Optional config. + :type config: Config or None + :return: Backend result. + :rtype: object + """ + fn: Callable = getattr(import_backend(route.backend), route.function_name) + value = raw_id if route.backend == "mangadex" else int(raw_id) + return fn(config=config, **{route.id_arg: value}, **kw) + + +def _filter_rows(rows: list, query: str) -> list: + needle = query.casefold() + if not needle: + return rows + out = [] + for row in rows: + dumped = row.model_dump(mode="json", by_alias=True) if hasattr(row, "model_dump") else row + text = " ".join(str(value) for value in _walk_values(dumped)) + if needle in text.casefold(): + out.append(row) + return out + + +def _walk_values(obj): + if isinstance(obj, dict): + for value in obj.values(): + yield from _walk_values(value) + elif isinstance(obj, list): + for value in obj: + yield from _walk_values(value) + elif obj is not None: + yield obj + + +def selftest() -> bool: + """Smoke-test entity type routing. + + :return: ``True`` on success. + :rtype: bool + """ + assert "anilist" in set(backends_for_type("anime")) + assert show_route_for("anime", "jikan").function_name == "show" + try: + show_route_for("publisher", "anilist") + except ApiError as exc: + assert exc.reason == "bad-args" + else: # pragma: no cover + raise AssertionError("unsupported pair accepted") + return True diff --git a/animedex/agg/search.py b/animedex/agg/search.py new file mode 100644 index 0000000..60f2318 --- /dev/null +++ b/animedex/agg/search.py @@ -0,0 +1,92 @@ +"""Multi-source entity search.""" + +from __future__ import annotations + +from typing import Optional + +from animedex.agg._fanout import fanout, select_sources +from animedex.agg._prefix_id import prefix_for_backend +from animedex.agg._type_routes import call_search_route, search_routes_for, validate_entity_type +from animedex.config import Config +from animedex.models.aggregate import AggregateResult +from animedex.models.common import AnimedexModel, ApiError + + +def _native_id(row, backend: str): + data = row.model_dump(mode="json", by_alias=True) if hasattr(row, "model_dump") else row + if backend == "anilist": + return data.get("id") + if backend == "jikan": + return data.get("mal_id") + if backend in {"kitsu", "mangadex", "shikimori", "ann"}: + return data.get("id") + return data.get("id") + + +def _annotate_row(row, backend: str): + update = {"_source": backend} + prefix_id = prefix_for_backend(backend, _native_id(row, backend)) + if prefix_id is not None: + update["_prefix_id"] = prefix_id + if isinstance(row, AnimedexModel): + return row.model_copy(update=update) + data = dict(row) + data.update(update) + return data + + +def search( + type: str, + q: str, + *, + limit: int = 10, + source: Optional[str] = None, + config: Optional[Config] = None, + **kw, +) -> AggregateResult: + """Search an entity type across every supporting backend. + + :param type: Entity type: ``anime``, ``manga``, ``character``, + ``person``, ``studio``, or ``publisher``. + :type type: str + :param q: Search query, passed verbatim to each backend that + supports a search endpoint. + :type q: str + :param limit: Per-source row cap. + :type limit: int + :param source: Optional comma-separated source allowlist. + :type source: str or None + :param config: Optional config. + :type config: Config or None + :return: Aggregate result envelope. + :rtype: AggregateResult + :raises ApiError: When the type or source list is invalid. + """ + entity_type = validate_entity_type(type) + if limit < 1: + raise ApiError("limit must be >= 1", backend="aggregate", reason="bad-args") + routes = search_routes_for(entity_type) + selected = set(select_sources((route.backend for route in routes), source)) + selected_routes = [route for route in routes if route.backend in selected] + + def _make(route): + return lambda: [ + _annotate_row(row, route.backend) for row in call_search_route(route, q, limit, config=config, **kw) + ] + + return fanout({route.backend: _make(route) for route in selected_routes}) + + +def selftest() -> bool: + """Smoke-test search validation without network access. + + :return: ``True`` on success. + :rtype: bool + """ + try: + search("badtype", "x") + except ApiError as exc: + assert exc.reason == "bad-args" + else: # pragma: no cover + raise AssertionError("bad type accepted") + return True diff --git a/animedex/agg/show.py b/animedex/agg/show.py new file mode 100644 index 0000000..4108f19 --- /dev/null +++ b/animedex/agg/show.py @@ -0,0 +1,44 @@ +"""Single-source aggregate entity show.""" + +from __future__ import annotations + +from typing import Optional + +from animedex.agg._prefix_id import parse +from animedex.agg._type_routes import call_show_route, show_route_for, validate_entity_type +from animedex.config import Config +from animedex.models.common import ApiError + + +def show(type: str, prefix_id: str, *, config: Optional[Config] = None, **kw): + """Show one entity from the backend encoded by ``prefix_id``. + + :param type: Entity type. + :type type: str + :param prefix_id: Prefix-encoded backend ID. + :type prefix_id: str + :param config: Optional config. + :type config: Config or None + :return: Backend-rich result. + :rtype: object + :raises ApiError: When the prefix or type/backend pair is invalid. + """ + entity_type = validate_entity_type(type) + parsed = parse(prefix_id) + route = show_route_for(entity_type, parsed.backend) + return call_show_route(route, parsed.id, config=config, **kw) + + +def selftest() -> bool: + """Smoke-test show validation without network access. + + :return: ``True`` on success. + :rtype: bool + """ + try: + show("publisher", "anilist:1") + except ApiError as exc: + assert exc.reason == "bad-args" + else: # pragma: no cover + raise AssertionError("unsupported show accepted") + return True diff --git a/animedex/backends/anilist/__init__.py b/animedex/backends/anilist/__init__.py index 00e7d6b..3023dec 100644 --- a/animedex/backends/anilist/__init__.py +++ b/animedex/backends/anilist/__init__.py @@ -136,7 +136,25 @@ def search(q: str, *, page: int = 1, per_page: int = 10, config: Optional[Config :return: List of matching AniList records. :rtype: list[AnilistAnime] """ - payload, src = _gql(_q.Q_MEDIA_SEARCH, {"q": q, "page": page, "perPage": min(per_page, 50)}, config=config, **kw) + payload, src = _gql( + _q.Q_MEDIA_SEARCH, + {"q": q, "page": page, "perPage": min(per_page, 50), "type": "ANIME"}, + config=config, + **kw, + ) + return _mp.map_media_list(payload, src) + + +def manga_search( + q: str, *, page: int = 1, per_page: int = 10, config: Optional[Config] = None, **kw +) -> List[AnilistAnime]: + """Search manga by title.""" + payload, src = _gql( + _q.Q_MEDIA_SEARCH, + {"q": q, "page": page, "perPage": min(per_page, 50), "type": "MANGA"}, + config=config, + **kw, + ) return _mp.map_media_list(payload, src) diff --git a/animedex/backends/anilist/_queries.py b/animedex/backends/anilist/_queries.py index 227d565..6a1ae85 100644 --- a/animedex/backends/anilist/_queries.py +++ b/animedex/backends/anilist/_queries.py @@ -68,10 +68,10 @@ Q_MEDIA_SEARCH = """ -query ($q: String, $page: Int, $perPage: Int) { +query ($q: String, $page: Int, $perPage: Int, $type: MediaType) { Page(page: $page, perPage: $perPage) { pageInfo { total currentPage hasNextPage perPage } - media(search: $q, type: ANIME, sort: SEARCH_MATCH) { + media(search: $q, type: $type, sort: SEARCH_MATCH) { id idMal title { romaji english native } type format status episodes diff --git a/animedex/backends/kitsu/models.py b/animedex/backends/kitsu/models.py index fe692cb..df1917e 100644 --- a/animedex/backends/kitsu/models.py +++ b/animedex/backends/kitsu/models.py @@ -26,6 +26,7 @@ from typing import Any, Dict, List, Optional from animedex.models.anime import Anime, AnimeRating, AnimeStreamingLink, AnimeTitle +from animedex.models.character import Character, Staff, Studio from animedex.models.common import BackendRichModel, SourceTag from animedex.models.manga import Manga @@ -352,6 +353,21 @@ class KitsuCharacter(BackendRichModel): links: Optional[Dict[str, Any]] = None source_tag: Optional[SourceTag] = None + def to_common(self) -> Character: + """Project this resource onto the cross-source character shape.""" + attrs = self.attributes or KitsuCharacterAttributes() + names = attrs.names or {} + image_url = (attrs.image or {}).get("original") if isinstance(attrs.image, dict) else None + return Character( + id=f"kitsu:char:{self.id}", + name=attrs.name or attrs.canonicalName or names.get("en") or names.get("en_jp") or "", + name_native=names.get("ja_jp"), + name_alternatives=list(attrs.otherNames or []), + image_url=image_url, + description=attrs.description, + source=self.source_tag or _default_src(), + ) + class KitsuPerson(BackendRichModel): """JSON:API person resource from ``/people/{id}`` and @@ -364,6 +380,16 @@ class KitsuPerson(BackendRichModel): links: Optional[Dict[str, Any]] = None source_tag: Optional[SourceTag] = None + def to_common(self) -> Staff: + """Project this resource onto the cross-source staff shape.""" + attrs = self.attributes or KitsuPersonAttributes() + return Staff( + id=f"kitsu:person:{self.id}", + name=attrs.name or "", + description=attrs.description, + source=self.source_tag or _default_src(), + ) + class KitsuProducer(BackendRichModel): """JSON:API producer resource from ``/producers``.""" @@ -375,6 +401,15 @@ class KitsuProducer(BackendRichModel): links: Optional[Dict[str, Any]] = None source_tag: Optional[SourceTag] = None + def to_common(self) -> Studio: + """Project this resource onto the cross-source studio shape.""" + attrs = self.attributes or KitsuProducerAttributes() + return Studio( + id=f"kitsu:producer:{self.id}", + name=attrs.name or attrs.slug or "", + source=self.source_tag or _default_src(), + ) + class KitsuGenre(BackendRichModel): """JSON:API genre resource from ``/genres``.""" diff --git a/animedex/backends/shikimori/__init__.py b/animedex/backends/shikimori/__init__.py index 11c3171..93559f6 100644 --- a/animedex/backends/shikimori/__init__.py +++ b/animedex/backends/shikimori/__init__.py @@ -256,20 +256,54 @@ def club_show(club_id: int, *, config: Optional[Config] = None, **kw) -> Shikimo return ShikimoriClub.model_validate({**payload, "source_tag": src}) +def character_search( + q: Optional[str] = None, + *, + limit: Optional[int] = None, + config: Optional[Config] = None, + **kw, +) -> List[ShikimoriCharacter]: + """Search top-level characters via ``/api/characters/search``.""" + payload, src = _fetch("/api/characters/search", params=_params(search=q, limit=limit), config=config, **kw) + return [ShikimoriCharacter.model_validate({**row, "source_tag": src}) for row in _list(payload)] + + +def character(character_id: int, *, config: Optional[Config] = None, **kw) -> ShikimoriCharacter: + """Fetch one top-level character by Shikimori ID.""" + payload, src = _fetch(f"/api/characters/{character_id}", config=config, **kw) + if not isinstance(payload, dict): + raise ApiError( + "shikimori character show did not return an object", + backend="shikimori", + reason="upstream-shape", + ) + return ShikimoriCharacter.model_validate({**payload, "source_tag": src}) + + def publishers(*, config: Optional[Config] = None, **kw) -> List[ShikimoriPublisher]: """List Shikimori manga publishers.""" payload, src = _fetch("/api/publishers", config=config, **kw) return [ShikimoriPublisher.model_validate({**row, "source_tag": src}) for row in _list(payload)] +def publisher(publisher_id: int, *, config: Optional[Config] = None, **kw) -> ShikimoriPublisher: + """Fetch one publisher from the Shikimori publisher catalogue.""" + rows = publishers(config=config, **kw) + for row in rows: + if row.id == publisher_id: + return row + raise ApiError(f"shikimori publisher {publisher_id} not found", backend="shikimori", reason="not-found") + + def people_search( q: Optional[str] = None, *, + limit: Optional[int] = None, config: Optional[Config] = None, **kw, ) -> List[ShikimoriPerson]: """Search top-level people via ``/api/people/search``.""" - payload, src = _fetch("/api/people/search", params=_params(search=q), config=config, **kw) + payload, src = _fetch("/api/people/search", params=_params(search=q, limit=limit), config=config, **kw) return [ShikimoriPerson.model_validate({**row, "source_tag": src}) for row in _list(payload)] @@ -367,6 +401,15 @@ def studios(*, config: Optional[Config] = None, **kw) -> List[ShikimoriStudio]: return [ShikimoriStudio.model_validate({**row, "source_tag": src}) for row in _list(payload)] +def studio(studio_id: int, *, config: Optional[Config] = None, **kw) -> ShikimoriStudio: + """Fetch one studio from the Shikimori studio catalogue.""" + rows = studios(config=config, **kw) + for row in rows: + if row.id == studio_id: + return row + raise ApiError(f"shikimori studio {studio_id} not found", backend="shikimori", reason="not-found") + + def genres(*, config: Optional[Config] = None, **kw) -> List[ShikimoriResource]: """List Shikimori genres.""" payload, src = _fetch("/api/genres", config=config, **kw) diff --git a/animedex/diag/selftest.py b/animedex/diag/selftest.py index 4f87442..ce8673b 100644 --- a/animedex/diag/selftest.py +++ b/animedex/diag/selftest.py @@ -74,9 +74,12 @@ "animedex.config.profile", "animedex.entry", "animedex.entry.cli", + "animedex.entry.search", + "animedex.entry.show", "animedex.diag", "animedex.diag.selftest", "animedex.models", + "animedex.models.aggregate", "animedex.models.common", "animedex.models.anime", "animedex.models.manga", @@ -128,6 +131,13 @@ "animedex.api.trace", "animedex.api.waifu", "animedex.render.raw", + # aggregate command layer. + "animedex.agg", + "animedex.agg._fanout", + "animedex.agg._prefix_id", + "animedex.agg._type_routes", + "animedex.agg.search", + "animedex.agg.show", # the high-level backend layer: backend-specific high-level Python APIs. "animedex.backends", "animedex.backends.anilist", diff --git a/animedex/entry/anilist.py b/animedex/entry/anilist.py index 007781b..39b97dc 100644 --- a/animedex/entry/anilist.py +++ b/animedex/entry/anilist.py @@ -56,6 +56,7 @@ def anilist_group() -> None: # ---------- core ---------- register_subcommand(anilist_group, "show", _api.show, help="Show one Media (anime/manga) by AniList id.") register_subcommand(anilist_group, "search", _api.search, help="Search Media by title.") +register_subcommand(anilist_group, "manga-search", _api.manga_search, help="Search manga by title.") register_subcommand(anilist_group, "character", _api.character, help="Show one Character by id.") register_subcommand(anilist_group, "character-search", _api.character_search, help="Search characters.") register_subcommand(anilist_group, "staff", _api.staff, help="Show one Staff by id.") diff --git a/animedex/entry/cli.py b/animedex/entry/cli.py index 48e4a41..00e6ae2 100644 --- a/animedex/entry/cli.py +++ b/animedex/entry/cli.py @@ -116,7 +116,9 @@ def cli() -> None: from animedex.entry.mangadex import mangadex_group as _mangadex_group # noqa: E402 from animedex.entry.nekos import nekos_group as _nekos_group # noqa: E402 from animedex.entry.quote import quote_group as _quote_group # noqa: E402 +from animedex.entry.search import search_command as _search_command # noqa: E402 from animedex.entry.shikimori import shikimori_group as _shikimori_group # noqa: E402 +from animedex.entry.show import show_command as _show_command # noqa: E402 from animedex.entry.trace import trace_group as _trace_group # noqa: E402 from animedex.entry.waifu import waifu_group as _waifu_group # noqa: E402 @@ -130,7 +132,9 @@ def cli() -> None: cli.add_command(_mangadex_group) cli.add_command(_nekos_group) cli.add_command(_quote_group) +cli.add_command(_search_command) cli.add_command(_shikimori_group) +cli.add_command(_show_command) cli.add_command(_trace_group) cli.add_command(_waifu_group) @@ -164,7 +168,7 @@ def status_command() -> None: """ click.echo(f"{__TITLE__} v{__VERSION__}") click.echo( - "Wired groups: anilist, ann, danbooru, ghibli, jikan, kitsu, mangadex, nekos, quote, shikimori, trace, waifu, api (raw passthrough)." + "Wired groups: anilist, ann, danbooru, ghibli, jikan, kitsu, mangadex, nekos, quote, shikimori, trace, waifu, api (raw passthrough); aggregate commands: search, show." ) click.echo("Run 'animedex --help' for the full command tree.") diff --git a/animedex/entry/search.py b/animedex/entry/search.py new file mode 100644 index 0000000..4584c14 --- /dev/null +++ b/animedex/entry/search.py @@ -0,0 +1,66 @@ +"""``animedex search`` aggregate command.""" + +from __future__ import annotations + +import click + +from animedex.agg import search as _search +from animedex.config import Config +from animedex.entry._cli_factory import common_options, emit +from animedex.models.aggregate import AggregateResult +from animedex.models.common import ApiError + + +def _emit_failure_lines(result: AggregateResult) -> None: + for name, status in result.failed_sources().items(): + reason = status.reason or "failed" + message = status.message or reason + click.echo(f"source {name!r} failed: {message}; continuing with other sources", err=True) + + +@click.command(name="search") +@click.argument("type", metavar="TYPE") +@click.argument("q", metavar="Q") +@click.option("--limit", type=int, default=10, show_default=True, help="Per-source result cap.") +@click.option("--source", "source", default=None, help="Comma-separated source allowlist.") +@common_options +@click.pass_context +def search_command(ctx, type, q, limit, source, json_flag, jq_expr, no_cache, cache_ttl, rate, no_source) -> None: + """Search one entity type across every supporting catalogue. + + \b + Examples: + animedex search anime Frieren + animedex search manga Berserk --source anilist,jikan + animedex search publisher Kodansha --json + animedex search person Miyazaki --jq '.items[0]._prefix_id' + \f + + Backend: animedex aggregate search over AniList, Jikan, Kitsu, + MangaDex, Shikimori, and ANN where applicable. + + Rate limit: inherited from each selected backend. + + --- LLM Agent Guidance --- + Use this command when the user asks for a cross-catalogue entity + lookup and has not already chosen a backend. The type positional + is required; do not guess it. Results are not deduplicated across + sources, scores are not averaged, and each row carries _source + plus _prefix_id when a follow-up `animedex show` call can route it. + Partial source failures return the healthy rows and report failed + sources in the envelope and stderr. + --- End --- + """ + cfg = Config(no_cache=no_cache, cache_ttl_seconds=cache_ttl, rate=rate, source_attribution=not no_source) + try: + result = _search(type, q, limit=limit, source=source, config=cfg) + except ApiError as exc: + raise click.ClickException(str(exc)) from exc + _emit_failure_lines(result) + emit(result, json_flag=json_flag, jq_expr=jq_expr, no_source=no_source) + if result.all_failed: + ctx.exit(1) + ctx.exit(0) + + +__all__ = ["search_command"] diff --git a/animedex/entry/shikimori.py b/animedex/entry/shikimori.py index cc8f4d9..2547319 100644 --- a/animedex/entry/shikimori.py +++ b/animedex/entry/shikimori.py @@ -51,7 +51,10 @@ def shikimori_group() -> None: register_subcommand(shikimori_group, "ranobe-show", _api.ranobe_show, help="Ranobe by Shikimori numeric id.") register_subcommand(shikimori_group, "club-search", _api.club_search, help="Search Shikimori clubs.") register_subcommand(shikimori_group, "club-show", _api.club_show, help="Club by Shikimori numeric id.") +register_subcommand(shikimori_group, "character-search", _api.character_search, help="Search top-level characters.") +register_subcommand(shikimori_group, "character", _api.character, help="Top-level character by Shikimori numeric id.") register_subcommand(shikimori_group, "publishers", _api.publishers, help="Manga publisher taxonomy.") +register_subcommand(shikimori_group, "publisher", _api.publisher, help="Publisher by Shikimori numeric id.") register_subcommand(shikimori_group, "people-search", _api.people_search, help="Search top-level Shikimori people.") register_subcommand(shikimori_group, "person", _api.person, help="Top-level person by Shikimori numeric id.") register_subcommand(shikimori_group, "screenshots", _api.screenshots, help="Screenshot list for one anime.") @@ -64,4 +67,5 @@ def shikimori_group() -> None: register_subcommand(shikimori_group, "external-links", _api.external_links, help="External links for one anime.") register_subcommand(shikimori_group, "topics", _api.topics, help="Discussion topics for one anime.") register_subcommand(shikimori_group, "studios", _api.studios, help="Studio taxonomy.") +register_subcommand(shikimori_group, "studio", _api.studio, help="Studio by Shikimori numeric id.") register_subcommand(shikimori_group, "genres", _api.genres, help="Genre taxonomy.") diff --git a/animedex/entry/show.py b/animedex/entry/show.py new file mode 100644 index 0000000..a1ec626 --- /dev/null +++ b/animedex/entry/show.py @@ -0,0 +1,52 @@ +"""``animedex show`` aggregate command.""" + +from __future__ import annotations + +import click + +from animedex.agg import show as _show +from animedex.config import Config +from animedex.entry._cli_factory import common_options, emit +from animedex.models.common import ApiError + + +@click.command(name="show") +@click.argument("type", metavar="TYPE") +@click.argument("prefix_id", metavar="PREFIX:ID") +@common_options +def show_command(type, prefix_id, json_flag, jq_expr, no_cache, cache_ttl, rate, no_source) -> None: + """Show one entity from the backend encoded in its prefix id. + + \b + Examples: + animedex show anime anilist:154587 + animedex show anime mal:52991 + animedex show manga mangadex:dc8bbc4c-eb7a-4d27-b96a-9aa8c8db4adb + animedex show person shikimori:1870 + \f + + Backend: animedex aggregate router over AniList, Jikan, Kitsu, + MangaDex, Shikimori, and ANN where applicable. + + Rate limit: inherited from the selected backend. + + --- LLM Agent Guidance --- + Use this command after `animedex search` returns a _prefix_id, or + when the user gives an explicit backend-prefixed ID. The type + positional is required because most upstream ID spaces reuse the + same number for different entity kinds. Unsupported type/backend + pairs fail before any network request and list the backends that + do support the requested type. The `anidb:` prefix is recognised + as deferred and raises an informative typed error until the AniDB + helpers ship. + --- End --- + """ + cfg = Config(no_cache=no_cache, cache_ttl_seconds=cache_ttl, rate=rate, source_attribution=not no_source) + try: + result = _show(type, prefix_id, config=cfg) + except ApiError as exc: + raise click.ClickException(str(exc)) from exc + emit(result, json_flag=json_flag, jq_expr=jq_expr, no_source=no_source) + + +__all__ = ["show_command"] diff --git a/animedex/models/__init__.py b/animedex/models/__init__.py index de8b638..329a7b7 100644 --- a/animedex/models/__init__.py +++ b/animedex/models/__init__.py @@ -43,6 +43,7 @@ AnimeStreamingLink, AnimeTitle, ) +from animedex.models.aggregate import AggregateResult, AggregateSourceStatus from animedex.models.art import ArtPost, ArtRating from animedex.models.character import Character, Staff, Studio from animedex.models.common import ( @@ -64,6 +65,8 @@ __all__ = [ "AnimedexModel", + "AggregateResult", + "AggregateSourceStatus", "Anime", "AnimeFormat", "AnimeRating", diff --git a/animedex/models/aggregate.py b/animedex/models/aggregate.py new file mode 100644 index 0000000..217c59c --- /dev/null +++ b/animedex/models/aggregate.py @@ -0,0 +1,104 @@ +"""Aggregate command result models. + +The aggregate layer composes several high-level backends while keeping +the source attribution contract explicit. Successful rows live in +``items``; per-source status, including partial failures, lives in +``sources``. +""" + +from __future__ import annotations + +from typing import Any, Dict, List, Optional + +from animedex.models.common import AnimedexModel + + +class AggregateSourceStatus(AnimedexModel): + """Status row for one source consulted by an aggregate command. + + :ivar status: ``"ok"`` or ``"failed"``. + :vartype status: str + :ivar items: Number of successful rows returned by this source. + :vartype items: int + :ivar reason: Typed failure reason when the source failed. + :vartype reason: str or None + :ivar message: Human-readable failure summary. + :vartype message: str or None + :ivar http_status: Upstream HTTP status when known. + :vartype http_status: int or None + :ivar duration_ms: Wall-clock duration spent on this source. + :vartype duration_ms: int + """ + + status: str + items: int = 0 + reason: Optional[str] = None + message: Optional[str] = None + http_status: Optional[int] = None + duration_ms: int = 0 + + +class AggregateResult(AnimedexModel): + """Envelope returned by multi-source aggregate commands. + + :ivar items: Successful rows. Each row is a JSON-ready dict that + carries ``_source`` and, for entity rows, + ``_prefix_id``. + :vartype items: list[dict] + :ivar sources: Per-source status map. + :vartype sources: dict[str, AggregateSourceStatus] + """ + + items: List[Any] = [] + sources: Dict[str, AggregateSourceStatus] = {} + + def failed_sources(self) -> Dict[str, AggregateSourceStatus]: + """Return the subset of sources that failed. + + :return: Source-status map containing only failed rows. + :rtype: dict[str, AggregateSourceStatus] + """ + return {name: status for name, status in self.sources.items() if status.status == "failed"} + + def ok_sources(self) -> Dict[str, AggregateSourceStatus]: + """Return the subset of sources that succeeded. + + :return: Source-status map containing only successful rows. + :rtype: dict[str, AggregateSourceStatus] + """ + return {name: status for name, status in self.sources.items() if status.status == "ok"} + + @property + def all_failed(self) -> bool: + """Whether every selected source failed. + + :return: ``True`` when at least one source was selected and + none succeeded. + :rtype: bool + """ + return bool(self.sources) and not self.ok_sources() + + +def selftest() -> bool: + """Smoke-test aggregate model validation and helpers. + + :return: ``True`` on success. + :rtype: bool + """ + result = AggregateResult( + items=[{"id": 1, "_source": "demo", "_prefix_id": "demo:1"}], + sources={ + "demo": AggregateSourceStatus(status="ok", items=1, duration_ms=1), + "bad": AggregateSourceStatus(status="failed", reason="upstream-error", message="bad", duration_ms=2), + }, + ) + assert set(result.ok_sources()) == {"demo"} + assert set(result.failed_sources()) == {"bad"} + assert not result.all_failed + AggregateResult.model_validate_json(result.model_dump_json()) + failed = AggregateResult( + items=[], + sources={"bad": AggregateSourceStatus(status="failed", reason="upstream-error")}, + ) + assert failed.all_failed + return True diff --git a/animedex/render/json_renderer.py b/animedex/render/json_renderer.py index 4871f5a..1624b19 100644 --- a/animedex/render/json_renderer.py +++ b/animedex/render/json_renderer.py @@ -45,6 +45,11 @@ def render_json(model: AnimedexModel, *, include_source: bool = True) -> str: payload = model.model_dump(mode="json", by_alias=True) if include_source: sources = [] + aggregate_sources = payload.get("sources") + if isinstance(aggregate_sources, dict): + for name, status in aggregate_sources.items(): + if not isinstance(status, dict) or status.get("status") == "ok": + sources.append(name) # Single-source records keep the source on either ``.source`` # (common projection types like :class:`Anime`, # :class:`Character`) or ``.source_tag`` (backend-rich types diff --git a/animedex/render/tty.py b/animedex/render/tty.py index 4769f84..65df3d3 100644 --- a/animedex/render/tty.py +++ b/animedex/render/tty.py @@ -15,6 +15,7 @@ from typing import Any, Optional from animedex.models.anime import Anime +from animedex.models.aggregate import AggregateResult from animedex.models.character import Character, Staff, Studio from animedex.models.common import AnimedexModel from animedex.models.trace import TraceHit, TraceQuota @@ -295,6 +296,64 @@ def _format_trace_quota_tty(q: TraceQuota) -> str: return out.getvalue() +def _format_aggregate_result_tty(result: AggregateResult) -> str: + out = io.StringIO() + print("Aggregate results", file=out) + if result.failed_sources(): + failed = ", ".join(sorted(result.failed_sources())) + print(f" Failed sources: {failed}", file=out) + for item in result.items: + if hasattr(item, "to_common"): + try: + common = item.to_common() + except Exception: + common = None + else: + common = None + source = None + prefix_id = None + dict_label = None + if isinstance(item, dict): + source = item.get("_source") + prefix_id = item.get("_prefix_id") + dict_label = item.get("name") or item.get("title") + if isinstance(dict_label, dict): + dict_label = dict_label.get("romaji") or dict_label.get("english") or dict_label.get("en") + else: + source = getattr(getattr(item, "source_tag", None), "backend", None) + prefix_id = getattr(item, "_prefix_id", None) + label = None + score = None + status = None + if isinstance(common, Anime): + label = common.title.romaji + if common.score is not None: + score = f"{common.score.score}/{common.score.scale}" + status = common.status + elif isinstance(common, Character): + label = common.name + elif isinstance(common, Staff): + label = common.name + elif isinstance(common, Studio): + label = common.name + if label is None: + label = dict_label or getattr(item, "name", None) or getattr(item, "title", None) or type(item).__name__ + bits = [label] + if prefix_id: + bits.append(f"({prefix_id})") + if source: + bits.append(f"[src: {source}]") + print(" " + " ".join(bits), file=out) + details = [] + if score: + details.append(f"Score: {score}") + if status: + details.append(f"Status: {status}") + if details: + print(" " + " · ".join(details), file=out) + return out.getvalue() + + def render_tty(model: AnimedexModel) -> str: """Render a model into the human-friendly TTY form. @@ -321,6 +380,8 @@ def render_tty(model: AnimedexModel) -> str: return _format_trace_hit_tty(model) if isinstance(model, TraceQuota): return _format_trace_quota_tty(model) + if isinstance(model, AggregateResult): + return _format_aggregate_result_tty(model) # Rich per-backend dataclass (AnilistAnime / AnilistCharacter / # AnilistStaff / AnilistStudio / JikanAnime / JikanCharacter / # ...) — project to the common type and re-render. The common diff --git a/docs/source/_static/gifs/README.md b/docs/source/_static/gifs/README.md index dc4a19d..054aef9 100644 --- a/docs/source/_static/gifs/README.md +++ b/docs/source/_static/gifs/README.md @@ -22,6 +22,7 @@ source tapes so future contributors can regenerate them. | `trace.gif` | `docs/source/tutorials/backends/trace.rst` header | `trace.tape` | | `nekos.gif` | `docs/source/tutorials/backends/nekos.rst` header | `nekos.tape` | | `shikimori.gif` | `docs/source/tutorials/backends/shikimori.rst` header | `shikimori.tape` | +| `aggregate.gif` | `docs/source/tutorials/aggregate.rst` header | `aggregate.tape` | ## Regenerating @@ -47,11 +48,12 @@ vhs quote.tape # produces quote.gif vhs trace.tape # produces trace.gif vhs nekos.tape # produces nekos.gif vhs shikimori.tape # produces shikimori.gif +vhs aggregate.tape # produces aggregate.gif ``` vhs is available as a single-file binary at [github.com/charmbracelet/vhs/releases](https://github.com/charmbracelet/vhs/releases). -The render is local and offline-after-install — no network calls happen inside vhs itself. Most tapes intentionally run live `animedex` commands, so they need network at record time and may show small upstream drift such as a different random image or score. `ghibli.tape` is fully offline, and `quote.tape` / `shikimori.tape` prewarm a temporary local cache from committed fixtures before the visible commands run so the demos stay stable under tight upstream limits. +The render is local and offline-after-install — no network calls happen inside vhs itself. Most tapes intentionally run live `animedex` commands, so they need network at record time and may show small upstream drift such as a different random image or score. `ghibli.tape` is fully offline, and `quote.tape` / `shikimori.tape` / `aggregate.tape` prewarm a temporary local cache from committed fixtures before the visible commands run so the demos stay stable under tight upstream limits. ## Why commit both .tape and .gif? diff --git a/docs/source/_static/gifs/aggregate.gif b/docs/source/_static/gifs/aggregate.gif new file mode 100644 index 0000000000000000000000000000000000000000..52a7b07386b45249399d85a97d4dcd2f97aedb9e GIT binary patch literal 249200 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

5s#Oy?tKm1r#tFy=?^eT$#TEpF25( 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/gifs/aggregate.tape b/docs/source/_static/gifs/aggregate.tape new file mode 100644 index 0000000..398e439 --- /dev/null +++ b/docs/source/_static/gifs/aggregate.tape @@ -0,0 +1,42 @@ +# vhs tape - animedex aggregate search/show tour (~18 s) +# +# Uses a pre-warmed local cache during rendering so the demo is stable +# and does not depend on live upstream rate-limit state. + +Output aggregate.gif + +Set Theme "Dracula" +Set FontSize 13 +Set Width 1120 +Set Height 540 +Set Padding 14 +Set Framerate 24 + +Hide +Type "export XDG_CACHE_HOME=$(mktemp -d) && python ../../../../tools/fixtures/prewarm_aggregate_cache.py && clear" +Enter +Sleep 1s +Show + +Type "animedex search anime Frieren --limit 2 --source jikan,kitsu,shikimori" +Sleep 400ms +Enter +Sleep 3200ms + +Type "animedex search manga Berserk --limit 2 --source mangadex,shikimori --jq '.items[] | {_prefix_id, _source}'" +Sleep 400ms +Enter +Sleep 3000ms + +Type "animedex show anime mal:52991 --jq '{title, score, status}'" +Sleep 400ms +Enter +Sleep 2800ms + +Type "animedex show character shikimori:184947 --jq '{id, name}'" +Sleep 400ms +Enter +Sleep 2200ms + +# Hold the final frame so a viewer has time to read the last block. +Sleep 4s diff --git a/docs/source/api_doc/agg/_fanout.rst b/docs/source/api_doc/agg/_fanout.rst new file mode 100644 index 0000000..5fd09a1 --- /dev/null +++ b/docs/source/api_doc/agg/_fanout.rst @@ -0,0 +1,30 @@ +animedex.agg.\_fanout +======================================================== + +.. currentmodule:: animedex.agg._fanout + +.. automodule:: animedex.agg._fanout + + +SourceCallable +----------------------------------------------------- + +.. autodata:: SourceCallable + + +fanout +----------------------------------------------------- + +.. autofunction:: fanout + + +select\_sources +----------------------------------------------------- + +.. autofunction:: select_sources + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/agg/_prefix_id.rst b/docs/source/api_doc/agg/_prefix_id.rst new file mode 100644 index 0000000..e5fc3e7 --- /dev/null +++ b/docs/source/api_doc/agg/_prefix_id.rst @@ -0,0 +1,43 @@ +animedex.agg.\_prefix\_id +======================================================== + +.. currentmodule:: animedex.agg._prefix_id + +.. automodule:: animedex.agg._prefix_id + + +ParsedPrefixId +----------------------------------------------------- + +.. autoclass:: ParsedPrefixId + :members: prefix,backend,id + + +known\_prefixes +----------------------------------------------------- + +.. autofunction:: known_prefixes + + +parse +----------------------------------------------------- + +.. autofunction:: parse + + +validate\_id +----------------------------------------------------- + +.. autofunction:: validate_id + + +prefix\_for\_backend +----------------------------------------------------- + +.. autofunction:: prefix_for_backend + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/agg/_type_routes.rst b/docs/source/api_doc/agg/_type_routes.rst new file mode 100644 index 0000000..9a67978 --- /dev/null +++ b/docs/source/api_doc/agg/_type_routes.rst @@ -0,0 +1,74 @@ +animedex.agg.\_type\_routes +======================================================== + +.. currentmodule:: animedex.agg._type_routes + +.. automodule:: animedex.agg._type_routes + + +ENTITY\_TYPES +----------------------------------------------------- + +.. autodata:: ENTITY_TYPES + + +SearchRoute +----------------------------------------------------- + +.. autoclass:: SearchRoute + :members: backend,function_name,query_arg,limit_arg,all_items + + +ShowRoute +----------------------------------------------------- + +.. autoclass:: ShowRoute + :members: backend,function_name,id_arg + + +validate\_entity\_type +----------------------------------------------------- + +.. autofunction:: validate_entity_type + + +search\_routes\_for +----------------------------------------------------- + +.. autofunction:: search_routes_for + + +show\_route\_for +----------------------------------------------------- + +.. autofunction:: show_route_for + + +backends\_for\_type +----------------------------------------------------- + +.. autofunction:: backends_for_type + + +import\_backend +----------------------------------------------------- + +.. autofunction:: import_backend + + +call\_search\_route +----------------------------------------------------- + +.. autofunction:: call_search_route + + +call\_show\_route +----------------------------------------------------- + +.. autofunction:: call_show_route + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/agg/index.rst b/docs/source/api_doc/agg/index.rst new file mode 100644 index 0000000..2477048 --- /dev/null +++ b/docs/source/api_doc/agg/index.rst @@ -0,0 +1,27 @@ +animedex.agg +======================================================== + +.. currentmodule:: animedex.agg + +.. automodule:: animedex.agg + + +.. toctree:: + :maxdepth: 3 + + _fanout + _prefix_id + _type_routes + search + show + +\_\_all\_\_ +----------------------------------------------------- + +.. autodata:: __all__ + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/agg/search.rst b/docs/source/api_doc/agg/search.rst new file mode 100644 index 0000000..65776a2 --- /dev/null +++ b/docs/source/api_doc/agg/search.rst @@ -0,0 +1,18 @@ +animedex.agg.search +======================================================== + +.. currentmodule:: animedex.agg.search + +.. automodule:: animedex.agg.search + + +search +----------------------------------------------------- + +.. autofunction:: search + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/agg/show.rst b/docs/source/api_doc/agg/show.rst new file mode 100644 index 0000000..4ada30e --- /dev/null +++ b/docs/source/api_doc/agg/show.rst @@ -0,0 +1,18 @@ +animedex.agg.show +======================================================== + +.. currentmodule:: animedex.agg.show + +.. automodule:: animedex.agg.show + + +show +----------------------------------------------------- + +.. autofunction:: show + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/backends/anilist/index.rst b/docs/source/api_doc/backends/anilist/index.rst index 3734537..3108d47 100644 --- a/docs/source/api_doc/backends/anilist/index.rst +++ b/docs/source/api_doc/backends/anilist/index.rst @@ -25,6 +25,12 @@ search .. autofunction:: search +manga\_search +----------------------------------------------------- + +.. autofunction:: manga_search + + character ----------------------------------------------------- diff --git a/docs/source/api_doc/backends/kitsu/models.rst b/docs/source/api_doc/backends/kitsu/models.rst index 3adbca9..7813e76 100644 --- a/docs/source/api_doc/backends/kitsu/models.rst +++ b/docs/source/api_doc/backends/kitsu/models.rst @@ -129,21 +129,21 @@ KitsuCharacter ----------------------------------------------------- .. autoclass:: KitsuCharacter - :members: id,type,attributes,relationships,links,source_tag + :members: to_common,id,type,attributes,relationships,links,source_tag KitsuPerson ----------------------------------------------------- .. autoclass:: KitsuPerson - :members: id,type,attributes,relationships,links,source_tag + :members: to_common,id,type,attributes,relationships,links,source_tag KitsuProducer ----------------------------------------------------- .. autoclass:: KitsuProducer - :members: id,type,attributes,relationships,links,source_tag + :members: to_common,id,type,attributes,relationships,links,source_tag KitsuGenre diff --git a/docs/source/api_doc/backends/shikimori/index.rst b/docs/source/api_doc/backends/shikimori/index.rst index 2558ccc..a71c386 100644 --- a/docs/source/api_doc/backends/shikimori/index.rst +++ b/docs/source/api_doc/backends/shikimori/index.rst @@ -65,12 +65,30 @@ club\_show .. autofunction:: club_show +character\_search +----------------------------------------------------- + +.. autofunction:: character_search + + +character +----------------------------------------------------- + +.. autofunction:: character + + publishers ----------------------------------------------------- .. autofunction:: publishers +publisher +----------------------------------------------------- + +.. autofunction:: publisher + + people\_search ----------------------------------------------------- @@ -143,6 +161,12 @@ studios .. autofunction:: studios +studio +----------------------------------------------------- + +.. autofunction:: studio + + genres ----------------------------------------------------- diff --git a/docs/source/api_doc/entry/index.rst b/docs/source/api_doc/entry/index.rst index b463300..06290d5 100644 --- a/docs/source/api_doc/entry/index.rst +++ b/docs/source/api_doc/entry/index.rst @@ -21,7 +21,9 @@ animedex.entry mangadex nekos quote + search shikimori + show trace waifu diff --git a/docs/source/api_doc/entry/search.rst b/docs/source/api_doc/entry/search.rst new file mode 100644 index 0000000..bf9d45f --- /dev/null +++ b/docs/source/api_doc/entry/search.rst @@ -0,0 +1,18 @@ +animedex.entry.search +======================================================== + +.. currentmodule:: animedex.entry.search + +.. automodule:: animedex.entry.search + + +\_\_all\_\_ +----------------------------------------------------- + +.. autodata:: __all__ + + +search\_command +----------------------------------------------------- + +.. autofunction:: search_command diff --git a/docs/source/api_doc/entry/show.rst b/docs/source/api_doc/entry/show.rst new file mode 100644 index 0000000..612e76e --- /dev/null +++ b/docs/source/api_doc/entry/show.rst @@ -0,0 +1,18 @@ +animedex.entry.show +======================================================== + +.. currentmodule:: animedex.entry.show + +.. automodule:: animedex.entry.show + + +\_\_all\_\_ +----------------------------------------------------- + +.. autodata:: __all__ + + +show\_command +----------------------------------------------------- + +.. autofunction:: show_command diff --git a/docs/source/api_doc/index.rst b/docs/source/api_doc/index.rst index d5a6d63..d5001ca 100644 --- a/docs/source/api_doc/index.rst +++ b/docs/source/api_doc/index.rst @@ -9,6 +9,7 @@ API Reference .. toctree:: :maxdepth: 3 + agg/index api/index auth/index backends/index @@ -27,4 +28,3 @@ API Reference ----------------------------------------------------- .. autodata:: __all__ - diff --git a/docs/source/api_doc/models/aggregate.rst b/docs/source/api_doc/models/aggregate.rst new file mode 100644 index 0000000..178bf14 --- /dev/null +++ b/docs/source/api_doc/models/aggregate.rst @@ -0,0 +1,26 @@ +animedex.models.aggregate +======================================================== + +.. currentmodule:: animedex.models.aggregate + +.. automodule:: animedex.models.aggregate + + +AggregateSourceStatus +----------------------------------------------------- + +.. autoclass:: AggregateSourceStatus + :members: status,items,reason,message,http_status,duration_ms + + +AggregateResult +----------------------------------------------------- + +.. autoclass:: AggregateResult + :members: failed_sources,ok_sources,all_failed,items,sources + + +selftest +----------------------------------------------------- + +.. autofunction:: selftest diff --git a/docs/source/api_doc/models/index.rst b/docs/source/api_doc/models/index.rst index c1bbd09..17e3064 100644 --- a/docs/source/api_doc/models/index.rst +++ b/docs/source/api_doc/models/index.rst @@ -9,6 +9,7 @@ animedex.models .. toctree:: :maxdepth: 3 + aggregate anime art character diff --git a/docs/source/tutorials/aggregate.rst b/docs/source/tutorials/aggregate.rst new file mode 100644 index 0000000..48c5748 --- /dev/null +++ b/docs/source/tutorials/aggregate.rst @@ -0,0 +1,138 @@ +``animedex search`` and ``animedex show`` +========================================= + +The top-level aggregate commands are the normal entry point when the user has not chosen a backend yet. ``animedex search`` fans out to every catalogue that supports the requested entity type, while ``animedex show`` routes one ``prefix:id`` reference back to the owning backend. + +.. image:: /_static/gifs/aggregate.gif + :alt: animedex aggregate demo - multi-source search and prefix-id show + :align: center + +References +---------- + +================================ ===================================================================== +Python search module :mod:`animedex.agg.search` +Python show module :mod:`animedex.agg.show` +Prefix parser :mod:`animedex.agg._prefix_id` +Type routes :mod:`animedex.agg._type_routes` +Aggregate result model :mod:`animedex.models.aggregate` +================================ ===================================================================== + +* **Backend**: aggregate orchestration over AniList, Anime News Network, Jikan, Kitsu, MangaDex, and Shikimori where the selected entity type is supported. +* **Rate limit**: inherited from each selected backend; the fan-out helper calls sources independently and records each source's status. +* **Output contract**: JSON keeps the rich backend row plus ``_source`` and ``_prefix_id``. TTY output projects rows only for readability and still prints ``[src: ...]``. + +Search across catalogues +------------------------ + +``TYPE`` is required and must be one of ``anime``, ``manga``, ``character``, ``person``, ``studio``, or ``publisher``. The ``--limit`` option is per source, not global, because source rankings are not comparable. + +.. code-block:: bash + + animedex search anime Frieren --limit 2 --source jikan,kitsu,shikimori --jq '.items[] | {_prefix_id, _source}' + # => {"_prefix_id":"mal:63816","_source":"jikan"} + # => {"_prefix_id":"mal:52991","_source":"jikan"} + # => {"_prefix_id":"kitsu:46474","_source":"kitsu"} + # => {"_prefix_id":"kitsu:49240","_source":"kitsu"} + # => {"_prefix_id":"shikimori:52991","_source":"shikimori"} + # => {"_prefix_id":"shikimori:56885","_source":"shikimori"} + +Manga search includes MangaDex, whose IDs are UUID strings: + +.. code-block:: bash + + animedex search manga Berserk --limit 2 --source mangadex,shikimori --jq '.items[] | {_prefix_id, _source}' + # => {"_prefix_id":"mangadex:801513ba-a712-498c-8f57-cae55b38cc92","_source":"mangadex"} + # => {"_prefix_id":"mangadex:30196491-8fc2-4961-8886-a58f898b1b3e","_source":"mangadex"} + # => {"_prefix_id":"shikimori:2","_source":"shikimori"} + # => {"_prefix_id":"shikimori:92299","_source":"shikimori"} + +Publisher search is currently single-source because Shikimori is the only shipped backend with a publisher catalogue: + +.. code-block:: bash + + animedex search publisher Kodansha --limit 2 --json --jq '{sources: .sources, ids: [.items[]._prefix_id]}' + # => { + # "sources": {"shikimori": {"status": "ok", "items": 1, "reason": null, "message": null, "http_status": null, "duration_ms": 0}}, + # "ids": ["shikimori:456"] + # } + +Show from a prefixed ID +----------------------- + +Use the ``_prefix_id`` from search output as the second argument to ``show``. The type remains explicit because upstream ID spaces often reuse the same numeric ID for different entity kinds. + +.. code-block:: bash + + animedex show anime mal:52991 --jq '{title, score, status}' + # => { + # "title": "Sousou no Frieren", + # "score": 9.31, + # "status": "Finished Airing" + # } + + animedex show manga mangadex:801513ba-a712-498c-8f57-cae55b38cc92 --jq '{id, title: (.attributes.title.en // .attributes.title["ja-ro"]), status: .attributes.status}' + # => { + # "id": "801513ba-a712-498c-8f57-cae55b38cc92", + # "title": "Berserk", + # "status": "ongoing" + # } + + animedex show character shikimori:184947 --jq '{id, name}' + # => { + # "id": 184947, + # "name": "Frieren" + # } + +Prefix map +---------- + +================================ ======================================================================== +Prefix Backend and ID shape +================================ ======================================================================== +``anilist:154587`` AniList numeric ID +``mal:52991`` / ``jikan:52991`` Jikan over MyAnimeList numeric ID +``myanimelist:52991`` Long-form alias for ``mal:`` +``kitsu:46474`` Kitsu numeric ID +``shikimori:52991`` Shikimori numeric ID +``mangadex:`` MangaDex UUID +``ann:38838`` Anime News Network encyclopedia ID +``anidb:...`` Recognised as deferred until AniDB high-level helpers ship +================================ ======================================================================== + +Source availability by type +--------------------------- + +================================ ======================================================================== +Type Default sources +================================ ======================================================================== +``anime`` AniList, Anime News Network, Jikan, Kitsu, Shikimori +``manga`` AniList, Jikan, Kitsu, MangaDex, Shikimori +``character`` AniList, Jikan, Kitsu, Shikimori +``person`` AniList, Jikan, Kitsu, Shikimori +``studio`` AniList, Jikan, Kitsu, Shikimori +``publisher`` Shikimori +================================ ======================================================================== + +At capture time for this tutorial, the AniList typed ``Frieren`` anime search fixture returned an empty ``media`` list and Kitsu's free-text people endpoint returned an upstream ``400`` for the captured Miyazaki probe. The stable examples above therefore use the sources with captured positive rows, and those upstream observations are recorded as source availability notes rather than hidden by the aggregate layer. + +Failure-mode example +-------------------- + +This example is intentionally a failure-mode example. A failed source stays in the structured ``sources`` map and on stderr, while healthy sources still return rows. The command exits with status 0 when at least one selected source succeeds. + +.. code-block:: bash + + animedex search anime Frieren --source ann,jikan,kitsu,shikimori --limit 2 --json --jq '{items: [.items[]._source], sources: .sources}' + # stderr => source 'ann' failed: upstream-error: ann 503 on /api.xml; continuing with other sources + # => { + # "items": ["jikan", "jikan", "kitsu", "kitsu", "shikimori", "shikimori"], + # "sources": { + # "ann": {"status": "failed", "items": 0, "reason": "upstream-error", "message": "upstream-error: ann 503 on /api.xml", "http_status": 503, "duration_ms": 0}, + # "jikan": {"status": "ok", "items": 2, "reason": null, "message": null, "http_status": null, "duration_ms": 0}, + # "kitsu": {"status": "ok", "items": 2, "reason": null, "message": null, "http_status": null, "duration_ms": 0}, + # "shikimori": {"status": "ok", "items": 2, "reason": null, "message": null, "http_status": null, "duration_ms": 0} + # } + # } + +The :doc:`output_modes` page covers the JSON, TTY, and ``--jq`` projection rules used by both aggregate commands. diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index 2952c27..f96e521 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -35,6 +35,7 @@ Cross-cutting tutorials .. toctree:: :maxdepth: 1 + aggregate raw_passthrough output_modes python_library diff --git a/test/agg/__init__.py b/test/agg/__init__.py new file mode 100644 index 0000000..90a7253 --- /dev/null +++ b/test/agg/__init__.py @@ -0,0 +1 @@ +"""Tests for aggregate command substrate modules.""" diff --git a/test/agg/test_fanout.py b/test/agg/test_fanout.py new file mode 100644 index 0000000..7b5488d --- /dev/null +++ b/test/agg/test_fanout.py @@ -0,0 +1,60 @@ +"""Tests for the aggregate fan-out helper.""" + +from __future__ import annotations + +import pytest + + +pytestmark = pytest.mark.unittest + + +class TestFanout: + def test_collects_successes_and_failures_in_source_order(self): + from animedex.agg._fanout import fanout + from animedex.models.common import ApiError + + result = fanout( + { + "a": lambda: [{"_source": "a", "id": 1}], + "b": lambda: (_ for _ in ()).throw(ApiError("backend b 503", backend="b", reason="upstream-error")), + "c": lambda: [{"_source": "c", "id": 3}], + }, + concurrent=False, + ) + + assert [item["_source"] for item in result.items] == ["a", "c"] + assert list(result.sources) == ["a", "b", "c"] + assert result.sources["a"].status == "ok" + assert result.sources["b"].status == "failed" + assert result.sources["b"].http_status == 503 + assert result.sources["b"].reason == "upstream-error" + assert result.all_failed is False + + def test_all_failed_is_true_only_when_no_source_succeeds(self): + from animedex.agg._fanout import fanout + from animedex.models.common import ApiError + + result = fanout( + { + "a": lambda: (_ for _ in ()).throw(ApiError("a 503", backend="a", reason="upstream-error")), + "b": lambda: (_ for _ in ()).throw(ApiError("b 503", backend="b", reason="upstream-error")), + }, + concurrent=False, + ) + + assert result.items == [] + assert result.all_failed is True + assert set(result.failed_sources()) == {"a", "b"} + + def test_source_allowlist_preserves_available_order(self): + from animedex.agg._fanout import select_sources + + assert select_sources(["anilist", "jikan", "kitsu"], "kitsu,anilist") == ["anilist", "kitsu"] + + def test_source_allowlist_rejects_unknown_names(self): + from animedex.agg._fanout import select_sources + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="unknown source") as excinfo: + select_sources(["anilist", "jikan"], "anilist,nope") + assert excinfo.value.reason == "bad-args" diff --git a/test/agg/test_prefix_id.py b/test/agg/test_prefix_id.py new file mode 100644 index 0000000..7b7beba --- /dev/null +++ b/test/agg/test_prefix_id.py @@ -0,0 +1,52 @@ +"""Tests for aggregate prefix-encoded entity references.""" + +from __future__ import annotations + +import pytest + + +pytestmark = pytest.mark.unittest + + +class TestPrefixIds: + def test_parse_supported_prefixes(self): + from animedex.agg._prefix_id import parse + + assert parse("anilist:154587").backend == "anilist" + assert parse("mal:52991").backend == "jikan" + assert parse("myanimelist:52991").backend == "jikan" + assert parse("mangadex:dc8bbc4c-eb7a-4d27-b96a-9aa8c8db4adb").backend == "mangadex" + + def test_rejects_unknown_prefix(self): + from animedex.agg._prefix_id import parse + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="unknown prefix") as excinfo: + parse("badprefix:1") + assert excinfo.value.reason == "bad-args" + + def test_rejects_bad_numeric_id_before_http(self): + from animedex.agg._prefix_id import parse + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="ID is not numeric") as excinfo: + parse("anilist:abc") + assert excinfo.value.backend == "anilist" + assert excinfo.value.reason == "bad-args" + + def test_anidb_is_deferred_explicitly(self): + from animedex.agg._prefix_id import parse + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="AniDB high-level helpers are not shipped yet") as excinfo: + parse("anidb:42") + assert excinfo.value.backend == "anidb" + assert excinfo.value.reason == "auth-required" + + def test_prefix_for_backend(self): + from animedex.agg._prefix_id import prefix_for_backend + + assert prefix_for_backend("jikan", 52991) == "mal:52991" + assert prefix_for_backend("anilist", 154587) == "anilist:154587" + assert prefix_for_backend("unknown", 1) is None + assert prefix_for_backend("anilist", None) is None diff --git a/test/agg/test_search_show.py b/test/agg/test_search_show.py new file mode 100644 index 0000000..82d69bd --- /dev/null +++ b/test/agg/test_search_show.py @@ -0,0 +1,98 @@ +"""Tests for aggregate search/show Python API helpers.""" + +from __future__ import annotations + +import re +from pathlib import Path +from urllib.parse import urlsplit + +import pytest +import responses +import yaml + + +pytestmark = pytest.mark.unittest + +FIXTURES = Path(__file__).resolve().parents[2] / "test" / "fixtures" +_STRIP_HEADERS = {"content-encoding", "content-length", "transfer-encoding"} + + +@pytest.fixture +def fake_clock(monkeypatch): + """Freeze HTTP-adjacent clocks.""" + from datetime import datetime, timezone + + state = {"rl_now": 0.0, "cache_now": datetime(2026, 5, 11, tzinfo=timezone.utc)} + monkeypatch.setattr("animedex.transport.ratelimit._monotonic", lambda: state["rl_now"]) + monkeypatch.setattr( + "animedex.transport.ratelimit._sleep", + lambda s: state.update({"rl_now": state["rl_now"] + s}), + ) + monkeypatch.setattr("animedex.cache.sqlite._utcnow", lambda: state["cache_now"]) + return state + + +def _load_fixture(rel_path: str) -> dict: + return yaml.safe_load((FIXTURES / rel_path).read_text(encoding="utf-8")) + + +def _register_fixture_path_only(rsps: responses.RequestsMock, fixture: dict) -> None: + req = fixture["request"] + resp = fixture["response"] + parsed = urlsplit(req["url"]) + base = f"{parsed.scheme}://{parsed.netloc}{parsed.path}" + url_re = re.compile(re.escape(base) + r"(\?.*)?$") + headers = {k: v for k, v in (resp.get("headers") or {}).items() if k.lower() not in _STRIP_HEADERS} + kwargs = {"status": resp["status"], "headers": headers} + if resp.get("body_json") is not None: + kwargs["json"] = resp["body_json"] + elif resp.get("body_text") is not None: + kwargs["body"] = resp["body_text"] + elif resp.get("body_b64") is not None: + import base64 + + kwargs["body"] = base64.b64decode(resp["body_b64"]) + rsps.add(responses.Response(method=req["method"].upper(), url=url_re, **kwargs)) + + +class TestAggregateSearch: + def test_annotates_real_rich_rows_with_source_and_prefix_id(self, fake_clock): + from animedex.agg.search import search + + fixture = _load_fixture("jikan/anime_search/17-frieren-tv-limit2.yaml") + with responses.RequestsMock() as rsps: + _register_fixture_path_only(rsps, fixture) + result = search("anime", "Frieren", limit=2, source="jikan", no_cache=True) + + assert result.sources["jikan"].status == "ok" + assert len(result.items) == 2 + assert result.items[0]._source == "jikan" + assert result.items[0]._prefix_id.startswith("mal:") + assert result.items[0].mal_id is not None + + def test_rejects_bad_limit(self): + from animedex.agg.search import search + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="limit must be >= 1") as excinfo: + search("anime", "Frieren", limit=0) + assert excinfo.value.reason == "bad-args" + + +class TestAggregateShow: + def test_rejects_unsupported_pair_before_http(self): + from animedex.agg.show import show + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="type 'publisher' is not supported by backend 'anilist'") as excinfo: + show("publisher", "anilist:1") + assert excinfo.value.reason == "bad-args" + + def test_deferred_anidb_prefix_is_typed(self): + from animedex.agg.show import show + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="AniDB high-level helpers are not shipped yet") as excinfo: + show("anime", "anidb:42") + assert excinfo.value.backend == "anidb" + assert excinfo.value.reason == "auth-required" diff --git a/test/agg/test_type_routes.py b/test/agg/test_type_routes.py new file mode 100644 index 0000000..a682dfc --- /dev/null +++ b/test/agg/test_type_routes.py @@ -0,0 +1,49 @@ +"""Tests for aggregate entity type routing.""" + +from __future__ import annotations + +import pytest + + +pytestmark = pytest.mark.unittest + + +class TestTypeRoutes: + @pytest.mark.parametrize( + "entity_type,expected", + [ + ("anime", {"anilist", "ann", "jikan", "kitsu", "shikimori"}), + ("manga", {"anilist", "jikan", "kitsu", "mangadex", "shikimori"}), + ("character", {"anilist", "jikan", "kitsu", "shikimori"}), + ("person", {"anilist", "jikan", "kitsu", "shikimori"}), + ("studio", {"anilist", "jikan", "kitsu", "shikimori"}), + ("publisher", {"shikimori"}), + ], + ) + def test_search_backends_cover_supported_sources(self, entity_type, expected): + from animedex.agg._type_routes import backends_for_type + + assert set(backends_for_type(entity_type)) == expected + + def test_validate_entity_type_lists_supported_types(self): + from animedex.agg._type_routes import validate_entity_type + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="supported types: anime, manga, character, person, studio, publisher"): + validate_entity_type("badtype") + + def test_show_route_rejects_unsupported_pair_before_http(self): + from animedex.agg._type_routes import show_route_for + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="supported backends: shikimori") as excinfo: + show_route_for("publisher", "anilist") + assert excinfo.value.reason == "bad-args" + + def test_mangadex_show_route_uses_uuid_string_id(self): + from animedex.agg._type_routes import show_route_for + + route = show_route_for("manga", "mangadex") + + assert route.function_name == "show" + assert route.id_arg == "id" diff --git a/test/entry/test_search.py b/test/entry/test_search.py new file mode 100644 index 0000000..63465f0 --- /dev/null +++ b/test/entry/test_search.py @@ -0,0 +1,221 @@ +"""CLI tests for the top-level ``animedex search`` command.""" + +from __future__ import annotations + +import json +import re +from pathlib import Path +from urllib.parse import urlsplit + +import pytest +import responses +import yaml + + +pytestmark = pytest.mark.unittest + +FIXTURES = Path(__file__).resolve().parents[2] / "test" / "fixtures" +_STRIP_HEADERS = {"content-encoding", "content-length", "transfer-encoding"} + + +@pytest.fixture +def cli_runner(): + from click.testing import CliRunner + + return CliRunner() + + +@pytest.fixture +def cli(): + from animedex.entry import animedex_cli + + return animedex_cli + + +@pytest.fixture +def force_tty(monkeypatch): + import click.testing + + monkeypatch.setattr(click.testing._NamedTextIOWrapper, "isatty", lambda self: True, raising=False) + + +@pytest.fixture +def fake_clock(monkeypatch): + """Freeze HTTP-adjacent clocks.""" + from datetime import datetime, timezone + + state = {"rl_now": 0.0, "cache_now": datetime(2026, 5, 11, tzinfo=timezone.utc)} + monkeypatch.setattr("animedex.transport.ratelimit._monotonic", lambda: state["rl_now"]) + monkeypatch.setattr( + "animedex.transport.ratelimit._sleep", + lambda s: state.update({"rl_now": state["rl_now"] + s}), + ) + monkeypatch.setattr("animedex.cache.sqlite._utcnow", lambda: state["cache_now"]) + return state + + +def _load_fixture(rel_path: str) -> dict: + return yaml.safe_load((FIXTURES / rel_path).read_text(encoding="utf-8")) + + +def _register_fixture_path_only(rsps: responses.RequestsMock, fixture: dict) -> None: + req = fixture["request"] + resp = fixture["response"] + parsed = urlsplit(req["url"]) + base = f"{parsed.scheme}://{parsed.netloc}{parsed.path}" + url_re = re.compile(re.escape(base) + r"(\?.*)?$") + headers = {k: v for k, v in (resp.get("headers") or {}).items() if k.lower() not in _STRIP_HEADERS} + kwargs = {"status": resp["status"], "headers": headers} + if resp.get("body_json") is not None: + kwargs["json"] = resp["body_json"] + elif resp.get("body_text") is not None: + kwargs["body"] = resp["body_text"] + elif resp.get("body_b64") is not None: + import base64 + + kwargs["body"] = base64.b64decode(resp["body_b64"]) + rsps.add(responses.Response(method=req["method"].upper(), url=url_re, **kwargs)) + + +def _register_many(rsps: responses.RequestsMock, fixture_rels: list[str]) -> None: + for rel in fixture_rels: + _register_fixture_path_only(rsps, _load_fixture(rel)) + + +ANIME_SEARCH_FIXTURES = [ + "anilist/search/01-search-frieren.yaml", + "ann/substring_search/01-frieren.yaml", + "jikan/anime_search/17-frieren-tv-limit2.yaml", + "kitsu/anime_search/17-frieren-limit2.yaml", + "shikimori/animes_search/17-frieren-limit2.yaml", +] + + +class TestSearchCli: + def test_anime_search_json_reports_every_source(self, cli_runner, cli, fake_clock): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_many(rsps, ANIME_SEARCH_FIXTURES) + result = cli_runner.invoke(cli, ["search", "anime", "Frieren", "--limit", "5", "--json", "--no-cache"]) + + assert result.exit_code == 0, result.output + decoded = json.loads(result.output) + assert set(decoded["sources"]) == {"anilist", "ann", "jikan", "kitsu", "shikimori"} + assert {row["_source"] for row in decoded["items"]} >= {"anilist", "ann", "jikan", "kitsu", "shikimori"} + assert all("_prefix_id" in row for row in decoded["items"]) + assert decoded["_meta"]["sources_consulted"] == ["anilist", "ann", "jikan", "kitsu", "shikimori"] + + def test_default_tty_renders_compact_rows(self, cli_runner, cli, fake_clock, force_tty): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_many(rsps, ANIME_SEARCH_FIXTURES) + result = cli_runner.invoke(cli, ["search", "anime", "Frieren", "--limit", "5", "--no-cache"]) + + assert result.exit_code == 0, result.output + assert "Aggregate results" in result.output + assert "[src: anilist]" in result.output + assert "[src: jikan]" in result.output + assert "anilist:" in result.output + assert not result.output.lstrip().startswith("{") + + def test_source_allowlist_limits_fanout(self, cli_runner, cli, fake_clock): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_many( + rsps, + [ + "anilist/search/01-search-frieren.yaml", + "jikan/anime_search/17-frieren-tv-limit2.yaml", + ], + ) + result = cli_runner.invoke( + cli, + ["search", "anime", "Frieren", "--limit", "2", "--source", "anilist,jikan", "--json", "--no-cache"], + ) + + assert result.exit_code == 0, result.output + decoded = json.loads(result.output) + assert set(decoded["sources"]) == {"anilist", "jikan"} + assert {row["_source"] for row in decoded["items"]} <= {"anilist", "jikan"} + + @pytest.mark.parametrize( + "entity_type,query,source,fixture_rel", + [ + ("manga", "Berserk", "mangadex", "mangadex/manga_search/01-berserk.yaml"), + ("character", "Frieren", "shikimori", "shikimori/characters_search/02-frieren-limit2.yaml"), + ("person", "Miyazaki", "shikimori", "shikimori/people_search/02-miyazaki-limit2.yaml"), + ("studio", "Ghibli", "kitsu", "kitsu/producers/02-ghibli-limit2.yaml"), + ("publisher", "Kodansha", "shikimori", "shikimori/publishers/03-kodansha-limit1000.yaml"), + ], + ) + def test_type_source_combinations_use_real_fixtures( + self, cli_runner, cli, fake_clock, entity_type, query, source, fixture_rel + ): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_fixture_path_only(rsps, _load_fixture(fixture_rel)) + result = cli_runner.invoke( + cli, + ["search", entity_type, query, "--limit", "2", "--source", source, "--json", "--no-cache"], + ) + + assert result.exit_code == 0, result.output + decoded = json.loads(result.output) + assert set(decoded["sources"]) == {source} + assert decoded["sources"][source]["status"] == "ok" + assert all(row["_source"] == source for row in decoded["items"]) + + def test_partial_failure_keeps_healthy_sources_and_reports_stderr(self, cli_runner, cli, fake_clock): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_many( + rsps, + [ + "ann/substring_search/17-synthetic-503.yaml", + "jikan/anime_search/17-frieren-tv-limit2.yaml", + "kitsu/anime_search/17-frieren-limit2.yaml", + "shikimori/animes_search/17-frieren-limit2.yaml", + ], + ) + result = cli_runner.invoke( + cli, + [ + "search", + "anime", + "Frieren", + "--limit", + "2", + "--source", + "ann,jikan,kitsu,shikimori", + "--json", + "--no-cache", + ], + ) + + assert result.exit_code == 0, result.output + assert "source 'ann' failed" in result.stderr + decoded = json.loads(result.stdout) + assert decoded["sources"]["ann"]["status"] == "failed" + assert decoded["sources"]["ann"]["http_status"] == 503 + assert {row["_source"] for row in decoded["items"]} == {"jikan", "kitsu", "shikimori"} + + def test_total_failure_exits_nonzero_with_empty_envelope(self, cli_runner, cli, fake_clock): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_fixture_path_only(rsps, _load_fixture("ann/substring_search/17-synthetic-503.yaml")) + result = cli_runner.invoke( + cli, + ["search", "anime", "Frieren", "--source", "ann", "--json", "--no-cache"], + ) + + assert result.exit_code == 1, result.output + decoded = json.loads(result.stdout) + assert decoded["items"] == [] + assert decoded["sources"]["ann"]["status"] == "failed" + + def test_bad_type_is_clean_click_error(self, cli_runner, cli): + result = cli_runner.invoke(cli, ["search", "badtype", "x", "--json", "--no-cache"]) + + assert result.exit_code != 0 + assert "unknown type" in result.output + assert "supported types" in result.output + + def test_missing_type_uses_click_argument_error(self, cli_runner, cli): + result = cli_runner.invoke(cli, ["search"]) + + assert result.exit_code != 0 + assert "Missing argument 'TYPE'" in result.output diff --git a/test/entry/test_show.py b/test/entry/test_show.py new file mode 100644 index 0000000..b923d2d --- /dev/null +++ b/test/entry/test_show.py @@ -0,0 +1,146 @@ +"""CLI tests for the top-level ``animedex show`` command.""" + +from __future__ import annotations + +import json +import re +from pathlib import Path +from urllib.parse import urlsplit + +import pytest +import responses +import yaml + + +pytestmark = pytest.mark.unittest + +FIXTURES = Path(__file__).resolve().parents[2] / "test" / "fixtures" +_STRIP_HEADERS = {"content-encoding", "content-length", "transfer-encoding"} + + +@pytest.fixture +def cli_runner(): + from click.testing import CliRunner + + return CliRunner() + + +@pytest.fixture +def cli(): + from animedex.entry import animedex_cli + + return animedex_cli + + +@pytest.fixture +def force_tty(monkeypatch): + import click.testing + + monkeypatch.setattr(click.testing._NamedTextIOWrapper, "isatty", lambda self: True, raising=False) + + +@pytest.fixture +def fake_clock(monkeypatch): + """Freeze HTTP-adjacent clocks.""" + from datetime import datetime, timezone + + state = {"rl_now": 0.0, "cache_now": datetime(2026, 5, 11, tzinfo=timezone.utc)} + monkeypatch.setattr("animedex.transport.ratelimit._monotonic", lambda: state["rl_now"]) + monkeypatch.setattr( + "animedex.transport.ratelimit._sleep", + lambda s: state.update({"rl_now": state["rl_now"] + s}), + ) + monkeypatch.setattr("animedex.cache.sqlite._utcnow", lambda: state["cache_now"]) + return state + + +def _load_fixture(rel_path: str) -> dict: + return yaml.safe_load((FIXTURES / rel_path).read_text(encoding="utf-8")) + + +def _register_fixture_path_only(rsps: responses.RequestsMock, fixture: dict) -> None: + req = fixture["request"] + resp = fixture["response"] + parsed = urlsplit(req["url"]) + base = f"{parsed.scheme}://{parsed.netloc}{parsed.path}" + url_re = re.compile(re.escape(base) + r"(\?.*)?$") + headers = {k: v for k, v in (resp.get("headers") or {}).items() if k.lower() not in _STRIP_HEADERS} + kwargs = {"status": resp["status"], "headers": headers} + if resp.get("body_json") is not None: + kwargs["json"] = resp["body_json"] + elif resp.get("body_text") is not None: + kwargs["body"] = resp["body_text"] + elif resp.get("body_b64") is not None: + import base64 + + kwargs["body"] = base64.b64decode(resp["body_b64"]) + rsps.add(responses.Response(method=req["method"].upper(), url=url_re, **kwargs)) + + +class TestShowCli: + @pytest.mark.parametrize( + "argv,fixture_rel,expected_backend", + [ + (["show", "anime", "anilist:154587"], "anilist/media/01-media-frieren.yaml", "anilist"), + (["show", "anime", "mal:52991"], "jikan/anime_full/01-frieren-52991.yaml", "jikan"), + (["show", "anime", "jikan:52991"], "jikan/anime_full/01-frieren-52991.yaml", "jikan"), + ( + ["show", "manga", "mangadex:801513ba-a712-498c-8f57-cae55b38cc92"], + "mangadex/manga_by_id/02-berserk.yaml", + "mangadex", + ), + ( + ["show", "character", "shikimori:184947"], + "shikimori/characters_by_id/01-frieren-184947.yaml", + "shikimori", + ), + (["show", "person", "shikimori:1870"], "shikimori/people_by_id/01-hayao-miyazaki-1870.yaml", "shikimori"), + (["show", "studio", "shikimori:2"], "shikimori/studios/02-all-limit-1000.yaml", "shikimori"), + (["show", "publisher", "shikimori:16"], "shikimori/publishers/02-all-limit-1000.yaml", "shikimori"), + ], + ) + def test_show_json_routes_prefixes_to_backends( + self, cli_runner, cli, fake_clock, argv, fixture_rel, expected_backend + ): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_fixture_path_only(rsps, _load_fixture(fixture_rel)) + result = cli_runner.invoke(cli, [*argv, "--json", "--no-cache"]) + + assert result.exit_code == 0, result.output + decoded = json.loads(result.output) + assert expected_backend in decoded["_meta"]["sources_consulted"] + + def test_show_default_tty_renders_source_marker(self, cli_runner, cli, fake_clock, force_tty): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_fixture_path_only(rsps, _load_fixture("jikan/anime_full/01-frieren-52991.yaml")) + result = cli_runner.invoke(cli, ["show", "anime", "mal:52991", "--no-cache"]) + + assert result.exit_code == 0, result.output + assert "[src: jikan]" in result.output + assert "Frieren" in result.output + assert not result.output.lstrip().startswith("{") + + @pytest.mark.parametrize( + "argv,expected", + [ + (["show", "publisher", "anilist:1"], "type 'publisher' is not supported by backend 'anilist'"), + (["show", "anime", "badprefix:1"], "unknown prefix"), + (["show", "anime", "anidb:42"], "AniDB high-level helpers are not shipped yet"), + (["show", "anime", "anilist:abc"], "ID is not numeric for backend 'anilist'"), + ], + ) + def test_show_rejects_invalid_references_before_http(self, cli_runner, cli, argv, expected): + with responses.RequestsMock(assert_all_requests_are_fired=True) as rsps: + result = cli_runner.invoke(cli, [*argv, "--json", "--no-cache"]) + + assert len(rsps.calls) == 0 + assert result.exit_code != 0 + assert expected in result.output + + def test_upstream_error_propagates_cleanly(self, cli_runner, cli, fake_clock): + with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: + _register_fixture_path_only(rsps, _load_fixture("jikan/anime_full_errors/01-upstream-error.yaml")) + result = cli_runner.invoke(cli, ["show", "anime", "mal:9999999999", "--json", "--no-cache"]) + + assert result.exit_code != 0 + assert "upstream-error" in result.output or "upstream-error" in result.stderr diff --git a/test/fixtures/anilist/graphql/23-search-frieren-type-anime.yaml b/test/fixtures/anilist/graphql/23-search-frieren-type-anime.yaml new file mode 100644 index 0000000..731d076 --- /dev/null +++ b/test/fixtures/anilist/graphql/23-search-frieren-type-anime.yaml @@ -0,0 +1,57 @@ +metadata: + captured_at: '2026-05-11T08:09:34Z' + label: search-frieren-type-anime + backend: anilist + path_slug: graphql +request: + method: POST + url: https://graphql.anilist.co/ + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: + query: 'query ($q: String, $page: Int, $perPage: Int, $type: MediaType) { Page(page: $page, perPage: $perPage) { pageInfo + { total currentPage hasNextPage perPage } media(search: $q, type: $type, sort: SEARCH_MATCH) { id idMal title { romaji + english native } type format status episodes season seasonYear averageScore popularity isAdult coverImage { large color + } } } }' + variables: + q: Frieren + page: 1 + perPage: 2 + type: ANIME + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:33 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Server: cloudflare + Nel: + Cache-Control: no-cache, private + X-RateLimit-Limit: '30' + X-RateLimit-Remaining: '29' + Set-Cookie: + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Authorization,Accept,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range + Access-Control-Expose-Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Content-Length, Content-Range + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + Page: + pageInfo: + total: 0 + currentPage: 1 + hasNextPage: false + perPage: 2 + media: [] + body_text: null + body_b64: null diff --git a/test/fixtures/anilist/graphql/24-search-berserk-type-manga.yaml b/test/fixtures/anilist/graphql/24-search-berserk-type-manga.yaml new file mode 100644 index 0000000..44a5593 --- /dev/null +++ b/test/fixtures/anilist/graphql/24-search-berserk-type-manga.yaml @@ -0,0 +1,57 @@ +metadata: + captured_at: '2026-05-11T08:09:34Z' + label: search-berserk-type-manga + backend: anilist + path_slug: graphql +request: + method: POST + url: https://graphql.anilist.co/ + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: + query: 'query ($q: String, $page: Int, $perPage: Int, $type: MediaType) { Page(page: $page, perPage: $perPage) { pageInfo + { total currentPage hasNextPage perPage } media(search: $q, type: $type, sort: SEARCH_MATCH) { id idMal title { romaji + english native } type format status episodes season seasonYear averageScore popularity isAdult coverImage { large color + } } } }' + variables: + q: Berserk + page: 1 + perPage: 2 + type: MANGA + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:34 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Server: cloudflare + Nel: + Cache-Control: no-cache, private + X-RateLimit-Limit: '30' + X-RateLimit-Remaining: '28' + Set-Cookie: + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Authorization,Accept,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range + Access-Control-Expose-Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Content-Length, Content-Range + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + Page: + pageInfo: + total: 0 + currentPage: 1 + hasNextPage: false + perPage: 2 + media: [] + body_text: null + body_b64: null diff --git a/test/fixtures/anilist/graphql/25-character-search-frieren.yaml b/test/fixtures/anilist/graphql/25-character-search-frieren.yaml new file mode 100644 index 0000000..b235ebc --- /dev/null +++ b/test/fixtures/anilist/graphql/25-character-search-frieren.yaml @@ -0,0 +1,50 @@ +metadata: + captured_at: '2026-05-11T08:09:36Z' + label: character-search-frieren + backend: anilist + path_slug: graphql +request: + method: POST + url: https://graphql.anilist.co/ + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: + query: 'query ($q: String, $perPage: Int) { Page(page: 1, perPage: $perPage) { pageInfo { total } characters(search: $q, + sort: FAVOURITES_DESC) { id name { full native alternative } image { large medium } gender favourites } } }' + variables: + q: Frieren + perPage: 2 + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:36 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Server: cloudflare + Nel: + Cache-Control: no-cache, private + X-RateLimit-Limit: '30' + X-RateLimit-Remaining: '27' + Set-Cookie: + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Authorization,Accept,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range + Access-Control-Expose-Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Content-Length, Content-Range + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + Page: + pageInfo: + total: 0 + characters: [] + body_text: null + body_b64: null diff --git a/test/fixtures/anilist/graphql/26-staff-search-yamada.yaml b/test/fixtures/anilist/graphql/26-staff-search-yamada.yaml new file mode 100644 index 0000000..643e1c7 --- /dev/null +++ b/test/fixtures/anilist/graphql/26-staff-search-yamada.yaml @@ -0,0 +1,50 @@ +metadata: + captured_at: '2026-05-11T08:09:36Z' + label: staff-search-yamada + backend: anilist + path_slug: graphql +request: + method: POST + url: https://graphql.anilist.co/ + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: + query: 'query ($q: String, $perPage: Int) { Page(page: 1, perPage: $perPage) { pageInfo { total } staff(search: $q, sort: + FAVOURITES_DESC) { id name { full native alternative } primaryOccupations image { large medium } } } }' + variables: + q: Yamada + perPage: 2 + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:36 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Server: cloudflare + Nel: + Cache-Control: no-cache, private + X-RateLimit-Limit: '30' + X-RateLimit-Remaining: '26' + Set-Cookie: + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Authorization,Accept,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range + Access-Control-Expose-Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Content-Length, Content-Range + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + Page: + pageInfo: + total: 0 + staff: [] + body_text: null + body_b64: null diff --git a/test/fixtures/anilist/graphql/27-studio-search-madhouse.yaml b/test/fixtures/anilist/graphql/27-studio-search-madhouse.yaml new file mode 100644 index 0000000..79d5478 --- /dev/null +++ b/test/fixtures/anilist/graphql/27-studio-search-madhouse.yaml @@ -0,0 +1,50 @@ +metadata: + captured_at: '2026-05-11T08:09:37Z' + label: studio-search-madhouse + backend: anilist + path_slug: graphql +request: + method: POST + url: https://graphql.anilist.co/ + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: + query: 'query ($q: String, $perPage: Int) { Page(page: 1, perPage: $perPage) { pageInfo { total } studios(search: $q) + { id name isAnimationStudio } } }' + variables: + q: Madhouse + perPage: 2 + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:37 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Server: cloudflare + Nel: + Cache-Control: no-cache, private + X-RateLimit-Limit: '30' + X-RateLimit-Remaining: '25' + Set-Cookie: + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Authorization,Accept,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range + Access-Control-Expose-Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Content-Length, Content-Range + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + Page: + pageInfo: + total: 0 + studios: [] + body_text: null + body_b64: null diff --git a/test/fixtures/anilist/graphql/28-manga-search-berserk.yaml b/test/fixtures/anilist/graphql/28-manga-search-berserk.yaml new file mode 100644 index 0000000..0b84c4e --- /dev/null +++ b/test/fixtures/anilist/graphql/28-manga-search-berserk.yaml @@ -0,0 +1,57 @@ +metadata: + captured_at: '2026-05-11T08:09:37Z' + label: manga-search-berserk + backend: anilist + path_slug: graphql +request: + method: POST + url: https://graphql.anilist.co/ + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: + query: 'query ($q: String, $page: Int, $perPage: Int, $type: MediaType) { Page(page: $page, perPage: $perPage) { pageInfo + { total currentPage hasNextPage perPage } media(search: $q, type: $type, sort: SEARCH_MATCH) { id idMal title { romaji + english native } type format status episodes season seasonYear averageScore popularity isAdult coverImage { large color + } } } }' + variables: + q: Berserk + page: 1 + perPage: 2 + type: MANGA + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:37 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Server: cloudflare + Nel: + Cache-Control: no-cache, private + X-RateLimit-Limit: '30' + X-RateLimit-Remaining: '24' + Set-Cookie: + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Authorization,Accept,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range + Access-Control-Expose-Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Content-Length, Content-Range + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + Page: + pageInfo: + total: 0 + currentPage: 1 + hasNextPage: false + perPage: 2 + media: [] + body_text: null + body_b64: null diff --git a/test/fixtures/anilist/search/01-search-frieren.yaml b/test/fixtures/anilist/search/01-search-frieren.yaml index ca22ffa..0e7aa84 100644 --- a/test/fixtures/anilist/search/01-search-frieren.yaml +++ b/test/fixtures/anilist/search/01-search-frieren.yaml @@ -11,23 +11,12 @@ request: User-Agent: animedex/0.0.1 params: null json_body: - query: |- - query ($q: String, $page: Int, $perPage: Int) { - Page(page: $page, perPage: $perPage) { - pageInfo { total currentPage hasNextPage perPage } - media(search: $q, type: ANIME, sort: SEARCH_MATCH) { - id idMal - title { romaji english native } - type format status episodes - season seasonYear averageScore popularity isAdult - coverImage { large color } - } - } - } + query: "query ($q: String, $page: Int, $perPage: Int, $type: MediaType) {\n Page(page: $page, perPage: $perPage) {\n pageInfo { total currentPage hasNextPage perPage }\n media(search: $q, type: $type, sort: SEARCH_MATCH) {\n id idMal\n title { romaji english native }\n type format status episodes\n season seasonYear averageScore popularity isAdult\n coverImage { large color }\n }\n }\n}" variables: q: Frieren page: 1 perPage: 5 + type: ANIME raw_body_b64: null response: status: 200 diff --git a/test/fixtures/ann/substring_search/17-synthetic-503.yaml b/test/fixtures/ann/substring_search/17-synthetic-503.yaml new file mode 100644 index 0000000..332272c --- /dev/null +++ b/test/fixtures/ann/substring_search/17-synthetic-503.yaml @@ -0,0 +1,21 @@ +metadata: + captured_at: '2026-05-11T07:30:00Z' + label: synthetic-503 + backend: ann + path_slug: substring_search + synthetic: true +request: + method: GET + url: https://cdn.animenewsnetwork.com/encyclopedia/api.xml?anime=~Frieren + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 503 + headers: + Content-Type: text/xml;charset=UTF-8 + body_json: null + body_text: 'synthetic unavailable' + body_b64: null diff --git a/test/fixtures/jikan/anime_full_errors/01-upstream-error.yaml b/test/fixtures/jikan/anime_full_errors/01-upstream-error.yaml new file mode 100644 index 0000000..5afaf26 --- /dev/null +++ b/test/fixtures/jikan/anime_full_errors/01-upstream-error.yaml @@ -0,0 +1,36 @@ +metadata: + captured_at: '2026-05-11T10:08:00Z' + label: upstream-error + backend: jikan + path_slug: anime_full_errors + synthetic: true +request: + method: GET + url: https://api.jikan.moe/v4/anime/9999999999/full + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 500 + headers: + Server: nginx/1.24.0 + Date: Thu, 07 May 2026 11:02:19 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Cache-Control: must-revalidate, private + pragma: no-cache + expires: '-1' + access-control-allow-origin: '*' + Content-Encoding: gzip + Vary: Accept-Encoding + body_json: + status: 500 + type: UpstreamException + message: Request to MyAnimeList.net failed. MyAnimeList.net may be down/unavailable, refuses to connect or took too long + to respond. Please try again later. + error: Unsupported response code in HTTP response for "https://myanimelist.net/anime/9999999999/". + body_text: null + body_b64: null diff --git a/test/fixtures/jikan/anime_search/17-frieren-tv-limit2.yaml b/test/fixtures/jikan/anime_search/17-frieren-tv-limit2.yaml new file mode 100644 index 0000000..55828c8 --- /dev/null +++ b/test/fixtures/jikan/anime_search/17-frieren-tv-limit2.yaml @@ -0,0 +1,229 @@ +metadata: + captured_at: '2026-05-11T08:09:38Z' + label: frieren-tv-limit2 + backend: jikan + path_slug: anime_search +request: + method: GET + url: https://api.jikan.moe/v4/anime?q=Frieren&limit=2&page=1 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: nginx/1.24.0 + Date: Mon, 11 May 2026 08:09:38 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Cache-Control: must-revalidate, private + pragma: no-cache + expires: '-1' + access-control-allow-origin: '*' + Content-Encoding: gzip + Vary: Accept-Encoding + X-Cache-Status: HIT + X-Powered-By: the-power-of-friendship + body_json: + pagination: + last_visible_page: 4 + has_next_page: true + current_page: 1 + items: + count: 2 + total: 8 + per_page: 2 + data: + - mal_id: 63816 + url: https://myanimelist.net/anime/63816/Sousou_no_Frieren__Ougonkyou-hen + images: + jpg: + image_url: https://myanimelist.net/images/anime/1619/156313.jpg + small_image_url: https://myanimelist.net/images/anime/1619/156313t.jpg + large_image_url: https://myanimelist.net/images/anime/1619/156313l.jpg + webp: + image_url: https://myanimelist.net/images/anime/1619/156313.webp + small_image_url: https://myanimelist.net/images/anime/1619/156313t.webp + large_image_url: https://myanimelist.net/images/anime/1619/156313l.webp + trailer: + youtube_id: null + url: null + embed_url: null + images: + image_url: null + small_image_url: null + medium_image_url: null + large_image_url: null + maximum_image_url: null + approved: true + titles: + - type: Default + title: 'Sousou no Frieren: Ougonkyou-hen' + - type: Synonym + title: Frieren at the Funeral Season 3 + - type: Japanese + title: 葬送のフリーレン 黄金郷編 + - type: English + title: 'Frieren: Beyond Journey''s End - Golden Land Arc' + title: 'Sousou no Frieren: Ougonkyou-hen' + title_english: 'Frieren: Beyond Journey''s End - Golden Land Arc' + title_japanese: 葬送のフリーレン 黄金郷編 + title_synonyms: + - Frieren at the Funeral Season 3 + type: TV + source: Manga + episodes: null + status: Not yet aired + airing: false + aired: + from: '2027-10-01T00:00:00+00:00' + to: null + prop: + from: + day: 1 + month: 10 + year: 2027 + to: + day: null + month: null + year: null + string: Oct 2027 to ? + duration: Unknown + rating: PG-13 - Teens 13 or older + score: null + scored_by: null + rank: null + popularity: 2750 + members: 80389 + favorites: 178 + synopsis: Third season of Sousou no Frieren. + background: '' + season: fall + year: 2027 + broadcast: + day: null + time: null + timezone: null + string: Unknown + producers: [] + licensors: [] + studios: [] + genres: + - mal_id: 2 + type: anime + name: Adventure + url: https://myanimelist.net/anime/genre/2/Adventure + - mal_id: 8 + type: anime + name: Drama + url: https://myanimelist.net/anime/genre/8/Drama + - mal_id: 10 + type: anime + name: Fantasy + url: https://myanimelist.net/anime/genre/10/Fantasy + explicit_genres: [] + themes: [] + demographics: + - mal_id: 27 + type: anime + name: Shounen + url: https://myanimelist.net/anime/genre/27/Shounen + - mal_id: 63816 + url: https://myanimelist.net/anime/63816/Sousou_no_Frieren__Ougonkyou-hen + images: + jpg: + image_url: https://myanimelist.net/images/anime/1619/156313.jpg + small_image_url: https://myanimelist.net/images/anime/1619/156313t.jpg + large_image_url: https://myanimelist.net/images/anime/1619/156313l.jpg + webp: + image_url: https://myanimelist.net/images/anime/1619/156313.webp + small_image_url: https://myanimelist.net/images/anime/1619/156313t.webp + large_image_url: https://myanimelist.net/images/anime/1619/156313l.webp + trailer: + youtube_id: null + url: null + embed_url: null + images: + image_url: null + small_image_url: null + medium_image_url: null + large_image_url: null + maximum_image_url: null + approved: true + titles: + - type: Default + title: 'Sousou no Frieren: Ougonkyou-hen' + - type: Synonym + title: Frieren at the Funeral Season 3 + - type: Japanese + title: 葬送のフリーレン 黄金郷編 + - type: English + title: 'Frieren: Beyond Journey''s End - Golden Land Arc' + title: 'Sousou no Frieren: Ougonkyou-hen' + title_english: 'Frieren: Beyond Journey''s End - Golden Land Arc' + title_japanese: 葬送のフリーレン 黄金郷編 + title_synonyms: + - Frieren at the Funeral Season 3 + type: TV + source: Manga + episodes: null + status: Not yet aired + airing: false + aired: + from: '2027-10-01T00:00:00+00:00' + to: null + prop: + from: + day: 1 + month: 10 + year: 2027 + to: + day: null + month: null + year: null + string: Oct 2027 to ? + duration: Unknown + rating: PG-13 - Teens 13 or older + score: null + scored_by: null + rank: null + popularity: 2750 + members: 80389 + favorites: 178 + synopsis: Third season of Sousou no Frieren. + background: '' + season: fall + year: 2027 + broadcast: + day: null + time: null + timezone: null + string: Unknown + producers: [] + licensors: [] + studios: [] + genres: + - mal_id: 2 + type: anime + name: Adventure + url: https://myanimelist.net/anime/genre/2/Adventure + - mal_id: 8 + type: anime + name: Drama + url: https://myanimelist.net/anime/genre/8/Drama + - mal_id: 10 + type: anime + name: Fantasy + url: https://myanimelist.net/anime/genre/10/Fantasy + explicit_genres: [] + themes: [] + demographics: + - mal_id: 27 + type: anime + name: Shounen + url: https://myanimelist.net/anime/genre/27/Shounen + body_text: null + body_b64: null diff --git a/test/fixtures/jikan/characters_search/02-frieren-limit2.yaml b/test/fixtures/jikan/characters_search/02-frieren-limit2.yaml new file mode 100644 index 0000000..7f5bdb9 --- /dev/null +++ b/test/fixtures/jikan/characters_search/02-frieren-limit2.yaml @@ -0,0 +1,81 @@ +metadata: + captured_at: '2026-05-11T08:09:40Z' + label: frieren-limit2 + backend: jikan + path_slug: characters_search +request: + method: GET + url: https://api.jikan.moe/v4/characters?q=Frieren&limit=2&page=1 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: nginx/1.24.0 + Date: Mon, 11 May 2026 08:09:39 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Cache-Control: must-revalidate, private + pragma: no-cache + expires: '-1' + access-control-allow-origin: '*' + Content-Encoding: gzip + Vary: Accept-Encoding + X-Cache-Status: HIT + X-Powered-By: the-power-of-friendship + body_json: + pagination: + last_visible_page: 8 + has_next_page: true + current_page: 1 + items: + count: 2 + total: 15 + per_page: 2 + data: + - mal_id: 184947 + url: https://myanimelist.net/character/184947/Frieren + images: + jpg: + image_url: https://myanimelist.net/images/characters/7/525105.jpg + webp: + image_url: https://myanimelist.net/images/characters/7/525105.webp + small_image_url: https://myanimelist.net/images/characters/7/525105t.webp + name: Frieren + name_kanji: フリーレン + nicknames: + - Frieren the Slayer + favorites: 31697 + about: |- + Frieren was a mage in Hero Himmel's party. They travelled along with Priest Heiter and Warrior Eisen in a ten-year journey to defeat the Demon King. She was the last member to be recruited to the party and, despite Heiter's initial impression of her mana being average, Himmel had a hunch she was the most powerful mage he had ever met. + + Being an elf that has lived for over a thousand years, Frieren has a hard time forming meaningful relationships with humans because of the difference in their lifespans and how they perceive the passage of time. This generally manifests itself as laziness, since missing an important event is of no importance as she will have plenty of opportunities to relive it in the future, or as a nearly sociopathic inability to comprehend human's feelings. For instance, she tends to not notice how her lack of impatience or cold statements can affect humans around her. Her party members have also frequently stated that they can't comprehend her feelings or read what goes on in her head. + + Despite being an extremely powerful mage, Frieren has the habit of collecting rare and daily usage centered magic, like magic that can polish a bronze statue or make flowers bloom. She always asks for a grimoire as a reward even if she already knows its contents or when it comes to The Great Mage Flamme's lost grimoires knows they are fakes. + + After the deaths of Hero Himmel and Priest Heiter, Frieren decided she wants to learn more about humans. She is currently traveling with Fern her pupil who was a war refugee left in her care by Priest Heiter in a quest to Ende, the place where souls reside in the northernmost tip of the continent and where the Demon King's Castle was built to try and speak to Himmel's soul. In her new journey, Frieren visits many places her old party travelled through in the past and relives memories, slowly understanding more about their meaning and her feelings. + + Ironically, Fern is generally the one to take care of Frieren in daily activities despite being far younger. + + + (Source: Frieren: Beyond Journey's End Wiki) + - mal_id: 239233 + url: https://myanimelist.net/character/239233/Reid_Frieden + images: + jpg: + image_url: https://myanimelist.net/img/sp/icon/apple-touch-icon-256.png + webp: + image_url: https://myanimelist.net/img/sp/icon/apple-touch-icon-256.png + small_image_url: https://myanimelist.net/img/sp/icon/apple-touch-icon-256.png + name: Reid Frieden + name_kanji: null + nicknames: + - Hero + favorites: 0 + about: null + body_text: null + body_b64: null diff --git a/test/fixtures/jikan/people_search/02-miyazaki-limit2.yaml b/test/fixtures/jikan/people_search/02-miyazaki-limit2.yaml new file mode 100644 index 0000000..b89c541 --- /dev/null +++ b/test/fixtures/jikan/people_search/02-miyazaki-limit2.yaml @@ -0,0 +1,75 @@ +metadata: + captured_at: '2026-05-11T08:09:41Z' + label: miyazaki-limit2 + backend: jikan + path_slug: people_search +request: + method: GET + url: https://api.jikan.moe/v4/people?q=Miyazaki&limit=2&page=1 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: nginx/1.24.0 + Date: Mon, 11 May 2026 08:09:41 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Cache-Control: must-revalidate, private + pragma: no-cache + expires: '-1' + access-control-allow-origin: '*' + Content-Encoding: gzip + Vary: Accept-Encoding + X-Cache-Status: HIT + X-Powered-By: the-power-of-friendship + body_json: + pagination: + last_visible_page: 32 + has_next_page: true + current_page: 1 + items: + count: 2 + total: 64 + per_page: 2 + data: + - mal_id: 92944 + url: https://myanimelist.net/people/92944/Erika_Miyazaki + website_url: null + images: + jpg: + image_url: https://myanimelist.net/images/voiceactors/1/88722.jpg + name: Erika Miyazaki + given_name: 恵里花 + family_name: 宮崎 + alternate_names: [] + birthday: null + favorites: 1 + about: |- + Birthplace: Chiba Prefecture + Hobby: Cleaning, aerobic exercise, reading manga + Special Skills: good at shopping + + She is a voice actress affiliated with M&I. + + Twitter: @_miyazaki_erika + Profile: Mand-i + - mal_id: 92149 + url: https://myanimelist.net/people/92149/Maho_Miyazaki + website_url: null + images: + jpg: + image_url: https://myanimelist.net/img/sp/icon/apple-touch-icon-256.png + name: Maho Miyazaki + given_name: 真帆 + family_name: 宮崎 + alternate_names: [] + birthday: null + favorites: 0 + about: null + body_text: null + body_b64: null diff --git a/test/fixtures/jikan/producers_search/02-aniplex-limit2.yaml b/test/fixtures/jikan/producers_search/02-aniplex-limit2.yaml new file mode 100644 index 0000000..b8e975a --- /dev/null +++ b/test/fixtures/jikan/producers_search/02-aniplex-limit2.yaml @@ -0,0 +1,76 @@ +metadata: + captured_at: '2026-05-11T08:09:42Z' + label: aniplex-limit2 + backend: jikan + path_slug: producers_search +request: + method: GET + url: https://api.jikan.moe/v4/producers?q=Aniplex&limit=2&page=1 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: nginx/1.24.0 + Date: Mon, 11 May 2026 08:09:42 GMT + Content-Type: application/json + Transfer-Encoding: chunked + Connection: keep-alive + Cache-Control: must-revalidate, private + pragma: no-cache + expires: '-1' + access-control-allow-origin: '*' + Content-Encoding: gzip + Vary: Accept-Encoding + X-Cache-Status: HIT + X-Powered-By: the-power-of-friendship + body_json: + pagination: + last_visible_page: 1 + has_next_page: false + current_page: 1 + items: + count: 2 + total: 2 + per_page: 2 + data: + - mal_id: 493 + url: https://myanimelist.net/anime/producer/493/Aniplex_of_America + titles: + - type: Default + title: Aniplex of America + - type: Japanese + title: Aniplex of America + images: + jpg: + image_url: https://cdn.myanimelist.net/s/common/company_logos/837c71b2-7f72-45b6-a962-4b2f8a6c44d4_600x600_i?s=6d8d6b7a16f67790ca739fc0c97e6aa7 + favorites: 354 + established: '2005-03-01T00:00:00+00:00' + about: |- + Aniplex of America, or Aniplex USA, is an anime distributor based in Santa Monica, California that serves as the American distribution enterprise of Aniplex, an entertainment company owned by Sony Music Entertainment Japan, where its goal is to reinforce the parent company's licensing business in the North American market. + + On May 6, 2025, Aniplex of America announced its arrival in Latin American territory through social media. + count: 274 + - mal_id: 17 + url: https://myanimelist.net/anime/producer/17/Aniplex + titles: + - type: Default + title: Aniplex + - type: Japanese + title: アニプレックス + images: + jpg: + image_url: https://cdn.myanimelist.net/s/common/company_logos/ba2241ea-7f83-45b6-9360-1f1d4de0d65a_600x600_i?s=369f1423117062ab3c7f4c7a90b2005a + favorites: 4498 + established: '1995-09-01T00:00:00+00:00' + about: |- + Aniplex is a diversified entertainment company operating worldwide with focus on the planning and production of anime video and music content, its distribution in theaters and broadcast syndication as well as their respective physical and digital products, development of related game apps and merchandise such as figurines and apparel, stage production of musicals and live events, and operating the digital store "Aniplex Online" which provides hand-picked items for sale. + Aniplex' fully-owned subsidiaries include the anime production A-1 Pictures, mobile game app developer Quatro A, and Aniplex of America which leads the animation business outside of Japan. + + (Source: Official Website) + count: 694 + body_text: null + body_b64: null diff --git a/test/fixtures/kitsu/anime_search/17-frieren-limit2.yaml b/test/fixtures/kitsu/anime_search/17-frieren-limit2.yaml new file mode 100644 index 0000000..48cdd3f --- /dev/null +++ b/test/fixtures/kitsu/anime_search/17-frieren-limit2.yaml @@ -0,0 +1,384 @@ +metadata: + captured_at: '2026-05-11T08:09:43Z' + label: frieren-limit2 + backend: kitsu + path_slug: anime_search +request: + method: GET + url: https://kitsu.io/api/edge/anime?filter[text]=Frieren&page[limit]=2&page[offset]=0 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:43 GMT + Content-Type: application/vnd.api+json + Transfer-Encoding: chunked + Connection: keep-alive + alt-svc: h3=":443"; ma=86400 + Cache-Control: max-age=0, private, must-revalidate + etag: W/"7ddb9efc64d58b379a1e3e808d2b4ca5" + referrer-policy: strict-origin-when-cross-origin + Server: cloudflare + strict-transport-security: max-age=31536000; preload + vary: Accept, Origin + x-content-type-options: nosniff + x-download-options: noopen + x-frame-options: SAMEORIGIN + x-permitted-cross-domain-policies: none + x-request-id: 7c6b53b8-fe22-440a-856d-2198bd07c541 + x-runtime: '0.068377' + x-xss-protection: 1; mode=block + Nel: + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + - id: '46474' + type: anime + links: + self: https://kitsu.io/api/edge/anime/46474 + attributes: + createdAt: '2022-09-13T05:36:19.002Z' + updatedAt: '2026-05-11T06:00:11.341Z' + slug: sousou-no-frieren + synopsis: |- + After the party of heroes defeated the Demon King, they restored peace to the land and returned to lives of solitude. Generations pass, and the elven mage Frieren comes face to face with humanity’s mortality. She takes on a new apprentice and promises to fulfill old friends’ dying wishes. Can an elven mind make peace with the nature of life and death? Frieren embarks on her quest to find out. + + (Source: Crunchyroll) + description: |- + After the party of heroes defeated the Demon King, they restored peace to the land and returned to lives of solitude. Generations pass, and the elven mage Frieren comes face to face with humanity’s mortality. She takes on a new apprentice and promises to fulfill old friends’ dying wishes. Can an elven mind make peace with the nature of life and death? Frieren embarks on her quest to find out. + + (Source: Crunchyroll) + coverImageTopOffset: 0 + titles: + en: 'Frieren: Beyond Journey’s End' + en_jp: Sousou no Frieren + it_it: 'Frieren: Oltre la Fine del Viaggio' + ja_jp: 葬送のフリーレン + ko_kr: 장송의 프리렌 + pt_br: Frieren e a Jornada para o Além + th_th: คำอธิษฐานในวันที่จากลา Frieren + zh_cn: 葬送的芙莉蓮 + canonicalTitle: Sousou no Frieren + abbreviatedTitles: + - Frieren at the Funeral + averageRating: '88.76' + ratingFrequencies: + '2': '188' + '3': '2' + '4': '13' + '5': '1' + '6': '16' + '7': '5' + '8': '269' + '9': '3' + '10': '44' + '11': '10' + '12': '77' + '13': '16' + '14': '720' + '15': '84' + '16': '638' + '17': '291' + '18': '1416' + '19': '420' + '20': '5061' + userCount: 19980 + favoritesCount: 676 + startDate: '2023-09-29' + endDate: '2024-03-22' + nextRelease: null + popularityRank: 835 + ratingRank: 2 + ageRating: PG + ageRatingGuide: Teens 13 or Older + subtype: TV + status: finished + tba: null + posterImage: + tiny: https://media.kitsu.app/anime/46474/poster_image/tiny-f77201d59d7f322510e3d28bc1930e29.jpeg + large: https://media.kitsu.app/anime/46474/poster_image/large-ec9b98dd5fbf8f92532d1edb45f9e882.jpeg + small: https://media.kitsu.app/anime/46474/poster_image/small-2dc1165f5acd773939c7befb0949d258.jpeg + medium: https://media.kitsu.app/anime/46474/poster_image/medium-23e1293e41a0b54b6621eb589c3f0d62.jpeg + original: https://media.kitsu.app/anime/46474/poster_image/99d7df09d8cb9360b1e02825372ce612.jpg + meta: + dimensions: + tiny: + width: 110 + height: 156 + large: + width: 550 + height: 780 + small: + width: 284 + height: 402 + medium: + width: 390 + height: 554 + coverImage: + tiny: https://media.kitsu.app/anime/46474/cover_image/tiny-dccb49f6ea01f1fc1f93b10b6bc2608c.jpeg + large: https://media.kitsu.app/anime/46474/cover_image/large-167edf3e01fac59ce6aacfeb47df5634.jpeg + small: https://media.kitsu.app/anime/46474/cover_image/small-2467fb0c4f1283988febe4abd715a9b8.jpeg + original: https://media.kitsu.app/anime/46474/cover_image/883c308356a4db76a9c0af900ada96ed.jpg + meta: + dimensions: + tiny: + width: 840 + height: 200 + large: + width: 3360 + height: 800 + small: + width: 1680 + height: 400 + episodeCount: 28 + episodeLength: 24 + totalLength: null + youtubeVideoId: qgQunxD0qCk + showType: TV + nsfw: false + relationships: + genres: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/genres + related: https://kitsu.io/api/edge/anime/46474/genres + categories: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/categories + related: https://kitsu.io/api/edge/anime/46474/categories + castings: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/castings + related: https://kitsu.io/api/edge/anime/46474/castings + installments: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/installments + related: https://kitsu.io/api/edge/anime/46474/installments + mappings: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/mappings + related: https://kitsu.io/api/edge/anime/46474/mappings + reviews: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/reviews + related: https://kitsu.io/api/edge/anime/46474/reviews + mediaRelationships: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/media-relationships + related: https://kitsu.io/api/edge/anime/46474/media-relationships + characters: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/characters + related: https://kitsu.io/api/edge/anime/46474/characters + staff: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/staff + related: https://kitsu.io/api/edge/anime/46474/staff + productions: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/productions + related: https://kitsu.io/api/edge/anime/46474/productions + quotes: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/quotes + related: https://kitsu.io/api/edge/anime/46474/quotes + episodes: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/episodes + related: https://kitsu.io/api/edge/anime/46474/episodes + streamingLinks: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/streaming-links + related: https://kitsu.io/api/edge/anime/46474/streaming-links + animeProductions: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/anime-productions + related: https://kitsu.io/api/edge/anime/46474/anime-productions + animeCharacters: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/anime-characters + related: https://kitsu.io/api/edge/anime/46474/anime-characters + animeStaff: + links: + self: https://kitsu.io/api/edge/anime/46474/relationships/anime-staff + related: https://kitsu.io/api/edge/anime/46474/anime-staff + - id: '49240' + type: anime + links: + self: https://kitsu.io/api/edge/anime/49240 + attributes: + createdAt: '2024-09-28T11:58:04.596Z' + updatedAt: '2026-05-11T06:00:11.341Z' + slug: sousou-no-frieren-season-2 + synopsis: |- + The second season of Sousou no Frieren. + + On the road to Ende, Frieren confronts past bonds and rising threats with her newfound party. + + (Source: Anime News Network) + description: |- + The second season of Sousou no Frieren. + + On the road to Ende, Frieren confronts past bonds and rising threats with her newfound party. + + (Source: Anime News Network) + coverImageTopOffset: 0 + titles: + en: 'Frieren: Beyond Journey''s End Season 2' + en_jp: Sousou no Frieren 2nd Season + ja_jp: 葬送のフリーレン 第2期 + canonicalTitle: Sousou no Frieren 2nd Season + abbreviatedTitles: [] + averageRating: '88.62' + ratingFrequencies: + '2': '4' + '3': '0' + '4': '0' + '5': '0' + '6': '0' + '8': '16' + '9': '1' + '10': '5' + '11': '1' + '12': '14' + '13': '3' + '14': '135' + '15': '24' + '16': '169' + '17': '76' + '18': '256' + '19': '89' + '20': '591' + userCount: 4959 + favoritesCount: 46 + startDate: '2026-01-16' + endDate: '2026-03-27' + nextRelease: null + popularityRank: 2740 + ratingRank: 3 + ageRating: PG + ageRatingGuide: Teens 13 or older + subtype: TV + status: finished + tba: null + posterImage: + tiny: https://media.kitsu.app/anime/49240/poster_image/tiny-d582a7d749477be01b03196f9f3dfffd.jpeg + large: https://media.kitsu.app/anime/49240/poster_image/large-5f1824cd76b6e829012dc75a2f51ec44.jpeg + small: https://media.kitsu.app/anime/49240/poster_image/small-b61dd0c91bf0152cb8275e9dc481cd2e.jpeg + medium: https://media.kitsu.app/anime/49240/poster_image/medium-cf744f274c2064efd1abfef4ecdfbd6d.jpeg + original: https://media.kitsu.app/anime/49240/poster_image/127830b1fbf80dd13a604998ef10d12c.jpg + meta: + dimensions: + tiny: + width: 110 + height: 156 + large: + width: 550 + height: 780 + small: + width: 284 + height: 402 + medium: + width: 390 + height: 554 + coverImage: + tiny: https://media.kitsu.app/anime/49240/cover_image/tiny-be18b34b7b503ca5a9df332544a066f0.jpeg + large: https://media.kitsu.app/anime/49240/cover_image/large-11304d969375d3e40cddbcb495725826.jpeg + small: https://media.kitsu.app/anime/49240/cover_image/small-17e5a4a0627fe0cccdd309f6fb515ceb.jpeg + original: https://media.kitsu.app/anime/49240/cover_image/b3d01e59bb588122c6c8691880aa3b1b.jpg + meta: + dimensions: + tiny: + width: 840 + height: 200 + large: + width: 3360 + height: 800 + small: + width: 1680 + height: 400 + episodeCount: 10 + episodeLength: 24 + totalLength: 0 + youtubeVideoId: RH-FcW94z00 + showType: TV + nsfw: false + relationships: + genres: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/genres + related: https://kitsu.io/api/edge/anime/49240/genres + categories: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/categories + related: https://kitsu.io/api/edge/anime/49240/categories + castings: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/castings + related: https://kitsu.io/api/edge/anime/49240/castings + installments: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/installments + related: https://kitsu.io/api/edge/anime/49240/installments + mappings: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/mappings + related: https://kitsu.io/api/edge/anime/49240/mappings + reviews: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/reviews + related: https://kitsu.io/api/edge/anime/49240/reviews + mediaRelationships: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/media-relationships + related: https://kitsu.io/api/edge/anime/49240/media-relationships + characters: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/characters + related: https://kitsu.io/api/edge/anime/49240/characters + staff: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/staff + related: https://kitsu.io/api/edge/anime/49240/staff + productions: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/productions + related: https://kitsu.io/api/edge/anime/49240/productions + quotes: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/quotes + related: https://kitsu.io/api/edge/anime/49240/quotes + episodes: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/episodes + related: https://kitsu.io/api/edge/anime/49240/episodes + streamingLinks: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/streaming-links + related: https://kitsu.io/api/edge/anime/49240/streaming-links + animeProductions: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/anime-productions + related: https://kitsu.io/api/edge/anime/49240/anime-productions + animeCharacters: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/anime-characters + related: https://kitsu.io/api/edge/anime/49240/anime-characters + animeStaff: + links: + self: https://kitsu.io/api/edge/anime/49240/relationships/anime-staff + related: https://kitsu.io/api/edge/anime/49240/anime-staff + meta: + count: 6 + links: + first: https://kitsu.io/api/edge/anime?filter%5Btext%5D=Frieren&page%5Blimit%5D=2&page%5Boffset%5D=0 + next: https://kitsu.io/api/edge/anime?filter%5Btext%5D=Frieren&page%5Blimit%5D=2&page%5Boffset%5D=2 + last: https://kitsu.io/api/edge/anime?filter%5Btext%5D=Frieren&page%5Blimit%5D=2&page%5Boffset%5D=4 + body_text: null + body_b64: null diff --git a/test/fixtures/kitsu/characters/02-frieren-limit2.yaml b/test/fixtures/kitsu/characters/02-frieren-limit2.yaml new file mode 100644 index 0000000..48afb69 --- /dev/null +++ b/test/fixtures/kitsu/characters/02-frieren-limit2.yaml @@ -0,0 +1,158 @@ +metadata: + captured_at: '2026-05-11T08:09:44Z' + label: frieren-limit2 + backend: kitsu + path_slug: characters +request: + method: GET + url: https://kitsu.io/api/edge/characters?filter[name]=Frieren&page[limit]=2&page[offset]=0 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:44 GMT + Content-Type: application/vnd.api+json + Transfer-Encoding: chunked + Connection: keep-alive + alt-svc: h3=":443"; ma=86400 + Cache-Control: max-age=0, private, must-revalidate + etag: W/"229593e178c38ed1c41a43c5506ecbf9" + referrer-policy: strict-origin-when-cross-origin + Server: cloudflare + strict-transport-security: max-age=31536000; preload + vary: Accept, Origin + x-content-type-options: nosniff + x-download-options: noopen + x-frame-options: SAMEORIGIN + x-permitted-cross-domain-policies: none + x-request-id: a44c0f6a-aad0-4ab0-85f0-c86e16c7ce6d + x-runtime: '0.071051' + x-xss-protection: 1; mode=block + Nel: + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + - id: '85849' + type: characters + links: + self: https://kitsu.io/api/edge/characters/85849 + attributes: + createdAt: '2017-01-22T11:30:37.242Z' + updatedAt: '2021-09-27T19:55:30.510Z' + slug: freezen + names: + en: Freezen + ja_jp: フリーズン + canonicalName: Freezen + otherNames: [] + name: Freezen + malId: 92093 + description: '' + image: + tiny: https://media.kitsu.app/character/85849/image/tiny-1901d28f3065cb3297a84d69841355fc.jpeg + large: https://media.kitsu.app/character/85849/image/large-8b56f32c21e94a847a998952678f00f0.jpeg + small: https://media.kitsu.app/character/85849/image/small-60aad7a29212e205037b6dcfba9cb327.jpeg + medium: https://media.kitsu.app/character/85849/image/medium-c922633dbeb67981153cf51907fcd378.jpeg + original: https://media.kitsu.app/characters/images/85849/original.jpg + meta: + dimensions: + tiny: + width: 100 + height: 120 + large: + width: 500 + height: 600 + small: + width: 200 + height: 240 + medium: + width: 300 + height: 360 + relationships: + primaryMedia: + links: + self: https://kitsu.io/api/edge/characters/85849/relationships/primary-media + related: https://kitsu.io/api/edge/characters/85849/primary-media + castings: + links: + self: https://kitsu.io/api/edge/characters/85849/relationships/castings + related: https://kitsu.io/api/edge/characters/85849/castings + mediaCharacters: + links: + self: https://kitsu.io/api/edge/characters/85849/relationships/media-characters + related: https://kitsu.io/api/edge/characters/85849/media-characters + quotes: + links: + self: https://kitsu.io/api/edge/characters/85849/relationships/quotes + related: https://kitsu.io/api/edge/characters/85849/quotes + - id: '50095' + type: characters + links: + self: https://kitsu.io/api/edge/characters/50095 + attributes: + createdAt: '2014-07-31T19:39:55.232Z' + updatedAt: '2021-09-26T19:28:04.702Z' + slug: frivelen + names: + en: Frivelen + ja_jp: null + canonicalName: Frivelen + otherNames: + - Goblin of the Brave Horn Clan + name: Frivelen + malId: 55485 + description: A prideful women who usually appears as a luck charm and transforms into her true form when there is + danger. In truth shes a goblin, but would rather hide this fact due to the goblin's reputation of being weak, she + wants others to view her as a strong being. + image: + tiny: https://media.kitsu.app/character/50095/image/tiny-88353f922edf6168a71fd1fb26adbe2f.jpeg + large: https://media.kitsu.app/character/50095/image/large-1481c3aa4a58cffd4fc46d5503f700c1.jpeg + small: https://media.kitsu.app/character/50095/image/small-0b3b27072d95f0923197e3271ae0da39.jpeg + medium: https://media.kitsu.app/character/50095/image/medium-9f9042713340d5f645a423675f856d66.jpeg + original: https://media.kitsu.app/characters/images/50095/original.jpg + meta: + dimensions: + tiny: + width: 100 + height: 120 + large: + width: 500 + height: 600 + small: + width: 200 + height: 240 + medium: + width: 300 + height: 360 + relationships: + primaryMedia: + links: + self: https://kitsu.io/api/edge/characters/50095/relationships/primary-media + related: https://kitsu.io/api/edge/characters/50095/primary-media + castings: + links: + self: https://kitsu.io/api/edge/characters/50095/relationships/castings + related: https://kitsu.io/api/edge/characters/50095/castings + mediaCharacters: + links: + self: https://kitsu.io/api/edge/characters/50095/relationships/media-characters + related: https://kitsu.io/api/edge/characters/50095/media-characters + quotes: + links: + self: https://kitsu.io/api/edge/characters/50095/relationships/quotes + related: https://kitsu.io/api/edge/characters/50095/quotes + meta: + count: 23 + links: + first: https://kitsu.io/api/edge/characters?filter%5Bname%5D=Frieren&page%5Blimit%5D=2&page%5Boffset%5D=0 + next: https://kitsu.io/api/edge/characters?filter%5Bname%5D=Frieren&page%5Blimit%5D=2&page%5Boffset%5D=2 + last: https://kitsu.io/api/edge/characters?filter%5Bname%5D=Frieren&page%5Blimit%5D=2&page%5Boffset%5D=21 + body_text: null + body_b64: null diff --git a/test/fixtures/kitsu/manga_search/02-berserk-limit2.yaml b/test/fixtures/kitsu/manga_search/02-berserk-limit2.yaml new file mode 100644 index 0000000..3d20119 --- /dev/null +++ b/test/fixtures/kitsu/manga_search/02-berserk-limit2.yaml @@ -0,0 +1,366 @@ +metadata: + captured_at: '2026-05-11T08:09:44Z' + label: berserk-limit2 + backend: kitsu + path_slug: manga_search +request: + method: GET + url: https://kitsu.io/api/edge/manga?filter[text]=Berserk&page[limit]=2&page[offset]=0 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:44 GMT + Content-Type: application/vnd.api+json + Transfer-Encoding: chunked + Connection: keep-alive + alt-svc: h3=":443"; ma=86400 + Cache-Control: max-age=0, private, must-revalidate + etag: W/"0f441d8b210482828a3f8a041f00bcd5" + referrer-policy: strict-origin-when-cross-origin + Server: cloudflare + strict-transport-security: max-age=31536000; preload + vary: Accept, Origin + x-content-type-options: nosniff + x-download-options: noopen + x-frame-options: SAMEORIGIN + x-permitted-cross-domain-policies: none + x-request-id: 0e0d2f87-aabf-49b0-b200-36f0d2e0fd82 + x-runtime: '0.082306' + x-xss-protection: 1; mode=block + Nel: + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + - id: '8' + type: manga + links: + self: https://kitsu.io/api/edge/manga/8 + attributes: + createdAt: '2013-12-18T13:48:25.461Z' + updatedAt: '2026-05-11T06:00:24.252Z' + slug: berserk + synopsis: |- + His name is Guts, the Black Swordsman, a feared warrior spoken of only in whispers. Bearer of a gigantic sword, an iron hand, and the scars of countless battles and tortures, his flesh is also indelibly marked with The Brand, an unholy symbol that draws the forces of darkness to him and dooms him as their sacrifice. But Guts won't take his fate lying down; he'll cut a crimson swath of carnage through the ranks of the damned—and anyone else foolish enough to oppose him! Accompanied by Puck the Elf, more an annoyance than a companion, Guts relentlessly follows a dark, bloodstained path that leads only to death...or vengeance. + + (Source: Dark Horse) + + Notes: + - Volumes 1-5 contain the 16 prequel chapters 0A - 0P. + - Chapter 83 was omitted from Volume 13 due to the author’s request. + - Volume 14 includes “Berserk: The Prototype”. + - Due to the author's passing, starting from Chapter 365, the manga is illustrated by Studio Gaga (Miura's assistants) and supervised by Kouji Mori (a close friend of Miura's). + description: |- + His name is Guts, the Black Swordsman, a feared warrior spoken of only in whispers. Bearer of a gigantic sword, an iron hand, and the scars of countless battles and tortures, his flesh is also indelibly marked with The Brand, an unholy symbol that draws the forces of darkness to him and dooms him as their sacrifice. But Guts won't take his fate lying down; he'll cut a crimson swath of carnage through the ranks of the damned—and anyone else foolish enough to oppose him! Accompanied by Puck the Elf, more an annoyance than a companion, Guts relentlessly follows a dark, bloodstained path that leads only to death...or vengeance. + + (Source: Dark Horse) + + Notes: + - Volumes 1-5 contain the 16 prequel chapters 0A - 0P. + - Chapter 83 was omitted from Volume 13 due to the author’s request. + - Volume 14 includes “Berserk: The Prototype”. + - Due to the author's passing, starting from Chapter 365, the manga is illustrated by Studio Gaga (Miura's assistants) and supervised by Kouji Mori (a close friend of Miura's). + coverImageTopOffset: 200 + titles: + en: Berserk + en_jp: Berserk + en_us: Berserk + ja_jp: ベルセルク + canonicalTitle: Berserk + abbreviatedTitles: + - 'Berserk: The Prototype' + averageRating: '84.88' + ratingFrequencies: + '2': '1721' + '3': '26' + '4': '54' + '5': '25' + '6': '47' + '7': '12' + '8': '1163' + '9': '13' + '10': '110' + '11': '29' + '12': '204' + '13': '40' + '14': '2095' + '15': '85' + '16': '1295' + '17': '277' + '18': '2532' + '19': '456' + '20': '15196' + userCount: 57904 + favoritesCount: 3989 + startDate: '1989-08-25' + endDate: null + nextRelease: null + popularityRank: 17 + ratingRank: 6 + ageRating: R + ageRatingGuide: Horror + subtype: manga + status: current + tba: null + posterImage: + tiny: https://media.kitsu.app/manga/8/poster_image/tiny-ad1df8a063d11baf9fda08160deffc00.jpeg + large: https://media.kitsu.app/manga/8/poster_image/large-f598ed525107bcb69ebda5bf36c6910d.jpeg + small: https://media.kitsu.app/manga/8/poster_image/small-bdf7be96b4337627856b36e0be0241fb.jpeg + medium: https://media.kitsu.app/manga/8/poster_image/medium-8edd6ddb0c6ec34a54521487ee81fb02.jpeg + original: https://media.kitsu.app/manga/8/poster_image/67d602c20d1bf0eeb43e1a363c59ed5b.jpg + meta: + dimensions: + tiny: + width: 110 + height: 156 + large: + width: 550 + height: 780 + small: + width: 284 + height: 402 + medium: + width: 390 + height: 554 + coverImage: + tiny: https://media.kitsu.app/manga/8/cover_image/tiny-a61e4ae3c11698a65c0ecdd6cd3e86bd.gif + large: https://media.kitsu.app/manga/8/cover_image/large-d976a1baf3051d321608d4ebb7da4220.gif + small: https://media.kitsu.app/manga/8/cover_image/small-dd96d5ac1412ccabb1bcca3fe89747f5.gif + tiny_webp: https://media.kitsu.app/manga/8/cover_image/tiny_webp-90fec06d293be542b08f362b457bce04.webp + large_webp: https://media.kitsu.app/manga/8/cover_image/large_webp-e735c50a70351a02998742aa8f1424a6.webp + small_webp: https://media.kitsu.app/manga/8/cover_image/small_webp-645e5266280fa6c4032f54823eb6413a.webp + original: https://media.kitsu.app/manga/cover_images/8/original.jpg + meta: + dimensions: + tiny: + width: 840 + height: 200 + large: + width: 3360 + height: 800 + small: + width: 1680 + height: 400 + tiny_webp: + width: 840 + height: 200 + large_webp: + width: 3360 + height: 800 + small_webp: + width: 1680 + height: 400 + chapterCount: null + volumeCount: 0 + serialization: Young Animal + mangaType: manga + relationships: + genres: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/genres + related: https://kitsu.io/api/edge/manga/8/genres + categories: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/categories + related: https://kitsu.io/api/edge/manga/8/categories + castings: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/castings + related: https://kitsu.io/api/edge/manga/8/castings + installments: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/installments + related: https://kitsu.io/api/edge/manga/8/installments + mappings: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/mappings + related: https://kitsu.io/api/edge/manga/8/mappings + reviews: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/reviews + related: https://kitsu.io/api/edge/manga/8/reviews + mediaRelationships: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/media-relationships + related: https://kitsu.io/api/edge/manga/8/media-relationships + characters: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/characters + related: https://kitsu.io/api/edge/manga/8/characters + staff: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/staff + related: https://kitsu.io/api/edge/manga/8/staff + productions: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/productions + related: https://kitsu.io/api/edge/manga/8/productions + quotes: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/quotes + related: https://kitsu.io/api/edge/manga/8/quotes + chapters: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/chapters + related: https://kitsu.io/api/edge/manga/8/chapters + mangaCharacters: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/manga-characters + related: https://kitsu.io/api/edge/manga/8/manga-characters + mangaStaff: + links: + self: https://kitsu.io/api/edge/manga/8/relationships/manga-staff + related: https://kitsu.io/api/edge/manga/8/manga-staff + - id: '40812' + type: manga + links: + self: https://kitsu.io/api/edge/manga/40812 + attributes: + createdAt: '2018-03-31T16:21:40.096Z' + updatedAt: '2026-05-11T06:00:24.252Z' + slug: berserk-of-gluttony + synopsis: |- + Fate Barbatos has never tasted real power. Born with the magical skill Gluttony, he constantly hungers in a way that can’t be satiated, and has been shunned and looked down upon his entire life. One day, while working as a gatekeeper for a noble family and fighting a trespassing thief, he discovers Gluttony’s true power: when he kills someone, he devours their skills and feeds his gnawing hunger at last. In that grisly realization, Fate is awakened to his true potential. How many lives will he feed on to satisfy this hunger, and is the world ready for the frightening warrior he’ll become? + + (Source: Seven Seas Entertainment) + description: |- + Fate Barbatos has never tasted real power. Born with the magical skill Gluttony, he constantly hungers in a way that can’t be satiated, and has been shunned and looked down upon his entire life. One day, while working as a gatekeeper for a noble family and fighting a trespassing thief, he discovers Gluttony’s true power: when he kills someone, he devours their skills and feeds his gnawing hunger at last. In that grisly realization, Fate is awakened to his true potential. How many lives will he feed on to satisfy this hunger, and is the world ready for the frightening warrior he’ll become? + + (Source: Seven Seas Entertainment) + coverImageTopOffset: 0 + titles: + en: Berserk of Gluttony + en_jp: Boushoku no Berserk + ja_jp: 暴食のベルセルク + th_th: จอมตะกละดาบคลั่ง + canonicalTitle: Boushoku no Berserk + abbreviatedTitles: [] + averageRating: '70.01' + ratingFrequencies: + '2': '14' + '3': '1' + '4': '4' + '6': '20' + '7': '3' + '8': '76' + '9': '5' + '10': '58' + '11': '12' + '12': '109' + '13': '25' + '14': '221' + '15': '38' + '16': '120' + '17': '23' + '18': '56' + '19': '6' + '20': '105' + userCount: 3803 + favoritesCount: 15 + startDate: '2018-03-01' + endDate: null + nextRelease: null + popularityRank: 440 + ratingRank: 9148 + ageRating: PG + ageRatingGuide: Teens 13 or older + subtype: manga + status: current + tba: null + posterImage: + tiny: https://media.kitsu.app/manga/poster_images/40812/tiny.jpg + large: https://media.kitsu.app/manga/poster_images/40812/large.jpg + small: https://media.kitsu.app/manga/poster_images/40812/small.jpg + medium: https://media.kitsu.app/manga/poster_images/40812/medium.jpg + original: https://media.kitsu.app/manga/poster_images/40812/original.jpg + meta: + dimensions: + tiny: + width: 110 + height: 156 + large: + width: 550 + height: 780 + small: + width: 284 + height: 402 + medium: + width: 390 + height: 554 + coverImage: null + chapterCount: null + volumeCount: null + serialization: Comic Ride + mangaType: manga + relationships: + genres: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/genres + related: https://kitsu.io/api/edge/manga/40812/genres + categories: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/categories + related: https://kitsu.io/api/edge/manga/40812/categories + castings: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/castings + related: https://kitsu.io/api/edge/manga/40812/castings + installments: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/installments + related: https://kitsu.io/api/edge/manga/40812/installments + mappings: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/mappings + related: https://kitsu.io/api/edge/manga/40812/mappings + reviews: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/reviews + related: https://kitsu.io/api/edge/manga/40812/reviews + mediaRelationships: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/media-relationships + related: https://kitsu.io/api/edge/manga/40812/media-relationships + characters: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/characters + related: https://kitsu.io/api/edge/manga/40812/characters + staff: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/staff + related: https://kitsu.io/api/edge/manga/40812/staff + productions: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/productions + related: https://kitsu.io/api/edge/manga/40812/productions + quotes: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/quotes + related: https://kitsu.io/api/edge/manga/40812/quotes + chapters: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/chapters + related: https://kitsu.io/api/edge/manga/40812/chapters + mangaCharacters: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/manga-characters + related: https://kitsu.io/api/edge/manga/40812/manga-characters + mangaStaff: + links: + self: https://kitsu.io/api/edge/manga/40812/relationships/manga-staff + related: https://kitsu.io/api/edge/manga/40812/manga-staff + meta: + count: 40 + links: + first: https://kitsu.io/api/edge/manga?filter%5Btext%5D=Berserk&page%5Blimit%5D=2&page%5Boffset%5D=0 + next: https://kitsu.io/api/edge/manga?filter%5Btext%5D=Berserk&page%5Blimit%5D=2&page%5Boffset%5D=2 + last: https://kitsu.io/api/edge/manga?filter%5Btext%5D=Berserk&page%5Blimit%5D=2&page%5Boffset%5D=38 + body_text: null + body_b64: null diff --git a/test/fixtures/kitsu/people/02-miyazaki-limit2.yaml b/test/fixtures/kitsu/people/02-miyazaki-limit2.yaml new file mode 100644 index 0000000..259ba96 --- /dev/null +++ b/test/fixtures/kitsu/people/02-miyazaki-limit2.yaml @@ -0,0 +1,45 @@ +metadata: + captured_at: '2026-05-11T08:09:45Z' + label: miyazaki-limit2 + backend: kitsu + path_slug: people +request: + method: GET + url: https://kitsu.io/api/edge/people?filter[name]=Miyazaki&page[limit]=2&page[offset]=0 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 400 + headers: + Date: Mon, 11 May 2026 08:09:45 GMT + Content-Type: application/vnd.api+json + Transfer-Encoding: chunked + Connection: keep-alive + alt-svc: h3=":443"; ma=86400 + Cache-Control: no-cache + referrer-policy: strict-origin-when-cross-origin + Server: cloudflare + strict-transport-security: max-age=31536000; preload + vary: Accept, Origin + x-content-type-options: nosniff + x-download-options: noopen + x-frame-options: SAMEORIGIN + x-permitted-cross-domain-policies: none + x-request-id: 81d2bee3-87cc-4675-b2d0-2ee11a4c7059 + x-runtime: '0.011774' + x-xss-protection: 1; mode=block + Nel: + cf-cache-status: DYNAMIC + Report-To: + CF-RAY: + body_json: + errors: + - title: Filter not allowed + detail: name is not allowed. + code: '102' + status: '400' + body_text: null + body_b64: null diff --git a/test/fixtures/kitsu/producers/02-ghibli-limit2.yaml b/test/fixtures/kitsu/producers/02-ghibli-limit2.yaml new file mode 100644 index 0000000..a70869a --- /dev/null +++ b/test/fixtures/kitsu/producers/02-ghibli-limit2.yaml @@ -0,0 +1,66 @@ +metadata: + captured_at: '2026-05-11T08:09:45Z' + label: ghibli-limit2 + backend: kitsu + path_slug: producers +request: + method: GET + url: https://kitsu.io/api/edge/producers?filter[slug]=studio-ghibli&page[limit]=2 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Date: Mon, 11 May 2026 08:09:45 GMT + Content-Type: application/vnd.api+json + Transfer-Encoding: chunked + Connection: keep-alive + alt-svc: h3=":443"; ma=86400 + Cache-Control: max-age=0, private, must-revalidate + etag: W/"bec62d391e7c3309aaa3e8b676e425a9" + referrer-policy: strict-origin-when-cross-origin + Server: cloudflare + strict-transport-security: max-age=31536000; preload + vary: Accept, Origin + x-content-type-options: nosniff + x-download-options: noopen + x-frame-options: SAMEORIGIN + x-permitted-cross-domain-policies: none + x-request-id: 3e66f9a5-0e2b-4ea6-a3e9-f9a32df418b6 + x-runtime: '0.051729' + x-xss-protection: 1; mode=block + Nel: + cf-cache-status: DYNAMIC + Report-To: + Content-Encoding: gzip + CF-RAY: + body_json: + data: + - id: '137' + type: producers + links: + self: https://kitsu.io/api/edge/producers/137 + attributes: + createdAt: '2013-02-20T16:02:30.578Z' + updatedAt: '2013-02-20T16:02:30.578Z' + slug: studio-ghibli + name: Studio Ghibli + relationships: + animeProductions: + links: + self: https://kitsu.io/api/edge/producers/137/relationships/anime-productions + related: https://kitsu.io/api/edge/producers/137/anime-productions + productions: + links: + self: https://kitsu.io/api/edge/producers/137/relationships/productions + related: https://kitsu.io/api/edge/producers/137/productions + meta: + count: 1 + links: + first: https://kitsu.io/api/edge/producers?filter%5Bslug%5D=studio-ghibli&page%5Blimit%5D=2&page%5Boffset%5D=0 + last: https://kitsu.io/api/edge/producers?filter%5Bslug%5D=studio-ghibli&page%5Blimit%5D=2&page%5Boffset%5D=0 + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/animes_search/17-frieren-limit2.yaml b/test/fixtures/shikimori/animes_search/17-frieren-limit2.yaml new file mode 100644 index 0000000..44a40df --- /dev/null +++ b/test/fixtures/shikimori/animes_search/17-frieren-limit2.yaml @@ -0,0 +1,70 @@ +metadata: + captured_at: '2026-05-11T08:09:46Z' + label: frieren-limit2 + backend: shikimori + path_slug: animes_search +request: + method: GET + url: https://shikimori.io/api/animes?search=Frieren&limit=2 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 08:09:46 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"7ffca2b389e49abd8a2ecf15fb7ea823" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: 927efb0e-5822-4127-9b37-59905cd331a5 + X-Runtime: '0.014637' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 52991 + name: Sousou no Frieren + russian: Провожающая в последний путь Фрирен + image: + original: /system/animes/original/52991.jpg?1710731127 + preview: /system/animes/preview/52991.jpg?1710731127 + x96: /system/animes/x96/52991.jpg?1710731127 + x48: /system/animes/x48/52991.jpg?1710731127 + url: /animes/52991-sousou-no-frieren + kind: tv + score: '9.27' + status: released + episodes: 28 + episodes_aired: 27 + aired_on: '2023-09-29' + released_on: '2024-03-22' + - id: 56885 + name: 'Sousou no Frieren: ●● no Mahou' + russian: 'Провожающая в последний путь Фрирен: Магия ●●' + image: + original: /system/animes/original/56885.jpg?1718913269 + preview: /system/animes/preview/56885.jpg?1718913269 + x96: /system/animes/x96/56885.jpg?1718913269 + x48: /system/animes/x48/56885.jpg?1718913269 + url: /animes/56885-sousou-no-frieren-no-mahou + kind: ona + score: '7.37' + status: released + episodes: 23 + episodes_aired: 23 + aired_on: '2023-10-11' + released_on: '2026-03-16' + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/characters_by_id/01-frieren-184947.yaml b/test/fixtures/shikimori/characters_by_id/01-frieren-184947.yaml new file mode 100644 index 0000000..e7a05b5 --- /dev/null +++ b/test/fixtures/shikimori/characters_by_id/01-frieren-184947.yaml @@ -0,0 +1,277 @@ +metadata: + captured_at: '2026-05-11T07:55:22Z' + label: frieren-184947 + backend: shikimori + path_slug: characters_by_id +request: + method: GET + url: https://shikimori.io/api/characters/184947 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 07:55:22 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"b5616b3a589992f5eae0f6426d6edb09" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: 480e74b1-3076-4874-9d76-98aa7cd43036 + X-Runtime: '0.041978' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + id: 184947 + name: Frieren + russian: Фрирен + image: + original: /system/characters/original/184947.jpg?1711056265 + preview: /system/characters/preview/184947.jpg?1711056265 + x96: /system/characters/x96/184947.jpg?1711056265 + x48: /system/characters/x48/184947.jpg?1711056265 + url: /characters/184947-frieren + altname: Frieren the Slayer + japanese: フリーレン + description: Представительница расы эльфов. Всегда спокойная, Фрирен кажется окружающим холодной и отчуждённой, однако + она обладает чувством юмора. Желает лучше понимать людей, несмотря на скоротечность их жизни. Фрирен ленива и неуклюжа + в простых бытовых делах, поэтому во многом полагается на товарищей. + description_html:

+ description_source: null + favoured: false + thread_id: 342253 + topic_id: 342253 + updated_at: '2026-05-10T23:56:03.881+03:00' + seyu: + - id: 17215 + name: Atsumi Tanezaki + russian: Ацуми Танэдзаки + image: + original: /system/people/original/17215.jpg?1716842558 + preview: /system/people/preview/17215.jpg?1716842558 + x96: /system/people/x96/17215.jpg?1716842558 + x48: /system/people/x48/17215.jpg?1716842558 + url: /people/17215-atsumi-tanezaki + - id: 94102 + name: Chanfei Li + russian: Чаньфэй Ли + image: + original: /assets/globals/missing_original.jpg + preview: /assets/globals/missing_preview.jpg + x96: /assets/globals/missing_x96.jpg + x48: /assets/globals/missing_x48.jpg + url: /people/94102-chanfei-li + - id: 35117 + name: Mallorie Rodak + russian: Маллори Родак + image: + original: /system/people/original/35117.jpg?1718052615 + preview: /system/people/preview/35117.jpg?1718052615 + x96: /system/people/x96/35117.jpg?1718052615 + x48: /system/people/x48/35117.jpg?1718052615 + url: /people/35117-mallorie-rodak + - id: 85141 + name: Sandra Villa García + russian: '' + image: + original: /assets/globals/missing_original.jpg + preview: /assets/globals/missing_preview.jpg + x96: /assets/globals/missing_x96.jpg + x48: /assets/globals/missing_x48.jpg + url: /people/85141-sandra-villa-garc-a + - id: 53037 + name: Jacque Souza + russian: Жак Соуза + image: + original: /system/people/original/53037.jpg?1718398286 + preview: /system/people/preview/53037.jpg?1718398286 + x96: /system/people/x96/53037.jpg?1718398286 + x48: /system/people/x48/53037.jpg?1718398286 + url: /people/53037-jacque-souza + - id: 21893 + name: Marie Nonnenmacher + russian: Мари Нонненмахер + image: + original: /system/people/original/21893.jpg?1712007567 + preview: /system/people/preview/21893.jpg?1712007567 + x96: /system/people/x96/21893.jpg?1712007567 + x48: /system/people/x48/21893.jpg?1712007567 + url: /people/21893-marie-nonnenmacher + - id: 35767 + name: Martina Felli + russian: Мартина Фелли + image: + original: /system/people/original/35767.jpg?1718052698 + preview: /system/people/preview/35767.jpg?1718052698 + x96: /system/people/x96/35767.jpg?1718052698 + x48: /system/people/x48/35767.jpg?1718052698 + url: /people/35767-martina-felli + - id: 56690 + name: Erika Ugalde + russian: Эрика Угальде + image: + original: /system/people/original/56690.jpg?1718398772 + preview: /system/people/preview/56690.jpg?1718398772 + x96: /system/people/x96/56690.jpg?1718398772 + x48: /system/people/x48/56690.jpg?1718398772 + url: /people/56690-erika-ugalde + - id: 40043 + name: Julia Casper + russian: Юлия Каспер + image: + original: /system/people/original/40043.jpg?1718053240 + preview: /system/people/preview/40043.jpg?1718053240 + x96: /system/people/x96/40043.jpg?1718053240 + x48: /system/people/x48/40043.jpg?1718053240 + url: /people/40043-julia-casper + animes: + - id: 52991 + name: Sousou no Frieren + russian: Провожающая в последний путь Фрирен + image: + original: /system/animes/original/52991.jpg?1710731127 + preview: /system/animes/preview/52991.jpg?1710731127 + x96: /system/animes/x96/52991.jpg?1710731127 + x48: /system/animes/x48/52991.jpg?1710731127 + url: /animes/52991-sousou-no-frieren + kind: tv + score: '9.27' + status: released + episodes: 28 + episodes_aired: 27 + aired_on: '2023-09-29' + released_on: '2024-03-22' + roles: + - Main + role: Main + - id: 56805 + name: Yuusha + russian: Герой + image: + original: /system/animes/original/56805.jpg?1712951814 + preview: /system/animes/preview/56805.jpg?1712951814 + x96: /system/animes/x96/56805.jpg?1712951814 + x48: /system/animes/x48/56805.jpg?1712951814 + url: /animes/56805-yuusha + kind: music + score: '7.89' + status: released + episodes: 1 + episodes_aired: 0 + aired_on: '2023-09-29' + released_on: null + roles: + - Main + role: Main + - id: 56885 + name: 'Sousou no Frieren: ●● no Mahou' + russian: 'Провожающая в последний путь Фрирен: Магия ●●' + image: + original: /system/animes/original/56885.jpg?1718913269 + preview: /system/animes/preview/56885.jpg?1718913269 + x96: /system/animes/x96/56885.jpg?1718913269 + x48: /system/animes/x48/56885.jpg?1718913269 + url: /animes/56885-sousou-no-frieren-no-mahou + kind: ona + score: '7.37' + status: released + episodes: 23 + episodes_aired: 23 + aired_on: '2023-10-11' + released_on: '2026-03-16' + roles: + - Main + role: Main + - id: 59978 + name: Sousou no Frieren 2nd Season + russian: Провожающая в последний путь Фрирен 2 + image: + original: /assets/globals/missing_original.jpg + preview: /assets/globals/missing_preview.jpg + x96: /assets/globals/missing_x96.jpg + x48: /assets/globals/missing_x48.jpg + url: /animes/59978-sousou-no-frieren-2nd-season + kind: tv + score: '8.9' + status: released + episodes: 10 + episodes_aired: 10 + aired_on: '2026-01-16' + released_on: '2026-03-27' + roles: + - Main + role: Main + mangas: + - id: 126287 + name: Sousou no Frieren + russian: Провожающая в последний путь Фрирен + image: + original: /system/mangas/original/126287.jpg?1712852798 + preview: /system/mangas/preview/126287.jpg?1712852798 + x96: /system/mangas/x96/126287.jpg?1712852798 + x48: /system/mangas/x48/126287.jpg?1712852798 + url: /mangas/126287-sousou-no-frieren + kind: manga + score: '8.88' + status: ongoing + volumes: 0 + chapters: 0 + aired_on: '2020-04-28' + released_on: null + roles: + - Main + role: Main + - id: 164432 + name: 'Sousou no Frieren Anthology: Kotonaru Tabi wo Tanoshimu Mahou' + russian: 'Провожающая в последний путь Фрирен: Антология' + image: + original: /system/mangas/original/164432.jpg?1710117584 + preview: /system/mangas/preview/164432.jpg?1710117584 + x96: /system/mangas/x96/164432.jpg?1710117584 + x48: /system/mangas/x48/164432.jpg?1710117584 + url: /mangas/164432-sousou-no-frieren-anthology-kotonaru-tabi-wo-tanoshimu-mahou + kind: manga + score: '7.14' + status: released + volumes: 1 + chapters: 5 + aired_on: '2023-05-22' + released_on: '2023-05-26' + roles: + - Main + role: Main + - id: 169340 + name: 'Shousetsu Sousou no Frieren: Zensou' + russian: 'Провожающая в последний путь Фрирен: Прелюдия' + image: + original: /system/mangas/original/169340.jpg?1713984419 + preview: /system/mangas/preview/169340.jpg?1713984419 + x96: /system/mangas/x96/169340.jpg?1713984419 + x48: /system/mangas/x48/169340.jpg?1713984419 + url: /mangas/169340-shousetsu-sousou-no-frieren-zensou + kind: light_novel + score: '7.45' + status: ongoing + volumes: 0 + chapters: 0 + aired_on: '2024-04-17' + released_on: null + roles: + - Main + role: Main + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/characters_search/01-frieren.yaml b/test/fixtures/shikimori/characters_search/01-frieren.yaml new file mode 100644 index 0000000..2f2c7da --- /dev/null +++ b/test/fixtures/shikimori/characters_search/01-frieren.yaml @@ -0,0 +1,47 @@ +metadata: + captured_at: '2026-05-11T07:55:18Z' + label: frieren + backend: shikimori + path_slug: characters_search +request: + method: GET + url: https://shikimori.io/api/characters/search?search=Frieren&limit=2 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 07:55:18 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"ad47d9cb853350482cd25a048008dfde" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: d5738b4c-92fe-4421-8c90-eae19b4450a4 + X-Runtime: '0.017799' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 184947 + name: Frieren + russian: Фрирен + image: + original: /system/characters/original/184947.jpg?1711056265 + preview: /system/characters/preview/184947.jpg?1711056265 + x96: /system/characters/x96/184947.jpg?1711056265 + x48: /system/characters/x48/184947.jpg?1711056265 + url: /characters/184947-frieren + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/characters_search/02-frieren-limit2.yaml b/test/fixtures/shikimori/characters_search/02-frieren-limit2.yaml new file mode 100644 index 0000000..6492362 --- /dev/null +++ b/test/fixtures/shikimori/characters_search/02-frieren-limit2.yaml @@ -0,0 +1,47 @@ +metadata: + captured_at: '2026-05-11T08:09:48Z' + label: frieren-limit2 + backend: shikimori + path_slug: characters_search +request: + method: GET + url: https://shikimori.io/api/characters/search?search=Frieren&limit=2 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 08:09:48 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"ad47d9cb853350482cd25a048008dfde" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: f53e18b1-1940-4fc3-bbc5-42be882f6c1f + X-Runtime: '0.020143' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 184947 + name: Frieren + russian: Фрирен + image: + original: /system/characters/original/184947.jpg?1711056265 + preview: /system/characters/preview/184947.jpg?1711056265 + x96: /system/characters/x96/184947.jpg?1711056265 + x48: /system/characters/x48/184947.jpg?1711056265 + url: /characters/184947-frieren + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/mangas_search/02-berserk-limit2.yaml b/test/fixtures/shikimori/mangas_search/02-berserk-limit2.yaml new file mode 100644 index 0000000..7318a7a --- /dev/null +++ b/test/fixtures/shikimori/mangas_search/02-berserk-limit2.yaml @@ -0,0 +1,70 @@ +metadata: + captured_at: '2026-05-11T08:09:47Z' + label: berserk-limit2 + backend: shikimori + path_slug: mangas_search +request: + method: GET + url: https://shikimori.io/api/mangas?search=Berserk&limit=2 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 08:09:47 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"960e53d30f0307cdca54ac4d0f01c9b4" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: 6036c9bb-336c-465d-a687-01d2a232eba9 + X-Runtime: '0.028547' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 2 + name: Berserk + russian: Берсерк + image: + original: /system/mangas/original/2.jpg?1712722988 + preview: /system/mangas/preview/2.jpg?1712722988 + x96: /system/mangas/x96/2.jpg?1712722988 + x48: /system/mangas/x48/2.jpg?1712722988 + url: /mangas/2-berserk + kind: manga + score: '9.46' + status: ongoing + volumes: 0 + chapters: 0 + aired_on: '1989-08-25' + released_on: null + - id: 92299 + name: 'Berserk: Shinen no Kami 2' + russian: 'Берсерк: Бог хаоса II' + image: + original: /system/mangas/original/92299.jpg?1712722967 + preview: /system/mangas/preview/92299.jpg?1712722967 + x96: /system/mangas/x96/92299.jpg?1712722967 + x48: /system/mangas/x48/92299.jpg?1712722967 + url: /mangas/92299-berserk-shinen-no-kami-2 + kind: one_shot + score: '8.48' + status: released + volumes: 0 + chapters: 1 + aired_on: '1996-07-12' + released_on: null + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/people_search/02-miyazaki-limit2.yaml b/test/fixtures/shikimori/people_search/02-miyazaki-limit2.yaml new file mode 100644 index 0000000..87a60ea --- /dev/null +++ b/test/fixtures/shikimori/people_search/02-miyazaki-limit2.yaml @@ -0,0 +1,182 @@ +metadata: + captured_at: '2026-05-11T08:09:49Z' + label: miyazaki-limit2 + backend: shikimori + path_slug: people_search +request: + method: GET + url: https://shikimori.io/api/people/search?search=Hayao%20Miyazaki&limit=2 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 08:09:49 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"4cc5424f94f4a98096bdb255036cd2cd" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: f96c594c-7576-4825-bf0f-5b93b6c9568a + X-Runtime: '0.029979' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 1870 + name: Hayao Miyazaki + russian: Хаяо Миядзаки + image: + original: /system/people/original/1870.jpg?1712004020 + preview: /system/people/preview/1870.jpg?1712004020 + x96: /system/people/x96/1870.jpg?1712004020 + x48: /system/people/x48/1870.jpg?1712004020 + url: /people/1870-hayao-miyazaki + - id: 1515 + name: Issei Miyazaki + russian: Иссэй Миядзаки + image: + original: /system/people/original/1515.jpg?1717533598 + preview: /system/people/preview/1515.jpg?1717533598 + x96: /system/people/x96/1515.jpg?1717533598 + x48: /system/people/x48/1515.jpg?1717533598 + url: /people/1515-issei-miyazaki + - id: 1055 + name: Aoi Miyazaki + russian: Аой Миядзаки + image: + original: /system/people/original/1055.jpg?1717533363 + preview: /system/people/preview/1055.jpg?1717533363 + x96: /system/people/x96/1055.jpg?1717533363 + x48: /system/people/x48/1055.jpg?1717533363 + url: /people/1055-aoi-miyazaki + - id: 2156 + name: Chieko Miyazaki + russian: Тиэко Миядзаки + image: + original: /system/people/original/2156.jpg?1717619764 + preview: /system/people/preview/2156.jpg?1717619764 + x96: /system/people/x96/2156.jpg?1717619764 + x48: /system/people/x48/2156.jpg?1717619764 + url: /people/2156-chieko-miyazaki + - id: 9025 + name: Kohei Miyazaki + russian: Кохэй Миядзаки + image: + original: /assets/globals/missing_original.jpg + preview: /assets/globals/missing_preview.jpg + x96: /assets/globals/missing_x96.jpg + x48: /assets/globals/missing_x48.jpg + url: /people/9025-kohei-miyazaki + - id: 6002 + name: Gorou Miyazaki + russian: Горо Миядзаки + image: + original: /system/people/original/6002.jpg?1712005172 + preview: /system/people/preview/6002.jpg?1712005172 + x96: /system/people/x96/6002.jpg?1712005172 + x48: /system/people/x48/6002.jpg?1712005172 + url: /people/6002-gorou-miyazaki + - id: 6427 + name: Shuu Miyazaki + russian: Сю Миядзаки + image: + original: /assets/globals/missing_original.jpg + preview: /assets/globals/missing_preview.jpg + x96: /assets/globals/missing_x96.jpg + x48: /assets/globals/missing_x48.jpg + url: /people/6427-shuu-miyazaki + - id: 11994 + name: Shinji Miyazaki + russian: Синдзи Миядзаки + image: + original: /system/people/original/11994.jpg?1716842384 + preview: /system/people/preview/11994.jpg?1716842384 + x96: /system/people/x96/11994.jpg?1716842384 + x48: /system/people/x48/11994.jpg?1716842384 + url: /people/11994-shinji-miyazaki + - id: 7922 + name: Hiromu Miyazaki + russian: Хирому Миядзаки + image: + original: /system/people/original/7922.jpg?1712005680 + preview: /system/people/preview/7922.jpg?1712005680 + x96: /system/people/x96/7922.jpg?1712005680 + x48: /system/people/x48/7922.jpg?1712005680 + url: /people/7922-hiromu-miyazaki + - id: 10864 + name: Maya Miyazaki + russian: Мая Миядзаки + image: + original: /system/people/original/10864.jpg?1712006308 + preview: /system/people/preview/10864.jpg?1712006308 + x96: /system/people/x96/10864.jpg?1712006308 + x48: /system/people/x48/10864.jpg?1712006308 + url: /people/10864-maya-miyazaki + - id: 10859 + name: Ayumi Miyazaki + russian: Аюми Миядзаки + image: + original: /system/people/original/10859.jpg?1712006354 + preview: /system/people/preview/10859.jpg?1712006354 + x96: /system/people/x96/10859.jpg?1712006354 + x48: /system/people/x48/10859.jpg?1712006354 + url: /people/10859-ayumi-miyazaki + - id: 10524 + name: Akira Miyazaki + russian: Акира Миядзаки + image: + original: /system/people/original/10524.jpg?1712006263 + preview: /system/people/preview/10524.jpg?1712006263 + x96: /system/people/x96/10524.jpg?1712006263 + x48: /system/people/x48/10524.jpg?1712006263 + url: /people/10524-akira-miyazaki + - id: 3027 + name: Masaru Miyazaki + russian: Масару Миядзаки + image: + original: /system/people/original/3027.jpg?1712004482 + preview: /system/people/preview/3027.jpg?1712004482 + x96: /system/people/x96/3027.jpg?1712004482 + x48: /system/people/x48/3027.jpg?1712004482 + url: /people/3027-masaru-miyazaki + - id: 309 + name: Ui Miyazaki + russian: Уи Миядзаки + image: + original: /system/people/original/309.jpg?1712003609 + preview: /system/people/preview/309.jpg?1712003609 + x96: /system/people/x96/309.jpg?1712003609 + x48: /system/people/x48/309.jpg?1712003609 + url: /people/309-ui-miyazaki + - id: 14497 + name: Makoto Miyazaki + russian: Макото Миядзаки + image: + original: /system/people/original/14497.jpg?1716237788 + preview: /system/people/preview/14497.jpg?1716237788 + x96: /system/people/x96/14497.jpg?1716237788 + x48: /system/people/x48/14497.jpg?1716237788 + url: /people/14497-makoto-miyazaki + - id: 14159 + name: Mayu Miyazaki + russian: Маю Миядзаки + image: + original: /system/people/original/14159.jpg?1717792821 + preview: /system/people/preview/14159.jpg?1717792821 + x96: /system/people/x96/14159.jpg?1717792821 + x48: /system/people/x48/14159.jpg?1717792821 + url: /people/14159-mayu-miyazaki + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/publishers/02-all-limit-1000.yaml b/test/fixtures/shikimori/publishers/02-all-limit-1000.yaml new file mode 100644 index 0000000..88afa04 --- /dev/null +++ b/test/fixtures/shikimori/publishers/02-all-limit-1000.yaml @@ -0,0 +1,3104 @@ +metadata: + captured_at: '2026-05-11T07:55:28Z' + label: all-limit-1000 + backend: shikimori + path_slug: publishers +request: + method: GET + url: https://shikimori.io/api/publishers?limit=1000 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 07:55:27 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"aeb4750682ccef742191d2b40c253cfd" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: 84a939ca-fe55-48bf-9062-6964a4759932 + X-Runtime: '0.118343' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 1510 + name: Web Action + - id: 1491 + name: equal + - id: 1511 + name: Natsuyoshi + - id: 1494 + name: Manga DX + - id: 1512 + name: Paru + - id: 1515 + name: Comica + - id: 1513 + name: '&Flower' + - id: 1518 + name: Group + - id: 298 + name: BonBon + - id: 1 + name: Big Comic Original + - id: 2 + name: Young Animal + - id: 4 + name: Afternoon + - id: 6 + name: Young Magazine (Monthly) + - id: 8 + name: Shounen Magazine (Weekly) + - id: 9 + name: Ribon Magazine + - id: 10 + name: Young Magazine (Weekly) + - id: 11 + name: LaLa + - id: 12 + name: Weekly Shounen Sunday + - id: 13 + name: Shounen Gangan + - id: 1698 + name: Web BULL + - id: 15 + name: Cookie + - id: 16 + name: Zipper + - id: 17 + name: Margaret + - id: 19 + name: From Gamers + - id: 20 + name: Nakayoshi + - id: 21 + name: Hana to Yume + - id: 24 + name: Young Gangan + - id: 25 + name: Ultra Jump + - id: 26 + name: Eyes + - id: 28 + name: Comic Blade + - id: 30 + name: Comic Blade Masamune + - id: 31 + name: Newtype + - id: 33 + name: Comic Gum + - id: 1579 + name: Comic ELMO + - id: 36 + name: Asuka Comics DX + - id: 38 + name: Comptiq + - id: 39 + name: Amie Magazine + - id: 41 + name: Gekkan Dragon Magazine + - id: 42 + name: Stencil + - id: 45 + name: Wings + - id: 48 + name: Shounen Magazine (Monthly) + - id: 49 + name: Animerica Extra + - id: 53 + name: Bessatsu Margaret + - id: 54 + name: Betsucomi + - id: 55 + name: Big Comic + - id: 57 + name: Business Jump + - id: 58 + name: Chorus + - id: 59 + name: Ciao + - id: 62 + name: Comic Dengeki Moeoh + - id: 63 + name: Comic Dengeki Teioh + - id: 64 + name: Dragon Junior + - id: 66 + name: GanGan Comics + - id: 67 + name: GanGan Wing + - id: 68 + name: Gundam Ace + - id: 70 + name: Magazine-Z + - id: 71 + name: Melody + - id: 72 + name: Morning + - id: 73 + name: Petit Comic + - id: 74 + name: Princess + - id: 75 + name: Pulp + - id: 79 + name: Shojo Beat + - id: 81 + name: Weekly Shounen Champion + - id: 83 + name: Shounen Jump (Weekly) + - id: 85 + name: Super Jump + - id: 86 + name: Super Manga Blast + - id: 87 + name: Young Jump + - id: 89 + name: Young Sunday (Weekly) + - id: 90 + name: Young You + - id: 91 + name: Comic Birz + - id: 92 + name: Comic Bunch + - id: 94 + name: JuniorChamp + - id: 95 + name: Dessert + - id: 97 + name: Asuka Fantasy DX + - id: 98 + name: Dragon Age + - id: 99 + name: Dear+ + - id: 100 + name: Shounen Sirius + - id: 103 + name: Feel Young + - id: 104 + name: Comique Hug + - id: 105 + name: Ace Next + - id: 106 + name: Horror Comics Special + - id: 107 + name: Genzo + - id: 110 + name: Comic ZERO-SUM + - id: 40 + name: Sunday Gene-X + - id: 3 + name: Big Comic Spirits + - id: 18 + name: Dengeki Comic Gao! + - id: 93 + name: Comic REX + - id: 22 + name: Sho-Comi + - id: 88 + name: Young King OURs + - id: 27 + name: Shounen Ace + - id: 96 + name: Fig + - id: 23 + name: Dengeki Daioh + - id: 111 + name: Bessatsu Friend + - id: 112 + name: Comp Ace + - id: 282 + name: Shounen Champion (Monthly) + - id: 76 + name: Go Go Bunch + - id: 109 + name: Comic Bonbon + - id: 102 + name: Comic Crimson + - id: 113 + name: Kiss + - id: 114 + name: Comic Beam + - id: 115 + name: Famitsu + - id: 116 + name: Magazine E-no + - id: 118 + name: Young Animal Arashi + - id: 119 + name: Comic Blade Zebel + - id: 120 + name: Young Magazine Uppers + - id: 121 + name: Flowers (Monthly) + - id: 122 + name: Comic High! + - id: 123 + name: Kimi to Boku + - id: 124 + name: Cheese! + - id: 125 + name: Aqua Comics + - id: 126 + name: Magazine Be x Boy + - id: 127 + name: Beans Ace + - id: 128 + name: Magazine Special + - id: 129 + name: Shounen Jump (Monthly) + - id: 130 + name: June Comics + - id: 133 + name: Chara + - id: 134 + name: Wink + - id: 135 + name: LaLa DX + - id: 136 + name: Ikki + - id: 137 + name: Comic Alive + - id: 138 + name: Hanaoto + - id: 139 + name: Flower Comics Special + - id: 141 + name: Shousetsu June + - id: 143 + name: Shogakukan Books + - id: 145 + name: June Comics Piace Series + - id: 146 + name: Be x Boy Novels + - id: 147 + name: Super Beboy Comics + - id: 149 + name: Asuka Ciel + - id: 1580 + name: echoz + - id: 151 + name: Asuka Mystery DX + - id: 153 + name: Piace + - id: 156 + name: drap + - id: 157 + name: Shy + - id: 158 + name: Shounen Captain + - id: 163 + name: Dengeki Maoh + - id: 165 + name: Ribon Original + - id: 166 + name: Princess Gold + - id: 167 + name: Mystery Bonita + - id: 168 + name: V-Jump + - id: 169 + name: Manga Time Lovely + - id: 170 + name: ChuChu + - id: 171 + name: Evening + - id: 173 + name: Weekly Playboy + - id: 174 + name: Comic Flapper + - id: 175 + name: Comic Rush + - id: 176 + name: Bessatsu Hana to Yume + - id: 177 + name: Zero-Sum WARD + - id: 179 + name: Biblos + - id: 180 + name: Daiwon + - id: 182 + name: Manga Time Kirara + - id: 184 + name: Reijin + - id: 186 + name: Champion RED + - id: 187 + name: Nemuki + - id: 188 + name: Craft + - id: 189 + name: Aqua Deep + - id: 190 + name: Friend + - id: 191 + name: Boys L + - id: 192 + name: Daria + - id: 193 + name: Comic Cue + - id: 195 + name: Bamboo Comics + - id: 196 + name: Comic Burger + - id: 203 + name: Daito Comics Boys Love + - id: 209 + name: Prism Bunko + - id: 212 + name: Judy + - id: 215 + name: Comi Digi + - id: 216 + name: Young Champion Retsu + - id: 217 + name: Alice + - id: 218 + name: Marukatsu Famicom + - id: 221 + name: Shy Novels + - id: 222 + name: Chara Bunko + - id: 223 + name: B-Boy Slash Novels + - id: 225 + name: Silky + - id: 213 + name: CoroCoro Comic + - id: 219 + name: HertZ + - id: 162 + name: Comic B's-LOG + - id: 178 + name: Gust + - id: 159 + name: RuTile + - id: 132 + name: Shousetsu Chocolat + - id: 152 + name: CIEL TrèsTrès + - id: 198 + name: Dengeki G's magazine + - id: 199 + name: Ribon Bikkuri + - id: 148 + name: Rakuen Web Zoukan + - id: 117 + name: Monthly Action + - id: 227 + name: Love Mission + - id: 230 + name: Junk! Boy + - id: 211 + name: Sho-Comi Zoukan + - id: 210 + name: '@vitamin' + - id: 202 + name: Denshi Birz + - id: 140 + name: Dengeki Bunko Magazine + - id: 201 + name: Kero-kero Ace + - id: 154 + name: Candy Time + - id: 214 + name: E★Everystar + - id: 205 + name: Star☆Girls + - id: 131 + name: GUSH + - id: 197 + name: Cotton Comic + - id: 172 + name: Samurai Ace + - id: 231 + name: Bonita + - id: 232 + name: Deluxe Betsucomi + - id: 233 + name: Kibou no Tomo + - id: 234 + name: Comic Valkyrie + - id: 237 + name: Gothic & Lolita Bible + - id: 240 + name: Bessatsu Young Magazine + - id: 244 + name: Shounen Rival + - id: 246 + name: Novel Japan + - id: 247 + name: Yuri Shimai + - id: 248 + name: Harlequin + - id: 249 + name: Akamaru Jump + - id: 250 + name: Garo + - id: 252 + name: Comic Chara + - id: 254 + name: Ribon Mascot + - id: 255 + name: Deluxe Margaret + - id: 256 + name: SF Adventure + - id: 258 + name: Comic Hotmilk + - id: 260 + name: Dragon Age Pure + - id: 263 + name: Mandala + - id: 264 + name: Big Comic Superior + - id: 266 + name: Cheese! Zoukan + - id: 267 + name: Comic Dragon + - id: 268 + name: Comic Seed! + - id: 269 + name: Comic Avarus + - id: 270 + name: Comic Sai + - id: 272 + name: Ergo + - id: 277 + name: Wonderland + - id: 280 + name: Ace Tokunou + - id: 283 + name: AX + - id: 285 + name: Ohzora Shuppan + - id: 286 + name: Ichiraci + - id: 287 + name: Special Edition Girls' Comic + - id: 288 + name: Seventeen (Monthly) + - id: 289 + name: Petit Flower + - id: 291 + name: SF Magazine + - id: 292 + name: Manga Time Natural + - id: 294 + name: Big Comic for Ladies + - id: 295 + name: Karen + - id: 297 + name: Mist Magazine + - id: 299 + name: Big Gold + - id: 1548 + name: GUSH pit + - id: 301 + name: Manga Shounen + - id: 302 + name: Bouquet + - id: 304 + name: Cutie Comic + - id: 308 + name: Me + - id: 309 + name: Shoujo Friend + - id: 310 + name: Meng Meng Guan + - id: 311 + name: Tales of Magazine + - id: 312 + name: Dragon Magazine + - id: 313 + name: The Margaret + - id: 314 + name: Cookie BOX + - id: 315 + name: Comic Aqua + - id: 316 + name: good! Afternoon + - id: 318 + name: Dengeki Kuro Maoh + - id: 319 + name: Shoujo Teikoku + - id: 320 + name: Pre-Comic Bunbun + - id: 321 + name: Mellow Mellow + - id: 322 + name: Issue + - id: 324 + name: Fellows! + - id: 325 + name: Quick Japan + - id: 326 + name: Kindai Mahjong Original + - id: 327 + name: Infernal Boys + - id: 328 + name: Comic Tenma + - id: 329 + name: The Sneaker + - id: 330 + name: Cobalt + - id: 332 + name: Racish + - id: 333 + name: Chara Selection + - id: 336 + name: Fairbell Comics + - id: 337 + name: Cita Cita + - id: 339 + name: Men's Young + - id: 341 + name: Serie Mystery + - id: 343 + name: Televi Magazine + - id: 344 + name: Televi Magazine Zoukan Tele Manga Heros + - id: 1581 + name: Comic Berry's + - id: 346 + name: KG + - id: 348 + name: Comic LO + - id: 307 + name: YOU + - id: 290 + name: Tonari no Young Jump + - id: 229 + name: Shounen Sunday + - id: 279 + name: Gekkan! Spirits + - id: 350 + name: Comic Marble + - id: 351 + name: Doki~! + - id: 1654 + name: Comic Vamp + - id: 355 + name: Manga Time + - id: 271 + name: Comic@loid + - id: 305 + name: Web Comic Action + - id: 276 + name: FlexComix Blood + - id: 281 + name: Comic Gamest + - id: 335 + name: Yuri☆Koi + - id: 331 + name: Phryné + - id: 265 + name: Young King OURs+ + - id: 257 + name: IQ Jump + - id: 261 + name: Ichiban Suki + - id: 245 + name: Gangan Powered + - id: 342 + name: Dengeki D-manga Online + - id: 273 + name: Dengeki Daioh Web Comic + - id: 274 + name: b-Boy Zips + - id: 239 + name: Mugenkan + - id: 356 + name: Manga Time Original + - id: 358 + name: Manga Time Family + - id: 359 + name: Manga Time Jumbo + - id: 360 + name: Manga Time Special + - id: 361 + name: Manga Time Kirara Carat + - id: 284 + name: Shougaku Sannensei + - id: 365 + name: Manga Time Kirara Forward + - id: 366 + name: Suspiria + - id: 367 + name: Kindai Mahjong + - id: 369 + name: Vitaman + - id: 370 + name: Renai Paradise + - id: 371 + name: Manga Allman + - id: 375 + name: Manga Club + - id: 376 + name: Manga Club Original + - id: 377 + name: Manga Home + - id: 378 + name: Pachinko 777 + - id: 379 + name: Manga Life + - id: 380 + name: Manga Life Original + - id: 381 + name: Neko Para + - id: 384 + name: Namaiki! + - id: 385 + name: Melon Comic + - id: 388 + name: Charade + - id: 389 + name: Egoist + - id: 390 + name: Office YOU + - id: 391 + name: Kindai Mahjong Gold + - id: 392 + name: Chara Mel + - id: 394 + name: Opera + - id: 395 + name: The Hana to Yume + - id: 396 + name: Comic Magazine LYNX + - id: 1583 + name: Shousetsu Wings + - id: 401 + name: Web Comic High! + - id: 402 + name: Dengeki PlayStation + - id: 403 + name: Young Ace + - id: 404 + name: Comic Megastore + - id: 408 + name: Manga Erotics F + - id: 409 + name: Rinka + - id: 410 + name: Comic Ryu + - id: 411 + name: Shounen Sunday Super + - id: 412 + name: Gangan Joker + - id: 413 + name: Petit Princess + - id: 414 + name: Bushiroad TCG Magazine + - id: 415 + name: Morning KC + - id: 416 + name: Party + - id: 417 + name: Comic Yuri Hime S + - id: 420 + name: Sugar + - id: 421 + name: Sylph + - id: 423 + name: Comic Yuri Hime + - id: 424 + name: Ichibansuki + - id: 1795 + name: MeltyBullet + - id: 426 + name: Chance + - id: 428 + name: Comic Momohime + - id: 429 + name: Mr. Magazine + - id: 430 + name: Fujimi Fantasia Bunko + - id: 431 + name: Studio Voice + - id: 432 + name: Un Poco + - id: 433 + name: Mobile Flower + - id: 434 + name: Champion RED Ichigo + - id: 435 + name: Generous Kiss + - id: 436 + name: Hanamaru + - id: 437 + name: Mon Mon + - id: 439 + name: NyanType + - id: 440 + name: FlexComix Next + - id: 442 + name: Flex Comix + - id: 443 + name: Comic Fans + - id: 445 + name: Magi-Cu + - id: 447 + name: Kurofune Zero + - id: 448 + name: Shounen Takarajima (Weekly) + - id: 449 + name: Anise Magazine + - id: 450 + name: Bessatsu Shounen Magazine + - id: 451 + name: Young Comic + - id: 452 + name: Comic Masyo + - id: 453 + name: Dengeki Teioh + - id: 454 + name: KERA + - id: 455 + name: Young Manga + - id: 456 + name: Uppers (Kodansha) + - id: 457 + name: Enjuru + - id: 458 + name: Nikutaiha + - id: 459 + name: Yomban + - id: 460 + name: Cab + - id: 461 + name: Super Dash Bunko + - id: 462 + name: Kinniku Otoko + - id: 463 + name: Shounen Big Comic + - id: 464 + name: Comic Penguin Club + - id: 465 + name: Dragon Youth + - id: 466 + name: Citron + - id: 467 + name: BGM + - id: 468 + name: Bokura + - id: 469 + name: Pureri + - id: 419 + name: Gangan Online + - id: 363 + name: Manga Time Kirara MAX + - id: 470 + name: Tsubomi + - id: 471 + name: Ichijinsha Mobile + - id: 472 + name: Catalogue Series + - id: 473 + name: MARBLE + - id: 475 + name: Comic BunBun + - id: 399 + name: Comic Spica + - id: 446 + name: Comic Flamingo R + - id: 398 + name: Comic Mahou no iLand + - id: 406 + name: Comic Master + - id: 438 + name: Ribon Deluxe + - id: 476 + name: Dengeki Nintendo DS + - id: 477 + name: Vanilla + - id: 478 + name: Swan Magazine + - id: 479 + name: TYPE-MOON Ace + - id: 480 + name: Hanaoto DX + - id: 482 + name: CIEL + - id: 483 + name: Shounen King + - id: 484 + name: Jump SQ.19 + - id: 485 + name: Oh Super Jump + - id: 487 + name: Comic Potpourri Club + - id: 488 + name: Jidaigeki Manga JIN + - id: 489 + name: Web Magazine Wings + - id: 490 + name: ZERO + - id: 491 + name: AniSen + - id: 492 + name: Comic Gaia + - id: 493 + name: Kirara 16 + - id: 494 + name: Dengeki Daioh Genesis + - id: 495 + name: Comic Shingeki + - id: 498 + name: Mephisto + - id: 499 + name: ARIA + - id: 502 + name: Comic Comp + - id: 503 + name: Ace Assault + - id: 504 + name: Booking + - id: 505 + name: Nemesis + - id: 506 + name: Ultra Jump Egg + - id: 507 + name: Hitomi + - id: 508 + name: Comic NORA + - id: 509 + name: Comic Candoll + - id: 510 + name: Muteki Renai S*girl + - id: 512 + name: super Robot Magazine + - id: 513 + name: E★2 + - id: 514 + name: Action Pizazz + - id: 515 + name: Shounen Jets (Monthly) + - id: 517 + name: Comic Charge + - id: 518 + name: Comic YA! + - id: 519 + name: Ace Momogumi + - id: 520 + name: Comic Tom (Monthly) + - id: 521 + name: Comic Tom Plus + - id: 523 + name: Comic Kwai + - id: 525 + name: Comic Sangokushi + - id: 526 + name: Shonen Shojo Bokeno + - id: 527 + name: Shounen Club + - id: 530 + name: Mobile Man + - id: 531 + name: MiChao + - id: 532 + name: Famitsu Comic Clear + - id: 533 + name: Comic Kairaku-ten + - id: 534 + name: Horror M + - id: 535 + name: Young Jump (Monthly) + - id: 536 + name: Megami Magazine + - id: 537 + name: Action Pizazz DX + - id: 538 + name: WAaI! + - id: 539 + name: Yomiuri Shimbun + - id: 541 + name: Aqua PiPi + - id: 542 + name: Super Strong Jump + - id: 543 + name: Comic Sumomo + - id: 545 + name: Rakuen Le Paradis + - id: 546 + name: Play Comic + - id: 547 + name: Nakayoshi Lovely + - id: 548 + name: Shounen Jump NEXT! + - id: 550 + name: Canna + - id: 551 + name: Apple Collection + - id: 552 + name: Comic Manga Ou + - id: 553 + name: BLink + - id: 555 + name: Comic Mujin + - id: 1585 + name: Kindan Lovers + - id: 557 + name: pocopoco + - id: 558 + name: Comic Hanaman + - id: 559 + name: Comic B's-LOG Air Raid + - id: 560 + name: Young Animal Island + - id: 562 + name: Comic Champ + - id: 564 + name: ITAN + - id: 565 + name: Web Comic Beat's + - id: 567 + name: Jump X + - id: 569 + name: Comic Unreal + - id: 571 + name: Comic Aun + - id: 573 + name: Comic Gene + - id: 575 + name: Young King + - id: 577 + name: Buster Comic + - id: 579 + name: Comic RiN + - id: 474 + name: RuTiLe Sweet + - id: 529 + name: b-Boy Honey + - id: 500 + name: Manga Sunday + - id: 581 + name: Comic Kairaku-ten Beast + - id: 582 + name: Comic Megastore H + - id: 584 + name: Comic Yell! + - id: 585 + name: Comic MegaMilk + - id: 589 + name: Comic Shitsuraku-ten + - id: 561 + name: Bessatsu Young Champion + - id: 486 + name: Ane-kei Petit Comic + - id: 522 + name: Dengeki Hobby Magazine + - id: 540 + name: Kiss PLUS + - id: 549 + name: Niconico Yuri Hime + - id: 524 + name: JC.COM + - id: 496 + name: Febri + - id: 501 + name: Asahi Shougakusei Shinbun + - id: 554 + name: Comic Bee + - id: 544 + name: Oto☆Nyan + - id: 528 + name: Comic B's-LOG Kyun! + - id: 591 + name: Gessan + - id: 593 + name: Club Sunday + - id: 595 + name: Comic Penguin Club Sanzokuban + - id: 597 + name: New Youth + - id: 601 + name: Comic Purumelo + - id: 605 + name: Comic@Bunch + - id: 607 + name: Manga Goraku + - id: 609 + name: Comic XO + - id: 611 + name: Ciao DX + - id: 615 + name: Web Comic Gekkin + - id: 617 + name: Comic MILF + - id: 621 + name: For Mrs. + - id: 623 + name: Comic Plum + - id: 625 + name: Koi June + - id: 1655 + name: Manga Life Joshi-bu + - id: 629 + name: BOY'S Pierce + - id: 631 + name: Comic June + - id: 633 + name: Comic P Flirt + - id: 635 + name: Nekopanchi + - id: 637 + name: Web Spica + - id: 639 + name: Comic MegaCube + - id: 641 + name: Angel Club + - id: 643 + name: Comic Himedorobow + - id: 645 + name: Jun-ai Kajitsu + - id: 647 + name: Comic Bazooka + - id: 649 + name: Comic Pot + - id: 651 + name: Karyou Gakuen Shotoubu + - id: 653 + name: Newtype Ace + - id: 655 + name: Manga Bangaichi + - id: 659 + name: Comic Sigma + - id: 661 + name: Comic Papipo + - id: 663 + name: Shoujo Club + - id: 665 + name: Boys Capi! + - id: 667 + name: Kuro LaLa + - id: 669 + name: Shiro LaLa + - id: 671 + name: Comic Karyou Gakuen + - id: 679 + name: Action Pizazz Special + - id: 681 + name: Comic Hime-Sakura + - id: 683 + name: Bishoujo Kakumei KIWAME + - id: 685 + name: Comic Dolphin + - id: 687 + name: Canopri Comic + - id: 689 + name: Manga Goraku dokuhon + - id: 691 + name: Miracle Jump + - id: 693 + name: Super Dash & Go! + - id: 695 + name: JUNE + - id: 697 + name: Saikyou Jump + - id: 1584 + name: Berry's Fantasy + - id: 701 + name: Zero-Sum Online + - id: 703 + name: Ribon Special + - id: 705 + name: Big Gangan + - id: 711 + name: Sakura Hearts + - id: 713 + name: Gagaga Bunko + - id: 715 + name: FlexComix Flare + - id: 717 + name: Comic Penguin Celeb + - id: 719 + name: Comic Zenon + - id: 721 + name: Boys Jam! + - id: 723 + name: Next Comic First + - id: 725 + name: Edith + - id: 727 + name: Tech Gian + - id: 731 + name: Comic Are! + - id: 733 + name: Tokage + - id: 735 + name: Mink + - id: 737 + name: Dengeki Moeoh + - id: 739 + name: Age Premium + - id: 741 + name: Altima Ace + - id: 743 + name: Comic Fantasy + - id: 745 + name: Pianissimo + - id: 747 + name: Ubu Mode + - id: 749 + name: Elegance Eve + - id: 751 + name: Comic Noizy + - id: 755 + name: moca + - id: 757 + name: Cheri + - id: 759 + name: Comic Situation Play + - id: 761 + name: Comic Comomo + - id: 763 + name: Men's Gold + - id: 765 + name: Comic MESSI + - id: 767 + name: Comic Mate + - id: 769 + name: Comic GEKI-YABA + - id: 771 + name: Comic ino. + - id: 773 + name: 2D Dream Magazine + - id: 775 + name: Comic Prism + - id: 777 + name: Video Boy + - id: 779 + name: Giga 69 + - id: 707 + name: Comic Earth☆Star + - id: 673 + name: Naver Webtoon + - id: 619 + name: Comic Megaplus + - id: 603 + name: Comic 0EX + - id: 781 + name: Koushoku Shounen + - id: 783 + name: Otome High! + - id: 785 + name: Comic Zero-Shiki + - id: 787 + name: World Soccer King + - id: 789 + name: Romance Tiara + - id: 791 + name: Girls forM + - id: 599 + name: Jour Suteki na Shufu-tachi + - id: 677 + name: Comic Be + - id: 729 + name: Hana to Yume Online + - id: 657 + name: Bishoujo-teki Kaikatsuryoku + - id: 793 + name: Bessatsu Friend Zoukan BetsuFure + - id: 795 + name: Dengeki Hime + - id: 675 + name: Jump SQ.LaB + - id: 797 + name: Comic Historia + - id: 799 + name: Dengeki Comic Japan + - id: 801 + name: Comic Dangan + - id: 1587 + name: Manga Gaugau + - id: 805 + name: Ao Lala + - id: 813 + name: Bessatsu Shounen Champion + - id: 815 + name: Betsuma Sister + - id: 817 + name: Cocohana + - id: 821 + name: onBLUE + - id: 823 + name: Manga Life Win + - id: 1057 + name: Kissui + - id: 827 + name: Comic Meteor + - id: 829 + name: Renai Love MAX + - id: 833 + name: Gelatin + - id: 835 + name: Renai Cherry Pink + - id: 837 + name: Young Jump (Weekly) + - id: 839 + name: Famitsu Bros + - id: 841 + name: Famitsu PS2 + - id: 843 + name: Famitsu PS + - id: 847 + name: Manga Action + - id: 849 + name: Dengeki Nintendo for KIDS + - id: 851 + name: Comic Break + - id: 853 + name: Comic Ran + - id: 855 + name: Shougaku Yonensei + - id: 857 + name: Blade Online + - id: 859 + name: Shounen Magazine+ (Monthly) + - id: 863 + name: Aka Lala + - id: 865 + name: Baby + - id: 867 + name: Comic BugBug + - id: 869 + name: Comic Milk Purin + - id: 871 + name: Comic Mega Gold + - id: 873 + name: Comic Jumbo + - id: 875 + name: Comic Kairaku-ten XTC + - id: 879 + name: WAaI! Mahalo + - id: 885 + name: MF Bunko J + - id: 889 + name: Grand Jump Premium + - id: 891 + name: MAG Garden Comic Online + - id: 893 + name: Manga Town + - id: 897 + name: Tonari no Young Jump + - id: 899 + name: Oyajism + - id: 901 + name: Hontou ni Atta Kowai Hanashi + - id: 903 + name: Comic Cyutt + - id: 905 + name: B'S Anima + - id: 907 + name: Cita-NIUM + - id: 910 + name: Bessatsu Manga Goraku + - id: 912 + name: Manga Palette Lite + - id: 914 + name: Leed Comic + - id: 916 + name: Blade Online + - id: 918 + name: Shougaku Ninensei + - id: 920 + name: Manga Goccha + - id: 922 + name: The Dessert + - id: 924 + name: GUSH pêche + - id: 926 + name: Young Champ + - id: 928 + name: Hobby Japan + - id: 932 + name: GA Bunko Magazine + - id: 933 + name: u17 + - id: 935 + name: Manga Time Kirara Miracle! + - id: 937 + name: Shounen + - id: 939 + name: Gangan Wing + - id: 941 + name: Comic Heaven + - id: 943 + name: Comic Polaris + - id: 945 + name: Weekly ASCII + - id: 947 + name: Grand Jump + - id: 949 + name: Persona Magazine + - id: 951 + name: Reijin Bravo! + - id: 953 + name: Harta + - id: 955 + name: Comic X-Eros + - id: 957 + name: Comic Milk Purin + - id: 959 + name: Comic Prism + - id: 961 + name: Comic Situation Play + - id: 963 + name: Comic ino. + - id: 965 + name: Comic Orecano! + - id: 967 + name: Jump VS + - id: 969 + name: Comic Comomo + - id: 971 + name: Men's GOLD + - id: 973 + name: Comic Mate + - id: 975 + name: Renai Revolution + - id: 977 + name: Comic Moe Max + - id: 979 + name: Bishoujo Kakumei KIWAME Road + - id: 981 + name: Comic Maihime Musou + - id: 983 + name: Comic Anthurium + - id: 985 + name: Shousetsu B-Boy + - id: 987 + name: Comic Rats + - id: 989 + name: Magazine WOoooo! + - id: 991 + name: Colorful Drops + - id: 993 + name: Comic Magnum + - id: 995 + name: Comic Jumbo + - id: 845 + name: Daum Webtoon + - id: 811 + name: Hirari, + - id: 1586 + name: Manga Bang + - id: 999 + name: Saizensen + - id: 1001 + name: Cheri+ + - id: 1003 + name: Comic Shoujo Shiki + - id: 1005 + name: Ura Sunday + - id: 1007 + name: Kadokawa Niconico Ace + - id: 1009 + name: bianca + - id: 1011 + name: Comic Himekuri + - id: 1013 + name: Jump LIVE + - id: 1015 + name: Champion Tap! + - id: 1017 + name: Comic Revolution + - id: 1019 + name: Action Pizazz HB + - id: 1021 + name: Comic Megastore Alpha + - id: 1023 + name: haruca + - id: 1025 + name: B's-LOVEY recottia + - id: 1027 + name: Comic Shoujo Tengoku + - id: 1029 + name: Comic Moog + - id: 1033 + name: Manga 4-koma Palette + - id: 1035 + name: Men's Young Special Ikazuchi + - id: 1037 + name: Action Young + - id: 1039 + name: ihr hertZ + - id: 1041 + name: Hinakan Hi! + - id: 1045 + name: Futabasha Web Magazine + - id: 1047 + name: Manga Aiki + - id: 1049 + name: Cabaret-Club Comic + - id: 1051 + name: Comic Muga + - id: 1053 + name: Comic Mugen Tensei + - id: 1055 + name: Comic Lemon Club + - id: 1059 + name: LaLa Melody Online + - id: 1061 + name: Manga Box + - id: 1063 + name: Kurage Bunch + - id: 1065 + name: BOX-AiR + - id: 1067 + name: Young Hip + - id: 1069 + name: Magazine WOoooo! B-gumi + - id: 1071 + name: Hana to Yume Plus + - id: 1073 + name: ChobeComi! + - id: 1075 + name: Hontou ni Kowai Douwa + - id: 1077 + name: Nate Manhwa + - id: 1079 + name: Web Ikipara Comic + - id: 1081 + name: Comic Minimon + - id: 1083 + name: Comic KOH + - id: 1085 + name: Comic Gekiman + - id: 1087 + name: KiSSCA + - id: 1089 + name: Manga Time Kirara☆Magica + - id: 1091 + name: Prince (Quarterly) + - id: 1093 + name: Model Graphix + - id: 1095 + name: Harmony Romance Zoukangou + - id: 1097 + name: Yawaraka Spirits + - id: 1099 + name: Comic Gamma + - id: 1101 + name: Manga Hot Milk + - id: 1103 + name: Web Comic Gamma + - id: 1105 + name: Gensou Fantasy + - id: 1107 + name: Magazine Cyberia + - id: 1109 + name: B's-LOVEY Katsubou + - id: 1111 + name: Comic Dolphin Jr. + - id: 1113 + name: Comic Grape + - id: 1115 + name: Doki~! Special + - id: 1117 + name: Comic Pururun Max + - id: 1119 + name: G'sister + - id: 1121 + name: Young Animal Densi + - id: 1123 + name: Comic Ran Twins + - id: 1125 + name: motto! + - id: 1127 + name: Mei + - id: 1129 + name: Fresh Jump + - id: 1131 + name: Manga Bon + - id: 1133 + name: Manga Ai! Hime + - id: 1135 + name: Suiyoubi no Sirius + - id: 1137 + name: Comic Break + - id: 1139 + name: Web Comic Zenyon + - id: 1141 + name: Hatsu Kiss + - id: 1143 + name: AYLA + - id: 1145 + name: Run Run + - id: 1147 + name: Comic Holic + - id: 1149 + name: Comic Tokumori + - id: 1151 + name: Graman Geki! + - id: 1153 + name: Ane LaLa + - id: 1155 + name: Big Comic Zoukan + - id: 1157 + name: Dengeki G's Comic + - id: 1165 + name: Tokusatsu Ace + - id: 1167 + name: Dengeki Girl's Style + - id: 1171 + name: Comic Europa + - id: 1177 + name: Comic Ero-tama + - id: 1175 + name: Aoharu + - id: 1179 + name: Manga Zettai Manzoku + - id: 1181 + name: Ponimaga + - id: 1183 + name: Magalabo + - id: 1185 + name: Cyberia ManiaEX + - id: 1189 + name: Handy Comic + - id: 1656 + name: bamB! + - id: 1195 + name: Young Magazine the 3rd + - id: 1199 + name: drap Milk + - id: 1207 + name: Manga Grimm Douwa + - id: 1197 + name: Aqua BL Kingdom + - id: 1191 + name: Hana to Yume Planet + - id: 1213 + name: Comic Dengeki Daioh "g" + - id: 1043 + name: Comic ChoiS! + - id: 1211 + name: Comic Man-Ten + - id: 1205 + name: Animage + - id: 1163 + name: Asahi Shinbun + - id: 1203 + name: Comic Ran-Oh! + - id: 1173 + name: Shounen Fang + - id: 1169 + name: Big Comic Original Zoukan + - id: 1588 + name: Charles Mag Omegaverse + - id: 1209 + name: Shounen Jump+ + - id: 1215 + name: Megastore + - id: 1217 + name: Comic Garden + - id: 1219 + name: Manga Life MOMO + - id: 1223 + name: GUSH Pochi. + - id: 1225 + name: Juicy + - id: 1221 + name: Kurofune Momo + - id: 1229 + name: Mebae + - id: 1231 + name: Manga Kisoutengai + - id: 1233 + name: Comic Gang + - id: 1235 + name: Manga Life STORIA + - id: 1237 + name: Josei Seven + - id: 1239 + name: Nakayoshi Deluxe + - id: 1241 + name: Zettai Renai Sweet + - id: 1243 + name: Monthly QooPA! + - id: 1245 + name: DVD Majiyaba + - id: 1249 + name: Comic Magnum X + - id: 1247 + name: Hanamaru Manga + - id: 1253 + name: Mink + - id: 1251 + name: Animal House + - id: 1227 + name: Bessatsu Kindai Mahjong + - id: 1257 + name: Cyber Comics + - id: 1263 + name: Bstreet + - id: 1267 + name: Bushiroad (Monthly) + - id: 1261 + name: iHertZ + - id: 1265 + name: Manga Erotopia + - id: 1270 + name: Monthly Shounen Magazine+ + - id: 1271 + name: Comic Genra + - id: 1273 + name: Lezhin Comics Webtoon + - id: 1274 + name: Comic Toutetsu + - id: 1276 + name: Apple Mystery + - id: 1275 + name: Bokkinia + - id: 1272 + name: Magazine Fresh! + - id: 1277 + name: Comic fleur + - id: 1278 + name: comico + - id: 1280 + name: Comicomi + - id: 1281 + name: Zoukan flowers + - id: 1589 + name: Digital Punipedo! + - id: 1283 + name: Comic Orca + - id: 1284 + name: Shincho 45 + - id: 1285 + name: Kono Manga ga Sugoi! Web + - id: 1286 + name: Manga Goraku Nexter + - id: 1288 + name: Comic Bavel + - id: 1287 + name: SPA! + - id: 1279 + name: Comic it + - id: 1161 + name: Zoukan Young Gangan + - id: 1293 + name: Manga Animec + - id: 1296 + name: Bouquet DX + - id: 1590 + name: Hero's + - id: 1298 + name: Champion Cross + - id: 1299 + name: Shuunin ga Yuku! Special + - id: 1300 + name: Comic Ran + - id: 1301 + name: Gene pixiv + - id: 1289 + name: Shuukan Bunshun + - id: 1303 + name: Capbon! + - id: 1306 + name: Bessatsu Harmony Romance + - id: 1305 + name: Chance+ + - id: 1308 + name: Shounen Magazine R + - id: 1307 + name: Qpa + - id: 1302 + name: Manga Goraku Special + - id: 1304 + name: Dengeki hp + - id: 1310 + name: Karyou Sakuragumi Etsu + - id: 1297 + name: Comic Ruelle + - id: 1312 + name: Shounen Magazine Edge + - id: 1313 + name: Gougai onBLUE + - id: 1314 + name: Harmony Romance + - id: 1315 + name: Emerald + - id: 1317 + name: BOY'S Pierce Kindan + - id: 1316 + name: Jump SQ.Crown + - id: 1318 + name: Comic Mate Legend + - id: 1319 + name: Comic Mega GOLD + - id: 1320 + name: Comic Saija + - id: 1321 + name: Comic Mana + - id: 1323 + name: Hana LaLa online + - id: 1325 + name: Dengeki Bazooka!! + - id: 1324 + name: Garaku no Mori + - id: 1292 + name: Shousetsu Chara + - id: 1322 + name: Comic GENKi + - id: 1291 + name: Action Deluxe + - id: 1311 + name: Morning Party Zoukan + - id: 1294 + name: Lemon People + - id: 1290 + name: MC☆Axis + - id: 1326 + name: Keetai ShuuPlay + - id: 1327 + name: Shousetsu Dear+ + - id: 1329 + name: Goraku Egg + - id: 1328 + name: Renai Hakusho Pastel + - id: 1332 + name: WEBLink + - id: 1333 + name: Qpano + - id: 1331 + name: Comic JSCK + - id: 1309 + name: Comic Cune + - id: 29 + name: twi4 + - id: 5 + name: Web Comic Gum + - id: 1334 + name: Shuukan Gendai + - id: 1335 + name: Magazine pocket + - id: 1336 + name: Shokuman + - id: 1337 + name: Comic HJ Bunko + - id: 1339 + name: Ganma! + - id: 1340 + name: Young Ace UP + - id: 1338 + name: Nintendo Dream + - id: 1330 + name: Comic Zeroshiki + - id: 1341 + name: Falcom Magazine + - id: 1345 + name: Petit Comic Zoukan + - id: 1349 + name: MAGCOMI + - id: 1346 + name: The Sneaker Web + - id: 1352 + name: mimi + - id: 1344 + name: Omegaverse Project + - id: 1342 + name: MIKU-Pack + - id: 1591 + name: Comic Bridge + - id: 1350 + name: Comic Jidai Katsugeki + - id: 1351 + name: Jump Original + - id: 1347 + name: Shounen Gaho + - id: 1348 + name: Morning Horizon in the Centre of Somewhere + - id: 1353 + name: Magazine Bang + - id: 1354 + name: Zoukan Taishuu + - id: 1357 + name: Comic KURiBERON + - id: 1360 + name: Comic GT + - id: 1362 + name: eBigComic4 + - id: 1366 + name: Jump GIGA + - id: 1361 + name: MangaONE + - id: 1370 + name: South + - id: 1359 + name: Badi + - id: 1372 + name: CoroCoro Aniki + - id: 1374 + name: Comic ExE + - id: 1373 + name: Comic Ride + - id: 1371 + name: Comic Newtype + - id: 1376 + name: Comic BEAT + - id: 1379 + name: Comic saseco + - id: 1355 + name: Comic Rise + - id: 1377 + name: Char@ + - id: 1378 + name: Comic Fire + - id: 1358 + name: Comic Bingo + - id: 1375 + name: Pasocom Magazine + - id: 1363 + name: Love Jossie + - id: 1367 + name: Shounen Edgestar + - id: 1368 + name: aQtto! + - id: 1369 + name: Web Magazine f3 + - id: 1895 + name: Touch+ + - id: 1364 + name: Comic Flamingo + - id: 1380 + name: Shuukan Taishuu + - id: 1815 + name: Fairy Tail Magazine (Monthly) + - id: 1388 + name: Shousetsu Shinchou + - id: 1386 + name: pixiv Comic + - id: 1390 + name: Dra-Dra-Dragon Age + - id: 1389 + name: Comicloud + - id: 1391 + name: Comic Ryu Web + - id: 1393 + name: Jump Cross + - id: 1392 + name: Matogrosso + - id: 1396 + name: ShuuPlay News + - id: 1397 + name: Web Bazooka + - id: 1398 + name: Galette + - id: 1401 + name: Doku Ringo Comic + - id: 1403 + name: Alterna pixiv + - id: 1404 + name: Big Gangan Okawari + - id: 1410 + name: Sunday Webry + - id: 1411 + name: Da Vinci + - id: 1402 + name: Reijin Uno! + - id: 1412 + name: One More Kiss + - id: 1413 + name: Manga Life STORIA Dash + - id: 1415 + name: Boys Fan + - id: 1416 + name: b-boy Omegaverse + - id: 1417 + name: Cycomics + - id: 1399 + name: Manga UP! + - id: 1405 + name: Boukenou + - id: 1385 + name: uvu + - id: 1394 + name: Comic Orange Club + - id: 1400 + name: Abumix + - id: 1395 + name: Spinel + - id: 1414 + name: Honey Milk + - id: 1381 + name: WEBgateau + - id: 1406 + name: enigma + - id: 1383 + name: Comic POOL + - id: 1387 + name: OK!COMIC + - id: 1384 + name: Chuuou Kouron + - id: 1409 + name: Cigarillo + - id: 1418 + name: Barazoku + - id: 1419 + name: Gangan pixiv + - id: 1423 + name: Hug pixiv + - id: 1420 + name: Ktoon + - id: 1421 + name: Kindai Manga + - id: 1424 + name: Monster Comics + - id: 1425 + name: pixiv Sylph + - id: 1426 + name: Dragon Age Extra + - id: 1429 + name: Manga Kocchi + - id: 1430 + name: Gachicomi + - id: 1431 + name: LiQulle + - id: 1427 + name: Young Magazine Zoukan Aka Buta + - id: 1433 + name: B's-LOG Cheek + - id: 1440 + name: Love Coffre + - id: 1432 + name: cakes + - id: 1439 + name: KakaoPage + - id: 1438 + name: Pianissimo + - id: 1435 + name: Pucchigumi + - id: 1436 + name: Genbun Magazine + - id: 1442 + name: pixiv Essay + - id: 1444 + name: Suiyoubi wa Mattari Dash X Comic + - id: 1445 + name: Comicawa + - id: 1441 + name: Love Silky + - id: 1443 + name: Kuaikan Manhua + - id: 1447 + name: Sports Today Webtoon + - id: 1428 + name: pixiv Hero's + - id: 1448 + name: Yuruyon + - id: 1446 + name: Comic Gotta + - id: 1449 + name: Comic Alpha + - id: 1450 + name: Princess (Gong Zhu Zhi) + - id: 1451 + name: Manga Park + - id: 1453 + name: Comic PASH! + - id: 1454 + name: Yuri Hime@pixiv + - id: 1456 + name: Manga Cross + - id: 1458 + name: Ohta Web Comic + - id: 1457 + name: b-boy Cube + - id: 1459 + name: Comic Days + - id: 1460 + name: Comic Boost + - id: 1461 + name: D Morning + - id: 1462 + name: Comic MeDu + - id: 1464 + name: Ane Friend + - id: 1465 + name: Palcy + - id: 1466 + name: Minna no Comic + - id: 1467 + name: Comic Corona + - id: 1468 + name: Dra-Dra Sharp# + - id: 1470 + name: Comic Chocolat + - id: 1469 + name: Splush + - id: 1472 + name: Kachicomi + - id: 1473 + name: B's-LOG Comic + - id: 1474 + name: Comic Trail + - id: 1475 + name: Comic Beam 100 + - id: 1476 + name: Young Animal Zero + - id: 1477 + name: Jump SQ.Rise + - id: 1471 + name: .Bloom + - id: 1478 + name: Yoru Sunday + - id: 1487 + name: Charles Mag + - id: 1486 + name: Funwari Jump + - id: 1483 + name: Cia♥ + - id: 1484 + name: Comic Taiga + - id: 1485 + name: Comic Marginal + - id: 1490 + name: Lupin Sansei Official Magazine + - id: 1489 + name: Young King Bessatsu Kingdom + - id: 340 + name: Comic Gardo + - id: 1492 + name: TYPE-MOON Comic Ace + - id: 1488 + name: Comic Tatan + - id: 1493 + name: Torch + - id: 1495 + name: MAGKAN + - id: 1496 + name: kyapi! + - id: 1497 + name: Comic Border + - id: 1498 + name: G-Lish + - id: 1501 + name: Nikkan Gecchan + - id: 1502 + name: Comic Essay Room + - id: 1503 + name: Zoukan Harlequin + - id: 1504 + name: Harlequin Original + - id: 1505 + name: Bessatsu Harlequin + - id: 1500 + name: B.Pilz + - id: 1506 + name: Harlequin darling! + - id: 1507 + name: Dokodemo Young Champion + - id: 1499 + name: Mellow Kiss + - id: 1508 + name: ArkLight Comic + - id: 306 + name: Be-Love + - id: 46 + name: Young King OURs GH + - id: 1159 + name: ComicWalker + - id: 613 + name: G-men + - id: 161 + name: Jump SQ. + - id: 831 + name: Bessatsu CoroCoro Comic + - id: 1268 + name: e Young Magazine + - id: 1422 + name: B-BOY P! + - id: 516 + name: gateau + - id: 400 + name: b-Boy Phoenix + - id: 1343 + name: Men's Action + - id: 1521 + name: Comic KURiBERON Duma + - id: 881 + name: Monthly Hero's + - id: 35 + name: GFantasy + - id: 345 + name: Morning Two + - id: 1452 + name: Web Comic Gamma Plus + - id: 1517 + name: Moae + - id: 1434 + name: Tencent Animation + - id: 587 + name: Web Comic EDEN + - id: 803 + name: Niconico Seiga + - id: 699 + name: Viva☆Tales of Magazine + - id: 1514 + name: Sword Art Online Magazine + - id: 397 + name: Shougaku Gonensei + - id: 1295 + name: HiBaNa + - id: 1509 + name: Manga Bøys + - id: 556 + name: 4-koma Nano Ace + - id: 300 + name: Dengeki G's Festival! Comic + - id: 1520 + name: Bessatsu Shuuman Special + - id: 362 + name: Hontou ni Atta Yukai na Hanashi + - id: 1896 + name: Digital Margaret + - id: 1522 + name: marié + - id: 1523 + name: Manga Jam + - id: 1201 + name: Margaret BOOK Store! + - id: 1524 + name: BOY'S Pierce Kaihatsushitsu + - id: 1525 + name: Young King BULL + - id: 1527 + name: Web DenPlay Comic + - id: 1528 + name: Comic Hu + - id: 1530 + name: Young Jump GOLD + - id: 1526 + name: Nemuki+ + - id: 1529 + name: PriaL + - id: 1531 + name: Comic Qurie + - id: 1533 + name: ASCII Comic (Monthly) + - id: 1532 + name: Sonorama+ + - id: 1535 + name: Kirara Base + - id: 1538 + name: Gaugau Monster + - id: 1539 + name: Comic BE! + - id: 1540 + name: LINE Manga + - id: 1541 + name: Lynx + - id: 1536 + name: Harem + - id: 1543 + name: Manga Doa + - id: 1545 + name: Comic tint + - id: 1544 + name: Flat Hero's + - id: 1534 + name: Towako + - id: 1546 + name: Flos Comic + - id: 1547 + name: Comic Jardin + - id: 1552 + name: G's Comic Anothers + - id: 1551 + name: Gene LINE + - id: 1542 + name: Pinkcherie + - id: 1554 + name: Hana Yume Ai + - id: 1553 + name: B Bunch + - id: 1555 + name: Shounen Jump Zoukan + - id: 1556 + name: PFantapy + - id: 1561 + name: Hontou ni Atta Waraeru Hanashi Pinky + - id: 1557 + name: Comic Polca + - id: 1559 + name: Kimikoi + - id: 1558 + name: MAGxiv + - id: 1563 + name: Comic Fuz + - id: 1560 + name: Ananga Ranga + - id: 1564 + name: One Piece Magazine + - id: 1565 + name: Wild Hero's + - id: 1566 + name: Web .Bloom + - id: 1549 + name: GUSH maniaEX + - id: 1568 + name: Tulle + - id: 1567 + name: Web Baby + - id: 1570 + name: Tokyo Omegaverse + - id: 1573 + name: Kurofune x LINE Manga + - id: 1572 + name: Kurofune pixiv + - id: 1574 + name: Manga Mee + - id: 1575 + name: Young Dragon Age + - id: 1576 + name: Premium Cheese! + - id: 1569 + name: mimosa + - id: 1571 + name: Kurofune + - id: 1592 + name: Young Magazine Web + - id: 1593 + name: Manga Yomonga + - id: 1594 + name: Comic Hotmilk Koime♥ + - id: 1537 + name: Shounen Ace Plus + - id: 1577 + name: Grand Jump Mecha + - id: 1578 + name: Koisuru Soiree + - id: 108 + name: FBonline + - id: 37 + name: .hack//G.U. The World + - id: 251 + name: Millefeui + - id: 226 + name: b-Boy Luv + - id: 393 + name: LaLa Special + - id: 753 + name: Mugen Anthology Series + - id: 1187 + name: Young King OURs Lite + - id: 1516 + name: Morning Shin Magnum Zoukan + - id: 1562 + name: Big Comic Spirits Casual + - id: 1519 + name: COM + - id: 1595 + name: Comic Gucho + - id: 930 + name: Comic Zip + - id: 1550 + name: Afternoon Season Zoukan + - id: 511 + name: Famitsu Playstation+ + - id: 418 + name: b-Rash + - id: 1596 + name: Comic AOHA + - id: 1597 + name: Comic Moog Online + - id: 1598 + name: Weekly Kairaku-ten + - id: 1599 + name: Comic Reboot + - id: 1600 + name: Comic Aun Kai + - id: 1601 + name: Tasogare Shokudou + - id: 1602 + name: Bunshun Online + - id: 1604 + name: Comic Ride Advance + - id: 1605 + name: Yurutto Cafe + - id: 1608 + name: Byou de Wakaru BL + - id: 1606 + name: Love xxx Boys pixiv + - id: 1610 + name: Towako Oboro Emaki + - id: 1611 + name: Comic Miu + - id: 1612 + name: Comic Megastore Deep + - id: 1609 + name: Comic Bull + - id: 1582 + name: Dra-Dra Flat♭ + - id: 1613 + name: Comic Orga + - id: 1614 + name: Haiboku Otome Ecstasy + - id: 1616 + name: Web Opera + - id: 1615 + name: Comic Marginal&h + - id: 1618 + name: Charles Mag Kemono + - id: 1619 + name: Web Manga Bangaichi + - id: 1617 + name: Grand Jump Mucha + - id: 1620 + name: Web Haishin Gekkan + - id: 1622 + name: Pur Comics + - id: 1623 + name: Aokishi + - id: 1628 + name: Love Chula + - id: 1621 + name: miere + - id: 1624 + name: fRag + - id: 1626 + name: Shounen Action (Weekly) + - id: 1627 + name: Leed Cafe + - id: 1607 + name: Muteki Renai S*girl Anette + - id: 1625 + name: Colorful! + - id: 1603 + name: Love Passion + - id: 1630 + name: Web Canna + - id: 1631 + name: Comic Nettai + - id: 206 + name: Shounen Champion (Weekly) + - id: 354 + name: Manga Times (Weekly) + - id: 1633 + name: Strada+ + - id: 1632 + name: Comic RiSky + - id: 1634 + name: from RED + - id: 1636 + name: Dengeki Comic Regulus + - id: 1635 + name: Web Comic Apanta + - id: 1437 + name: One Pack Comic + - id: 627 + name: Boy's LOVE + - id: 1637 + name: Manga Leaf + - id: 1638 + name: Comic Bushiroad Web + - id: 1639 + name: Hontou ni Atta Yukai na Hanashi Geinou Zukyun + - id: 1641 + name: Love Kiss! More + - id: 1640 + name: Nanairo Comics + - id: 1642 + name: Comic Brise + - id: 1646 + name: Young Jump Battle + - id: 1653 + name: Canna Comics + - id: 1643 + name: Comic Marche + - id: 1644 + name: Betsufura + - id: 1648 + name: Comic Picn + - id: 1647 + name: Harta Alternative + - id: 1645 + name: Young Jump Sports + - id: 1193 + name: Comic Ran Twins Sengoku Bushou Retsuden + - id: 1650 + name: BiBit! + - id: 1652 + name: Spicy Whip + - id: 1657 + name: Super Action (Monthly) + - id: 1658 + name: '&.Emo' + - id: 1660 + name: Touhou Gairai Ihen (Web) + - id: 1662 + name: Young Jump Heroine + - id: 1664 + name: Otokonoko Heaven + - id: 1665 + name: Kindan Lovers Mania + - id: 1661 + name: NUUDE + - id: 1663 + name: Baby α + - id: 1659 + name: Touhou Gairai Ihen + - id: 1666 + name: Chouchou + - id: 1667 + name: Comic Grast + - id: 1668 + name: Harmony Prince + - id: 1669 + name: Zanki + - id: 1670 + name: Cyberia Maniacs + - id: 1672 + name: Sho-Comi X + - id: 1673 + name: Corona EX + - id: 1674 + name: CoroCoro Ichiban! + - id: 1675 + name: Mitsukoi Tiara + - id: 1676 + name: Nekoneko Yokochou + - id: 1677 + name: Love Coffre Magic + - id: 1678 + name: Comic Lake + - id: 1679 + name: Zhiyin Manke + - id: 1680 + name: Hero Cross Line + - id: 1681 + name: Bomtoon + - id: 14 + name: Asuka + - id: 1683 + name: B's-LOG Comic (Web Label) + - id: 1684 + name: Halloween + - id: 1686 + name: Toomics + - id: 1689 + name: Alive+ + - id: 1688 + name: Jour Sister + - id: 1690 + name: Ura Sunday Joshi-bu + - id: 1692 + name: Shounen Hana to Yume + - id: 1693 + name: Ri Geng Comics + - id: 1694 + name: Ryona King + - id: 1695 + name: Leed Comic Baku + - id: 1696 + name: Comic Nicola + - id: 1697 + name: noicomi + - id: 1699 + name: Shounen Book + - id: 1700 + name: Shousetsu Hanamaru + - id: 1701 + name: Rekishi Gunzou + - id: 1702 + name: Chocolove + - id: 1703 + name: Purizm + - id: 1704 + name: Hao Manhua + - id: 1707 + name: Mitsukoi Tiara Mania + - id: 1706 + name: Isekai Yanjan + - id: 1708 + name: What (Monthly) + - id: 1671 + name: Young Magazine Kaizokuban + - id: 1031 + name: Otokonoko Jidai + - id: 1710 + name: Comic Bonbon Zoukan + - id: 1709 + name: Toptoon + - id: 1711 + name: Trifle by Hana to Yume + - id: 1712 + name: Manga Gang + - id: 1713 + name: Ima, Grand Jump tte!! + - id: 1714 + name: Comic Nova + - id: 1716 + name: Strada + - id: 1715 + name: Shenman + - id: 1717 + name: Shougaku Rokunensei + - id: 1718 + name: Young Love Comic aya + - id: 1719 + name: Tezucomi + - id: 1720 + name: Peanutoon + - id: 1685 + name: Girigiri Edge + - id: 1651 + name: ARIA@pixiv + - id: 1722 + name: Comic Piatto + - id: 1723 + name: Dengeki Hime + - id: 1724 + name: Comic Alunna + - id: 1726 + name: Young Rosé + - id: 1728 + name: Omajinai Comic + - id: 1687 + name: Yoo + - id: 1727 + name: Web Karen + - id: 1725 + name: Comikuri! + - id: 1730 + name: Ayla Deluxe + - id: 1705 + name: Ane Cheese! + - id: 1682 + name: Rakuen Le Paradis Zoukan + - id: 1691 + name: Grand Jump Web + - id: 1721 + name: Renai Hakusho Sherry Kiss + - id: 1729 + name: '&Sofa' + - id: 1732 + name: Young King Lambda + - id: 1733 + name: mini Berry + - id: 1736 + name: Comic Howl + - id: 1735 + name: gateau near + - id: 1731 + name: CoroCoro Comic (Weekly) + - id: 1741 + name: Baby (Digital) + - id: 1742 + name: Comic Ragchew + - id: 1743 + name: Mystery Magazine + - id: 1744 + name: Omoshiro Book + - id: 1747 + name: Comic Trigger + - id: 1746 + name: Ruvill + - id: 1734 + name: petit Rose + - id: 1738 + name: Love Live! Days + - id: 1737 + name: Love Parfait + - id: 1739 + name: Daioh "g" pixiv + - id: 1740 + name: Manga Top + - id: 1745 + name: Yanchan Web + - id: 1749 + name: Comic Rakuu + - id: 1750 + name: Shougaku Ichinensei + - id: 1751 + name: Ecomix + - id: 1753 + name: Young Jump Daiichiwa + - id: 1748 + name: HanaYume EPO + - id: 1754 + name: Ichijin Plus + - id: 1755 + name: Comic Essay Gekijou + - id: 1752 + name: Souffle + - id: 1756 + name: Comic tant + - id: 425 + name: LC Mystery + - id: 1757 + name: Manga Gaudi + - id: 1759 + name: Bekkan Getsumaga + - id: 1760 + name: Renai Chocolat + - id: 1762 + name: Pie Comics + - id: 1763 + name: Dengeki Moeoh (Web) + - id: 1761 + name: Dragon HG + - id: 1765 + name: Cococomi + - id: 1766 + name: JusToon + - id: 1629 + name: Comic Shigekiteki Squirt!! + - id: 1767 + name: Comic Flapper (Web) + - id: 1768 + name: BL Renai Senka + - id: 1770 + name: Z + - id: 1771 + name: Le Noël + - id: 1772 + name: Comic Flavors + - id: 1773 + name: Comic Kisshug + - id: 1774 + name: Chillche + - id: 1775 + name: G's Channel + - id: 1778 + name: Young King (Monthly) + - id: 1777 + name: Mangapolo Zero + - id: 1779 + name: Mitaina! + - id: 1776 + name: Ane Petit Digital + - id: 1780 + name: Comic & Comic + - id: 1764 + name: Comic Bound + - id: 1781 + name: KITORA + - id: 1817 + name: Malika + - id: 1783 + name: Tokyo 2020 Paralympic Jump + - id: 1784 + name: Opa x Comi + - id: 1785 + name: Zipper Comic + - id: 1786 + name: e-manga + - id: 1787 + name: Adam + - id: 1790 + name: Manga Taishuu + - id: 1791 + name: Young Magazine GT + - id: 1792 + name: DRE Comics + - id: 1789 + name: Asuka (Web) + - id: 1788 + name: Kuro Mitsu + - id: 1794 + name: Getsumaga Kichi + - id: 1793 + name: Shoujo Friend Zoukan + - id: 1769 + name: Comic Baku + - id: 1796 + name: Manga Town Original + - id: 1797 + name: Chuugaku Ichinen Course + - id: 1798 + name: Comic Ogyaaa!! + - id: 1799 + name: Ciao Comi + - id: 1801 + name: Be x Boy Rookies VS + - id: 1802 + name: Empas Manhwa + - id: 1803 + name: Paran Manhwa + - id: 1804 + name: Manga Tengoku + - id: 1805 + name: Bebe + - id: 1807 + name: Verse by LiQulle + - id: 1808 + name: Friday Digital + - id: 1382 + name: Comic Kairaku-ten Hoshi-gumi + - id: 1800 + name: Isekai Raku-ten + - id: 1812 + name: Ciao Plus + - id: 1813 + name: JoJo Magazine + - id: 1811 + name: Televi-kun Super Hero Comics + - id: 1810 + name: Comptiq (Web) + - id: 1814 + name: Creative Comic Collection + - id: 1818 + name: Tokusen Mahjong + - id: 1816 + name: DigiKiss + - id: 1819 + name: Vanilove + - id: 1821 + name: Comic Yamitsuki + - id: 1822 + name: Michikusa + - id: 1823 + name: Galette meets + - id: 1820 + name: Deluxe Bonita + - id: 1824 + name: Biccomi + - id: 1825 + name: Hontou ni Atta Waraeru Hanashi + - id: 1827 + name: pixlib + - id: 1826 + name: AmarE + - id: 1828 + name: Champion Buzz + - id: 1830 + name: Comic Shiny + - id: 1831 + name: Comic Gaira + - id: 1829 + name: The Forward + - id: 1832 + name: Dengeki Maoh (Web) + - id: 1833 + name: All Kaidan + - id: 1834 + name: Yonimo Kimyou na Nekopanchi + - id: 1835 + name: Comic Growl + - id: 1836 + name: Gohan Biyori + - id: 1649 + name: Da Vinci Web + - id: 1837 + name: Niμ + - id: 1838 + name: HykeComic + - id: 47 + name: Young Champion + - id: 1840 + name: Love Kiss! + - id: 1839 + name: Primo + - id: 150 + name: AlphaPolis + - id: 1845 + name: Noche + - id: 1842 + name: Eternity + - id: 1843 + name: Regina + - id: 997 + name: Ciao DX Horror + - id: 1841 + name: '&arche' + - id: 1846 + name: Comic NOAN + - id: 1844 + name: α norn + - id: 1847 + name: Kyoufu no Yakata DX + - id: 1848 + name: Magazine Great + - id: 1849 + name: Televi-kun + - id: 1850 + name: Magazine WOoooo! Wolf + - id: 1851 + name: Chuuichi Jidai + - id: 1852 + name: Comp Ace Comic Connect + - id: 1853 + name: Young Magazine Kakehiki + - id: 1854 + name: Jack Pot + - id: 1856 + name: Comic Dengeki Daioh "g" (Web) + - id: 1855 + name: Comic Killa + - id: 1857 + name: Isekai Tensei LaLa + - id: 1858 + name: Comic G-Es + - id: 1859 + name: VComi + - id: 1860 + name: Yanjan Pixiv + - id: 1861 + name: Shounen Gag Oh + - id: 1864 + name: Comic GAGA + - id: 1862 + name: Story na Onna-tachi + - id: 1865 + name: Cybele Comic + - id: 1866 + name: Shounen Jump Season Special + - id: 1868 + name: Comic Isekai Harem + - id: 1867 + name: Season Jam + - id: 1869 + name: Xingqi Manhua + - id: 1870 + name: Our Feel + - id: 1863 + name: Mitsukoi Tiara Kemono + - id: 1871 + name: Bessatsu Manga Action + - id: 1873 + name: Sa Man Le Hua + - id: 1874 + name: Jumptoon + - id: 1875 + name: Hana to Yume Web + - id: 1876 + name: Captain Tsubasa Magazine + - id: 1878 + name: Lyrica + - id: 1879 + name: Comic Bunch Kai + - id: 1880 + name: Sunday Manga + - id: 1877 + name: Twi Sirius + - id: 1883 + name: Manga-gai + - id: 1881 + name: Comic Ride ivy + - id: 1882 + name: Comic Porta + - id: 1872 + name: Samanhua + - id: 1782 + name: Web Comic Toutetsu + - id: 1885 + name: Custom Comic + - id: 1884 + name: Hayacomi + - id: 1886 + name: Heibon Punch + - id: 1356 + name: Mikosurihan Gekijou Kyonyuu-chan + - id: 1282 + name: Mikosurihan Gekijou Bekkan + - id: 1887 + name: mimi DX + - id: 1888 + name: Papillon + - id: 1889 + name: Bilibili Manhua + - id: 1890 + name: 2D Comic Magazine + - id: 1891 + name: Story na Onna-tachi Black + - id: 1893 + name: Comic Cune (Web) + - id: 1894 + name: Comic Alunna (Web) + - id: 1892 + name: Comic Beam (Web) + - id: 1901 + name: Comic Kaien + - id: 1899 + name: Shiori + - id: 1900 + name: Bessatsu Katei Suspense + - id: 1898 + name: CandleA + - id: 1897 + name: Comic Unicorn + - id: 1902 + name: Goro + - id: 1904 + name: Novecomi+ + - id: 1905 + name: H&F Club + - id: 1903 + name: Web Comic Heaven + - id: 1906 + name: Shuro + - id: 1907 + name: Koi wa Omakase Special + - id: 1909 + name: Loli Babaa Senmon + - id: 1910 + name: Shinkan + - id: 1809 + name: Comic LOE + - id: 1912 + name: Young Unreal Jingai + - id: 1911 + name: ITAN Web Comic + - id: 1913 + name: Yuruyuru Nekopanchi + - id: 1914 + name: Seasons + - id: 1915 + name: Momopan + - id: 1916 + name: Digicomi Shinchou Com² + - id: 1917 + name: LiQulle pathos + - id: 1919 + name: Gaea Original + - id: 1920 + name: B's-LOVEY Comics + - id: 1918 + name: Chara Collection + - id: 1921 + name: Duo + - id: 1922 + name: Shoujo Friend Suspense & Horror Zoukan + - id: 1923 + name: Macross Ace + - id: 1908 + name: Tian Man + - id: 1924 + name: Hobby Japan Web + - id: 1925 + name: Dascomi + - id: 1926 + name: Omoide Shokudou Bekkan + - id: 1927 + name: Young Animal Web + - id: 1928 + name: Dungeon Kouryaku wa Sex de!! + - id: 1929 + name: iHZ + - id: 1957 + name: Lolita Comic Sakura + - id: 1930 + name: Comic Goranshin + - id: 1931 + name: Comic Momohime Deepest + - id: 1932 + name: Kyoufu Taiken + - id: 1933 + name: Nekotomo + - id: 1934 + name: Darkness na Onna-tachi + - id: 1935 + name: Jukujo Monogatari + - id: 1936 + name: Comic GEE + - id: 1937 + name: Biblio Sirius + - id: 1939 + name: Palcy NEXT + - id: 1938 + name: Web Otoko no Ko-llection! S (Monthly) + - id: 1940 + name: bibi + - id: 1942 + name: Hitori Gohan + - id: 1941 + name: Coi-halu + - id: 1943 + name: Comic Nyan2 Club GOLD + - id: 1944 + name: Ridi Webtoon + - id: 1945 + name: Naver Series + - id: 1946 + name: Kakao Webtoon + - id: 1947 + name: Little Girl Strike + - id: 1948 + name: Comic Happining + - id: 1949 + name: Fantasia Battle Royal + - id: 1951 + name: Famitsu DS+Wii + - id: 1950 + name: Marukatsu Super Famicom + - id: 1952 + name: Goraku Web! + - id: 1953 + name: Comic Oz + - id: 1954 + name: Comic Ambre + - id: 1956 + name: Estro + - id: 1955 + name: Manga Hot + - id: 1958 + name: Men's Dolphin + - id: 1959 + name: TakeComi! + - id: 1960 + name: Petit Apple Pie + - id: 1962 + name: Ultra Jump Niconico-ban + - id: 1963 + name: Comic Zerise + - id: 1981 + name: Carmilla + - id: 1982 + name: Oreryuu! Zeppin Meshi + - id: 1965 + name: Comic G.G. + - id: 1966 + name: G-Edge + - id: 1961 + name: Tsuma Petit + - id: 1968 + name: CoroCiao + - id: 1969 + name: GA Comic + - id: 51 + name: Be-Boy Gold + - id: 1970 + name: Manman Manhua + - id: 1967 + name: Mystery Sara + - id: 1971 + name: Comic Y-OURS + - id: 1972 + name: Comic Aily + - id: 1973 + name: Omoide Shokudou + - id: 1974 + name: Tokumori Comic Hitozuma Jukujozakari + - id: 1976 + name: ARTEMIS by sirius + - id: 1975 + name: Jitsuwa Bunka Taboo + - id: 1977 + name: Kirapichi + - id: 1978 + name: The Gazelle + - id: 1979 + name: Canelé + - id: 1980 + name: peep + - id: 1984 + name: Action Hero + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/publishers/03-kodansha-limit1000.yaml b/test/fixtures/shikimori/publishers/03-kodansha-limit1000.yaml new file mode 100644 index 0000000..21169c2 --- /dev/null +++ b/test/fixtures/shikimori/publishers/03-kodansha-limit1000.yaml @@ -0,0 +1,3104 @@ +metadata: + captured_at: '2026-05-11T08:09:52Z' + label: kodansha-limit1000 + backend: shikimori + path_slug: publishers +request: + method: GET + url: https://shikimori.io/api/publishers?limit=1000 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 08:09:51 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"aeb4750682ccef742191d2b40c253cfd" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: c4c44874-8876-41d6-aef8-39e3480982b2 + X-Runtime: '0.147785' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 1510 + name: Web Action + - id: 1491 + name: equal + - id: 1511 + name: Natsuyoshi + - id: 1494 + name: Manga DX + - id: 1512 + name: Paru + - id: 1515 + name: Comica + - id: 1513 + name: '&Flower' + - id: 1518 + name: Group + - id: 298 + name: BonBon + - id: 1 + name: Big Comic Original + - id: 2 + name: Young Animal + - id: 4 + name: Afternoon + - id: 6 + name: Young Magazine (Monthly) + - id: 8 + name: Shounen Magazine (Weekly) + - id: 9 + name: Ribon Magazine + - id: 10 + name: Young Magazine (Weekly) + - id: 11 + name: LaLa + - id: 12 + name: Weekly Shounen Sunday + - id: 13 + name: Shounen Gangan + - id: 1698 + name: Web BULL + - id: 15 + name: Cookie + - id: 16 + name: Zipper + - id: 17 + name: Margaret + - id: 19 + name: From Gamers + - id: 20 + name: Nakayoshi + - id: 21 + name: Hana to Yume + - id: 24 + name: Young Gangan + - id: 25 + name: Ultra Jump + - id: 26 + name: Eyes + - id: 28 + name: Comic Blade + - id: 30 + name: Comic Blade Masamune + - id: 31 + name: Newtype + - id: 33 + name: Comic Gum + - id: 1579 + name: Comic ELMO + - id: 36 + name: Asuka Comics DX + - id: 38 + name: Comptiq + - id: 39 + name: Amie Magazine + - id: 41 + name: Gekkan Dragon Magazine + - id: 42 + name: Stencil + - id: 45 + name: Wings + - id: 48 + name: Shounen Magazine (Monthly) + - id: 49 + name: Animerica Extra + - id: 53 + name: Bessatsu Margaret + - id: 54 + name: Betsucomi + - id: 55 + name: Big Comic + - id: 57 + name: Business Jump + - id: 58 + name: Chorus + - id: 59 + name: Ciao + - id: 62 + name: Comic Dengeki Moeoh + - id: 63 + name: Comic Dengeki Teioh + - id: 64 + name: Dragon Junior + - id: 66 + name: GanGan Comics + - id: 67 + name: GanGan Wing + - id: 68 + name: Gundam Ace + - id: 70 + name: Magazine-Z + - id: 71 + name: Melody + - id: 72 + name: Morning + - id: 73 + name: Petit Comic + - id: 74 + name: Princess + - id: 75 + name: Pulp + - id: 79 + name: Shojo Beat + - id: 81 + name: Weekly Shounen Champion + - id: 83 + name: Shounen Jump (Weekly) + - id: 85 + name: Super Jump + - id: 86 + name: Super Manga Blast + - id: 87 + name: Young Jump + - id: 89 + name: Young Sunday (Weekly) + - id: 90 + name: Young You + - id: 91 + name: Comic Birz + - id: 92 + name: Comic Bunch + - id: 94 + name: JuniorChamp + - id: 95 + name: Dessert + - id: 97 + name: Asuka Fantasy DX + - id: 98 + name: Dragon Age + - id: 99 + name: Dear+ + - id: 100 + name: Shounen Sirius + - id: 103 + name: Feel Young + - id: 104 + name: Comique Hug + - id: 105 + name: Ace Next + - id: 106 + name: Horror Comics Special + - id: 107 + name: Genzo + - id: 110 + name: Comic ZERO-SUM + - id: 40 + name: Sunday Gene-X + - id: 3 + name: Big Comic Spirits + - id: 18 + name: Dengeki Comic Gao! + - id: 93 + name: Comic REX + - id: 22 + name: Sho-Comi + - id: 88 + name: Young King OURs + - id: 27 + name: Shounen Ace + - id: 96 + name: Fig + - id: 23 + name: Dengeki Daioh + - id: 111 + name: Bessatsu Friend + - id: 112 + name: Comp Ace + - id: 282 + name: Shounen Champion (Monthly) + - id: 76 + name: Go Go Bunch + - id: 109 + name: Comic Bonbon + - id: 102 + name: Comic Crimson + - id: 113 + name: Kiss + - id: 114 + name: Comic Beam + - id: 115 + name: Famitsu + - id: 116 + name: Magazine E-no + - id: 118 + name: Young Animal Arashi + - id: 119 + name: Comic Blade Zebel + - id: 120 + name: Young Magazine Uppers + - id: 121 + name: Flowers (Monthly) + - id: 122 + name: Comic High! + - id: 123 + name: Kimi to Boku + - id: 124 + name: Cheese! + - id: 125 + name: Aqua Comics + - id: 126 + name: Magazine Be x Boy + - id: 127 + name: Beans Ace + - id: 128 + name: Magazine Special + - id: 129 + name: Shounen Jump (Monthly) + - id: 130 + name: June Comics + - id: 133 + name: Chara + - id: 134 + name: Wink + - id: 135 + name: LaLa DX + - id: 136 + name: Ikki + - id: 137 + name: Comic Alive + - id: 138 + name: Hanaoto + - id: 139 + name: Flower Comics Special + - id: 141 + name: Shousetsu June + - id: 143 + name: Shogakukan Books + - id: 145 + name: June Comics Piace Series + - id: 146 + name: Be x Boy Novels + - id: 147 + name: Super Beboy Comics + - id: 149 + name: Asuka Ciel + - id: 1580 + name: echoz + - id: 151 + name: Asuka Mystery DX + - id: 153 + name: Piace + - id: 156 + name: drap + - id: 157 + name: Shy + - id: 158 + name: Shounen Captain + - id: 163 + name: Dengeki Maoh + - id: 165 + name: Ribon Original + - id: 166 + name: Princess Gold + - id: 167 + name: Mystery Bonita + - id: 168 + name: V-Jump + - id: 169 + name: Manga Time Lovely + - id: 170 + name: ChuChu + - id: 171 + name: Evening + - id: 173 + name: Weekly Playboy + - id: 174 + name: Comic Flapper + - id: 175 + name: Comic Rush + - id: 176 + name: Bessatsu Hana to Yume + - id: 177 + name: Zero-Sum WARD + - id: 179 + name: Biblos + - id: 180 + name: Daiwon + - id: 182 + name: Manga Time Kirara + - id: 184 + name: Reijin + - id: 186 + name: Champion RED + - id: 187 + name: Nemuki + - id: 188 + name: Craft + - id: 189 + name: Aqua Deep + - id: 190 + name: Friend + - id: 191 + name: Boys L + - id: 192 + name: Daria + - id: 193 + name: Comic Cue + - id: 195 + name: Bamboo Comics + - id: 196 + name: Comic Burger + - id: 203 + name: Daito Comics Boys Love + - id: 209 + name: Prism Bunko + - id: 212 + name: Judy + - id: 215 + name: Comi Digi + - id: 216 + name: Young Champion Retsu + - id: 217 + name: Alice + - id: 218 + name: Marukatsu Famicom + - id: 221 + name: Shy Novels + - id: 222 + name: Chara Bunko + - id: 223 + name: B-Boy Slash Novels + - id: 225 + name: Silky + - id: 213 + name: CoroCoro Comic + - id: 219 + name: HertZ + - id: 162 + name: Comic B's-LOG + - id: 178 + name: Gust + - id: 159 + name: RuTile + - id: 132 + name: Shousetsu Chocolat + - id: 152 + name: CIEL TrèsTrès + - id: 198 + name: Dengeki G's magazine + - id: 199 + name: Ribon Bikkuri + - id: 148 + name: Rakuen Web Zoukan + - id: 117 + name: Monthly Action + - id: 227 + name: Love Mission + - id: 230 + name: Junk! Boy + - id: 211 + name: Sho-Comi Zoukan + - id: 210 + name: '@vitamin' + - id: 202 + name: Denshi Birz + - id: 140 + name: Dengeki Bunko Magazine + - id: 201 + name: Kero-kero Ace + - id: 154 + name: Candy Time + - id: 214 + name: E★Everystar + - id: 205 + name: Star☆Girls + - id: 131 + name: GUSH + - id: 197 + name: Cotton Comic + - id: 172 + name: Samurai Ace + - id: 231 + name: Bonita + - id: 232 + name: Deluxe Betsucomi + - id: 233 + name: Kibou no Tomo + - id: 234 + name: Comic Valkyrie + - id: 237 + name: Gothic & Lolita Bible + - id: 240 + name: Bessatsu Young Magazine + - id: 244 + name: Shounen Rival + - id: 246 + name: Novel Japan + - id: 247 + name: Yuri Shimai + - id: 248 + name: Harlequin + - id: 249 + name: Akamaru Jump + - id: 250 + name: Garo + - id: 252 + name: Comic Chara + - id: 254 + name: Ribon Mascot + - id: 255 + name: Deluxe Margaret + - id: 256 + name: SF Adventure + - id: 258 + name: Comic Hotmilk + - id: 260 + name: Dragon Age Pure + - id: 263 + name: Mandala + - id: 264 + name: Big Comic Superior + - id: 266 + name: Cheese! Zoukan + - id: 267 + name: Comic Dragon + - id: 268 + name: Comic Seed! + - id: 269 + name: Comic Avarus + - id: 270 + name: Comic Sai + - id: 272 + name: Ergo + - id: 277 + name: Wonderland + - id: 280 + name: Ace Tokunou + - id: 283 + name: AX + - id: 285 + name: Ohzora Shuppan + - id: 286 + name: Ichiraci + - id: 287 + name: Special Edition Girls' Comic + - id: 288 + name: Seventeen (Monthly) + - id: 289 + name: Petit Flower + - id: 291 + name: SF Magazine + - id: 292 + name: Manga Time Natural + - id: 294 + name: Big Comic for Ladies + - id: 295 + name: Karen + - id: 297 + name: Mist Magazine + - id: 299 + name: Big Gold + - id: 1548 + name: GUSH pit + - id: 301 + name: Manga Shounen + - id: 302 + name: Bouquet + - id: 304 + name: Cutie Comic + - id: 308 + name: Me + - id: 309 + name: Shoujo Friend + - id: 310 + name: Meng Meng Guan + - id: 311 + name: Tales of Magazine + - id: 312 + name: Dragon Magazine + - id: 313 + name: The Margaret + - id: 314 + name: Cookie BOX + - id: 315 + name: Comic Aqua + - id: 316 + name: good! Afternoon + - id: 318 + name: Dengeki Kuro Maoh + - id: 319 + name: Shoujo Teikoku + - id: 320 + name: Pre-Comic Bunbun + - id: 321 + name: Mellow Mellow + - id: 322 + name: Issue + - id: 324 + name: Fellows! + - id: 325 + name: Quick Japan + - id: 326 + name: Kindai Mahjong Original + - id: 327 + name: Infernal Boys + - id: 328 + name: Comic Tenma + - id: 329 + name: The Sneaker + - id: 330 + name: Cobalt + - id: 332 + name: Racish + - id: 333 + name: Chara Selection + - id: 336 + name: Fairbell Comics + - id: 337 + name: Cita Cita + - id: 339 + name: Men's Young + - id: 341 + name: Serie Mystery + - id: 343 + name: Televi Magazine + - id: 344 + name: Televi Magazine Zoukan Tele Manga Heros + - id: 1581 + name: Comic Berry's + - id: 346 + name: KG + - id: 348 + name: Comic LO + - id: 307 + name: YOU + - id: 290 + name: Tonari no Young Jump + - id: 229 + name: Shounen Sunday + - id: 279 + name: Gekkan! Spirits + - id: 350 + name: Comic Marble + - id: 351 + name: Doki~! + - id: 1654 + name: Comic Vamp + - id: 355 + name: Manga Time + - id: 271 + name: Comic@loid + - id: 305 + name: Web Comic Action + - id: 276 + name: FlexComix Blood + - id: 281 + name: Comic Gamest + - id: 335 + name: Yuri☆Koi + - id: 331 + name: Phryné + - id: 265 + name: Young King OURs+ + - id: 257 + name: IQ Jump + - id: 261 + name: Ichiban Suki + - id: 245 + name: Gangan Powered + - id: 342 + name: Dengeki D-manga Online + - id: 273 + name: Dengeki Daioh Web Comic + - id: 274 + name: b-Boy Zips + - id: 239 + name: Mugenkan + - id: 356 + name: Manga Time Original + - id: 358 + name: Manga Time Family + - id: 359 + name: Manga Time Jumbo + - id: 360 + name: Manga Time Special + - id: 361 + name: Manga Time Kirara Carat + - id: 284 + name: Shougaku Sannensei + - id: 365 + name: Manga Time Kirara Forward + - id: 366 + name: Suspiria + - id: 367 + name: Kindai Mahjong + - id: 369 + name: Vitaman + - id: 370 + name: Renai Paradise + - id: 371 + name: Manga Allman + - id: 375 + name: Manga Club + - id: 376 + name: Manga Club Original + - id: 377 + name: Manga Home + - id: 378 + name: Pachinko 777 + - id: 379 + name: Manga Life + - id: 380 + name: Manga Life Original + - id: 381 + name: Neko Para + - id: 384 + name: Namaiki! + - id: 385 + name: Melon Comic + - id: 388 + name: Charade + - id: 389 + name: Egoist + - id: 390 + name: Office YOU + - id: 391 + name: Kindai Mahjong Gold + - id: 392 + name: Chara Mel + - id: 394 + name: Opera + - id: 395 + name: The Hana to Yume + - id: 396 + name: Comic Magazine LYNX + - id: 1583 + name: Shousetsu Wings + - id: 401 + name: Web Comic High! + - id: 402 + name: Dengeki PlayStation + - id: 403 + name: Young Ace + - id: 404 + name: Comic Megastore + - id: 408 + name: Manga Erotics F + - id: 409 + name: Rinka + - id: 410 + name: Comic Ryu + - id: 411 + name: Shounen Sunday Super + - id: 412 + name: Gangan Joker + - id: 413 + name: Petit Princess + - id: 414 + name: Bushiroad TCG Magazine + - id: 415 + name: Morning KC + - id: 416 + name: Party + - id: 417 + name: Comic Yuri Hime S + - id: 420 + name: Sugar + - id: 421 + name: Sylph + - id: 423 + name: Comic Yuri Hime + - id: 424 + name: Ichibansuki + - id: 1795 + name: MeltyBullet + - id: 426 + name: Chance + - id: 428 + name: Comic Momohime + - id: 429 + name: Mr. Magazine + - id: 430 + name: Fujimi Fantasia Bunko + - id: 431 + name: Studio Voice + - id: 432 + name: Un Poco + - id: 433 + name: Mobile Flower + - id: 434 + name: Champion RED Ichigo + - id: 435 + name: Generous Kiss + - id: 436 + name: Hanamaru + - id: 437 + name: Mon Mon + - id: 439 + name: NyanType + - id: 440 + name: FlexComix Next + - id: 442 + name: Flex Comix + - id: 443 + name: Comic Fans + - id: 445 + name: Magi-Cu + - id: 447 + name: Kurofune Zero + - id: 448 + name: Shounen Takarajima (Weekly) + - id: 449 + name: Anise Magazine + - id: 450 + name: Bessatsu Shounen Magazine + - id: 451 + name: Young Comic + - id: 452 + name: Comic Masyo + - id: 453 + name: Dengeki Teioh + - id: 454 + name: KERA + - id: 455 + name: Young Manga + - id: 456 + name: Uppers (Kodansha) + - id: 457 + name: Enjuru + - id: 458 + name: Nikutaiha + - id: 459 + name: Yomban + - id: 460 + name: Cab + - id: 461 + name: Super Dash Bunko + - id: 462 + name: Kinniku Otoko + - id: 463 + name: Shounen Big Comic + - id: 464 + name: Comic Penguin Club + - id: 465 + name: Dragon Youth + - id: 466 + name: Citron + - id: 467 + name: BGM + - id: 468 + name: Bokura + - id: 469 + name: Pureri + - id: 419 + name: Gangan Online + - id: 363 + name: Manga Time Kirara MAX + - id: 470 + name: Tsubomi + - id: 471 + name: Ichijinsha Mobile + - id: 472 + name: Catalogue Series + - id: 473 + name: MARBLE + - id: 475 + name: Comic BunBun + - id: 399 + name: Comic Spica + - id: 446 + name: Comic Flamingo R + - id: 398 + name: Comic Mahou no iLand + - id: 406 + name: Comic Master + - id: 438 + name: Ribon Deluxe + - id: 476 + name: Dengeki Nintendo DS + - id: 477 + name: Vanilla + - id: 478 + name: Swan Magazine + - id: 479 + name: TYPE-MOON Ace + - id: 480 + name: Hanaoto DX + - id: 482 + name: CIEL + - id: 483 + name: Shounen King + - id: 484 + name: Jump SQ.19 + - id: 485 + name: Oh Super Jump + - id: 487 + name: Comic Potpourri Club + - id: 488 + name: Jidaigeki Manga JIN + - id: 489 + name: Web Magazine Wings + - id: 490 + name: ZERO + - id: 491 + name: AniSen + - id: 492 + name: Comic Gaia + - id: 493 + name: Kirara 16 + - id: 494 + name: Dengeki Daioh Genesis + - id: 495 + name: Comic Shingeki + - id: 498 + name: Mephisto + - id: 499 + name: ARIA + - id: 502 + name: Comic Comp + - id: 503 + name: Ace Assault + - id: 504 + name: Booking + - id: 505 + name: Nemesis + - id: 506 + name: Ultra Jump Egg + - id: 507 + name: Hitomi + - id: 508 + name: Comic NORA + - id: 509 + name: Comic Candoll + - id: 510 + name: Muteki Renai S*girl + - id: 512 + name: super Robot Magazine + - id: 513 + name: E★2 + - id: 514 + name: Action Pizazz + - id: 515 + name: Shounen Jets (Monthly) + - id: 517 + name: Comic Charge + - id: 518 + name: Comic YA! + - id: 519 + name: Ace Momogumi + - id: 520 + name: Comic Tom (Monthly) + - id: 521 + name: Comic Tom Plus + - id: 523 + name: Comic Kwai + - id: 525 + name: Comic Sangokushi + - id: 526 + name: Shonen Shojo Bokeno + - id: 527 + name: Shounen Club + - id: 530 + name: Mobile Man + - id: 531 + name: MiChao + - id: 532 + name: Famitsu Comic Clear + - id: 533 + name: Comic Kairaku-ten + - id: 534 + name: Horror M + - id: 535 + name: Young Jump (Monthly) + - id: 536 + name: Megami Magazine + - id: 537 + name: Action Pizazz DX + - id: 538 + name: WAaI! + - id: 539 + name: Yomiuri Shimbun + - id: 541 + name: Aqua PiPi + - id: 542 + name: Super Strong Jump + - id: 543 + name: Comic Sumomo + - id: 545 + name: Rakuen Le Paradis + - id: 546 + name: Play Comic + - id: 547 + name: Nakayoshi Lovely + - id: 548 + name: Shounen Jump NEXT! + - id: 550 + name: Canna + - id: 551 + name: Apple Collection + - id: 552 + name: Comic Manga Ou + - id: 553 + name: BLink + - id: 555 + name: Comic Mujin + - id: 1585 + name: Kindan Lovers + - id: 557 + name: pocopoco + - id: 558 + name: Comic Hanaman + - id: 559 + name: Comic B's-LOG Air Raid + - id: 560 + name: Young Animal Island + - id: 562 + name: Comic Champ + - id: 564 + name: ITAN + - id: 565 + name: Web Comic Beat's + - id: 567 + name: Jump X + - id: 569 + name: Comic Unreal + - id: 571 + name: Comic Aun + - id: 573 + name: Comic Gene + - id: 575 + name: Young King + - id: 577 + name: Buster Comic + - id: 579 + name: Comic RiN + - id: 474 + name: RuTiLe Sweet + - id: 529 + name: b-Boy Honey + - id: 500 + name: Manga Sunday + - id: 581 + name: Comic Kairaku-ten Beast + - id: 582 + name: Comic Megastore H + - id: 584 + name: Comic Yell! + - id: 585 + name: Comic MegaMilk + - id: 589 + name: Comic Shitsuraku-ten + - id: 561 + name: Bessatsu Young Champion + - id: 486 + name: Ane-kei Petit Comic + - id: 522 + name: Dengeki Hobby Magazine + - id: 540 + name: Kiss PLUS + - id: 549 + name: Niconico Yuri Hime + - id: 524 + name: JC.COM + - id: 496 + name: Febri + - id: 501 + name: Asahi Shougakusei Shinbun + - id: 554 + name: Comic Bee + - id: 544 + name: Oto☆Nyan + - id: 528 + name: Comic B's-LOG Kyun! + - id: 591 + name: Gessan + - id: 593 + name: Club Sunday + - id: 595 + name: Comic Penguin Club Sanzokuban + - id: 597 + name: New Youth + - id: 601 + name: Comic Purumelo + - id: 605 + name: Comic@Bunch + - id: 607 + name: Manga Goraku + - id: 609 + name: Comic XO + - id: 611 + name: Ciao DX + - id: 615 + name: Web Comic Gekkin + - id: 617 + name: Comic MILF + - id: 621 + name: For Mrs. + - id: 623 + name: Comic Plum + - id: 625 + name: Koi June + - id: 1655 + name: Manga Life Joshi-bu + - id: 629 + name: BOY'S Pierce + - id: 631 + name: Comic June + - id: 633 + name: Comic P Flirt + - id: 635 + name: Nekopanchi + - id: 637 + name: Web Spica + - id: 639 + name: Comic MegaCube + - id: 641 + name: Angel Club + - id: 643 + name: Comic Himedorobow + - id: 645 + name: Jun-ai Kajitsu + - id: 647 + name: Comic Bazooka + - id: 649 + name: Comic Pot + - id: 651 + name: Karyou Gakuen Shotoubu + - id: 653 + name: Newtype Ace + - id: 655 + name: Manga Bangaichi + - id: 659 + name: Comic Sigma + - id: 661 + name: Comic Papipo + - id: 663 + name: Shoujo Club + - id: 665 + name: Boys Capi! + - id: 667 + name: Kuro LaLa + - id: 669 + name: Shiro LaLa + - id: 671 + name: Comic Karyou Gakuen + - id: 679 + name: Action Pizazz Special + - id: 681 + name: Comic Hime-Sakura + - id: 683 + name: Bishoujo Kakumei KIWAME + - id: 685 + name: Comic Dolphin + - id: 687 + name: Canopri Comic + - id: 689 + name: Manga Goraku dokuhon + - id: 691 + name: Miracle Jump + - id: 693 + name: Super Dash & Go! + - id: 695 + name: JUNE + - id: 697 + name: Saikyou Jump + - id: 1584 + name: Berry's Fantasy + - id: 701 + name: Zero-Sum Online + - id: 703 + name: Ribon Special + - id: 705 + name: Big Gangan + - id: 711 + name: Sakura Hearts + - id: 713 + name: Gagaga Bunko + - id: 715 + name: FlexComix Flare + - id: 717 + name: Comic Penguin Celeb + - id: 719 + name: Comic Zenon + - id: 721 + name: Boys Jam! + - id: 723 + name: Next Comic First + - id: 725 + name: Edith + - id: 727 + name: Tech Gian + - id: 731 + name: Comic Are! + - id: 733 + name: Tokage + - id: 735 + name: Mink + - id: 737 + name: Dengeki Moeoh + - id: 739 + name: Age Premium + - id: 741 + name: Altima Ace + - id: 743 + name: Comic Fantasy + - id: 745 + name: Pianissimo + - id: 747 + name: Ubu Mode + - id: 749 + name: Elegance Eve + - id: 751 + name: Comic Noizy + - id: 755 + name: moca + - id: 757 + name: Cheri + - id: 759 + name: Comic Situation Play + - id: 761 + name: Comic Comomo + - id: 763 + name: Men's Gold + - id: 765 + name: Comic MESSI + - id: 767 + name: Comic Mate + - id: 769 + name: Comic GEKI-YABA + - id: 771 + name: Comic ino. + - id: 773 + name: 2D Dream Magazine + - id: 775 + name: Comic Prism + - id: 777 + name: Video Boy + - id: 779 + name: Giga 69 + - id: 707 + name: Comic Earth☆Star + - id: 673 + name: Naver Webtoon + - id: 619 + name: Comic Megaplus + - id: 603 + name: Comic 0EX + - id: 781 + name: Koushoku Shounen + - id: 783 + name: Otome High! + - id: 785 + name: Comic Zero-Shiki + - id: 787 + name: World Soccer King + - id: 789 + name: Romance Tiara + - id: 791 + name: Girls forM + - id: 599 + name: Jour Suteki na Shufu-tachi + - id: 677 + name: Comic Be + - id: 729 + name: Hana to Yume Online + - id: 657 + name: Bishoujo-teki Kaikatsuryoku + - id: 793 + name: Bessatsu Friend Zoukan BetsuFure + - id: 795 + name: Dengeki Hime + - id: 675 + name: Jump SQ.LaB + - id: 797 + name: Comic Historia + - id: 799 + name: Dengeki Comic Japan + - id: 801 + name: Comic Dangan + - id: 1587 + name: Manga Gaugau + - id: 805 + name: Ao Lala + - id: 813 + name: Bessatsu Shounen Champion + - id: 815 + name: Betsuma Sister + - id: 817 + name: Cocohana + - id: 821 + name: onBLUE + - id: 823 + name: Manga Life Win + - id: 1057 + name: Kissui + - id: 827 + name: Comic Meteor + - id: 829 + name: Renai Love MAX + - id: 833 + name: Gelatin + - id: 835 + name: Renai Cherry Pink + - id: 837 + name: Young Jump (Weekly) + - id: 839 + name: Famitsu Bros + - id: 841 + name: Famitsu PS2 + - id: 843 + name: Famitsu PS + - id: 847 + name: Manga Action + - id: 849 + name: Dengeki Nintendo for KIDS + - id: 851 + name: Comic Break + - id: 853 + name: Comic Ran + - id: 855 + name: Shougaku Yonensei + - id: 857 + name: Blade Online + - id: 859 + name: Shounen Magazine+ (Monthly) + - id: 863 + name: Aka Lala + - id: 865 + name: Baby + - id: 867 + name: Comic BugBug + - id: 869 + name: Comic Milk Purin + - id: 871 + name: Comic Mega Gold + - id: 873 + name: Comic Jumbo + - id: 875 + name: Comic Kairaku-ten XTC + - id: 879 + name: WAaI! Mahalo + - id: 885 + name: MF Bunko J + - id: 889 + name: Grand Jump Premium + - id: 891 + name: MAG Garden Comic Online + - id: 893 + name: Manga Town + - id: 897 + name: Tonari no Young Jump + - id: 899 + name: Oyajism + - id: 901 + name: Hontou ni Atta Kowai Hanashi + - id: 903 + name: Comic Cyutt + - id: 905 + name: B'S Anima + - id: 907 + name: Cita-NIUM + - id: 910 + name: Bessatsu Manga Goraku + - id: 912 + name: Manga Palette Lite + - id: 914 + name: Leed Comic + - id: 916 + name: Blade Online + - id: 918 + name: Shougaku Ninensei + - id: 920 + name: Manga Goccha + - id: 922 + name: The Dessert + - id: 924 + name: GUSH pêche + - id: 926 + name: Young Champ + - id: 928 + name: Hobby Japan + - id: 932 + name: GA Bunko Magazine + - id: 933 + name: u17 + - id: 935 + name: Manga Time Kirara Miracle! + - id: 937 + name: Shounen + - id: 939 + name: Gangan Wing + - id: 941 + name: Comic Heaven + - id: 943 + name: Comic Polaris + - id: 945 + name: Weekly ASCII + - id: 947 + name: Grand Jump + - id: 949 + name: Persona Magazine + - id: 951 + name: Reijin Bravo! + - id: 953 + name: Harta + - id: 955 + name: Comic X-Eros + - id: 957 + name: Comic Milk Purin + - id: 959 + name: Comic Prism + - id: 961 + name: Comic Situation Play + - id: 963 + name: Comic ino. + - id: 965 + name: Comic Orecano! + - id: 967 + name: Jump VS + - id: 969 + name: Comic Comomo + - id: 971 + name: Men's GOLD + - id: 973 + name: Comic Mate + - id: 975 + name: Renai Revolution + - id: 977 + name: Comic Moe Max + - id: 979 + name: Bishoujo Kakumei KIWAME Road + - id: 981 + name: Comic Maihime Musou + - id: 983 + name: Comic Anthurium + - id: 985 + name: Shousetsu B-Boy + - id: 987 + name: Comic Rats + - id: 989 + name: Magazine WOoooo! + - id: 991 + name: Colorful Drops + - id: 993 + name: Comic Magnum + - id: 995 + name: Comic Jumbo + - id: 845 + name: Daum Webtoon + - id: 811 + name: Hirari, + - id: 1586 + name: Manga Bang + - id: 999 + name: Saizensen + - id: 1001 + name: Cheri+ + - id: 1003 + name: Comic Shoujo Shiki + - id: 1005 + name: Ura Sunday + - id: 1007 + name: Kadokawa Niconico Ace + - id: 1009 + name: bianca + - id: 1011 + name: Comic Himekuri + - id: 1013 + name: Jump LIVE + - id: 1015 + name: Champion Tap! + - id: 1017 + name: Comic Revolution + - id: 1019 + name: Action Pizazz HB + - id: 1021 + name: Comic Megastore Alpha + - id: 1023 + name: haruca + - id: 1025 + name: B's-LOVEY recottia + - id: 1027 + name: Comic Shoujo Tengoku + - id: 1029 + name: Comic Moog + - id: 1033 + name: Manga 4-koma Palette + - id: 1035 + name: Men's Young Special Ikazuchi + - id: 1037 + name: Action Young + - id: 1039 + name: ihr hertZ + - id: 1041 + name: Hinakan Hi! + - id: 1045 + name: Futabasha Web Magazine + - id: 1047 + name: Manga Aiki + - id: 1049 + name: Cabaret-Club Comic + - id: 1051 + name: Comic Muga + - id: 1053 + name: Comic Mugen Tensei + - id: 1055 + name: Comic Lemon Club + - id: 1059 + name: LaLa Melody Online + - id: 1061 + name: Manga Box + - id: 1063 + name: Kurage Bunch + - id: 1065 + name: BOX-AiR + - id: 1067 + name: Young Hip + - id: 1069 + name: Magazine WOoooo! B-gumi + - id: 1071 + name: Hana to Yume Plus + - id: 1073 + name: ChobeComi! + - id: 1075 + name: Hontou ni Kowai Douwa + - id: 1077 + name: Nate Manhwa + - id: 1079 + name: Web Ikipara Comic + - id: 1081 + name: Comic Minimon + - id: 1083 + name: Comic KOH + - id: 1085 + name: Comic Gekiman + - id: 1087 + name: KiSSCA + - id: 1089 + name: Manga Time Kirara☆Magica + - id: 1091 + name: Prince (Quarterly) + - id: 1093 + name: Model Graphix + - id: 1095 + name: Harmony Romance Zoukangou + - id: 1097 + name: Yawaraka Spirits + - id: 1099 + name: Comic Gamma + - id: 1101 + name: Manga Hot Milk + - id: 1103 + name: Web Comic Gamma + - id: 1105 + name: Gensou Fantasy + - id: 1107 + name: Magazine Cyberia + - id: 1109 + name: B's-LOVEY Katsubou + - id: 1111 + name: Comic Dolphin Jr. + - id: 1113 + name: Comic Grape + - id: 1115 + name: Doki~! Special + - id: 1117 + name: Comic Pururun Max + - id: 1119 + name: G'sister + - id: 1121 + name: Young Animal Densi + - id: 1123 + name: Comic Ran Twins + - id: 1125 + name: motto! + - id: 1127 + name: Mei + - id: 1129 + name: Fresh Jump + - id: 1131 + name: Manga Bon + - id: 1133 + name: Manga Ai! Hime + - id: 1135 + name: Suiyoubi no Sirius + - id: 1137 + name: Comic Break + - id: 1139 + name: Web Comic Zenyon + - id: 1141 + name: Hatsu Kiss + - id: 1143 + name: AYLA + - id: 1145 + name: Run Run + - id: 1147 + name: Comic Holic + - id: 1149 + name: Comic Tokumori + - id: 1151 + name: Graman Geki! + - id: 1153 + name: Ane LaLa + - id: 1155 + name: Big Comic Zoukan + - id: 1157 + name: Dengeki G's Comic + - id: 1165 + name: Tokusatsu Ace + - id: 1167 + name: Dengeki Girl's Style + - id: 1171 + name: Comic Europa + - id: 1177 + name: Comic Ero-tama + - id: 1175 + name: Aoharu + - id: 1179 + name: Manga Zettai Manzoku + - id: 1181 + name: Ponimaga + - id: 1183 + name: Magalabo + - id: 1185 + name: Cyberia ManiaEX + - id: 1189 + name: Handy Comic + - id: 1656 + name: bamB! + - id: 1195 + name: Young Magazine the 3rd + - id: 1199 + name: drap Milk + - id: 1207 + name: Manga Grimm Douwa + - id: 1197 + name: Aqua BL Kingdom + - id: 1191 + name: Hana to Yume Planet + - id: 1213 + name: Comic Dengeki Daioh "g" + - id: 1043 + name: Comic ChoiS! + - id: 1211 + name: Comic Man-Ten + - id: 1205 + name: Animage + - id: 1163 + name: Asahi Shinbun + - id: 1203 + name: Comic Ran-Oh! + - id: 1173 + name: Shounen Fang + - id: 1169 + name: Big Comic Original Zoukan + - id: 1588 + name: Charles Mag Omegaverse + - id: 1209 + name: Shounen Jump+ + - id: 1215 + name: Megastore + - id: 1217 + name: Comic Garden + - id: 1219 + name: Manga Life MOMO + - id: 1223 + name: GUSH Pochi. + - id: 1225 + name: Juicy + - id: 1221 + name: Kurofune Momo + - id: 1229 + name: Mebae + - id: 1231 + name: Manga Kisoutengai + - id: 1233 + name: Comic Gang + - id: 1235 + name: Manga Life STORIA + - id: 1237 + name: Josei Seven + - id: 1239 + name: Nakayoshi Deluxe + - id: 1241 + name: Zettai Renai Sweet + - id: 1243 + name: Monthly QooPA! + - id: 1245 + name: DVD Majiyaba + - id: 1249 + name: Comic Magnum X + - id: 1247 + name: Hanamaru Manga + - id: 1253 + name: Mink + - id: 1251 + name: Animal House + - id: 1227 + name: Bessatsu Kindai Mahjong + - id: 1257 + name: Cyber Comics + - id: 1263 + name: Bstreet + - id: 1267 + name: Bushiroad (Monthly) + - id: 1261 + name: iHertZ + - id: 1265 + name: Manga Erotopia + - id: 1270 + name: Monthly Shounen Magazine+ + - id: 1271 + name: Comic Genra + - id: 1273 + name: Lezhin Comics Webtoon + - id: 1274 + name: Comic Toutetsu + - id: 1276 + name: Apple Mystery + - id: 1275 + name: Bokkinia + - id: 1272 + name: Magazine Fresh! + - id: 1277 + name: Comic fleur + - id: 1278 + name: comico + - id: 1280 + name: Comicomi + - id: 1281 + name: Zoukan flowers + - id: 1589 + name: Digital Punipedo! + - id: 1283 + name: Comic Orca + - id: 1284 + name: Shincho 45 + - id: 1285 + name: Kono Manga ga Sugoi! Web + - id: 1286 + name: Manga Goraku Nexter + - id: 1288 + name: Comic Bavel + - id: 1287 + name: SPA! + - id: 1279 + name: Comic it + - id: 1161 + name: Zoukan Young Gangan + - id: 1293 + name: Manga Animec + - id: 1296 + name: Bouquet DX + - id: 1590 + name: Hero's + - id: 1298 + name: Champion Cross + - id: 1299 + name: Shuunin ga Yuku! Special + - id: 1300 + name: Comic Ran + - id: 1301 + name: Gene pixiv + - id: 1289 + name: Shuukan Bunshun + - id: 1303 + name: Capbon! + - id: 1306 + name: Bessatsu Harmony Romance + - id: 1305 + name: Chance+ + - id: 1308 + name: Shounen Magazine R + - id: 1307 + name: Qpa + - id: 1302 + name: Manga Goraku Special + - id: 1304 + name: Dengeki hp + - id: 1310 + name: Karyou Sakuragumi Etsu + - id: 1297 + name: Comic Ruelle + - id: 1312 + name: Shounen Magazine Edge + - id: 1313 + name: Gougai onBLUE + - id: 1314 + name: Harmony Romance + - id: 1315 + name: Emerald + - id: 1317 + name: BOY'S Pierce Kindan + - id: 1316 + name: Jump SQ.Crown + - id: 1318 + name: Comic Mate Legend + - id: 1319 + name: Comic Mega GOLD + - id: 1320 + name: Comic Saija + - id: 1321 + name: Comic Mana + - id: 1323 + name: Hana LaLa online + - id: 1325 + name: Dengeki Bazooka!! + - id: 1324 + name: Garaku no Mori + - id: 1292 + name: Shousetsu Chara + - id: 1322 + name: Comic GENKi + - id: 1291 + name: Action Deluxe + - id: 1311 + name: Morning Party Zoukan + - id: 1294 + name: Lemon People + - id: 1290 + name: MC☆Axis + - id: 1326 + name: Keetai ShuuPlay + - id: 1327 + name: Shousetsu Dear+ + - id: 1329 + name: Goraku Egg + - id: 1328 + name: Renai Hakusho Pastel + - id: 1332 + name: WEBLink + - id: 1333 + name: Qpano + - id: 1331 + name: Comic JSCK + - id: 1309 + name: Comic Cune + - id: 29 + name: twi4 + - id: 5 + name: Web Comic Gum + - id: 1334 + name: Shuukan Gendai + - id: 1335 + name: Magazine pocket + - id: 1336 + name: Shokuman + - id: 1337 + name: Comic HJ Bunko + - id: 1339 + name: Ganma! + - id: 1340 + name: Young Ace UP + - id: 1338 + name: Nintendo Dream + - id: 1330 + name: Comic Zeroshiki + - id: 1341 + name: Falcom Magazine + - id: 1345 + name: Petit Comic Zoukan + - id: 1349 + name: MAGCOMI + - id: 1346 + name: The Sneaker Web + - id: 1352 + name: mimi + - id: 1344 + name: Omegaverse Project + - id: 1342 + name: MIKU-Pack + - id: 1591 + name: Comic Bridge + - id: 1350 + name: Comic Jidai Katsugeki + - id: 1351 + name: Jump Original + - id: 1347 + name: Shounen Gaho + - id: 1348 + name: Morning Horizon in the Centre of Somewhere + - id: 1353 + name: Magazine Bang + - id: 1354 + name: Zoukan Taishuu + - id: 1357 + name: Comic KURiBERON + - id: 1360 + name: Comic GT + - id: 1362 + name: eBigComic4 + - id: 1366 + name: Jump GIGA + - id: 1361 + name: MangaONE + - id: 1370 + name: South + - id: 1359 + name: Badi + - id: 1372 + name: CoroCoro Aniki + - id: 1374 + name: Comic ExE + - id: 1373 + name: Comic Ride + - id: 1371 + name: Comic Newtype + - id: 1376 + name: Comic BEAT + - id: 1379 + name: Comic saseco + - id: 1355 + name: Comic Rise + - id: 1377 + name: Char@ + - id: 1378 + name: Comic Fire + - id: 1358 + name: Comic Bingo + - id: 1375 + name: Pasocom Magazine + - id: 1363 + name: Love Jossie + - id: 1367 + name: Shounen Edgestar + - id: 1368 + name: aQtto! + - id: 1369 + name: Web Magazine f3 + - id: 1895 + name: Touch+ + - id: 1364 + name: Comic Flamingo + - id: 1380 + name: Shuukan Taishuu + - id: 1815 + name: Fairy Tail Magazine (Monthly) + - id: 1388 + name: Shousetsu Shinchou + - id: 1386 + name: pixiv Comic + - id: 1390 + name: Dra-Dra-Dragon Age + - id: 1389 + name: Comicloud + - id: 1391 + name: Comic Ryu Web + - id: 1393 + name: Jump Cross + - id: 1392 + name: Matogrosso + - id: 1396 + name: ShuuPlay News + - id: 1397 + name: Web Bazooka + - id: 1398 + name: Galette + - id: 1401 + name: Doku Ringo Comic + - id: 1403 + name: Alterna pixiv + - id: 1404 + name: Big Gangan Okawari + - id: 1410 + name: Sunday Webry + - id: 1411 + name: Da Vinci + - id: 1402 + name: Reijin Uno! + - id: 1412 + name: One More Kiss + - id: 1413 + name: Manga Life STORIA Dash + - id: 1415 + name: Boys Fan + - id: 1416 + name: b-boy Omegaverse + - id: 1417 + name: Cycomics + - id: 1399 + name: Manga UP! + - id: 1405 + name: Boukenou + - id: 1385 + name: uvu + - id: 1394 + name: Comic Orange Club + - id: 1400 + name: Abumix + - id: 1395 + name: Spinel + - id: 1414 + name: Honey Milk + - id: 1381 + name: WEBgateau + - id: 1406 + name: enigma + - id: 1383 + name: Comic POOL + - id: 1387 + name: OK!COMIC + - id: 1384 + name: Chuuou Kouron + - id: 1409 + name: Cigarillo + - id: 1418 + name: Barazoku + - id: 1419 + name: Gangan pixiv + - id: 1423 + name: Hug pixiv + - id: 1420 + name: Ktoon + - id: 1421 + name: Kindai Manga + - id: 1424 + name: Monster Comics + - id: 1425 + name: pixiv Sylph + - id: 1426 + name: Dragon Age Extra + - id: 1429 + name: Manga Kocchi + - id: 1430 + name: Gachicomi + - id: 1431 + name: LiQulle + - id: 1427 + name: Young Magazine Zoukan Aka Buta + - id: 1433 + name: B's-LOG Cheek + - id: 1440 + name: Love Coffre + - id: 1432 + name: cakes + - id: 1439 + name: KakaoPage + - id: 1438 + name: Pianissimo + - id: 1435 + name: Pucchigumi + - id: 1436 + name: Genbun Magazine + - id: 1442 + name: pixiv Essay + - id: 1444 + name: Suiyoubi wa Mattari Dash X Comic + - id: 1445 + name: Comicawa + - id: 1441 + name: Love Silky + - id: 1443 + name: Kuaikan Manhua + - id: 1447 + name: Sports Today Webtoon + - id: 1428 + name: pixiv Hero's + - id: 1448 + name: Yuruyon + - id: 1446 + name: Comic Gotta + - id: 1449 + name: Comic Alpha + - id: 1450 + name: Princess (Gong Zhu Zhi) + - id: 1451 + name: Manga Park + - id: 1453 + name: Comic PASH! + - id: 1454 + name: Yuri Hime@pixiv + - id: 1456 + name: Manga Cross + - id: 1458 + name: Ohta Web Comic + - id: 1457 + name: b-boy Cube + - id: 1459 + name: Comic Days + - id: 1460 + name: Comic Boost + - id: 1461 + name: D Morning + - id: 1462 + name: Comic MeDu + - id: 1464 + name: Ane Friend + - id: 1465 + name: Palcy + - id: 1466 + name: Minna no Comic + - id: 1467 + name: Comic Corona + - id: 1468 + name: Dra-Dra Sharp# + - id: 1470 + name: Comic Chocolat + - id: 1469 + name: Splush + - id: 1472 + name: Kachicomi + - id: 1473 + name: B's-LOG Comic + - id: 1474 + name: Comic Trail + - id: 1475 + name: Comic Beam 100 + - id: 1476 + name: Young Animal Zero + - id: 1477 + name: Jump SQ.Rise + - id: 1471 + name: .Bloom + - id: 1478 + name: Yoru Sunday + - id: 1487 + name: Charles Mag + - id: 1486 + name: Funwari Jump + - id: 1483 + name: Cia♥ + - id: 1484 + name: Comic Taiga + - id: 1485 + name: Comic Marginal + - id: 1490 + name: Lupin Sansei Official Magazine + - id: 1489 + name: Young King Bessatsu Kingdom + - id: 340 + name: Comic Gardo + - id: 1492 + name: TYPE-MOON Comic Ace + - id: 1488 + name: Comic Tatan + - id: 1493 + name: Torch + - id: 1495 + name: MAGKAN + - id: 1496 + name: kyapi! + - id: 1497 + name: Comic Border + - id: 1498 + name: G-Lish + - id: 1501 + name: Nikkan Gecchan + - id: 1502 + name: Comic Essay Room + - id: 1503 + name: Zoukan Harlequin + - id: 1504 + name: Harlequin Original + - id: 1505 + name: Bessatsu Harlequin + - id: 1500 + name: B.Pilz + - id: 1506 + name: Harlequin darling! + - id: 1507 + name: Dokodemo Young Champion + - id: 1499 + name: Mellow Kiss + - id: 1508 + name: ArkLight Comic + - id: 306 + name: Be-Love + - id: 46 + name: Young King OURs GH + - id: 1159 + name: ComicWalker + - id: 613 + name: G-men + - id: 161 + name: Jump SQ. + - id: 831 + name: Bessatsu CoroCoro Comic + - id: 1268 + name: e Young Magazine + - id: 1422 + name: B-BOY P! + - id: 516 + name: gateau + - id: 400 + name: b-Boy Phoenix + - id: 1343 + name: Men's Action + - id: 1521 + name: Comic KURiBERON Duma + - id: 881 + name: Monthly Hero's + - id: 35 + name: GFantasy + - id: 345 + name: Morning Two + - id: 1452 + name: Web Comic Gamma Plus + - id: 1517 + name: Moae + - id: 1434 + name: Tencent Animation + - id: 587 + name: Web Comic EDEN + - id: 803 + name: Niconico Seiga + - id: 699 + name: Viva☆Tales of Magazine + - id: 1514 + name: Sword Art Online Magazine + - id: 397 + name: Shougaku Gonensei + - id: 1295 + name: HiBaNa + - id: 1509 + name: Manga Bøys + - id: 556 + name: 4-koma Nano Ace + - id: 300 + name: Dengeki G's Festival! Comic + - id: 1520 + name: Bessatsu Shuuman Special + - id: 362 + name: Hontou ni Atta Yukai na Hanashi + - id: 1896 + name: Digital Margaret + - id: 1522 + name: marié + - id: 1523 + name: Manga Jam + - id: 1201 + name: Margaret BOOK Store! + - id: 1524 + name: BOY'S Pierce Kaihatsushitsu + - id: 1525 + name: Young King BULL + - id: 1527 + name: Web DenPlay Comic + - id: 1528 + name: Comic Hu + - id: 1530 + name: Young Jump GOLD + - id: 1526 + name: Nemuki+ + - id: 1529 + name: PriaL + - id: 1531 + name: Comic Qurie + - id: 1533 + name: ASCII Comic (Monthly) + - id: 1532 + name: Sonorama+ + - id: 1535 + name: Kirara Base + - id: 1538 + name: Gaugau Monster + - id: 1539 + name: Comic BE! + - id: 1540 + name: LINE Manga + - id: 1541 + name: Lynx + - id: 1536 + name: Harem + - id: 1543 + name: Manga Doa + - id: 1545 + name: Comic tint + - id: 1544 + name: Flat Hero's + - id: 1534 + name: Towako + - id: 1546 + name: Flos Comic + - id: 1547 + name: Comic Jardin + - id: 1552 + name: G's Comic Anothers + - id: 1551 + name: Gene LINE + - id: 1542 + name: Pinkcherie + - id: 1554 + name: Hana Yume Ai + - id: 1553 + name: B Bunch + - id: 1555 + name: Shounen Jump Zoukan + - id: 1556 + name: PFantapy + - id: 1561 + name: Hontou ni Atta Waraeru Hanashi Pinky + - id: 1557 + name: Comic Polca + - id: 1559 + name: Kimikoi + - id: 1558 + name: MAGxiv + - id: 1563 + name: Comic Fuz + - id: 1560 + name: Ananga Ranga + - id: 1564 + name: One Piece Magazine + - id: 1565 + name: Wild Hero's + - id: 1566 + name: Web .Bloom + - id: 1549 + name: GUSH maniaEX + - id: 1568 + name: Tulle + - id: 1567 + name: Web Baby + - id: 1570 + name: Tokyo Omegaverse + - id: 1573 + name: Kurofune x LINE Manga + - id: 1572 + name: Kurofune pixiv + - id: 1574 + name: Manga Mee + - id: 1575 + name: Young Dragon Age + - id: 1576 + name: Premium Cheese! + - id: 1569 + name: mimosa + - id: 1571 + name: Kurofune + - id: 1592 + name: Young Magazine Web + - id: 1593 + name: Manga Yomonga + - id: 1594 + name: Comic Hotmilk Koime♥ + - id: 1537 + name: Shounen Ace Plus + - id: 1577 + name: Grand Jump Mecha + - id: 1578 + name: Koisuru Soiree + - id: 108 + name: FBonline + - id: 37 + name: .hack//G.U. The World + - id: 251 + name: Millefeui + - id: 226 + name: b-Boy Luv + - id: 393 + name: LaLa Special + - id: 753 + name: Mugen Anthology Series + - id: 1187 + name: Young King OURs Lite + - id: 1516 + name: Morning Shin Magnum Zoukan + - id: 1562 + name: Big Comic Spirits Casual + - id: 1519 + name: COM + - id: 1595 + name: Comic Gucho + - id: 930 + name: Comic Zip + - id: 1550 + name: Afternoon Season Zoukan + - id: 511 + name: Famitsu Playstation+ + - id: 418 + name: b-Rash + - id: 1596 + name: Comic AOHA + - id: 1597 + name: Comic Moog Online + - id: 1598 + name: Weekly Kairaku-ten + - id: 1599 + name: Comic Reboot + - id: 1600 + name: Comic Aun Kai + - id: 1601 + name: Tasogare Shokudou + - id: 1602 + name: Bunshun Online + - id: 1604 + name: Comic Ride Advance + - id: 1605 + name: Yurutto Cafe + - id: 1608 + name: Byou de Wakaru BL + - id: 1606 + name: Love xxx Boys pixiv + - id: 1610 + name: Towako Oboro Emaki + - id: 1611 + name: Comic Miu + - id: 1612 + name: Comic Megastore Deep + - id: 1609 + name: Comic Bull + - id: 1582 + name: Dra-Dra Flat♭ + - id: 1613 + name: Comic Orga + - id: 1614 + name: Haiboku Otome Ecstasy + - id: 1616 + name: Web Opera + - id: 1615 + name: Comic Marginal&h + - id: 1618 + name: Charles Mag Kemono + - id: 1619 + name: Web Manga Bangaichi + - id: 1617 + name: Grand Jump Mucha + - id: 1620 + name: Web Haishin Gekkan + - id: 1622 + name: Pur Comics + - id: 1623 + name: Aokishi + - id: 1628 + name: Love Chula + - id: 1621 + name: miere + - id: 1624 + name: fRag + - id: 1626 + name: Shounen Action (Weekly) + - id: 1627 + name: Leed Cafe + - id: 1607 + name: Muteki Renai S*girl Anette + - id: 1625 + name: Colorful! + - id: 1603 + name: Love Passion + - id: 1630 + name: Web Canna + - id: 1631 + name: Comic Nettai + - id: 206 + name: Shounen Champion (Weekly) + - id: 354 + name: Manga Times (Weekly) + - id: 1633 + name: Strada+ + - id: 1632 + name: Comic RiSky + - id: 1634 + name: from RED + - id: 1636 + name: Dengeki Comic Regulus + - id: 1635 + name: Web Comic Apanta + - id: 1437 + name: One Pack Comic + - id: 627 + name: Boy's LOVE + - id: 1637 + name: Manga Leaf + - id: 1638 + name: Comic Bushiroad Web + - id: 1639 + name: Hontou ni Atta Yukai na Hanashi Geinou Zukyun + - id: 1641 + name: Love Kiss! More + - id: 1640 + name: Nanairo Comics + - id: 1642 + name: Comic Brise + - id: 1646 + name: Young Jump Battle + - id: 1653 + name: Canna Comics + - id: 1643 + name: Comic Marche + - id: 1644 + name: Betsufura + - id: 1648 + name: Comic Picn + - id: 1647 + name: Harta Alternative + - id: 1645 + name: Young Jump Sports + - id: 1193 + name: Comic Ran Twins Sengoku Bushou Retsuden + - id: 1650 + name: BiBit! + - id: 1652 + name: Spicy Whip + - id: 1657 + name: Super Action (Monthly) + - id: 1658 + name: '&.Emo' + - id: 1660 + name: Touhou Gairai Ihen (Web) + - id: 1662 + name: Young Jump Heroine + - id: 1664 + name: Otokonoko Heaven + - id: 1665 + name: Kindan Lovers Mania + - id: 1661 + name: NUUDE + - id: 1663 + name: Baby α + - id: 1659 + name: Touhou Gairai Ihen + - id: 1666 + name: Chouchou + - id: 1667 + name: Comic Grast + - id: 1668 + name: Harmony Prince + - id: 1669 + name: Zanki + - id: 1670 + name: Cyberia Maniacs + - id: 1672 + name: Sho-Comi X + - id: 1673 + name: Corona EX + - id: 1674 + name: CoroCoro Ichiban! + - id: 1675 + name: Mitsukoi Tiara + - id: 1676 + name: Nekoneko Yokochou + - id: 1677 + name: Love Coffre Magic + - id: 1678 + name: Comic Lake + - id: 1679 + name: Zhiyin Manke + - id: 1680 + name: Hero Cross Line + - id: 1681 + name: Bomtoon + - id: 14 + name: Asuka + - id: 1683 + name: B's-LOG Comic (Web Label) + - id: 1684 + name: Halloween + - id: 1686 + name: Toomics + - id: 1689 + name: Alive+ + - id: 1688 + name: Jour Sister + - id: 1690 + name: Ura Sunday Joshi-bu + - id: 1692 + name: Shounen Hana to Yume + - id: 1693 + name: Ri Geng Comics + - id: 1694 + name: Ryona King + - id: 1695 + name: Leed Comic Baku + - id: 1696 + name: Comic Nicola + - id: 1697 + name: noicomi + - id: 1699 + name: Shounen Book + - id: 1700 + name: Shousetsu Hanamaru + - id: 1701 + name: Rekishi Gunzou + - id: 1702 + name: Chocolove + - id: 1703 + name: Purizm + - id: 1704 + name: Hao Manhua + - id: 1707 + name: Mitsukoi Tiara Mania + - id: 1706 + name: Isekai Yanjan + - id: 1708 + name: What (Monthly) + - id: 1671 + name: Young Magazine Kaizokuban + - id: 1031 + name: Otokonoko Jidai + - id: 1710 + name: Comic Bonbon Zoukan + - id: 1709 + name: Toptoon + - id: 1711 + name: Trifle by Hana to Yume + - id: 1712 + name: Manga Gang + - id: 1713 + name: Ima, Grand Jump tte!! + - id: 1714 + name: Comic Nova + - id: 1716 + name: Strada + - id: 1715 + name: Shenman + - id: 1717 + name: Shougaku Rokunensei + - id: 1718 + name: Young Love Comic aya + - id: 1719 + name: Tezucomi + - id: 1720 + name: Peanutoon + - id: 1685 + name: Girigiri Edge + - id: 1651 + name: ARIA@pixiv + - id: 1722 + name: Comic Piatto + - id: 1723 + name: Dengeki Hime + - id: 1724 + name: Comic Alunna + - id: 1726 + name: Young Rosé + - id: 1728 + name: Omajinai Comic + - id: 1687 + name: Yoo + - id: 1727 + name: Web Karen + - id: 1725 + name: Comikuri! + - id: 1730 + name: Ayla Deluxe + - id: 1705 + name: Ane Cheese! + - id: 1682 + name: Rakuen Le Paradis Zoukan + - id: 1691 + name: Grand Jump Web + - id: 1721 + name: Renai Hakusho Sherry Kiss + - id: 1729 + name: '&Sofa' + - id: 1732 + name: Young King Lambda + - id: 1733 + name: mini Berry + - id: 1736 + name: Comic Howl + - id: 1735 + name: gateau near + - id: 1731 + name: CoroCoro Comic (Weekly) + - id: 1741 + name: Baby (Digital) + - id: 1742 + name: Comic Ragchew + - id: 1743 + name: Mystery Magazine + - id: 1744 + name: Omoshiro Book + - id: 1747 + name: Comic Trigger + - id: 1746 + name: Ruvill + - id: 1734 + name: petit Rose + - id: 1738 + name: Love Live! Days + - id: 1737 + name: Love Parfait + - id: 1739 + name: Daioh "g" pixiv + - id: 1740 + name: Manga Top + - id: 1745 + name: Yanchan Web + - id: 1749 + name: Comic Rakuu + - id: 1750 + name: Shougaku Ichinensei + - id: 1751 + name: Ecomix + - id: 1753 + name: Young Jump Daiichiwa + - id: 1748 + name: HanaYume EPO + - id: 1754 + name: Ichijin Plus + - id: 1755 + name: Comic Essay Gekijou + - id: 1752 + name: Souffle + - id: 1756 + name: Comic tant + - id: 425 + name: LC Mystery + - id: 1757 + name: Manga Gaudi + - id: 1759 + name: Bekkan Getsumaga + - id: 1760 + name: Renai Chocolat + - id: 1762 + name: Pie Comics + - id: 1763 + name: Dengeki Moeoh (Web) + - id: 1761 + name: Dragon HG + - id: 1765 + name: Cococomi + - id: 1766 + name: JusToon + - id: 1629 + name: Comic Shigekiteki Squirt!! + - id: 1767 + name: Comic Flapper (Web) + - id: 1768 + name: BL Renai Senka + - id: 1770 + name: Z + - id: 1771 + name: Le Noël + - id: 1772 + name: Comic Flavors + - id: 1773 + name: Comic Kisshug + - id: 1774 + name: Chillche + - id: 1775 + name: G's Channel + - id: 1778 + name: Young King (Monthly) + - id: 1777 + name: Mangapolo Zero + - id: 1779 + name: Mitaina! + - id: 1776 + name: Ane Petit Digital + - id: 1780 + name: Comic & Comic + - id: 1764 + name: Comic Bound + - id: 1781 + name: KITORA + - id: 1817 + name: Malika + - id: 1783 + name: Tokyo 2020 Paralympic Jump + - id: 1784 + name: Opa x Comi + - id: 1785 + name: Zipper Comic + - id: 1786 + name: e-manga + - id: 1787 + name: Adam + - id: 1790 + name: Manga Taishuu + - id: 1791 + name: Young Magazine GT + - id: 1792 + name: DRE Comics + - id: 1789 + name: Asuka (Web) + - id: 1788 + name: Kuro Mitsu + - id: 1794 + name: Getsumaga Kichi + - id: 1793 + name: Shoujo Friend Zoukan + - id: 1769 + name: Comic Baku + - id: 1796 + name: Manga Town Original + - id: 1797 + name: Chuugaku Ichinen Course + - id: 1798 + name: Comic Ogyaaa!! + - id: 1799 + name: Ciao Comi + - id: 1801 + name: Be x Boy Rookies VS + - id: 1802 + name: Empas Manhwa + - id: 1803 + name: Paran Manhwa + - id: 1804 + name: Manga Tengoku + - id: 1805 + name: Bebe + - id: 1807 + name: Verse by LiQulle + - id: 1808 + name: Friday Digital + - id: 1382 + name: Comic Kairaku-ten Hoshi-gumi + - id: 1800 + name: Isekai Raku-ten + - id: 1812 + name: Ciao Plus + - id: 1813 + name: JoJo Magazine + - id: 1811 + name: Televi-kun Super Hero Comics + - id: 1810 + name: Comptiq (Web) + - id: 1814 + name: Creative Comic Collection + - id: 1818 + name: Tokusen Mahjong + - id: 1816 + name: DigiKiss + - id: 1819 + name: Vanilove + - id: 1821 + name: Comic Yamitsuki + - id: 1822 + name: Michikusa + - id: 1823 + name: Galette meets + - id: 1820 + name: Deluxe Bonita + - id: 1824 + name: Biccomi + - id: 1825 + name: Hontou ni Atta Waraeru Hanashi + - id: 1827 + name: pixlib + - id: 1826 + name: AmarE + - id: 1828 + name: Champion Buzz + - id: 1830 + name: Comic Shiny + - id: 1831 + name: Comic Gaira + - id: 1829 + name: The Forward + - id: 1832 + name: Dengeki Maoh (Web) + - id: 1833 + name: All Kaidan + - id: 1834 + name: Yonimo Kimyou na Nekopanchi + - id: 1835 + name: Comic Growl + - id: 1836 + name: Gohan Biyori + - id: 1649 + name: Da Vinci Web + - id: 1837 + name: Niμ + - id: 1838 + name: HykeComic + - id: 47 + name: Young Champion + - id: 1840 + name: Love Kiss! + - id: 1839 + name: Primo + - id: 150 + name: AlphaPolis + - id: 1845 + name: Noche + - id: 1842 + name: Eternity + - id: 1843 + name: Regina + - id: 997 + name: Ciao DX Horror + - id: 1841 + name: '&arche' + - id: 1846 + name: Comic NOAN + - id: 1844 + name: α norn + - id: 1847 + name: Kyoufu no Yakata DX + - id: 1848 + name: Magazine Great + - id: 1849 + name: Televi-kun + - id: 1850 + name: Magazine WOoooo! Wolf + - id: 1851 + name: Chuuichi Jidai + - id: 1852 + name: Comp Ace Comic Connect + - id: 1853 + name: Young Magazine Kakehiki + - id: 1854 + name: Jack Pot + - id: 1856 + name: Comic Dengeki Daioh "g" (Web) + - id: 1855 + name: Comic Killa + - id: 1857 + name: Isekai Tensei LaLa + - id: 1858 + name: Comic G-Es + - id: 1859 + name: VComi + - id: 1860 + name: Yanjan Pixiv + - id: 1861 + name: Shounen Gag Oh + - id: 1864 + name: Comic GAGA + - id: 1862 + name: Story na Onna-tachi + - id: 1865 + name: Cybele Comic + - id: 1866 + name: Shounen Jump Season Special + - id: 1868 + name: Comic Isekai Harem + - id: 1867 + name: Season Jam + - id: 1869 + name: Xingqi Manhua + - id: 1870 + name: Our Feel + - id: 1863 + name: Mitsukoi Tiara Kemono + - id: 1871 + name: Bessatsu Manga Action + - id: 1873 + name: Sa Man Le Hua + - id: 1874 + name: Jumptoon + - id: 1875 + name: Hana to Yume Web + - id: 1876 + name: Captain Tsubasa Magazine + - id: 1878 + name: Lyrica + - id: 1879 + name: Comic Bunch Kai + - id: 1880 + name: Sunday Manga + - id: 1877 + name: Twi Sirius + - id: 1883 + name: Manga-gai + - id: 1881 + name: Comic Ride ivy + - id: 1882 + name: Comic Porta + - id: 1872 + name: Samanhua + - id: 1782 + name: Web Comic Toutetsu + - id: 1885 + name: Custom Comic + - id: 1884 + name: Hayacomi + - id: 1886 + name: Heibon Punch + - id: 1356 + name: Mikosurihan Gekijou Kyonyuu-chan + - id: 1282 + name: Mikosurihan Gekijou Bekkan + - id: 1887 + name: mimi DX + - id: 1888 + name: Papillon + - id: 1889 + name: Bilibili Manhua + - id: 1890 + name: 2D Comic Magazine + - id: 1891 + name: Story na Onna-tachi Black + - id: 1893 + name: Comic Cune (Web) + - id: 1894 + name: Comic Alunna (Web) + - id: 1892 + name: Comic Beam (Web) + - id: 1901 + name: Comic Kaien + - id: 1899 + name: Shiori + - id: 1900 + name: Bessatsu Katei Suspense + - id: 1898 + name: CandleA + - id: 1897 + name: Comic Unicorn + - id: 1902 + name: Goro + - id: 1904 + name: Novecomi+ + - id: 1905 + name: H&F Club + - id: 1903 + name: Web Comic Heaven + - id: 1906 + name: Shuro + - id: 1907 + name: Koi wa Omakase Special + - id: 1909 + name: Loli Babaa Senmon + - id: 1910 + name: Shinkan + - id: 1809 + name: Comic LOE + - id: 1912 + name: Young Unreal Jingai + - id: 1911 + name: ITAN Web Comic + - id: 1913 + name: Yuruyuru Nekopanchi + - id: 1914 + name: Seasons + - id: 1915 + name: Momopan + - id: 1916 + name: Digicomi Shinchou Com² + - id: 1917 + name: LiQulle pathos + - id: 1919 + name: Gaea Original + - id: 1920 + name: B's-LOVEY Comics + - id: 1918 + name: Chara Collection + - id: 1921 + name: Duo + - id: 1922 + name: Shoujo Friend Suspense & Horror Zoukan + - id: 1923 + name: Macross Ace + - id: 1908 + name: Tian Man + - id: 1924 + name: Hobby Japan Web + - id: 1925 + name: Dascomi + - id: 1926 + name: Omoide Shokudou Bekkan + - id: 1927 + name: Young Animal Web + - id: 1928 + name: Dungeon Kouryaku wa Sex de!! + - id: 1929 + name: iHZ + - id: 1957 + name: Lolita Comic Sakura + - id: 1930 + name: Comic Goranshin + - id: 1931 + name: Comic Momohime Deepest + - id: 1932 + name: Kyoufu Taiken + - id: 1933 + name: Nekotomo + - id: 1934 + name: Darkness na Onna-tachi + - id: 1935 + name: Jukujo Monogatari + - id: 1936 + name: Comic GEE + - id: 1937 + name: Biblio Sirius + - id: 1939 + name: Palcy NEXT + - id: 1938 + name: Web Otoko no Ko-llection! S (Monthly) + - id: 1940 + name: bibi + - id: 1942 + name: Hitori Gohan + - id: 1941 + name: Coi-halu + - id: 1943 + name: Comic Nyan2 Club GOLD + - id: 1944 + name: Ridi Webtoon + - id: 1945 + name: Naver Series + - id: 1946 + name: Kakao Webtoon + - id: 1947 + name: Little Girl Strike + - id: 1948 + name: Comic Happining + - id: 1949 + name: Fantasia Battle Royal + - id: 1951 + name: Famitsu DS+Wii + - id: 1950 + name: Marukatsu Super Famicom + - id: 1952 + name: Goraku Web! + - id: 1953 + name: Comic Oz + - id: 1954 + name: Comic Ambre + - id: 1956 + name: Estro + - id: 1955 + name: Manga Hot + - id: 1958 + name: Men's Dolphin + - id: 1959 + name: TakeComi! + - id: 1960 + name: Petit Apple Pie + - id: 1962 + name: Ultra Jump Niconico-ban + - id: 1963 + name: Comic Zerise + - id: 1981 + name: Carmilla + - id: 1982 + name: Oreryuu! Zeppin Meshi + - id: 1965 + name: Comic G.G. + - id: 1966 + name: G-Edge + - id: 1961 + name: Tsuma Petit + - id: 1968 + name: CoroCiao + - id: 1969 + name: GA Comic + - id: 51 + name: Be-Boy Gold + - id: 1970 + name: Manman Manhua + - id: 1967 + name: Mystery Sara + - id: 1971 + name: Comic Y-OURS + - id: 1972 + name: Comic Aily + - id: 1973 + name: Omoide Shokudou + - id: 1974 + name: Tokumori Comic Hitozuma Jukujozakari + - id: 1976 + name: ARTEMIS by sirius + - id: 1975 + name: Jitsuwa Bunka Taboo + - id: 1977 + name: Kirapichi + - id: 1978 + name: The Gazelle + - id: 1979 + name: Canelé + - id: 1980 + name: peep + - id: 1984 + name: Action Hero + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/studios/02-all-limit-1000.yaml b/test/fixtures/shikimori/studios/02-all-limit-1000.yaml new file mode 100644 index 0000000..c1714f9 --- /dev/null +++ b/test/fixtures/shikimori/studios/02-all-limit-1000.yaml @@ -0,0 +1,9463 @@ +metadata: + captured_at: '2026-05-11T07:55:26Z' + label: all-limit-1000 + backend: shikimori + path_slug: studios +request: + method: GET + url: https://shikimori.io/api/studios?limit=1000 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 07:55:25 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"d88a2fdc653f6ec0f422a85cc311f145" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: 7e699166-61a7-46e6-9f4a-ec74c69aa223 + X-Runtime: '0.301671' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 2022 + name: TYMOTE + filtered_name: TYMOTE + real: false + image: null + - id: 2023 + name: Spoon + filtered_name: Spoon + real: false + image: null + - id: 1356 + name: Tonko House + filtered_name: Tonko House + real: false + image: null + - id: 1992 + name: Bandai Spirits + filtered_name: Bandai Spirits + real: false + image: null + - id: 2007 + name: Studio Drive + filtered_name: Drive + real: false + image: null + - id: 2723 + name: Unend + filtered_name: Unend + real: false + image: null + - id: 3213 + name: Shanghai Zhijian Network + filtered_name: Shanghai Zhijian Network + real: false + image: null + - id: 2011 + name: Yonago Gainax + filtered_name: Yonago Gainax + real: false + image: null + - id: 2240 + name: Studio Daisy + filtered_name: Daisy + real: false + image: null + - id: 2034 + name: Akatsuki + filtered_name: Akatsuki + real: false + image: null + - id: 2041 + name: Enjin Productions + filtered_name: Enjin + real: false + image: null + - id: 2027 + name: Team TillDawn + filtered_name: Team TillDawn + real: false + image: null + - id: 2029 + name: Earth Design Works + filtered_name: Earth Design Works + real: false + image: null + - id: 2020 + name: Ark + filtered_name: Ark + real: false + image: null + - id: 2040 + name: Maro Studio + filtered_name: Maro + real: false + image: null + - id: 2 + name: Kyoto Animation + filtered_name: Kyoto + real: true + image: /system/studios/original/2.png?1522422929 + - id: 162 + name: Character and Anime Dot Com + filtered_name: Character and Anime Dot Com + real: false + image: null + - id: 17 + name: Aniplex + filtered_name: Aniplex + real: false + image: /system/studios/original/17.txt?1323005241 + - id: 10 + name: Production I.G + filtered_name: Production I.G + real: true + image: /system/studios/original/10.png?1312165069 + - id: 164 + name: d-rights + filtered_name: d-rights + real: false + image: null + - id: 165 + name: Marubeni + filtered_name: Marubeni + real: false + image: null + - id: 322 + name: Bee Media + filtered_name: Bee Media + real: false + image: null + - id: 23 + name: Bandai Visual + filtered_name: Bandai Visual + real: false + image: /system/studios/original/23.png?1311292710 + - id: 26 + name: Shinkai Makoto + filtered_name: Shinkai Makoto + real: false + image: null + - id: 29 + name: VAP + filtered_name: VAP + real: false + image: /system/studios/original/29.png?1311292712 + - id: 2398 + name: VCRWORKS + filtered_name: VCRWORKS + real: false + image: null + - id: 1472 + name: Myung Films + filtered_name: Myung Films + real: false + image: null + - id: 35 + name: Seven Arcs + filtered_name: Seven Arcs + real: false + image: /system/studios/original/35.jpg?1312165054 + - id: 40 + name: m.o.e. + filtered_name: m.o.e. + real: false + image: /system/studios/original/40.png?1311292710 + - id: 42 + name: GDH + filtered_name: GDH + real: false + image: /system/studios/original/42.png?1311292713 + - id: 39 + name: Daume + filtered_name: Daume + real: true + image: /system/studios/original/39.jpg?1311292711 + - id: 49 + name: Remic + filtered_name: Remic + real: false + image: null + - id: 2159 + name: Composition Inc. + filtered_name: Composition Inc. + real: false + image: null + - id: 2169 + name: Studio 88 + filtered_name: '88' + real: false + image: null + - id: 2177 + name: Mimoid + filtered_name: Mimoid + real: false + image: null + - id: 2183 + name: Keica + filtered_name: Keica + real: false + image: null + - id: 2403 + name: Brians Film + filtered_name: Brians Film + real: false + image: null + - id: 2404 + name: OLM Team Kato + filtered_name: OLM Team Kato + real: false + image: null + - id: 50 + name: KSS + filtered_name: KSS + real: false + image: /system/studios/original/50.gif?1311292710 + - id: 195 + name: Pixy + filtered_name: Pixy + real: false + image: /system/studios/original/195.jpg?1311292711 + - id: 565 + name: LMD + filtered_name: LMD + real: false + image: null + - id: 52 + name: Avex Entertainment + filtered_name: Avex + real: false + image: /system/studios/original/52.png?1311292713 + - id: 2405 + name: Staple Entertainment + filtered_name: Staple + real: false + image: null + - id: 55 + name: TV Asahi + filtered_name: TV Asahi + real: false + image: /system/studios/original/55.jpg?1311292710 + - id: 300 + name: SILVER LINK. + filtered_name: SILVER LINK. + real: true + image: /system/studios/original/300.?1434707266 + - id: 58 + name: Square Enix + filtered_name: Square Enix + real: false + image: /system/studios/original/58.png?1311292714 + - id: 59 + name: Beat Frog + filtered_name: Beat Frog + real: false + image: null + - id: 61 + name: Frontier Works + filtered_name: Frontier Works + real: false + image: /system/studios/original/61.png?1311292712 + - id: 63 + name: Trinet Entertainment + filtered_name: Trinet + real: false + image: /system/studios/original/63.jpg?1311292713 + - id: 2432 + name: happyproject + filtered_name: happyproject + real: false + image: null + - id: 66 + name: Key + filtered_name: Key + real: false + image: /system/studios/original/66.gif?1311292712 + - id: 285 + name: Four Some + filtered_name: Four Some + real: false + image: null + - id: 69 + name: Front Line + filtered_name: Front Line + real: false + image: null + - id: 47 + name: Khara + filtered_name: Khara + real: false + image: /system/studios/original/47.jpg?1311292710 + - id: 2814 + name: Image Studio 109 + filtered_name: Image Studio 109 + real: false + image: null + - id: 2809 + name: PHANTOM + filtered_name: PHANTOM + real: false + image: null + - id: 2818 + name: qmotri + filtered_name: qmotri + real: false + image: null + - id: 2878 + name: Khaki + filtered_name: Khaki + real: false + image: null + - id: 2881 + name: Andraft + filtered_name: Andraft + real: false + image: null + - id: 2882 + name: THREE IS A MAGIC NUMBER + filtered_name: THREE IS A MAGIC NUMBER + real: false + image: null + - id: 1938 + name: Polygon Magic + filtered_name: Polygon Magic + real: false + image: null + - id: 71 + name: Mellow Head + filtered_name: Mellow Head + real: false + image: /system/studios/original/71.jpg?1311292711 + - id: 65 + name: Tokyo Movie Shinsha + filtered_name: Tokyo Movie Shinsha + real: true + image: /system/studios/original/65.?1521917245 + - id: 2436 + name: Frontier One + filtered_name: Frontier One + real: false + image: null + - id: 70 + name: Nomad + filtered_name: Nomad + real: true + image: /system/studios/original/70.jpg?1311292712 + - id: 2178 + name: Tecarat + filtered_name: Tecarat + real: false + image: null + - id: 80 + name: Trans Arts + filtered_name: Trans Arts + real: false + image: /system/studios/original/80.jpg?1312165045 + - id: 127 + name: Yomiko Advertising + filtered_name: Yomiko Advertising + real: false + image: /system/studios/original/127.jpg?1311292710 + - id: 129 + name: Silky’ s + filtered_name: Silky’ s + real: false + image: null + - id: 130 + name: CherryLips + filtered_name: CherryLips + real: false + image: null + - id: 131 + name: G&G Entertainment + filtered_name: G&G + real: false + image: /system/studios/original/131.png?1311292713 + - id: 557 + name: Zyc + filtered_name: Zyc + real: false + image: null + - id: 82 + name: Marvelous Entertainment + filtered_name: Marvelous + real: false + image: /system/studios/original/82.gif?1311292714 + - id: 83 + name: AIC Spirits + filtered_name: AIC Spirits + real: false + image: /system/studios/original/83.jpg?1311292710 + - id: 85 + name: Konami + filtered_name: Konami + real: false + image: /system/studios/original/85.png?1311292712 + - id: 89 + name: BeSTACK + filtered_name: BeSTACK + real: false + image: /system/studios/original/89.jpg?1311292713 + - id: 92 + name: Starchild Records + filtered_name: Starchild Records + real: false + image: /system/studios/original/92.jpg?1312165050 + - id: 93 + name: Studio Flag + filtered_name: Flag + real: false + image: null + - id: 2395 + name: J.C.F. + filtered_name: J.C.F. + real: false + image: null + - id: 91 + name: feel. + filtered_name: feel. + real: true + image: /system/studios/original/91.png?1350322172 + - id: 2191 + name: BUILD DREAM + filtered_name: BUILD DREAM + real: false + image: null + - id: 100 + name: TV Osaka + filtered_name: TV Osaka + real: false + image: /system/studios/original/100.png?1311292713 + - id: 97 + name: ADV Films + filtered_name: ADV Films + real: false + image: /system/studios/original/97.png?1589819349 + - id: 98 + name: Sav! The World Productions + filtered_name: Sav! The World + real: false + image: /system/studios/original/98.png?1589819322 + - id: 104 + name: Lantis + filtered_name: Lantis + real: false + image: /system/studios/original/104.png?1311292713 + - id: 107 + name: Plum + filtered_name: Plum + real: false + image: null + - id: 108 + name: Media Factory + filtered_name: Media Factory + real: false + image: /system/studios/original/108.jpg?1311292711 + - id: 320 + name: 'Maru Production ' + filtered_name: 'Maru Production ' + real: false + image: null + - id: 88 + name: AIC ASTA + filtered_name: AIC ASTA + real: false + image: /system/studios/original/88.png?1589819301 + - id: 3143 + name: ETERNA Animation + filtered_name: ETERNA + real: false + image: null + - id: 102 + name: FUNimation Entertainment + filtered_name: FUNimation + real: false + image: /system/studios/original/102.png?1602436357 + - id: 2193 + name: ORENDA + filtered_name: ORENDA + real: false + image: null + - id: 2397 + name: Pink Cat + filtered_name: Pink Cat + real: false + image: null + - id: 321 + name: Kitty Media + filtered_name: Kitty Media + real: false + image: null + - id: 2721 + name: NHK Art + filtered_name: NHK Art + real: false + image: null + - id: 109 + name: Shochiku + filtered_name: Shochiku + real: false + image: /system/studios/original/109.gif?1311292713 + - id: 114 + name: Studio Matrix + filtered_name: Matrix + real: false + image: null + - id: 116 + name: Broccoli + filtered_name: Broccoli + real: false + image: /system/studios/original/116.png?1311292713 + - id: 117 + name: Studio Izena + filtered_name: Izena + real: false + image: /system/studios/original/117.jpg?1311292710 + - id: 51 + name: Diomedéa + filtered_name: Diomedéa + real: true + image: /system/studios/original/51.?1434707974 + - id: 121 + name: Active + filtered_name: Active + real: false + image: /system/studios/original/121.gif?1311292712 + - id: 122 + name: Tokyo Kids + filtered_name: Tokyo Kids + real: false + image: /system/studios/original/122.jpg?1311292713 + - id: 123 + name: Victor Entertainment + filtered_name: Victor + real: false + image: /system/studios/original/123.gif?1311292711 + - id: 124 + name: Animac + filtered_name: Animac + real: false + image: /system/studios/original/124.jpg?1311292710 + - id: 125 + name: Pioneer Entertainment (USA) + filtered_name: Pioneer Entertainment (USA) + real: false + image: null + - id: 160 + name: Rondo Robe + filtered_name: Rondo Robe + real: false + image: /system/studios/original/160.gif?1311292710 + - id: 133 + name: Shinyusha + filtered_name: Shinyusha + real: false + image: null + - id: 96 + name: Yumeta Company + filtered_name: Yumeta Company + real: true + image: /system/studios/original/96.png?1589819393 + - id: 135 + name: MediaNet + filtered_name: MediaNet + real: false + image: /system/studios/original/135.jpg?1312165068 + - id: 136 + name: Vega Entertainment + filtered_name: Vega + real: false + image: /system/studios/original/136.jpg?1311292712 + - id: 137 + name: PPM + filtered_name: PPM + real: false + image: null + - id: 138 + name: Himajin Planning + filtered_name: Himajin Planning + real: false + image: null + - id: 141 + name: Toei Video + filtered_name: Toei Video + real: false + image: null + - id: 142 + name: Asatsu DK + filtered_name: Asatsu DK + real: false + image: null + - id: 143 + name: Mainichi Broadcasting + filtered_name: Mainichi Broadcasting + real: false + image: null + - id: 145 + name: TBS + filtered_name: TBS + real: false + image: /system/studios/original/145.png?1311292711 + - id: 146 + name: CBC + filtered_name: CBC + real: false + image: null + - id: 2407 + name: Flying Ship Studio + filtered_name: Flying Ship + real: false + image: null + - id: 2722 + name: Studio Fusion + filtered_name: Fusion + real: false + image: null + - id: 140 + name: Animax + filtered_name: Animax + real: true + image: /system/studios/original/140.png?1311292711 + - id: 147 + name: SKY Perfect Well Think + filtered_name: SKY Perfect Well Think + real: false + image: /system/studios/original/147.gif?1312164965 + - id: 148 + name: Hakunensha + filtered_name: Hakunensha + real: false + image: null + - id: 149 + name: SME Visual Works + filtered_name: SME Visual Works + real: false + image: null + - id: 152 + name: Green Bunny + filtered_name: Green Bunny + real: false + image: /system/studios/original/152.png?1312165080 + - id: 153 + name: SoftX + filtered_name: SoftX + real: false + image: null + - id: 156 + name: Polygram Japan + filtered_name: Polygram Japan + real: false + image: null + - id: 157 + name: BMG Japan + filtered_name: BMG Japan + real: false + image: null + - id: 158 + name: KIDS STATION + filtered_name: KIDS STATION + real: false + image: /system/studios/original/158.gif?1311292714 + - id: 159 + name: Kodansha + filtered_name: Kodansha + real: false + image: /system/studios/original/159.gif?1311292710 + - id: 161 + name: Sogo Vision + filtered_name: Sogo Vision + real: false + image: null + - id: 167 + name: Sega + filtered_name: Sega + real: false + image: /system/studios/original/167.png?1311292711 + - id: 168 + name: Shelty + filtered_name: Shelty + real: false + image: null + - id: 155 + name: animate Film + filtered_name: animate Film + real: false + image: /system/studios/original/155.jpg?1311292713 + - id: 2409 + name: Amineworks + filtered_name: Amineworks + real: false + image: null + - id: 169 + name: Fuji TV + filtered_name: Fuji TV + real: false + image: /system/studios/original/169.gif?1311292710 + - id: 170 + name: Imagica + filtered_name: Imagica + real: false + image: /system/studios/original/170.png?1311292713 + - id: 172 + name: Alchemist + filtered_name: Alchemist + real: false + image: /system/studios/original/172.gif?1312165043 + - id: 171 + name: A-Line + filtered_name: A-Line + real: false + image: null + - id: 2194 + name: Yi Chen Animation + filtered_name: Yi Chen + real: false + image: null + - id: 2195 + name: PONOS Corporation + filtered_name: PONOS Corporation + real: false + image: null + - id: 2196 + name: Studio DURIAN + filtered_name: DURIAN + real: false + image: null + - id: 166 + name: Movic + filtered_name: Movic + real: false + image: /system/studios/original/166.jpg?1311292713 + - id: 2437 + name: Infinity Vision + filtered_name: Infinity Vision + real: false + image: null + - id: 2439 + name: Chosen + filtered_name: Chosen + real: false + image: null + - id: 2455 + name: East Fish Studio + filtered_name: East Fish + real: false + image: null + - id: 2527 + name: Liber + filtered_name: Liber + real: false + image: null + - id: 173 + name: Alice Soft + filtered_name: Alice Soft + real: false + image: /system/studios/original/173.gif?1311292710 + - id: 150 + name: Sanrio + filtered_name: Sanrio + real: true + image: /system/studios/original/150.png?1539693669 + - id: 2198 + name: Irawias + filtered_name: Irawias + real: false + image: null + - id: 176 + name: Ginga Ya + filtered_name: Ginga Ya + real: false + image: null + - id: 177 + name: Studio Kyuuma + filtered_name: Kyuuma + real: false + image: null + - id: 178 + name: Trilogy Future Studio + filtered_name: Trilogy Future + real: false + image: /system/studios/original/178.png?1311292713 + - id: 182 + name: Age + filtered_name: Age + real: false + image: /system/studios/original/182.gif?1311292713 + - id: 183 + name: Agent 21 + filtered_name: Agent 21 + real: false + image: null + - id: 184 + name: Ai ga areba Daijobu + filtered_name: Ai ga areba Daijobu + real: false + image: /system/studios/original/184.png?1311292710 + - id: 185 + name: Aiko + filtered_name: Aiko + real: false + image: null + - id: 186 + name: Ail + filtered_name: Ail + real: false + image: /system/studios/original/186.gif?1311292714 + - id: 189 + name: GEN Productions + filtered_name: GEN + real: false + image: null + - id: 190 + name: RCC Chugoku Broadcasting + filtered_name: RCC Chugoku Broadcasting + real: false + image: null + - id: 192 + name: Shinkuukan + filtered_name: Shinkuukan + real: false + image: null + - id: 193 + name: Idea Factory + filtered_name: Idea Factory + real: false + image: /system/studios/original/193.png?1311292710 + - id: 194 + name: ANIK + filtered_name: ANIK + real: false + image: /system/studios/original/194.jpg?1311292714 + - id: 197 + name: Studio Junior + filtered_name: Junior + real: false + image: null + - id: 198 + name: Gakken + filtered_name: Gakken + real: false + image: /system/studios/original/198.jpg?1312165013 + - id: 203 + name: Visual Art’s + filtered_name: Visual Art’s + real: false + image: null + - id: 204 + name: PIONEER LDC + filtered_name: PIONEER LDC + real: false + image: null + - id: 205 + name: Nihon Ad Systems + filtered_name: Nihon Ad Systems + real: false + image: null + - id: 206 + name: Digital Works + filtered_name: Digital Works + real: false + image: null + - id: 208 + name: Three Fat Samurai + filtered_name: Three Fat Samurai + real: false + image: /system/studios/original/208.png?1311292711 + - id: 209 + name: Sol Blade + filtered_name: Sol Blade + real: false + image: null + - id: 210 + name: Studio Tulip + filtered_name: Tulip + real: false + image: /system/studios/original/210.gif?1311292710 + - id: 211 + name: Rakuonsha + filtered_name: Rakuonsha + real: false + image: null + - id: 212 + name: Venus Vangard + filtered_name: Venus Vangard + real: false + image: null + - id: 213 + name: Half H.P Studio + filtered_name: Half H.P + real: false + image: null + - id: 214 + name: BS-i + filtered_name: BS-i + real: false + image: null + - id: 3219 + name: Nyan Pollution + filtered_name: Nyan Pollution + real: false + image: null + - id: 217 + name: The Right Stuf International + filtered_name: The Right Stuf International + real: false + image: null + - id: 191 + name: Eiken + filtered_name: Eiken + real: true + image: /system/studios/original/191.jpg?1311292712 + - id: 2412 + name: FUNNY MOVIE + filtered_name: FUNNY MOVIE + real: false + image: null + - id: 222 + name: Jade Animation + filtered_name: Jade + real: false + image: null + - id: 224 + name: Toshiba EMI + filtered_name: Toshiba EMI + real: false + image: null + - id: 226 + name: Panmedia + filtered_name: Panmedia + real: false + image: /system/studios/original/226.png?1311292713 + - id: 229 + name: The Answer Studio + filtered_name: The Answer + real: false + image: /system/studios/original/229.jpg?1312165081 + - id: 271 + name: Barnum Studio + filtered_name: Barnum + real: false + image: null + - id: 272 + name: Studio Kajino + filtered_name: Kajino + real: false + image: null + - id: 273 + name: Think Corporation + filtered_name: Think Corporation + real: false + image: null + - id: 394 + name: Misseri Studio + filtered_name: Misseri + real: false + image: null + - id: 276 + name: DLE + filtered_name: DLE + real: false + image: /system/studios/original/276.png?1647107706 + - id: 2490 + name: Studio Dolphin Night + filtered_name: Dolphin Night + real: false + image: null + - id: 2724 + name: Heart & Soul Animation + filtered_name: Heart & Soul + real: false + image: null + - id: 230 + name: Bandai + filtered_name: Bandai + real: false + image: /system/studios/original/230.jpg?1311292711 + - id: 231 + name: CyberConnect2 + filtered_name: CyberConnect2 + real: false + image: /system/studios/original/231.gif?1311292714 + - id: 233 + name: Bandai Entertainment + filtered_name: Bandai + real: false + image: /system/studios/original/233.gif?1311292711 + - id: 280 + name: Studio Junio + filtered_name: Junio + real: false + image: null + - id: 236 + name: YTV + filtered_name: YTV + real: false + image: null + - id: 238 + name: AT-X + filtered_name: AT-X + real: false + image: null + - id: 2580 + name: GUMBLAB + filtered_name: GUMBLAB + real: false + image: null + - id: 240 + name: Capcom + filtered_name: Capcom + real: false + image: /system/studios/original/240.jpg?1312165059 + - id: 241 + name: KOEI + filtered_name: KOEI + real: false + image: /system/studios/original/241.jpg?1311292712 + - id: 244 + name: D3 + filtered_name: D3 + real: false + image: null + - id: 246 + name: Visual 80 + filtered_name: Visual 80 + real: false + image: null + - id: 2201 + name: Studio Palette + filtered_name: Palette + real: false + image: null + - id: 250 + name: Media Blasters + filtered_name: Media Blasters + real: false + image: null + - id: 252 + name: 4Kids Entertainment + filtered_name: 4Kids + real: false + image: null + - id: 248 + name: Tin House + filtered_name: Tin House + real: true + image: null + - id: 253 + name: Rikuentai + filtered_name: Rikuentai + real: false + image: /system/studios/original/253.gif?1311292713 + - id: 254 + name: Soft Garage + filtered_name: Soft Garage + real: false + image: /system/studios/original/254.jpg?1312165053 + - id: 3226 + name: Studio Chromato + filtered_name: Chromato + real: false + image: null + - id: 256 + name: Studio Kikan + filtered_name: Kikan + real: false + image: null + - id: 257 + name: Jam + filtered_name: Jam + real: false + image: /system/studios/original/257.png?1311292709 + - id: 2204 + name: OZ + filtered_name: OZ + real: false + image: null + - id: 259 + name: Kaeruotoko Shokai + filtered_name: Kaeruotoko Shokai + real: false + image: null + - id: 260 + name: Shuuhei Morita + filtered_name: Shuuhei Morita + real: false + image: null + - id: 261 + name: San-X + filtered_name: San-X + real: false + image: null + - id: 262 + name: Kadokawa Pictures USA + filtered_name: Kadokawa Pictures USA + real: false + image: null + - id: 265 + name: Valkyria + filtered_name: Valkyria + real: false + image: /system/studios/original/265.jpg?1311292713 + - id: 281 + name: Kokusai Eigasha + filtered_name: Kokusai Eigasha + real: false + image: null + - id: 245 + name: Toho + filtered_name: Toho + real: false + image: null + - id: 2205 + name: Studio Kafka + filtered_name: Kafka + real: false + image: null + - id: 2207 + name: Poly Animation + filtered_name: Poly + real: false + image: null + - id: 2208 + name: Taikong Works + filtered_name: Taikong Works + real: false + image: null + - id: 266 + name: Natural High + filtered_name: Natural High + real: false + image: null + - id: 2883 + name: Atelier Tuki + filtered_name: Atelier Tuki + real: false + image: null + - id: 268 + name: Hot Bear + filtered_name: Hot Bear + real: false + image: /system/studios/original/268.jpg?1312165052 + - id: 269 + name: DiC Entertainment + filtered_name: DiC + real: false + image: null + - id: 2526 + name: Shenman Entertainment + filtered_name: Shenman + real: false + image: null + - id: 2535 + name: Uguisu Kobo + filtered_name: Uguisu Kobo + real: false + image: null + - id: 2696 + name: 100studio + filtered_name: 100studio + real: false + image: null + - id: 2157 + name: Production +h. + filtered_name: Production +h. + real: false + image: /system/studios/original/2157.png?1647107719 + - id: 275 + name: Kojiro Shishido Animation Works + filtered_name: Kojiro Shishido Animation Works + real: false + image: null + - id: 277 + name: Anime Midstream + filtered_name: Anime Midstream + real: false + image: null + - id: 2438 + name: yell + filtered_name: yell + real: false + image: null + - id: 279 + name: Skouras + filtered_name: Skouras + real: false + image: null + - id: 282 + name: Gentosha Comics + filtered_name: Gentosha Comics + real: false + image: null + - id: 283 + name: KENMedia + filtered_name: KENMedia + real: false + image: null + - id: 284 + name: Central Park Media + filtered_name: Central Park Media + real: false + image: null + - id: 292 + name: AIC PLUS+ + filtered_name: AIC PLUS+ + real: false + image: null + - id: 289 + name: ACiD FiLM + filtered_name: ACiD FiLM + real: false + image: null + - id: 290 + name: Kinema Citrus + filtered_name: Kinema Citrus + real: false + image: /system/studios/original/290.?1450691180 + - id: 293 + name: Picograph + filtered_name: Picograph + real: false + image: null + - id: 294 + name: Discovery + filtered_name: Discovery + real: false + image: /system/studios/original/294.gif?1311292712 + - id: 295 + name: BaseSon + filtered_name: BaseSon + real: false + image: /system/studios/original/295.jpg?1311292709 + - id: 296 + name: Critical Mass + filtered_name: Critical Mass + real: false + image: null + - id: 297 + name: Armor + filtered_name: Armor + real: false + image: null + - id: 299 + name: Studio Pastoral + filtered_name: Pastoral + real: false + image: /system/studios/original/299.gif?1311292711 + - id: 301 + name: Langmaor + filtered_name: Langmaor + real: false + image: null + - id: 302 + name: 'GODxDOG Production ' + filtered_name: 'GODxDOG Production ' + real: false + image: null + - id: 304 + name: Primastea + filtered_name: Primastea + real: false + image: null + - id: 306 + name: Magic Capsule + filtered_name: Magic Capsule + real: false + image: null + - id: 308 + name: Yellow Film + filtered_name: Yellow Film + real: false + image: null + - id: 310 + name: Animeigo + filtered_name: Animeigo + real: false + image: null + - id: 311 + name: Enoki Films + filtered_name: Enoki Films + real: false + image: null + - id: 2591 + name: Studio Pivote + filtered_name: Pivote + real: false + image: null + - id: 313 + name: Omnibus Japan + filtered_name: Omnibus Japan + real: false + image: /system/studios/original/313.jpg?1311292713 + - id: 316 + name: Nippon Shuppan Hanbai (Nippan) K.K. + filtered_name: Nippon Shuppan Hanbai (Nippan) K.K. + real: false + image: null + - id: 317 + name: NHK Enterprises + filtered_name: NHK Enterprises + real: false + image: null + - id: 319 + name: MS Pictures + filtered_name: MS Pictures + real: false + image: /system/studios/original/319.gif?1312165042 + - id: 323 + name: Nippon Columbia + filtered_name: Nippon Columbia + real: false + image: null + - id: 326 + name: Animation 21 + filtered_name: '21' + real: false + image: null + - id: 327 + name: Takara + filtered_name: Takara + real: false + image: /system/studios/original/327.jpg?1311292711 + - id: 315 + name: DAX Production + filtered_name: DAX + real: false + image: /system/studios/original/315.jpg?1363542744 + - id: 267 + name: Five Ways + filtered_name: Five Ways + real: false + image: /system/studios/original/267.jpg?1311292713 + - id: 328 + name: Casio Entertainment + filtered_name: Casio + real: false + image: /system/studios/original/328.gif?1311292710 + - id: 330 + name: Kanaban Graphics + filtered_name: Kanaban Graphics + real: false + image: null + - id: 332 + name: Takeshobo + filtered_name: Takeshobo + real: false + image: null + - id: 335 + name: Seta Corporation + filtered_name: Seta Corporation + real: false + image: null + - id: 338 + name: Studio Bogey + filtered_name: Bogey + real: false + image: null + - id: 339 + name: Rankin/Bass + filtered_name: Rankin/Bass + real: false + image: null + - id: 341 + name: SamBakZa + filtered_name: SamBakZa + real: false + image: null + - id: 343 + name: Puzzle Animation Studio Limited + filtered_name: Puzzle Animation Studio Limited + real: false + image: null + - id: 346 + name: Hoods Entertainment + filtered_name: Hoods + real: true + image: /system/studios/original/346.png?1369062564 + - id: 2885 + name: Group Creato + filtered_name: Group Creato + real: false + image: null + - id: 1301 + name: CCTV Animation Group + filtered_name: CCTV Animation Group + real: false + image: null + - id: 392 + name: Enterbrain + filtered_name: Enterbrain + real: false + image: /system/studios/original/392.png?1312165048 + - id: 393 + name: Epoch + filtered_name: Epoch + real: false + image: null + - id: 344 + name: ATLUS + filtered_name: ATLUS + real: false + image: /system/studios/original/344.jpg?1311292711 + - id: 345 + name: TAKI Corporation + filtered_name: TAKI Corporation + real: false + image: null + - id: 347 + name: PrimeTime + filtered_name: PrimeTime + real: false + image: null + - id: 348 + name: Kawamoto Productions Ltd. + filtered_name: Kawamoto Productions Ltd. + real: false + image: null + - id: 349 + name: Itasca Studio + filtered_name: Itasca + real: false + image: null + - id: 350 + name: The Village of Marchen + filtered_name: The Village of Marchen + real: false + image: null + - id: 351 + name: Big West + filtered_name: Big West + real: false + image: null + - id: 352 + name: Kadokawa Pictures Japan + filtered_name: Kadokawa Pictures Japan + real: false + image: null + - id: 353 + name: Chungeorahm Film + filtered_name: Chungeorahm Film + real: false + image: null + - id: 354 + name: Encourage Films + filtered_name: Encourage Films + real: false + image: /system/studios/original/354.png?1312165070 + - id: 356 + name: Cranberry + filtered_name: Cranberry + real: false + image: null + - id: 357 + name: Innocent Grey + filtered_name: Innocent Grey + real: false + image: /system/studios/original/357.jpg?1311292714 + - id: 359 + name: NHK-BS2 + filtered_name: NHK-BS2 + real: false + image: null + - id: 361 + name: Oxybot + filtered_name: Oxybot + real: false + image: null + - id: 362 + name: Film Workshop + filtered_name: Film Workshop + real: false + image: null + - id: 363 + name: Topcraft + filtered_name: Topcraft + real: false + image: null + - id: 364 + name: Sovat Theater + filtered_name: Sovat Theater + real: false + image: null + - id: 365 + name: PoRO + filtered_name: PoRO + real: false + image: /system/studios/original/365.jpg?1311292711 + - id: 366 + name: Tomoyasu Murata Company + filtered_name: Tomoyasu Murata Company + real: false + image: null + - id: 367 + name: Heewon Entertainment + filtered_name: Heewon + real: false + image: /system/studios/original/367.png?1311292711 + - id: 368 + name: UM Productions + filtered_name: UM + real: false + image: null + - id: 370 + name: Iyasakadou Film + filtered_name: Iyasakadou Film + real: false + image: null + - id: 371 + name: Union Cho + filtered_name: Union Cho + real: false + image: null + - id: 375 + name: I.Toon + filtered_name: I.Toon + real: false + image: null + - id: 376 + name: Sentai Filmworks + filtered_name: Sentai Filmworks + real: false + image: null + - id: 2134 + name: Studio CANDY BOX + filtered_name: CANDY BOX + real: false + image: null + - id: 378 + name: Grasshoppa! + filtered_name: Grasshoppa! + real: false + image: null + - id: 379 + name: Avaco Creative Studios + filtered_name: Avaco Creative + real: false + image: /system/studios/original/379.jpg?1311292713 + - id: 380 + name: Amuse Pictures + filtered_name: Amuse Pictures + real: false + image: null + - id: 381 + name: Yamato Works + filtered_name: Yamato Works + real: false + image: null + - id: 382 + name: Tokuma Shoten + filtered_name: Tokuma Shoten + real: false + image: null + - id: 383 + name: KMMJ Studios + filtered_name: KMMJ + real: false + image: null + - id: 384 + name: Trick Block + filtered_name: Trick Block + real: false + image: null + - id: 331 + name: Indeprox + filtered_name: Indeprox + real: false + image: null + - id: 340 + name: Future Planet + filtered_name: Future Planet + real: false + image: null + - id: 386 + name: Animaruya + filtered_name: Animaruya + real: false + image: null + - id: 387 + name: Blue Eyes + filtered_name: Blue Eyes + real: false + image: /system/studios/original/387.jpg?1311292712 + - id: 388 + name: Tamura Shigeru Studio + filtered_name: Tamura Shigeru + real: false + image: null + - id: 389 + name: I-move + filtered_name: I-move + real: false + image: /system/studios/original/389.jpg?1311292713 + - id: 390 + name: Tsuchida Productions + filtered_name: Tsuchida + real: false + image: null + - id: 391 + name: Grouper Productions + filtered_name: Grouper + real: false + image: null + - id: 396 + name: Asia-Do + filtered_name: Asia-Do + real: false + image: null + - id: 398 + name: Milky Cartoon + filtered_name: Milky Cartoon + real: false + image: null + - id: 399 + name: Dream Force + filtered_name: Dream Force + real: false + image: null + - id: 401 + name: ChuChu + filtered_name: ChuChu + real: false + image: /system/studios/original/401.png?1311292712 + - id: 402 + name: ChiChinoya + filtered_name: ChiChinoya + real: false + image: /system/studios/original/402.?1370373702 + - id: 403 + name: Tokyo Media Connections + filtered_name: Tokyo Media Connections + real: false + image: null + - id: 404 + name: Studio Unicorn + filtered_name: Unicorn + real: false + image: null + - id: 405 + name: T-Rex + filtered_name: T-Rex + real: false + image: null + - id: 408 + name: Amino + filtered_name: Amino + real: false + image: null + - id: 409 + name: Studio Egg + filtered_name: Egg + real: false + image: null + - id: 410 + name: Adult Source Media + filtered_name: Adult Source Media + real: false + image: null + - id: 411 + name: KBS + filtered_name: KBS + real: false + image: null + - id: 412 + name: Studio Wombat + filtered_name: Wombat + real: false + image: null + - id: 413 + name: Pastel + filtered_name: Pastel + real: false + image: null + - id: 414 + name: Lemon Heart + filtered_name: Lemon Heart + real: false + image: null + - id: 415 + name: Warner Bros. + filtered_name: Warner Bros. + real: false + image: null + - id: 416 + name: TAP + filtered_name: TAP + real: false + image: /system/studios/original/416.jpg?1311292710 + - id: 2413 + name: AION Studio + filtered_name: AION + real: false + image: null + - id: 373 + name: Panda Factory + filtered_name: Panda Factory + real: false + image: null + - id: 358 + name: Telescreen + filtered_name: Telescreen + real: false + image: null + - id: 559 + name: Purple Cow Studio Japan + filtered_name: Purple Cow Studio Japan + real: false + image: null + - id: 419 + name: ElectromagneticWave + filtered_name: ElectromagneticWave + real: false + image: null + - id: 420 + name: ACC Production + filtered_name: ACC + real: false + image: null + - id: 421 + name: International Digital Artist Inc. + filtered_name: International Digital Artist Inc. + real: false + image: null + - id: 422 + name: Schoolzone + filtered_name: Schoolzone + real: false + image: /system/studios/original/422.jpg?1311292713 + - id: 423 + name: Studio Eromatick + filtered_name: Eromatick + real: false + image: null + - id: 424 + name: Mary Jane + filtered_name: Mary Jane + real: false + image: /system/studios/original/424.jpg?1311292712 + - id: 425 + name: AIC Takarazuka + filtered_name: AIC Takarazuka + real: false + image: /system/studios/original/425.jpg?1311292709 + - id: 426 + name: Filmlink International + filtered_name: Filmlink International + real: false + image: null + - id: 427 + name: Studio G-1Neo + filtered_name: G-1Neo + real: false + image: /system/studios/original/427.jpg?1312165046 + - id: 428 + name: Nichiei Agency + filtered_name: Nichiei Agency + real: false + image: null + - id: 429 + name: Office AO + filtered_name: Office AO + real: false + image: /system/studios/original/429.png?1311292712 + - id: 430 + name: Mad Box + filtered_name: Mad Box + real: false + image: /system/studios/original/430.gif?1311292712 + - id: 431 + name: Procidis + filtered_name: Procidis + real: false + image: null + - id: 432 + name: Kachidoki Studio + filtered_name: Kachidoki + real: false + image: null + - id: 434 + name: Synergy Japan + filtered_name: Synergy Japan + real: false + image: null + - id: 2414 + name: MontBlanc Pictures + filtered_name: MontBlanc Pictures + real: false + image: null + - id: 418 + name: Studio Gokumi + filtered_name: Gokumi + real: true + image: /system/studios/original/418.jpg?1311292712 + - id: 435 + name: Studio Zero + filtered_name: Zero + real: false + image: null + - id: 436 + name: AIC Build + filtered_name: AIC Build + real: false + image: null + - id: 2819 + name: soket + filtered_name: soket + real: false + image: null + - id: 438 + name: Studio Signal + filtered_name: Signal + real: false + image: null + - id: 440 + name: Studio Kuma + filtered_name: Kuma + real: false + image: null + - id: 3116 + name: ame pippin + filtered_name: ame pippin + real: false + image: null + - id: 442 + name: Minami Machi Bugyousho + filtered_name: Minami Machi Bugyousho + real: false + image: /system/studios/original/442.jpg?1311292713 + - id: 444 + name: Jinnis Animation Studios + filtered_name: Jinnis Animation + real: false + image: null + - id: 445 + name: Bliss Pictures + filtered_name: Bliss Pictures + real: false + image: null + - id: 446 + name: RTHK + filtered_name: RTHK + real: false + image: null + - id: 447 + name: Hero Communication + filtered_name: Hero Communication + real: false + image: null + - id: 448 + name: Postgal Workshop + filtered_name: Postgal Workshop + real: false + image: null + - id: 449 + name: Maikaze + filtered_name: Maikaze + real: false + image: null + - id: 501 + name: Miramax Films + filtered_name: Miramax Films + real: false + image: null + - id: 2415 + name: HuaMei Animation + filtered_name: HuaMei + real: false + image: null + - id: 2417 + name: TiMi Studio Group + filtered_name: TiMi Studio Group + real: false + image: null + - id: 451 + name: Cookie Jar Entertainment + filtered_name: Cookie Jar + real: false + image: null + - id: 457 + name: Venet + filtered_name: Venet + real: false + image: null + - id: 458 + name: Beijing Sharaku Art Co. + filtered_name: Beijing Sharaku Art Co. + real: false + image: null + - id: 561 + name: U/M/A/A Inc. + filtered_name: U/M/A/A Inc. + real: false + image: null + - id: 563 + name: LandQ studios + filtered_name: LandQ + real: false + image: null + - id: 459 + name: Nitroplus + filtered_name: Nitroplus + real: false + image: /system/studios/original/459.gif?1311292712 + - id: 460 + name: The Klock Worx + filtered_name: The Klock Worx + real: false + image: /system/studios/original/460.jpg?1378062144 + - id: 461 + name: OLE-M + filtered_name: OLE-M + real: false + image: null + - id: 462 + name: Chaos Project + filtered_name: Chaos Project + real: false + image: null + - id: 463 + name: M.S.C + filtered_name: M.S.C + real: false + image: /system/studios/original/463.jpg?1311292714 + - id: 464 + name: flying DOG + filtered_name: flying DOG + real: false + image: /system/studios/original/464.jpg?1311292712 + - id: 465 + name: Hasbro + filtered_name: Hasbro + real: false + image: null + - id: 466 + name: Digital Media Lab + filtered_name: Digital Media Lab + real: false + image: /system/studios/original/466.jpg?1311292714 + - id: 467 + name: Discotek + filtered_name: Discotek + real: false + image: null + - id: 468 + name: Nihon Falcom + filtered_name: Nihon Falcom + real: false + image: /system/studios/original/468.gif?1311292713 + - id: 469 + name: ING + filtered_name: ING + real: false + image: null + - id: 437 + name: Kamikaze Douga + filtered_name: Kamikaze Douga + real: true + image: /system/studios/original/437.?1521917123 + - id: 439 + name: Project No.9 + filtered_name: Project No.9 + real: true + image: /system/studios/original/439.png?1500210282 + - id: 470 + name: GAGA Communications + filtered_name: GAGA Communications + real: false + image: /system/studios/original/470.jpg?1312165074 + - id: 473 + name: Ascension + filtered_name: Ascension + real: false + image: null + - id: 474 + name: Shogakukan Music & Digital Entertainment + filtered_name: Shogakukan Music & Digital + real: false + image: /system/studios/original/474.jpg?1312165067 + - id: 475 + name: Ishikawa Pro + filtered_name: Ishikawa Pro + real: false + image: null + - id: 476 + name: The Berich + filtered_name: The Berich + real: false + image: null + - id: 477 + name: Kino Production + filtered_name: Kino + real: false + image: /system/studios/original/477.jpg?1311292712 + - id: 2453 + name: Kusama Art + filtered_name: Kusama Art + real: false + image: null + - id: 479 + name: DOGA Productions + filtered_name: DOGA + real: false + image: null + - id: 480 + name: Tokyo TV + filtered_name: Tokyo TV + real: false + image: null + - id: 481 + name: Office Take Off + filtered_name: Office Take Off + real: false + image: null + - id: 482 + name: Automatic Flowers Studio + filtered_name: Automatic Flowers + real: false + image: null + - id: 483 + name: Marvel Entertainment + filtered_name: Marvel + real: false + image: null + - id: 484 + name: TOKYOPOP + filtered_name: TOKYOPOP + real: false + image: null + - id: 485 + name: Shinwon Productions + filtered_name: Shinwon + real: false + image: null + - id: 487 + name: Studio MWP + filtered_name: MWP + real: false + image: null + - id: 488 + name: Anchor Bay Films + filtered_name: Anchor Bay Films + real: false + image: null + - id: 489 + name: TCJ + filtered_name: TCJ + real: false + image: null + - id: 490 + name: Maiden Japan + filtered_name: Maiden Japan + real: false + image: null + - id: 491 + name: Byakuya Shobo + filtered_name: Byakuya Shobo + real: false + image: null + - id: 492 + name: Horannabi + filtered_name: Horannabi + real: false + image: null + - id: 493 + name: Aniplex of America + filtered_name: Aniplex of America + real: false + image: null + - id: 494 + name: Studio Take Off + filtered_name: Take Off + real: false + image: null + - id: 495 + name: Moonstone Cherry + filtered_name: Moonstone Cherry + real: false + image: null + - id: 497 + name: Studio Gram + filtered_name: Gram + real: false + image: null + - id: 499 + name: The Pokemon Company International + filtered_name: The Pokemon Company International + real: false + image: null + - id: 2482 + name: Atti Production + filtered_name: Atti + real: false + image: null + - id: 2456 + name: team Yamahitsuji + filtered_name: team Yamahitsuji + real: false + image: null + - id: 471 + name: Shanghai Animation Film Studio + filtered_name: Shanghai Animation Film + real: false + image: /system/studios/original/471.png?1636032282 + - id: 2503 + name: 7doc + filtered_name: 7doc + real: false + image: null + - id: 2520 + name: Twilight Town + filtered_name: Twilight Town + real: false + image: null + - id: 2382 + name: J.T.P.P. + filtered_name: J.T.P.P. + real: false + image: null + - id: 2481 + name: Chimu Jika Hatsuden + filtered_name: Chimu Jika Hatsuden + real: false + image: null + - id: 2538 + name: Imagestone Inc. + filtered_name: Imagestone Inc. + real: false + image: null + - id: 453 + name: Tsuburaya Productions + filtered_name: Tsuburaya + real: false + image: null + - id: 505 + name: Nintendo of America + filtered_name: Nintendo of America + real: false + image: null + - id: 507 + name: Universal Studios + filtered_name: Universal + real: false + image: null + - id: 509 + name: Fuji Video + filtered_name: Fuji Video + real: false + image: null + - id: 511 + name: Wonder Kids + filtered_name: Wonder Kids + real: false + image: null + - id: 515 + name: Fairy Dust + filtered_name: Fairy Dust + real: false + image: null + - id: 519 + name: Collaboration Works + filtered_name: Collaboration Works + real: false + image: null + - id: 521 + name: Anpro + filtered_name: Anpro + real: false + image: null + - id: 523 + name: SBS TV Production + filtered_name: SBS TV + real: false + image: null + - id: 525 + name: KAGAYA Studio + filtered_name: KAGAYA + real: false + image: null + - id: 527 + name: Higa Brothers Production + filtered_name: Higa Brothers + real: false + image: null + - id: 529 + name: Lapis + filtered_name: Lapis + real: false + image: null + - id: 531 + name: Elevenarts + filtered_name: Elevenarts + real: false + image: null + - id: 533 + name: N&G Production + filtered_name: N&G + real: false + image: null + - id: 537 + name: SANZIGEN + filtered_name: SANZIGEN + real: false + image: /system/studios/original/537.?1369837212 + - id: 539 + name: Ultra Super Pictures + filtered_name: Ultra Super Pictures + real: false + image: /system/studios/original/539.jpg?1382873182 + - id: 2418 + name: Imagica Digitalscape + filtered_name: Imagica Digitalscape + real: false + image: null + - id: 543 + name: Studio Saki Makura + filtered_name: Saki Makura + real: false + image: null + - id: 545 + name: Studio Deva Loka + filtered_name: Deva Loka + real: false + image: null + - id: 547 + name: Hobby Japan + filtered_name: Hobby Japan + real: false + image: null + - id: 549 + name: StudioRF Inc. + filtered_name: StudioRF Inc. + real: false + image: null + - id: 551 + name: Crossphere + filtered_name: Crossphere + real: false + image: null + - id: 553 + name: Marvy Jack + filtered_name: Marvy Jack + real: false + image: null + - id: 2891 + name: A4A Inc. + filtered_name: A4A Inc. + real: false + image: null + - id: 571 + name: Obtain Future + filtered_name: Obtain Future + real: false + image: null + - id: 573 + name: JapanAnime + filtered_name: JapanAnime + real: false + image: null + - id: 575 + name: Katsudou-manga-kan + filtered_name: Katsudou-manga-kan + real: false + image: null + - id: 579 + name: AT-2 + filtered_name: AT-2 + real: false + image: null + - id: 2429 + name: STUDIO6'oN + filtered_name: STUDIO6'oN + real: false + image: null + - id: 583 + name: Annapuru + filtered_name: Annapuru + real: false + image: null + - id: 585 + name: Arplants + filtered_name: Arplants + real: false + image: null + - id: 2347 + name: IKK Room + filtered_name: IKK Room + real: false + image: null + - id: 589 + name: Academy Productions + filtered_name: Academy + real: false + image: null + - id: 591 + name: Romanov Films + filtered_name: Romanov Films + real: false + image: null + - id: 593 + name: Egg + filtered_name: Egg + real: false + image: null + - id: 595 + name: NYAV Post + filtered_name: NYAV Post + real: false + image: null + - id: 603 + name: CLOCKUP + filtered_name: CLOCKUP + real: false + image: null + - id: 605 + name: C2C + filtered_name: C2C + real: false + image: /system/studios/original/605.jpg?1389993046 + - id: 607 + name: RAMS + filtered_name: RAMS + real: false + image: null + - id: 611 + name: Sakura Production + filtered_name: Sakura + real: false + image: null + - id: 613 + name: Jormungand Production Partners + filtered_name: Jormungand Production Partners + real: false + image: null + - id: 615 + name: Dream Creation + filtered_name: Dream Creation + real: false + image: null + - id: 617 + name: Azumanga Daioh Production Committee + filtered_name: Azumanga Daioh Production Committee + real: false + image: null + - id: 619 + name: Cospa + filtered_name: Cospa + real: false + image: null + - id: 621 + name: SoftBank Creative Corp. + filtered_name: SoftBank Creative Corp. + real: false + image: null + - id: 623 + name: Kimi To Boku Production Partners + filtered_name: Kimi To Boku Production Partners + real: false + image: null + - id: 625 + name: H.O.T.D Production Committee + filtered_name: H.O.T.D Production Committee + real: false + image: null + - id: 627 + name: Madoka Partners + filtered_name: Madoka Partners + real: false + image: null + - id: 629 + name: Studio Sign + filtered_name: Sign + real: false + image: null + - id: 631 + name: Acchi Kocchi Production Committee + filtered_name: Acchi Kocchi Production Committee + real: false + image: null + - id: 633 + name: Tasogare Otome×Amnesia Production Partners + filtered_name: Tasogare Otome×Amnesia Production Partners + real: false + image: null + - id: 635 + name: Saki Achiga-hen Production Committee + filtered_name: Saki Achiga-hen Production Committee + real: false + image: null + - id: 637 + name: Möbius Tone + filtered_name: Möbius Tone + real: false + image: null + - id: 639 + name: Hiiro No Kakera Production Committee + filtered_name: Hiiro No Kakera Production Committee + real: false + image: null + - id: 641 + name: Japan Aerospace Exploration Agency + filtered_name: Japan Aerospace Exploration Agency + real: false + image: null + - id: 643 + name: Trinity Sound + filtered_name: Trinity Sound + real: false + image: null + - id: 645 + name: Audio Highs + filtered_name: Audio Highs + real: false + image: null + - id: 647 + name: Memory-Tech + filtered_name: Memory-Tech + real: false + image: null + - id: 649 + name: Hanokiwa Academy Student Council + filtered_name: Hanokiwa Academy Student Council + real: false + image: null + - id: 651 + name: Sengoku Collection Production Committee + filtered_name: Sengoku Collection Production Committee + real: false + image: null + - id: 653 + name: tsuritama partners + filtered_name: tsuritama partners + real: false + image: null + - id: 655 + name: Volks + filtered_name: Volks + real: false + image: null + - id: 657 + name: Lucky Paradise + filtered_name: Lucky Paradise + real: false + image: null + - id: 659 + name: AKB0048 Production Committee + filtered_name: AKB0048 Production Committee + real: false + image: null + - id: 661 + name: Right Gauge + filtered_name: Right Gauge + real: false + image: null + - id: 663 + name: Dwango Music Entertainment + filtered_name: Dwango Music + real: false + image: null + - id: 665 + name: chara-ani.com + filtered_name: chara-ani.com + real: false + image: null + - id: 667 + name: AC Create + filtered_name: AC Create + real: false + image: null + - id: 669 + name: My Melody Production Committee + filtered_name: My Melody Production Committee + real: false + image: null + - id: 675 + name: Yomiuri Advertising + filtered_name: Yomiuri Advertising + real: false + image: null + - id: 677 + name: Nexon + filtered_name: Nexon + real: false + image: null + - id: 681 + name: ASCII Media Works + filtered_name: ASCII Media Works + real: false + image: null + - id: 683 + name: Astarotte no Omocha! Production Committee + filtered_name: Astarotte no Omocha! Production Committee + real: false + image: null + - id: 685 + name: Kadokawa Contents Gate + filtered_name: Kadokawa Contents Gate + real: false + image: null + - id: 687 + name: Bandai Namco Live Creative + filtered_name: Bandai Namco Live Creative + real: false + image: null + - id: 689 + name: NTT Docomo + filtered_name: NTT Docomo + real: false + image: null + - id: 691 + name: 501st JOINT FIGHTER WING + filtered_name: 501st JOINT FIGHTER WING + real: false + image: null + - id: 693 + name: BS-TBS + filtered_name: BS-TBS + real: false + image: null + - id: 695 + name: Sankarea Production Committee + filtered_name: Sankarea Production Committee + real: false + image: null + - id: 2493 + name: Studio B&M + filtered_name: B&M + real: false + image: null + - id: 697 + name: Natsuiro Kiseki Production Partners + filtered_name: Natsuiro Kiseki Production Partners + real: false + image: null + - id: 699 + name: feng + filtered_name: feng + real: false + image: null + - id: 701 + name: seikaisha + filtered_name: seikaisha + real: false + image: null + - id: 703 + name: Notes + filtered_name: Notes + real: false + image: null + - id: 705 + name: Project Railgun + filtered_name: Project Railgun + real: false + image: null + - id: 707 + name: TMS-Kyokuchi + filtered_name: TMS-Kyokuchi + real: false + image: null + - id: 709 + name: PPP + filtered_name: PPP + real: false + image: null + - id: 711 + name: Delphi Sound + filtered_name: Delphi Sound + real: false + image: null + - id: 713 + name: 12 Diary Holders + filtered_name: 12 Diary Holders + real: false + image: null + - id: 715 + name: Dwango + filtered_name: Dwango + real: false + image: null + - id: 717 + name: TV Tokyo Music + filtered_name: TV Tokyo Music + real: false + image: null + - id: 719 + name: Studio Mausu + filtered_name: Mausu + real: false + image: null + - id: 721 + name: GANSIS + filtered_name: GANSIS + real: false + image: null + - id: 723 + name: Hotline + filtered_name: Hotline + real: false + image: null + - id: 725 + name: Hatsukoi Limited Production Committee + filtered_name: Hatsukoi Limited Production Committee + real: false + image: null + - id: 727 + name: Kiyosumi High School Mahjong Club + filtered_name: Kiyosumi High School Mahjong Club + real: false + image: null + - id: 729 + name: Raku High Student Council + filtered_name: Raku High Student Council + real: false + image: null + - id: 731 + name: Inu x Boku SS Production Partners + filtered_name: Inu x Boku SS Production Partners + real: false + image: null + - id: 733 + name: Viki + filtered_name: Viki + real: false + image: null + - id: 735 + name: Slowcurve + filtered_name: Slowcurve + real: false + image: null + - id: 737 + name: Sony Music Communications + filtered_name: Sony Music Communications + real: false + image: null + - id: 739 + name: Project IS + filtered_name: Project IS + real: false + image: null + - id: 741 + name: Toshiba Entertainment + filtered_name: Toshiba + real: false + image: null + - id: 743 + name: Project Eureka AO + filtered_name: Project Eureka AO + real: false + image: null + - id: 745 + name: Cosmic Ray + filtered_name: Cosmic Ray + real: false + image: null + - id: 747 + name: Apollon + filtered_name: Apollon + real: false + image: null + - id: 749 + name: Pony Canyon Enterprises + filtered_name: Pony Canyon Enterprises + real: false + image: null + - id: 751 + name: Marvelous AQL + filtered_name: Marvelous AQL + real: false + image: null + - id: 753 + name: PRA + filtered_name: PRA + real: false + image: null + - id: 757 + name: Sony Music Entertainment + filtered_name: Sony Music + real: false + image: null + - id: 759 + name: Eye Move + filtered_name: Eye Move + real: false + image: null + - id: 761 + name: Sunny Side Up + filtered_name: Sunny Side Up + real: false + image: null + - id: 763 + name: Miracle Robo + filtered_name: Miracle Robo + real: false + image: null + - id: 765 + name: Sakura Create + filtered_name: Sakura Create + real: false + image: null + - id: 767 + name: Majin + filtered_name: Majin + real: false + image: null + - id: 769 + name: Fuji Pacific Music Publishing + filtered_name: Fuji Pacific Music Publishing + real: false + image: null + - id: 771 + name: Kyokuichi Tokyo Movie Shinsha + filtered_name: Kyokuichi Tokyo Movie Shinsha + real: false + image: null + - id: 773 + name: Peter Pan Creation + filtered_name: Peter Pan Creation + real: false + image: null + - id: 775 + name: Bushiroad Inc. + filtered_name: Bushiroad Inc. + real: false + image: null + - id: 777 + name: Showgate + filtered_name: Showgate + real: false + image: null + - id: 779 + name: AMG MUSIC + filtered_name: AMG MUSIC + real: false + image: null + - id: 781 + name: Studio NOA + filtered_name: NOA + real: false + image: null + - id: 783 + name: GKids + filtered_name: GKids + real: false + image: null + - id: 785 + name: Advance Syakujii + filtered_name: Advance Syakujii + real: false + image: null + - id: 787 + name: Happinet Pictures + filtered_name: Happinet Pictures + real: false + image: null + - id: 789 + name: BIGLOBE + filtered_name: BIGLOBE + real: false + image: null + - id: 791 + name: Dentsu Entertainment USA + filtered_name: Dentsu Entertainment USA + real: false + image: null + - id: 793 + name: Glams + filtered_name: Glams + real: false + image: null + - id: 795 + name: Yahoo! Japan + filtered_name: Yahoo! Japan + real: false + image: null + - id: 797 + name: Hobunsha + filtered_name: Hobunsha + real: false + image: null + - id: 799 + name: indigo line + filtered_name: indigo line + real: false + image: null + - id: 2374 + name: Momoi Planning + filtered_name: Momoi Planning + real: false + image: null + - id: 805 + name: AIC Frontier + filtered_name: AIC Frontier + real: false + image: null + - id: 807 + name: Po10tial + filtered_name: Po10tial + real: false + image: null + - id: 811 + name: Hang Zhou StarQ + filtered_name: Hang Zhou StarQ + real: false + image: null + - id: 813 + name: SoftCel Pictures + filtered_name: SoftCel Pictures + real: false + image: null + - id: 815 + name: EMI + filtered_name: EMI + real: false + image: null + - id: 817 + name: WField + filtered_name: WField + real: false + image: null + - id: 819 + name: Next Media Animation + filtered_name: Next Media + real: false + image: null + - id: 821 + name: Cotton Doll + filtered_name: Cotton Doll + real: false + image: null + - id: 803 + name: Trigger + filtered_name: Trigger + real: true + image: /system/studios/original/803.png?1356241771 + - id: 823 + name: Lune Pictures + filtered_name: Lune Pictures + real: false + image: null + - id: 827 + name: Amber Film Works + filtered_name: Amber Film Works + real: false + image: null + - id: 755 + name: Jumondou + filtered_name: Jumondou + real: false + image: null + - id: 829 + name: Studio Jack + filtered_name: Jack + real: false + image: null + - id: 831 + name: Otogi Production + filtered_name: Otogi + real: false + image: null + - id: 833 + name: Kyotoma + filtered_name: Kyotoma + real: false + image: null + - id: 835 + name: UNLIMITED Partners + filtered_name: UNLIMITED Partners + real: false + image: null + - id: 837 + name: Saki Zenkoku-hen Production Committee + filtered_name: Saki Zenkoku-hen Production Committee + real: false + image: null + - id: 841 + name: Saban Entertainment + filtered_name: Saban + real: false + image: null + - id: 843 + name: BS Fuji + filtered_name: BS Fuji + real: false + image: null + - id: 845 + name: Project No Name + filtered_name: Project No Name + real: false + image: null + - id: 847 + name: Senran Kagura Partners + filtered_name: Senran Kagura Partners + real: false + image: null + - id: 848 + name: Kazami Gakuen Koushiki Douga-bu + filtered_name: Kazami Gakuen Koushiki Douga-bu + real: false + image: null + - id: 850 + name: Kenji Studio + filtered_name: Kenji + real: false + image: null + - id: 854 + name: Solid Vox + filtered_name: Solid Vox + real: false + image: null + - id: 856 + name: Charaction + filtered_name: Charaction + real: false + image: null + - id: 860 + name: Triple X + filtered_name: Triple X + real: false + image: null + - id: 2541 + name: SAMG Entertainment + filtered_name: SAMG + real: false + image: null + - id: 868 + name: Devil Survivor 2 Animation Committee + filtered_name: Devil Survivor 2 Animation Committee + real: false + image: null + - id: 870 + name: Index + filtered_name: Index + real: false + image: null + - id: 872 + name: Shingeki no Kyojin Team + filtered_name: Shingeki no Kyojin Team + real: false + image: null + - id: 874 + name: Flex Comics + filtered_name: Flex Comics + real: false + image: null + - id: 876 + name: G-mode + filtered_name: G-mode + real: false + image: null + - id: 878 + name: An DerCen + filtered_name: An DerCen + real: false + image: null + - id: 880 + name: gimik + filtered_name: gimik + real: false + image: null + - id: 882 + name: Toranoana + filtered_name: Toranoana + real: false + image: null + - id: 884 + name: Strawberry Meets Pictures + filtered_name: Strawberry Meets Pictures + real: false + image: null + - id: 886 + name: Cinema Tohoku + filtered_name: Cinema Tohoku + real: false + image: null + - id: 890 + name: Karaku + filtered_name: Karaku + real: false + image: null + - id: 892 + name: NOTTV + filtered_name: NOTTV + real: false + image: null + - id: 2389 + name: G.P Entertainment + filtered_name: G.P + real: false + image: null + - id: 899 + name: Tokyo Animation Film + filtered_name: Tokyo Animation Film + real: false + image: null + - id: 901 + name: Tsubasa Entertainment + filtered_name: Tsubasa + real: false + image: null + - id: 903 + name: Studio Zealot + filtered_name: Zealot + real: false + image: null + - id: 905 + name: Tokuma Japan + filtered_name: Tokuma Japan + real: false + image: null + - id: 907 + name: AYCO + filtered_name: AYCO + real: false + image: null + - id: 898 + name: I.Gzwei + filtered_name: I.Gzwei + real: false + image: null + - id: 909 + name: Studio Kelmadick + filtered_name: Kelmadick + real: false + image: null + - id: 913 + name: Ryukyu Asahi Broadcasting + filtered_name: Ryukyu Asahi Broadcasting + real: false + image: null + - id: 917 + name: Takahashi Studio + filtered_name: Takahashi + real: false + image: null + - id: 919 + name: Ankama + filtered_name: Ankama + real: false + image: null + - id: 921 + name: Dynamic Planning + filtered_name: Dynamic Planning + real: false + image: null + - id: 923 + name: CyberStep + filtered_name: CyberStep + real: false + image: null + - id: 925 + name: Earth Star Entertainment + filtered_name: Earth Star + real: false + image: /system/studios/original/925.?1436214052 + - id: 927 + name: Dibetagurashi Production Committee + filtered_name: Dibetagurashi Production Committee + real: false + image: null + - id: 929 + name: Animation Do + filtered_name: Do + real: false + image: null + - id: 931 + name: Poncotan + filtered_name: Poncotan + real: false + image: null + - id: 933 + name: Carp Studio + filtered_name: Carp + real: false + image: null + - id: 935 + name: NHK-BS1 + filtered_name: NHK-BS1 + real: false + image: null + - id: 937 + name: Studio Kaab + filtered_name: Kaab + real: false + image: null + - id: 939 + name: Tama Production + filtered_name: Tama + real: false + image: null + - id: 941 + name: Iwatobi High School Swimming Club + filtered_name: Iwatobi High School Swimming Club + real: false + image: null + - id: 943 + name: Koichi Kikuchi + filtered_name: Koichi Kikuchi + real: false + image: null + - id: 2348 + name: KKC Animation Production + filtered_name: KKC Animation + real: false + image: null + - id: 947 + name: Manga Entertainment + filtered_name: Manga + real: false + image: null + - id: 949 + name: teamKG + filtered_name: teamKG + real: false + image: null + - id: 953 + name: Soft on Demand + filtered_name: Soft on Demand + real: false + image: null + - id: 955 + name: Watamote Production Committee + filtered_name: Watamote Production Committee + real: false + image: null + - id: 959 + name: Studio Compile + filtered_name: Compile + real: false + image: null + - id: 961 + name: Baramiri + filtered_name: Baramiri + real: false + image: null + - id: 963 + name: Mages + filtered_name: Mages + real: false + image: null + - id: 965 + name: Crimson Star Media + filtered_name: Crimson Star Media + real: false + image: null + - id: 967 + name: Pupa Production Committee + filtered_name: Pupa Production Committee + real: false + image: null + - id: 969 + name: Uchouten Kazoku Production Committee + filtered_name: Uchouten Kazoku Production Committee + real: false + image: null + - id: 971 + name: Anime R + filtered_name: Anime R + real: false + image: null + - id: 973 + name: Studio Liberty + filtered_name: Liberty + real: false + image: null + - id: 975 + name: Angelfish + filtered_name: Angelfish + real: false + image: null + - id: 2508 + name: Deck + filtered_name: Deck + real: false + image: null + - id: 979 + name: SPEED + filtered_name: SPEED + real: false + image: null + - id: 981 + name: BOOTLEG + filtered_name: BOOTLEG + real: false + image: null + - id: 983 + name: Daiko + filtered_name: Daiko + real: false + image: null + - id: 985 + name: P Productions + filtered_name: P + real: false + image: null + - id: 987 + name: Creative Bridge + filtered_name: Creative Bridge + real: false + image: null + - id: 989 + name: Nihon Hoso Eigasha + filtered_name: Nihon Hoso Eigasha + real: false + image: null + - id: 3228 + name: Shou Fan Yu Shu Gongzuoshi + filtered_name: Shou Fan Yu Shu Gongzuoshi + real: false + image: null + - id: 993 + name: Tesagure! Production Committee + filtered_name: Tesagure! Production Committee + real: false + image: null + - id: 995 + name: Coamix + filtered_name: Coamix + real: false + image: null + - id: 997 + name: Maxell E-Cube + filtered_name: Maxell E-Cube + real: false + image: null + - id: 1001 + name: Kyodo Eiga + filtered_name: Kyodo Eiga + real: false + image: null + - id: 2416 + name: Kent House + filtered_name: Kent House + real: false + image: null + - id: 1005 + name: Oddjob + filtered_name: Oddjob + real: false + image: null + - id: 3319 + name: Yanchester + filtered_name: Yanchester + real: false + image: null + - id: 1013 + name: Opera House + filtered_name: Opera House + real: false + image: null + - id: 1015 + name: T.O Entertainment + filtered_name: T.O + real: false + image: null + - id: 1017 + name: Liverpool + filtered_name: Liverpool + real: false + image: null + - id: 1019 + name: Himeyuri Alumnae Incorporated Foundation + filtered_name: Himeyuri Alumnae Incorporated Foundation + real: false + image: null + - id: 1021 + name: ASIA Documentary Productions + filtered_name: ASIA Documentary + real: false + image: null + - id: 1027 + name: Milkshake + filtered_name: Milkshake + real: false + image: null + - id: 1029 + name: BeeWorks + filtered_name: BeeWorks + real: false + image: null + - id: 1031 + name: Universal Radio Studio + filtered_name: Universal Radio + real: false + image: null + - id: 1035 + name: Mikakunin de Shinkoukei Production Committee + filtered_name: Mikakunin de Shinkoukei Production Committee + real: false + image: null + - id: 1037 + name: Japan Vistec + filtered_name: Japan Vistec + real: false + image: null + - id: 1039 + name: DIVE II Entertainment + filtered_name: DIVE II + real: false + image: null + - id: 1041 + name: Ai Addiction + filtered_name: Ai Addiction + real: false + image: null + - id: 1043 + name: Benesse Corporation + filtered_name: Benesse Corporation + real: false + image: null + - id: 1047 + name: ZIZ + filtered_name: ZIZ + real: false + image: null + - id: 1049 + name: PoPoCo + filtered_name: PoPoCo + real: false + image: null + - id: 1053 + name: Production IMS + filtered_name: Production IMS + real: false + image: /system/studios/original/1053.jpg?1404514553 + - id: 1057 + name: Kyowa Film + filtered_name: Kyowa Film + real: false + image: null + - id: 1059 + name: Studio Nem + filtered_name: Nem + real: false + image: null + - id: 1061 + name: Project Team Eikyuu Kikan + filtered_name: Project Team Eikyuu Kikan + real: false + image: null + - id: 3230 + name: Juvenage + filtered_name: Juvenage + real: false + image: null + - id: 1065 + name: Public & Basic + filtered_name: Public & Basic + real: false + image: null + - id: 1067 + name: Rising Force + filtered_name: Rising Force + real: false + image: null + - id: 1071 + name: Studio Lotus + filtered_name: Lotus + real: false + image: null + - id: 1073 + name: Magic Lantern Film + filtered_name: Magic Lantern Film + real: false + image: null + - id: 1077 + name: MMDGP + filtered_name: MMDGP + real: false + image: null + - id: 1079 + name: 3xCube + filtered_name: 3xCube + real: false + image: null + - id: 1081 + name: ZERO-A + filtered_name: ZERO-A + real: false + image: null + - id: 1083 + name: Aikikaku Center + filtered_name: Aikikaku Center + real: false + image: null + - id: 1045 + name: Space Neko Company + filtered_name: Space Neko Company + real: false + image: null + - id: 1025 + name: Dongwoo A&E + filtered_name: Dongwoo A&E + real: false + image: null + - id: 1085 + name: Cosmos + filtered_name: Cosmos + real: false + image: null + - id: 1089 + name: Studio Zain + filtered_name: Zain + real: false + image: null + - id: 1093 + name: BreakBottle + filtered_name: BreakBottle + real: false + image: null + - id: 1097 + name: Namco Bandai Games + filtered_name: Namco Bandai Games + real: false + image: null + - id: 1101 + name: Lambert + filtered_name: Lambert + real: false + image: null + - id: 1103 + name: TROYCA + filtered_name: TROYCA + real: false + image: /system/studios/original/1103.?1446387663 + - id: 1105 + name: Gendai Production + filtered_name: Gendai + real: false + image: null + - id: 1107 + name: Rabbit Gate + filtered_name: Rabbit Gate + real: false + image: null + - id: 1115 + name: Studio Korumi + filtered_name: Korumi + real: false + image: null + - id: 1117 + name: 1st PLACE + filtered_name: 1st PLACE + real: false + image: null + - id: 1121 + name: Banpresto + filtered_name: Banpresto + real: false + image: null + - id: 1123 + name: Lucent Pictures Entertainment + filtered_name: Lucent Pictures + real: false + image: null + - id: 1125 + name: Tsubu Doll Production Committee + filtered_name: Tsubu Doll Production Committee + real: false + image: null + - id: 1131 + name: Zero-G Room + filtered_name: Zero-G Room + real: false + image: null + - id: 1133 + name: dwarf + filtered_name: dwarf + real: false + image: null + - id: 1135 + name: FOREST Hunting One + filtered_name: FOREST Hunting One + real: false + image: null + - id: 1137 + name: SEK Studios + filtered_name: SEK + real: false + image: null + - id: 1139 + name: BEAM Entertainment + filtered_name: BEAM + real: false + image: null + - id: 1143 + name: TOHO animation + filtered_name: TOHO + real: false + image: null + - id: 1147 + name: Shinano Kikaku + filtered_name: Shinano Kikaku + real: false + image: null + - id: 1149 + name: Studio Cab + filtered_name: Cab + real: false + image: null + - id: 1151 + name: Sanrio Digital + filtered_name: Sanrio Digital + real: false + image: null + - id: 1153 + name: Image Kei + filtered_name: Image Kei + real: false + image: null + - id: 1157 + name: Big Bang + filtered_name: Big Bang + real: false + image: null + - id: 1159 + name: King Bee + filtered_name: King Bee + real: false + image: null + - id: 1161 + name: Allure + filtered_name: Allure + real: false + image: null + - id: 1163 + name: Flatiron Film Company + filtered_name: Flatiron Film Company + real: false + image: null + - id: 2362 + name: Aiti St. + filtered_name: Aiti St. + real: false + image: null + - id: 1165 + name: Tri-Slash + filtered_name: Tri-Slash + real: false + image: null + - id: 1167 + name: Nikkatsu Mukojima + filtered_name: Nikkatsu Mukojima + real: false + image: null + - id: 1171 + name: Olive Studio + filtered_name: Olive + real: false + image: null + - id: 1175 + name: Atelier Musa + filtered_name: Atelier Musa + real: false + image: null + - id: 1177 + name: ' Geijutsu Eigasha' + filtered_name: ' Geijutsu Eigasha' + real: false + image: null + - id: 1179 + name: MK Pictures + filtered_name: MK Pictures + real: false + image: null + - id: 1183 + name: E&G Films + filtered_name: E&G Films + real: false + image: null + - id: 1187 + name: Ripple Film + filtered_name: Ripple Film + real: false + image: null + - id: 1191 + name: Azeta Pictures + filtered_name: Azeta Pictures + real: false + image: null + - id: 1193 + name: MooGoo + filtered_name: MooGoo + real: false + image: null + - id: 1195 + name: Creators in Pack + filtered_name: Creators in Pack + real: false + image: null + - id: 1199 + name: L. + filtered_name: L. + real: false + image: null + - id: 1201 + name: Ponycan USA + filtered_name: Ponycan USA + real: false + image: null + - id: 1203 + name: Studio 1st + filtered_name: 1st + real: false + image: null + - id: 1205 + name: Answer Studio + filtered_name: Answer + real: false + image: null + - id: 1207 + name: Comic Umenohone + filtered_name: Comic Umenohone + real: false + image: null + - id: 1211 + name: Tokyo MX + filtered_name: Tokyo MX + real: false + image: null + - id: 1213 + name: Mobcast + filtered_name: Mobcast + real: false + image: null + - id: 1215 + name: Daiichi Kosho Co. + filtered_name: Daiichi Kosho Co. + real: false + image: null + - id: 1217 + name: HeART-BIT + filtered_name: HeART-BIT + real: false + image: null + - id: 1223 + name: Teichiku Entertainment + filtered_name: Teichiku + real: false + image: null + - id: 1225 + name: Age Global Networks + filtered_name: Age Global Networks + real: false + image: null + - id: 1055 + name: Yamamura Animation + filtered_name: Yamamura + real: false + image: null + - id: 1227 + name: Studio GDW + filtered_name: GDW + real: false + image: null + - id: 1231 + name: OLM Digital + filtered_name: OLM Digital + real: false + image: null + - id: 1233 + name: Bandai Namco Games + filtered_name: Bandai Namco Games + real: false + image: null + - id: 1235 + name: I was a Ballerina + filtered_name: I was a Ballerina + real: false + image: null + - id: 1237 + name: Millepensee + filtered_name: Millepensee + real: false + image: /system/studios/original/1237.png?1515415404 + - id: 1239 + name: KeyEast + filtered_name: KeyEast + real: false + image: null + - id: 1241 + name: Evil Line Records + filtered_name: Evil Line Records + real: false + image: null + - id: 1242 + name: Sakura Color Film + filtered_name: Sakura Color Film + real: false + image: null + - id: 1243 + name: AniMan + filtered_name: AniMan + real: false + image: null + - id: 1173 + name: Studio Dadashow + filtered_name: Dadashow + real: false + image: /system/studios/original/1173.png?1619360325 + - id: 1246 + name: AIR AGENCY + filtered_name: AIR AGENCY + real: false + image: null + - id: 1247 + name: Mistral Japan + filtered_name: Mistral Japan + real: false + image: null + - id: 1189 + name: Sola Digital Arts + filtered_name: Sola Digital Arts + real: false + image: /system/studios/original/1189.jpg?1622293352 + - id: 1249 + name: Mirai Film + filtered_name: Mirai Film + real: false + image: null + - id: 1250 + name: The National Film Center Japan + filtered_name: The National Film Center Japan + real: false + image: null + - id: 1251 + name: Dentsu Eigasha Tokyo + filtered_name: Dentsu Eigasha Tokyo + real: false + image: null + - id: 1252 + name: Studio Binzo + filtered_name: Binzo + real: false + image: null + - id: 1253 + name: Studio GOONEYS + filtered_name: GOONEYS + real: false + image: null + - id: 1254 + name: Grooove + filtered_name: Grooove + real: false + image: null + - id: 1255 + name: Glovision + filtered_name: Glovision + real: false + image: null + - id: 1256 + name: Harappa + filtered_name: Harappa + real: false + image: null + - id: 1257 + name: A-Real + filtered_name: A-Real + real: false + image: null + - id: 2400 + name: Executive Decision + filtered_name: Executive Decision + real: false + image: null + - id: 1245 + name: ZIZ Entertainment (ZIZ) + filtered_name: ZIZ Entertainment (ZIZ) + real: false + image: null + - id: 1259 + name: Studio Curtain + filtered_name: Curtain + real: false + image: null + - id: 1260 + name: Nakamura Production + filtered_name: Nakamura + real: false + image: null + - id: 1261 + name: Good Smile Company + filtered_name: Good Smile Company + real: false + image: null + - id: 1263 + name: Dynamo Pictures + filtered_name: Dynamo Pictures + real: false + image: null + - id: 3093 + name: Sanjie Donghua + filtered_name: Sanjie Donghua + real: false + image: null + - id: 1266 + name: Studio! Cucuri + filtered_name: Studio! Cucuri + real: false + image: null + - id: 1267 + name: Tencent Comic + filtered_name: Tencent Comic + real: false + image: null + - id: 1269 + name: K-Factory + filtered_name: K-Factory + real: false + image: null + - id: 1270 + name: Sanctuary + filtered_name: Sanctuary + real: false + image: null + - id: 1271 + name: Assez Finaud Fabric + filtered_name: Assez Finaud Fabric + real: false + image: null + - id: 1273 + name: Osaka University of Arts + filtered_name: Osaka University of Arts + real: false + image: null + - id: 1277 + name: Imagica West + filtered_name: Imagica West + real: false + image: null + - id: 1279 + name: Buemon + filtered_name: Buemon + real: false + image: null + - id: 1280 + name: Media Castle + filtered_name: Media Castle + real: false + image: null + - id: 1281 + name: Office DCI + filtered_name: Office DCI + real: false + image: null + - id: 1282 + name: Arcturus + filtered_name: Arcturus + real: false + image: null + - id: 1283 + name: TC Entertainment + filtered_name: TC + real: false + image: null + - id: 1284 + name: Avex Pictures + filtered_name: Avex Pictures + real: false + image: null + - id: 1285 + name: Being + filtered_name: Being + real: false + image: null + - id: 1286 + name: 10Gauge + filtered_name: 10Gauge + real: false + image: null + - id: 1287 + name: Q-Tec + filtered_name: Q-Tec + real: false + image: null + - id: 1288 + name: Chrono Gear Creative + filtered_name: Chrono Gear Creative + real: false + image: null + - id: 1289 + name: F.M.F + filtered_name: F.M.F + real: false + image: null + - id: 1290 + name: Pollyanna Graphics + filtered_name: Pollyanna Graphics + real: false + image: null + - id: 1291 + name: KOO-KI + filtered_name: KOO-KI + real: false + image: null + - id: 1292 + name: TUBA + filtered_name: TUBA + real: false + image: null + - id: 1293 + name: 'Romantica club !! ' + filtered_name: 'Romantica club !! ' + real: false + image: null + - id: 1294 + name: Studio Don Juan + filtered_name: Don Juan + real: false + image: null + - id: 1296 + name: Marza Animation Planet + filtered_name: Marza Animation Planet + real: false + image: null + - id: 1300 + name: Office Nobu + filtered_name: Office Nobu + real: false + image: null + - id: 1302 + name: RoiVisual + filtered_name: RoiVisual + real: false + image: null + - id: 1303 + name: PansonWorks + filtered_name: PansonWorks + real: false + image: null + - id: 1304 + name: Qualia Animation + filtered_name: Qualia + real: false + image: null + - id: 1305 + name: Milestone Music Publishing + filtered_name: Milestone Music Publishing + real: false + image: null + - id: 1306 + name: AIC Classic + filtered_name: AIC Classic + real: false + image: null + - id: 1313 + name: Amuse + filtered_name: Amuse + real: false + image: null + - id: 1317 + name: Production GoodBook + filtered_name: Production GoodBook + real: false + image: null + - id: 1320 + name: Joker Films + filtered_name: Joker Films + real: false + image: null + - id: 1321 + name: Haoliners Animation + filtered_name: Haoliners + real: false + image: null + - id: 1324 + name: Shimogumi + filtered_name: Shimogumi + real: false + image: null + - id: 1328 + name: Decovocal + filtered_name: Decovocal + real: false + image: null + - id: 1372 + name: Soeishinsha + filtered_name: Soeishinsha + real: false + image: null + - id: 1348 + name: Sugar Boy + filtered_name: Sugar Boy + real: false + image: null + - id: 1351 + name: EDGE + filtered_name: EDGE + real: false + image: null + - id: 1353 + name: Issen + filtered_name: Issen + real: false + image: null + - id: 1360 + name: Hoods Drifters Studio + filtered_name: Hoods Drifters + real: false + image: null + - id: 1361 + name: Darts + filtered_name: Darts + real: false + image: null + - id: 1362 + name: Rabbit Machine + filtered_name: Rabbit Machine + real: false + image: null + - id: 1363 + name: Marine Entertainment + filtered_name: Marine + real: false + image: null + - id: 1365 + name: Shueisha + filtered_name: Shueisha + real: false + image: null + - id: 1368 + name: Kazuki Production + filtered_name: Kazuki + real: false + image: null + - id: 1369 + name: G-Lam + filtered_name: G-Lam + real: false + image: null + - id: 1370 + name: Sprite Animation Studios + filtered_name: Sprite Animation + real: false + image: null + - id: 1371 + name: T.P.O + filtered_name: T.P.O + real: false + image: null + - id: 1375 + name: Studio Jam + filtered_name: Jam + real: false + image: null + - id: 1380 + name: domerica + filtered_name: domerica + real: false + image: null + - id: 1382 + name: Piko Studio + filtered_name: Piko + real: false + image: null + - id: 1383 + name: Studio Live + filtered_name: Live + real: false + image: null + - id: 1385 + name: Blue Cat + filtered_name: Blue Cat + real: false + image: null + - id: 1387 + name: Neft Film + filtered_name: Neft Film + real: false + image: null + - id: 1396 + name: W-Toon Studio + filtered_name: W-Toon + real: false + image: null + - id: 3233 + name: Kio Studio + filtered_name: Kio + real: false + image: null + - id: 1419 + name: GARDEN LODGE + filtered_name: GARDEN LODGE + real: false + image: null + - id: 1421 + name: Takara Tomy A.R.T.S + filtered_name: Takara Tomy A.R.T.S + real: false + image: null + - id: 1433 + name: Ekura Animal + filtered_name: Ekura Animal + real: false + image: null + - id: 1435 + name: JCF + filtered_name: JCF + real: false + image: null + - id: 1437 + name: Ishimori Entertainment + filtered_name: Ishimori + real: false + image: null + - id: 1442 + name: Mook DLE + filtered_name: Mook DLE + real: false + image: null + - id: 1444 + name: Egg Firm + filtered_name: Egg Firm + real: false + image: null + - id: 1445 + name: Arcs Create + filtered_name: Arcs Create + real: false + image: null + - id: 1454 + name: REALTHING + filtered_name: REALTHING + real: false + image: null + - id: 1456 + name: Beijing Huihuang Animation Company + filtered_name: Beijing Huihuang Animation Company + real: false + image: null + - id: 1460 + name: Coastline Animation Studio + filtered_name: Coastline Animation + real: false + image: null + - id: 1258 + name: Bandai Namco Pictures + filtered_name: Bandai Namco Pictures + real: false + image: /system/studios/original/1258.png?1589293619 + - id: 1463 + name: Anime Antenna Iinkai + filtered_name: Anime Antenna Iinkai + real: false + image: null + - id: 1464 + name: Hiro Media + filtered_name: Hiro Media + real: false + image: null + - id: 1473 + name: Odolttogi + filtered_name: Odolttogi + real: false + image: null + - id: 1476 + name: Shochiku Animation Institute + filtered_name: Shochiku Animation Institute + real: false + image: null + - id: 1479 + name: Studio Core + filtered_name: Core + real: false + image: null + - id: 1482 + name: Bouncy + filtered_name: Bouncy + real: false + image: null + - id: 1489 + name: Ripromo + filtered_name: Ripromo + real: false + image: null + - id: 1504 + name: Studio Z5 + filtered_name: Z5 + real: false + image: null + - id: 1509 + name: Studio World + filtered_name: World + real: false + image: null + - id: 1513 + name: Dongyang Animation + filtered_name: Dongyang + real: false + image: null + - id: 1522 + name: Echoes + filtered_name: Echoes + real: false + image: null + - id: 1523 + name: Studio Ponoc + filtered_name: Ponoc + real: false + image: /system/studios/original/1523.png?1518985073 + - id: 1525 + name: Moss Design Unit + filtered_name: Moss Design Unit + real: false + image: null + - id: 1527 + name: Image House + filtered_name: Image House + real: false + image: null + - id: 1530 + name: Emon + filtered_name: Emon + real: false + image: null + - id: 1531 + name: Flavors Soft + filtered_name: Flavors Soft + real: false + image: null + - id: 1533 + name: Studio WHO + filtered_name: WHO + real: false + image: null + - id: 1536 + name: Namu Animation + filtered_name: Namu + real: false + image: null + - id: 1545 + name: Japan Taps + filtered_name: Japan Taps + real: false + image: null + - id: 1546 + name: Chippai + filtered_name: Chippai + real: false + image: null + - id: 1549 + name: Dai Nippon Printing + filtered_name: Dai Nippon Printing + real: false + image: null + - id: 1558 + name: TOCSIS + filtered_name: TOCSIS + real: false + image: null + - id: 1562 + name: Team YokkyuFuman + filtered_name: Team YokkyuFuman + real: false + image: null + - id: 1572 + name: XFLAG + filtered_name: XFLAG + real: false + image: null + - id: 1587 + name: Cygames + filtered_name: Cygames + real: false + image: null + - id: 1592 + name: Kamio Japan + filtered_name: Kamio Japan + real: false + image: null + - id: 1596 + name: Will Palette + filtered_name: Will Palette + real: false + image: null + - id: 1618 + name: Rockwell Eyes + filtered_name: Rockwell Eyes + real: false + image: null + - id: 1638 + name: Tsukimidou + filtered_name: Tsukimidou + real: false + image: null + - id: 1639 + name: Chiptune + filtered_name: Chiptune + real: false + image: null + - id: 1642 + name: Circle Tribute + filtered_name: Circle Tribute + real: false + image: null + - id: 2390 + name: Concept Films + filtered_name: Concept Films + real: false + image: null + - id: 1661 + name: drop + filtered_name: drop + real: false + image: null + - id: 1662 + name: Creators Dot Com + filtered_name: Creators Dot Com + real: false + image: null + - id: 1668 + name: Karasfilms + filtered_name: Karasfilms + real: false + image: null + - id: 1349 + name: Tencent Animation & Comics + filtered_name: Tencent Animation & Comics + real: false + image: null + - id: 1357 + name: Craftar Studios + filtered_name: Craftar + real: false + image: null + - id: 1593 + name: Success Corp. + filtered_name: Success Corp. + real: false + image: null + - id: 1436 + name: Stingray + filtered_name: Stingray + real: false + image: null + - id: 1514 + name: Tengu Kobo + filtered_name: Tengu Kobo + real: false + image: null + - id: 1512 + name: Dai-Ichi Douga + filtered_name: Dai-Ichi Douga + real: false + image: null + - id: 1670 + name: Nishiki Studio + filtered_name: Nishiki + real: false + image: null + - id: 1690 + name: Imagineer + filtered_name: Imagineer + real: false + image: null + - id: 1691 + name: Studio UGOKI + filtered_name: UGOKI + real: false + image: null + - id: 1693 + name: Studio Flad + filtered_name: Flad + real: false + image: null + - id: 1705 + name: Studio Khronos + filtered_name: Khronos + real: false + image: null + - id: 1706 + name: Beijing Rocen Digital + filtered_name: Beijing Rocen Digital + real: false + image: null + - id: 1717 + name: Onionskin + filtered_name: Onionskin + real: false + image: null + - id: 1723 + name: Anime Beans + filtered_name: Anime Beans + real: false + image: null + - id: 1724 + name: Studio OX + filtered_name: OX + real: false + image: null + - id: 1725 + name: Minakata Laboratory + filtered_name: Minakata Laboratory + real: false + image: null + - id: 1726 + name: Three-d + filtered_name: Three-d + real: false + image: null + - id: 1746 + name: Pops Inc. + filtered_name: Pops Inc. + real: false + image: null + - id: 1747 + name: Twin Engine + filtered_name: Twin Engine + real: false + image: null + - id: 1750 + name: Studio CA + filtered_name: CA + real: false + image: null + - id: 1751 + name: pH Studio + filtered_name: pH + real: false + image: null + - id: 1753 + name: D & D Pictures + filtered_name: D & D Pictures + real: false + image: null + - id: 1754 + name: Meruhensha + filtered_name: Meruhensha + real: false + image: null + - id: 1758 + name: Picante Circus + filtered_name: Picante Circus + real: false + image: null + - id: 3040 + name: Durandal + filtered_name: Durandal + real: false + image: null + - id: 1393 + name: Geno Studio + filtered_name: Geno + real: true + image: /system/studios/original/1393.png?1521917884 + - id: 1440 + name: Felix Film + filtered_name: Felix Film + real: true + image: /system/studios/original/1440.png?1521916608 + - id: 1760 + name: Suiseisha + filtered_name: Suiseisha + real: false + image: null + - id: 1762 + name: Piso Studio + filtered_name: Piso + real: false + image: null + - id: 1763 + name: Studio Nanahoshi + filtered_name: Nanahoshi + real: false + image: null + - id: 1766 + name: Husio Studio + filtered_name: Husio + real: false + image: null + - id: 1767 + name: iDRAGONS Creative Studio + filtered_name: iDRAGONS Creative + real: false + image: null + - id: 1769 + name: helo.inc + filtered_name: helo.inc + real: false + image: null + - id: 1770 + name: KIZAWA Studio + filtered_name: KIZAWA + real: false + image: null + - id: 1773 + name: KJJ Animation + filtered_name: KJJ + real: false + image: null + - id: 1794 + name: EKACHI EPILKA + filtered_name: EKACHI EPILKA + real: false + image: null + - id: 1771 + name: Pb Animation + filtered_name: Pb + real: false + image: null + - id: 1795 + name: CUCURI + filtered_name: CUCURI + real: false + image: null + - id: 1797 + name: NHK Enterprises + filtered_name: NHK Enterprises + real: false + image: null + - id: 1487 + name: Bouncy + filtered_name: Bouncy + real: false + image: null + - id: 1462 + name: B&T + filtered_name: B&T + real: false + image: null + - id: 1485 + name: Light Chaser Animation Studios + filtered_name: Light Chaser Animation + real: false + image: /system/studios/original/1485.png?1622293533 + - id: 1805 + name: Thundray + filtered_name: Thundray + real: false + image: null + - id: 1808 + name: CG Year + filtered_name: CG Year + real: false + image: null + - id: 1809 + name: October Media + filtered_name: October Media + real: false + image: null + - id: 1810 + name: Mili Pictures + filtered_name: Mili Pictures + real: false + image: null + - id: 1811 + name: Boyan Pictures + filtered_name: Boyan Pictures + real: false + image: null + - id: 1813 + name: Studio Lings + filtered_name: Lings + real: false + image: null + - id: 1814 + name: Studio Hakk + filtered_name: Hakk + real: false + image: null + - id: 1828 + name: Lapin Track + filtered_name: Lapin Track + real: false + image: null + - id: 1829 + name: Lesprit + filtered_name: Lesprit + real: false + image: null + - id: 1830 + name: Seven Stone Entertainment + filtered_name: Seven Stone + real: false + image: null + - id: 1832 + name: GRIZZLY + filtered_name: GRIZZLY + real: false + image: null + - id: 1836 + name: SELFISH + filtered_name: SELFISH + real: false + image: null + - id: 1837 + name: G-angle + filtered_name: G-angle + real: false + image: null + - id: 1838 + name: 33 Collective + filtered_name: 33 Collective + real: false + image: null + - id: 1839 + name: Studio Ppuri + filtered_name: Ppuri + real: false + image: null + - id: 1842 + name: Urban Product + filtered_name: Urban Product + real: false + image: null + - id: 1843 + name: TriF Studio + filtered_name: TriF + real: false + image: null + - id: 1844 + name: Shanghai Hippo Animation + filtered_name: Shanghai Hippo + real: false + image: null + - id: 1845 + name: Guton Animation Studio + filtered_name: Guton Animation + real: false + image: null + - id: 1846 + name: Tokyo Movie + filtered_name: Tokyo Movie + real: false + image: null + - id: 1847 + name: Square Enix Visual Works + filtered_name: Square Enix Visual Works + real: false + image: null + - id: 1849 + name: MASTER LIGHTS + filtered_name: MASTER LIGHTS + real: false + image: null + - id: 1851 + name: Jumonji + filtered_name: Jumonji + real: false + image: null + - id: 1853 + name: Saetta + filtered_name: Saetta + real: false + image: null + - id: 1854 + name: monofilmo + filtered_name: monofilmo + real: false + image: null + - id: 1860 + name: Magia Doraglier + filtered_name: Magia Doraglier + real: false + image: null + - id: 1861 + name: Animation Planet + filtered_name: Planet + real: false + image: null + - id: 1866 + name: Grom + filtered_name: Grom + real: false + image: null + - id: 1867 + name: Aurum Production + filtered_name: Aurum + real: false + image: null + - id: 1871 + name: Studio W.Baba + filtered_name: W.Baba + real: false + image: null + - id: 1872 + name: P.I.C.S. + filtered_name: P.I.C.S. + real: false + image: null + - id: 1873 + name: Silver + filtered_name: Silver + real: false + image: null + - id: 1879 + name: Dangun Pictures + filtered_name: Dangun Pictures + real: false + image: null + - id: 1882 + name: UWAN Pictures + filtered_name: UWAN Pictures + real: false + image: null + - id: 1887 + name: Brio Animation + filtered_name: Brio + real: false + image: null + - id: 1893 + name: CygamesPictures + filtered_name: CygamesPictures + real: false + image: null + - id: 1897 + name: Ankama Animations + filtered_name: Ankama Animations + real: false + image: null + - id: 1910 + name: Sega Interactive + filtered_name: Sega Interactive + real: false + image: null + - id: 1812 + name: Imagica Imageworks + filtered_name: Imagica Imageworks + real: false + image: null + - id: 2529 + name: Xing Yi Kai Chen + filtered_name: Xing Yi Kai Chen + real: false + image: null + - id: 1927 + name: Studio Crocodile + filtered_name: Crocodile + real: false + image: null + - id: 1932 + name: Speed Inc. + filtered_name: Speed Inc. + real: false + image: null + - id: 1934 + name: Saigo no Shudan + filtered_name: Saigo no Shudan + real: false + image: null + - id: 1936 + name: Liberty Animation Studio + filtered_name: Liberty Animation + real: false + image: null + - id: 1937 + name: MAT + filtered_name: MAT + real: false + image: null + - id: 1943 + name: Idol + filtered_name: Idol + real: false + image: null + - id: 1944 + name: Samsara Animation Studio + filtered_name: Samsara Animation + real: false + image: null + - id: 1945 + name: Lide + filtered_name: Lide + real: false + image: null + - id: 1947 + name: Kate Arrow + filtered_name: Kate Arrow + real: false + image: null + - id: 1949 + name: Anon Pictures + filtered_name: Anon Pictures + real: false + image: null + - id: 1951 + name: ANIDO FILM + filtered_name: ANIDO FILM + real: false + image: null + - id: 1952 + name: Animation Staff Room + filtered_name: Staff Room + real: false + image: null + - id: 1953 + name: W+K Tokyo + filtered_name: W+K Tokyo + real: false + image: null + - id: 1954 + name: Welz Animation Studios + filtered_name: Welz Animation + real: false + image: null + - id: 1960 + name: StoryRiders Co. Ltd. + filtered_name: StoryRiders Co. Ltd. + real: false + image: null + - id: 3232 + name: Left Pocket Studio + filtered_name: Left Pocket + real: false + image: null + - id: 1969 + name: V-sign + filtered_name: V-sign + real: false + image: null + - id: 1970 + name: Wolf Smoke Studio + filtered_name: Wolf Smoke + real: false + image: null + - id: 1971 + name: Gainax Kyoto + filtered_name: Gainax Kyoto + real: false + image: null + - id: 1972 + name: HOTZIPANG + filtered_name: HOTZIPANG + real: false + image: null + - id: 1973 + name: Monster's Egg + filtered_name: Monster's Egg + real: false + image: null + - id: 1979 + name: Suna Kouhou + filtered_name: Suna Kouhou + real: false + image: null + - id: 2401 + name: YURUPPE Inc. + filtered_name: YURUPPE Inc. + real: false + image: null + - id: 1983 + name: Anima&Co. + filtered_name: Anima&Co. + real: false + image: null + - id: 1967 + name: Drive + filtered_name: Drive + real: false + image: /system/studios/original/1967.png?1647108152 + - id: 1768 + name: Sparkly Key Animation Studio + filtered_name: Sparkly Key Animation + real: false + image: /system/studios/original/1768.png?1622293364 + - id: 1999 + name: Albacrow + filtered_name: Albacrow + real: false + image: null + - id: 2013 + name: Peak Hunt + filtered_name: Peak Hunt + real: false + image: null + - id: 1968 + name: Studio Hokiboshi + filtered_name: Hokiboshi + real: false + image: null + - id: 1890 + name: Tear Studio + filtered_name: Tear + real: false + image: /system/studios/original/1890.png?1589291799 + - id: 2032 + name: WHOPPERS + filtered_name: WHOPPERS + real: false + image: null + - id: 1774 + name: LAN Studio + filtered_name: LAN + real: false + image: null + - id: 1966 + name: Arch + filtered_name: Arch + real: false + image: null + - id: 2820 + name: maroyaka + filtered_name: maroyaka + real: false + image: null + - id: 2894 + name: Konami animation + filtered_name: Konami + real: false + image: null + - id: 2861 + name: KWANED + filtered_name: KWANED + real: false + image: null + - id: 2860 + name: CANOPUS + filtered_name: CANOPUS + real: false + image: null + - id: 2854 + name: Volca + filtered_name: Volca + real: false + image: null + - id: 1384 + name: CinePix + filtered_name: CinePix + real: false + image: null + - id: 3073 + name: Yasuda Genshou Studio by Xenotoon + filtered_name: Yasuda Genshou Studio by Xenotoon + real: false + image: null + - id: 333 + name: TYO Animations + filtered_name: TYO Animations + real: true + image: /system/studios/original/333.jpg?1312165071 + - id: 2540 + name: Fever Creations + filtered_name: Fever Creations + real: false + image: null + - id: 163 + name: asread. + filtered_name: asread. + real: false + image: /system/studios/original/163.jpg?1311292709 + - id: 1976 + name: CGCG Studio + filtered_name: CGCG + real: false + image: /system/studios/original/1976.png?1622293588 + - id: 2188 + name: Marone + filtered_name: Marone + real: false + image: null + - id: 2264 + name: 5 Inc. + filtered_name: 5 Inc. + real: false + image: null + - id: 2546 + name: Studio Sota + filtered_name: Sota + real: false + image: null + - id: 2547 + name: Frontier Engine + filtered_name: Frontier Engine + real: false + image: null + - id: 2530 + name: Blue bread + filtered_name: Blue bread + real: false + image: null + - id: 2454 + name: Ryuu M's + filtered_name: Ryuu M's + real: false + image: null + - id: 2489 + name: Tsubo Production + filtered_name: Tsubo + real: false + image: null + - id: 1864 + name: Ezόla + filtered_name: Ezόla + real: false + image: /system/studios/original/1864.png?1634761365 + - id: 1892 + name: Sublimation + filtered_name: Sublimation + real: false + image: /system/studios/original/1892.png?1634761710 + - id: 2525 + name: Hurray! + filtered_name: Hurray! + real: false + image: null + - id: 2549 + name: StudioXD + filtered_name: StudioXD + real: false + image: null + - id: 2550 + name: ONIRO + filtered_name: ONIRO + real: false + image: null + - id: 2534 + name: studio YOG + filtered_name: YOG + real: false + image: null + - id: 2471 + name: Wonder Cat Animation + filtered_name: Wonder Cat + real: false + image: null + - id: 2375 + name: GAV Video + filtered_name: GAV Video + real: false + image: null + - id: 2491 + name: Mikimoto Production + filtered_name: Mikimoto + real: false + image: null + - id: 2393 + name: MB planning + filtered_name: MB planning + real: false + image: null + - id: 2571 + name: Griot Groove + filtered_name: Griot Groove + real: false + image: null + - id: 3 + name: Gonzo + filtered_name: Gonzo + real: true + image: /system/studios/original/3.png?1311292710 + - id: 4 + name: Bones + filtered_name: Bones + real: true + image: /system/studios/original/4.png?1311292711 + - id: 5 + name: Bee Train + filtered_name: Bee Train + real: true + image: /system/studios/original/5.png?1389209052 + - id: 6 + name: Gainax + filtered_name: Gainax + real: true + image: /system/studios/original/6.png?1452689573 + - id: 1505 + name: Studio March + filtered_name: March + real: true + image: null + - id: 8 + name: Artland + filtered_name: Artland + real: true + image: /system/studios/original/8.gif?1312165056 + - id: 2821 + name: Fugaku + filtered_name: Fugaku + real: false + image: null + - id: 2792 + name: INTERFACEDOGS + filtered_name: INTERFACEDOGS + real: false + image: null + - id: 2822 + name: Shykeumo Animation Studio + filtered_name: Shykeumo Animation + real: false + image: null + - id: 2828 + name: Studio Polon + filtered_name: Polon + real: false + image: null + - id: 2829 + name: EOTA + filtered_name: EOTA + real: false + image: null + - id: 2292 + name: Toei Advertising + filtered_name: Toei Advertising + real: false + image: null + - id: 2835 + name: ROLL2 + filtered_name: ROLL2 + real: false + image: null + - id: 2701 + name: CMC Media + filtered_name: CMC Media + real: false + image: null + - id: 2253 + name: miHoYoAnime + filtered_name: miHoYoAnime + real: false + image: null + - id: 2214 + name: Takun Manga Box + filtered_name: Takun Manga Box + real: false + image: null + - id: 7 + name: J.C.Staff + filtered_name: J.C.Staff + real: true + image: /system/studios/original/7.?1434707490 + - id: 307 + name: Sunwoo Entertainment + filtered_name: Sunwoo + real: true + image: /system/studios/original/307.png?1589290394 + - id: 1471 + name: Platinum Vision + filtered_name: Platinum Vision + real: true + image: /system/studios/original/1471.png?1589290457 + - id: 78 + name: Picture Magic + filtered_name: Picture Magic + real: false + image: /system/studios/original/78.png?1589290604 + - id: 13 + name: Studio 4°C + filtered_name: 4C + real: true + image: /system/studios/original/13.gif?1311292710 + - id: 2075 + name: Taomee + filtered_name: Taomee + real: false + image: null + - id: 2485 + name: Ezo Kobo + filtered_name: Ezo Kobo + real: false + image: null + - id: 2004 + name: Sunrise Beyond + filtered_name: Sunrise Beyond + real: false + image: /system/studios/original/2004.png?1634761033 + - id: 1687 + name: Yokohama Animation Lab + filtered_name: Yokohama Animation Lab + real: false + image: /system/studios/original/1687.png?1618485066 + - id: 15 + name: Sony Pictures Entertainment + filtered_name: Sony Pictures + real: true + image: /system/studios/original/15.jpg?1311292710 + - id: 2206 + name: Xuni Ying Ye + filtered_name: Xuni Ying Ye + real: false + image: null + - id: 18 + name: Toei Animation + filtered_name: Toei + real: true + image: /system/studios/original/18.?1446981470 + - id: 1569 + name: Seven Arcs Pictures + filtered_name: Seven Arcs Pictures + real: true + image: /system/studios/original/1569.png?1505243599 + - id: 21 + name: Studio Ghibli + filtered_name: Ghibli + real: true + image: /system/studios/original/21.png?1311292709 + - id: 809 + name: AKOM + filtered_name: AKOM + real: true + image: /system/studios/original/809.png?1589290477 + - id: 1692 + name: Revoroot + filtered_name: Revoroot + real: true + image: /system/studios/original/1692.png?1576061257 + - id: 2842 + name: Big Pine Animation Studio + filtered_name: Big Pine Animation + real: false + image: null + - id: 2893 + name: Gear Studio + filtered_name: Gear + real: false + image: null + - id: 2895 + name: Team OneOne + filtered_name: Team OneOne + real: false + image: null + - id: 2897 + name: MOJO Animation + filtered_name: MOJO + real: false + image: null + - id: 2898 + name: Manaa Animation + filtered_name: Manaa + real: false + image: null + - id: 2875 + name: Blaze Studio + filtered_name: Blaze + real: false + image: null + - id: 2888 + name: Wang Film Productions + filtered_name: Wang Film + real: false + image: null + - id: 2877 + name: D'ART Shtajio + filtered_name: D'ART Shtajio + real: false + image: null + - id: 2879 + name: Grayscale Arts + filtered_name: Grayscale Arts + real: false + image: null + - id: 2907 + name: Studio Placebo + filtered_name: Placebo + real: false + image: null + - id: 2906 + name: Kobito + filtered_name: Kobito + real: false + image: null + - id: 2909 + name: Teddy + filtered_name: Teddy + real: false + image: null + - id: 2911 + name: Studio Eight Color + filtered_name: Eight Color + real: false + image: null + - id: 1095 + name: Studio Cockpit + filtered_name: Cockpit + real: false + image: null + - id: 3221 + name: Miyajima Film + filtered_name: Miyajima Film + real: false + image: null + - id: 3234 + name: InfiniOrange Animation Studio + filtered_name: InfiniOrange Animation + real: false + image: null + - id: 3235 + name: Origin + filtered_name: Origin + real: false + image: null + - id: 2462 + name: Seasun Pictures + filtered_name: Seasun Pictures + real: false + image: null + - id: 3180 + name: Number 19 Animation + filtered_name: Number 19 + real: false + image: null + - id: 3248 + name: Igloo Studio + filtered_name: Igloo + real: false + image: null + - id: 22 + name: Nippon Animation + filtered_name: Nippon + real: true + image: /system/studios/original/22.jpg?1311292709 + - id: 24 + name: Studio Fantasia + filtered_name: Fantasia + real: true + image: /system/studios/original/24.jpg?1311292711 + - id: 32 + name: Manglobe + filtered_name: Manglobe + real: true + image: /system/studios/original/32.png?1311292714 + - id: 2914 + name: Creative House Pocket + filtered_name: Creative House Pocket + real: false + image: null + - id: 79 + name: Genco + filtered_name: Genco + real: false + image: /system/studios/original/79.jpg?1311292710 + - id: 126 + name: Studio Comet + filtered_name: Comet + real: true + image: /system/studios/original/126.png?1311292714 + - id: 30 + name: Ajia-do + filtered_name: Ajia-do + real: true + image: /system/studios/original/30.png?1521916831 + - id: 2612 + name: Fengyun Animation + filtered_name: Fengyun + real: false + image: null + - id: 38 + name: Arms + filtered_name: Arms + real: true + image: /system/studios/original/38.jpg?1402569794 + - id: 41 + name: Satelight + filtered_name: Satelight + real: true + image: /system/studios/original/41.?1434707679 + - id: 43 + name: ufotable + filtered_name: ufotable + real: true + image: /system/studios/original/43.png?1311292714 + - id: 27 + name: Xebec + filtered_name: Xebec + real: true + image: /system/studios/original/27.?1450865151 + - id: 452 + name: Knack Productions + filtered_name: Knack + real: true + image: /system/studios/original/452.png?1589290493 + - id: 45 + name: Pink Pineapple + filtered_name: Pink Pineapple + real: true + image: /system/studios/original/45.?1370373738 + - id: 567 + name: D.A.S.T Corporation + filtered_name: D.A.S.T Corporation + real: false + image: null + - id: 1694 + name: AZ Creative + filtered_name: AZ Creative + real: false + image: null + - id: 48 + name: AIC + filtered_name: AIC + real: true + image: /system/studios/original/48.png?1311292709 + - id: 54 + name: Mook Animation + filtered_name: Mook + real: true + image: /system/studios/original/54.png?1311292710 + - id: 60 + name: Actas + filtered_name: Actas + real: true + image: /system/studios/original/60.png?1311292711 + - id: 67 + name: OB Planning + filtered_name: OB Planning + real: true + image: /system/studios/original/67.jpg?1311292711 + - id: 120 + name: TNK + filtered_name: TNK + real: true + image: /system/studios/original/120.png?1311292712 + - id: 95 + name: Doga Kobo + filtered_name: Doga Kobo + real: true + image: /system/studios/original/95.png?1312164950 + - id: 2078 + name: HIDEHOMARE + filtered_name: HIDEHOMARE + real: false + image: null + - id: 2080 + name: Super Normal Studio + filtered_name: Super Normal + real: false + image: null + - id: 56 + name: A-1 Pictures + filtered_name: A-1 Pictures + real: true + image: /system/studios/original/56.?1434707196 + - id: 852 + name: Nexus + filtered_name: Nexus + real: true + image: /system/studios/original/852.png?1589290569 + - id: 1575 + name: DR Movie + filtered_name: DR Movie + real: true + image: /system/studios/original/1575.png?1589290511 + - id: 1669 + name: production doA + filtered_name: production doA + real: true + image: /system/studios/original/1669.png?1589290587 + - id: 68 + name: Mushi Production + filtered_name: Mushi + real: true + image: /system/studios/original/68.jpg?1311292714 + - id: 73 + name: TMS Entertainment + filtered_name: TMS + real: true + image: /system/studios/original/73.?1413190852 + - id: 2841 + name: Maruga Factory + filtered_name: Maruga Factory + real: false + image: null + - id: 2845 + name: Dimps + filtered_name: Dimps + real: false + image: null + - id: 2831 + name: uzupiyo Animation & Digital Works + filtered_name: uzupiyo Animation & Digital Works + real: false + image: null + - id: 2060 + name: Wulifang + filtered_name: Wulifang + real: false + image: null + - id: 2555 + name: Year Young Culture + filtered_name: Year Young Culture + real: false + image: null + - id: 2830 + name: Artner + filtered_name: Artner + real: false + image: null + - id: 77 + name: APPP + filtered_name: APPP + real: true + image: /system/studios/original/77.jpg?1311292713 + - id: 81 + name: Radix + filtered_name: Radix + real: true + image: /system/studios/original/81.jpg?1311292712 + - id: 84 + name: Studio Rikka + filtered_name: Rikka + real: true + image: /system/studios/original/84.jpg?1312165073 + - id: 86 + name: Group TAC + filtered_name: Group TAC + real: true + image: /system/studios/original/86.png?1311292712 + - id: 101 + name: Studio Hibari + filtered_name: Hibari + real: true + image: /system/studios/original/101.jpg?1311292714 + - id: 110 + name: Triangle Staff + filtered_name: Triangle Staff + real: true + image: /system/studios/original/110.?1434707010 + - id: 111 + name: NHK + filtered_name: NHK + real: true + image: /system/studios/original/111.png?1538666067 + - id: 118 + name: SynergySP + filtered_name: SynergySP + real: true + image: /system/studios/original/118.jpg?1311292710 + - id: 2079 + name: Animation Lab Japan + filtered_name: Lab Japan + real: false + image: null + - id: 75 + name: Imagin + filtered_name: Imagin + real: true + image: /system/studios/original/75.jpg?1311292712 + - id: 132 + name: P.A. Works + filtered_name: P.A. Works + real: true + image: /system/studios/original/132.?1434707384 + - id: 144 + name: Pony Canyon + filtered_name: Pony Canyon + real: true + image: /system/studios/original/144.jpg?1311292711 + - id: 179 + name: A.C.G.T. + filtered_name: A.C.G.T. + real: true + image: /system/studios/original/179.jpg?1388083492 + - id: 196 + name: Production Reed + filtered_name: Production Reed + real: true + image: /system/studios/original/196.jpg?1311292712 + - id: 242 + name: Ashi Productions + filtered_name: Ashi + real: true + image: /system/studios/original/242.png?1540563216 + - id: 215 + name: Nelvana + filtered_name: Nelvana + real: true + image: /system/studios/original/215.?1434707213 + - id: 234 + name: Oh! Production + filtered_name: Oh! + real: true + image: /system/studios/original/234.jpg?1311292713 + - id: 247 + name: Shin-Ei Animation + filtered_name: Shin-Ei + real: true + image: /system/studios/original/247.png?1510312671 + - id: 287 + name: David Production + filtered_name: David + real: true + image: /system/studios/original/287.jpg?1311292711 + - id: 200 + name: Tezuka Productions + filtered_name: Tezuka + real: true + image: /system/studios/original/200.gif?1312165075 + - id: 218 + name: Zexcs + filtered_name: Zexcs + real: true + image: /system/studios/original/218.png?1311292712 + - id: 291 + name: CoMix Wave Films + filtered_name: CoMix Wave Films + real: true + image: /system/studios/original/291.png?1456439666 + - id: 309 + name: GoHands + filtered_name: GoHands + real: true + image: /system/studios/original/309.?1434708437 + - id: 314 + name: White Fox + filtered_name: White Fox + real: true + image: /system/studios/original/314.jpg?1311292714 + - id: 329 + name: Phoenix Entertainment + filtered_name: Phoenix + real: true + image: /system/studios/original/329.gif?1311292713 + - id: 334 + name: Ordet + filtered_name: Ordet + real: true + image: /system/studios/original/334.gif?1312165042 + - id: 342 + name: Japan Home Video + filtered_name: Japan Home Video + real: true + image: /system/studios/original/342.gif?1311292713 + - id: 385 + name: Tele-Cartoon Japan + filtered_name: Tele-Cartoon Japan + real: true + image: null + - id: 406 + name: Asahi Production + filtered_name: Asahi + real: true + image: /system/studios/original/406.gif?1311292709 + - id: 228 + name: Daewon Media + filtered_name: Daewon Media + real: true + image: /system/studios/original/228.png?1499498217 + - id: 441 + name: 8bit + filtered_name: 8bit + real: true + image: /system/studios/original/441.png?1451469013 + - id: 455 + name: Palm Studio + filtered_name: Palm + real: true + image: null + - id: 456 + name: Lerche + filtered_name: Lerche + real: true + image: /system/studios/original/456.png?1538666349 + - id: 486 + name: Digital Frontier + filtered_name: Digital Frontier + real: true + image: /system/studios/original/486.jpg?1311292713 + - id: 535 + name: Knack Animation + filtered_name: Knack + real: true + image: null + - id: 569 + name: MAPPA + filtered_name: MAPPA + real: true + image: /system/studios/original/569.png?1351013196 + - id: 609 + name: Cammot + filtered_name: Cammot + real: true + image: /system/studios/original/609.jpg?1356523473 + - id: 825 + name: Fifth Avenue + filtered_name: Fifth Avenue + real: true + image: /system/studios/original/825.png?1352398063 + - id: 858 + name: Wit Studio + filtered_name: Wit + real: true + image: /system/studios/original/858.png?1366652107 + - id: 894 + name: Graphinica + filtered_name: Graphinica + real: true + image: /system/studios/original/894.?1521916447 + - id: 911 + name: Passione + filtered_name: Passione + real: true + image: /system/studios/original/911.jpg?1402343502 + - id: 951 + name: NAZ + filtered_name: NAZ + real: true + image: /system/studios/original/951.png?1390414002 + - id: 1023 + name: Polygon Pictures + filtered_name: Polygon Pictures + real: true + image: /system/studios/original/1023.png?1492152889 + - id: 1091 + name: Gakken Eigakyoku + filtered_name: Gakken Eigakyoku + real: true + image: null + - id: 1127 + name: Studio 3Hz + filtered_name: 3Hz + real: true + image: /system/studios/original/1127.?1451206542 + - id: 1129 + name: Pierrot Plus + filtered_name: Pierrot Plus + real: true + image: /system/studios/original/1129.jpg?1404514265 + - id: 112 + name: Brain's Base + filtered_name: Brain's Base + real: true + image: /system/studios/original/112.png?1311292714 + - id: 1229 + name: Pie in the sky + filtered_name: Pie in the sky + real: false + image: null + - id: 28 + name: OLM + filtered_name: OLM + real: true + image: /system/studios/original/28.png?1523482474 + - id: 443 + name: Studio PuYUKAI + filtered_name: PuYUKAI + real: true + image: /system/studios/original/443.png?1521917173 + - id: 3231 + name: Qingkong Qian Li + filtered_name: Qingkong Qian Li + real: false + image: null + - id: 839 + name: LIDENFILMS + filtered_name: LIDENFILMS + real: false + image: /system/studios/original/839.?1369247736 + - id: 37 + name: Studio Deen + filtered_name: Deen + real: true + image: /system/studios/original/37.?1434707541 + - id: 1591 + name: Science SARU + filtered_name: Science SARU + real: false + image: /system/studios/original/1591.png?1589293915 + - id: 472 + name: Usagi Ou + filtered_name: Usagi Ou + real: false + image: null + - id: 2053 + name: l-a-unch・BOX + filtered_name: l-a-unch・BOX + real: false + image: null + - id: 2081 + name: JJJOY Animation Studios + filtered_name: JJJOY Animation + real: false + image: null + - id: 1521 + name: Studio Elle + filtered_name: Elle + real: false + image: null + - id: 44 + name: Shaft + filtered_name: Shaft + real: true + image: /system/studios/original/44.png?1503215283 + - id: 103 + name: Tatsunoko Production + filtered_name: Tatsunoko + real: true + image: /system/studios/original/103.jpg?1311292713 + - id: 1529 + name: Studio M2 + filtered_name: M2 + real: false + image: null + - id: 1278 + name: Signal.MD + filtered_name: Signal.MD + real: true + image: /system/studios/original/1278.png?1454409341 + - id: 36 + name: Gallop + filtered_name: Gallop + real: true + image: /system/studios/original/36.jpg?1311292711 + - id: 2846 + name: Studio Bingo + filtered_name: Bingo + real: false + image: null + - id: 2916 + name: Reirs + filtered_name: Reirs + real: false + image: null + - id: 2917 + name: Soigne + filtered_name: Soigne + real: false + image: null + - id: 2635 + name: Escape Velocity Animation + filtered_name: Escape Velocity + real: false + image: null + - id: 1374 + name: Office TakeOut + filtered_name: Office TakeOut + real: false + image: null + - id: 2919 + name: Le-joy Animation Studio + filtered_name: Le-joy Animation + real: false + image: null + - id: 2921 + name: Public Enemies + filtered_name: Public Enemies + real: false + image: null + - id: 62 + name: Shogakukan-Shueisha Productions + filtered_name: Shogakukan-Shueisha + real: false + image: /system/studios/original/62.png?1589819032 + - id: 2928 + name: Elias + filtered_name: Elias + real: false + image: null + - id: 2387 + name: Ga-Crew + filtered_name: Ga-Crew + real: false + image: null + - id: 2929 + name: Studio Outrigger + filtered_name: Outrigger + real: false + image: null + - id: 1524 + name: Geidai Animation + filtered_name: Geidai + real: false + image: null + - id: 2832 + name: VROOOOM + filtered_name: VROOOOM + real: false + image: null + - id: 2834 + name: Hero + filtered_name: Hero + real: false + image: null + - id: 2833 + name: Sofix + filtered_name: Sofix + real: false + image: null + - id: 601 + name: lxtl + filtered_name: lxtl + real: false + image: null + - id: 1796 + name: Digital Network Animation + filtered_name: Digital Network + real: false + image: null + - id: 11 + name: Madhouse + filtered_name: Madhouse + real: true + image: /system/studios/original/11.png?1457607773 + - id: 298 + name: Anima + filtered_name: Anima + real: true + image: /system/studios/original/298.gif?1311292712 + - id: 324 + name: Directions + filtered_name: Directions + real: false + image: null + - id: 1835 + name: CloverWorks + filtered_name: CloverWorks + real: false + image: /system/studios/original/1835.png?1545379956 + - id: 113 + name: Kadokawa Shoten + filtered_name: Kadokawa Shoten + real: false + image: /system/studios/original/113.png?1589290618 + - id: 1381 + name: GEMBA + filtered_name: GEMBA + real: false + image: /system/studios/original/1381.png?1589290956 + - id: 1119 + name: Shuka + filtered_name: Shuka + real: false + image: /system/studios/original/1119.png?1589290644 + - id: 1567 + name: Nut + filtered_name: Nut + real: false + image: /system/studios/original/1567.png?1589291975 + - id: 1113 + name: NBCUniversal Entertainment + filtered_name: NBCUniversal + real: false + image: /system/studios/original/1113.png?1589290662 + - id: 1155 + name: Studio Moriken + filtered_name: Moriken + real: false + image: /system/studios/original/1155.png?1589290679 + - id: 1974 + name: ENGI + filtered_name: ENGI + real: false + image: /system/studios/original/1974.png?1589291508 + - id: 1978 + name: Maho Film + filtered_name: Maho Film + real: false + image: /system/studios/original/1978.png?1589291589 + - id: 1874 + name: Arvo Animation + filtered_name: Arvo + real: false + image: /system/studios/original/1874.png?1589292077 + - id: 1560 + name: Yaoyorozu + filtered_name: Yaoyorozu + real: false + image: /system/studios/original/1560.png?1592307504 + - id: 1722 + name: Bibury Animation Studios + filtered_name: Bibury Animation + real: false + image: /system/studios/original/1722.png?1589292455 + - id: 1407 + name: Children's Playground Entertainment + filtered_name: Children's Playground + real: false + image: /system/studios/original/1407.png?1589293184 + - id: 2076 + name: Fenz + filtered_name: Fenz + real: false + image: null + - id: 407 + name: Studio 9 Maiami + filtered_name: 9 Maiami + real: false + image: null + - id: 25 + name: Milky Animation Label + filtered_name: Milky Animation Label + real: false + image: /system/studios/original/25.png?1589819105 + - id: 2055 + name: BYMENT + filtered_name: BYMENT + real: false + image: null + - id: 72 + name: Artmic + filtered_name: Artmic + real: false + image: /system/studios/original/72.png?1589819208 + - id: 76 + name: Yomiuri Telecasting Corporation + filtered_name: Yomiuri Telecasting Corporation + real: false + image: /system/studios/original/76.png?1589819266 + - id: 2046 + name: Dazzling Star + filtered_name: Dazzling Star + real: false + image: null + - id: 2047 + name: Pancake + filtered_name: Pancake + real: false + image: null + - id: 2048 + name: ASK Animation Studio + filtered_name: ASK Animation + real: false + image: null + - id: 139 + name: Nihon Ad Systems + filtered_name: Nihon Ad Systems + real: false + image: /system/studios/original/139.jpg?1311292712 + - id: 2056 + name: DRAWIZ + filtered_name: DRAWIZ + real: false + image: null + - id: 2057 + name: Toho Interactive Animation + filtered_name: Toho Interactive + real: false + image: null + - id: 2802 + name: Yudubai Animation + filtered_name: Yudubai + real: false + image: null + - id: 2061 + name: Kaca Entertainment + filtered_name: Kaca + real: false + image: null + - id: 1998 + name: Studio Signpost + filtered_name: Signpost + real: false + image: /system/studios/original/1998.png?1592731885 + - id: 1033 + name: Studio Colorido + filtered_name: Colorido + real: false + image: /system/studios/original/1033.png?1592734014 + - id: 2063 + name: Spell Bound + filtered_name: Spell Bound + real: false + image: null + - id: 1958 + name: YHKT Entertainment + filtered_name: YHKT + real: false + image: null + - id: 2065 + name: Original Force + filtered_name: Original Force + real: false + image: null + - id: 2066 + name: Congzhuo Animation + filtered_name: Congzhuo + real: false + image: null + - id: 2068 + name: Ai Si Animation Studio + filtered_name: Ai Si Animation + real: false + image: null + - id: 2848 + name: Taiko Studios + filtered_name: Taiko + real: false + image: null + - id: 1959 + name: Green Monster Team + filtered_name: Green Monster Team + real: false + image: null + - id: 2069 + name: Making Animation + filtered_name: Making + real: false + image: null + - id: 2070 + name: Wei Chuang Jiang Xin + filtered_name: Wei Chuang Jiang Xin + real: false + image: null + - id: 325 + name: Code + filtered_name: Code + real: false + image: null + - id: 312 + name: Life Work + filtered_name: Life Work + real: false + image: null + - id: 2073 + name: Painting Dream + filtered_name: Painting Dream + real: false + image: null + - id: 1111 + name: DandeLion Animation Studio + filtered_name: DandeLion Animation + real: false + image: null + - id: 249 + name: Robot Communications + filtered_name: Robot Communications + real: false + image: /system/studios/original/249.jpg?1311292714 + - id: 2064 + name: Mokai Technology + filtered_name: Mokai Technology + real: false + image: null + - id: 318 + name: WAO World + filtered_name: WAO World + real: false + image: /system/studios/original/318.jpg?1312165039 + - id: 1276 + name: HS Pictures Studio + filtered_name: HS Pictures + real: false + image: null + - id: 1764 + name: Picona + filtered_name: Picona + real: false + image: null + - id: 64 + name: Sotsu + filtered_name: Sotsu + real: false + image: /system/studios/original/64.png?1449514256 + - id: 374 + name: Plus Heads + filtered_name: Plus Heads + real: false + image: null + - id: 2051 + name: Studio Coa + filtered_name: Coa + real: false + image: null + - id: 175 + name: Planet + filtered_name: Planet + real: false + image: /system/studios/original/175.png?1311292713 + - id: 258 + name: Echo + filtered_name: Echo + real: false + image: /system/studios/original/258.gif?1311292713 + - id: 1727 + name: Tencent Penguin Pictures + filtered_name: Tencent Penguin Pictures + real: false + image: null + - id: 2082 + name: Benlai Pictures + filtered_name: Benlai Pictures + real: false + image: null + - id: 3236 + name: Ke Yue Xue Zi + filtered_name: Ke Yue Xue Zi + real: false + image: null + - id: 2085 + name: Acca effe + filtered_name: Acca effe + real: false + image: null + - id: 2086 + name: Giga Production + filtered_name: Giga + real: false + image: null + - id: 2089 + name: Wan Wei Mao Donghua + filtered_name: Wan Wei Mao Donghua + real: false + image: null + - id: 1696 + name: Kadokawa + filtered_name: Kadokawa + real: false + image: null + - id: 2114 + name: Ether Kitten + filtered_name: Ether Kitten + real: false + image: null + - id: 2115 + name: Gosay Studio + filtered_name: Gosay + real: false + image: null + - id: 2122 + name: PERIMETRON + filtered_name: PERIMETRON + real: false + image: null + - id: 2125 + name: LICO + filtered_name: LICO + real: false + image: null + - id: 2126 + name: Red Dog Culture House + filtered_name: Red Dog Culture House + real: false + image: null + - id: 2123 + name: foodunited. + filtered_name: foodunited. + real: false + image: null + - id: 2129 + name: Visual Flight + filtered_name: Visual Flight + real: false + image: null + - id: 2130 + name: Studio Shelter + filtered_name: Shelter + real: false + image: null + - id: 2133 + name: Djinn Power + filtered_name: Djinn Power + real: false + image: null + - id: 2136 + name: Ten Tails Animation + filtered_name: Ten Tails + real: false + image: null + - id: 2137 + name: 1IN + filtered_name: 1IN + real: false + image: null + - id: 1671 + name: DMM pictures + filtered_name: DMM pictures + real: false + image: null + - id: 2140 + name: Qianqi Animation + filtered_name: Qianqi + real: false + image: null + - id: 1939 + name: Alpha Animation + filtered_name: Alpha + real: false + image: null + - id: 2141 + name: TANOsim + filtered_name: TANOsim + real: false + image: null + - id: 2142 + name: LEVELS + filtered_name: LEVELS + real: false + image: null + - id: 2143 + name: LX Animation Studio + filtered_name: LX Animation + real: false + image: null + - id: 2151 + name: Ekakiya + filtered_name: Ekakiya + real: false + image: null + - id: 16 + name: TV Tokyo + filtered_name: TV Tokyo + real: false + image: /system/studios/original/16.png?1602436319 + - id: 99 + name: Kitty Films + filtered_name: Kitty Films + real: false + image: /system/studios/original/99.png?1602436341 + - id: 119 + name: Viz Media + filtered_name: Viz Media + real: false + image: /system/studios/original/119.png?1602436368 + - id: 577 + name: Tohokushinsha Film Corporation + filtered_name: Tohokushinsha Film Corporation + real: false + image: /system/studios/original/577.png?1602436391 + - id: 1451 + name: TYO + filtered_name: TYO + real: false + image: null + - id: 2158 + name: Durufix + filtered_name: Durufix + real: false + image: null + - id: 2067 + name: Flat Studio + filtered_name: Flat + real: false + image: null + - id: 2162 + name: Maxilla + filtered_name: Maxilla + real: false + image: null + - id: 2163 + name: Teatro Nishi Tokyo Studio + filtered_name: Teatro Nishi Tokyo + real: false + image: null + - id: 2161 + name: Suspenders + filtered_name: Suspenders + real: false + image: null + - id: 2164 + name: Super Brain + filtered_name: Super Brain + real: false + image: null + - id: 2171 + name: Paper Animation + filtered_name: Paper + real: false + image: null + - id: 2172 + name: Original Dream + filtered_name: Original Dream + real: false + image: null + - id: 2210 + name: Jichitai Anime + filtered_name: Jichitai Anime + real: false + image: null + - id: 2209 + name: Reiki Eyes Animation + filtered_name: Reiki Eyes + real: false + image: null + - id: 1322 + name: Creative Power Entertaining + filtered_name: Creative Power Entertaining + real: false + image: null + - id: 513 + name: Nikkatsu + filtered_name: Nikkatsu + real: false + image: null + - id: 2168 + name: Okuroto Noboru + filtered_name: Okuroto Noboru + real: false + image: null + - id: 2213 + name: Magma Studio + filtered_name: Magma + real: false + image: null + - id: 395 + name: Oz Inc. + filtered_name: Oz Inc. + real: false + image: /system/studios/original/395.jpg?1311292712 + - id: 1424 + name: Mediabank + filtered_name: Mediabank + real: false + image: null + - id: 2216 + name: CMAY Animation + filtered_name: CMAY + real: false + image: null + - id: 397 + name: Bridge + filtered_name: Bridge + real: false + image: /system/studios/original/397.png?1618089168 + - id: 2226 + name: Gambit + filtered_name: Gambit + real: false + image: null + - id: 1772 + name: Wawayu Animation + filtered_name: Wawayu + real: false + image: /system/studios/original/1772.png?1622293492 + - id: 2054 + name: MORIE Inc. + filtered_name: MORIE Inc. + real: false + image: /system/studios/original/2054.jpg?1622293375 + - id: 235 + name: Shirogumi + filtered_name: Shirogumi + real: false + image: /system/studios/original/235.png?1622293552 + - id: 134 + name: HoriPro + filtered_name: HoriPro + real: false + image: /system/studios/original/134.jpg?1312165065 + - id: 1268 + name: L²Studio + filtered_name: L²Studio + real: false + image: /system/studios/original/1268.png?1622293459 + - id: 1181 + name: RG Animation Studios + filtered_name: RG Animation + real: false + image: /system/studios/original/1181.png?1623010269 + - id: 1848 + name: Dancing CG Studio + filtered_name: Dancing CG + real: false + image: /system/studios/original/1848.jpg?1623010295 + - id: 2265 + name: ARECT + filtered_name: ARECT + real: false + image: null + - id: 517 + name: Asmik Ace + filtered_name: Asmik Ace + real: false + image: null + - id: 2179 + name: FIREBUG + filtered_name: FIREBUG + real: false + image: null + - id: 2052 + name: Wolfsbane + filtered_name: Wolfsbane + real: false + image: /system/studios/original/2052.png?1618485056 + - id: 3237 + name: Nothing New + filtered_name: Nothing New + real: false + image: null + - id: 957 + name: Connect + filtered_name: Connect + real: false + image: /system/studios/original/957.png?1618484882 + - id: 1075 + name: C-Station + filtered_name: C-Station + real: false + image: /system/studios/original/1075.png?1618484892 + - id: 1547 + name: Blade + filtered_name: Blade + real: false + image: /system/studios/original/1547.png?1618484901 + - id: 1109 + name: Orange + filtered_name: Orange + real: false + image: /system/studios/original/1109.png?1618484926 + - id: 1264 + name: EMT Squared + filtered_name: EMT Squared + real: false + image: /system/studios/original/1264.png?1618484969 + - id: 1087 + name: Lay-duce + filtered_name: Lay-duce + real: false + image: /system/studios/original/1087.png?1618484978 + - id: 2037 + name: Okuruto Noboru + filtered_name: Okuruto Noboru + real: false + image: /system/studios/original/2037.png?1618484990 + - id: 2243 + name: Quebico + filtered_name: Quebico + real: false + image: null + - id: 1984 + name: Bakken Record + filtered_name: Bakken Record + real: false + image: /system/studios/original/1984.png?1618485001 + - id: 1209 + name: Studio A-CAT + filtered_name: A-CAT + real: false + image: /system/studios/original/1209.png?1618485018 + - id: 1993 + name: Studio Bind + filtered_name: Bind + real: false + image: /system/studios/original/1993.png?1618485032 + - id: 1244 + name: Studio VOLN + filtered_name: VOLN + real: false + image: /system/studios/original/1244.png?1618485045 + - id: 3042 + name: Project Studio Q + filtered_name: Project Studio Q + real: false + image: null + - id: 2244 + name: Studio Gohan + filtered_name: Gohan + real: false + image: null + - id: 2239 + name: Transcendence Picture + filtered_name: Transcendence Picture + real: false + image: null + - id: 2097 + name: HORNETS + filtered_name: HORNETS + real: false + image: null + - id: 2247 + name: Delight Animation + filtered_name: Delight + real: false + image: null + - id: 2248 + name: Indivision + filtered_name: Indivision + real: false + image: null + - id: 2250 + name: Spooky graphic + filtered_name: Spooky graphic + real: false + image: null + - id: 2251 + name: TthunDer Animation + filtered_name: TthunDer + real: false + image: null + - id: 2252 + name: Studio Kingyoiro + filtered_name: Kingyoiro + real: false + image: null + - id: 1991 + name: Enishiya + filtered_name: Enishiya + real: false + image: /system/studios/original/1991.png?1622293434 + - id: 2266 + name: Planet Nemo Animation + filtered_name: Planet Nemo + real: false + image: null + - id: 2267 + name: MMT Technology + filtered_name: MMT Technology + real: false + image: null + - id: 2050 + name: Trash Studio + filtered_name: Trash + real: false + image: null + - id: 1573 + name: XFLAG Pictures + filtered_name: XFLAG Pictures + real: false + image: null + - id: 2270 + name: Wise Guy + filtered_name: Wise Guy + real: false + image: null + - id: 2281 + name: Rocen + filtered_name: Rocen + real: false + image: null + - id: 1465 + name: Beijing Enlight Pictures + filtered_name: Beijing Enlight Pictures + real: false + image: null + - id: 1420 + name: SIDO LIMITED + filtered_name: SIDO LIMITED + real: false + image: null + - id: 2256 + name: Kitty Film Mitaka Studio + filtered_name: Kitty Film Mitaka + real: false + image: null + - id: 1982 + name: LIDENFILMS Osaka Studio + filtered_name: LIDENFILMS Osaka + real: false + image: null + - id: 1728 + name: China Literature Limited + filtered_name: China Literature Limited + real: false + image: null + - id: 2241 + name: Dawn Animation + filtered_name: Dawn + real: false + image: null + - id: 2033 + name: FILMONY + filtered_name: FILMONY + real: false + image: /system/studios/original/2033.png?1622293447 + - id: 1350 + name: B.CMAY PICTURES + filtered_name: B.CMAY PICTURES + real: false + image: /system/studios/original/1350.png?1622293480 + - id: 2042 + name: Ruo Hong Culture + filtered_name: Ruo Hong Culture + real: false + image: /system/studios/original/2042.png?1622293522 + - id: 2249 + name: Flagship Line + filtered_name: Flagship Line + real: false + image: null + - id: 2211 + name: Lingsanwu Animation + filtered_name: Lingsanwu + real: false + image: null + - id: 2767 + name: Euluca Lab + filtered_name: Euluca Lab + real: false + image: null + - id: 1975 + name: Qubic Pictures + filtered_name: Qubic Pictures + real: false + image: /system/studios/original/1975.png?1622293576 + - id: 1807 + name: 2:10 Animation + filtered_name: '2:10' + real: false + image: /system/studios/original/1807.png?1622293331 + - id: 3044 + name: Bellnox Films + filtered_name: Bellnox Films + real: false + image: null + - id: 3240 + name: Soul Creative + filtered_name: Soul Creative + real: false + image: null + - id: 999 + name: Studio Animal + filtered_name: Animal + real: false + image: /system/studios/original/999.png?1622293600 + - id: 555 + name: Studio Chizu + filtered_name: Chizu + real: false + image: /system/studios/original/555.jpg?1623010280 + - id: 2268 + name: Point Pictures + filtered_name: Point Pictures + real: false + image: null + - id: 1441 + name: Mippei Eigeki Kiryuukan + filtered_name: Mippei Eigeki Kiryuukan + real: false + image: null + - id: 2257 + name: XEBEC M2 + filtered_name: XEBEC M2 + real: false + image: null + - id: 2282 + name: Studio Guts + filtered_name: Guts + real: false + image: null + - id: 2277 + name: Network Kouenji Studio + filtered_name: Network Kouenji + real: false + image: null + - id: 1906 + name: animate + filtered_name: animate + real: false + image: null + - id: 274 + name: Suzuki Mirano + filtered_name: Suzuki Mirano + real: false + image: /system/studios/original/274.png?1630137135 + - id: 2049 + name: BOMB! CUTE! BOMB! + filtered_name: BOMB! CUTE! BOMB! + real: false + image: /system/studios/original/2049.jpg?1630217401 + - id: 801 + name: Nihikime no Dozeu + filtered_name: Nihikime no Dozeu + real: false + image: /system/studios/original/801.png?1634761282 + - id: 2246 + name: studio MOTHER + filtered_name: MOTHER + real: false + image: /system/studios/original/2246.png?1647107739 + - id: 2288 + name: Qzil.la + filtered_name: Qzil.la + real: false + image: /system/studios/original/2288.png?1634761052 + - id: 2212 + name: Tsumugi Akita Animation Lab + filtered_name: Tsumugi Akita Animation Lab + real: false + image: /system/studios/original/2212.png?1634761138 + - id: 2167 + name: Hololive Production + filtered_name: Hololive + real: false + image: /system/studios/original/2167.png?1634761299 + - id: 417 + name: Walt Disney Studios + filtered_name: Walt Disney + real: false + image: /system/studios/original/417.png?1634762368 + - id: 2275 + name: Drawing and Manual + filtered_name: Drawing and Manual + real: false + image: /system/studios/original/2275.jpg?1634761573 + - id: 278 + name: Daiei Film Co. Ltd. + filtered_name: Daiei Film Co. Ltd. + real: false + image: /system/studios/original/278.png?1635331219 + - id: 14 + name: Sunrise + filtered_name: Sunrise + real: true + image: /system/studios/original/14.jpg?1630137154 + - id: 1827 + name: Motion Magic + filtered_name: Motion Magic + real: false + image: /system/studios/original/1827.png?1634760933 + - id: 541 + name: Seven + filtered_name: Seven + real: false + image: /system/studios/original/541.jpg?1630217381 + - id: 581 + name: Sparky Animation + filtered_name: Sparky + real: false + image: /system/studios/original/581.png?1634761084 + - id: 862 + name: Pashmina + filtered_name: Pashmina + real: false + image: /system/studios/original/862.png?1630217416 + - id: 1800 + name: Marui Group + filtered_name: Marui Group + real: false + image: /system/studios/original/1800.png?1634760961 + - id: 1721 + name: Gold Bear + filtered_name: Gold Bear + real: false + image: /system/studios/original/1721.png?1630217488 + - id: 977 + name: Queen Bee + filtered_name: Queen Bee + real: false + image: /system/studios/original/977.png?1630217509 + - id: 2295 + name: Story Effect + filtered_name: Story Effect + real: false + image: null + - id: 2296 + name: Studio Nuck + filtered_name: Nuck + real: false + image: null + - id: 2297 + name: EXNOA + filtered_name: EXNOA + real: false + image: null + - id: 2620 + name: Manhoo Culture + filtered_name: Manhoo Culture + real: false + image: null + - id: 2304 + name: TrioPen Studio + filtered_name: TrioPen + real: false + image: null + - id: 2303 + name: Noovo + filtered_name: Noovo + real: false + image: null + - id: 2302 + name: Nostalook + filtered_name: Nostalook + real: false + image: null + - id: 2300 + name: Studio Jemi + filtered_name: Jemi + real: false + image: null + - id: 2306 + name: LIDENFILMS Kyoto Studio + filtered_name: LIDENFILMS Kyoto + real: false + image: null + - id: 2301 + name: Borutong + filtered_name: Borutong + real: false + image: null + - id: 2305 + name: Fukushima Gaina + filtered_name: Fukushima Gaina + real: false + image: null + - id: 2310 + name: Paper Plane Animation Studio + filtered_name: Paper Plane Animation + real: false + image: null + - id: 2311 + name: Gyorai Eizo Inc. + filtered_name: Gyorai Eizo Inc. + real: false + image: null + - id: 2313 + name: studio hb + filtered_name: hb + real: false + image: null + - id: 2314 + name: Quad + filtered_name: Quad + real: false + image: null + - id: 2269 + name: New Generation + filtered_name: New Generation + real: false + image: null + - id: 2318 + name: ORADA COMPANY + filtered_name: ORADA COMPANY + real: false + image: null + - id: 2316 + name: Maboroshi Koubou + filtered_name: Maboroshi Koubou + real: false + image: null + - id: 2325 + name: Bibury Animation CG + filtered_name: Bibury Animation CG + real: false + image: null + - id: 2315 + name: Office No. 8 + filtered_name: Office No. 8 + real: false + image: null + - id: 2322 + name: Mousou Senka + filtered_name: Mousou Senka + real: false + image: null + - id: 2317 + name: Dream Entertainment + filtered_name: Dream + real: false + image: null + - id: 220 + name: Youmex + filtered_name: Youmex + real: false + image: /system/studios/original/220.png?1634761102 + - id: 1299 + name: AXsiZ + filtered_name: AXsiZ + real: false + image: /system/studios/original/1299.png?1634760861 + - id: 1903 + name: IMAGICA Lab. + filtered_name: IMAGICA Lab. + real: false + image: /system/studios/original/1903.png?1634761124 + - id: 2059 + name: Suoyi Technology + filtered_name: Suoyi Technology + real: false + image: /system/studios/original/2059.png?1634761315 + - id: 1673 + name: DMM.futureworks + filtered_name: DMM.futureworks + real: false + image: /system/studios/original/1673.jpg?1634760979 + - id: 2812 + name: Zuiyo + filtered_name: Zuiyo + real: false + image: null + - id: 2184 + name: The Monk Studios + filtered_name: The Monk + real: false + image: /system/studios/original/2184.png?1634761155 + - id: 2071 + name: AQUA ARIS + filtered_name: AQUA ARIS + real: false + image: /system/studios/original/2071.png?1634760993 + - id: 154 + name: E&G Films + filtered_name: E&G Films + real: false + image: /system/studios/original/154.jpg?1634761173 + - id: 945 + name: Vasoon Animation + filtered_name: Vasoon + real: false + image: /system/studios/original/945.png?1634761013 + - id: 2309 + name: Kamitsubaki Studio + filtered_name: Kamitsubaki + real: false + image: /system/studios/original/2309.jpg?1634761753 + - id: 400 + name: Gathering + filtered_name: Gathering + real: true + image: /system/studios/original/400.png?1634761199 + - id: 1185 + name: 81 Produce + filtered_name: 81 Produce + real: false + image: /system/studios/original/1185.png?1634761215 + - id: 1995 + name: Live2D Creative Studio + filtered_name: Live2D Creative + real: false + image: /system/studios/original/1995.png?1634761229 + - id: 1197 + name: Steve N' Steven + filtered_name: Steve N' Steven + real: false + image: /system/studios/original/1197.jpg?1634761250 + - id: 270 + name: NuTech Digital + filtered_name: NuTech Digital + real: false + image: /system/studios/original/270.jpg?1634761330 + - id: 1011 + name: Warner Music Japan + filtered_name: Warner Music Japan + real: false + image: /system/studios/original/1011.png?1634761591 + - id: 2284 + name: SJYNEXCUS + filtered_name: SJYNEXCUS + real: false + image: /system/studios/original/2284.png?1634761347 + - id: 866 + name: Fanworks + filtered_name: Fanworks + real: false + image: /system/studios/original/866.jpg?1634761417 + - id: 1169 + name: ILCA + filtered_name: ILCA + real: false + image: /system/studios/original/1169.png?1634761433 + - id: 896 + name: Larx Entertainment + filtered_name: Larx + real: false + image: /system/studios/original/896.png?1634761446 + - id: 3163 + name: Woodpecker + filtered_name: Woodpecker + real: false + image: null + - id: 94 + name: Telecom Animation Film + filtered_name: Telecom Animation Film + real: false + image: /system/studios/original/94.png?1663058478 + - id: 1265 + name: Tomovies + filtered_name: Tomovies + real: false + image: /system/studios/original/1265.jpg?1634761476 + - id: 1650 + name: Twilight Studio + filtered_name: Twilight + real: false + image: /system/studios/original/1650.png?1634761512 + - id: 2014 + name: Nur + filtered_name: Nur + real: false + image: /system/studios/original/2014.png?1634761693 + - id: 1099 + name: Cyclone Graphics + filtered_name: Cyclone Graphics + real: false + image: /system/studios/original/1099.png?1634761541 + - id: 3320 + name: ZG-R + filtered_name: ZG-R + real: false + image: null + - id: 1003 + name: Nippon Television Network Corporation + filtered_name: Nippon Television Network Corporation + real: false + image: /system/studios/original/1003.png?1634761606 + - id: 33 + name: WOWOW + filtered_name: WOWOW + real: false + image: /system/studios/original/33.png?1634823411 + - id: 288 + name: Kaname Productions + filtered_name: Kaname + real: false + image: /system/studios/original/288.jpg?1634761629 + - id: 2597 + name: Wong Ping Animation Lab + filtered_name: Wong Ping Animation Lab + real: false + image: null + - id: 2596 + name: Comma Studio + filtered_name: Comma + real: false + image: null + - id: 2411 + name: Studio Massket + filtered_name: Massket + real: false + image: null + - id: 2561 + name: OTOIRO + filtered_name: OTOIRO + real: false + image: null + - id: 2528 + name: Passion Paint Animation + filtered_name: Passion Paint + real: false + image: null + - id: 2600 + name: Cloud Hearts + filtered_name: Cloud Hearts + real: false + image: null + - id: 2593 + name: Angle + filtered_name: Angle + real: false + image: null + - id: 1776 + name: Studio Mir + filtered_name: Mir + real: false + image: null + - id: 1352 + name: Studio Ten Carat + filtered_name: Ten Carat + real: false + image: null + - id: 2327 + name: Studio Boogie Nights + filtered_name: Boogie Nights + real: false + image: null + - id: 199 + name: Studio Nue + filtered_name: Nue + real: true + image: /system/studios/original/199.png?1634761645 + - id: 1517 + name: Jinnan Studio + filtered_name: Jinnan + real: false + image: null + - id: 1426 + name: Studio Meditation With a Pencil + filtered_name: Meditation With a Pencil + real: false + image: /system/studios/original/1426.jpg?1634761662 + - id: 239 + name: Y.O.U.C + filtered_name: Y.O.U.C + real: false + image: /system/studios/original/239.png?1634761676 + - id: 2009 + name: Yostar Pictures + filtered_name: Yostar Pictures + real: false + image: /system/studios/original/2009.png?1636032300 + - id: 679 + name: Soyuzmultfilm + filtered_name: Soyuzmultfilm + real: false + image: null + - id: 1876 + name: CLAP + filtered_name: CLAP + real: false + image: /system/studios/original/1876.png?1634761725 + - id: 587 + name: Tomason + filtered_name: Tomason + real: false + image: /system/studios/original/587.jpg?1636032314 + - id: 2091 + name: Xanthus Media + filtered_name: Xanthus Media + real: false + image: /system/studios/original/2091.png?1634761739 + - id: 2326 + name: OLM Team Yoshioka + filtered_name: OLM Team Yoshioka + real: false + image: null + - id: 31 + name: Geneon Universal Entertainment + filtered_name: Geneon Universal + real: false + image: /system/studios/original/31.png?1634823431 + - id: 1340 + name: Typhoon Graphics + filtered_name: Typhoon Graphics + real: false + image: /system/studios/original/1340.png?1634823445 + - id: 2320 + name: Inugoya + filtered_name: Inugoya + real: false + image: null + - id: 2323 + name: Cafe de Jeilhouse + filtered_name: Cafe de Jeilhouse + real: false + image: null + - id: 53 + name: Dentsu Inc. + filtered_name: Dentsu Inc. + real: false + image: /system/studios/original/53.png?1636032323 + - id: 2341 + name: Studio Prokion + filtered_name: Prokion + real: false + image: null + - id: 207 + name: Magic Bus + filtered_name: Magic Bus + real: true + image: /system/studios/original/207.png?1635367859 + - id: 2321 + name: Production D.M.H + filtered_name: Production D.M.H + real: false + image: null + - id: 2319 + name: Datama Film + filtered_name: Datama Film + real: false + image: null + - id: 2328 + name: Sonsan Kikaku + filtered_name: Sonsan Kikaku + real: false + image: null + - id: 2340 + name: Cutie Bee + filtered_name: Cutie Bee + real: false + image: null + - id: 2337 + name: Studio Soul + filtered_name: Soul + real: false + image: null + - id: 2339 + name: Melissa + filtered_name: Melissa + real: false + image: null + - id: 2329 + name: Shinjukuza + filtered_name: Shinjukuza + real: false + image: null + - id: 2330 + name: Meltdown + filtered_name: Meltdown + real: false + image: null + - id: 2336 + name: Lead + filtered_name: Lead + real: false + image: null + - id: 2335 + name: Shindeban Film + filtered_name: Shindeban Film + real: false + image: null + - id: 2331 + name: Shura + filtered_name: Shura + real: false + image: null + - id: 2338 + name: Studio Ten + filtered_name: Ten + real: false + image: null + - id: 2355 + name: Alfred Imageworks + filtered_name: Alfred Imageworks + real: false + image: null + - id: 2342 + name: PP Project + filtered_name: PP Project + real: false + image: null + - id: 2356 + name: Kung Fu Frog Animation + filtered_name: Kung Fu Frog + real: false + image: null + - id: 2332 + name: Shion + filtered_name: Shion + real: false + image: null + - id: 2366 + name: Kigumi + filtered_name: Kigumi + real: false + image: null + - id: 2370 + name: Hayabusa Film + filtered_name: Hayabusa Film + real: false + image: null + - id: 2371 + name: Planet Cartoon + filtered_name: Planet Cartoon + real: false + image: null + - id: 2372 + name: Flint Sugar + filtered_name: Flint Sugar + real: false + image: null + - id: 2361 + name: Okumaza + filtered_name: Okumaza + real: false + image: null + - id: 2353 + name: P core + filtered_name: P core + real: false + image: null + - id: 2358 + name: Big Wing + filtered_name: Big Wing + real: false + image: null + - id: 2349 + name: Potato House + filtered_name: Potato House + real: false + image: null + - id: 2350 + name: Kantou Douga Kai + filtered_name: Kantou Douga Kai + real: false + image: null + - id: 2359 + name: Aiko + filtered_name: Aiko + real: false + image: null + - id: 2334 + name: Mouse + filtered_name: Mouse + real: false + image: null + - id: 2363 + name: JOF + filtered_name: JOF + real: false + image: null + - id: 2352 + name: Tryforce + filtered_name: Tryforce + real: false + image: null + - id: 2364 + name: Hanjin Animation + filtered_name: Hanjin + real: false + image: null + - id: 2379 + name: Scooter Films + filtered_name: Scooter Films + real: false + image: null + - id: 2611 + name: Fantawild Animation + filtered_name: Fantawild + real: false + image: null + - id: 2554 + name: Gekkou + filtered_name: Gekkou + real: false + image: null + - id: 2613 + name: Aurora Animation + filtered_name: Aurora + real: false + image: null + - id: 2595 + name: TypeZero + filtered_name: TypeZero + real: false + image: null + - id: 2472 + name: High Energy Studio + filtered_name: High Energy + real: false + image: null + - id: 2614 + name: Chongzhuo Animation + filtered_name: Chongzhuo + real: false + image: null + - id: 1414 + name: bilibili + filtered_name: bilibili + real: false + image: null + - id: 1831 + name: Colored Pencil Animation Japan + filtered_name: Colored Pencil Animation Japan + real: false + image: null + - id: 2478 + name: Oriental Creative Color + filtered_name: Oriental Creative Color + real: false + image: null + - id: 2396 + name: Joicy Studio + filtered_name: Joicy + real: false + image: null + - id: 3045 + name: Bones Film + filtered_name: Bones Film + real: false + image: null + - id: 2636 + name: Qingxiang Culture + filtered_name: Qingxiang Culture + real: false + image: null + - id: 1793 + name: Happy Elements + filtered_name: Happy Elements + real: false + image: null + - id: 2642 + name: E&H Production + filtered_name: E&H + real: false + image: null + - id: 2399 + name: Eshoya Honpo + filtered_name: Eshoya Honpo + real: false + image: null + - id: 1684 + name: THINKR + filtered_name: THINKR + real: false + image: null + - id: 1940 + name: Da Huoniao Donghua + filtered_name: Da Huoniao Donghua + real: false + image: null + - id: 2521 + name: Qiyuan Yinghua + filtered_name: Qiyuan Yinghua + real: false + image: null + - id: 377 + name: Kuri Jikken Manga Koubou + filtered_name: Kuri Jikken Manga Koubou + real: false + image: null + - id: 2646 + name: trenova + filtered_name: trenova + real: false + image: null + - id: 2649 + name: LB Commerce + filtered_name: LB Commerce + real: false + image: null + - id: 2648 + name: Au Praxinoscope + filtered_name: Au Praxinoscope + real: false + image: null + - id: 2652 + name: Gravity Well + filtered_name: Gravity Well + real: false + image: null + - id: 2651 + name: Stereotype + filtered_name: Stereotype + real: false + image: null + - id: 2658 + name: flag Co. + filtered_name: flag Co. + real: false + image: null + - id: 2656 + name: UchuPeople + filtered_name: UchuPeople + real: false + image: null + - id: 2661 + name: Kinematics + filtered_name: Kinematics + real: false + image: null + - id: 1857 + name: Geek Toys + filtered_name: Geek Toys + real: false + image: /system/studios/original/1857.png?1589291362 + - id: 2258 + name: Sharefun Studio + filtered_name: Sharefun + real: false + image: null + - id: 2294 + name: AHA Entertainment + filtered_name: AHA + real: false + image: null + - id: 2667 + name: Keyring + filtered_name: Keyring + real: false + image: null + - id: 2660 + name: UKA + filtered_name: UKA + real: false + image: null + - id: 2674 + name: BUG FILMS + filtered_name: BUG FILMS + real: false + image: null + - id: 2647 + name: Studio A. Craft + filtered_name: A. Craft + real: false + image: null + - id: 2604 + name: DC Impression Vision + filtered_name: DC Impression Vision + real: false + image: null + - id: 2688 + name: Saber Project + filtered_name: Saber Project + real: false + image: null + - id: 2676 + name: Pmats9 studio + filtered_name: Pmats9 + real: false + image: null + - id: 2394 + name: MoMo Production + filtered_name: MoMo + real: false + image: null + - id: 2351 + name: Studio Gadget + filtered_name: Gadget + real: false + image: null + - id: 2601 + name: Sunflowers + filtered_name: Sunflowers + real: false + image: null + - id: 2509 + name: Colored Pencil Animation + filtered_name: Colored Pencil + real: false + image: null + - id: 2693 + name: 6pucks + filtered_name: 6pucks + real: false + image: null + - id: 2695 + name: SIGNIF + filtered_name: SIGNIF + real: false + image: null + - id: 2463 + name: Cloud Art + filtered_name: Cloud Art + real: false + image: null + - id: 478 + name: Studio Blanc. + filtered_name: Blanc. + real: false + image: null + - id: 1980 + name: Big Firebird Culture + filtered_name: Big Firebird Culture + real: false + image: null + - id: 2679 + name: cogitoworks + filtered_name: cogitoworks + real: false + image: null + - id: 2694 + name: studio NAGURI + filtered_name: NAGURI + real: false + image: null + - id: 2424 + name: Bandai Namco Filmworks + filtered_name: Bandai Namco Filmworks + real: false + image: null + - id: 2692 + name: Ice Butter + filtered_name: Ice Butter + real: false + image: null + - id: 2682 + name: Steamworks + filtered_name: Steamworks + real: false + image: null + - id: 2678 + name: Slow Studio + filtered_name: Slow + real: false + image: null + - id: 2449 + name: Atorie A.B.C. + filtered_name: Atorie A.B.C. + real: false + image: null + - id: 2559 + name: Guo Pengzi Studio + filtered_name: Guo Pengzi + real: false + image: null + - id: 2644 + name: Kuai Ying Hu Yu + filtered_name: Kuai Ying Hu Yu + real: false + image: null + - id: 2419 + name: d00r works + filtered_name: d00r works + real: false + image: null + - id: 2686 + name: EDP graphic works + filtered_name: EDP graphic works + real: false + image: null + - id: 2474 + name: Haneda xR Studio + filtered_name: Haneda xR + real: false + image: null + - id: 2669 + name: THINGS. + filtered_name: THINGS. + real: false + image: null + - id: 2698 + name: Voil + filtered_name: Voil + real: false + image: null + - id: 2673 + name: Goto Inc. + filtered_name: Goto Inc. + real: false + image: null + - id: 2563 + name: Studio Tumble + filtered_name: Tumble + real: false + image: null + - id: 2484 + name: Gunners + filtered_name: Gunners + real: false + image: null + - id: 2564 + name: Yamiken + filtered_name: Yamiken + real: false + image: null + - id: 2392 + name: Ishibashi Planning + filtered_name: Ishibashi Planning + real: false + image: null + - id: 2551 + name: Animation 501 + filtered_name: '501' + real: false + image: null + - id: 2457 + name: Studio Ranmaru + filtered_name: Ranmaru + real: false + image: null + - id: 2626 + name: Studio D-Volt + filtered_name: D-Volt + real: false + image: null + - id: 1248 + name: Mirai Fusion + filtered_name: Mirai Fusion + real: false + image: null + - id: 2492 + name: Studio Jin + filtered_name: Jin + real: false + image: null + - id: 2623 + name: Dyna Method + filtered_name: Dyna Method + real: false + image: null + - id: 2514 + name: AIC Project + filtered_name: AIC Project + real: false + image: null + - id: 2558 + name: Delpic + filtered_name: Delpic + real: false + image: null + - id: 2406 + name: Eallin + filtered_name: Eallin + real: false + image: null + - id: 2562 + name: Studio Himalaya + filtered_name: Himalaya + real: false + image: null + - id: 2572 + name: Adonero + filtered_name: Adonero + real: false + image: null + - id: 2677 + name: Central Animation Studio + filtered_name: Central Animation + real: false + image: null + - id: 2560 + name: Nekonigashi Inc. + filtered_name: Nekonigashi Inc. + real: false + image: null + - id: 2469 + name: HM Heros + filtered_name: HM Heros + real: false + image: null + - id: 2622 + name: Makaria + filtered_name: Makaria + real: false + image: null + - id: 2274 + name: Qiying Animation + filtered_name: Qiying + real: false + image: null + - id: 1443 + name: Overlap + filtered_name: Overlap + real: false + image: null + - id: 2569 + name: Yinhe Changxing Culture + filtered_name: Yinhe Changxing Culture + real: false + image: null + - id: 2598 + name: Bigcat Studio + filtered_name: Bigcat + real: false + image: null + - id: 2605 + name: Tonari Animation + filtered_name: Tonari + real: false + image: null + - id: 2619 + name: Quyue Technology + filtered_name: Quyue Technology + real: false + image: null + - id: 2705 + name: TOHO animation STUDIO + filtered_name: TOHO animation + real: false + image: null + - id: 2706 + name: Hananona Studio + filtered_name: Hananona + real: false + image: null + - id: 1295 + name: PINE JAM + filtered_name: PINE JAM + real: false + image: /system/studios/original/1295.png?1589291852 + - id: 2333 + name: Space-X + filtered_name: Space-X + real: false + image: null + - id: 2715 + name: Hand to Mouse. + filtered_name: Hand to Mouse. + real: false + image: null + - id: 2391 + name: Sumomo Film + filtered_name: Sumomo Film + real: false + image: null + - id: 2711 + name: Miyu Productions + filtered_name: Miyu + real: false + image: null + - id: 2553 + name: Garyuu Studio + filtered_name: Garyuu + real: false + image: null + - id: 2736 + name: Gone-zo + filtered_name: Gone-zo + real: false + image: null + - id: 2625 + name: Square Pictures + filtered_name: Square Pictures + real: false + image: null + - id: 2853 + name: ASTROBROS. + filtered_name: ASTROBROS. + real: false + image: null + - id: 2459 + name: Studio Gazelle + filtered_name: Gazelle + real: false + image: null + - id: 2450 + name: C and R + filtered_name: C and R + real: false + image: null + - id: 2410 + name: Gonzino + filtered_name: Gonzino + real: false + image: null + - id: 1678 + name: Yuhodo + filtered_name: Yuhodo + real: false + image: null + - id: 2488 + name: J.K.I + filtered_name: J.K.I + real: false + image: null + - id: 2576 + name: General Entertainment + filtered_name: General + real: false + image: null + - id: 2494 + name: Enzo Animation + filtered_name: Enzo + real: false + image: null + - id: 2487 + name: Kyushu Network Animation + filtered_name: Kyushu Network + real: false + image: null + - id: 2574 + name: Circus Production + filtered_name: Circus + real: false + image: null + - id: 2421 + name: M&M + filtered_name: M&M + real: false + image: null + - id: 2452 + name: Project Team Muu + filtered_name: Project Team Muu + real: false + image: null + - id: 2665 + name: AMGA + filtered_name: AMGA + real: false + image: null + - id: 2346 + name: Alice Production + filtered_name: Alice + real: false + image: null + - id: 2345 + name: Onion Studio + filtered_name: Onion + real: false + image: null + - id: 2360 + name: Amarcord + filtered_name: Amarcord + real: false + image: null + - id: 2388 + name: Ai Yume Mai + filtered_name: Ai Yume Mai + real: false + image: null + - id: 2451 + name: TEC + filtered_name: TEC + real: false + image: null + - id: 2552 + name: C&S Production + filtered_name: C&S + real: false + image: null + - id: 2461 + name: Twenty First + filtered_name: Twenty First + real: false + image: null + - id: 2486 + name: Blue Note + filtered_name: Blue Note + real: false + image: null + - id: 2858 + name: Makino Production + filtered_name: Makino + real: false + image: null + - id: 2859 + name: 924 Studio + filtered_name: '924' + real: false + image: null + - id: 2864 + name: Windy Studio + filtered_name: Windy + real: false + image: null + - id: 2863 + name: Miota + filtered_name: Miota + real: false + image: null + - id: 2144 + name: BloomZ + filtered_name: BloomZ + real: false + image: null + - id: 2844 + name: Imagica Infos + filtered_name: Imagica Infos + real: false + image: null + - id: 2570 + name: Ijigen Tokyo + filtered_name: Ijigen Tokyo + real: false + image: null + - id: 34 + name: HAL Film Maker + filtered_name: HAL Film Maker + real: true + image: /system/studios/original/34.png?1311292711 + - id: 2870 + name: Alke + filtered_name: Alke + real: false + image: null + - id: 2666 + name: EOEO System + filtered_name: EOEO System + real: false + image: null + - id: 2365 + name: MI + filtered_name: MI + real: false + image: null + - id: 2855 + name: Studio Moe + filtered_name: Moe + real: false + image: null + - id: 2857 + name: CELAVIE + filtered_name: CELAVIE + real: false + image: null + - id: 2460 + name: aNCHOR + filtered_name: aNCHOR + real: false + image: null + - id: 2276 + name: Project Team Sarah + filtered_name: Project Team Sarah + real: false + image: null + - id: 2544 + name: Kami Kukan + filtered_name: Kami Kukan + real: false + image: null + - id: 336 + name: JM Animation + filtered_name: JM + real: false + image: /system/studios/original/336.gif?1311292709 + - id: 2714 + name: evg + filtered_name: evg + real: false + image: null + - id: 2728 + name: New Deer + filtered_name: New Deer + real: false + image: null + - id: 2729 + name: CANON RECORDINGS + filtered_name: CANON RECORDINGS + real: false + image: null + - id: 2233 + name: Starry Cube + filtered_name: Starry Cube + real: false + image: null + - id: 2645 + name: Liyu Culture + filtered_name: Liyu Culture + real: false + image: null + - id: 2058 + name: Shengying Animation + filtered_name: Shengying + real: false + image: null + - id: 2748 + name: Sankaku + filtered_name: Sankaku + real: false + image: null + - id: 2749 + name: Anime Tokyo + filtered_name: Anime Tokyo + real: false + image: null + - id: 2750 + name: Hu Po Donghua + filtered_name: Hu Po Donghua + real: false + image: null + - id: 2684 + name: CHOCOLATE + filtered_name: CHOCOLATE + real: false + image: null + - id: 2703 + name: Oyster + filtered_name: Oyster + real: false + image: null + - id: 2744 + name: Hong Ying Animation + filtered_name: Hong Ying + real: false + image: null + - id: 2746 + name: Studio Vandal + filtered_name: Vandal + real: false + image: null + - id: 2702 + name: HuaDream + filtered_name: HuaDream + real: false + image: null + - id: 2743 + name: Shengguang Knight Culture + filtered_name: Shengguang Knight Culture + real: false + image: null + - id: 2755 + name: Congrong Film + filtered_name: Congrong Film + real: false + image: null + - id: 2760 + name: Studio Add + filtered_name: Add + real: false + image: null + - id: 2757 + name: Caviar + filtered_name: Caviar + real: false + image: null + - id: 2657 + name: NANON CREATIVE + filtered_name: NANON CREATIVE + real: false + image: null + - id: 2754 + name: Contrail + filtered_name: Contrail + real: false + image: null + - id: 2513 + name: HMCH + filtered_name: HMCH + real: false + image: null + - id: 2761 + name: ARCUS + filtered_name: ARCUS + real: false + image: null + - id: 2764 + name: Studio HUIT + filtered_name: HUIT + real: false + image: null + - id: 2447 + name: Youku + filtered_name: Youku + real: false + image: null + - id: 2762 + name: Studio Matomo + filtered_name: Matomo + real: false + image: null + - id: 2772 + name: Misogo Animation Studio + filtered_name: Misogo Animation + real: false + image: null + - id: 2773 + name: Transistor Studio + filtered_name: Transistor + real: false + image: null + - id: 2774 + name: Shadow Steps + filtered_name: Shadow Steps + real: false + image: null + - id: 2628 + name: Xiaoming Taiji + filtered_name: Xiaoming Taiji + real: false + image: null + - id: 2778 + name: Sasayuri + filtered_name: Sasayuri + real: false + image: null + - id: 2780 + name: Studio Artegg + filtered_name: Artegg + real: false + image: null + - id: 2781 + name: Cloud Culture + filtered_name: Cloud Culture + real: false + image: null + - id: 2783 + name: ANYZAC + filtered_name: ANYZAC + real: false + image: null + - id: 2785 + name: Shikachan Studio + filtered_name: Shikachan + real: false + image: null + - id: 2787 + name: Studio Lemon + filtered_name: Lemon + real: false + image: null + - id: 2784 + name: Medo + filtered_name: Medo + real: false + image: null + - id: 2790 + name: Hezmon Animation + filtered_name: Hezmon + real: false + image: null + - id: 2794 + name: BUDDHA INC. + filtered_name: BUDDHA INC. + real: false + image: null + - id: 2512 + name: Studio Easter + filtered_name: Easter + real: false + image: null + - id: 2606 + name: Toyo Links Corporation + filtered_name: Toyo Links Corporation + real: false + image: null + - id: 2725 + name: CompTown + filtered_name: CompTown + real: false + image: null + - id: 2795 + name: Xing Xing Donghua + filtered_name: Xing Xing Donghua + real: false + image: null + - id: 2765 + name: Bebow + filtered_name: Bebow + real: false + image: null + - id: 2775 + name: Production Wave + filtered_name: Production Wave + real: false + image: null + - id: 2624 + name: Village Studio + filtered_name: Village + real: false + image: null + - id: 2807 + name: ABJ COMPANY + filtered_name: ABJ COMPANY + real: false + image: null + - id: 2420 + name: Tang Kirin Culture + filtered_name: Tang Kirin Culture + real: false + image: null + - id: 2810 + name: Studio Yona + filtered_name: Yona + real: false + image: null + - id: 1379 + name: Zero-G + filtered_name: Zero-G + real: true + image: /system/studios/original/1379.png?1521916962 + - id: 2933 + name: Hutoon Animation + filtered_name: Hutoon + real: false + image: null + - id: 2934 + name: studio2 Animation Lab + filtered_name: studio2 Animation Lab + real: false + image: null + - id: 2663 + name: Rock'n Roll Mountain + filtered_name: Rock'n Roll Mountain + real: false + image: null + - id: 2939 + name: Studio Gale + filtered_name: Gale + real: false + image: null + - id: 2813 + name: Iconix Entertainment + filtered_name: Iconix + real: false + image: null + - id: 2779 + name: Studio BAZOOKA + filtered_name: BAZOOKA + real: false + image: null + - id: 2940 + name: Ocon Studio + filtered_name: Ocon + real: false + image: null + - id: 2945 + name: Studio Goindol + filtered_name: Goindol + real: false + image: null + - id: 2944 + name: Brick Studio + filtered_name: Brick + real: false + image: null + - id: 2951 + name: Pierrot Films + filtered_name: Pierrot Films + real: false + image: null + - id: 2880 + name: ORCEN + filtered_name: ORCEN + real: false + image: null + - id: 2713 + name: Infinity Animations + filtered_name: Infinity Animations + real: false + image: null + - id: 2950 + name: studio ALBLE + filtered_name: ALBLE + real: false + image: null + - id: 2957 + name: Particlefield + filtered_name: Particlefield + real: false + image: null + - id: 2953 + name: Flying Monkeys Production + filtered_name: Flying Monkeys + real: false + image: null + - id: 2954 + name: Studio Button + filtered_name: Button + real: false + image: null + - id: 2949 + name: Oriental Creative Color + filtered_name: Oriental Creative Color + real: false + image: null + - id: 3052 + name: Studio KeepFire + filtered_name: KeepFire + real: false + image: null + - id: 1667 + name: Foch Film + filtered_name: Foch Film + real: false + image: /system/studios/original/1667.png?1622293472 + - id: 3046 + name: Tsumupapa + filtered_name: Tsumupapa + real: false + image: null + - id: 433 + name: Viewworks + filtered_name: Viewworks + real: false + image: /system/studios/original/433.png?1311292712 + - id: 3033 + name: Studio Barcelona + filtered_name: Barcelona + real: false + image: null + - id: 2617 + name: Tianshi Wenhua + filtered_name: Tianshi Wenhua + real: false + image: null + - id: 2573 + name: Watanabe Promotion + filtered_name: Watanabe Promotion + real: false + image: null + - id: 3048 + name: Kachigarasu + filtered_name: Kachigarasu + real: false + image: null + - id: 3050 + name: Crew-Cell + filtered_name: Crew-Cell + real: false + image: null + - id: 3049 + name: STUDIO 8 DOGS + filtered_name: 8 DOGS + real: false + image: null + - id: 2804 + name: Seoul Movie + filtered_name: Seoul Movie + real: false + image: null + - id: 2752 + name: Youliao Studio + filtered_name: Youliao + real: false + image: null + - id: 2298 + name: Atelier Pontdarc + filtered_name: Atelier Pontdarc + real: false + image: /system/studios/original/2298.png?1695122030 + - id: 1930 + name: Zelico Film + filtered_name: Zelico Film + real: false + image: null + - id: 3022 + name: Panda Tower Studio + filtered_name: Panda Tower + real: false + image: null + - id: 3060 + name: WonderLand + filtered_name: WonderLand + real: false + image: null + - id: 3061 + name: AOI Pro. + filtered_name: AOI Pro. + real: false + image: null + - id: 2850 + name: SAFEHOUSE + filtered_name: SAFEHOUSE + real: false + image: null + - id: 2170 + name: Alpha Group + filtered_name: Alpha Group + real: false + image: null + - id: 2641 + name: Locus Corporation + filtered_name: Locus Corporation + real: false + image: null + - id: 3066 + name: Aeonium + filtered_name: Aeonium + real: false + image: null + - id: 3070 + name: Studio Clutch + filtered_name: Clutch + real: false + image: null + - id: 3071 + name: Shuiniu Dongman + filtered_name: Shuiniu Dongman + real: false + image: null + - id: 3079 + name: LinQ + filtered_name: LinQ + real: false + image: null + - id: 3078 + name: Studio LEO + filtered_name: LEO + real: false + image: null + - id: 3082 + name: teevee graphics + filtered_name: teevee graphics + real: false + image: null + - id: 3083 + name: Nagomi + filtered_name: Nagomi + real: false + image: null + - id: 3091 + name: KaKa Technology Studio + filtered_name: KaKa Technology + real: false + image: null + - id: 3085 + name: I&A + filtered_name: I&A + real: false + image: null + - id: 3074 + name: Kumarba + filtered_name: Kumarba + real: false + image: null + - id: 3089 + name: StealthWorks + filtered_name: StealthWorks + real: false + image: null + - id: 3086 + name: ILCASHIPS + filtered_name: ILCASHIPS + real: false + image: null + - id: 3090 + name: MAINCONCEPT + filtered_name: MAINCONCEPT + real: false + image: null + - id: 3097 + name: Maru Animation + filtered_name: Maru + real: false + image: null + - id: 3099 + name: sugarsaltpepper + filtered_name: sugarsaltpepper + real: false + image: null + - id: 2175 + name: GARDEN Culture + filtered_name: GARDEN Culture + real: false + image: null + - id: 3055 + name: Animation Studio Wagumi + filtered_name: Studio Wagumi + real: false + image: null + - id: 3076 + name: No Side + filtered_name: No Side + real: false + image: null + - id: 3077 + name: Axis + filtered_name: Axis + real: false + image: null + - id: 1881 + name: Friendly Land + filtered_name: Friendly Land + real: false + image: null + - id: 3081 + name: Fortes + filtered_name: Fortes + real: false + image: null + - id: 2202 + name: Front Wing + filtered_name: Front Wing + real: false + image: null + - id: 3111 + name: Raiose + filtered_name: Raiose + real: false + image: null + - id: 2742 + name: Studio N + filtered_name: N + real: false + image: null + - id: 2972 + name: Cocktail Media + filtered_name: Cocktail Media + real: false + image: null + - id: 2969 + name: Mainichi Eigasha + filtered_name: Mainichi Eigasha + real: false + image: null + - id: 2970 + name: 717 Animation Studio + filtered_name: 717 Animation + real: false + image: null + - id: 2824 + name: Production HASU + filtered_name: Production HASU + real: false + image: null + - id: 2967 + name: Digital Dream Studios + filtered_name: Digital Dream + real: false + image: null + - id: 2726 + name: Laftel + filtered_name: Laftel + real: false + image: null + - id: 2977 + name: BlueArc Animation Studios + filtered_name: BlueArc Animation + real: false + image: null + - id: 2737 + name: Painted Blade Studio + filtered_name: Painted Blade + real: false + image: null + - id: 2948 + name: Nippon TV Douga + filtered_name: Nippon TV Douga + real: false + image: null + - id: 2936 + name: G&G Direction + filtered_name: G&G Direction + real: false + image: null + - id: 2982 + name: Ginga Teikoku + filtered_name: Ginga Teikoku + real: false + image: null + - id: 2947 + name: Tokyo TV Douga + filtered_name: Tokyo TV Douga + real: false + image: null + - id: 2983 + name: Imageworks Studio + filtered_name: Imageworks + real: false + image: null + - id: 2985 + name: Saber Works + filtered_name: Saber Works + real: false + image: null + - id: 1759 + name: Lyrics + filtered_name: Lyrics + real: false + image: null + - id: 2931 + name: Buyuu + filtered_name: Buyuu + real: false + image: null + - id: 2955 + name: Sunny Gapen + filtered_name: Sunny Gapen + real: false + image: null + - id: 2988 + name: Shadow Pond Studio + filtered_name: Shadow Pond + real: false + image: null + - id: 2987 + name: Outline + filtered_name: Outline + real: false + image: null + - id: 2986 + name: Sugata Creative & Design + filtered_name: Sugata Creative & Design + real: false + image: null + - id: 2991 + name: Skydance Animation + filtered_name: Skydance + real: false + image: null + - id: 2990 + name: Higashinaka Studio + filtered_name: Higashinaka + real: false + image: null + - id: 2989 + name: LIGHTAIR Inc. + filtered_name: LIGHTAIR Inc. + real: false + image: null + - id: 2992 + name: R11R + filtered_name: R11R + real: false + image: null + - id: 2444 + name: Hanho Heung-Up + filtered_name: Hanho Heung-Up + real: false + image: null + - id: 2851 + name: Pinkfong + filtered_name: Pinkfong + real: false + image: null + - id: 2994 + name: Aurochs + filtered_name: Aurochs + real: false + image: null + - id: 2997 + name: Million Volt + filtered_name: Million Volt + real: false + image: null + - id: 3007 + name: Studio Harutonari + filtered_name: Harutonari + real: false + image: null + - id: 3009 + name: Kitchen Ltd. + filtered_name: Kitchen Ltd. + real: false + image: null + - id: 3013 + name: Rhythmos + filtered_name: Rhythmos + real: false + image: null + - id: 2283 + name: Manga Productions + filtered_name: Manga + real: false + image: null + - id: 3014 + name: STUDIOK110 + filtered_name: STUDIOK110 + real: false + image: null + - id: 3023 + name: FAB + filtered_name: FAB + real: false + image: null + - id: 3107 + name: Hifumi + filtered_name: Hifumi + real: false + image: null + - id: 3002 + name: CUEBiC + filtered_name: CUEBiC + real: false + image: null + - id: 2753 + name: Whatever + filtered_name: Whatever + real: false + image: null + - id: 2938 + name: 3D + filtered_name: 3D + real: false + image: null + - id: 3030 + name: Studio Dotou + filtered_name: Dotou + real: false + image: null + - id: 3032 + name: OutSide Directors Company + filtered_name: OutSide Directors Company + real: false + image: null + - id: 3031 + name: Kassen + filtered_name: Kassen + real: false + image: null + - id: 3035 + name: Koinrush Studio + filtered_name: Koinrush + real: false + image: null + - id: 3036 + name: MARK + filtered_name: MARK + real: false + image: null + - id: 3062 + name: DEFT + filtered_name: DEFT + real: false + image: null + - id: 2712 + name: Studio G7 + filtered_name: G7 + real: false + image: null + - id: 3120 + name: Stellar Pictures + filtered_name: Stellar Pictures + real: false + image: null + - id: 3121 + name: Happy Toon + filtered_name: Happy Toon + real: false + image: null + - id: 3124 + name: Yumao Wenhua + filtered_name: Yumao Wenhua + real: false + image: null + - id: 3125 + name: G.H.Y. Culture & Media + filtered_name: G.H.Y. Culture & Media + real: false + image: null + - id: 3126 + name: Long Zhi Gu Wenhua + filtered_name: Long Zhi Gu Wenhua + real: false + image: null + - id: 2638 + name: Yien Animation Studio + filtered_name: Yien Animation + real: false + image: null + - id: 2586 + name: D.ROCK-ART + filtered_name: D.ROCK-ART + real: false + image: null + - id: 3117 + name: Jiman Wenhua + filtered_name: Jiman Wenhua + real: false + image: null + - id: 3131 + name: Zhou Ling Wenhua + filtered_name: Zhou Ling Wenhua + real: false + image: null + - id: 3129 + name: Hei Chao Yinghua + filtered_name: Hei Chao Yinghua + real: false + image: null + - id: 3130 + name: Chenghuang Yinghua + filtered_name: Chenghuang Yinghua + real: false + image: null + - id: 3132 + name: Flying Fish Studio + filtered_name: Flying Fish + real: false + image: null + - id: 3133 + name: Bu Keneng de Shijie + filtered_name: Bu Keneng de Shijie + real: false + image: null + - id: 3134 + name: Kid+Kid Animation Studio + filtered_name: Kid+Kid Animation + real: false + image: null + - id: 3135 + name: Lan Ying Yingshi + filtered_name: Lan Ying Yingshi + real: false + image: null + - id: 3136 + name: Tang Cai Zhaopin + filtered_name: Tang Cai Zhaopin + real: false + image: null + - id: 2084 + name: Tong Mingxuan Studio + filtered_name: Tong Mingxuan + real: false + image: null + - id: 3138 + name: Honoo + filtered_name: Honoo + real: false + image: null + - id: 3139 + name: S.o.K + filtered_name: S.o.K + real: false + image: null + - id: 3127 + name: INS Studio + filtered_name: INS + real: false + image: null + - id: 1399 + name: asurafilm + filtered_name: asurafilm + real: false + image: null + - id: 2892 + name: WWWave + filtered_name: WWWave + real: false + image: null + - id: 3122 + name: Climax Studio + filtered_name: Climax + real: false + image: null + - id: 3150 + name: Ziine Studio + filtered_name: Ziine + real: false + image: null + - id: 3149 + name: Pepper Conpanna + filtered_name: Pepper Conpanna + real: false + image: null + - id: 3148 + name: OSROCTION + filtered_name: OSROCTION + real: false + image: null + - id: 3145 + name: Nulls Design + filtered_name: Nulls Design + real: false + image: null + - id: 3144 + name: Skyloong + filtered_name: Skyloong + real: false + image: null + - id: 1063 + name: CALF + filtered_name: CALF + real: false + image: null + - id: 3157 + name: Psyde Kick Studio + filtered_name: Psyde Kick + real: false + image: null + - id: 3094 + name: animation studio42 + filtered_name: studio42 + real: false + image: null + - id: 1314 + name: Gaina + filtered_name: Gaina + real: false + image: null + - id: 3173 + name: BENTEN Film + filtered_name: BENTEN Film + real: false + image: null + - id: 3167 + name: Funny Flux + filtered_name: Funny Flux + real: false + image: null + - id: 3068 + name: Manpuku Jinja + filtered_name: Manpuku Jinja + real: false + image: null + - id: 3142 + name: Kagome Company + filtered_name: Kagome Company + real: false + image: null + - id: 2010 + name: Nippon Ramayana Film + filtered_name: Nippon Ramayana Film + real: false + image: null + - id: 255 + name: Imagi + filtered_name: Imagi + real: false + image: null + - id: 216 + name: Studio Tron + filtered_name: Tron + real: false + image: null + - id: 3161 + name: Triple A + filtered_name: Triple A + real: false + image: null + - id: 1 + name: Studio Pierrot + filtered_name: Pierrot + real: true + image: /system/studios/original/1.png?1378753179 + - id: 3158 + name: Children's Corner + filtered_name: Children's Corner + real: false + image: null + - id: 991 + name: Hoso Seisaku Doga + filtered_name: Hoso Seisaku Doga + real: false + image: null + - id: 2344 + name: All Products + filtered_name: All Products + real: false + image: null + - id: 2087 + name: CEKAI + filtered_name: CEKAI + real: false + image: null + - id: 3186 + name: studio maf + filtered_name: maf + real: false + image: null + - id: 3187 + name: Cue + filtered_name: Cue + real: false + image: null + - id: 3190 + name: Studio Maybe + filtered_name: Maybe + real: false + image: null + - id: 3189 + name: mico.animation + filtered_name: mico.animation + real: false + image: null + - id: 3192 + name: Studio Graph77 + filtered_name: Graph77 + real: false + image: null + - id: 1997 + name: Studio KAI + filtered_name: KAI + real: false + image: /system/studios/original/1997.png?1618484872 + - id: 3197 + name: Toon Harbor Works + filtered_name: Toon Harbor Works + real: false + image: null + - id: 3194 + name: Nichicaline + filtered_name: Nichicaline + real: false + image: null + - id: 3195 + name: Folium + filtered_name: Folium + real: false + image: null + - id: 3196 + name: Rouseact + filtered_name: Rouseact + real: false + image: null + - id: 3201 + name: ABC Animation Studio + filtered_name: ABC Animation + real: false + image: null + - id: 3202 + name: Finger and Toe + filtered_name: Finger and Toe + real: false + image: null + - id: 1961 + name: Creatures + filtered_name: Creatures + real: false + image: null + - id: 2299 + name: Gift-o’-Animation + filtered_name: Gift-o’-Animation + real: false + image: null + - id: 3205 + name: Garage Film + filtered_name: Garage Film + real: false + image: null + - id: 3207 + name: studioDOT + filtered_name: studioDOT + real: false + image: null + - id: 3209 + name: IKIF+ + filtered_name: IKIF+ + real: false + image: null + - id: 3214 + name: Studio BETTA + filtered_name: BETTA + real: false + image: null + - id: 3217 + name: Atoonz + filtered_name: Atoonz + real: false + image: null + - id: 3244 + name: Shenli Guangyin + filtered_name: Shenli Guangyin + real: false + image: null + - id: 3128 + name: Guangzhou Liu Ling Yi + filtered_name: Guangzhou Liu Ling Yi + real: false + image: null + - id: 3212 + name: Tochka + filtered_name: Tochka + real: false + image: null + - id: 3159 + name: Newon + filtered_name: Newon + real: false + image: null + - id: 2756 + name: Equator + filtered_name: Equator + real: false + image: null + - id: 3241 + name: Project Team Argos + filtered_name: Project Team Argos + real: false + image: null + - id: 3223 + name: Office Academy + filtered_name: Office Academy + real: false + image: null + - id: 2378 + name: StarLink + filtered_name: StarLink + real: false + image: null + - id: 1009 + name: Aubeck + filtered_name: Aubeck + real: false + image: null + - id: 3249 + name: Sunshine Corporation + filtered_name: Sunshine Corporation + real: false + image: null + - id: 3245 + name: Teleimage + filtered_name: Teleimage + real: false + image: null + - id: 450 + name: Wako Production + filtered_name: Wako + real: false + image: /system/studios/original/450.jpg?1634761556 + - id: 3247 + name: bushes + filtered_name: bushes + real: false + image: null + - id: 3179 + name: TV Douga + filtered_name: TV Douga + real: false + image: null + - id: 3250 + name: Lychee Time Media + filtered_name: Lychee Time Media + real: false + image: null + - id: 2368 + name: Miyuki Production + filtered_name: Miyuki + real: false + image: null + - id: 3251 + name: B.COOL STUDIO + filtered_name: B.COOL + real: false + image: null + - id: 3252 + name: Doraku + filtered_name: Doraku + real: false + image: null + - id: 3238 + name: Tsubasa Production + filtered_name: Tsubasa + real: false + image: null + - id: 3253 + name: Liliyabi Company Introduction + filtered_name: Liliyabi Company Introduction + real: false + image: null + - id: 1325 + name: Haoliners Animation + filtered_name: Haoliners + real: true + image: /system/studios/original/1325.png?1499467056 + - id: 3254 + name: Honglu Technology + filtered_name: Honglu Technology + real: false + image: null + - id: 3255 + name: PAINTFREE + filtered_name: PAINTFREE + real: false + image: null + - id: 3257 + name: Grass Jelly Studio + filtered_name: Grass Jelly + real: false + image: null + - id: 3258 + name: OCSTUDIO + filtered_name: OCSTUDIO + real: false + image: null + - id: 3273 + name: Atelier Peuplier + filtered_name: Atelier Peuplier + real: false + image: null + - id: 3271 + name: Gugenka + filtered_name: Gugenka + real: false + image: null + - id: 3264 + name: BIGBIGSUN + filtered_name: BIGBIGSUN + real: false + image: null + - id: 3276 + name: Aura Studio + filtered_name: Aura + real: false + image: null + - id: 1804 + name: Nice Boat Animation + filtered_name: Nice Boat + real: false + image: /system/studios/original/1804.png?1634761461 + - id: 3266 + name: WINSING ANIMATION + filtered_name: WINSING + real: false + image: null + - id: 3261 + name: TRCARTOON + filtered_name: TRCARTOON + real: false + image: null + - id: 3268 + name: YNUO + filtered_name: YNUO + real: false + image: null + - id: 3278 + name: Studio Eek + filtered_name: Eek + real: false + image: null + - id: 3243 + name: Da Chenger Gongzuoshi + filtered_name: Da Chenger Gongzuoshi + real: false + image: null + - id: 3281 + name: Akatsuki Media Studio + filtered_name: Akatsuki Media + real: false + image: null + - id: 3277 + name: Mofac Studio + filtered_name: Mofac + real: false + image: null + - id: 3282 + name: Shen Fu Wenhua + filtered_name: Shen Fu Wenhua + real: false + image: null + - id: 3288 + name: A4works + filtered_name: A4works + real: false + image: null + - id: 3290 + name: Atra + filtered_name: Atra + real: false + image: null + - id: 3294 + name: Grass + filtered_name: Grass + real: false + image: null + - id: 3275 + name: FuRyu Pictures + filtered_name: FuRyu Pictures + real: false + image: null + - id: 2838 + name: San Blas Animation + filtered_name: San Blas + real: false + image: null + - id: 3293 + name: Green Leaf Animation + filtered_name: Green Leaf + real: false + image: null + - id: 3297 + name: Aisle + filtered_name: Aisle + real: false + image: null + - id: 3300 + name: Bakkka + filtered_name: Bakkka + real: false + image: null + - id: 3301 + name: Cannon Code + filtered_name: Cannon Code + real: false + image: null + - id: 3260 + name: Hui Guang Gongzuoshi + filtered_name: Hui Guang Gongzuoshi + real: false + image: null + - id: 3303 + name: Daily Plan.net + filtered_name: Daily Plan.net + real: false + image: null + - id: 3304 + name: SO-DO Creative + filtered_name: SO-DO Creative + real: false + image: null + - id: 3295 + name: Computer Technique Group + filtered_name: Computer Technique Group + real: false + image: null + - id: 3296 + name: coyote + filtered_name: coyote + real: false + image: null + - id: 3305 + name: Electric Circus + filtered_name: Electric Circus + real: false + image: null + - id: 3306 + name: Studio Keel + filtered_name: Keel + real: false + image: null + - id: 3259 + name: Moonseong Animation + filtered_name: Moonseong + real: false + image: null + - id: 2192 + name: Haianxian Donghua Gongzuoshi + filtered_name: Haianxian Donghua Gongzuoshi + real: false + image: null + - id: 3287 + name: Daicon Film + filtered_name: Daicon Film + real: false + image: null + - id: 2445 + name: Big Film Entertainment + filtered_name: Big Film + real: false + image: null + - id: 3286 + name: Cypic + filtered_name: Cypic + real: false + image: null + - id: 1641 + name: Studio AWAKE + filtered_name: AWAKE + real: false + image: null + - id: 3314 + name: Studio Wrong + filtered_name: Wrong + real: false + image: null + - id: 3316 + name: Ciwen Animation + filtered_name: Ciwen + real: false + image: null + - id: 3311 + name: Kaihuang Donghua + filtered_name: Kaihuang Donghua + real: false + image: null + - id: 3312 + name: You Hu Wenhua + filtered_name: You Hu Wenhua + real: false + image: null + - id: 3318 + name: Buzhi Dongman + filtered_name: Buzhi Dongman + real: false + image: null + body_text: null + body_b64: null diff --git a/test/fixtures/shikimori/studios/03-ghibli-limit1000.yaml b/test/fixtures/shikimori/studios/03-ghibli-limit1000.yaml new file mode 100644 index 0000000..41e4793 --- /dev/null +++ b/test/fixtures/shikimori/studios/03-ghibli-limit1000.yaml @@ -0,0 +1,9463 @@ +metadata: + captured_at: '2026-05-11T08:09:50Z' + label: ghibli-limit1000 + backend: shikimori + path_slug: studios +request: + method: GET + url: https://shikimori.io/api/studios?limit=1000 + headers: + User-Agent: animedex/0.0.1 + params: null + json_body: null + raw_body_b64: null +response: + status: 200 + headers: + Server: ddos-guard + Connection: keep-alive + Keep-Alive: timeout=60 + Set-Cookie: + Content-Security-Policy: upgrade-insecure-requests; + Date: Mon, 11 May 2026 08:09:50 GMT + Content-Type: application/json; charset=utf-8 + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: '0' + X-Content-Type-Options: nosniff + X-Permitted-Cross-Domain-Policies: none + Referrer-Policy: strict-origin-when-cross-origin + ETag: W/"d88a2fdc653f6ec0f422a85cc311f145" + Cache-Control: max-age=0, private, must-revalidate + X-Request-Id: ed189717-09c1-480e-aeca-6fe8dc6c081a + X-Runtime: '0.270832' + vary: Accept, Origin + Content-Encoding: gzip + Transfer-Encoding: chunked + body_json: + - id: 2022 + name: TYMOTE + filtered_name: TYMOTE + real: false + image: null + - id: 2023 + name: Spoon + filtered_name: Spoon + real: false + image: null + - id: 1356 + name: Tonko House + filtered_name: Tonko House + real: false + image: null + - id: 1992 + name: Bandai Spirits + filtered_name: Bandai Spirits + real: false + image: null + - id: 2007 + name: Studio Drive + filtered_name: Drive + real: false + image: null + - id: 2723 + name: Unend + filtered_name: Unend + real: false + image: null + - id: 3213 + name: Shanghai Zhijian Network + filtered_name: Shanghai Zhijian Network + real: false + image: null + - id: 2011 + name: Yonago Gainax + filtered_name: Yonago Gainax + real: false + image: null + - id: 2240 + name: Studio Daisy + filtered_name: Daisy + real: false + image: null + - id: 2034 + name: Akatsuki + filtered_name: Akatsuki + real: false + image: null + - id: 2041 + name: Enjin Productions + filtered_name: Enjin + real: false + image: null + - id: 2027 + name: Team TillDawn + filtered_name: Team TillDawn + real: false + image: null + - id: 2029 + name: Earth Design Works + filtered_name: Earth Design Works + real: false + image: null + - id: 2020 + name: Ark + filtered_name: Ark + real: false + image: null + - id: 2040 + name: Maro Studio + filtered_name: Maro + real: false + image: null + - id: 2 + name: Kyoto Animation + filtered_name: Kyoto + real: true + image: /system/studios/original/2.png?1522422929 + - id: 162 + name: Character and Anime Dot Com + filtered_name: Character and Anime Dot Com + real: false + image: null + - id: 17 + name: Aniplex + filtered_name: Aniplex + real: false + image: /system/studios/original/17.txt?1323005241 + - id: 10 + name: Production I.G + filtered_name: Production I.G + real: true + image: /system/studios/original/10.png?1312165069 + - id: 164 + name: d-rights + filtered_name: d-rights + real: false + image: null + - id: 165 + name: Marubeni + filtered_name: Marubeni + real: false + image: null + - id: 322 + name: Bee Media + filtered_name: Bee Media + real: false + image: null + - id: 23 + name: Bandai Visual + filtered_name: Bandai Visual + real: false + image: /system/studios/original/23.png?1311292710 + - id: 26 + name: Shinkai Makoto + filtered_name: Shinkai Makoto + real: false + image: null + - id: 29 + name: VAP + filtered_name: VAP + real: false + image: /system/studios/original/29.png?1311292712 + - id: 2398 + name: VCRWORKS + filtered_name: VCRWORKS + real: false + image: null + - id: 1472 + name: Myung Films + filtered_name: Myung Films + real: false + image: null + - id: 35 + name: Seven Arcs + filtered_name: Seven Arcs + real: false + image: /system/studios/original/35.jpg?1312165054 + - id: 40 + name: m.o.e. + filtered_name: m.o.e. + real: false + image: /system/studios/original/40.png?1311292710 + - id: 42 + name: GDH + filtered_name: GDH + real: false + image: /system/studios/original/42.png?1311292713 + - id: 39 + name: Daume + filtered_name: Daume + real: true + image: /system/studios/original/39.jpg?1311292711 + - id: 49 + name: Remic + filtered_name: Remic + real: false + image: null + - id: 2159 + name: Composition Inc. + filtered_name: Composition Inc. + real: false + image: null + - id: 2169 + name: Studio 88 + filtered_name: '88' + real: false + image: null + - id: 2177 + name: Mimoid + filtered_name: Mimoid + real: false + image: null + - id: 2183 + name: Keica + filtered_name: Keica + real: false + image: null + - id: 2403 + name: Brians Film + filtered_name: Brians Film + real: false + image: null + - id: 2404 + name: OLM Team Kato + filtered_name: OLM Team Kato + real: false + image: null + - id: 50 + name: KSS + filtered_name: KSS + real: false + image: /system/studios/original/50.gif?1311292710 + - id: 195 + name: Pixy + filtered_name: Pixy + real: false + image: /system/studios/original/195.jpg?1311292711 + - id: 565 + name: LMD + filtered_name: LMD + real: false + image: null + - id: 52 + name: Avex Entertainment + filtered_name: Avex + real: false + image: /system/studios/original/52.png?1311292713 + - id: 2405 + name: Staple Entertainment + filtered_name: Staple + real: false + image: null + - id: 55 + name: TV Asahi + filtered_name: TV Asahi + real: false + image: /system/studios/original/55.jpg?1311292710 + - id: 300 + name: SILVER LINK. + filtered_name: SILVER LINK. + real: true + image: /system/studios/original/300.?1434707266 + - id: 58 + name: Square Enix + filtered_name: Square Enix + real: false + image: /system/studios/original/58.png?1311292714 + - id: 59 + name: Beat Frog + filtered_name: Beat Frog + real: false + image: null + - id: 61 + name: Frontier Works + filtered_name: Frontier Works + real: false + image: /system/studios/original/61.png?1311292712 + - id: 63 + name: Trinet Entertainment + filtered_name: Trinet + real: false + image: /system/studios/original/63.jpg?1311292713 + - id: 2432 + name: happyproject + filtered_name: happyproject + real: false + image: null + - id: 66 + name: Key + filtered_name: Key + real: false + image: /system/studios/original/66.gif?1311292712 + - id: 285 + name: Four Some + filtered_name: Four Some + real: false + image: null + - id: 69 + name: Front Line + filtered_name: Front Line + real: false + image: null + - id: 47 + name: Khara + filtered_name: Khara + real: false + image: /system/studios/original/47.jpg?1311292710 + - id: 2814 + name: Image Studio 109 + filtered_name: Image Studio 109 + real: false + image: null + - id: 2809 + name: PHANTOM + filtered_name: PHANTOM + real: false + image: null + - id: 2818 + name: qmotri + filtered_name: qmotri + real: false + image: null + - id: 2878 + name: Khaki + filtered_name: Khaki + real: false + image: null + - id: 2881 + name: Andraft + filtered_name: Andraft + real: false + image: null + - id: 2882 + name: THREE IS A MAGIC NUMBER + filtered_name: THREE IS A MAGIC NUMBER + real: false + image: null + - id: 1938 + name: Polygon Magic + filtered_name: Polygon Magic + real: false + image: null + - id: 71 + name: Mellow Head + filtered_name: Mellow Head + real: false + image: /system/studios/original/71.jpg?1311292711 + - id: 65 + name: Tokyo Movie Shinsha + filtered_name: Tokyo Movie Shinsha + real: true + image: /system/studios/original/65.?1521917245 + - id: 2436 + name: Frontier One + filtered_name: Frontier One + real: false + image: null + - id: 70 + name: Nomad + filtered_name: Nomad + real: true + image: /system/studios/original/70.jpg?1311292712 + - id: 2178 + name: Tecarat + filtered_name: Tecarat + real: false + image: null + - id: 80 + name: Trans Arts + filtered_name: Trans Arts + real: false + image: /system/studios/original/80.jpg?1312165045 + - id: 127 + name: Yomiko Advertising + filtered_name: Yomiko Advertising + real: false + image: /system/studios/original/127.jpg?1311292710 + - id: 129 + name: Silky’ s + filtered_name: Silky’ s + real: false + image: null + - id: 130 + name: CherryLips + filtered_name: CherryLips + real: false + image: null + - id: 131 + name: G&G Entertainment + filtered_name: G&G + real: false + image: /system/studios/original/131.png?1311292713 + - id: 557 + name: Zyc + filtered_name: Zyc + real: false + image: null + - id: 82 + name: Marvelous Entertainment + filtered_name: Marvelous + real: false + image: /system/studios/original/82.gif?1311292714 + - id: 83 + name: AIC Spirits + filtered_name: AIC Spirits + real: false + image: /system/studios/original/83.jpg?1311292710 + - id: 85 + name: Konami + filtered_name: Konami + real: false + image: /system/studios/original/85.png?1311292712 + - id: 89 + name: BeSTACK + filtered_name: BeSTACK + real: false + image: /system/studios/original/89.jpg?1311292713 + - id: 92 + name: Starchild Records + filtered_name: Starchild Records + real: false + image: /system/studios/original/92.jpg?1312165050 + - id: 93 + name: Studio Flag + filtered_name: Flag + real: false + image: null + - id: 2395 + name: J.C.F. + filtered_name: J.C.F. + real: false + image: null + - id: 91 + name: feel. + filtered_name: feel. + real: true + image: /system/studios/original/91.png?1350322172 + - id: 2191 + name: BUILD DREAM + filtered_name: BUILD DREAM + real: false + image: null + - id: 100 + name: TV Osaka + filtered_name: TV Osaka + real: false + image: /system/studios/original/100.png?1311292713 + - id: 97 + name: ADV Films + filtered_name: ADV Films + real: false + image: /system/studios/original/97.png?1589819349 + - id: 98 + name: Sav! The World Productions + filtered_name: Sav! The World + real: false + image: /system/studios/original/98.png?1589819322 + - id: 104 + name: Lantis + filtered_name: Lantis + real: false + image: /system/studios/original/104.png?1311292713 + - id: 107 + name: Plum + filtered_name: Plum + real: false + image: null + - id: 108 + name: Media Factory + filtered_name: Media Factory + real: false + image: /system/studios/original/108.jpg?1311292711 + - id: 320 + name: 'Maru Production ' + filtered_name: 'Maru Production ' + real: false + image: null + - id: 88 + name: AIC ASTA + filtered_name: AIC ASTA + real: false + image: /system/studios/original/88.png?1589819301 + - id: 3143 + name: ETERNA Animation + filtered_name: ETERNA + real: false + image: null + - id: 102 + name: FUNimation Entertainment + filtered_name: FUNimation + real: false + image: /system/studios/original/102.png?1602436357 + - id: 2193 + name: ORENDA + filtered_name: ORENDA + real: false + image: null + - id: 2397 + name: Pink Cat + filtered_name: Pink Cat + real: false + image: null + - id: 321 + name: Kitty Media + filtered_name: Kitty Media + real: false + image: null + - id: 2721 + name: NHK Art + filtered_name: NHK Art + real: false + image: null + - id: 109 + name: Shochiku + filtered_name: Shochiku + real: false + image: /system/studios/original/109.gif?1311292713 + - id: 114 + name: Studio Matrix + filtered_name: Matrix + real: false + image: null + - id: 116 + name: Broccoli + filtered_name: Broccoli + real: false + image: /system/studios/original/116.png?1311292713 + - id: 117 + name: Studio Izena + filtered_name: Izena + real: false + image: /system/studios/original/117.jpg?1311292710 + - id: 51 + name: Diomedéa + filtered_name: Diomedéa + real: true + image: /system/studios/original/51.?1434707974 + - id: 121 + name: Active + filtered_name: Active + real: false + image: /system/studios/original/121.gif?1311292712 + - id: 122 + name: Tokyo Kids + filtered_name: Tokyo Kids + real: false + image: /system/studios/original/122.jpg?1311292713 + - id: 123 + name: Victor Entertainment + filtered_name: Victor + real: false + image: /system/studios/original/123.gif?1311292711 + - id: 124 + name: Animac + filtered_name: Animac + real: false + image: /system/studios/original/124.jpg?1311292710 + - id: 125 + name: Pioneer Entertainment (USA) + filtered_name: Pioneer Entertainment (USA) + real: false + image: null + - id: 160 + name: Rondo Robe + filtered_name: Rondo Robe + real: false + image: /system/studios/original/160.gif?1311292710 + - id: 133 + name: Shinyusha + filtered_name: Shinyusha + real: false + image: null + - id: 96 + name: Yumeta Company + filtered_name: Yumeta Company + real: true + image: /system/studios/original/96.png?1589819393 + - id: 135 + name: MediaNet + filtered_name: MediaNet + real: false + image: /system/studios/original/135.jpg?1312165068 + - id: 136 + name: Vega Entertainment + filtered_name: Vega + real: false + image: /system/studios/original/136.jpg?1311292712 + - id: 137 + name: PPM + filtered_name: PPM + real: false + image: null + - id: 138 + name: Himajin Planning + filtered_name: Himajin Planning + real: false + image: null + - id: 141 + name: Toei Video + filtered_name: Toei Video + real: false + image: null + - id: 142 + name: Asatsu DK + filtered_name: Asatsu DK + real: false + image: null + - id: 143 + name: Mainichi Broadcasting + filtered_name: Mainichi Broadcasting + real: false + image: null + - id: 145 + name: TBS + filtered_name: TBS + real: false + image: /system/studios/original/145.png?1311292711 + - id: 146 + name: CBC + filtered_name: CBC + real: false + image: null + - id: 2407 + name: Flying Ship Studio + filtered_name: Flying Ship + real: false + image: null + - id: 2722 + name: Studio Fusion + filtered_name: Fusion + real: false + image: null + - id: 140 + name: Animax + filtered_name: Animax + real: true + image: /system/studios/original/140.png?1311292711 + - id: 147 + name: SKY Perfect Well Think + filtered_name: SKY Perfect Well Think + real: false + image: /system/studios/original/147.gif?1312164965 + - id: 148 + name: Hakunensha + filtered_name: Hakunensha + real: false + image: null + - id: 149 + name: SME Visual Works + filtered_name: SME Visual Works + real: false + image: null + - id: 152 + name: Green Bunny + filtered_name: Green Bunny + real: false + image: /system/studios/original/152.png?1312165080 + - id: 153 + name: SoftX + filtered_name: SoftX + real: false + image: null + - id: 156 + name: Polygram Japan + filtered_name: Polygram Japan + real: false + image: null + - id: 157 + name: BMG Japan + filtered_name: BMG Japan + real: false + image: null + - id: 158 + name: KIDS STATION + filtered_name: KIDS STATION + real: false + image: /system/studios/original/158.gif?1311292714 + - id: 159 + name: Kodansha + filtered_name: Kodansha + real: false + image: /system/studios/original/159.gif?1311292710 + - id: 161 + name: Sogo Vision + filtered_name: Sogo Vision + real: false + image: null + - id: 167 + name: Sega + filtered_name: Sega + real: false + image: /system/studios/original/167.png?1311292711 + - id: 168 + name: Shelty + filtered_name: Shelty + real: false + image: null + - id: 155 + name: animate Film + filtered_name: animate Film + real: false + image: /system/studios/original/155.jpg?1311292713 + - id: 2409 + name: Amineworks + filtered_name: Amineworks + real: false + image: null + - id: 169 + name: Fuji TV + filtered_name: Fuji TV + real: false + image: /system/studios/original/169.gif?1311292710 + - id: 170 + name: Imagica + filtered_name: Imagica + real: false + image: /system/studios/original/170.png?1311292713 + - id: 172 + name: Alchemist + filtered_name: Alchemist + real: false + image: /system/studios/original/172.gif?1312165043 + - id: 171 + name: A-Line + filtered_name: A-Line + real: false + image: null + - id: 2194 + name: Yi Chen Animation + filtered_name: Yi Chen + real: false + image: null + - id: 2195 + name: PONOS Corporation + filtered_name: PONOS Corporation + real: false + image: null + - id: 2196 + name: Studio DURIAN + filtered_name: DURIAN + real: false + image: null + - id: 166 + name: Movic + filtered_name: Movic + real: false + image: /system/studios/original/166.jpg?1311292713 + - id: 2437 + name: Infinity Vision + filtered_name: Infinity Vision + real: false + image: null + - id: 2439 + name: Chosen + filtered_name: Chosen + real: false + image: null + - id: 2455 + name: East Fish Studio + filtered_name: East Fish + real: false + image: null + - id: 2527 + name: Liber + filtered_name: Liber + real: false + image: null + - id: 173 + name: Alice Soft + filtered_name: Alice Soft + real: false + image: /system/studios/original/173.gif?1311292710 + - id: 150 + name: Sanrio + filtered_name: Sanrio + real: true + image: /system/studios/original/150.png?1539693669 + - id: 2198 + name: Irawias + filtered_name: Irawias + real: false + image: null + - id: 176 + name: Ginga Ya + filtered_name: Ginga Ya + real: false + image: null + - id: 177 + name: Studio Kyuuma + filtered_name: Kyuuma + real: false + image: null + - id: 178 + name: Trilogy Future Studio + filtered_name: Trilogy Future + real: false + image: /system/studios/original/178.png?1311292713 + - id: 182 + name: Age + filtered_name: Age + real: false + image: /system/studios/original/182.gif?1311292713 + - id: 183 + name: Agent 21 + filtered_name: Agent 21 + real: false + image: null + - id: 184 + name: Ai ga areba Daijobu + filtered_name: Ai ga areba Daijobu + real: false + image: /system/studios/original/184.png?1311292710 + - id: 185 + name: Aiko + filtered_name: Aiko + real: false + image: null + - id: 186 + name: Ail + filtered_name: Ail + real: false + image: /system/studios/original/186.gif?1311292714 + - id: 189 + name: GEN Productions + filtered_name: GEN + real: false + image: null + - id: 190 + name: RCC Chugoku Broadcasting + filtered_name: RCC Chugoku Broadcasting + real: false + image: null + - id: 192 + name: Shinkuukan + filtered_name: Shinkuukan + real: false + image: null + - id: 193 + name: Idea Factory + filtered_name: Idea Factory + real: false + image: /system/studios/original/193.png?1311292710 + - id: 194 + name: ANIK + filtered_name: ANIK + real: false + image: /system/studios/original/194.jpg?1311292714 + - id: 197 + name: Studio Junior + filtered_name: Junior + real: false + image: null + - id: 198 + name: Gakken + filtered_name: Gakken + real: false + image: /system/studios/original/198.jpg?1312165013 + - id: 203 + name: Visual Art’s + filtered_name: Visual Art’s + real: false + image: null + - id: 204 + name: PIONEER LDC + filtered_name: PIONEER LDC + real: false + image: null + - id: 205 + name: Nihon Ad Systems + filtered_name: Nihon Ad Systems + real: false + image: null + - id: 206 + name: Digital Works + filtered_name: Digital Works + real: false + image: null + - id: 208 + name: Three Fat Samurai + filtered_name: Three Fat Samurai + real: false + image: /system/studios/original/208.png?1311292711 + - id: 209 + name: Sol Blade + filtered_name: Sol Blade + real: false + image: null + - id: 210 + name: Studio Tulip + filtered_name: Tulip + real: false + image: /system/studios/original/210.gif?1311292710 + - id: 211 + name: Rakuonsha + filtered_name: Rakuonsha + real: false + image: null + - id: 212 + name: Venus Vangard + filtered_name: Venus Vangard + real: false + image: null + - id: 213 + name: Half H.P Studio + filtered_name: Half H.P + real: false + image: null + - id: 214 + name: BS-i + filtered_name: BS-i + real: false + image: null + - id: 3219 + name: Nyan Pollution + filtered_name: Nyan Pollution + real: false + image: null + - id: 217 + name: The Right Stuf International + filtered_name: The Right Stuf International + real: false + image: null + - id: 191 + name: Eiken + filtered_name: Eiken + real: true + image: /system/studios/original/191.jpg?1311292712 + - id: 2412 + name: FUNNY MOVIE + filtered_name: FUNNY MOVIE + real: false + image: null + - id: 222 + name: Jade Animation + filtered_name: Jade + real: false + image: null + - id: 224 + name: Toshiba EMI + filtered_name: Toshiba EMI + real: false + image: null + - id: 226 + name: Panmedia + filtered_name: Panmedia + real: false + image: /system/studios/original/226.png?1311292713 + - id: 229 + name: The Answer Studio + filtered_name: The Answer + real: false + image: /system/studios/original/229.jpg?1312165081 + - id: 271 + name: Barnum Studio + filtered_name: Barnum + real: false + image: null + - id: 272 + name: Studio Kajino + filtered_name: Kajino + real: false + image: null + - id: 273 + name: Think Corporation + filtered_name: Think Corporation + real: false + image: null + - id: 394 + name: Misseri Studio + filtered_name: Misseri + real: false + image: null + - id: 276 + name: DLE + filtered_name: DLE + real: false + image: /system/studios/original/276.png?1647107706 + - id: 2490 + name: Studio Dolphin Night + filtered_name: Dolphin Night + real: false + image: null + - id: 2724 + name: Heart & Soul Animation + filtered_name: Heart & Soul + real: false + image: null + - id: 230 + name: Bandai + filtered_name: Bandai + real: false + image: /system/studios/original/230.jpg?1311292711 + - id: 231 + name: CyberConnect2 + filtered_name: CyberConnect2 + real: false + image: /system/studios/original/231.gif?1311292714 + - id: 233 + name: Bandai Entertainment + filtered_name: Bandai + real: false + image: /system/studios/original/233.gif?1311292711 + - id: 280 + name: Studio Junio + filtered_name: Junio + real: false + image: null + - id: 236 + name: YTV + filtered_name: YTV + real: false + image: null + - id: 238 + name: AT-X + filtered_name: AT-X + real: false + image: null + - id: 2580 + name: GUMBLAB + filtered_name: GUMBLAB + real: false + image: null + - id: 240 + name: Capcom + filtered_name: Capcom + real: false + image: /system/studios/original/240.jpg?1312165059 + - id: 241 + name: KOEI + filtered_name: KOEI + real: false + image: /system/studios/original/241.jpg?1311292712 + - id: 244 + name: D3 + filtered_name: D3 + real: false + image: null + - id: 246 + name: Visual 80 + filtered_name: Visual 80 + real: false + image: null + - id: 2201 + name: Studio Palette + filtered_name: Palette + real: false + image: null + - id: 250 + name: Media Blasters + filtered_name: Media Blasters + real: false + image: null + - id: 252 + name: 4Kids Entertainment + filtered_name: 4Kids + real: false + image: null + - id: 248 + name: Tin House + filtered_name: Tin House + real: true + image: null + - id: 253 + name: Rikuentai + filtered_name: Rikuentai + real: false + image: /system/studios/original/253.gif?1311292713 + - id: 254 + name: Soft Garage + filtered_name: Soft Garage + real: false + image: /system/studios/original/254.jpg?1312165053 + - id: 3226 + name: Studio Chromato + filtered_name: Chromato + real: false + image: null + - id: 256 + name: Studio Kikan + filtered_name: Kikan + real: false + image: null + - id: 257 + name: Jam + filtered_name: Jam + real: false + image: /system/studios/original/257.png?1311292709 + - id: 2204 + name: OZ + filtered_name: OZ + real: false + image: null + - id: 259 + name: Kaeruotoko Shokai + filtered_name: Kaeruotoko Shokai + real: false + image: null + - id: 260 + name: Shuuhei Morita + filtered_name: Shuuhei Morita + real: false + image: null + - id: 261 + name: San-X + filtered_name: San-X + real: false + image: null + - id: 262 + name: Kadokawa Pictures USA + filtered_name: Kadokawa Pictures USA + real: false + image: null + - id: 265 + name: Valkyria + filtered_name: Valkyria + real: false + image: /system/studios/original/265.jpg?1311292713 + - id: 281 + name: Kokusai Eigasha + filtered_name: Kokusai Eigasha + real: false + image: null + - id: 245 + name: Toho + filtered_name: Toho + real: false + image: null + - id: 2205 + name: Studio Kafka + filtered_name: Kafka + real: false + image: null + - id: 2207 + name: Poly Animation + filtered_name: Poly + real: false + image: null + - id: 2208 + name: Taikong Works + filtered_name: Taikong Works + real: false + image: null + - id: 266 + name: Natural High + filtered_name: Natural High + real: false + image: null + - id: 2883 + name: Atelier Tuki + filtered_name: Atelier Tuki + real: false + image: null + - id: 268 + name: Hot Bear + filtered_name: Hot Bear + real: false + image: /system/studios/original/268.jpg?1312165052 + - id: 269 + name: DiC Entertainment + filtered_name: DiC + real: false + image: null + - id: 2526 + name: Shenman Entertainment + filtered_name: Shenman + real: false + image: null + - id: 2535 + name: Uguisu Kobo + filtered_name: Uguisu Kobo + real: false + image: null + - id: 2696 + name: 100studio + filtered_name: 100studio + real: false + image: null + - id: 2157 + name: Production +h. + filtered_name: Production +h. + real: false + image: /system/studios/original/2157.png?1647107719 + - id: 275 + name: Kojiro Shishido Animation Works + filtered_name: Kojiro Shishido Animation Works + real: false + image: null + - id: 277 + name: Anime Midstream + filtered_name: Anime Midstream + real: false + image: null + - id: 2438 + name: yell + filtered_name: yell + real: false + image: null + - id: 279 + name: Skouras + filtered_name: Skouras + real: false + image: null + - id: 282 + name: Gentosha Comics + filtered_name: Gentosha Comics + real: false + image: null + - id: 283 + name: KENMedia + filtered_name: KENMedia + real: false + image: null + - id: 284 + name: Central Park Media + filtered_name: Central Park Media + real: false + image: null + - id: 292 + name: AIC PLUS+ + filtered_name: AIC PLUS+ + real: false + image: null + - id: 289 + name: ACiD FiLM + filtered_name: ACiD FiLM + real: false + image: null + - id: 290 + name: Kinema Citrus + filtered_name: Kinema Citrus + real: false + image: /system/studios/original/290.?1450691180 + - id: 293 + name: Picograph + filtered_name: Picograph + real: false + image: null + - id: 294 + name: Discovery + filtered_name: Discovery + real: false + image: /system/studios/original/294.gif?1311292712 + - id: 295 + name: BaseSon + filtered_name: BaseSon + real: false + image: /system/studios/original/295.jpg?1311292709 + - id: 296 + name: Critical Mass + filtered_name: Critical Mass + real: false + image: null + - id: 297 + name: Armor + filtered_name: Armor + real: false + image: null + - id: 299 + name: Studio Pastoral + filtered_name: Pastoral + real: false + image: /system/studios/original/299.gif?1311292711 + - id: 301 + name: Langmaor + filtered_name: Langmaor + real: false + image: null + - id: 302 + name: 'GODxDOG Production ' + filtered_name: 'GODxDOG Production ' + real: false + image: null + - id: 304 + name: Primastea + filtered_name: Primastea + real: false + image: null + - id: 306 + name: Magic Capsule + filtered_name: Magic Capsule + real: false + image: null + - id: 308 + name: Yellow Film + filtered_name: Yellow Film + real: false + image: null + - id: 310 + name: Animeigo + filtered_name: Animeigo + real: false + image: null + - id: 311 + name: Enoki Films + filtered_name: Enoki Films + real: false + image: null + - id: 2591 + name: Studio Pivote + filtered_name: Pivote + real: false + image: null + - id: 313 + name: Omnibus Japan + filtered_name: Omnibus Japan + real: false + image: /system/studios/original/313.jpg?1311292713 + - id: 316 + name: Nippon Shuppan Hanbai (Nippan) K.K. + filtered_name: Nippon Shuppan Hanbai (Nippan) K.K. + real: false + image: null + - id: 317 + name: NHK Enterprises + filtered_name: NHK Enterprises + real: false + image: null + - id: 319 + name: MS Pictures + filtered_name: MS Pictures + real: false + image: /system/studios/original/319.gif?1312165042 + - id: 323 + name: Nippon Columbia + filtered_name: Nippon Columbia + real: false + image: null + - id: 326 + name: Animation 21 + filtered_name: '21' + real: false + image: null + - id: 327 + name: Takara + filtered_name: Takara + real: false + image: /system/studios/original/327.jpg?1311292711 + - id: 315 + name: DAX Production + filtered_name: DAX + real: false + image: /system/studios/original/315.jpg?1363542744 + - id: 267 + name: Five Ways + filtered_name: Five Ways + real: false + image: /system/studios/original/267.jpg?1311292713 + - id: 328 + name: Casio Entertainment + filtered_name: Casio + real: false + image: /system/studios/original/328.gif?1311292710 + - id: 330 + name: Kanaban Graphics + filtered_name: Kanaban Graphics + real: false + image: null + - id: 332 + name: Takeshobo + filtered_name: Takeshobo + real: false + image: null + - id: 335 + name: Seta Corporation + filtered_name: Seta Corporation + real: false + image: null + - id: 338 + name: Studio Bogey + filtered_name: Bogey + real: false + image: null + - id: 339 + name: Rankin/Bass + filtered_name: Rankin/Bass + real: false + image: null + - id: 341 + name: SamBakZa + filtered_name: SamBakZa + real: false + image: null + - id: 343 + name: Puzzle Animation Studio Limited + filtered_name: Puzzle Animation Studio Limited + real: false + image: null + - id: 346 + name: Hoods Entertainment + filtered_name: Hoods + real: true + image: /system/studios/original/346.png?1369062564 + - id: 2885 + name: Group Creato + filtered_name: Group Creato + real: false + image: null + - id: 1301 + name: CCTV Animation Group + filtered_name: CCTV Animation Group + real: false + image: null + - id: 392 + name: Enterbrain + filtered_name: Enterbrain + real: false + image: /system/studios/original/392.png?1312165048 + - id: 393 + name: Epoch + filtered_name: Epoch + real: false + image: null + - id: 344 + name: ATLUS + filtered_name: ATLUS + real: false + image: /system/studios/original/344.jpg?1311292711 + - id: 345 + name: TAKI Corporation + filtered_name: TAKI Corporation + real: false + image: null + - id: 347 + name: PrimeTime + filtered_name: PrimeTime + real: false + image: null + - id: 348 + name: Kawamoto Productions Ltd. + filtered_name: Kawamoto Productions Ltd. + real: false + image: null + - id: 349 + name: Itasca Studio + filtered_name: Itasca + real: false + image: null + - id: 350 + name: The Village of Marchen + filtered_name: The Village of Marchen + real: false + image: null + - id: 351 + name: Big West + filtered_name: Big West + real: false + image: null + - id: 352 + name: Kadokawa Pictures Japan + filtered_name: Kadokawa Pictures Japan + real: false + image: null + - id: 353 + name: Chungeorahm Film + filtered_name: Chungeorahm Film + real: false + image: null + - id: 354 + name: Encourage Films + filtered_name: Encourage Films + real: false + image: /system/studios/original/354.png?1312165070 + - id: 356 + name: Cranberry + filtered_name: Cranberry + real: false + image: null + - id: 357 + name: Innocent Grey + filtered_name: Innocent Grey + real: false + image: /system/studios/original/357.jpg?1311292714 + - id: 359 + name: NHK-BS2 + filtered_name: NHK-BS2 + real: false + image: null + - id: 361 + name: Oxybot + filtered_name: Oxybot + real: false + image: null + - id: 362 + name: Film Workshop + filtered_name: Film Workshop + real: false + image: null + - id: 363 + name: Topcraft + filtered_name: Topcraft + real: false + image: null + - id: 364 + name: Sovat Theater + filtered_name: Sovat Theater + real: false + image: null + - id: 365 + name: PoRO + filtered_name: PoRO + real: false + image: /system/studios/original/365.jpg?1311292711 + - id: 366 + name: Tomoyasu Murata Company + filtered_name: Tomoyasu Murata Company + real: false + image: null + - id: 367 + name: Heewon Entertainment + filtered_name: Heewon + real: false + image: /system/studios/original/367.png?1311292711 + - id: 368 + name: UM Productions + filtered_name: UM + real: false + image: null + - id: 370 + name: Iyasakadou Film + filtered_name: Iyasakadou Film + real: false + image: null + - id: 371 + name: Union Cho + filtered_name: Union Cho + real: false + image: null + - id: 375 + name: I.Toon + filtered_name: I.Toon + real: false + image: null + - id: 376 + name: Sentai Filmworks + filtered_name: Sentai Filmworks + real: false + image: null + - id: 2134 + name: Studio CANDY BOX + filtered_name: CANDY BOX + real: false + image: null + - id: 378 + name: Grasshoppa! + filtered_name: Grasshoppa! + real: false + image: null + - id: 379 + name: Avaco Creative Studios + filtered_name: Avaco Creative + real: false + image: /system/studios/original/379.jpg?1311292713 + - id: 380 + name: Amuse Pictures + filtered_name: Amuse Pictures + real: false + image: null + - id: 381 + name: Yamato Works + filtered_name: Yamato Works + real: false + image: null + - id: 382 + name: Tokuma Shoten + filtered_name: Tokuma Shoten + real: false + image: null + - id: 383 + name: KMMJ Studios + filtered_name: KMMJ + real: false + image: null + - id: 384 + name: Trick Block + filtered_name: Trick Block + real: false + image: null + - id: 331 + name: Indeprox + filtered_name: Indeprox + real: false + image: null + - id: 340 + name: Future Planet + filtered_name: Future Planet + real: false + image: null + - id: 386 + name: Animaruya + filtered_name: Animaruya + real: false + image: null + - id: 387 + name: Blue Eyes + filtered_name: Blue Eyes + real: false + image: /system/studios/original/387.jpg?1311292712 + - id: 388 + name: Tamura Shigeru Studio + filtered_name: Tamura Shigeru + real: false + image: null + - id: 389 + name: I-move + filtered_name: I-move + real: false + image: /system/studios/original/389.jpg?1311292713 + - id: 390 + name: Tsuchida Productions + filtered_name: Tsuchida + real: false + image: null + - id: 391 + name: Grouper Productions + filtered_name: Grouper + real: false + image: null + - id: 396 + name: Asia-Do + filtered_name: Asia-Do + real: false + image: null + - id: 398 + name: Milky Cartoon + filtered_name: Milky Cartoon + real: false + image: null + - id: 399 + name: Dream Force + filtered_name: Dream Force + real: false + image: null + - id: 401 + name: ChuChu + filtered_name: ChuChu + real: false + image: /system/studios/original/401.png?1311292712 + - id: 402 + name: ChiChinoya + filtered_name: ChiChinoya + real: false + image: /system/studios/original/402.?1370373702 + - id: 403 + name: Tokyo Media Connections + filtered_name: Tokyo Media Connections + real: false + image: null + - id: 404 + name: Studio Unicorn + filtered_name: Unicorn + real: false + image: null + - id: 405 + name: T-Rex + filtered_name: T-Rex + real: false + image: null + - id: 408 + name: Amino + filtered_name: Amino + real: false + image: null + - id: 409 + name: Studio Egg + filtered_name: Egg + real: false + image: null + - id: 410 + name: Adult Source Media + filtered_name: Adult Source Media + real: false + image: null + - id: 411 + name: KBS + filtered_name: KBS + real: false + image: null + - id: 412 + name: Studio Wombat + filtered_name: Wombat + real: false + image: null + - id: 413 + name: Pastel + filtered_name: Pastel + real: false + image: null + - id: 414 + name: Lemon Heart + filtered_name: Lemon Heart + real: false + image: null + - id: 415 + name: Warner Bros. + filtered_name: Warner Bros. + real: false + image: null + - id: 416 + name: TAP + filtered_name: TAP + real: false + image: /system/studios/original/416.jpg?1311292710 + - id: 2413 + name: AION Studio + filtered_name: AION + real: false + image: null + - id: 373 + name: Panda Factory + filtered_name: Panda Factory + real: false + image: null + - id: 358 + name: Telescreen + filtered_name: Telescreen + real: false + image: null + - id: 559 + name: Purple Cow Studio Japan + filtered_name: Purple Cow Studio Japan + real: false + image: null + - id: 419 + name: ElectromagneticWave + filtered_name: ElectromagneticWave + real: false + image: null + - id: 420 + name: ACC Production + filtered_name: ACC + real: false + image: null + - id: 421 + name: International Digital Artist Inc. + filtered_name: International Digital Artist Inc. + real: false + image: null + - id: 422 + name: Schoolzone + filtered_name: Schoolzone + real: false + image: /system/studios/original/422.jpg?1311292713 + - id: 423 + name: Studio Eromatick + filtered_name: Eromatick + real: false + image: null + - id: 424 + name: Mary Jane + filtered_name: Mary Jane + real: false + image: /system/studios/original/424.jpg?1311292712 + - id: 425 + name: AIC Takarazuka + filtered_name: AIC Takarazuka + real: false + image: /system/studios/original/425.jpg?1311292709 + - id: 426 + name: Filmlink International + filtered_name: Filmlink International + real: false + image: null + - id: 427 + name: Studio G-1Neo + filtered_name: G-1Neo + real: false + image: /system/studios/original/427.jpg?1312165046 + - id: 428 + name: Nichiei Agency + filtered_name: Nichiei Agency + real: false + image: null + - id: 429 + name: Office AO + filtered_name: Office AO + real: false + image: /system/studios/original/429.png?1311292712 + - id: 430 + name: Mad Box + filtered_name: Mad Box + real: false + image: /system/studios/original/430.gif?1311292712 + - id: 431 + name: Procidis + filtered_name: Procidis + real: false + image: null + - id: 432 + name: Kachidoki Studio + filtered_name: Kachidoki + real: false + image: null + - id: 434 + name: Synergy Japan + filtered_name: Synergy Japan + real: false + image: null + - id: 2414 + name: MontBlanc Pictures + filtered_name: MontBlanc Pictures + real: false + image: null + - id: 418 + name: Studio Gokumi + filtered_name: Gokumi + real: true + image: /system/studios/original/418.jpg?1311292712 + - id: 435 + name: Studio Zero + filtered_name: Zero + real: false + image: null + - id: 436 + name: AIC Build + filtered_name: AIC Build + real: false + image: null + - id: 2819 + name: soket + filtered_name: soket + real: false + image: null + - id: 438 + name: Studio Signal + filtered_name: Signal + real: false + image: null + - id: 440 + name: Studio Kuma + filtered_name: Kuma + real: false + image: null + - id: 3116 + name: ame pippin + filtered_name: ame pippin + real: false + image: null + - id: 442 + name: Minami Machi Bugyousho + filtered_name: Minami Machi Bugyousho + real: false + image: /system/studios/original/442.jpg?1311292713 + - id: 444 + name: Jinnis Animation Studios + filtered_name: Jinnis Animation + real: false + image: null + - id: 445 + name: Bliss Pictures + filtered_name: Bliss Pictures + real: false + image: null + - id: 446 + name: RTHK + filtered_name: RTHK + real: false + image: null + - id: 447 + name: Hero Communication + filtered_name: Hero Communication + real: false + image: null + - id: 448 + name: Postgal Workshop + filtered_name: Postgal Workshop + real: false + image: null + - id: 449 + name: Maikaze + filtered_name: Maikaze + real: false + image: null + - id: 501 + name: Miramax Films + filtered_name: Miramax Films + real: false + image: null + - id: 2415 + name: HuaMei Animation + filtered_name: HuaMei + real: false + image: null + - id: 2417 + name: TiMi Studio Group + filtered_name: TiMi Studio Group + real: false + image: null + - id: 451 + name: Cookie Jar Entertainment + filtered_name: Cookie Jar + real: false + image: null + - id: 457 + name: Venet + filtered_name: Venet + real: false + image: null + - id: 458 + name: Beijing Sharaku Art Co. + filtered_name: Beijing Sharaku Art Co. + real: false + image: null + - id: 561 + name: U/M/A/A Inc. + filtered_name: U/M/A/A Inc. + real: false + image: null + - id: 563 + name: LandQ studios + filtered_name: LandQ + real: false + image: null + - id: 459 + name: Nitroplus + filtered_name: Nitroplus + real: false + image: /system/studios/original/459.gif?1311292712 + - id: 460 + name: The Klock Worx + filtered_name: The Klock Worx + real: false + image: /system/studios/original/460.jpg?1378062144 + - id: 461 + name: OLE-M + filtered_name: OLE-M + real: false + image: null + - id: 462 + name: Chaos Project + filtered_name: Chaos Project + real: false + image: null + - id: 463 + name: M.S.C + filtered_name: M.S.C + real: false + image: /system/studios/original/463.jpg?1311292714 + - id: 464 + name: flying DOG + filtered_name: flying DOG + real: false + image: /system/studios/original/464.jpg?1311292712 + - id: 465 + name: Hasbro + filtered_name: Hasbro + real: false + image: null + - id: 466 + name: Digital Media Lab + filtered_name: Digital Media Lab + real: false + image: /system/studios/original/466.jpg?1311292714 + - id: 467 + name: Discotek + filtered_name: Discotek + real: false + image: null + - id: 468 + name: Nihon Falcom + filtered_name: Nihon Falcom + real: false + image: /system/studios/original/468.gif?1311292713 + - id: 469 + name: ING + filtered_name: ING + real: false + image: null + - id: 437 + name: Kamikaze Douga + filtered_name: Kamikaze Douga + real: true + image: /system/studios/original/437.?1521917123 + - id: 439 + name: Project No.9 + filtered_name: Project No.9 + real: true + image: /system/studios/original/439.png?1500210282 + - id: 470 + name: GAGA Communications + filtered_name: GAGA Communications + real: false + image: /system/studios/original/470.jpg?1312165074 + - id: 473 + name: Ascension + filtered_name: Ascension + real: false + image: null + - id: 474 + name: Shogakukan Music & Digital Entertainment + filtered_name: Shogakukan Music & Digital + real: false + image: /system/studios/original/474.jpg?1312165067 + - id: 475 + name: Ishikawa Pro + filtered_name: Ishikawa Pro + real: false + image: null + - id: 476 + name: The Berich + filtered_name: The Berich + real: false + image: null + - id: 477 + name: Kino Production + filtered_name: Kino + real: false + image: /system/studios/original/477.jpg?1311292712 + - id: 2453 + name: Kusama Art + filtered_name: Kusama Art + real: false + image: null + - id: 479 + name: DOGA Productions + filtered_name: DOGA + real: false + image: null + - id: 480 + name: Tokyo TV + filtered_name: Tokyo TV + real: false + image: null + - id: 481 + name: Office Take Off + filtered_name: Office Take Off + real: false + image: null + - id: 482 + name: Automatic Flowers Studio + filtered_name: Automatic Flowers + real: false + image: null + - id: 483 + name: Marvel Entertainment + filtered_name: Marvel + real: false + image: null + - id: 484 + name: TOKYOPOP + filtered_name: TOKYOPOP + real: false + image: null + - id: 485 + name: Shinwon Productions + filtered_name: Shinwon + real: false + image: null + - id: 487 + name: Studio MWP + filtered_name: MWP + real: false + image: null + - id: 488 + name: Anchor Bay Films + filtered_name: Anchor Bay Films + real: false + image: null + - id: 489 + name: TCJ + filtered_name: TCJ + real: false + image: null + - id: 490 + name: Maiden Japan + filtered_name: Maiden Japan + real: false + image: null + - id: 491 + name: Byakuya Shobo + filtered_name: Byakuya Shobo + real: false + image: null + - id: 492 + name: Horannabi + filtered_name: Horannabi + real: false + image: null + - id: 493 + name: Aniplex of America + filtered_name: Aniplex of America + real: false + image: null + - id: 494 + name: Studio Take Off + filtered_name: Take Off + real: false + image: null + - id: 495 + name: Moonstone Cherry + filtered_name: Moonstone Cherry + real: false + image: null + - id: 497 + name: Studio Gram + filtered_name: Gram + real: false + image: null + - id: 499 + name: The Pokemon Company International + filtered_name: The Pokemon Company International + real: false + image: null + - id: 2482 + name: Atti Production + filtered_name: Atti + real: false + image: null + - id: 2456 + name: team Yamahitsuji + filtered_name: team Yamahitsuji + real: false + image: null + - id: 471 + name: Shanghai Animation Film Studio + filtered_name: Shanghai Animation Film + real: false + image: /system/studios/original/471.png?1636032282 + - id: 2503 + name: 7doc + filtered_name: 7doc + real: false + image: null + - id: 2520 + name: Twilight Town + filtered_name: Twilight Town + real: false + image: null + - id: 2382 + name: J.T.P.P. + filtered_name: J.T.P.P. + real: false + image: null + - id: 2481 + name: Chimu Jika Hatsuden + filtered_name: Chimu Jika Hatsuden + real: false + image: null + - id: 2538 + name: Imagestone Inc. + filtered_name: Imagestone Inc. + real: false + image: null + - id: 453 + name: Tsuburaya Productions + filtered_name: Tsuburaya + real: false + image: null + - id: 505 + name: Nintendo of America + filtered_name: Nintendo of America + real: false + image: null + - id: 507 + name: Universal Studios + filtered_name: Universal + real: false + image: null + - id: 509 + name: Fuji Video + filtered_name: Fuji Video + real: false + image: null + - id: 511 + name: Wonder Kids + filtered_name: Wonder Kids + real: false + image: null + - id: 515 + name: Fairy Dust + filtered_name: Fairy Dust + real: false + image: null + - id: 519 + name: Collaboration Works + filtered_name: Collaboration Works + real: false + image: null + - id: 521 + name: Anpro + filtered_name: Anpro + real: false + image: null + - id: 523 + name: SBS TV Production + filtered_name: SBS TV + real: false + image: null + - id: 525 + name: KAGAYA Studio + filtered_name: KAGAYA + real: false + image: null + - id: 527 + name: Higa Brothers Production + filtered_name: Higa Brothers + real: false + image: null + - id: 529 + name: Lapis + filtered_name: Lapis + real: false + image: null + - id: 531 + name: Elevenarts + filtered_name: Elevenarts + real: false + image: null + - id: 533 + name: N&G Production + filtered_name: N&G + real: false + image: null + - id: 537 + name: SANZIGEN + filtered_name: SANZIGEN + real: false + image: /system/studios/original/537.?1369837212 + - id: 539 + name: Ultra Super Pictures + filtered_name: Ultra Super Pictures + real: false + image: /system/studios/original/539.jpg?1382873182 + - id: 2418 + name: Imagica Digitalscape + filtered_name: Imagica Digitalscape + real: false + image: null + - id: 543 + name: Studio Saki Makura + filtered_name: Saki Makura + real: false + image: null + - id: 545 + name: Studio Deva Loka + filtered_name: Deva Loka + real: false + image: null + - id: 547 + name: Hobby Japan + filtered_name: Hobby Japan + real: false + image: null + - id: 549 + name: StudioRF Inc. + filtered_name: StudioRF Inc. + real: false + image: null + - id: 551 + name: Crossphere + filtered_name: Crossphere + real: false + image: null + - id: 553 + name: Marvy Jack + filtered_name: Marvy Jack + real: false + image: null + - id: 2891 + name: A4A Inc. + filtered_name: A4A Inc. + real: false + image: null + - id: 571 + name: Obtain Future + filtered_name: Obtain Future + real: false + image: null + - id: 573 + name: JapanAnime + filtered_name: JapanAnime + real: false + image: null + - id: 575 + name: Katsudou-manga-kan + filtered_name: Katsudou-manga-kan + real: false + image: null + - id: 579 + name: AT-2 + filtered_name: AT-2 + real: false + image: null + - id: 2429 + name: STUDIO6'oN + filtered_name: STUDIO6'oN + real: false + image: null + - id: 583 + name: Annapuru + filtered_name: Annapuru + real: false + image: null + - id: 585 + name: Arplants + filtered_name: Arplants + real: false + image: null + - id: 2347 + name: IKK Room + filtered_name: IKK Room + real: false + image: null + - id: 589 + name: Academy Productions + filtered_name: Academy + real: false + image: null + - id: 591 + name: Romanov Films + filtered_name: Romanov Films + real: false + image: null + - id: 593 + name: Egg + filtered_name: Egg + real: false + image: null + - id: 595 + name: NYAV Post + filtered_name: NYAV Post + real: false + image: null + - id: 603 + name: CLOCKUP + filtered_name: CLOCKUP + real: false + image: null + - id: 605 + name: C2C + filtered_name: C2C + real: false + image: /system/studios/original/605.jpg?1389993046 + - id: 607 + name: RAMS + filtered_name: RAMS + real: false + image: null + - id: 611 + name: Sakura Production + filtered_name: Sakura + real: false + image: null + - id: 613 + name: Jormungand Production Partners + filtered_name: Jormungand Production Partners + real: false + image: null + - id: 615 + name: Dream Creation + filtered_name: Dream Creation + real: false + image: null + - id: 617 + name: Azumanga Daioh Production Committee + filtered_name: Azumanga Daioh Production Committee + real: false + image: null + - id: 619 + name: Cospa + filtered_name: Cospa + real: false + image: null + - id: 621 + name: SoftBank Creative Corp. + filtered_name: SoftBank Creative Corp. + real: false + image: null + - id: 623 + name: Kimi To Boku Production Partners + filtered_name: Kimi To Boku Production Partners + real: false + image: null + - id: 625 + name: H.O.T.D Production Committee + filtered_name: H.O.T.D Production Committee + real: false + image: null + - id: 627 + name: Madoka Partners + filtered_name: Madoka Partners + real: false + image: null + - id: 629 + name: Studio Sign + filtered_name: Sign + real: false + image: null + - id: 631 + name: Acchi Kocchi Production Committee + filtered_name: Acchi Kocchi Production Committee + real: false + image: null + - id: 633 + name: Tasogare Otome×Amnesia Production Partners + filtered_name: Tasogare Otome×Amnesia Production Partners + real: false + image: null + - id: 635 + name: Saki Achiga-hen Production Committee + filtered_name: Saki Achiga-hen Production Committee + real: false + image: null + - id: 637 + name: Möbius Tone + filtered_name: Möbius Tone + real: false + image: null + - id: 639 + name: Hiiro No Kakera Production Committee + filtered_name: Hiiro No Kakera Production Committee + real: false + image: null + - id: 641 + name: Japan Aerospace Exploration Agency + filtered_name: Japan Aerospace Exploration Agency + real: false + image: null + - id: 643 + name: Trinity Sound + filtered_name: Trinity Sound + real: false + image: null + - id: 645 + name: Audio Highs + filtered_name: Audio Highs + real: false + image: null + - id: 647 + name: Memory-Tech + filtered_name: Memory-Tech + real: false + image: null + - id: 649 + name: Hanokiwa Academy Student Council + filtered_name: Hanokiwa Academy Student Council + real: false + image: null + - id: 651 + name: Sengoku Collection Production Committee + filtered_name: Sengoku Collection Production Committee + real: false + image: null + - id: 653 + name: tsuritama partners + filtered_name: tsuritama partners + real: false + image: null + - id: 655 + name: Volks + filtered_name: Volks + real: false + image: null + - id: 657 + name: Lucky Paradise + filtered_name: Lucky Paradise + real: false + image: null + - id: 659 + name: AKB0048 Production Committee + filtered_name: AKB0048 Production Committee + real: false + image: null + - id: 661 + name: Right Gauge + filtered_name: Right Gauge + real: false + image: null + - id: 663 + name: Dwango Music Entertainment + filtered_name: Dwango Music + real: false + image: null + - id: 665 + name: chara-ani.com + filtered_name: chara-ani.com + real: false + image: null + - id: 667 + name: AC Create + filtered_name: AC Create + real: false + image: null + - id: 669 + name: My Melody Production Committee + filtered_name: My Melody Production Committee + real: false + image: null + - id: 675 + name: Yomiuri Advertising + filtered_name: Yomiuri Advertising + real: false + image: null + - id: 677 + name: Nexon + filtered_name: Nexon + real: false + image: null + - id: 681 + name: ASCII Media Works + filtered_name: ASCII Media Works + real: false + image: null + - id: 683 + name: Astarotte no Omocha! Production Committee + filtered_name: Astarotte no Omocha! Production Committee + real: false + image: null + - id: 685 + name: Kadokawa Contents Gate + filtered_name: Kadokawa Contents Gate + real: false + image: null + - id: 687 + name: Bandai Namco Live Creative + filtered_name: Bandai Namco Live Creative + real: false + image: null + - id: 689 + name: NTT Docomo + filtered_name: NTT Docomo + real: false + image: null + - id: 691 + name: 501st JOINT FIGHTER WING + filtered_name: 501st JOINT FIGHTER WING + real: false + image: null + - id: 693 + name: BS-TBS + filtered_name: BS-TBS + real: false + image: null + - id: 695 + name: Sankarea Production Committee + filtered_name: Sankarea Production Committee + real: false + image: null + - id: 2493 + name: Studio B&M + filtered_name: B&M + real: false + image: null + - id: 697 + name: Natsuiro Kiseki Production Partners + filtered_name: Natsuiro Kiseki Production Partners + real: false + image: null + - id: 699 + name: feng + filtered_name: feng + real: false + image: null + - id: 701 + name: seikaisha + filtered_name: seikaisha + real: false + image: null + - id: 703 + name: Notes + filtered_name: Notes + real: false + image: null + - id: 705 + name: Project Railgun + filtered_name: Project Railgun + real: false + image: null + - id: 707 + name: TMS-Kyokuchi + filtered_name: TMS-Kyokuchi + real: false + image: null + - id: 709 + name: PPP + filtered_name: PPP + real: false + image: null + - id: 711 + name: Delphi Sound + filtered_name: Delphi Sound + real: false + image: null + - id: 713 + name: 12 Diary Holders + filtered_name: 12 Diary Holders + real: false + image: null + - id: 715 + name: Dwango + filtered_name: Dwango + real: false + image: null + - id: 717 + name: TV Tokyo Music + filtered_name: TV Tokyo Music + real: false + image: null + - id: 719 + name: Studio Mausu + filtered_name: Mausu + real: false + image: null + - id: 721 + name: GANSIS + filtered_name: GANSIS + real: false + image: null + - id: 723 + name: Hotline + filtered_name: Hotline + real: false + image: null + - id: 725 + name: Hatsukoi Limited Production Committee + filtered_name: Hatsukoi Limited Production Committee + real: false + image: null + - id: 727 + name: Kiyosumi High School Mahjong Club + filtered_name: Kiyosumi High School Mahjong Club + real: false + image: null + - id: 729 + name: Raku High Student Council + filtered_name: Raku High Student Council + real: false + image: null + - id: 731 + name: Inu x Boku SS Production Partners + filtered_name: Inu x Boku SS Production Partners + real: false + image: null + - id: 733 + name: Viki + filtered_name: Viki + real: false + image: null + - id: 735 + name: Slowcurve + filtered_name: Slowcurve + real: false + image: null + - id: 737 + name: Sony Music Communications + filtered_name: Sony Music Communications + real: false + image: null + - id: 739 + name: Project IS + filtered_name: Project IS + real: false + image: null + - id: 741 + name: Toshiba Entertainment + filtered_name: Toshiba + real: false + image: null + - id: 743 + name: Project Eureka AO + filtered_name: Project Eureka AO + real: false + image: null + - id: 745 + name: Cosmic Ray + filtered_name: Cosmic Ray + real: false + image: null + - id: 747 + name: Apollon + filtered_name: Apollon + real: false + image: null + - id: 749 + name: Pony Canyon Enterprises + filtered_name: Pony Canyon Enterprises + real: false + image: null + - id: 751 + name: Marvelous AQL + filtered_name: Marvelous AQL + real: false + image: null + - id: 753 + name: PRA + filtered_name: PRA + real: false + image: null + - id: 757 + name: Sony Music Entertainment + filtered_name: Sony Music + real: false + image: null + - id: 759 + name: Eye Move + filtered_name: Eye Move + real: false + image: null + - id: 761 + name: Sunny Side Up + filtered_name: Sunny Side Up + real: false + image: null + - id: 763 + name: Miracle Robo + filtered_name: Miracle Robo + real: false + image: null + - id: 765 + name: Sakura Create + filtered_name: Sakura Create + real: false + image: null + - id: 767 + name: Majin + filtered_name: Majin + real: false + image: null + - id: 769 + name: Fuji Pacific Music Publishing + filtered_name: Fuji Pacific Music Publishing + real: false + image: null + - id: 771 + name: Kyokuichi Tokyo Movie Shinsha + filtered_name: Kyokuichi Tokyo Movie Shinsha + real: false + image: null + - id: 773 + name: Peter Pan Creation + filtered_name: Peter Pan Creation + real: false + image: null + - id: 775 + name: Bushiroad Inc. + filtered_name: Bushiroad Inc. + real: false + image: null + - id: 777 + name: Showgate + filtered_name: Showgate + real: false + image: null + - id: 779 + name: AMG MUSIC + filtered_name: AMG MUSIC + real: false + image: null + - id: 781 + name: Studio NOA + filtered_name: NOA + real: false + image: null + - id: 783 + name: GKids + filtered_name: GKids + real: false + image: null + - id: 785 + name: Advance Syakujii + filtered_name: Advance Syakujii + real: false + image: null + - id: 787 + name: Happinet Pictures + filtered_name: Happinet Pictures + real: false + image: null + - id: 789 + name: BIGLOBE + filtered_name: BIGLOBE + real: false + image: null + - id: 791 + name: Dentsu Entertainment USA + filtered_name: Dentsu Entertainment USA + real: false + image: null + - id: 793 + name: Glams + filtered_name: Glams + real: false + image: null + - id: 795 + name: Yahoo! Japan + filtered_name: Yahoo! Japan + real: false + image: null + - id: 797 + name: Hobunsha + filtered_name: Hobunsha + real: false + image: null + - id: 799 + name: indigo line + filtered_name: indigo line + real: false + image: null + - id: 2374 + name: Momoi Planning + filtered_name: Momoi Planning + real: false + image: null + - id: 805 + name: AIC Frontier + filtered_name: AIC Frontier + real: false + image: null + - id: 807 + name: Po10tial + filtered_name: Po10tial + real: false + image: null + - id: 811 + name: Hang Zhou StarQ + filtered_name: Hang Zhou StarQ + real: false + image: null + - id: 813 + name: SoftCel Pictures + filtered_name: SoftCel Pictures + real: false + image: null + - id: 815 + name: EMI + filtered_name: EMI + real: false + image: null + - id: 817 + name: WField + filtered_name: WField + real: false + image: null + - id: 819 + name: Next Media Animation + filtered_name: Next Media + real: false + image: null + - id: 821 + name: Cotton Doll + filtered_name: Cotton Doll + real: false + image: null + - id: 803 + name: Trigger + filtered_name: Trigger + real: true + image: /system/studios/original/803.png?1356241771 + - id: 823 + name: Lune Pictures + filtered_name: Lune Pictures + real: false + image: null + - id: 827 + name: Amber Film Works + filtered_name: Amber Film Works + real: false + image: null + - id: 755 + name: Jumondou + filtered_name: Jumondou + real: false + image: null + - id: 829 + name: Studio Jack + filtered_name: Jack + real: false + image: null + - id: 831 + name: Otogi Production + filtered_name: Otogi + real: false + image: null + - id: 833 + name: Kyotoma + filtered_name: Kyotoma + real: false + image: null + - id: 835 + name: UNLIMITED Partners + filtered_name: UNLIMITED Partners + real: false + image: null + - id: 837 + name: Saki Zenkoku-hen Production Committee + filtered_name: Saki Zenkoku-hen Production Committee + real: false + image: null + - id: 841 + name: Saban Entertainment + filtered_name: Saban + real: false + image: null + - id: 843 + name: BS Fuji + filtered_name: BS Fuji + real: false + image: null + - id: 845 + name: Project No Name + filtered_name: Project No Name + real: false + image: null + - id: 847 + name: Senran Kagura Partners + filtered_name: Senran Kagura Partners + real: false + image: null + - id: 848 + name: Kazami Gakuen Koushiki Douga-bu + filtered_name: Kazami Gakuen Koushiki Douga-bu + real: false + image: null + - id: 850 + name: Kenji Studio + filtered_name: Kenji + real: false + image: null + - id: 854 + name: Solid Vox + filtered_name: Solid Vox + real: false + image: null + - id: 856 + name: Charaction + filtered_name: Charaction + real: false + image: null + - id: 860 + name: Triple X + filtered_name: Triple X + real: false + image: null + - id: 2541 + name: SAMG Entertainment + filtered_name: SAMG + real: false + image: null + - id: 868 + name: Devil Survivor 2 Animation Committee + filtered_name: Devil Survivor 2 Animation Committee + real: false + image: null + - id: 870 + name: Index + filtered_name: Index + real: false + image: null + - id: 872 + name: Shingeki no Kyojin Team + filtered_name: Shingeki no Kyojin Team + real: false + image: null + - id: 874 + name: Flex Comics + filtered_name: Flex Comics + real: false + image: null + - id: 876 + name: G-mode + filtered_name: G-mode + real: false + image: null + - id: 878 + name: An DerCen + filtered_name: An DerCen + real: false + image: null + - id: 880 + name: gimik + filtered_name: gimik + real: false + image: null + - id: 882 + name: Toranoana + filtered_name: Toranoana + real: false + image: null + - id: 884 + name: Strawberry Meets Pictures + filtered_name: Strawberry Meets Pictures + real: false + image: null + - id: 886 + name: Cinema Tohoku + filtered_name: Cinema Tohoku + real: false + image: null + - id: 890 + name: Karaku + filtered_name: Karaku + real: false + image: null + - id: 892 + name: NOTTV + filtered_name: NOTTV + real: false + image: null + - id: 2389 + name: G.P Entertainment + filtered_name: G.P + real: false + image: null + - id: 899 + name: Tokyo Animation Film + filtered_name: Tokyo Animation Film + real: false + image: null + - id: 901 + name: Tsubasa Entertainment + filtered_name: Tsubasa + real: false + image: null + - id: 903 + name: Studio Zealot + filtered_name: Zealot + real: false + image: null + - id: 905 + name: Tokuma Japan + filtered_name: Tokuma Japan + real: false + image: null + - id: 907 + name: AYCO + filtered_name: AYCO + real: false + image: null + - id: 898 + name: I.Gzwei + filtered_name: I.Gzwei + real: false + image: null + - id: 909 + name: Studio Kelmadick + filtered_name: Kelmadick + real: false + image: null + - id: 913 + name: Ryukyu Asahi Broadcasting + filtered_name: Ryukyu Asahi Broadcasting + real: false + image: null + - id: 917 + name: Takahashi Studio + filtered_name: Takahashi + real: false + image: null + - id: 919 + name: Ankama + filtered_name: Ankama + real: false + image: null + - id: 921 + name: Dynamic Planning + filtered_name: Dynamic Planning + real: false + image: null + - id: 923 + name: CyberStep + filtered_name: CyberStep + real: false + image: null + - id: 925 + name: Earth Star Entertainment + filtered_name: Earth Star + real: false + image: /system/studios/original/925.?1436214052 + - id: 927 + name: Dibetagurashi Production Committee + filtered_name: Dibetagurashi Production Committee + real: false + image: null + - id: 929 + name: Animation Do + filtered_name: Do + real: false + image: null + - id: 931 + name: Poncotan + filtered_name: Poncotan + real: false + image: null + - id: 933 + name: Carp Studio + filtered_name: Carp + real: false + image: null + - id: 935 + name: NHK-BS1 + filtered_name: NHK-BS1 + real: false + image: null + - id: 937 + name: Studio Kaab + filtered_name: Kaab + real: false + image: null + - id: 939 + name: Tama Production + filtered_name: Tama + real: false + image: null + - id: 941 + name: Iwatobi High School Swimming Club + filtered_name: Iwatobi High School Swimming Club + real: false + image: null + - id: 943 + name: Koichi Kikuchi + filtered_name: Koichi Kikuchi + real: false + image: null + - id: 2348 + name: KKC Animation Production + filtered_name: KKC Animation + real: false + image: null + - id: 947 + name: Manga Entertainment + filtered_name: Manga + real: false + image: null + - id: 949 + name: teamKG + filtered_name: teamKG + real: false + image: null + - id: 953 + name: Soft on Demand + filtered_name: Soft on Demand + real: false + image: null + - id: 955 + name: Watamote Production Committee + filtered_name: Watamote Production Committee + real: false + image: null + - id: 959 + name: Studio Compile + filtered_name: Compile + real: false + image: null + - id: 961 + name: Baramiri + filtered_name: Baramiri + real: false + image: null + - id: 963 + name: Mages + filtered_name: Mages + real: false + image: null + - id: 965 + name: Crimson Star Media + filtered_name: Crimson Star Media + real: false + image: null + - id: 967 + name: Pupa Production Committee + filtered_name: Pupa Production Committee + real: false + image: null + - id: 969 + name: Uchouten Kazoku Production Committee + filtered_name: Uchouten Kazoku Production Committee + real: false + image: null + - id: 971 + name: Anime R + filtered_name: Anime R + real: false + image: null + - id: 973 + name: Studio Liberty + filtered_name: Liberty + real: false + image: null + - id: 975 + name: Angelfish + filtered_name: Angelfish + real: false + image: null + - id: 2508 + name: Deck + filtered_name: Deck + real: false + image: null + - id: 979 + name: SPEED + filtered_name: SPEED + real: false + image: null + - id: 981 + name: BOOTLEG + filtered_name: BOOTLEG + real: false + image: null + - id: 983 + name: Daiko + filtered_name: Daiko + real: false + image: null + - id: 985 + name: P Productions + filtered_name: P + real: false + image: null + - id: 987 + name: Creative Bridge + filtered_name: Creative Bridge + real: false + image: null + - id: 989 + name: Nihon Hoso Eigasha + filtered_name: Nihon Hoso Eigasha + real: false + image: null + - id: 3228 + name: Shou Fan Yu Shu Gongzuoshi + filtered_name: Shou Fan Yu Shu Gongzuoshi + real: false + image: null + - id: 993 + name: Tesagure! Production Committee + filtered_name: Tesagure! Production Committee + real: false + image: null + - id: 995 + name: Coamix + filtered_name: Coamix + real: false + image: null + - id: 997 + name: Maxell E-Cube + filtered_name: Maxell E-Cube + real: false + image: null + - id: 1001 + name: Kyodo Eiga + filtered_name: Kyodo Eiga + real: false + image: null + - id: 2416 + name: Kent House + filtered_name: Kent House + real: false + image: null + - id: 1005 + name: Oddjob + filtered_name: Oddjob + real: false + image: null + - id: 3319 + name: Yanchester + filtered_name: Yanchester + real: false + image: null + - id: 1013 + name: Opera House + filtered_name: Opera House + real: false + image: null + - id: 1015 + name: T.O Entertainment + filtered_name: T.O + real: false + image: null + - id: 1017 + name: Liverpool + filtered_name: Liverpool + real: false + image: null + - id: 1019 + name: Himeyuri Alumnae Incorporated Foundation + filtered_name: Himeyuri Alumnae Incorporated Foundation + real: false + image: null + - id: 1021 + name: ASIA Documentary Productions + filtered_name: ASIA Documentary + real: false + image: null + - id: 1027 + name: Milkshake + filtered_name: Milkshake + real: false + image: null + - id: 1029 + name: BeeWorks + filtered_name: BeeWorks + real: false + image: null + - id: 1031 + name: Universal Radio Studio + filtered_name: Universal Radio + real: false + image: null + - id: 1035 + name: Mikakunin de Shinkoukei Production Committee + filtered_name: Mikakunin de Shinkoukei Production Committee + real: false + image: null + - id: 1037 + name: Japan Vistec + filtered_name: Japan Vistec + real: false + image: null + - id: 1039 + name: DIVE II Entertainment + filtered_name: DIVE II + real: false + image: null + - id: 1041 + name: Ai Addiction + filtered_name: Ai Addiction + real: false + image: null + - id: 1043 + name: Benesse Corporation + filtered_name: Benesse Corporation + real: false + image: null + - id: 1047 + name: ZIZ + filtered_name: ZIZ + real: false + image: null + - id: 1049 + name: PoPoCo + filtered_name: PoPoCo + real: false + image: null + - id: 1053 + name: Production IMS + filtered_name: Production IMS + real: false + image: /system/studios/original/1053.jpg?1404514553 + - id: 1057 + name: Kyowa Film + filtered_name: Kyowa Film + real: false + image: null + - id: 1059 + name: Studio Nem + filtered_name: Nem + real: false + image: null + - id: 1061 + name: Project Team Eikyuu Kikan + filtered_name: Project Team Eikyuu Kikan + real: false + image: null + - id: 3230 + name: Juvenage + filtered_name: Juvenage + real: false + image: null + - id: 1065 + name: Public & Basic + filtered_name: Public & Basic + real: false + image: null + - id: 1067 + name: Rising Force + filtered_name: Rising Force + real: false + image: null + - id: 1071 + name: Studio Lotus + filtered_name: Lotus + real: false + image: null + - id: 1073 + name: Magic Lantern Film + filtered_name: Magic Lantern Film + real: false + image: null + - id: 1077 + name: MMDGP + filtered_name: MMDGP + real: false + image: null + - id: 1079 + name: 3xCube + filtered_name: 3xCube + real: false + image: null + - id: 1081 + name: ZERO-A + filtered_name: ZERO-A + real: false + image: null + - id: 1083 + name: Aikikaku Center + filtered_name: Aikikaku Center + real: false + image: null + - id: 1045 + name: Space Neko Company + filtered_name: Space Neko Company + real: false + image: null + - id: 1025 + name: Dongwoo A&E + filtered_name: Dongwoo A&E + real: false + image: null + - id: 1085 + name: Cosmos + filtered_name: Cosmos + real: false + image: null + - id: 1089 + name: Studio Zain + filtered_name: Zain + real: false + image: null + - id: 1093 + name: BreakBottle + filtered_name: BreakBottle + real: false + image: null + - id: 1097 + name: Namco Bandai Games + filtered_name: Namco Bandai Games + real: false + image: null + - id: 1101 + name: Lambert + filtered_name: Lambert + real: false + image: null + - id: 1103 + name: TROYCA + filtered_name: TROYCA + real: false + image: /system/studios/original/1103.?1446387663 + - id: 1105 + name: Gendai Production + filtered_name: Gendai + real: false + image: null + - id: 1107 + name: Rabbit Gate + filtered_name: Rabbit Gate + real: false + image: null + - id: 1115 + name: Studio Korumi + filtered_name: Korumi + real: false + image: null + - id: 1117 + name: 1st PLACE + filtered_name: 1st PLACE + real: false + image: null + - id: 1121 + name: Banpresto + filtered_name: Banpresto + real: false + image: null + - id: 1123 + name: Lucent Pictures Entertainment + filtered_name: Lucent Pictures + real: false + image: null + - id: 1125 + name: Tsubu Doll Production Committee + filtered_name: Tsubu Doll Production Committee + real: false + image: null + - id: 1131 + name: Zero-G Room + filtered_name: Zero-G Room + real: false + image: null + - id: 1133 + name: dwarf + filtered_name: dwarf + real: false + image: null + - id: 1135 + name: FOREST Hunting One + filtered_name: FOREST Hunting One + real: false + image: null + - id: 1137 + name: SEK Studios + filtered_name: SEK + real: false + image: null + - id: 1139 + name: BEAM Entertainment + filtered_name: BEAM + real: false + image: null + - id: 1143 + name: TOHO animation + filtered_name: TOHO + real: false + image: null + - id: 1147 + name: Shinano Kikaku + filtered_name: Shinano Kikaku + real: false + image: null + - id: 1149 + name: Studio Cab + filtered_name: Cab + real: false + image: null + - id: 1151 + name: Sanrio Digital + filtered_name: Sanrio Digital + real: false + image: null + - id: 1153 + name: Image Kei + filtered_name: Image Kei + real: false + image: null + - id: 1157 + name: Big Bang + filtered_name: Big Bang + real: false + image: null + - id: 1159 + name: King Bee + filtered_name: King Bee + real: false + image: null + - id: 1161 + name: Allure + filtered_name: Allure + real: false + image: null + - id: 1163 + name: Flatiron Film Company + filtered_name: Flatiron Film Company + real: false + image: null + - id: 2362 + name: Aiti St. + filtered_name: Aiti St. + real: false + image: null + - id: 1165 + name: Tri-Slash + filtered_name: Tri-Slash + real: false + image: null + - id: 1167 + name: Nikkatsu Mukojima + filtered_name: Nikkatsu Mukojima + real: false + image: null + - id: 1171 + name: Olive Studio + filtered_name: Olive + real: false + image: null + - id: 1175 + name: Atelier Musa + filtered_name: Atelier Musa + real: false + image: null + - id: 1177 + name: ' Geijutsu Eigasha' + filtered_name: ' Geijutsu Eigasha' + real: false + image: null + - id: 1179 + name: MK Pictures + filtered_name: MK Pictures + real: false + image: null + - id: 1183 + name: E&G Films + filtered_name: E&G Films + real: false + image: null + - id: 1187 + name: Ripple Film + filtered_name: Ripple Film + real: false + image: null + - id: 1191 + name: Azeta Pictures + filtered_name: Azeta Pictures + real: false + image: null + - id: 1193 + name: MooGoo + filtered_name: MooGoo + real: false + image: null + - id: 1195 + name: Creators in Pack + filtered_name: Creators in Pack + real: false + image: null + - id: 1199 + name: L. + filtered_name: L. + real: false + image: null + - id: 1201 + name: Ponycan USA + filtered_name: Ponycan USA + real: false + image: null + - id: 1203 + name: Studio 1st + filtered_name: 1st + real: false + image: null + - id: 1205 + name: Answer Studio + filtered_name: Answer + real: false + image: null + - id: 1207 + name: Comic Umenohone + filtered_name: Comic Umenohone + real: false + image: null + - id: 1211 + name: Tokyo MX + filtered_name: Tokyo MX + real: false + image: null + - id: 1213 + name: Mobcast + filtered_name: Mobcast + real: false + image: null + - id: 1215 + name: Daiichi Kosho Co. + filtered_name: Daiichi Kosho Co. + real: false + image: null + - id: 1217 + name: HeART-BIT + filtered_name: HeART-BIT + real: false + image: null + - id: 1223 + name: Teichiku Entertainment + filtered_name: Teichiku + real: false + image: null + - id: 1225 + name: Age Global Networks + filtered_name: Age Global Networks + real: false + image: null + - id: 1055 + name: Yamamura Animation + filtered_name: Yamamura + real: false + image: null + - id: 1227 + name: Studio GDW + filtered_name: GDW + real: false + image: null + - id: 1231 + name: OLM Digital + filtered_name: OLM Digital + real: false + image: null + - id: 1233 + name: Bandai Namco Games + filtered_name: Bandai Namco Games + real: false + image: null + - id: 1235 + name: I was a Ballerina + filtered_name: I was a Ballerina + real: false + image: null + - id: 1237 + name: Millepensee + filtered_name: Millepensee + real: false + image: /system/studios/original/1237.png?1515415404 + - id: 1239 + name: KeyEast + filtered_name: KeyEast + real: false + image: null + - id: 1241 + name: Evil Line Records + filtered_name: Evil Line Records + real: false + image: null + - id: 1242 + name: Sakura Color Film + filtered_name: Sakura Color Film + real: false + image: null + - id: 1243 + name: AniMan + filtered_name: AniMan + real: false + image: null + - id: 1173 + name: Studio Dadashow + filtered_name: Dadashow + real: false + image: /system/studios/original/1173.png?1619360325 + - id: 1246 + name: AIR AGENCY + filtered_name: AIR AGENCY + real: false + image: null + - id: 1247 + name: Mistral Japan + filtered_name: Mistral Japan + real: false + image: null + - id: 1189 + name: Sola Digital Arts + filtered_name: Sola Digital Arts + real: false + image: /system/studios/original/1189.jpg?1622293352 + - id: 1249 + name: Mirai Film + filtered_name: Mirai Film + real: false + image: null + - id: 1250 + name: The National Film Center Japan + filtered_name: The National Film Center Japan + real: false + image: null + - id: 1251 + name: Dentsu Eigasha Tokyo + filtered_name: Dentsu Eigasha Tokyo + real: false + image: null + - id: 1252 + name: Studio Binzo + filtered_name: Binzo + real: false + image: null + - id: 1253 + name: Studio GOONEYS + filtered_name: GOONEYS + real: false + image: null + - id: 1254 + name: Grooove + filtered_name: Grooove + real: false + image: null + - id: 1255 + name: Glovision + filtered_name: Glovision + real: false + image: null + - id: 1256 + name: Harappa + filtered_name: Harappa + real: false + image: null + - id: 1257 + name: A-Real + filtered_name: A-Real + real: false + image: null + - id: 2400 + name: Executive Decision + filtered_name: Executive Decision + real: false + image: null + - id: 1245 + name: ZIZ Entertainment (ZIZ) + filtered_name: ZIZ Entertainment (ZIZ) + real: false + image: null + - id: 1259 + name: Studio Curtain + filtered_name: Curtain + real: false + image: null + - id: 1260 + name: Nakamura Production + filtered_name: Nakamura + real: false + image: null + - id: 1261 + name: Good Smile Company + filtered_name: Good Smile Company + real: false + image: null + - id: 1263 + name: Dynamo Pictures + filtered_name: Dynamo Pictures + real: false + image: null + - id: 3093 + name: Sanjie Donghua + filtered_name: Sanjie Donghua + real: false + image: null + - id: 1266 + name: Studio! Cucuri + filtered_name: Studio! Cucuri + real: false + image: null + - id: 1267 + name: Tencent Comic + filtered_name: Tencent Comic + real: false + image: null + - id: 1269 + name: K-Factory + filtered_name: K-Factory + real: false + image: null + - id: 1270 + name: Sanctuary + filtered_name: Sanctuary + real: false + image: null + - id: 1271 + name: Assez Finaud Fabric + filtered_name: Assez Finaud Fabric + real: false + image: null + - id: 1273 + name: Osaka University of Arts + filtered_name: Osaka University of Arts + real: false + image: null + - id: 1277 + name: Imagica West + filtered_name: Imagica West + real: false + image: null + - id: 1279 + name: Buemon + filtered_name: Buemon + real: false + image: null + - id: 1280 + name: Media Castle + filtered_name: Media Castle + real: false + image: null + - id: 1281 + name: Office DCI + filtered_name: Office DCI + real: false + image: null + - id: 1282 + name: Arcturus + filtered_name: Arcturus + real: false + image: null + - id: 1283 + name: TC Entertainment + filtered_name: TC + real: false + image: null + - id: 1284 + name: Avex Pictures + filtered_name: Avex Pictures + real: false + image: null + - id: 1285 + name: Being + filtered_name: Being + real: false + image: null + - id: 1286 + name: 10Gauge + filtered_name: 10Gauge + real: false + image: null + - id: 1287 + name: Q-Tec + filtered_name: Q-Tec + real: false + image: null + - id: 1288 + name: Chrono Gear Creative + filtered_name: Chrono Gear Creative + real: false + image: null + - id: 1289 + name: F.M.F + filtered_name: F.M.F + real: false + image: null + - id: 1290 + name: Pollyanna Graphics + filtered_name: Pollyanna Graphics + real: false + image: null + - id: 1291 + name: KOO-KI + filtered_name: KOO-KI + real: false + image: null + - id: 1292 + name: TUBA + filtered_name: TUBA + real: false + image: null + - id: 1293 + name: 'Romantica club !! ' + filtered_name: 'Romantica club !! ' + real: false + image: null + - id: 1294 + name: Studio Don Juan + filtered_name: Don Juan + real: false + image: null + - id: 1296 + name: Marza Animation Planet + filtered_name: Marza Animation Planet + real: false + image: null + - id: 1300 + name: Office Nobu + filtered_name: Office Nobu + real: false + image: null + - id: 1302 + name: RoiVisual + filtered_name: RoiVisual + real: false + image: null + - id: 1303 + name: PansonWorks + filtered_name: PansonWorks + real: false + image: null + - id: 1304 + name: Qualia Animation + filtered_name: Qualia + real: false + image: null + - id: 1305 + name: Milestone Music Publishing + filtered_name: Milestone Music Publishing + real: false + image: null + - id: 1306 + name: AIC Classic + filtered_name: AIC Classic + real: false + image: null + - id: 1313 + name: Amuse + filtered_name: Amuse + real: false + image: null + - id: 1317 + name: Production GoodBook + filtered_name: Production GoodBook + real: false + image: null + - id: 1320 + name: Joker Films + filtered_name: Joker Films + real: false + image: null + - id: 1321 + name: Haoliners Animation + filtered_name: Haoliners + real: false + image: null + - id: 1324 + name: Shimogumi + filtered_name: Shimogumi + real: false + image: null + - id: 1328 + name: Decovocal + filtered_name: Decovocal + real: false + image: null + - id: 1372 + name: Soeishinsha + filtered_name: Soeishinsha + real: false + image: null + - id: 1348 + name: Sugar Boy + filtered_name: Sugar Boy + real: false + image: null + - id: 1351 + name: EDGE + filtered_name: EDGE + real: false + image: null + - id: 1353 + name: Issen + filtered_name: Issen + real: false + image: null + - id: 1360 + name: Hoods Drifters Studio + filtered_name: Hoods Drifters + real: false + image: null + - id: 1361 + name: Darts + filtered_name: Darts + real: false + image: null + - id: 1362 + name: Rabbit Machine + filtered_name: Rabbit Machine + real: false + image: null + - id: 1363 + name: Marine Entertainment + filtered_name: Marine + real: false + image: null + - id: 1365 + name: Shueisha + filtered_name: Shueisha + real: false + image: null + - id: 1368 + name: Kazuki Production + filtered_name: Kazuki + real: false + image: null + - id: 1369 + name: G-Lam + filtered_name: G-Lam + real: false + image: null + - id: 1370 + name: Sprite Animation Studios + filtered_name: Sprite Animation + real: false + image: null + - id: 1371 + name: T.P.O + filtered_name: T.P.O + real: false + image: null + - id: 1375 + name: Studio Jam + filtered_name: Jam + real: false + image: null + - id: 1380 + name: domerica + filtered_name: domerica + real: false + image: null + - id: 1382 + name: Piko Studio + filtered_name: Piko + real: false + image: null + - id: 1383 + name: Studio Live + filtered_name: Live + real: false + image: null + - id: 1385 + name: Blue Cat + filtered_name: Blue Cat + real: false + image: null + - id: 1387 + name: Neft Film + filtered_name: Neft Film + real: false + image: null + - id: 1396 + name: W-Toon Studio + filtered_name: W-Toon + real: false + image: null + - id: 3233 + name: Kio Studio + filtered_name: Kio + real: false + image: null + - id: 1419 + name: GARDEN LODGE + filtered_name: GARDEN LODGE + real: false + image: null + - id: 1421 + name: Takara Tomy A.R.T.S + filtered_name: Takara Tomy A.R.T.S + real: false + image: null + - id: 1433 + name: Ekura Animal + filtered_name: Ekura Animal + real: false + image: null + - id: 1435 + name: JCF + filtered_name: JCF + real: false + image: null + - id: 1437 + name: Ishimori Entertainment + filtered_name: Ishimori + real: false + image: null + - id: 1442 + name: Mook DLE + filtered_name: Mook DLE + real: false + image: null + - id: 1444 + name: Egg Firm + filtered_name: Egg Firm + real: false + image: null + - id: 1445 + name: Arcs Create + filtered_name: Arcs Create + real: false + image: null + - id: 1454 + name: REALTHING + filtered_name: REALTHING + real: false + image: null + - id: 1456 + name: Beijing Huihuang Animation Company + filtered_name: Beijing Huihuang Animation Company + real: false + image: null + - id: 1460 + name: Coastline Animation Studio + filtered_name: Coastline Animation + real: false + image: null + - id: 1258 + name: Bandai Namco Pictures + filtered_name: Bandai Namco Pictures + real: false + image: /system/studios/original/1258.png?1589293619 + - id: 1463 + name: Anime Antenna Iinkai + filtered_name: Anime Antenna Iinkai + real: false + image: null + - id: 1464 + name: Hiro Media + filtered_name: Hiro Media + real: false + image: null + - id: 1473 + name: Odolttogi + filtered_name: Odolttogi + real: false + image: null + - id: 1476 + name: Shochiku Animation Institute + filtered_name: Shochiku Animation Institute + real: false + image: null + - id: 1479 + name: Studio Core + filtered_name: Core + real: false + image: null + - id: 1482 + name: Bouncy + filtered_name: Bouncy + real: false + image: null + - id: 1489 + name: Ripromo + filtered_name: Ripromo + real: false + image: null + - id: 1504 + name: Studio Z5 + filtered_name: Z5 + real: false + image: null + - id: 1509 + name: Studio World + filtered_name: World + real: false + image: null + - id: 1513 + name: Dongyang Animation + filtered_name: Dongyang + real: false + image: null + - id: 1522 + name: Echoes + filtered_name: Echoes + real: false + image: null + - id: 1523 + name: Studio Ponoc + filtered_name: Ponoc + real: false + image: /system/studios/original/1523.png?1518985073 + - id: 1525 + name: Moss Design Unit + filtered_name: Moss Design Unit + real: false + image: null + - id: 1527 + name: Image House + filtered_name: Image House + real: false + image: null + - id: 1530 + name: Emon + filtered_name: Emon + real: false + image: null + - id: 1531 + name: Flavors Soft + filtered_name: Flavors Soft + real: false + image: null + - id: 1533 + name: Studio WHO + filtered_name: WHO + real: false + image: null + - id: 1536 + name: Namu Animation + filtered_name: Namu + real: false + image: null + - id: 1545 + name: Japan Taps + filtered_name: Japan Taps + real: false + image: null + - id: 1546 + name: Chippai + filtered_name: Chippai + real: false + image: null + - id: 1549 + name: Dai Nippon Printing + filtered_name: Dai Nippon Printing + real: false + image: null + - id: 1558 + name: TOCSIS + filtered_name: TOCSIS + real: false + image: null + - id: 1562 + name: Team YokkyuFuman + filtered_name: Team YokkyuFuman + real: false + image: null + - id: 1572 + name: XFLAG + filtered_name: XFLAG + real: false + image: null + - id: 1587 + name: Cygames + filtered_name: Cygames + real: false + image: null + - id: 1592 + name: Kamio Japan + filtered_name: Kamio Japan + real: false + image: null + - id: 1596 + name: Will Palette + filtered_name: Will Palette + real: false + image: null + - id: 1618 + name: Rockwell Eyes + filtered_name: Rockwell Eyes + real: false + image: null + - id: 1638 + name: Tsukimidou + filtered_name: Tsukimidou + real: false + image: null + - id: 1639 + name: Chiptune + filtered_name: Chiptune + real: false + image: null + - id: 1642 + name: Circle Tribute + filtered_name: Circle Tribute + real: false + image: null + - id: 2390 + name: Concept Films + filtered_name: Concept Films + real: false + image: null + - id: 1661 + name: drop + filtered_name: drop + real: false + image: null + - id: 1662 + name: Creators Dot Com + filtered_name: Creators Dot Com + real: false + image: null + - id: 1668 + name: Karasfilms + filtered_name: Karasfilms + real: false + image: null + - id: 1349 + name: Tencent Animation & Comics + filtered_name: Tencent Animation & Comics + real: false + image: null + - id: 1357 + name: Craftar Studios + filtered_name: Craftar + real: false + image: null + - id: 1593 + name: Success Corp. + filtered_name: Success Corp. + real: false + image: null + - id: 1436 + name: Stingray + filtered_name: Stingray + real: false + image: null + - id: 1514 + name: Tengu Kobo + filtered_name: Tengu Kobo + real: false + image: null + - id: 1512 + name: Dai-Ichi Douga + filtered_name: Dai-Ichi Douga + real: false + image: null + - id: 1670 + name: Nishiki Studio + filtered_name: Nishiki + real: false + image: null + - id: 1690 + name: Imagineer + filtered_name: Imagineer + real: false + image: null + - id: 1691 + name: Studio UGOKI + filtered_name: UGOKI + real: false + image: null + - id: 1693 + name: Studio Flad + filtered_name: Flad + real: false + image: null + - id: 1705 + name: Studio Khronos + filtered_name: Khronos + real: false + image: null + - id: 1706 + name: Beijing Rocen Digital + filtered_name: Beijing Rocen Digital + real: false + image: null + - id: 1717 + name: Onionskin + filtered_name: Onionskin + real: false + image: null + - id: 1723 + name: Anime Beans + filtered_name: Anime Beans + real: false + image: null + - id: 1724 + name: Studio OX + filtered_name: OX + real: false + image: null + - id: 1725 + name: Minakata Laboratory + filtered_name: Minakata Laboratory + real: false + image: null + - id: 1726 + name: Three-d + filtered_name: Three-d + real: false + image: null + - id: 1746 + name: Pops Inc. + filtered_name: Pops Inc. + real: false + image: null + - id: 1747 + name: Twin Engine + filtered_name: Twin Engine + real: false + image: null + - id: 1750 + name: Studio CA + filtered_name: CA + real: false + image: null + - id: 1751 + name: pH Studio + filtered_name: pH + real: false + image: null + - id: 1753 + name: D & D Pictures + filtered_name: D & D Pictures + real: false + image: null + - id: 1754 + name: Meruhensha + filtered_name: Meruhensha + real: false + image: null + - id: 1758 + name: Picante Circus + filtered_name: Picante Circus + real: false + image: null + - id: 3040 + name: Durandal + filtered_name: Durandal + real: false + image: null + - id: 1393 + name: Geno Studio + filtered_name: Geno + real: true + image: /system/studios/original/1393.png?1521917884 + - id: 1440 + name: Felix Film + filtered_name: Felix Film + real: true + image: /system/studios/original/1440.png?1521916608 + - id: 1760 + name: Suiseisha + filtered_name: Suiseisha + real: false + image: null + - id: 1762 + name: Piso Studio + filtered_name: Piso + real: false + image: null + - id: 1763 + name: Studio Nanahoshi + filtered_name: Nanahoshi + real: false + image: null + - id: 1766 + name: Husio Studio + filtered_name: Husio + real: false + image: null + - id: 1767 + name: iDRAGONS Creative Studio + filtered_name: iDRAGONS Creative + real: false + image: null + - id: 1769 + name: helo.inc + filtered_name: helo.inc + real: false + image: null + - id: 1770 + name: KIZAWA Studio + filtered_name: KIZAWA + real: false + image: null + - id: 1773 + name: KJJ Animation + filtered_name: KJJ + real: false + image: null + - id: 1794 + name: EKACHI EPILKA + filtered_name: EKACHI EPILKA + real: false + image: null + - id: 1771 + name: Pb Animation + filtered_name: Pb + real: false + image: null + - id: 1795 + name: CUCURI + filtered_name: CUCURI + real: false + image: null + - id: 1797 + name: NHK Enterprises + filtered_name: NHK Enterprises + real: false + image: null + - id: 1487 + name: Bouncy + filtered_name: Bouncy + real: false + image: null + - id: 1462 + name: B&T + filtered_name: B&T + real: false + image: null + - id: 1485 + name: Light Chaser Animation Studios + filtered_name: Light Chaser Animation + real: false + image: /system/studios/original/1485.png?1622293533 + - id: 1805 + name: Thundray + filtered_name: Thundray + real: false + image: null + - id: 1808 + name: CG Year + filtered_name: CG Year + real: false + image: null + - id: 1809 + name: October Media + filtered_name: October Media + real: false + image: null + - id: 1810 + name: Mili Pictures + filtered_name: Mili Pictures + real: false + image: null + - id: 1811 + name: Boyan Pictures + filtered_name: Boyan Pictures + real: false + image: null + - id: 1813 + name: Studio Lings + filtered_name: Lings + real: false + image: null + - id: 1814 + name: Studio Hakk + filtered_name: Hakk + real: false + image: null + - id: 1828 + name: Lapin Track + filtered_name: Lapin Track + real: false + image: null + - id: 1829 + name: Lesprit + filtered_name: Lesprit + real: false + image: null + - id: 1830 + name: Seven Stone Entertainment + filtered_name: Seven Stone + real: false + image: null + - id: 1832 + name: GRIZZLY + filtered_name: GRIZZLY + real: false + image: null + - id: 1836 + name: SELFISH + filtered_name: SELFISH + real: false + image: null + - id: 1837 + name: G-angle + filtered_name: G-angle + real: false + image: null + - id: 1838 + name: 33 Collective + filtered_name: 33 Collective + real: false + image: null + - id: 1839 + name: Studio Ppuri + filtered_name: Ppuri + real: false + image: null + - id: 1842 + name: Urban Product + filtered_name: Urban Product + real: false + image: null + - id: 1843 + name: TriF Studio + filtered_name: TriF + real: false + image: null + - id: 1844 + name: Shanghai Hippo Animation + filtered_name: Shanghai Hippo + real: false + image: null + - id: 1845 + name: Guton Animation Studio + filtered_name: Guton Animation + real: false + image: null + - id: 1846 + name: Tokyo Movie + filtered_name: Tokyo Movie + real: false + image: null + - id: 1847 + name: Square Enix Visual Works + filtered_name: Square Enix Visual Works + real: false + image: null + - id: 1849 + name: MASTER LIGHTS + filtered_name: MASTER LIGHTS + real: false + image: null + - id: 1851 + name: Jumonji + filtered_name: Jumonji + real: false + image: null + - id: 1853 + name: Saetta + filtered_name: Saetta + real: false + image: null + - id: 1854 + name: monofilmo + filtered_name: monofilmo + real: false + image: null + - id: 1860 + name: Magia Doraglier + filtered_name: Magia Doraglier + real: false + image: null + - id: 1861 + name: Animation Planet + filtered_name: Planet + real: false + image: null + - id: 1866 + name: Grom + filtered_name: Grom + real: false + image: null + - id: 1867 + name: Aurum Production + filtered_name: Aurum + real: false + image: null + - id: 1871 + name: Studio W.Baba + filtered_name: W.Baba + real: false + image: null + - id: 1872 + name: P.I.C.S. + filtered_name: P.I.C.S. + real: false + image: null + - id: 1873 + name: Silver + filtered_name: Silver + real: false + image: null + - id: 1879 + name: Dangun Pictures + filtered_name: Dangun Pictures + real: false + image: null + - id: 1882 + name: UWAN Pictures + filtered_name: UWAN Pictures + real: false + image: null + - id: 1887 + name: Brio Animation + filtered_name: Brio + real: false + image: null + - id: 1893 + name: CygamesPictures + filtered_name: CygamesPictures + real: false + image: null + - id: 1897 + name: Ankama Animations + filtered_name: Ankama Animations + real: false + image: null + - id: 1910 + name: Sega Interactive + filtered_name: Sega Interactive + real: false + image: null + - id: 1812 + name: Imagica Imageworks + filtered_name: Imagica Imageworks + real: false + image: null + - id: 2529 + name: Xing Yi Kai Chen + filtered_name: Xing Yi Kai Chen + real: false + image: null + - id: 1927 + name: Studio Crocodile + filtered_name: Crocodile + real: false + image: null + - id: 1932 + name: Speed Inc. + filtered_name: Speed Inc. + real: false + image: null + - id: 1934 + name: Saigo no Shudan + filtered_name: Saigo no Shudan + real: false + image: null + - id: 1936 + name: Liberty Animation Studio + filtered_name: Liberty Animation + real: false + image: null + - id: 1937 + name: MAT + filtered_name: MAT + real: false + image: null + - id: 1943 + name: Idol + filtered_name: Idol + real: false + image: null + - id: 1944 + name: Samsara Animation Studio + filtered_name: Samsara Animation + real: false + image: null + - id: 1945 + name: Lide + filtered_name: Lide + real: false + image: null + - id: 1947 + name: Kate Arrow + filtered_name: Kate Arrow + real: false + image: null + - id: 1949 + name: Anon Pictures + filtered_name: Anon Pictures + real: false + image: null + - id: 1951 + name: ANIDO FILM + filtered_name: ANIDO FILM + real: false + image: null + - id: 1952 + name: Animation Staff Room + filtered_name: Staff Room + real: false + image: null + - id: 1953 + name: W+K Tokyo + filtered_name: W+K Tokyo + real: false + image: null + - id: 1954 + name: Welz Animation Studios + filtered_name: Welz Animation + real: false + image: null + - id: 1960 + name: StoryRiders Co. Ltd. + filtered_name: StoryRiders Co. Ltd. + real: false + image: null + - id: 3232 + name: Left Pocket Studio + filtered_name: Left Pocket + real: false + image: null + - id: 1969 + name: V-sign + filtered_name: V-sign + real: false + image: null + - id: 1970 + name: Wolf Smoke Studio + filtered_name: Wolf Smoke + real: false + image: null + - id: 1971 + name: Gainax Kyoto + filtered_name: Gainax Kyoto + real: false + image: null + - id: 1972 + name: HOTZIPANG + filtered_name: HOTZIPANG + real: false + image: null + - id: 1973 + name: Monster's Egg + filtered_name: Monster's Egg + real: false + image: null + - id: 1979 + name: Suna Kouhou + filtered_name: Suna Kouhou + real: false + image: null + - id: 2401 + name: YURUPPE Inc. + filtered_name: YURUPPE Inc. + real: false + image: null + - id: 1983 + name: Anima&Co. + filtered_name: Anima&Co. + real: false + image: null + - id: 1967 + name: Drive + filtered_name: Drive + real: false + image: /system/studios/original/1967.png?1647108152 + - id: 1768 + name: Sparkly Key Animation Studio + filtered_name: Sparkly Key Animation + real: false + image: /system/studios/original/1768.png?1622293364 + - id: 1999 + name: Albacrow + filtered_name: Albacrow + real: false + image: null + - id: 2013 + name: Peak Hunt + filtered_name: Peak Hunt + real: false + image: null + - id: 1968 + name: Studio Hokiboshi + filtered_name: Hokiboshi + real: false + image: null + - id: 1890 + name: Tear Studio + filtered_name: Tear + real: false + image: /system/studios/original/1890.png?1589291799 + - id: 2032 + name: WHOPPERS + filtered_name: WHOPPERS + real: false + image: null + - id: 1774 + name: LAN Studio + filtered_name: LAN + real: false + image: null + - id: 1966 + name: Arch + filtered_name: Arch + real: false + image: null + - id: 2820 + name: maroyaka + filtered_name: maroyaka + real: false + image: null + - id: 2894 + name: Konami animation + filtered_name: Konami + real: false + image: null + - id: 2861 + name: KWANED + filtered_name: KWANED + real: false + image: null + - id: 2860 + name: CANOPUS + filtered_name: CANOPUS + real: false + image: null + - id: 2854 + name: Volca + filtered_name: Volca + real: false + image: null + - id: 1384 + name: CinePix + filtered_name: CinePix + real: false + image: null + - id: 3073 + name: Yasuda Genshou Studio by Xenotoon + filtered_name: Yasuda Genshou Studio by Xenotoon + real: false + image: null + - id: 333 + name: TYO Animations + filtered_name: TYO Animations + real: true + image: /system/studios/original/333.jpg?1312165071 + - id: 2540 + name: Fever Creations + filtered_name: Fever Creations + real: false + image: null + - id: 163 + name: asread. + filtered_name: asread. + real: false + image: /system/studios/original/163.jpg?1311292709 + - id: 1976 + name: CGCG Studio + filtered_name: CGCG + real: false + image: /system/studios/original/1976.png?1622293588 + - id: 2188 + name: Marone + filtered_name: Marone + real: false + image: null + - id: 2264 + name: 5 Inc. + filtered_name: 5 Inc. + real: false + image: null + - id: 2546 + name: Studio Sota + filtered_name: Sota + real: false + image: null + - id: 2547 + name: Frontier Engine + filtered_name: Frontier Engine + real: false + image: null + - id: 2530 + name: Blue bread + filtered_name: Blue bread + real: false + image: null + - id: 2454 + name: Ryuu M's + filtered_name: Ryuu M's + real: false + image: null + - id: 2489 + name: Tsubo Production + filtered_name: Tsubo + real: false + image: null + - id: 1864 + name: Ezόla + filtered_name: Ezόla + real: false + image: /system/studios/original/1864.png?1634761365 + - id: 1892 + name: Sublimation + filtered_name: Sublimation + real: false + image: /system/studios/original/1892.png?1634761710 + - id: 2525 + name: Hurray! + filtered_name: Hurray! + real: false + image: null + - id: 2549 + name: StudioXD + filtered_name: StudioXD + real: false + image: null + - id: 2550 + name: ONIRO + filtered_name: ONIRO + real: false + image: null + - id: 2534 + name: studio YOG + filtered_name: YOG + real: false + image: null + - id: 2471 + name: Wonder Cat Animation + filtered_name: Wonder Cat + real: false + image: null + - id: 2375 + name: GAV Video + filtered_name: GAV Video + real: false + image: null + - id: 2491 + name: Mikimoto Production + filtered_name: Mikimoto + real: false + image: null + - id: 2393 + name: MB planning + filtered_name: MB planning + real: false + image: null + - id: 2571 + name: Griot Groove + filtered_name: Griot Groove + real: false + image: null + - id: 3 + name: Gonzo + filtered_name: Gonzo + real: true + image: /system/studios/original/3.png?1311292710 + - id: 4 + name: Bones + filtered_name: Bones + real: true + image: /system/studios/original/4.png?1311292711 + - id: 5 + name: Bee Train + filtered_name: Bee Train + real: true + image: /system/studios/original/5.png?1389209052 + - id: 6 + name: Gainax + filtered_name: Gainax + real: true + image: /system/studios/original/6.png?1452689573 + - id: 1505 + name: Studio March + filtered_name: March + real: true + image: null + - id: 8 + name: Artland + filtered_name: Artland + real: true + image: /system/studios/original/8.gif?1312165056 + - id: 2821 + name: Fugaku + filtered_name: Fugaku + real: false + image: null + - id: 2792 + name: INTERFACEDOGS + filtered_name: INTERFACEDOGS + real: false + image: null + - id: 2822 + name: Shykeumo Animation Studio + filtered_name: Shykeumo Animation + real: false + image: null + - id: 2828 + name: Studio Polon + filtered_name: Polon + real: false + image: null + - id: 2829 + name: EOTA + filtered_name: EOTA + real: false + image: null + - id: 2292 + name: Toei Advertising + filtered_name: Toei Advertising + real: false + image: null + - id: 2835 + name: ROLL2 + filtered_name: ROLL2 + real: false + image: null + - id: 2701 + name: CMC Media + filtered_name: CMC Media + real: false + image: null + - id: 2253 + name: miHoYoAnime + filtered_name: miHoYoAnime + real: false + image: null + - id: 2214 + name: Takun Manga Box + filtered_name: Takun Manga Box + real: false + image: null + - id: 7 + name: J.C.Staff + filtered_name: J.C.Staff + real: true + image: /system/studios/original/7.?1434707490 + - id: 307 + name: Sunwoo Entertainment + filtered_name: Sunwoo + real: true + image: /system/studios/original/307.png?1589290394 + - id: 1471 + name: Platinum Vision + filtered_name: Platinum Vision + real: true + image: /system/studios/original/1471.png?1589290457 + - id: 78 + name: Picture Magic + filtered_name: Picture Magic + real: false + image: /system/studios/original/78.png?1589290604 + - id: 13 + name: Studio 4°C + filtered_name: 4C + real: true + image: /system/studios/original/13.gif?1311292710 + - id: 2075 + name: Taomee + filtered_name: Taomee + real: false + image: null + - id: 2485 + name: Ezo Kobo + filtered_name: Ezo Kobo + real: false + image: null + - id: 2004 + name: Sunrise Beyond + filtered_name: Sunrise Beyond + real: false + image: /system/studios/original/2004.png?1634761033 + - id: 1687 + name: Yokohama Animation Lab + filtered_name: Yokohama Animation Lab + real: false + image: /system/studios/original/1687.png?1618485066 + - id: 15 + name: Sony Pictures Entertainment + filtered_name: Sony Pictures + real: true + image: /system/studios/original/15.jpg?1311292710 + - id: 2206 + name: Xuni Ying Ye + filtered_name: Xuni Ying Ye + real: false + image: null + - id: 18 + name: Toei Animation + filtered_name: Toei + real: true + image: /system/studios/original/18.?1446981470 + - id: 1569 + name: Seven Arcs Pictures + filtered_name: Seven Arcs Pictures + real: true + image: /system/studios/original/1569.png?1505243599 + - id: 21 + name: Studio Ghibli + filtered_name: Ghibli + real: true + image: /system/studios/original/21.png?1311292709 + - id: 809 + name: AKOM + filtered_name: AKOM + real: true + image: /system/studios/original/809.png?1589290477 + - id: 1692 + name: Revoroot + filtered_name: Revoroot + real: true + image: /system/studios/original/1692.png?1576061257 + - id: 2842 + name: Big Pine Animation Studio + filtered_name: Big Pine Animation + real: false + image: null + - id: 2893 + name: Gear Studio + filtered_name: Gear + real: false + image: null + - id: 2895 + name: Team OneOne + filtered_name: Team OneOne + real: false + image: null + - id: 2897 + name: MOJO Animation + filtered_name: MOJO + real: false + image: null + - id: 2898 + name: Manaa Animation + filtered_name: Manaa + real: false + image: null + - id: 2875 + name: Blaze Studio + filtered_name: Blaze + real: false + image: null + - id: 2888 + name: Wang Film Productions + filtered_name: Wang Film + real: false + image: null + - id: 2877 + name: D'ART Shtajio + filtered_name: D'ART Shtajio + real: false + image: null + - id: 2879 + name: Grayscale Arts + filtered_name: Grayscale Arts + real: false + image: null + - id: 2907 + name: Studio Placebo + filtered_name: Placebo + real: false + image: null + - id: 2906 + name: Kobito + filtered_name: Kobito + real: false + image: null + - id: 2909 + name: Teddy + filtered_name: Teddy + real: false + image: null + - id: 2911 + name: Studio Eight Color + filtered_name: Eight Color + real: false + image: null + - id: 1095 + name: Studio Cockpit + filtered_name: Cockpit + real: false + image: null + - id: 3221 + name: Miyajima Film + filtered_name: Miyajima Film + real: false + image: null + - id: 3234 + name: InfiniOrange Animation Studio + filtered_name: InfiniOrange Animation + real: false + image: null + - id: 3235 + name: Origin + filtered_name: Origin + real: false + image: null + - id: 2462 + name: Seasun Pictures + filtered_name: Seasun Pictures + real: false + image: null + - id: 3180 + name: Number 19 Animation + filtered_name: Number 19 + real: false + image: null + - id: 3248 + name: Igloo Studio + filtered_name: Igloo + real: false + image: null + - id: 22 + name: Nippon Animation + filtered_name: Nippon + real: true + image: /system/studios/original/22.jpg?1311292709 + - id: 24 + name: Studio Fantasia + filtered_name: Fantasia + real: true + image: /system/studios/original/24.jpg?1311292711 + - id: 32 + name: Manglobe + filtered_name: Manglobe + real: true + image: /system/studios/original/32.png?1311292714 + - id: 2914 + name: Creative House Pocket + filtered_name: Creative House Pocket + real: false + image: null + - id: 79 + name: Genco + filtered_name: Genco + real: false + image: /system/studios/original/79.jpg?1311292710 + - id: 126 + name: Studio Comet + filtered_name: Comet + real: true + image: /system/studios/original/126.png?1311292714 + - id: 30 + name: Ajia-do + filtered_name: Ajia-do + real: true + image: /system/studios/original/30.png?1521916831 + - id: 2612 + name: Fengyun Animation + filtered_name: Fengyun + real: false + image: null + - id: 38 + name: Arms + filtered_name: Arms + real: true + image: /system/studios/original/38.jpg?1402569794 + - id: 41 + name: Satelight + filtered_name: Satelight + real: true + image: /system/studios/original/41.?1434707679 + - id: 43 + name: ufotable + filtered_name: ufotable + real: true + image: /system/studios/original/43.png?1311292714 + - id: 27 + name: Xebec + filtered_name: Xebec + real: true + image: /system/studios/original/27.?1450865151 + - id: 452 + name: Knack Productions + filtered_name: Knack + real: true + image: /system/studios/original/452.png?1589290493 + - id: 45 + name: Pink Pineapple + filtered_name: Pink Pineapple + real: true + image: /system/studios/original/45.?1370373738 + - id: 567 + name: D.A.S.T Corporation + filtered_name: D.A.S.T Corporation + real: false + image: null + - id: 1694 + name: AZ Creative + filtered_name: AZ Creative + real: false + image: null + - id: 48 + name: AIC + filtered_name: AIC + real: true + image: /system/studios/original/48.png?1311292709 + - id: 54 + name: Mook Animation + filtered_name: Mook + real: true + image: /system/studios/original/54.png?1311292710 + - id: 60 + name: Actas + filtered_name: Actas + real: true + image: /system/studios/original/60.png?1311292711 + - id: 67 + name: OB Planning + filtered_name: OB Planning + real: true + image: /system/studios/original/67.jpg?1311292711 + - id: 120 + name: TNK + filtered_name: TNK + real: true + image: /system/studios/original/120.png?1311292712 + - id: 95 + name: Doga Kobo + filtered_name: Doga Kobo + real: true + image: /system/studios/original/95.png?1312164950 + - id: 2078 + name: HIDEHOMARE + filtered_name: HIDEHOMARE + real: false + image: null + - id: 2080 + name: Super Normal Studio + filtered_name: Super Normal + real: false + image: null + - id: 56 + name: A-1 Pictures + filtered_name: A-1 Pictures + real: true + image: /system/studios/original/56.?1434707196 + - id: 852 + name: Nexus + filtered_name: Nexus + real: true + image: /system/studios/original/852.png?1589290569 + - id: 1575 + name: DR Movie + filtered_name: DR Movie + real: true + image: /system/studios/original/1575.png?1589290511 + - id: 1669 + name: production doA + filtered_name: production doA + real: true + image: /system/studios/original/1669.png?1589290587 + - id: 68 + name: Mushi Production + filtered_name: Mushi + real: true + image: /system/studios/original/68.jpg?1311292714 + - id: 73 + name: TMS Entertainment + filtered_name: TMS + real: true + image: /system/studios/original/73.?1413190852 + - id: 2841 + name: Maruga Factory + filtered_name: Maruga Factory + real: false + image: null + - id: 2845 + name: Dimps + filtered_name: Dimps + real: false + image: null + - id: 2831 + name: uzupiyo Animation & Digital Works + filtered_name: uzupiyo Animation & Digital Works + real: false + image: null + - id: 2060 + name: Wulifang + filtered_name: Wulifang + real: false + image: null + - id: 2555 + name: Year Young Culture + filtered_name: Year Young Culture + real: false + image: null + - id: 2830 + name: Artner + filtered_name: Artner + real: false + image: null + - id: 77 + name: APPP + filtered_name: APPP + real: true + image: /system/studios/original/77.jpg?1311292713 + - id: 81 + name: Radix + filtered_name: Radix + real: true + image: /system/studios/original/81.jpg?1311292712 + - id: 84 + name: Studio Rikka + filtered_name: Rikka + real: true + image: /system/studios/original/84.jpg?1312165073 + - id: 86 + name: Group TAC + filtered_name: Group TAC + real: true + image: /system/studios/original/86.png?1311292712 + - id: 101 + name: Studio Hibari + filtered_name: Hibari + real: true + image: /system/studios/original/101.jpg?1311292714 + - id: 110 + name: Triangle Staff + filtered_name: Triangle Staff + real: true + image: /system/studios/original/110.?1434707010 + - id: 111 + name: NHK + filtered_name: NHK + real: true + image: /system/studios/original/111.png?1538666067 + - id: 118 + name: SynergySP + filtered_name: SynergySP + real: true + image: /system/studios/original/118.jpg?1311292710 + - id: 2079 + name: Animation Lab Japan + filtered_name: Lab Japan + real: false + image: null + - id: 75 + name: Imagin + filtered_name: Imagin + real: true + image: /system/studios/original/75.jpg?1311292712 + - id: 132 + name: P.A. Works + filtered_name: P.A. Works + real: true + image: /system/studios/original/132.?1434707384 + - id: 144 + name: Pony Canyon + filtered_name: Pony Canyon + real: true + image: /system/studios/original/144.jpg?1311292711 + - id: 179 + name: A.C.G.T. + filtered_name: A.C.G.T. + real: true + image: /system/studios/original/179.jpg?1388083492 + - id: 196 + name: Production Reed + filtered_name: Production Reed + real: true + image: /system/studios/original/196.jpg?1311292712 + - id: 242 + name: Ashi Productions + filtered_name: Ashi + real: true + image: /system/studios/original/242.png?1540563216 + - id: 215 + name: Nelvana + filtered_name: Nelvana + real: true + image: /system/studios/original/215.?1434707213 + - id: 234 + name: Oh! Production + filtered_name: Oh! + real: true + image: /system/studios/original/234.jpg?1311292713 + - id: 247 + name: Shin-Ei Animation + filtered_name: Shin-Ei + real: true + image: /system/studios/original/247.png?1510312671 + - id: 287 + name: David Production + filtered_name: David + real: true + image: /system/studios/original/287.jpg?1311292711 + - id: 200 + name: Tezuka Productions + filtered_name: Tezuka + real: true + image: /system/studios/original/200.gif?1312165075 + - id: 218 + name: Zexcs + filtered_name: Zexcs + real: true + image: /system/studios/original/218.png?1311292712 + - id: 291 + name: CoMix Wave Films + filtered_name: CoMix Wave Films + real: true + image: /system/studios/original/291.png?1456439666 + - id: 309 + name: GoHands + filtered_name: GoHands + real: true + image: /system/studios/original/309.?1434708437 + - id: 314 + name: White Fox + filtered_name: White Fox + real: true + image: /system/studios/original/314.jpg?1311292714 + - id: 329 + name: Phoenix Entertainment + filtered_name: Phoenix + real: true + image: /system/studios/original/329.gif?1311292713 + - id: 334 + name: Ordet + filtered_name: Ordet + real: true + image: /system/studios/original/334.gif?1312165042 + - id: 342 + name: Japan Home Video + filtered_name: Japan Home Video + real: true + image: /system/studios/original/342.gif?1311292713 + - id: 385 + name: Tele-Cartoon Japan + filtered_name: Tele-Cartoon Japan + real: true + image: null + - id: 406 + name: Asahi Production + filtered_name: Asahi + real: true + image: /system/studios/original/406.gif?1311292709 + - id: 228 + name: Daewon Media + filtered_name: Daewon Media + real: true + image: /system/studios/original/228.png?1499498217 + - id: 441 + name: 8bit + filtered_name: 8bit + real: true + image: /system/studios/original/441.png?1451469013 + - id: 455 + name: Palm Studio + filtered_name: Palm + real: true + image: null + - id: 456 + name: Lerche + filtered_name: Lerche + real: true + image: /system/studios/original/456.png?1538666349 + - id: 486 + name: Digital Frontier + filtered_name: Digital Frontier + real: true + image: /system/studios/original/486.jpg?1311292713 + - id: 535 + name: Knack Animation + filtered_name: Knack + real: true + image: null + - id: 569 + name: MAPPA + filtered_name: MAPPA + real: true + image: /system/studios/original/569.png?1351013196 + - id: 609 + name: Cammot + filtered_name: Cammot + real: true + image: /system/studios/original/609.jpg?1356523473 + - id: 825 + name: Fifth Avenue + filtered_name: Fifth Avenue + real: true + image: /system/studios/original/825.png?1352398063 + - id: 858 + name: Wit Studio + filtered_name: Wit + real: true + image: /system/studios/original/858.png?1366652107 + - id: 894 + name: Graphinica + filtered_name: Graphinica + real: true + image: /system/studios/original/894.?1521916447 + - id: 911 + name: Passione + filtered_name: Passione + real: true + image: /system/studios/original/911.jpg?1402343502 + - id: 951 + name: NAZ + filtered_name: NAZ + real: true + image: /system/studios/original/951.png?1390414002 + - id: 1023 + name: Polygon Pictures + filtered_name: Polygon Pictures + real: true + image: /system/studios/original/1023.png?1492152889 + - id: 1091 + name: Gakken Eigakyoku + filtered_name: Gakken Eigakyoku + real: true + image: null + - id: 1127 + name: Studio 3Hz + filtered_name: 3Hz + real: true + image: /system/studios/original/1127.?1451206542 + - id: 1129 + name: Pierrot Plus + filtered_name: Pierrot Plus + real: true + image: /system/studios/original/1129.jpg?1404514265 + - id: 112 + name: Brain's Base + filtered_name: Brain's Base + real: true + image: /system/studios/original/112.png?1311292714 + - id: 1229 + name: Pie in the sky + filtered_name: Pie in the sky + real: false + image: null + - id: 28 + name: OLM + filtered_name: OLM + real: true + image: /system/studios/original/28.png?1523482474 + - id: 443 + name: Studio PuYUKAI + filtered_name: PuYUKAI + real: true + image: /system/studios/original/443.png?1521917173 + - id: 3231 + name: Qingkong Qian Li + filtered_name: Qingkong Qian Li + real: false + image: null + - id: 839 + name: LIDENFILMS + filtered_name: LIDENFILMS + real: false + image: /system/studios/original/839.?1369247736 + - id: 37 + name: Studio Deen + filtered_name: Deen + real: true + image: /system/studios/original/37.?1434707541 + - id: 1591 + name: Science SARU + filtered_name: Science SARU + real: false + image: /system/studios/original/1591.png?1589293915 + - id: 472 + name: Usagi Ou + filtered_name: Usagi Ou + real: false + image: null + - id: 2053 + name: l-a-unch・BOX + filtered_name: l-a-unch・BOX + real: false + image: null + - id: 2081 + name: JJJOY Animation Studios + filtered_name: JJJOY Animation + real: false + image: null + - id: 1521 + name: Studio Elle + filtered_name: Elle + real: false + image: null + - id: 44 + name: Shaft + filtered_name: Shaft + real: true + image: /system/studios/original/44.png?1503215283 + - id: 103 + name: Tatsunoko Production + filtered_name: Tatsunoko + real: true + image: /system/studios/original/103.jpg?1311292713 + - id: 1529 + name: Studio M2 + filtered_name: M2 + real: false + image: null + - id: 1278 + name: Signal.MD + filtered_name: Signal.MD + real: true + image: /system/studios/original/1278.png?1454409341 + - id: 36 + name: Gallop + filtered_name: Gallop + real: true + image: /system/studios/original/36.jpg?1311292711 + - id: 2846 + name: Studio Bingo + filtered_name: Bingo + real: false + image: null + - id: 2916 + name: Reirs + filtered_name: Reirs + real: false + image: null + - id: 2917 + name: Soigne + filtered_name: Soigne + real: false + image: null + - id: 2635 + name: Escape Velocity Animation + filtered_name: Escape Velocity + real: false + image: null + - id: 1374 + name: Office TakeOut + filtered_name: Office TakeOut + real: false + image: null + - id: 2919 + name: Le-joy Animation Studio + filtered_name: Le-joy Animation + real: false + image: null + - id: 2921 + name: Public Enemies + filtered_name: Public Enemies + real: false + image: null + - id: 62 + name: Shogakukan-Shueisha Productions + filtered_name: Shogakukan-Shueisha + real: false + image: /system/studios/original/62.png?1589819032 + - id: 2928 + name: Elias + filtered_name: Elias + real: false + image: null + - id: 2387 + name: Ga-Crew + filtered_name: Ga-Crew + real: false + image: null + - id: 2929 + name: Studio Outrigger + filtered_name: Outrigger + real: false + image: null + - id: 1524 + name: Geidai Animation + filtered_name: Geidai + real: false + image: null + - id: 2832 + name: VROOOOM + filtered_name: VROOOOM + real: false + image: null + - id: 2834 + name: Hero + filtered_name: Hero + real: false + image: null + - id: 2833 + name: Sofix + filtered_name: Sofix + real: false + image: null + - id: 601 + name: lxtl + filtered_name: lxtl + real: false + image: null + - id: 1796 + name: Digital Network Animation + filtered_name: Digital Network + real: false + image: null + - id: 11 + name: Madhouse + filtered_name: Madhouse + real: true + image: /system/studios/original/11.png?1457607773 + - id: 298 + name: Anima + filtered_name: Anima + real: true + image: /system/studios/original/298.gif?1311292712 + - id: 324 + name: Directions + filtered_name: Directions + real: false + image: null + - id: 1835 + name: CloverWorks + filtered_name: CloverWorks + real: false + image: /system/studios/original/1835.png?1545379956 + - id: 113 + name: Kadokawa Shoten + filtered_name: Kadokawa Shoten + real: false + image: /system/studios/original/113.png?1589290618 + - id: 1381 + name: GEMBA + filtered_name: GEMBA + real: false + image: /system/studios/original/1381.png?1589290956 + - id: 1119 + name: Shuka + filtered_name: Shuka + real: false + image: /system/studios/original/1119.png?1589290644 + - id: 1567 + name: Nut + filtered_name: Nut + real: false + image: /system/studios/original/1567.png?1589291975 + - id: 1113 + name: NBCUniversal Entertainment + filtered_name: NBCUniversal + real: false + image: /system/studios/original/1113.png?1589290662 + - id: 1155 + name: Studio Moriken + filtered_name: Moriken + real: false + image: /system/studios/original/1155.png?1589290679 + - id: 1974 + name: ENGI + filtered_name: ENGI + real: false + image: /system/studios/original/1974.png?1589291508 + - id: 1978 + name: Maho Film + filtered_name: Maho Film + real: false + image: /system/studios/original/1978.png?1589291589 + - id: 1874 + name: Arvo Animation + filtered_name: Arvo + real: false + image: /system/studios/original/1874.png?1589292077 + - id: 1560 + name: Yaoyorozu + filtered_name: Yaoyorozu + real: false + image: /system/studios/original/1560.png?1592307504 + - id: 1722 + name: Bibury Animation Studios + filtered_name: Bibury Animation + real: false + image: /system/studios/original/1722.png?1589292455 + - id: 1407 + name: Children's Playground Entertainment + filtered_name: Children's Playground + real: false + image: /system/studios/original/1407.png?1589293184 + - id: 2076 + name: Fenz + filtered_name: Fenz + real: false + image: null + - id: 407 + name: Studio 9 Maiami + filtered_name: 9 Maiami + real: false + image: null + - id: 25 + name: Milky Animation Label + filtered_name: Milky Animation Label + real: false + image: /system/studios/original/25.png?1589819105 + - id: 2055 + name: BYMENT + filtered_name: BYMENT + real: false + image: null + - id: 72 + name: Artmic + filtered_name: Artmic + real: false + image: /system/studios/original/72.png?1589819208 + - id: 76 + name: Yomiuri Telecasting Corporation + filtered_name: Yomiuri Telecasting Corporation + real: false + image: /system/studios/original/76.png?1589819266 + - id: 2046 + name: Dazzling Star + filtered_name: Dazzling Star + real: false + image: null + - id: 2047 + name: Pancake + filtered_name: Pancake + real: false + image: null + - id: 2048 + name: ASK Animation Studio + filtered_name: ASK Animation + real: false + image: null + - id: 139 + name: Nihon Ad Systems + filtered_name: Nihon Ad Systems + real: false + image: /system/studios/original/139.jpg?1311292712 + - id: 2056 + name: DRAWIZ + filtered_name: DRAWIZ + real: false + image: null + - id: 2057 + name: Toho Interactive Animation + filtered_name: Toho Interactive + real: false + image: null + - id: 2802 + name: Yudubai Animation + filtered_name: Yudubai + real: false + image: null + - id: 2061 + name: Kaca Entertainment + filtered_name: Kaca + real: false + image: null + - id: 1998 + name: Studio Signpost + filtered_name: Signpost + real: false + image: /system/studios/original/1998.png?1592731885 + - id: 1033 + name: Studio Colorido + filtered_name: Colorido + real: false + image: /system/studios/original/1033.png?1592734014 + - id: 2063 + name: Spell Bound + filtered_name: Spell Bound + real: false + image: null + - id: 1958 + name: YHKT Entertainment + filtered_name: YHKT + real: false + image: null + - id: 2065 + name: Original Force + filtered_name: Original Force + real: false + image: null + - id: 2066 + name: Congzhuo Animation + filtered_name: Congzhuo + real: false + image: null + - id: 2068 + name: Ai Si Animation Studio + filtered_name: Ai Si Animation + real: false + image: null + - id: 2848 + name: Taiko Studios + filtered_name: Taiko + real: false + image: null + - id: 1959 + name: Green Monster Team + filtered_name: Green Monster Team + real: false + image: null + - id: 2069 + name: Making Animation + filtered_name: Making + real: false + image: null + - id: 2070 + name: Wei Chuang Jiang Xin + filtered_name: Wei Chuang Jiang Xin + real: false + image: null + - id: 325 + name: Code + filtered_name: Code + real: false + image: null + - id: 312 + name: Life Work + filtered_name: Life Work + real: false + image: null + - id: 2073 + name: Painting Dream + filtered_name: Painting Dream + real: false + image: null + - id: 1111 + name: DandeLion Animation Studio + filtered_name: DandeLion Animation + real: false + image: null + - id: 249 + name: Robot Communications + filtered_name: Robot Communications + real: false + image: /system/studios/original/249.jpg?1311292714 + - id: 2064 + name: Mokai Technology + filtered_name: Mokai Technology + real: false + image: null + - id: 318 + name: WAO World + filtered_name: WAO World + real: false + image: /system/studios/original/318.jpg?1312165039 + - id: 1276 + name: HS Pictures Studio + filtered_name: HS Pictures + real: false + image: null + - id: 1764 + name: Picona + filtered_name: Picona + real: false + image: null + - id: 64 + name: Sotsu + filtered_name: Sotsu + real: false + image: /system/studios/original/64.png?1449514256 + - id: 374 + name: Plus Heads + filtered_name: Plus Heads + real: false + image: null + - id: 2051 + name: Studio Coa + filtered_name: Coa + real: false + image: null + - id: 175 + name: Planet + filtered_name: Planet + real: false + image: /system/studios/original/175.png?1311292713 + - id: 258 + name: Echo + filtered_name: Echo + real: false + image: /system/studios/original/258.gif?1311292713 + - id: 1727 + name: Tencent Penguin Pictures + filtered_name: Tencent Penguin Pictures + real: false + image: null + - id: 2082 + name: Benlai Pictures + filtered_name: Benlai Pictures + real: false + image: null + - id: 3236 + name: Ke Yue Xue Zi + filtered_name: Ke Yue Xue Zi + real: false + image: null + - id: 2085 + name: Acca effe + filtered_name: Acca effe + real: false + image: null + - id: 2086 + name: Giga Production + filtered_name: Giga + real: false + image: null + - id: 2089 + name: Wan Wei Mao Donghua + filtered_name: Wan Wei Mao Donghua + real: false + image: null + - id: 1696 + name: Kadokawa + filtered_name: Kadokawa + real: false + image: null + - id: 2114 + name: Ether Kitten + filtered_name: Ether Kitten + real: false + image: null + - id: 2115 + name: Gosay Studio + filtered_name: Gosay + real: false + image: null + - id: 2122 + name: PERIMETRON + filtered_name: PERIMETRON + real: false + image: null + - id: 2125 + name: LICO + filtered_name: LICO + real: false + image: null + - id: 2126 + name: Red Dog Culture House + filtered_name: Red Dog Culture House + real: false + image: null + - id: 2123 + name: foodunited. + filtered_name: foodunited. + real: false + image: null + - id: 2129 + name: Visual Flight + filtered_name: Visual Flight + real: false + image: null + - id: 2130 + name: Studio Shelter + filtered_name: Shelter + real: false + image: null + - id: 2133 + name: Djinn Power + filtered_name: Djinn Power + real: false + image: null + - id: 2136 + name: Ten Tails Animation + filtered_name: Ten Tails + real: false + image: null + - id: 2137 + name: 1IN + filtered_name: 1IN + real: false + image: null + - id: 1671 + name: DMM pictures + filtered_name: DMM pictures + real: false + image: null + - id: 2140 + name: Qianqi Animation + filtered_name: Qianqi + real: false + image: null + - id: 1939 + name: Alpha Animation + filtered_name: Alpha + real: false + image: null + - id: 2141 + name: TANOsim + filtered_name: TANOsim + real: false + image: null + - id: 2142 + name: LEVELS + filtered_name: LEVELS + real: false + image: null + - id: 2143 + name: LX Animation Studio + filtered_name: LX Animation + real: false + image: null + - id: 2151 + name: Ekakiya + filtered_name: Ekakiya + real: false + image: null + - id: 16 + name: TV Tokyo + filtered_name: TV Tokyo + real: false + image: /system/studios/original/16.png?1602436319 + - id: 99 + name: Kitty Films + filtered_name: Kitty Films + real: false + image: /system/studios/original/99.png?1602436341 + - id: 119 + name: Viz Media + filtered_name: Viz Media + real: false + image: /system/studios/original/119.png?1602436368 + - id: 577 + name: Tohokushinsha Film Corporation + filtered_name: Tohokushinsha Film Corporation + real: false + image: /system/studios/original/577.png?1602436391 + - id: 1451 + name: TYO + filtered_name: TYO + real: false + image: null + - id: 2158 + name: Durufix + filtered_name: Durufix + real: false + image: null + - id: 2067 + name: Flat Studio + filtered_name: Flat + real: false + image: null + - id: 2162 + name: Maxilla + filtered_name: Maxilla + real: false + image: null + - id: 2163 + name: Teatro Nishi Tokyo Studio + filtered_name: Teatro Nishi Tokyo + real: false + image: null + - id: 2161 + name: Suspenders + filtered_name: Suspenders + real: false + image: null + - id: 2164 + name: Super Brain + filtered_name: Super Brain + real: false + image: null + - id: 2171 + name: Paper Animation + filtered_name: Paper + real: false + image: null + - id: 2172 + name: Original Dream + filtered_name: Original Dream + real: false + image: null + - id: 2210 + name: Jichitai Anime + filtered_name: Jichitai Anime + real: false + image: null + - id: 2209 + name: Reiki Eyes Animation + filtered_name: Reiki Eyes + real: false + image: null + - id: 1322 + name: Creative Power Entertaining + filtered_name: Creative Power Entertaining + real: false + image: null + - id: 513 + name: Nikkatsu + filtered_name: Nikkatsu + real: false + image: null + - id: 2168 + name: Okuroto Noboru + filtered_name: Okuroto Noboru + real: false + image: null + - id: 2213 + name: Magma Studio + filtered_name: Magma + real: false + image: null + - id: 395 + name: Oz Inc. + filtered_name: Oz Inc. + real: false + image: /system/studios/original/395.jpg?1311292712 + - id: 1424 + name: Mediabank + filtered_name: Mediabank + real: false + image: null + - id: 2216 + name: CMAY Animation + filtered_name: CMAY + real: false + image: null + - id: 397 + name: Bridge + filtered_name: Bridge + real: false + image: /system/studios/original/397.png?1618089168 + - id: 2226 + name: Gambit + filtered_name: Gambit + real: false + image: null + - id: 1772 + name: Wawayu Animation + filtered_name: Wawayu + real: false + image: /system/studios/original/1772.png?1622293492 + - id: 2054 + name: MORIE Inc. + filtered_name: MORIE Inc. + real: false + image: /system/studios/original/2054.jpg?1622293375 + - id: 235 + name: Shirogumi + filtered_name: Shirogumi + real: false + image: /system/studios/original/235.png?1622293552 + - id: 134 + name: HoriPro + filtered_name: HoriPro + real: false + image: /system/studios/original/134.jpg?1312165065 + - id: 1268 + name: L²Studio + filtered_name: L²Studio + real: false + image: /system/studios/original/1268.png?1622293459 + - id: 1181 + name: RG Animation Studios + filtered_name: RG Animation + real: false + image: /system/studios/original/1181.png?1623010269 + - id: 1848 + name: Dancing CG Studio + filtered_name: Dancing CG + real: false + image: /system/studios/original/1848.jpg?1623010295 + - id: 2265 + name: ARECT + filtered_name: ARECT + real: false + image: null + - id: 517 + name: Asmik Ace + filtered_name: Asmik Ace + real: false + image: null + - id: 2179 + name: FIREBUG + filtered_name: FIREBUG + real: false + image: null + - id: 2052 + name: Wolfsbane + filtered_name: Wolfsbane + real: false + image: /system/studios/original/2052.png?1618485056 + - id: 3237 + name: Nothing New + filtered_name: Nothing New + real: false + image: null + - id: 957 + name: Connect + filtered_name: Connect + real: false + image: /system/studios/original/957.png?1618484882 + - id: 1075 + name: C-Station + filtered_name: C-Station + real: false + image: /system/studios/original/1075.png?1618484892 + - id: 1547 + name: Blade + filtered_name: Blade + real: false + image: /system/studios/original/1547.png?1618484901 + - id: 1109 + name: Orange + filtered_name: Orange + real: false + image: /system/studios/original/1109.png?1618484926 + - id: 1264 + name: EMT Squared + filtered_name: EMT Squared + real: false + image: /system/studios/original/1264.png?1618484969 + - id: 1087 + name: Lay-duce + filtered_name: Lay-duce + real: false + image: /system/studios/original/1087.png?1618484978 + - id: 2037 + name: Okuruto Noboru + filtered_name: Okuruto Noboru + real: false + image: /system/studios/original/2037.png?1618484990 + - id: 2243 + name: Quebico + filtered_name: Quebico + real: false + image: null + - id: 1984 + name: Bakken Record + filtered_name: Bakken Record + real: false + image: /system/studios/original/1984.png?1618485001 + - id: 1209 + name: Studio A-CAT + filtered_name: A-CAT + real: false + image: /system/studios/original/1209.png?1618485018 + - id: 1993 + name: Studio Bind + filtered_name: Bind + real: false + image: /system/studios/original/1993.png?1618485032 + - id: 1244 + name: Studio VOLN + filtered_name: VOLN + real: false + image: /system/studios/original/1244.png?1618485045 + - id: 3042 + name: Project Studio Q + filtered_name: Project Studio Q + real: false + image: null + - id: 2244 + name: Studio Gohan + filtered_name: Gohan + real: false + image: null + - id: 2239 + name: Transcendence Picture + filtered_name: Transcendence Picture + real: false + image: null + - id: 2097 + name: HORNETS + filtered_name: HORNETS + real: false + image: null + - id: 2247 + name: Delight Animation + filtered_name: Delight + real: false + image: null + - id: 2248 + name: Indivision + filtered_name: Indivision + real: false + image: null + - id: 2250 + name: Spooky graphic + filtered_name: Spooky graphic + real: false + image: null + - id: 2251 + name: TthunDer Animation + filtered_name: TthunDer + real: false + image: null + - id: 2252 + name: Studio Kingyoiro + filtered_name: Kingyoiro + real: false + image: null + - id: 1991 + name: Enishiya + filtered_name: Enishiya + real: false + image: /system/studios/original/1991.png?1622293434 + - id: 2266 + name: Planet Nemo Animation + filtered_name: Planet Nemo + real: false + image: null + - id: 2267 + name: MMT Technology + filtered_name: MMT Technology + real: false + image: null + - id: 2050 + name: Trash Studio + filtered_name: Trash + real: false + image: null + - id: 1573 + name: XFLAG Pictures + filtered_name: XFLAG Pictures + real: false + image: null + - id: 2270 + name: Wise Guy + filtered_name: Wise Guy + real: false + image: null + - id: 2281 + name: Rocen + filtered_name: Rocen + real: false + image: null + - id: 1465 + name: Beijing Enlight Pictures + filtered_name: Beijing Enlight Pictures + real: false + image: null + - id: 1420 + name: SIDO LIMITED + filtered_name: SIDO LIMITED + real: false + image: null + - id: 2256 + name: Kitty Film Mitaka Studio + filtered_name: Kitty Film Mitaka + real: false + image: null + - id: 1982 + name: LIDENFILMS Osaka Studio + filtered_name: LIDENFILMS Osaka + real: false + image: null + - id: 1728 + name: China Literature Limited + filtered_name: China Literature Limited + real: false + image: null + - id: 2241 + name: Dawn Animation + filtered_name: Dawn + real: false + image: null + - id: 2033 + name: FILMONY + filtered_name: FILMONY + real: false + image: /system/studios/original/2033.png?1622293447 + - id: 1350 + name: B.CMAY PICTURES + filtered_name: B.CMAY PICTURES + real: false + image: /system/studios/original/1350.png?1622293480 + - id: 2042 + name: Ruo Hong Culture + filtered_name: Ruo Hong Culture + real: false + image: /system/studios/original/2042.png?1622293522 + - id: 2249 + name: Flagship Line + filtered_name: Flagship Line + real: false + image: null + - id: 2211 + name: Lingsanwu Animation + filtered_name: Lingsanwu + real: false + image: null + - id: 2767 + name: Euluca Lab + filtered_name: Euluca Lab + real: false + image: null + - id: 1975 + name: Qubic Pictures + filtered_name: Qubic Pictures + real: false + image: /system/studios/original/1975.png?1622293576 + - id: 1807 + name: 2:10 Animation + filtered_name: '2:10' + real: false + image: /system/studios/original/1807.png?1622293331 + - id: 3044 + name: Bellnox Films + filtered_name: Bellnox Films + real: false + image: null + - id: 3240 + name: Soul Creative + filtered_name: Soul Creative + real: false + image: null + - id: 999 + name: Studio Animal + filtered_name: Animal + real: false + image: /system/studios/original/999.png?1622293600 + - id: 555 + name: Studio Chizu + filtered_name: Chizu + real: false + image: /system/studios/original/555.jpg?1623010280 + - id: 2268 + name: Point Pictures + filtered_name: Point Pictures + real: false + image: null + - id: 1441 + name: Mippei Eigeki Kiryuukan + filtered_name: Mippei Eigeki Kiryuukan + real: false + image: null + - id: 2257 + name: XEBEC M2 + filtered_name: XEBEC M2 + real: false + image: null + - id: 2282 + name: Studio Guts + filtered_name: Guts + real: false + image: null + - id: 2277 + name: Network Kouenji Studio + filtered_name: Network Kouenji + real: false + image: null + - id: 1906 + name: animate + filtered_name: animate + real: false + image: null + - id: 274 + name: Suzuki Mirano + filtered_name: Suzuki Mirano + real: false + image: /system/studios/original/274.png?1630137135 + - id: 2049 + name: BOMB! CUTE! BOMB! + filtered_name: BOMB! CUTE! BOMB! + real: false + image: /system/studios/original/2049.jpg?1630217401 + - id: 801 + name: Nihikime no Dozeu + filtered_name: Nihikime no Dozeu + real: false + image: /system/studios/original/801.png?1634761282 + - id: 2246 + name: studio MOTHER + filtered_name: MOTHER + real: false + image: /system/studios/original/2246.png?1647107739 + - id: 2288 + name: Qzil.la + filtered_name: Qzil.la + real: false + image: /system/studios/original/2288.png?1634761052 + - id: 2212 + name: Tsumugi Akita Animation Lab + filtered_name: Tsumugi Akita Animation Lab + real: false + image: /system/studios/original/2212.png?1634761138 + - id: 2167 + name: Hololive Production + filtered_name: Hololive + real: false + image: /system/studios/original/2167.png?1634761299 + - id: 417 + name: Walt Disney Studios + filtered_name: Walt Disney + real: false + image: /system/studios/original/417.png?1634762368 + - id: 2275 + name: Drawing and Manual + filtered_name: Drawing and Manual + real: false + image: /system/studios/original/2275.jpg?1634761573 + - id: 278 + name: Daiei Film Co. Ltd. + filtered_name: Daiei Film Co. Ltd. + real: false + image: /system/studios/original/278.png?1635331219 + - id: 14 + name: Sunrise + filtered_name: Sunrise + real: true + image: /system/studios/original/14.jpg?1630137154 + - id: 1827 + name: Motion Magic + filtered_name: Motion Magic + real: false + image: /system/studios/original/1827.png?1634760933 + - id: 541 + name: Seven + filtered_name: Seven + real: false + image: /system/studios/original/541.jpg?1630217381 + - id: 581 + name: Sparky Animation + filtered_name: Sparky + real: false + image: /system/studios/original/581.png?1634761084 + - id: 862 + name: Pashmina + filtered_name: Pashmina + real: false + image: /system/studios/original/862.png?1630217416 + - id: 1800 + name: Marui Group + filtered_name: Marui Group + real: false + image: /system/studios/original/1800.png?1634760961 + - id: 1721 + name: Gold Bear + filtered_name: Gold Bear + real: false + image: /system/studios/original/1721.png?1630217488 + - id: 977 + name: Queen Bee + filtered_name: Queen Bee + real: false + image: /system/studios/original/977.png?1630217509 + - id: 2295 + name: Story Effect + filtered_name: Story Effect + real: false + image: null + - id: 2296 + name: Studio Nuck + filtered_name: Nuck + real: false + image: null + - id: 2297 + name: EXNOA + filtered_name: EXNOA + real: false + image: null + - id: 2620 + name: Manhoo Culture + filtered_name: Manhoo Culture + real: false + image: null + - id: 2304 + name: TrioPen Studio + filtered_name: TrioPen + real: false + image: null + - id: 2303 + name: Noovo + filtered_name: Noovo + real: false + image: null + - id: 2302 + name: Nostalook + filtered_name: Nostalook + real: false + image: null + - id: 2300 + name: Studio Jemi + filtered_name: Jemi + real: false + image: null + - id: 2306 + name: LIDENFILMS Kyoto Studio + filtered_name: LIDENFILMS Kyoto + real: false + image: null + - id: 2301 + name: Borutong + filtered_name: Borutong + real: false + image: null + - id: 2305 + name: Fukushima Gaina + filtered_name: Fukushima Gaina + real: false + image: null + - id: 2310 + name: Paper Plane Animation Studio + filtered_name: Paper Plane Animation + real: false + image: null + - id: 2311 + name: Gyorai Eizo Inc. + filtered_name: Gyorai Eizo Inc. + real: false + image: null + - id: 2313 + name: studio hb + filtered_name: hb + real: false + image: null + - id: 2314 + name: Quad + filtered_name: Quad + real: false + image: null + - id: 2269 + name: New Generation + filtered_name: New Generation + real: false + image: null + - id: 2318 + name: ORADA COMPANY + filtered_name: ORADA COMPANY + real: false + image: null + - id: 2316 + name: Maboroshi Koubou + filtered_name: Maboroshi Koubou + real: false + image: null + - id: 2325 + name: Bibury Animation CG + filtered_name: Bibury Animation CG + real: false + image: null + - id: 2315 + name: Office No. 8 + filtered_name: Office No. 8 + real: false + image: null + - id: 2322 + name: Mousou Senka + filtered_name: Mousou Senka + real: false + image: null + - id: 2317 + name: Dream Entertainment + filtered_name: Dream + real: false + image: null + - id: 220 + name: Youmex + filtered_name: Youmex + real: false + image: /system/studios/original/220.png?1634761102 + - id: 1299 + name: AXsiZ + filtered_name: AXsiZ + real: false + image: /system/studios/original/1299.png?1634760861 + - id: 1903 + name: IMAGICA Lab. + filtered_name: IMAGICA Lab. + real: false + image: /system/studios/original/1903.png?1634761124 + - id: 2059 + name: Suoyi Technology + filtered_name: Suoyi Technology + real: false + image: /system/studios/original/2059.png?1634761315 + - id: 1673 + name: DMM.futureworks + filtered_name: DMM.futureworks + real: false + image: /system/studios/original/1673.jpg?1634760979 + - id: 2812 + name: Zuiyo + filtered_name: Zuiyo + real: false + image: null + - id: 2184 + name: The Monk Studios + filtered_name: The Monk + real: false + image: /system/studios/original/2184.png?1634761155 + - id: 2071 + name: AQUA ARIS + filtered_name: AQUA ARIS + real: false + image: /system/studios/original/2071.png?1634760993 + - id: 154 + name: E&G Films + filtered_name: E&G Films + real: false + image: /system/studios/original/154.jpg?1634761173 + - id: 945 + name: Vasoon Animation + filtered_name: Vasoon + real: false + image: /system/studios/original/945.png?1634761013 + - id: 2309 + name: Kamitsubaki Studio + filtered_name: Kamitsubaki + real: false + image: /system/studios/original/2309.jpg?1634761753 + - id: 400 + name: Gathering + filtered_name: Gathering + real: true + image: /system/studios/original/400.png?1634761199 + - id: 1185 + name: 81 Produce + filtered_name: 81 Produce + real: false + image: /system/studios/original/1185.png?1634761215 + - id: 1995 + name: Live2D Creative Studio + filtered_name: Live2D Creative + real: false + image: /system/studios/original/1995.png?1634761229 + - id: 1197 + name: Steve N' Steven + filtered_name: Steve N' Steven + real: false + image: /system/studios/original/1197.jpg?1634761250 + - id: 270 + name: NuTech Digital + filtered_name: NuTech Digital + real: false + image: /system/studios/original/270.jpg?1634761330 + - id: 1011 + name: Warner Music Japan + filtered_name: Warner Music Japan + real: false + image: /system/studios/original/1011.png?1634761591 + - id: 2284 + name: SJYNEXCUS + filtered_name: SJYNEXCUS + real: false + image: /system/studios/original/2284.png?1634761347 + - id: 866 + name: Fanworks + filtered_name: Fanworks + real: false + image: /system/studios/original/866.jpg?1634761417 + - id: 1169 + name: ILCA + filtered_name: ILCA + real: false + image: /system/studios/original/1169.png?1634761433 + - id: 896 + name: Larx Entertainment + filtered_name: Larx + real: false + image: /system/studios/original/896.png?1634761446 + - id: 3163 + name: Woodpecker + filtered_name: Woodpecker + real: false + image: null + - id: 94 + name: Telecom Animation Film + filtered_name: Telecom Animation Film + real: false + image: /system/studios/original/94.png?1663058478 + - id: 1265 + name: Tomovies + filtered_name: Tomovies + real: false + image: /system/studios/original/1265.jpg?1634761476 + - id: 1650 + name: Twilight Studio + filtered_name: Twilight + real: false + image: /system/studios/original/1650.png?1634761512 + - id: 2014 + name: Nur + filtered_name: Nur + real: false + image: /system/studios/original/2014.png?1634761693 + - id: 1099 + name: Cyclone Graphics + filtered_name: Cyclone Graphics + real: false + image: /system/studios/original/1099.png?1634761541 + - id: 3320 + name: ZG-R + filtered_name: ZG-R + real: false + image: null + - id: 1003 + name: Nippon Television Network Corporation + filtered_name: Nippon Television Network Corporation + real: false + image: /system/studios/original/1003.png?1634761606 + - id: 33 + name: WOWOW + filtered_name: WOWOW + real: false + image: /system/studios/original/33.png?1634823411 + - id: 288 + name: Kaname Productions + filtered_name: Kaname + real: false + image: /system/studios/original/288.jpg?1634761629 + - id: 2597 + name: Wong Ping Animation Lab + filtered_name: Wong Ping Animation Lab + real: false + image: null + - id: 2596 + name: Comma Studio + filtered_name: Comma + real: false + image: null + - id: 2411 + name: Studio Massket + filtered_name: Massket + real: false + image: null + - id: 2561 + name: OTOIRO + filtered_name: OTOIRO + real: false + image: null + - id: 2528 + name: Passion Paint Animation + filtered_name: Passion Paint + real: false + image: null + - id: 2600 + name: Cloud Hearts + filtered_name: Cloud Hearts + real: false + image: null + - id: 2593 + name: Angle + filtered_name: Angle + real: false + image: null + - id: 1776 + name: Studio Mir + filtered_name: Mir + real: false + image: null + - id: 1352 + name: Studio Ten Carat + filtered_name: Ten Carat + real: false + image: null + - id: 2327 + name: Studio Boogie Nights + filtered_name: Boogie Nights + real: false + image: null + - id: 199 + name: Studio Nue + filtered_name: Nue + real: true + image: /system/studios/original/199.png?1634761645 + - id: 1517 + name: Jinnan Studio + filtered_name: Jinnan + real: false + image: null + - id: 1426 + name: Studio Meditation With a Pencil + filtered_name: Meditation With a Pencil + real: false + image: /system/studios/original/1426.jpg?1634761662 + - id: 239 + name: Y.O.U.C + filtered_name: Y.O.U.C + real: false + image: /system/studios/original/239.png?1634761676 + - id: 2009 + name: Yostar Pictures + filtered_name: Yostar Pictures + real: false + image: /system/studios/original/2009.png?1636032300 + - id: 679 + name: Soyuzmultfilm + filtered_name: Soyuzmultfilm + real: false + image: null + - id: 1876 + name: CLAP + filtered_name: CLAP + real: false + image: /system/studios/original/1876.png?1634761725 + - id: 587 + name: Tomason + filtered_name: Tomason + real: false + image: /system/studios/original/587.jpg?1636032314 + - id: 2091 + name: Xanthus Media + filtered_name: Xanthus Media + real: false + image: /system/studios/original/2091.png?1634761739 + - id: 2326 + name: OLM Team Yoshioka + filtered_name: OLM Team Yoshioka + real: false + image: null + - id: 31 + name: Geneon Universal Entertainment + filtered_name: Geneon Universal + real: false + image: /system/studios/original/31.png?1634823431 + - id: 1340 + name: Typhoon Graphics + filtered_name: Typhoon Graphics + real: false + image: /system/studios/original/1340.png?1634823445 + - id: 2320 + name: Inugoya + filtered_name: Inugoya + real: false + image: null + - id: 2323 + name: Cafe de Jeilhouse + filtered_name: Cafe de Jeilhouse + real: false + image: null + - id: 53 + name: Dentsu Inc. + filtered_name: Dentsu Inc. + real: false + image: /system/studios/original/53.png?1636032323 + - id: 2341 + name: Studio Prokion + filtered_name: Prokion + real: false + image: null + - id: 207 + name: Magic Bus + filtered_name: Magic Bus + real: true + image: /system/studios/original/207.png?1635367859 + - id: 2321 + name: Production D.M.H + filtered_name: Production D.M.H + real: false + image: null + - id: 2319 + name: Datama Film + filtered_name: Datama Film + real: false + image: null + - id: 2328 + name: Sonsan Kikaku + filtered_name: Sonsan Kikaku + real: false + image: null + - id: 2340 + name: Cutie Bee + filtered_name: Cutie Bee + real: false + image: null + - id: 2337 + name: Studio Soul + filtered_name: Soul + real: false + image: null + - id: 2339 + name: Melissa + filtered_name: Melissa + real: false + image: null + - id: 2329 + name: Shinjukuza + filtered_name: Shinjukuza + real: false + image: null + - id: 2330 + name: Meltdown + filtered_name: Meltdown + real: false + image: null + - id: 2336 + name: Lead + filtered_name: Lead + real: false + image: null + - id: 2335 + name: Shindeban Film + filtered_name: Shindeban Film + real: false + image: null + - id: 2331 + name: Shura + filtered_name: Shura + real: false + image: null + - id: 2338 + name: Studio Ten + filtered_name: Ten + real: false + image: null + - id: 2355 + name: Alfred Imageworks + filtered_name: Alfred Imageworks + real: false + image: null + - id: 2342 + name: PP Project + filtered_name: PP Project + real: false + image: null + - id: 2356 + name: Kung Fu Frog Animation + filtered_name: Kung Fu Frog + real: false + image: null + - id: 2332 + name: Shion + filtered_name: Shion + real: false + image: null + - id: 2366 + name: Kigumi + filtered_name: Kigumi + real: false + image: null + - id: 2370 + name: Hayabusa Film + filtered_name: Hayabusa Film + real: false + image: null + - id: 2371 + name: Planet Cartoon + filtered_name: Planet Cartoon + real: false + image: null + - id: 2372 + name: Flint Sugar + filtered_name: Flint Sugar + real: false + image: null + - id: 2361 + name: Okumaza + filtered_name: Okumaza + real: false + image: null + - id: 2353 + name: P core + filtered_name: P core + real: false + image: null + - id: 2358 + name: Big Wing + filtered_name: Big Wing + real: false + image: null + - id: 2349 + name: Potato House + filtered_name: Potato House + real: false + image: null + - id: 2350 + name: Kantou Douga Kai + filtered_name: Kantou Douga Kai + real: false + image: null + - id: 2359 + name: Aiko + filtered_name: Aiko + real: false + image: null + - id: 2334 + name: Mouse + filtered_name: Mouse + real: false + image: null + - id: 2363 + name: JOF + filtered_name: JOF + real: false + image: null + - id: 2352 + name: Tryforce + filtered_name: Tryforce + real: false + image: null + - id: 2364 + name: Hanjin Animation + filtered_name: Hanjin + real: false + image: null + - id: 2379 + name: Scooter Films + filtered_name: Scooter Films + real: false + image: null + - id: 2611 + name: Fantawild Animation + filtered_name: Fantawild + real: false + image: null + - id: 2554 + name: Gekkou + filtered_name: Gekkou + real: false + image: null + - id: 2613 + name: Aurora Animation + filtered_name: Aurora + real: false + image: null + - id: 2595 + name: TypeZero + filtered_name: TypeZero + real: false + image: null + - id: 2472 + name: High Energy Studio + filtered_name: High Energy + real: false + image: null + - id: 2614 + name: Chongzhuo Animation + filtered_name: Chongzhuo + real: false + image: null + - id: 1414 + name: bilibili + filtered_name: bilibili + real: false + image: null + - id: 1831 + name: Colored Pencil Animation Japan + filtered_name: Colored Pencil Animation Japan + real: false + image: null + - id: 2478 + name: Oriental Creative Color + filtered_name: Oriental Creative Color + real: false + image: null + - id: 2396 + name: Joicy Studio + filtered_name: Joicy + real: false + image: null + - id: 3045 + name: Bones Film + filtered_name: Bones Film + real: false + image: null + - id: 2636 + name: Qingxiang Culture + filtered_name: Qingxiang Culture + real: false + image: null + - id: 1793 + name: Happy Elements + filtered_name: Happy Elements + real: false + image: null + - id: 2642 + name: E&H Production + filtered_name: E&H + real: false + image: null + - id: 2399 + name: Eshoya Honpo + filtered_name: Eshoya Honpo + real: false + image: null + - id: 1684 + name: THINKR + filtered_name: THINKR + real: false + image: null + - id: 1940 + name: Da Huoniao Donghua + filtered_name: Da Huoniao Donghua + real: false + image: null + - id: 2521 + name: Qiyuan Yinghua + filtered_name: Qiyuan Yinghua + real: false + image: null + - id: 377 + name: Kuri Jikken Manga Koubou + filtered_name: Kuri Jikken Manga Koubou + real: false + image: null + - id: 2646 + name: trenova + filtered_name: trenova + real: false + image: null + - id: 2649 + name: LB Commerce + filtered_name: LB Commerce + real: false + image: null + - id: 2648 + name: Au Praxinoscope + filtered_name: Au Praxinoscope + real: false + image: null + - id: 2652 + name: Gravity Well + filtered_name: Gravity Well + real: false + image: null + - id: 2651 + name: Stereotype + filtered_name: Stereotype + real: false + image: null + - id: 2658 + name: flag Co. + filtered_name: flag Co. + real: false + image: null + - id: 2656 + name: UchuPeople + filtered_name: UchuPeople + real: false + image: null + - id: 2661 + name: Kinematics + filtered_name: Kinematics + real: false + image: null + - id: 1857 + name: Geek Toys + filtered_name: Geek Toys + real: false + image: /system/studios/original/1857.png?1589291362 + - id: 2258 + name: Sharefun Studio + filtered_name: Sharefun + real: false + image: null + - id: 2294 + name: AHA Entertainment + filtered_name: AHA + real: false + image: null + - id: 2667 + name: Keyring + filtered_name: Keyring + real: false + image: null + - id: 2660 + name: UKA + filtered_name: UKA + real: false + image: null + - id: 2674 + name: BUG FILMS + filtered_name: BUG FILMS + real: false + image: null + - id: 2647 + name: Studio A. Craft + filtered_name: A. Craft + real: false + image: null + - id: 2604 + name: DC Impression Vision + filtered_name: DC Impression Vision + real: false + image: null + - id: 2688 + name: Saber Project + filtered_name: Saber Project + real: false + image: null + - id: 2676 + name: Pmats9 studio + filtered_name: Pmats9 + real: false + image: null + - id: 2394 + name: MoMo Production + filtered_name: MoMo + real: false + image: null + - id: 2351 + name: Studio Gadget + filtered_name: Gadget + real: false + image: null + - id: 2601 + name: Sunflowers + filtered_name: Sunflowers + real: false + image: null + - id: 2509 + name: Colored Pencil Animation + filtered_name: Colored Pencil + real: false + image: null + - id: 2693 + name: 6pucks + filtered_name: 6pucks + real: false + image: null + - id: 2695 + name: SIGNIF + filtered_name: SIGNIF + real: false + image: null + - id: 2463 + name: Cloud Art + filtered_name: Cloud Art + real: false + image: null + - id: 478 + name: Studio Blanc. + filtered_name: Blanc. + real: false + image: null + - id: 1980 + name: Big Firebird Culture + filtered_name: Big Firebird Culture + real: false + image: null + - id: 2679 + name: cogitoworks + filtered_name: cogitoworks + real: false + image: null + - id: 2694 + name: studio NAGURI + filtered_name: NAGURI + real: false + image: null + - id: 2424 + name: Bandai Namco Filmworks + filtered_name: Bandai Namco Filmworks + real: false + image: null + - id: 2692 + name: Ice Butter + filtered_name: Ice Butter + real: false + image: null + - id: 2682 + name: Steamworks + filtered_name: Steamworks + real: false + image: null + - id: 2678 + name: Slow Studio + filtered_name: Slow + real: false + image: null + - id: 2449 + name: Atorie A.B.C. + filtered_name: Atorie A.B.C. + real: false + image: null + - id: 2559 + name: Guo Pengzi Studio + filtered_name: Guo Pengzi + real: false + image: null + - id: 2644 + name: Kuai Ying Hu Yu + filtered_name: Kuai Ying Hu Yu + real: false + image: null + - id: 2419 + name: d00r works + filtered_name: d00r works + real: false + image: null + - id: 2686 + name: EDP graphic works + filtered_name: EDP graphic works + real: false + image: null + - id: 2474 + name: Haneda xR Studio + filtered_name: Haneda xR + real: false + image: null + - id: 2669 + name: THINGS. + filtered_name: THINGS. + real: false + image: null + - id: 2698 + name: Voil + filtered_name: Voil + real: false + image: null + - id: 2673 + name: Goto Inc. + filtered_name: Goto Inc. + real: false + image: null + - id: 2563 + name: Studio Tumble + filtered_name: Tumble + real: false + image: null + - id: 2484 + name: Gunners + filtered_name: Gunners + real: false + image: null + - id: 2564 + name: Yamiken + filtered_name: Yamiken + real: false + image: null + - id: 2392 + name: Ishibashi Planning + filtered_name: Ishibashi Planning + real: false + image: null + - id: 2551 + name: Animation 501 + filtered_name: '501' + real: false + image: null + - id: 2457 + name: Studio Ranmaru + filtered_name: Ranmaru + real: false + image: null + - id: 2626 + name: Studio D-Volt + filtered_name: D-Volt + real: false + image: null + - id: 1248 + name: Mirai Fusion + filtered_name: Mirai Fusion + real: false + image: null + - id: 2492 + name: Studio Jin + filtered_name: Jin + real: false + image: null + - id: 2623 + name: Dyna Method + filtered_name: Dyna Method + real: false + image: null + - id: 2514 + name: AIC Project + filtered_name: AIC Project + real: false + image: null + - id: 2558 + name: Delpic + filtered_name: Delpic + real: false + image: null + - id: 2406 + name: Eallin + filtered_name: Eallin + real: false + image: null + - id: 2562 + name: Studio Himalaya + filtered_name: Himalaya + real: false + image: null + - id: 2572 + name: Adonero + filtered_name: Adonero + real: false + image: null + - id: 2677 + name: Central Animation Studio + filtered_name: Central Animation + real: false + image: null + - id: 2560 + name: Nekonigashi Inc. + filtered_name: Nekonigashi Inc. + real: false + image: null + - id: 2469 + name: HM Heros + filtered_name: HM Heros + real: false + image: null + - id: 2622 + name: Makaria + filtered_name: Makaria + real: false + image: null + - id: 2274 + name: Qiying Animation + filtered_name: Qiying + real: false + image: null + - id: 1443 + name: Overlap + filtered_name: Overlap + real: false + image: null + - id: 2569 + name: Yinhe Changxing Culture + filtered_name: Yinhe Changxing Culture + real: false + image: null + - id: 2598 + name: Bigcat Studio + filtered_name: Bigcat + real: false + image: null + - id: 2605 + name: Tonari Animation + filtered_name: Tonari + real: false + image: null + - id: 2619 + name: Quyue Technology + filtered_name: Quyue Technology + real: false + image: null + - id: 2705 + name: TOHO animation STUDIO + filtered_name: TOHO animation + real: false + image: null + - id: 2706 + name: Hananona Studio + filtered_name: Hananona + real: false + image: null + - id: 1295 + name: PINE JAM + filtered_name: PINE JAM + real: false + image: /system/studios/original/1295.png?1589291852 + - id: 2333 + name: Space-X + filtered_name: Space-X + real: false + image: null + - id: 2715 + name: Hand to Mouse. + filtered_name: Hand to Mouse. + real: false + image: null + - id: 2391 + name: Sumomo Film + filtered_name: Sumomo Film + real: false + image: null + - id: 2711 + name: Miyu Productions + filtered_name: Miyu + real: false + image: null + - id: 2553 + name: Garyuu Studio + filtered_name: Garyuu + real: false + image: null + - id: 2736 + name: Gone-zo + filtered_name: Gone-zo + real: false + image: null + - id: 2625 + name: Square Pictures + filtered_name: Square Pictures + real: false + image: null + - id: 2853 + name: ASTROBROS. + filtered_name: ASTROBROS. + real: false + image: null + - id: 2459 + name: Studio Gazelle + filtered_name: Gazelle + real: false + image: null + - id: 2450 + name: C and R + filtered_name: C and R + real: false + image: null + - id: 2410 + name: Gonzino + filtered_name: Gonzino + real: false + image: null + - id: 1678 + name: Yuhodo + filtered_name: Yuhodo + real: false + image: null + - id: 2488 + name: J.K.I + filtered_name: J.K.I + real: false + image: null + - id: 2576 + name: General Entertainment + filtered_name: General + real: false + image: null + - id: 2494 + name: Enzo Animation + filtered_name: Enzo + real: false + image: null + - id: 2487 + name: Kyushu Network Animation + filtered_name: Kyushu Network + real: false + image: null + - id: 2574 + name: Circus Production + filtered_name: Circus + real: false + image: null + - id: 2421 + name: M&M + filtered_name: M&M + real: false + image: null + - id: 2452 + name: Project Team Muu + filtered_name: Project Team Muu + real: false + image: null + - id: 2665 + name: AMGA + filtered_name: AMGA + real: false + image: null + - id: 2346 + name: Alice Production + filtered_name: Alice + real: false + image: null + - id: 2345 + name: Onion Studio + filtered_name: Onion + real: false + image: null + - id: 2360 + name: Amarcord + filtered_name: Amarcord + real: false + image: null + - id: 2388 + name: Ai Yume Mai + filtered_name: Ai Yume Mai + real: false + image: null + - id: 2451 + name: TEC + filtered_name: TEC + real: false + image: null + - id: 2552 + name: C&S Production + filtered_name: C&S + real: false + image: null + - id: 2461 + name: Twenty First + filtered_name: Twenty First + real: false + image: null + - id: 2486 + name: Blue Note + filtered_name: Blue Note + real: false + image: null + - id: 2858 + name: Makino Production + filtered_name: Makino + real: false + image: null + - id: 2859 + name: 924 Studio + filtered_name: '924' + real: false + image: null + - id: 2864 + name: Windy Studio + filtered_name: Windy + real: false + image: null + - id: 2863 + name: Miota + filtered_name: Miota + real: false + image: null + - id: 2144 + name: BloomZ + filtered_name: BloomZ + real: false + image: null + - id: 2844 + name: Imagica Infos + filtered_name: Imagica Infos + real: false + image: null + - id: 2570 + name: Ijigen Tokyo + filtered_name: Ijigen Tokyo + real: false + image: null + - id: 34 + name: HAL Film Maker + filtered_name: HAL Film Maker + real: true + image: /system/studios/original/34.png?1311292711 + - id: 2870 + name: Alke + filtered_name: Alke + real: false + image: null + - id: 2666 + name: EOEO System + filtered_name: EOEO System + real: false + image: null + - id: 2365 + name: MI + filtered_name: MI + real: false + image: null + - id: 2855 + name: Studio Moe + filtered_name: Moe + real: false + image: null + - id: 2857 + name: CELAVIE + filtered_name: CELAVIE + real: false + image: null + - id: 2460 + name: aNCHOR + filtered_name: aNCHOR + real: false + image: null + - id: 2276 + name: Project Team Sarah + filtered_name: Project Team Sarah + real: false + image: null + - id: 2544 + name: Kami Kukan + filtered_name: Kami Kukan + real: false + image: null + - id: 336 + name: JM Animation + filtered_name: JM + real: false + image: /system/studios/original/336.gif?1311292709 + - id: 2714 + name: evg + filtered_name: evg + real: false + image: null + - id: 2728 + name: New Deer + filtered_name: New Deer + real: false + image: null + - id: 2729 + name: CANON RECORDINGS + filtered_name: CANON RECORDINGS + real: false + image: null + - id: 2233 + name: Starry Cube + filtered_name: Starry Cube + real: false + image: null + - id: 2645 + name: Liyu Culture + filtered_name: Liyu Culture + real: false + image: null + - id: 2058 + name: Shengying Animation + filtered_name: Shengying + real: false + image: null + - id: 2748 + name: Sankaku + filtered_name: Sankaku + real: false + image: null + - id: 2749 + name: Anime Tokyo + filtered_name: Anime Tokyo + real: false + image: null + - id: 2750 + name: Hu Po Donghua + filtered_name: Hu Po Donghua + real: false + image: null + - id: 2684 + name: CHOCOLATE + filtered_name: CHOCOLATE + real: false + image: null + - id: 2703 + name: Oyster + filtered_name: Oyster + real: false + image: null + - id: 2744 + name: Hong Ying Animation + filtered_name: Hong Ying + real: false + image: null + - id: 2746 + name: Studio Vandal + filtered_name: Vandal + real: false + image: null + - id: 2702 + name: HuaDream + filtered_name: HuaDream + real: false + image: null + - id: 2743 + name: Shengguang Knight Culture + filtered_name: Shengguang Knight Culture + real: false + image: null + - id: 2755 + name: Congrong Film + filtered_name: Congrong Film + real: false + image: null + - id: 2760 + name: Studio Add + filtered_name: Add + real: false + image: null + - id: 2757 + name: Caviar + filtered_name: Caviar + real: false + image: null + - id: 2657 + name: NANON CREATIVE + filtered_name: NANON CREATIVE + real: false + image: null + - id: 2754 + name: Contrail + filtered_name: Contrail + real: false + image: null + - id: 2513 + name: HMCH + filtered_name: HMCH + real: false + image: null + - id: 2761 + name: ARCUS + filtered_name: ARCUS + real: false + image: null + - id: 2764 + name: Studio HUIT + filtered_name: HUIT + real: false + image: null + - id: 2447 + name: Youku + filtered_name: Youku + real: false + image: null + - id: 2762 + name: Studio Matomo + filtered_name: Matomo + real: false + image: null + - id: 2772 + name: Misogo Animation Studio + filtered_name: Misogo Animation + real: false + image: null + - id: 2773 + name: Transistor Studio + filtered_name: Transistor + real: false + image: null + - id: 2774 + name: Shadow Steps + filtered_name: Shadow Steps + real: false + image: null + - id: 2628 + name: Xiaoming Taiji + filtered_name: Xiaoming Taiji + real: false + image: null + - id: 2778 + name: Sasayuri + filtered_name: Sasayuri + real: false + image: null + - id: 2780 + name: Studio Artegg + filtered_name: Artegg + real: false + image: null + - id: 2781 + name: Cloud Culture + filtered_name: Cloud Culture + real: false + image: null + - id: 2783 + name: ANYZAC + filtered_name: ANYZAC + real: false + image: null + - id: 2785 + name: Shikachan Studio + filtered_name: Shikachan + real: false + image: null + - id: 2787 + name: Studio Lemon + filtered_name: Lemon + real: false + image: null + - id: 2784 + name: Medo + filtered_name: Medo + real: false + image: null + - id: 2790 + name: Hezmon Animation + filtered_name: Hezmon + real: false + image: null + - id: 2794 + name: BUDDHA INC. + filtered_name: BUDDHA INC. + real: false + image: null + - id: 2512 + name: Studio Easter + filtered_name: Easter + real: false + image: null + - id: 2606 + name: Toyo Links Corporation + filtered_name: Toyo Links Corporation + real: false + image: null + - id: 2725 + name: CompTown + filtered_name: CompTown + real: false + image: null + - id: 2795 + name: Xing Xing Donghua + filtered_name: Xing Xing Donghua + real: false + image: null + - id: 2765 + name: Bebow + filtered_name: Bebow + real: false + image: null + - id: 2775 + name: Production Wave + filtered_name: Production Wave + real: false + image: null + - id: 2624 + name: Village Studio + filtered_name: Village + real: false + image: null + - id: 2807 + name: ABJ COMPANY + filtered_name: ABJ COMPANY + real: false + image: null + - id: 2420 + name: Tang Kirin Culture + filtered_name: Tang Kirin Culture + real: false + image: null + - id: 2810 + name: Studio Yona + filtered_name: Yona + real: false + image: null + - id: 1379 + name: Zero-G + filtered_name: Zero-G + real: true + image: /system/studios/original/1379.png?1521916962 + - id: 2933 + name: Hutoon Animation + filtered_name: Hutoon + real: false + image: null + - id: 2934 + name: studio2 Animation Lab + filtered_name: studio2 Animation Lab + real: false + image: null + - id: 2663 + name: Rock'n Roll Mountain + filtered_name: Rock'n Roll Mountain + real: false + image: null + - id: 2939 + name: Studio Gale + filtered_name: Gale + real: false + image: null + - id: 2813 + name: Iconix Entertainment + filtered_name: Iconix + real: false + image: null + - id: 2779 + name: Studio BAZOOKA + filtered_name: BAZOOKA + real: false + image: null + - id: 2940 + name: Ocon Studio + filtered_name: Ocon + real: false + image: null + - id: 2945 + name: Studio Goindol + filtered_name: Goindol + real: false + image: null + - id: 2944 + name: Brick Studio + filtered_name: Brick + real: false + image: null + - id: 2951 + name: Pierrot Films + filtered_name: Pierrot Films + real: false + image: null + - id: 2880 + name: ORCEN + filtered_name: ORCEN + real: false + image: null + - id: 2713 + name: Infinity Animations + filtered_name: Infinity Animations + real: false + image: null + - id: 2950 + name: studio ALBLE + filtered_name: ALBLE + real: false + image: null + - id: 2957 + name: Particlefield + filtered_name: Particlefield + real: false + image: null + - id: 2953 + name: Flying Monkeys Production + filtered_name: Flying Monkeys + real: false + image: null + - id: 2954 + name: Studio Button + filtered_name: Button + real: false + image: null + - id: 2949 + name: Oriental Creative Color + filtered_name: Oriental Creative Color + real: false + image: null + - id: 3052 + name: Studio KeepFire + filtered_name: KeepFire + real: false + image: null + - id: 1667 + name: Foch Film + filtered_name: Foch Film + real: false + image: /system/studios/original/1667.png?1622293472 + - id: 3046 + name: Tsumupapa + filtered_name: Tsumupapa + real: false + image: null + - id: 433 + name: Viewworks + filtered_name: Viewworks + real: false + image: /system/studios/original/433.png?1311292712 + - id: 3033 + name: Studio Barcelona + filtered_name: Barcelona + real: false + image: null + - id: 2617 + name: Tianshi Wenhua + filtered_name: Tianshi Wenhua + real: false + image: null + - id: 2573 + name: Watanabe Promotion + filtered_name: Watanabe Promotion + real: false + image: null + - id: 3048 + name: Kachigarasu + filtered_name: Kachigarasu + real: false + image: null + - id: 3050 + name: Crew-Cell + filtered_name: Crew-Cell + real: false + image: null + - id: 3049 + name: STUDIO 8 DOGS + filtered_name: 8 DOGS + real: false + image: null + - id: 2804 + name: Seoul Movie + filtered_name: Seoul Movie + real: false + image: null + - id: 2752 + name: Youliao Studio + filtered_name: Youliao + real: false + image: null + - id: 2298 + name: Atelier Pontdarc + filtered_name: Atelier Pontdarc + real: false + image: /system/studios/original/2298.png?1695122030 + - id: 1930 + name: Zelico Film + filtered_name: Zelico Film + real: false + image: null + - id: 3022 + name: Panda Tower Studio + filtered_name: Panda Tower + real: false + image: null + - id: 3060 + name: WonderLand + filtered_name: WonderLand + real: false + image: null + - id: 3061 + name: AOI Pro. + filtered_name: AOI Pro. + real: false + image: null + - id: 2850 + name: SAFEHOUSE + filtered_name: SAFEHOUSE + real: false + image: null + - id: 2170 + name: Alpha Group + filtered_name: Alpha Group + real: false + image: null + - id: 2641 + name: Locus Corporation + filtered_name: Locus Corporation + real: false + image: null + - id: 3066 + name: Aeonium + filtered_name: Aeonium + real: false + image: null + - id: 3070 + name: Studio Clutch + filtered_name: Clutch + real: false + image: null + - id: 3071 + name: Shuiniu Dongman + filtered_name: Shuiniu Dongman + real: false + image: null + - id: 3079 + name: LinQ + filtered_name: LinQ + real: false + image: null + - id: 3078 + name: Studio LEO + filtered_name: LEO + real: false + image: null + - id: 3082 + name: teevee graphics + filtered_name: teevee graphics + real: false + image: null + - id: 3083 + name: Nagomi + filtered_name: Nagomi + real: false + image: null + - id: 3091 + name: KaKa Technology Studio + filtered_name: KaKa Technology + real: false + image: null + - id: 3085 + name: I&A + filtered_name: I&A + real: false + image: null + - id: 3074 + name: Kumarba + filtered_name: Kumarba + real: false + image: null + - id: 3089 + name: StealthWorks + filtered_name: StealthWorks + real: false + image: null + - id: 3086 + name: ILCASHIPS + filtered_name: ILCASHIPS + real: false + image: null + - id: 3090 + name: MAINCONCEPT + filtered_name: MAINCONCEPT + real: false + image: null + - id: 3097 + name: Maru Animation + filtered_name: Maru + real: false + image: null + - id: 3099 + name: sugarsaltpepper + filtered_name: sugarsaltpepper + real: false + image: null + - id: 2175 + name: GARDEN Culture + filtered_name: GARDEN Culture + real: false + image: null + - id: 3055 + name: Animation Studio Wagumi + filtered_name: Studio Wagumi + real: false + image: null + - id: 3076 + name: No Side + filtered_name: No Side + real: false + image: null + - id: 3077 + name: Axis + filtered_name: Axis + real: false + image: null + - id: 1881 + name: Friendly Land + filtered_name: Friendly Land + real: false + image: null + - id: 3081 + name: Fortes + filtered_name: Fortes + real: false + image: null + - id: 2202 + name: Front Wing + filtered_name: Front Wing + real: false + image: null + - id: 3111 + name: Raiose + filtered_name: Raiose + real: false + image: null + - id: 2742 + name: Studio N + filtered_name: N + real: false + image: null + - id: 2972 + name: Cocktail Media + filtered_name: Cocktail Media + real: false + image: null + - id: 2969 + name: Mainichi Eigasha + filtered_name: Mainichi Eigasha + real: false + image: null + - id: 2970 + name: 717 Animation Studio + filtered_name: 717 Animation + real: false + image: null + - id: 2824 + name: Production HASU + filtered_name: Production HASU + real: false + image: null + - id: 2967 + name: Digital Dream Studios + filtered_name: Digital Dream + real: false + image: null + - id: 2726 + name: Laftel + filtered_name: Laftel + real: false + image: null + - id: 2977 + name: BlueArc Animation Studios + filtered_name: BlueArc Animation + real: false + image: null + - id: 2737 + name: Painted Blade Studio + filtered_name: Painted Blade + real: false + image: null + - id: 2948 + name: Nippon TV Douga + filtered_name: Nippon TV Douga + real: false + image: null + - id: 2936 + name: G&G Direction + filtered_name: G&G Direction + real: false + image: null + - id: 2982 + name: Ginga Teikoku + filtered_name: Ginga Teikoku + real: false + image: null + - id: 2947 + name: Tokyo TV Douga + filtered_name: Tokyo TV Douga + real: false + image: null + - id: 2983 + name: Imageworks Studio + filtered_name: Imageworks + real: false + image: null + - id: 2985 + name: Saber Works + filtered_name: Saber Works + real: false + image: null + - id: 1759 + name: Lyrics + filtered_name: Lyrics + real: false + image: null + - id: 2931 + name: Buyuu + filtered_name: Buyuu + real: false + image: null + - id: 2955 + name: Sunny Gapen + filtered_name: Sunny Gapen + real: false + image: null + - id: 2988 + name: Shadow Pond Studio + filtered_name: Shadow Pond + real: false + image: null + - id: 2987 + name: Outline + filtered_name: Outline + real: false + image: null + - id: 2986 + name: Sugata Creative & Design + filtered_name: Sugata Creative & Design + real: false + image: null + - id: 2991 + name: Skydance Animation + filtered_name: Skydance + real: false + image: null + - id: 2990 + name: Higashinaka Studio + filtered_name: Higashinaka + real: false + image: null + - id: 2989 + name: LIGHTAIR Inc. + filtered_name: LIGHTAIR Inc. + real: false + image: null + - id: 2992 + name: R11R + filtered_name: R11R + real: false + image: null + - id: 2444 + name: Hanho Heung-Up + filtered_name: Hanho Heung-Up + real: false + image: null + - id: 2851 + name: Pinkfong + filtered_name: Pinkfong + real: false + image: null + - id: 2994 + name: Aurochs + filtered_name: Aurochs + real: false + image: null + - id: 2997 + name: Million Volt + filtered_name: Million Volt + real: false + image: null + - id: 3007 + name: Studio Harutonari + filtered_name: Harutonari + real: false + image: null + - id: 3009 + name: Kitchen Ltd. + filtered_name: Kitchen Ltd. + real: false + image: null + - id: 3013 + name: Rhythmos + filtered_name: Rhythmos + real: false + image: null + - id: 2283 + name: Manga Productions + filtered_name: Manga + real: false + image: null + - id: 3014 + name: STUDIOK110 + filtered_name: STUDIOK110 + real: false + image: null + - id: 3023 + name: FAB + filtered_name: FAB + real: false + image: null + - id: 3107 + name: Hifumi + filtered_name: Hifumi + real: false + image: null + - id: 3002 + name: CUEBiC + filtered_name: CUEBiC + real: false + image: null + - id: 2753 + name: Whatever + filtered_name: Whatever + real: false + image: null + - id: 2938 + name: 3D + filtered_name: 3D + real: false + image: null + - id: 3030 + name: Studio Dotou + filtered_name: Dotou + real: false + image: null + - id: 3032 + name: OutSide Directors Company + filtered_name: OutSide Directors Company + real: false + image: null + - id: 3031 + name: Kassen + filtered_name: Kassen + real: false + image: null + - id: 3035 + name: Koinrush Studio + filtered_name: Koinrush + real: false + image: null + - id: 3036 + name: MARK + filtered_name: MARK + real: false + image: null + - id: 3062 + name: DEFT + filtered_name: DEFT + real: false + image: null + - id: 2712 + name: Studio G7 + filtered_name: G7 + real: false + image: null + - id: 3120 + name: Stellar Pictures + filtered_name: Stellar Pictures + real: false + image: null + - id: 3121 + name: Happy Toon + filtered_name: Happy Toon + real: false + image: null + - id: 3124 + name: Yumao Wenhua + filtered_name: Yumao Wenhua + real: false + image: null + - id: 3125 + name: G.H.Y. Culture & Media + filtered_name: G.H.Y. Culture & Media + real: false + image: null + - id: 3126 + name: Long Zhi Gu Wenhua + filtered_name: Long Zhi Gu Wenhua + real: false + image: null + - id: 2638 + name: Yien Animation Studio + filtered_name: Yien Animation + real: false + image: null + - id: 2586 + name: D.ROCK-ART + filtered_name: D.ROCK-ART + real: false + image: null + - id: 3117 + name: Jiman Wenhua + filtered_name: Jiman Wenhua + real: false + image: null + - id: 3131 + name: Zhou Ling Wenhua + filtered_name: Zhou Ling Wenhua + real: false + image: null + - id: 3129 + name: Hei Chao Yinghua + filtered_name: Hei Chao Yinghua + real: false + image: null + - id: 3130 + name: Chenghuang Yinghua + filtered_name: Chenghuang Yinghua + real: false + image: null + - id: 3132 + name: Flying Fish Studio + filtered_name: Flying Fish + real: false + image: null + - id: 3133 + name: Bu Keneng de Shijie + filtered_name: Bu Keneng de Shijie + real: false + image: null + - id: 3134 + name: Kid+Kid Animation Studio + filtered_name: Kid+Kid Animation + real: false + image: null + - id: 3135 + name: Lan Ying Yingshi + filtered_name: Lan Ying Yingshi + real: false + image: null + - id: 3136 + name: Tang Cai Zhaopin + filtered_name: Tang Cai Zhaopin + real: false + image: null + - id: 2084 + name: Tong Mingxuan Studio + filtered_name: Tong Mingxuan + real: false + image: null + - id: 3138 + name: Honoo + filtered_name: Honoo + real: false + image: null + - id: 3139 + name: S.o.K + filtered_name: S.o.K + real: false + image: null + - id: 3127 + name: INS Studio + filtered_name: INS + real: false + image: null + - id: 1399 + name: asurafilm + filtered_name: asurafilm + real: false + image: null + - id: 2892 + name: WWWave + filtered_name: WWWave + real: false + image: null + - id: 3122 + name: Climax Studio + filtered_name: Climax + real: false + image: null + - id: 3150 + name: Ziine Studio + filtered_name: Ziine + real: false + image: null + - id: 3149 + name: Pepper Conpanna + filtered_name: Pepper Conpanna + real: false + image: null + - id: 3148 + name: OSROCTION + filtered_name: OSROCTION + real: false + image: null + - id: 3145 + name: Nulls Design + filtered_name: Nulls Design + real: false + image: null + - id: 3144 + name: Skyloong + filtered_name: Skyloong + real: false + image: null + - id: 1063 + name: CALF + filtered_name: CALF + real: false + image: null + - id: 3157 + name: Psyde Kick Studio + filtered_name: Psyde Kick + real: false + image: null + - id: 3094 + name: animation studio42 + filtered_name: studio42 + real: false + image: null + - id: 1314 + name: Gaina + filtered_name: Gaina + real: false + image: null + - id: 3173 + name: BENTEN Film + filtered_name: BENTEN Film + real: false + image: null + - id: 3167 + name: Funny Flux + filtered_name: Funny Flux + real: false + image: null + - id: 3068 + name: Manpuku Jinja + filtered_name: Manpuku Jinja + real: false + image: null + - id: 3142 + name: Kagome Company + filtered_name: Kagome Company + real: false + image: null + - id: 2010 + name: Nippon Ramayana Film + filtered_name: Nippon Ramayana Film + real: false + image: null + - id: 255 + name: Imagi + filtered_name: Imagi + real: false + image: null + - id: 216 + name: Studio Tron + filtered_name: Tron + real: false + image: null + - id: 3161 + name: Triple A + filtered_name: Triple A + real: false + image: null + - id: 1 + name: Studio Pierrot + filtered_name: Pierrot + real: true + image: /system/studios/original/1.png?1378753179 + - id: 3158 + name: Children's Corner + filtered_name: Children's Corner + real: false + image: null + - id: 991 + name: Hoso Seisaku Doga + filtered_name: Hoso Seisaku Doga + real: false + image: null + - id: 2344 + name: All Products + filtered_name: All Products + real: false + image: null + - id: 2087 + name: CEKAI + filtered_name: CEKAI + real: false + image: null + - id: 3186 + name: studio maf + filtered_name: maf + real: false + image: null + - id: 3187 + name: Cue + filtered_name: Cue + real: false + image: null + - id: 3190 + name: Studio Maybe + filtered_name: Maybe + real: false + image: null + - id: 3189 + name: mico.animation + filtered_name: mico.animation + real: false + image: null + - id: 3192 + name: Studio Graph77 + filtered_name: Graph77 + real: false + image: null + - id: 1997 + name: Studio KAI + filtered_name: KAI + real: false + image: /system/studios/original/1997.png?1618484872 + - id: 3197 + name: Toon Harbor Works + filtered_name: Toon Harbor Works + real: false + image: null + - id: 3194 + name: Nichicaline + filtered_name: Nichicaline + real: false + image: null + - id: 3195 + name: Folium + filtered_name: Folium + real: false + image: null + - id: 3196 + name: Rouseact + filtered_name: Rouseact + real: false + image: null + - id: 3201 + name: ABC Animation Studio + filtered_name: ABC Animation + real: false + image: null + - id: 3202 + name: Finger and Toe + filtered_name: Finger and Toe + real: false + image: null + - id: 1961 + name: Creatures + filtered_name: Creatures + real: false + image: null + - id: 2299 + name: Gift-o’-Animation + filtered_name: Gift-o’-Animation + real: false + image: null + - id: 3205 + name: Garage Film + filtered_name: Garage Film + real: false + image: null + - id: 3207 + name: studioDOT + filtered_name: studioDOT + real: false + image: null + - id: 3209 + name: IKIF+ + filtered_name: IKIF+ + real: false + image: null + - id: 3214 + name: Studio BETTA + filtered_name: BETTA + real: false + image: null + - id: 3217 + name: Atoonz + filtered_name: Atoonz + real: false + image: null + - id: 3244 + name: Shenli Guangyin + filtered_name: Shenli Guangyin + real: false + image: null + - id: 3128 + name: Guangzhou Liu Ling Yi + filtered_name: Guangzhou Liu Ling Yi + real: false + image: null + - id: 3212 + name: Tochka + filtered_name: Tochka + real: false + image: null + - id: 3159 + name: Newon + filtered_name: Newon + real: false + image: null + - id: 2756 + name: Equator + filtered_name: Equator + real: false + image: null + - id: 3241 + name: Project Team Argos + filtered_name: Project Team Argos + real: false + image: null + - id: 3223 + name: Office Academy + filtered_name: Office Academy + real: false + image: null + - id: 2378 + name: StarLink + filtered_name: StarLink + real: false + image: null + - id: 1009 + name: Aubeck + filtered_name: Aubeck + real: false + image: null + - id: 3249 + name: Sunshine Corporation + filtered_name: Sunshine Corporation + real: false + image: null + - id: 3245 + name: Teleimage + filtered_name: Teleimage + real: false + image: null + - id: 450 + name: Wako Production + filtered_name: Wako + real: false + image: /system/studios/original/450.jpg?1634761556 + - id: 3247 + name: bushes + filtered_name: bushes + real: false + image: null + - id: 3179 + name: TV Douga + filtered_name: TV Douga + real: false + image: null + - id: 3250 + name: Lychee Time Media + filtered_name: Lychee Time Media + real: false + image: null + - id: 2368 + name: Miyuki Production + filtered_name: Miyuki + real: false + image: null + - id: 3251 + name: B.COOL STUDIO + filtered_name: B.COOL + real: false + image: null + - id: 3252 + name: Doraku + filtered_name: Doraku + real: false + image: null + - id: 3238 + name: Tsubasa Production + filtered_name: Tsubasa + real: false + image: null + - id: 3253 + name: Liliyabi Company Introduction + filtered_name: Liliyabi Company Introduction + real: false + image: null + - id: 1325 + name: Haoliners Animation + filtered_name: Haoliners + real: true + image: /system/studios/original/1325.png?1499467056 + - id: 3254 + name: Honglu Technology + filtered_name: Honglu Technology + real: false + image: null + - id: 3255 + name: PAINTFREE + filtered_name: PAINTFREE + real: false + image: null + - id: 3257 + name: Grass Jelly Studio + filtered_name: Grass Jelly + real: false + image: null + - id: 3258 + name: OCSTUDIO + filtered_name: OCSTUDIO + real: false + image: null + - id: 3273 + name: Atelier Peuplier + filtered_name: Atelier Peuplier + real: false + image: null + - id: 3271 + name: Gugenka + filtered_name: Gugenka + real: false + image: null + - id: 3264 + name: BIGBIGSUN + filtered_name: BIGBIGSUN + real: false + image: null + - id: 3276 + name: Aura Studio + filtered_name: Aura + real: false + image: null + - id: 1804 + name: Nice Boat Animation + filtered_name: Nice Boat + real: false + image: /system/studios/original/1804.png?1634761461 + - id: 3266 + name: WINSING ANIMATION + filtered_name: WINSING + real: false + image: null + - id: 3261 + name: TRCARTOON + filtered_name: TRCARTOON + real: false + image: null + - id: 3268 + name: YNUO + filtered_name: YNUO + real: false + image: null + - id: 3278 + name: Studio Eek + filtered_name: Eek + real: false + image: null + - id: 3243 + name: Da Chenger Gongzuoshi + filtered_name: Da Chenger Gongzuoshi + real: false + image: null + - id: 3281 + name: Akatsuki Media Studio + filtered_name: Akatsuki Media + real: false + image: null + - id: 3277 + name: Mofac Studio + filtered_name: Mofac + real: false + image: null + - id: 3282 + name: Shen Fu Wenhua + filtered_name: Shen Fu Wenhua + real: false + image: null + - id: 3288 + name: A4works + filtered_name: A4works + real: false + image: null + - id: 3290 + name: Atra + filtered_name: Atra + real: false + image: null + - id: 3294 + name: Grass + filtered_name: Grass + real: false + image: null + - id: 3275 + name: FuRyu Pictures + filtered_name: FuRyu Pictures + real: false + image: null + - id: 2838 + name: San Blas Animation + filtered_name: San Blas + real: false + image: null + - id: 3293 + name: Green Leaf Animation + filtered_name: Green Leaf + real: false + image: null + - id: 3297 + name: Aisle + filtered_name: Aisle + real: false + image: null + - id: 3300 + name: Bakkka + filtered_name: Bakkka + real: false + image: null + - id: 3301 + name: Cannon Code + filtered_name: Cannon Code + real: false + image: null + - id: 3260 + name: Hui Guang Gongzuoshi + filtered_name: Hui Guang Gongzuoshi + real: false + image: null + - id: 3303 + name: Daily Plan.net + filtered_name: Daily Plan.net + real: false + image: null + - id: 3304 + name: SO-DO Creative + filtered_name: SO-DO Creative + real: false + image: null + - id: 3295 + name: Computer Technique Group + filtered_name: Computer Technique Group + real: false + image: null + - id: 3296 + name: coyote + filtered_name: coyote + real: false + image: null + - id: 3305 + name: Electric Circus + filtered_name: Electric Circus + real: false + image: null + - id: 3306 + name: Studio Keel + filtered_name: Keel + real: false + image: null + - id: 3259 + name: Moonseong Animation + filtered_name: Moonseong + real: false + image: null + - id: 2192 + name: Haianxian Donghua Gongzuoshi + filtered_name: Haianxian Donghua Gongzuoshi + real: false + image: null + - id: 3287 + name: Daicon Film + filtered_name: Daicon Film + real: false + image: null + - id: 2445 + name: Big Film Entertainment + filtered_name: Big Film + real: false + image: null + - id: 3286 + name: Cypic + filtered_name: Cypic + real: false + image: null + - id: 1641 + name: Studio AWAKE + filtered_name: AWAKE + real: false + image: null + - id: 3314 + name: Studio Wrong + filtered_name: Wrong + real: false + image: null + - id: 3316 + name: Ciwen Animation + filtered_name: Ciwen + real: false + image: null + - id: 3311 + name: Kaihuang Donghua + filtered_name: Kaihuang Donghua + real: false + image: null + - id: 3312 + name: You Hu Wenhua + filtered_name: You Hu Wenhua + real: false + image: null + - id: 3318 + name: Buzhi Dongman + filtered_name: Buzhi Dongman + real: false + image: null + body_text: null + body_b64: null diff --git a/test/models/test_aggregate.py b/test/models/test_aggregate.py new file mode 100644 index 0000000..90acf6a --- /dev/null +++ b/test/models/test_aggregate.py @@ -0,0 +1,49 @@ +"""Tests for aggregate result models.""" + +from __future__ import annotations + +import pytest + + +pytestmark = pytest.mark.unittest + + +class TestAggregateResult: + def test_source_status_helpers(self): + from animedex.models.aggregate import AggregateResult, AggregateSourceStatus + + result = AggregateResult( + items=[{"id": 1, "_source": "anilist"}], + sources={ + "anilist": AggregateSourceStatus(status="ok", items=1), + "jikan": AggregateSourceStatus(status="failed", reason="upstream-error", message="jikan 503"), + }, + ) + + assert set(result.ok_sources()) == {"anilist"} + assert set(result.failed_sources()) == {"jikan"} + assert result.all_failed is False + + def test_all_failed(self): + from animedex.models.aggregate import AggregateResult, AggregateSourceStatus + + result = AggregateResult( + items=[], + sources={"anilist": AggregateSourceStatus(status="failed", reason="upstream-error")}, + ) + + assert result.all_failed is True + + def test_default_containers_are_not_shared(self): + from animedex.models.aggregate import AggregateResult + + first = AggregateResult() + second = AggregateResult() + + assert first.items is not second.items + assert first.sources is not second.sources + + def test_selftest_runs(self): + from animedex.models import aggregate + + assert aggregate.selftest() is True diff --git a/test/render/test_json_renderer.py b/test/render/test_json_renderer.py index 9866a1e..689e722 100644 --- a/test/render/test_json_renderer.py +++ b/test/render/test_json_renderer.py @@ -109,6 +109,24 @@ class Merged(AnimedexModel): assert decoded["_meta"]["sources_consulted"] == ["anilist", "jikan"] +class TestAggregateResultSources: + def test_aggregate_sources_map_reports_ok_sources_only(self): + from animedex.models.aggregate import AggregateResult, AggregateSourceStatus + from animedex.render.json_renderer import render_json + + result = AggregateResult( + items=[{"id": 1, "_source": "jikan", "_prefix_id": "mal:1"}], + sources={ + "anilist": AggregateSourceStatus(status="failed", reason="upstream-error"), + "jikan": AggregateSourceStatus(status="ok", items=1), + }, + ) + decoded = json.loads(render_json(result, include_source=True)) + + assert decoded["_meta"]["sources_consulted"] == ["jikan"] + assert decoded["sources"]["anilist"]["status"] == "failed" + + class TestRichModelSourceAttribution: """Reviewer review B1 (PR #6). diff --git a/test/render/test_tty_phase2.py b/test/render/test_tty_phase2.py index b36cdc2..0a8c233 100644 --- a/test/render/test_tty_phase2.py +++ b/test/render/test_tty_phase2.py @@ -143,3 +143,31 @@ def test_renders(self): assert "[src: trace]" in out assert "100" in out assert "18" in out + + +class TestAggregateResultTty: + def test_renders_compact_rows_with_prefix_and_source(self): + from animedex.backends.jikan.models import JikanAnime + from animedex.models.aggregate import AggregateResult, AggregateSourceStatus + from animedex.render.tty import render_tty + + result = AggregateResult( + items=[ + JikanAnime.model_validate( + { + "mal_id": 52991, + "title": "Sousou no Frieren", + "score": 9.27, + "status": "released", + "source_tag": _src(backend="jikan"), + } + ).model_copy(update={"_source": "jikan", "_prefix_id": "mal:52991"}) + ], + sources={"jikan": AggregateSourceStatus(status="ok", items=1)}, + ) + out = render_tty(result) + + assert "Aggregate results" in out + assert "[src: jikan]" in out + assert "mal:52991" in out + assert "Score:" in out diff --git a/tools/fixtures/prewarm_aggregate_cache.py b/tools/fixtures/prewarm_aggregate_cache.py new file mode 100644 index 0000000..662a881 --- /dev/null +++ b/tools/fixtures/prewarm_aggregate_cache.py @@ -0,0 +1,93 @@ +"""Prewarm the local aggregate-command cache from committed fixtures. + +This helper exists for documentation captures. It lets ``aggregate.tape`` +render real ``animedex search`` and ``animedex show`` commands without +depending on live upstream availability, rate-limit state, or network +egress during the recording. +""" + +from __future__ import annotations + +import base64 +from pathlib import Path +from typing import Any, Optional + +import yaml + +from animedex.api._dispatch import _signature +from animedex.cache.sqlite import SqliteCache + + +REPO_ROOT = Path(__file__).resolve().parents[2] +FIXTURES = REPO_ROOT / "test" / "fixtures" + + +SPECS = ( + ("anilist/graphql/23-search-frieren-type-anime.yaml", "anilist"), + ("jikan/anime_search/17-frieren-tv-limit2.yaml", "jikan"), + ("kitsu/anime_search/17-frieren-limit2.yaml", "kitsu"), + ("shikimori/animes_search/17-frieren-limit2.yaml", "shikimori"), + ("anilist/graphql/28-manga-search-berserk.yaml", "anilist"), + ("mangadex/manga_search/01-berserk.yaml", "mangadex"), + ("shikimori/mangas_search/02-berserk-limit2.yaml", "shikimori"), + ("anilist/graphql/26-staff-search-yamada.yaml", "anilist"), + ("jikan/people_search/02-miyazaki-limit2.yaml", "jikan"), + ("shikimori/people_search/02-miyazaki-limit2.yaml", "shikimori"), + ("jikan/anime_full/01-frieren-52991.yaml", "jikan"), + ("shikimori/characters_by_id/01-frieren-184947.yaml", "shikimori"), + ("shikimori/studios/01-all.yaml", "shikimori"), + ("shikimori/publishers/01-all.yaml", "shikimori"), +) + + +def _body_bytes(response: dict[str, Any]) -> bytes: + if response.get("body_text") is not None: + return response["body_text"].encode("utf-8") + if response.get("body_json") is not None: + import json + + return json.dumps(response["body_json"], ensure_ascii=False).encode("utf-8") + if response.get("body_b64") is not None: + return base64.b64decode(response["body_b64"]) + return b"" + + +def _request_body(request: dict[str, Any]) -> Optional[bytes]: + if request.get("raw_body_b64") is not None: + return base64.b64decode(request["raw_body_b64"]) + return None + + +def main() -> int: + """Write aggregate demo fixture bodies into the platform-default cache.""" + cache = SqliteCache() + try: + count = 0 + for rel_path, backend in SPECS: + fixture = yaml.safe_load((FIXTURES / rel_path).read_text(encoding="utf-8")) + request = fixture["request"] + response = fixture["response"] + signature = _signature( + request["method"], + request["url"], + request.get("params"), + request.get("json_body"), + _request_body(request), + ) + cache.set_with_meta( + backend, + signature, + _body_bytes(response), + response_headers=response.get("headers") or {}, + ttl_seconds=24 * 3600, + ) + count += 1 + finally: + cache_path = cache.path + cache.close() + print(f"prewarmed {count} aggregate fixtures into {cache_path}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 270f93d9b73bb8941588bc05fd2f11306a6e61a1 Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 20:00:26 +0800 Subject: [PATCH 2/8] dev(narugo1992): restore Python 3.9-compatible aggregate types --- animedex/agg/_fanout.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/animedex/agg/_fanout.py b/animedex/agg/_fanout.py index ea550a7..d1e6d49 100644 --- a/animedex/agg/_fanout.py +++ b/animedex/agg/_fanout.py @@ -4,7 +4,7 @@ import time from concurrent.futures import ThreadPoolExecutor, as_completed -from typing import Any, Callable, Dict, Iterable, List, Tuple +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple from animedex.models.aggregate import AggregateResult, AggregateSourceStatus from animedex.models.common import ApiError @@ -13,7 +13,7 @@ SourceCallable = Callable[[], List[Any]] -def _http_status_from_message(message: str) -> int | None: +def _http_status_from_message(message: str) -> Optional[int]: """Best-effort status extraction from backend ``ApiError`` text.""" for token in message.replace("(", " ").replace(")", " ").split(): if token.isdigit() and len(token) == 3: @@ -92,7 +92,7 @@ def _run_one(name: str, fn: SourceCallable) -> Tuple[str, List[Any], AggregateSo ) -def select_sources(available: Iterable[str], requested: str | None) -> List[str]: +def select_sources(available: Iterable[str], requested: Optional[str]) -> List[str]: """Resolve a comma-separated source allowlist. :param available: Allowed source names. From f9f792f03a22a81e68425a046bf3ad6d498aa927 Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 20:14:35 +0800 Subject: [PATCH 3/8] dev(narugo1992): support older click stderr capture in aggregate tests --- test/entry/test_search.py | 19 ++++++++++++++++--- test/entry/test_show.py | 14 +++++++++++++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/test/entry/test_search.py b/test/entry/test_search.py index 63465f0..7509f29 100644 --- a/test/entry/test_search.py +++ b/test/entry/test_search.py @@ -20,8 +20,12 @@ @pytest.fixture def cli_runner(): + import inspect + from click.testing import CliRunner + if "mix_stderr" in inspect.signature(CliRunner).parameters: + return CliRunner(mix_stderr=False) return CliRunner() @@ -82,6 +86,14 @@ def _register_many(rsps: responses.RequestsMock, fixture_rels: list[str]) -> Non _register_fixture_path_only(rsps, _load_fixture(rel)) +def _combined_output(result) -> str: + try: + stderr = result.stderr + except ValueError: + stderr = "" + return result.output + stderr + + ANIME_SEARCH_FIXTURES = [ "anilist/search/01-search-frieren.yaml", "ann/substring_search/01-frieren.yaml", @@ -211,11 +223,12 @@ def test_bad_type_is_clean_click_error(self, cli_runner, cli): result = cli_runner.invoke(cli, ["search", "badtype", "x", "--json", "--no-cache"]) assert result.exit_code != 0 - assert "unknown type" in result.output - assert "supported types" in result.output + output = _combined_output(result) + assert "unknown type" in output + assert "supported types" in output def test_missing_type_uses_click_argument_error(self, cli_runner, cli): result = cli_runner.invoke(cli, ["search"]) assert result.exit_code != 0 - assert "Missing argument 'TYPE'" in result.output + assert "Missing argument 'TYPE'" in _combined_output(result) diff --git a/test/entry/test_show.py b/test/entry/test_show.py index b923d2d..3920556 100644 --- a/test/entry/test_show.py +++ b/test/entry/test_show.py @@ -20,8 +20,12 @@ @pytest.fixture def cli_runner(): + import inspect + from click.testing import CliRunner + if "mix_stderr" in inspect.signature(CliRunner).parameters: + return CliRunner(mix_stderr=False) return CliRunner() @@ -77,6 +81,14 @@ def _register_fixture_path_only(rsps: responses.RequestsMock, fixture: dict) -> rsps.add(responses.Response(method=req["method"].upper(), url=url_re, **kwargs)) +def _combined_output(result) -> str: + try: + stderr = result.stderr + except ValueError: + stderr = "" + return result.output + stderr + + class TestShowCli: @pytest.mark.parametrize( "argv,fixture_rel,expected_backend", @@ -135,7 +147,7 @@ def test_show_rejects_invalid_references_before_http(self, cli_runner, cli, argv assert len(rsps.calls) == 0 assert result.exit_code != 0 - assert expected in result.output + assert expected in _combined_output(result) def test_upstream_error_propagates_cleanly(self, cli_runner, cli, fake_clock): with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: From b937f5957662714bb33c9c078e8b629104fd7036 Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 21:41:54 +0800 Subject: [PATCH 4/8] dev(narugo1992): align aggregate substrate with search show --- animedex/agg/__init__.py | 4 +- animedex/agg/_fanout.py | 231 +++++++++++++---------- animedex/agg/search.py | 33 +++- animedex/entry/search.py | 2 +- animedex/models/aggregate.py | 116 ++++++++---- animedex/render/tty.py | 4 +- docs/source/api_doc/agg/_fanout.rst | 15 +- docs/source/api_doc/models/aggregate.rst | 4 +- test/agg/test_fanout.py | 68 +++++-- test/agg/test_prefix_id.py | 35 ++++ test/agg/test_search_show.py | 13 ++ test/agg/test_type_routes.py | 14 ++ test/models/test_aggregate.py | 12 +- test/render/test_json_renderer.py | 4 +- test/render/test_tty_phase2.py | 2 +- 15 files changed, 365 insertions(+), 192 deletions(-) diff --git a/animedex/agg/__init__.py b/animedex/agg/__init__.py index 8e6392a..0dc8e64 100644 --- a/animedex/agg/__init__.py +++ b/animedex/agg/__init__.py @@ -5,10 +5,11 @@ and generic fan-out handling for partial source failures. """ +from animedex.agg._fanout import FanoutSource, run_fanout from animedex.agg.search import search from animedex.agg.show import show -__all__ = ["search", "show"] +__all__ = ["FanoutSource", "run_fanout", "search", "show"] def selftest() -> bool: @@ -17,6 +18,7 @@ def selftest() -> bool: :return: ``True`` on success. :rtype: bool """ + assert callable(run_fanout) assert callable(search) assert callable(show) return True diff --git a/animedex/agg/_fanout.py b/animedex/agg/_fanout.py index d1e6d49..f048d73 100644 --- a/animedex/agg/_fanout.py +++ b/animedex/agg/_fanout.py @@ -1,137 +1,160 @@ -"""Shared concurrent fan-out helper for aggregate commands.""" +"""Shared concurrent fan-out helper for aggregate commands. + +Callers provide named source callables. The helper runs them +independently, catches per-source failures, and returns a structured +:class:`~animedex.models.aggregate.AggregateResult` instead of +raising on the first failed backend. +""" from __future__ import annotations +import re import time from concurrent.futures import ThreadPoolExecutor, as_completed -from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple +from dataclasses import dataclass +from typing import Callable, Dict, List, Optional, Sequence from animedex.models.aggregate import AggregateResult, AggregateSourceStatus from animedex.models.common import ApiError -SourceCallable = Callable[[], List[Any]] +@dataclass(frozen=True) +class FanoutSource: + """One source participating in aggregate fan-out. + + :ivar name: Backend identifier. + :vartype name: str + :ivar call: Zero-argument callable that returns this source's rows. + :vartype call: callable + """ + + name: str + call: Callable[[], object] + + +_HTTP_STATUS_RE = re.compile(r"\b(?:HTTP\s*)?([1-5][0-9]{2})\b", re.IGNORECASE) + + +def _duration_ms(t_start: float) -> float: + return round((time.monotonic() - t_start) * 1000.0, 3) + + +def _normalise_items(value: object) -> List[object]: + """Return a list of successful rows from a source return value.""" + if value is None: + return [] + if isinstance(value, list): + return value + if isinstance(value, tuple): + return list(value) + rows = getattr(value, "rows", None) + if isinstance(rows, list): + return rows + return [value] def _http_status_from_message(message: str) -> Optional[int]: - """Best-effort status extraction from backend ``ApiError`` text.""" - for token in message.replace("(", " ").replace(")", " ").split(): - if token.isdigit() and len(token) == 3: - value = int(token) - if 100 <= value <= 599: - return value - return None - - -def fanout(sources: Dict[str, SourceCallable], *, concurrent: bool = True) -> AggregateResult: - """Run source callables and collect successes plus failures. - - :param sources: Source name to zero-argument callable returning - JSON-ready row dicts. - :type sources: dict[str, Callable[[], list[dict]]] - :param concurrent: Whether to run sources in parallel. - :type concurrent: bool - :return: Aggregate result envelope. - :rtype: AggregateResult - """ - if not sources: - return AggregateResult(items=[], sources={}) - if not concurrent or len(sources) == 1: - pairs = [_run_one(name, fn) for name, fn in sources.items()] + match = _HTTP_STATUS_RE.search(message) + if match is None: + return None + return int(match.group(1)) + + +def _status_from_exception(name: str, exc: BaseException, duration_ms: float) -> AggregateSourceStatus: + reason = "upstream-error" + backend = name + if isinstance(exc, ApiError): + reason = exc.reason or reason + backend = exc.backend or backend + message = exc.message else: - pairs = [] - with ThreadPoolExecutor(max_workers=len(sources)) as executor: - future_map = {executor.submit(_run_one, name, fn): name for name, fn in sources.items()} - for future in as_completed(future_map): - pairs.append(future.result()) - items: List[dict] = [] - statuses: Dict[str, AggregateSourceStatus] = {} - for name, rows, status in sorted(pairs, key=lambda item: list(sources).index(item[0])): - items.extend(rows) - statuses[name] = status - return AggregateResult(items=items, sources=statuses) + message = f"{type(exc).__name__}: {exc}" + return AggregateSourceStatus( + backend=backend, + status="failed", + items=0, + reason=reason, + message=message, + http_status=_http_status_from_message(str(exc)), + duration_ms=duration_ms, + ) -def _run_one(name: str, fn: SourceCallable) -> Tuple[str, List[Any], AggregateSourceStatus]: - start = time.perf_counter() +def _run_one(source: FanoutSource): + t_start = time.monotonic() try: - rows = list(fn()) - except ApiError as exc: - duration_ms = int((time.perf_counter() - start) * 1000) - message = str(exc) - return ( - name, - [], - AggregateSourceStatus( - status="failed", - items=0, - reason=exc.reason or "upstream-error", - message=message, - http_status=_http_status_from_message(message), - duration_ms=duration_ms, - ), - ) + items = _normalise_items(source.call()) except Exception as exc: - duration_ms = int((time.perf_counter() - start) * 1000) - return ( - name, - [], - AggregateSourceStatus( - status="failed", - items=0, - reason="upstream-error", - message=f"{type(exc).__name__}: {exc}", - duration_ms=duration_ms, - ), - ) - duration_ms = int((time.perf_counter() - start) * 1000) + return source.name, [], _status_from_exception(source.name, exc, _duration_ms(t_start)) return ( - name, - rows, - AggregateSourceStatus(status="ok", items=len(rows), duration_ms=duration_ms), + source.name, + items, + AggregateSourceStatus( + backend=source.name, + status="ok", + items=len(items), + duration_ms=_duration_ms(t_start), + ), ) -def select_sources(available: Iterable[str], requested: Optional[str]) -> List[str]: - """Resolve a comma-separated source allowlist. +def run_fanout(sources: Sequence[FanoutSource], *, max_workers: Optional[int] = None) -> AggregateResult: + """Run source calls and return one aggregate envelope. - :param available: Allowed source names. - :type available: iterable[str] - :param requested: Comma-separated source list or ``None``. - :type requested: str or None - :return: Selected sources in available-source order. - :rtype: list[str] - :raises ApiError: When an unknown source is requested. + :param sources: Source call descriptors to run. + :type sources: sequence of FanoutSource + :param max_workers: Optional thread-pool size. ``None`` means one + worker per source. + :type max_workers: int or None + :return: Aggregate result with successful rows and per-source + statuses. + :rtype: AggregateResult """ - available_list = list(available) - if requested is None or not requested.strip(): - return available_list - wanted = [part.strip() for part in requested.split(",") if part.strip()] - unknown = [name for name in wanted if name not in available_list] - if unknown: - raise ApiError( - f"unknown source(s): {', '.join(unknown)}; supported sources: {', '.join(available_list)}", - backend="aggregate", - reason="bad-args", - ) - return [name for name in available_list if name in wanted] + if not sources: + return AggregateResult(items=[], sources={}) + workers = max_workers if max_workers is not None else len(sources) + workers = max(1, min(workers, len(sources))) + items_by_source: Dict[str, List[object]] = {} + statuses: Dict[str, AggregateSourceStatus] = {} + with ThreadPoolExecutor(max_workers=workers) as executor: + futures = {executor.submit(_run_one, source): source.name for source in sources} + for future in as_completed(futures): + name, source_items, status = future.result() + statuses[name] = status + items_by_source[name] = source_items + items: List[object] = [] + for source in sources: + items.extend(items_by_source.get(source.name, [])) + ordered_statuses = {source.name: statuses[source.name] for source in sources} + return AggregateResult(items=items, sources=ordered_statuses) def selftest() -> bool: - """Smoke-test success, failure, and source selection paths. + """Smoke-test success, empty, and failed fan-out paths. :return: ``True`` on success. :rtype: bool """ - result = fanout( - { - "a": lambda: [{"_source": "a"}], - "b": lambda: (_ for _ in ()).throw(ApiError("boom", backend="b", reason="upstream-error")), - }, - concurrent=False, + + def _ok(): + return [1, 2] + + def _empty(): + return [] + + def _fail(): + raise ApiError("upstream 500", backend="bad", reason="upstream-error") + + result = run_fanout( + [ + FanoutSource("ok", _ok), + FanoutSource("empty", _empty), + FanoutSource("bad", _fail), + ], + max_workers=1, ) - assert len(result.items) == 1 - assert result.sources["a"].status == "ok" - assert result.sources["b"].status == "failed" - assert select_sources(["a", "b"], "b") == ["b"] + assert result.sources["ok"].items == 2 + assert result.sources["empty"].status == "ok" + assert result.sources["bad"].http_status == 500 + assert len(result.items) == 2 return True diff --git a/animedex/agg/search.py b/animedex/agg/search.py index 60f2318..56730a8 100644 --- a/animedex/agg/search.py +++ b/animedex/agg/search.py @@ -2,9 +2,9 @@ from __future__ import annotations -from typing import Optional +from typing import Iterable, List, Optional -from animedex.agg._fanout import fanout, select_sources +from animedex.agg._fanout import FanoutSource, run_fanout from animedex.agg._prefix_id import prefix_for_backend from animedex.agg._type_routes import call_search_route, search_routes_for, validate_entity_type from animedex.config import Config @@ -12,6 +12,31 @@ from animedex.models.common import AnimedexModel, ApiError +def _select_sources(available: Iterable[str], requested: Optional[str]) -> List[str]: + """Resolve a comma-separated source allowlist for entity search. + + :param available: Allowed source names. + :type available: iterable[str] + :param requested: Comma-separated source list or ``None``. + :type requested: str or None + :return: Selected sources in available-source order. + :rtype: list[str] + :raises ApiError: When an unknown source is requested. + """ + available_list = list(available) + if requested is None or not requested.strip(): + return available_list + wanted = [part.strip() for part in requested.split(",") if part.strip()] + unknown = [name for name in wanted if name not in available_list] + if unknown: + raise ApiError( + f"unknown source(s): {', '.join(unknown)}; supported sources: {', '.join(available_list)}", + backend="aggregate", + reason="bad-args", + ) + return [name for name in available_list if name in wanted] + + def _native_id(row, backend: str): data = row.model_dump(mode="json", by_alias=True) if hasattr(row, "model_dump") else row if backend == "anilist": @@ -66,7 +91,7 @@ def search( if limit < 1: raise ApiError("limit must be >= 1", backend="aggregate", reason="bad-args") routes = search_routes_for(entity_type) - selected = set(select_sources((route.backend for route in routes), source)) + selected = set(_select_sources((route.backend for route in routes), source)) selected_routes = [route for route in routes if route.backend in selected] def _make(route): @@ -74,7 +99,7 @@ def _make(route): _annotate_row(row, route.backend) for row in call_search_route(route, q, limit, config=config, **kw) ] - return fanout({route.backend: _make(route) for route in selected_routes}) + return run_fanout([FanoutSource(route.backend, _make(route)) for route in selected_routes]) def selftest() -> bool: diff --git a/animedex/entry/search.py b/animedex/entry/search.py index 4584c14..3734735 100644 --- a/animedex/entry/search.py +++ b/animedex/entry/search.py @@ -12,7 +12,7 @@ def _emit_failure_lines(result: AggregateResult) -> None: - for name, status in result.failed_sources().items(): + for name, status in result.failed_sources.items(): reason = status.reason or "failed" message = status.message or reason click.echo(f"source {name!r} failed: {message}; continuing with other sources", err=True) diff --git a/animedex/models/aggregate.py b/animedex/models/aggregate.py index 217c59c..e3fc700 100644 --- a/animedex/models/aggregate.py +++ b/animedex/models/aggregate.py @@ -1,104 +1,140 @@ -"""Aggregate command result models. - -The aggregate layer composes several high-level backends while keeping -the source attribution contract explicit. Successful rows live in -``items``; per-source status, including partial failures, lives in -``sources``. +"""Shared result envelope for multi-source aggregate commands. + +Aggregate commands such as ``animedex search``, ``animedex show``, +``animedex season``, and ``animedex schedule`` fan out to one or more +upstream backends and may receive a mix of successful rows and +per-source failures. This module provides the stable envelope shape +those commands return: ``items`` contains only rows from successful +sources, while ``sources`` records one status row per selected +backend. """ from __future__ import annotations +from datetime import datetime, timezone from typing import Any, Dict, List, Optional -from animedex.models.common import AnimedexModel +from pydantic import Field + +from animedex.models.common import AnimedexModel, SourceTag class AggregateSourceStatus(AnimedexModel): - """Status row for one source consulted by an aggregate command. + """Status row for one backend inside an aggregate response. - :ivar status: ``"ok"`` or ``"failed"``. + :ivar backend: Backend identifier, e.g. ``"anilist"``. + :vartype backend: str + :ivar status: ``"ok"`` for a successful source, ``"failed"`` for + a source that raised while the fan-out continued. :vartype status: str - :ivar items: Number of successful rows returned by this source. + :ivar items: Number of successful rows contributed by this source. :vartype items: int - :ivar reason: Typed failure reason when the source failed. + :ivar reason: Stable error reason when the source failed. :vartype reason: str or None - :ivar message: Human-readable failure summary. + :ivar message: Human-readable source failure message. :vartype message: str or None - :ivar http_status: Upstream HTTP status when known. + :ivar http_status: HTTP status code when the failure exposed one. :vartype http_status: int or None - :ivar duration_ms: Wall-clock duration spent on this source. - :vartype duration_ms: int + :ivar duration_ms: Wall-clock time spent in this source call. + :vartype duration_ms: float """ + backend: str status: str items: int = 0 reason: Optional[str] = None message: Optional[str] = None http_status: Optional[int] = None - duration_ms: int = 0 + duration_ms: float = 0.0 + + @property + def ok(self) -> bool: + """Return whether this source succeeded. + + :return: ``True`` when :attr:`status` is ``"ok"``. + :rtype: bool + """ + return self.status == "ok" class AggregateResult(AnimedexModel): """Envelope returned by multi-source aggregate commands. - :ivar items: Successful rows. Each row is a JSON-ready dict that - carries ``_source`` and, for entity rows, - ``_prefix_id``. - :vartype items: list[dict] + The ``items`` list preserves each backend's rich model. Failures + are deliberately not injected into ``items``; they live only in + ``sources`` so a caller iterating over successful records never + has to special-case failure sentinels. + + :ivar items: Successful rows from every healthy source. + :vartype items: list :ivar sources: Per-source status map. :vartype sources: dict[str, AggregateSourceStatus] """ - items: List[Any] = [] - sources: Dict[str, AggregateSourceStatus] = {} + items: List[Any] = Field(default_factory=list) + sources: Dict[str, AggregateSourceStatus] = Field(default_factory=dict) + @property def failed_sources(self) -> Dict[str, AggregateSourceStatus]: - """Return the subset of sources that failed. + """Return the failed source statuses. - :return: Source-status map containing only failed rows. + :return: Mapping containing only failed sources. :rtype: dict[str, AggregateSourceStatus] """ - return {name: status for name, status in self.sources.items() if status.status == "failed"} + return {name: status for name, status in self.sources.items() if not status.ok} - def ok_sources(self) -> Dict[str, AggregateSourceStatus]: - """Return the subset of sources that succeeded. + @property + def succeeded_count(self) -> int: + """Return how many selected sources succeeded. - :return: Source-status map containing only successful rows. - :rtype: dict[str, AggregateSourceStatus] + :return: Number of ``status == "ok"`` entries. + :rtype: int """ - return {name: status for name, status in self.sources.items() if status.status == "ok"} + return sum(1 for status in self.sources.values() if status.ok) @property def all_failed(self) -> bool: - """Whether every selected source failed. + """Return whether every selected source failed. :return: ``True`` when at least one source was selected and none succeeded. :rtype: bool """ - return bool(self.sources) and not self.ok_sources() + return bool(self.sources) and self.succeeded_count == 0 def selftest() -> bool: - """Smoke-test aggregate model validation and helpers. + """Smoke-test the aggregate envelope model. + + The diagnostic runner invokes this to confirm that nested rich + models can be carried through the aggregate JSON path and that the + source-status helpers behave correctly. :return: ``True`` on success. :rtype: bool """ + src = SourceTag(backend="_selftest", fetched_at=datetime.now(timezone.utc)) result = AggregateResult( - items=[{"id": 1, "_source": "demo", "_prefix_id": "demo:1"}], + items=[src], sources={ - "demo": AggregateSourceStatus(status="ok", items=1, duration_ms=1), - "bad": AggregateSourceStatus(status="failed", reason="upstream-error", message="bad", duration_ms=2), + "ok": AggregateSourceStatus(backend="ok", status="ok", items=1), + "failed": AggregateSourceStatus( + backend="failed", + status="failed", + reason="upstream-error", + message="failed", + http_status=500, + ), }, ) - assert set(result.ok_sources()) == {"demo"} - assert set(result.failed_sources()) == {"bad"} + decoded = result.model_dump(mode="json") + assert decoded["items"][0]["backend"] == "_selftest" + assert result.succeeded_count == 1 + assert list(result.failed_sources) == ["failed"] assert not result.all_failed - AggregateResult.model_validate_json(result.model_dump_json()) failed = AggregateResult( items=[], - sources={"bad": AggregateSourceStatus(status="failed", reason="upstream-error")}, + sources={"bad": AggregateSourceStatus(backend="bad", status="failed", reason="upstream-error")}, ) assert failed.all_failed return True diff --git a/animedex/render/tty.py b/animedex/render/tty.py index 65df3d3..2cb8a30 100644 --- a/animedex/render/tty.py +++ b/animedex/render/tty.py @@ -299,8 +299,8 @@ def _format_trace_quota_tty(q: TraceQuota) -> str: def _format_aggregate_result_tty(result: AggregateResult) -> str: out = io.StringIO() print("Aggregate results", file=out) - if result.failed_sources(): - failed = ", ".join(sorted(result.failed_sources())) + if result.failed_sources: + failed = ", ".join(sorted(result.failed_sources)) print(f" Failed sources: {failed}", file=out) for item in result.items: if hasattr(item, "to_common"): diff --git a/docs/source/api_doc/agg/_fanout.rst b/docs/source/api_doc/agg/_fanout.rst index 5fd09a1..cf30740 100644 --- a/docs/source/api_doc/agg/_fanout.rst +++ b/docs/source/api_doc/agg/_fanout.rst @@ -6,22 +6,17 @@ animedex.agg.\_fanout .. automodule:: animedex.agg._fanout -SourceCallable +FanoutSource ----------------------------------------------------- -.. autodata:: SourceCallable +.. autoclass:: FanoutSource + :members: name,call -fanout +run\_fanout ----------------------------------------------------- -.. autofunction:: fanout - - -select\_sources ------------------------------------------------------ - -.. autofunction:: select_sources +.. autofunction:: run_fanout selftest diff --git a/docs/source/api_doc/models/aggregate.rst b/docs/source/api_doc/models/aggregate.rst index 178bf14..8240e9f 100644 --- a/docs/source/api_doc/models/aggregate.rst +++ b/docs/source/api_doc/models/aggregate.rst @@ -10,14 +10,14 @@ AggregateSourceStatus ----------------------------------------------------- .. autoclass:: AggregateSourceStatus - :members: status,items,reason,message,http_status,duration_ms + :members: ok,backend,status,items,reason,message,http_status,duration_ms AggregateResult ----------------------------------------------------- .. autoclass:: AggregateResult - :members: failed_sources,ok_sources,all_failed,items,sources + :members: failed_sources,succeeded_count,all_failed,items,sources selftest diff --git a/test/agg/test_fanout.py b/test/agg/test_fanout.py index 7b5488d..6151be6 100644 --- a/test/agg/test_fanout.py +++ b/test/agg/test_fanout.py @@ -9,52 +9,80 @@ class TestFanout: + def test_empty_sources_return_empty_result(self): + from animedex.agg._fanout import run_fanout + + result = run_fanout([]) + + assert result.items == [] + assert result.sources == {} + assert result.all_failed is False + def test_collects_successes_and_failures_in_source_order(self): - from animedex.agg._fanout import fanout + from animedex.agg._fanout import FanoutSource, run_fanout from animedex.models.common import ApiError - result = fanout( - { - "a": lambda: [{"_source": "a", "id": 1}], - "b": lambda: (_ for _ in ()).throw(ApiError("backend b 503", backend="b", reason="upstream-error")), - "c": lambda: [{"_source": "c", "id": 3}], - }, - concurrent=False, + result = run_fanout( + [ + FanoutSource("a", lambda: [{"_source": "a", "id": 1}]), + FanoutSource( + "b", lambda: (_ for _ in ()).throw(ApiError("backend b 503", backend="b", reason="upstream-error")) + ), + FanoutSource("c", lambda: [{"_source": "c", "id": 3}]), + ], + max_workers=1, ) assert [item["_source"] for item in result.items] == ["a", "c"] assert list(result.sources) == ["a", "b", "c"] + assert result.sources["a"].backend == "a" assert result.sources["a"].status == "ok" assert result.sources["b"].status == "failed" assert result.sources["b"].http_status == 503 assert result.sources["b"].reason == "upstream-error" assert result.all_failed is False + def test_unexpected_exception_is_reported_as_failed_source(self): + from animedex.agg._fanout import FanoutSource, run_fanout + + result = run_fanout( + [FanoutSource("broken", lambda: (_ for _ in ()).throw(RuntimeError("boom")))], max_workers=1 + ) + + assert result.items == [] + assert result.sources["broken"].status == "failed" + assert result.sources["broken"].reason == "upstream-error" + assert result.sources["broken"].message == "RuntimeError: boom" + def test_all_failed_is_true_only_when_no_source_succeeds(self): - from animedex.agg._fanout import fanout + from animedex.agg._fanout import FanoutSource, run_fanout from animedex.models.common import ApiError - result = fanout( - { - "a": lambda: (_ for _ in ()).throw(ApiError("a 503", backend="a", reason="upstream-error")), - "b": lambda: (_ for _ in ()).throw(ApiError("b 503", backend="b", reason="upstream-error")), - }, - concurrent=False, + result = run_fanout( + [ + FanoutSource( + "a", lambda: (_ for _ in ()).throw(ApiError("a 503", backend="a", reason="upstream-error")) + ), + FanoutSource( + "b", lambda: (_ for _ in ()).throw(ApiError("b 503", backend="b", reason="upstream-error")) + ), + ], + max_workers=1, ) assert result.items == [] assert result.all_failed is True - assert set(result.failed_sources()) == {"a", "b"} + assert set(result.failed_sources) == {"a", "b"} def test_source_allowlist_preserves_available_order(self): - from animedex.agg._fanout import select_sources + from animedex.agg.search import _select_sources - assert select_sources(["anilist", "jikan", "kitsu"], "kitsu,anilist") == ["anilist", "kitsu"] + assert _select_sources(["anilist", "jikan", "kitsu"], "kitsu,anilist") == ["anilist", "kitsu"] def test_source_allowlist_rejects_unknown_names(self): - from animedex.agg._fanout import select_sources + from animedex.agg.search import _select_sources from animedex.models.common import ApiError with pytest.raises(ApiError, match="unknown source") as excinfo: - select_sources(["anilist", "jikan"], "anilist,nope") + _select_sources(["anilist", "jikan"], "anilist,nope") assert excinfo.value.reason == "bad-args" diff --git a/test/agg/test_prefix_id.py b/test/agg/test_prefix_id.py index 7b7beba..74d2845 100644 --- a/test/agg/test_prefix_id.py +++ b/test/agg/test_prefix_id.py @@ -9,6 +9,15 @@ class TestPrefixIds: + def test_known_prefixes_are_sorted_and_exclude_deferred_sources(self): + from animedex.agg._prefix_id import known_prefixes + + prefixes = tuple(known_prefixes()) + + assert prefixes == tuple(sorted(prefixes)) + assert "anilist" in prefixes + assert "anidb" not in prefixes + def test_parse_supported_prefixes(self): from animedex.agg._prefix_id import parse @@ -17,6 +26,23 @@ def test_parse_supported_prefixes(self): assert parse("myanimelist:52991").backend == "jikan" assert parse("mangadex:dc8bbc4c-eb7a-4d27-b96a-9aa8c8db4adb").backend == "mangadex" + def test_rejects_missing_separator(self): + from animedex.agg._prefix_id import parse + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="entity reference must be prefix:id") as excinfo: + parse("anilist") + assert excinfo.value.reason == "bad-args" + + @pytest.mark.parametrize("value", [":154587", "anilist:"]) + def test_rejects_missing_prefix_or_id(self, value): + from animedex.agg._prefix_id import parse + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="entity reference must include both prefix and id") as excinfo: + parse(value) + assert excinfo.value.reason == "bad-args" + def test_rejects_unknown_prefix(self): from animedex.agg._prefix_id import parse from animedex.models.common import ApiError @@ -34,6 +60,15 @@ def test_rejects_bad_numeric_id_before_http(self): assert excinfo.value.backend == "anilist" assert excinfo.value.reason == "bad-args" + def test_rejects_bad_mangadex_uuid_before_http(self): + from animedex.agg._prefix_id import parse + from animedex.models.common import ApiError + + with pytest.raises(ApiError, match="ID is not a MangaDex UUID") as excinfo: + parse("mangadex:not-a-uuid") + assert excinfo.value.backend == "mangadex" + assert excinfo.value.reason == "bad-args" + def test_anidb_is_deferred_explicitly(self): from animedex.agg._prefix_id import parse from animedex.models.common import ApiError diff --git a/test/agg/test_search_show.py b/test/agg/test_search_show.py index 82d69bd..933ac65 100644 --- a/test/agg/test_search_show.py +++ b/test/agg/test_search_show.py @@ -56,6 +56,19 @@ def _register_fixture_path_only(rsps: responses.RequestsMock, fixture: dict) -> class TestAggregateSearch: + def test_native_id_falls_back_to_plain_id_for_unknown_backend(self): + from animedex.agg.search import _native_id + + assert _native_id({"id": "mystery-1"}, "unknown") == "mystery-1" + + def test_annotates_plain_dict_rows_without_known_prefix(self): + from animedex.agg.search import _annotate_row + + row = _annotate_row({"id": "local-1", "title": "Local"}, "local") + + assert row == {"id": "local-1", "title": "Local", "_source": "local"} + assert "_prefix_id" not in row + def test_annotates_real_rich_rows_with_source_and_prefix_id(self, fake_clock): from animedex.agg.search import search diff --git a/test/agg/test_type_routes.py b/test/agg/test_type_routes.py index a682dfc..d366ca8 100644 --- a/test/agg/test_type_routes.py +++ b/test/agg/test_type_routes.py @@ -47,3 +47,17 @@ def test_mangadex_show_route_uses_uuid_string_id(self): assert route.function_name == "show" assert route.id_arg == "id" + + def test_filter_rows_keeps_rows_when_query_is_empty(self): + from animedex.agg._type_routes import _filter_rows + + rows = [{"title": "A"}, {"title": "B"}] + + assert _filter_rows(rows, "") is rows + + def test_filter_rows_matches_nested_list_values(self): + from animedex.agg._type_routes import _filter_rows + + rows = [{"title": "No match", "aliases": ["Sousou no Frieren"]}, {"title": "Other", "aliases": []}] + + assert _filter_rows(rows, "frieren") == [rows[0]] diff --git a/test/models/test_aggregate.py b/test/models/test_aggregate.py index 90acf6a..602117c 100644 --- a/test/models/test_aggregate.py +++ b/test/models/test_aggregate.py @@ -15,13 +15,15 @@ def test_source_status_helpers(self): result = AggregateResult( items=[{"id": 1, "_source": "anilist"}], sources={ - "anilist": AggregateSourceStatus(status="ok", items=1), - "jikan": AggregateSourceStatus(status="failed", reason="upstream-error", message="jikan 503"), + "anilist": AggregateSourceStatus(backend="anilist", status="ok", items=1), + "jikan": AggregateSourceStatus( + backend="jikan", status="failed", reason="upstream-error", message="jikan 503" + ), }, ) - assert set(result.ok_sources()) == {"anilist"} - assert set(result.failed_sources()) == {"jikan"} + assert result.succeeded_count == 1 + assert set(result.failed_sources) == {"jikan"} assert result.all_failed is False def test_all_failed(self): @@ -29,7 +31,7 @@ def test_all_failed(self): result = AggregateResult( items=[], - sources={"anilist": AggregateSourceStatus(status="failed", reason="upstream-error")}, + sources={"anilist": AggregateSourceStatus(backend="anilist", status="failed", reason="upstream-error")}, ) assert result.all_failed is True diff --git a/test/render/test_json_renderer.py b/test/render/test_json_renderer.py index 689e722..3e87f77 100644 --- a/test/render/test_json_renderer.py +++ b/test/render/test_json_renderer.py @@ -117,8 +117,8 @@ def test_aggregate_sources_map_reports_ok_sources_only(self): result = AggregateResult( items=[{"id": 1, "_source": "jikan", "_prefix_id": "mal:1"}], sources={ - "anilist": AggregateSourceStatus(status="failed", reason="upstream-error"), - "jikan": AggregateSourceStatus(status="ok", items=1), + "anilist": AggregateSourceStatus(backend="anilist", status="failed", reason="upstream-error"), + "jikan": AggregateSourceStatus(backend="jikan", status="ok", items=1), }, ) decoded = json.loads(render_json(result, include_source=True)) diff --git a/test/render/test_tty_phase2.py b/test/render/test_tty_phase2.py index 0a8c233..3add735 100644 --- a/test/render/test_tty_phase2.py +++ b/test/render/test_tty_phase2.py @@ -163,7 +163,7 @@ def test_renders_compact_rows_with_prefix_and_source(self): } ).model_copy(update={"_source": "jikan", "_prefix_id": "mal:52991"}) ], - sources={"jikan": AggregateSourceStatus(status="ok", items=1)}, + sources={"jikan": AggregateSourceStatus(backend="jikan", status="ok", items=1)}, ) out = render_tty(result) From b3219d4d1d9b8c27b99250768e12f0b780aa6445 Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 21:46:58 +0800 Subject: [PATCH 5/8] dev(narugo1992): rename aggregate demo to search show --- docs/source/_static/gifs/README.md | 6 +++--- .../_static/gifs/{aggregate.gif => search_show.gif} | Bin .../gifs/{aggregate.tape => search_show.tape} | 4 ++-- docs/source/tutorials/index.rst | 2 +- .../tutorials/{aggregate.rst => search_show.rst} | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename docs/source/_static/gifs/{aggregate.gif => search_show.gif} (100%) rename docs/source/_static/gifs/{aggregate.tape => search_show.tape} (91%) rename docs/source/tutorials/{aggregate.rst => search_show.rst} (99%) diff --git a/docs/source/_static/gifs/README.md b/docs/source/_static/gifs/README.md index 054aef9..b8d02cb 100644 --- a/docs/source/_static/gifs/README.md +++ b/docs/source/_static/gifs/README.md @@ -22,7 +22,7 @@ source tapes so future contributors can regenerate them. | `trace.gif` | `docs/source/tutorials/backends/trace.rst` header | `trace.tape` | | `nekos.gif` | `docs/source/tutorials/backends/nekos.rst` header | `nekos.tape` | | `shikimori.gif` | `docs/source/tutorials/backends/shikimori.rst` header | `shikimori.tape` | -| `aggregate.gif` | `docs/source/tutorials/aggregate.rst` header | `aggregate.tape` | +| `search_show.gif` | `docs/source/tutorials/search_show.rst` header | `search_show.tape` | ## Regenerating @@ -48,12 +48,12 @@ vhs quote.tape # produces quote.gif vhs trace.tape # produces trace.gif vhs nekos.tape # produces nekos.gif vhs shikimori.tape # produces shikimori.gif -vhs aggregate.tape # produces aggregate.gif +vhs search_show.tape # produces search_show.gif ``` vhs is available as a single-file binary at [github.com/charmbracelet/vhs/releases](https://github.com/charmbracelet/vhs/releases). -The render is local and offline-after-install — no network calls happen inside vhs itself. Most tapes intentionally run live `animedex` commands, so they need network at record time and may show small upstream drift such as a different random image or score. `ghibli.tape` is fully offline, and `quote.tape` / `shikimori.tape` / `aggregate.tape` prewarm a temporary local cache from committed fixtures before the visible commands run so the demos stay stable under tight upstream limits. +The render is local and offline-after-install — no network calls happen inside vhs itself. Most tapes intentionally run live `animedex` commands, so they need network at record time and may show small upstream drift such as a different random image or score. `ghibli.tape` is fully offline, and `quote.tape` / `shikimori.tape` / `search_show.tape` prewarm a temporary local cache from committed fixtures before the visible commands run so the demos stay stable under tight upstream limits. ## Why commit both .tape and .gif? diff --git a/docs/source/_static/gifs/aggregate.gif b/docs/source/_static/gifs/search_show.gif similarity index 100% rename from docs/source/_static/gifs/aggregate.gif rename to docs/source/_static/gifs/search_show.gif diff --git a/docs/source/_static/gifs/aggregate.tape b/docs/source/_static/gifs/search_show.tape similarity index 91% rename from docs/source/_static/gifs/aggregate.tape rename to docs/source/_static/gifs/search_show.tape index 398e439..212bb42 100644 --- a/docs/source/_static/gifs/aggregate.tape +++ b/docs/source/_static/gifs/search_show.tape @@ -1,9 +1,9 @@ -# vhs tape - animedex aggregate search/show tour (~18 s) +# vhs tape - animedex search/show aggregate tour (~18 s) # # Uses a pre-warmed local cache during rendering so the demo is stable # and does not depend on live upstream rate-limit state. -Output aggregate.gif +Output search_show.gif Set Theme "Dracula" Set FontSize 13 diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index f96e521..98e02a4 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -35,7 +35,7 @@ Cross-cutting tutorials .. toctree:: :maxdepth: 1 - aggregate + search_show raw_passthrough output_modes python_library diff --git a/docs/source/tutorials/aggregate.rst b/docs/source/tutorials/search_show.rst similarity index 99% rename from docs/source/tutorials/aggregate.rst rename to docs/source/tutorials/search_show.rst index 48c5748..b364d99 100644 --- a/docs/source/tutorials/aggregate.rst +++ b/docs/source/tutorials/search_show.rst @@ -3,7 +3,7 @@ The top-level aggregate commands are the normal entry point when the user has not chosen a backend yet. ``animedex search`` fans out to every catalogue that supports the requested entity type, while ``animedex show`` routes one ``prefix:id`` reference back to the owning backend. -.. image:: /_static/gifs/aggregate.gif +.. image:: /_static/gifs/search_show.gif :alt: animedex aggregate demo - multi-source search and prefix-id show :align: center From 9e4dbe00576ac72cca8f1491daf2cc0b9d9c5a96 Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 22:24:07 +0800 Subject: [PATCH 6/8] dev(narugo1992): clarify data language policy and cover aggregate fallbacks --- AGENTS.md | 2 + animedex/render/tty.py | 4 +- test/agg/test_fanout.py | 11 +++++ test/backends/anilist/test_python_api.py | 1 + test/backends/kitsu/test_python_api.py | 25 ++++++++++ test/backends/shikimori/test_python_api.py | 23 +++++++++ test/render/test_tty_phase2.py | 57 ++++++++++++++++++++++ 7 files changed, 122 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 5105af1..c103272 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,6 +26,8 @@ This repository is **English-only**. All tracked content must be written in Engl This rule also applies when using Codex, Claude Code, or any other agent. The conversation language with the user may be anything, but every repository-facing action must remain in English. That includes file edits, code comments, log messages, generated README content, commit messages, and any other text written into the repository or its git history. +The English-only rule governs contributor-authored prose and interface text, not factual data. Fixture payloads, captured upstream response values, entity titles, names, slugs, user queries, JSON literals, and test strings that represent real upstream/user data may contain their original language and non-ASCII characters when that is the correct data. Do not translate, romanize, censor, or replace data values solely to satisfy the English-only rule; only translate contributor-authored explanations, comments, docs, and UI/help text. + ### Markdown formatting (no hard wrapping in prose) In Markdown files (`*.md`) and in any GitHub-rendered content (issue and pull-request bodies, comments, release notes, discussion posts), do **not** hard-wrap natural paragraphs to a fixed column width. The renderers used in those contexts have no fixed max-width, so column-wrapping the source serves no purpose and only makes diffs noisier. diff --git a/animedex/render/tty.py b/animedex/render/tty.py index 2cb8a30..c8190d7 100644 --- a/animedex/render/tty.py +++ b/animedex/render/tty.py @@ -320,7 +320,9 @@ def _format_aggregate_result_tty(result: AggregateResult) -> str: if isinstance(dict_label, dict): dict_label = dict_label.get("romaji") or dict_label.get("english") or dict_label.get("en") else: - source = getattr(getattr(item, "source_tag", None), "backend", None) + source = getattr(getattr(item, "source_tag", None), "backend", None) or getattr( + getattr(item, "source", None), "backend", None + ) prefix_id = getattr(item, "_prefix_id", None) label = None score = None diff --git a/test/agg/test_fanout.py b/test/agg/test_fanout.py index 6151be6..c42a92e 100644 --- a/test/agg/test_fanout.py +++ b/test/agg/test_fanout.py @@ -9,6 +9,17 @@ class TestFanout: + def test_normalises_source_return_shapes(self): + from animedex.agg._fanout import _normalise_items + + class Rows: + rows = [1, 2] + + assert _normalise_items(None) == [] + assert _normalise_items((1, 2)) == [1, 2] + assert _normalise_items(Rows()) == [1, 2] + assert _normalise_items("x") == ["x"] + def test_empty_sources_return_empty_result(self): from animedex.agg._fanout import run_fanout diff --git a/test/backends/anilist/test_python_api.py b/test/backends/anilist/test_python_api.py index 76bbd91..037b9f7 100644 --- a/test/backends/anilist/test_python_api.py +++ b/test/backends/anilist/test_python_api.py @@ -81,6 +81,7 @@ def _register(rsps: responses.RequestsMock, fixture: dict) -> None: # (fixture_rel, fn, args, kwargs, expected_type_or_list) ("media/01-media-frieren.yaml", anilist_api.show, (154587,), {}, AnilistAnime), ("search/01-search-frieren.yaml", anilist_api.search, ("Frieren",), {"per_page": 5}, list), + ("graphql/28-manga-search-berserk.yaml", anilist_api.manga_search, ("Berserk",), {"per_page": 5}, list), ("character/01-character-edward-elric.yaml", anilist_api.character, (11,), {}, AnilistCharacter), ("staff/01-staff-101572.yaml", anilist_api.staff, (101572,), {}, AnilistStaff), ("studio/01-studio-madhouse.yaml", anilist_api.studio, (11,), {}, AnilistStudio), diff --git a/test/backends/kitsu/test_python_api.py b/test/backends/kitsu/test_python_api.py index 7c7934c..b5a344a 100644 --- a/test/backends/kitsu/test_python_api.py +++ b/test/backends/kitsu/test_python_api.py @@ -22,13 +22,16 @@ KitsuAnimeAttributes, KitsuCategory, KitsuCharacter, + KitsuCharacterAttributes, KitsuFranchise, KitsuGenre, KitsuManga, KitsuMangaAttributes, KitsuMapping, KitsuPerson, + KitsuPersonAttributes, KitsuProducer, + KitsuProducerAttributes, KitsuRelatedResource, KitsuStreamer, KitsuStreamingLinkAttributes, @@ -378,6 +381,28 @@ def test_model_projection_fallbacks(self): ).to_common() assert custom.provider == "video.example.invalid" + character = KitsuCharacter( + id="c", + attributes=KitsuCharacterAttributes( + name="Frieren", + names={"ja_jp": "Frieren Native"}, + otherNames=["Frieren the Slayer"], + image={"original": "https://img.example.invalid/frieren.png"}, + ), + ).to_common() + assert character.id == "kitsu:char:c" + assert character.name == "Frieren" + assert character.name_native == "Frieren Native" + assert character.image_url == "https://img.example.invalid/frieren.png" + + person = KitsuPerson(id="p", attributes=KitsuPersonAttributes(name="Hayao Miyazaki")).to_common() + assert person.id == "kitsu:person:p" + assert person.name == "Hayao Miyazaki" + + producer = KitsuProducer(id="g", attributes=KitsuProducerAttributes(name="Studio Ghibli")).to_common() + assert producer.id == "kitsu:producer:g" + assert producer.name == "Studio Ghibli" + # ---------- error paths ---------- diff --git a/test/backends/shikimori/test_python_api.py b/test/backends/shikimori/test_python_api.py index 932fb32..329cbca 100644 --- a/test/backends/shikimori/test_python_api.py +++ b/test/backends/shikimori/test_python_api.py @@ -359,6 +359,7 @@ def test_show_array_payload_raises_shape_error(self, fake_clock): (shiki_api.manga_show, "/api/mangas/2", 2), (shiki_api.ranobe_show, "/api/ranobe/23751", 23751), (shiki_api.club_show, "/api/clubs/1", 1), + (shiki_api.character, "/api/characters/184947", 184947), (shiki_api.person, "/api/people/1870", 1870), ], ) @@ -388,3 +389,25 @@ def test_object_list_payload_normalises_to_one_row(self, fake_clock): assert len(out) == 1 assert isinstance(out[0], ShikimoriAnime) + + def test_publisher_not_found_raises_typed_error(self, fake_clock): + from animedex.models.common import ApiError + + with responses.RequestsMock() as rsps: + _register(rsps, _load("publishers/01-all.yaml")) + with pytest.raises(ApiError) as ei: + shiki_api.publisher(999999999, no_cache=True) + + assert ei.value.backend == "shikimori" + assert ei.value.reason == "not-found" + + def test_studio_not_found_raises_typed_error(self, fake_clock): + from animedex.models.common import ApiError + + with responses.RequestsMock() as rsps: + _register(rsps, _load("studios/01-all.yaml")) + with pytest.raises(ApiError) as ei: + shiki_api.studio(999999999, no_cache=True) + + assert ei.value.backend == "shikimori" + assert ei.value.reason == "not-found" diff --git a/test/render/test_tty_phase2.py b/test/render/test_tty_phase2.py index 3add735..1eeb947 100644 --- a/test/render/test_tty_phase2.py +++ b/test/render/test_tty_phase2.py @@ -171,3 +171,60 @@ def test_renders_compact_rows_with_prefix_and_source(self): assert "[src: jikan]" in out assert "mal:52991" in out assert "Score:" in out + + def test_renders_failed_sources_dict_labels_and_common_shapes(self): + from animedex.models.aggregate import AggregateResult, AggregateSourceStatus + from animedex.models.character import Character, Staff, Studio + from animedex.models.common import AnimedexModel, SourceTag + from animedex.render.tty import render_tty + + class CommonProjection(AnimedexModel): + kind: str + name: str + source_tag: SourceTag + + def to_common(self): + if self.kind == "character": + return Character(id="character:1", name=self.name, source=self.source_tag) + if self.kind == "staff": + return Staff(id="staff:1", name=self.name, source=self.source_tag) + return Studio(id="studio:1", name=self.name, source=self.source_tag) + + result = AggregateResult( + items=[ + {"title": {"english": "Plain Dict"}, "_source": "dict", "_prefix_id": "dict:1"}, + CommonProjection(kind="character", name="Frieren", source_tag=_src("character")), + CommonProjection(kind="staff", name="Naoko Yamada", source_tag=_src("staff")), + CommonProjection(kind="studio", name="MADHOUSE", source_tag=_src("studio")), + ], + sources={ + "dict": AggregateSourceStatus(backend="dict", status="ok", items=1), + "broken": AggregateSourceStatus( + backend="broken", status="failed", reason="upstream-error", message="broken" + ), + }, + ) + out = render_tty(result) + + assert "Failed sources: broken" in out + assert "Plain Dict (dict:1) [src: dict]" in out + assert "Frieren [src: character]" in out + assert "Naoko Yamada [src: staff]" in out + assert "MADHOUSE [src: studio]" in out + + def test_renders_aggregate_item_when_to_common_raises(self): + from animedex.models.aggregate import AggregateResult + from animedex.models.common import AnimedexModel, SourceTag + from animedex.render.tty import render_tty + + class BrokenProjection(AnimedexModel): + name: str + source_tag: SourceTag + + def to_common(self): + raise RuntimeError("bad projection") + + result = AggregateResult(items=[BrokenProjection(name="Raw Label", source_tag=_src("raw"))], sources={}) + out = render_tty(result) + + assert "Raw Label [src: raw]" in out From bfdba2e81456bdbdfc1e1c1393d33f26f733c2fb Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Mon, 11 May 2026 22:50:33 +0800 Subject: [PATCH 7/8] dev(narugo1992): expand aggregate search help --- animedex/entry/search.py | 35 ++++++++++++++++++++++++++++++++--- test/entry/test_search.py | 25 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/animedex/entry/search.py b/animedex/entry/search.py index 3734735..11c85ec 100644 --- a/animedex/entry/search.py +++ b/animedex/entry/search.py @@ -28,12 +28,41 @@ def _emit_failure_lines(result: AggregateResult) -> None: def search_command(ctx, type, q, limit, source, json_flag, jq_expr, no_cache, cache_ttl, rate, no_source) -> None: """Search one entity type across every supporting catalogue. + TYPE controls which backend endpoints are queried. + + \b + Types: + anime + Anime titles. Searches AniList anime media, ANN anime reports, + Jikan anime, Kitsu anime, and Shikimori anime. + manga + Manga titles. Searches AniList manga media, Jikan manga, + Kitsu manga, MangaDex manga, and Shikimori manga. + character + Character names. Searches AniList characters, Jikan characters, + Kitsu characters, and Shikimori characters. + person + Staff, creator, and voice-actor names. Searches AniList staff, + Jikan people, Kitsu people, and Shikimori people. + studio + Studio, producer, and production-company names. Searches AniList + studios, Jikan producers, Kitsu producers, and Shikimori studios. + Kitsu and Shikimori are fetched as catalogue lists and filtered locally. + publisher + Publisher names. Searches Shikimori publishers. The publisher + catalogue is fetched and filtered locally. + + Use --source with the backend names listed for a type to restrict + fan-out. Unsupported source names fail before any network request. + \b Examples: - animedex search anime Frieren - animedex search manga Berserk --source anilist,jikan + animedex search anime Frieren --limit 3 + animedex search manga Berserk --source anilist,mangadex + animedex search character "Hatake Kakashi" --json + animedex search person "Hayao Miyazaki" --jq '.items[0]._prefix_id' + animedex search studio Ghibli --source anilist,jikan,kitsu,shikimori animedex search publisher Kodansha --json - animedex search person Miyazaki --jq '.items[0]._prefix_id' \f Backend: animedex aggregate search over AniList, Jikan, Kitsu, diff --git a/test/entry/test_search.py b/test/entry/test_search.py index 7509f29..4dfed4b 100644 --- a/test/entry/test_search.py +++ b/test/entry/test_search.py @@ -104,6 +104,31 @@ def _combined_output(result) -> str: class TestSearchCli: + def test_help_lists_types_sources_and_examples(self, cli_runner, cli): + result = cli_runner.invoke(cli, ["search", "--help"]) + + assert result.exit_code == 0, result.output + for entity_type in ("anime", "manga", "character", "person", "studio", "publisher"): + assert entity_type in result.output + assert f"animedex search {entity_type} " in result.output + for expected in ( + "Searches AniList anime media, ANN anime reports", + "Jikan anime, Kitsu anime, and Shikimori anime.", + "Searches AniList manga media, Jikan manga", + "Kitsu manga, MangaDex manga, and Shikimori manga.", + "Searches AniList characters, Jikan characters", + "Kitsu characters, and Shikimori characters.", + "Searches AniList staff", + "Jikan people, Kitsu people, and Shikimori people.", + "Searches AniList", + "studios, Jikan producers, Kitsu producers, and Shikimori studios.", + "Kitsu and Shikimori are fetched as catalogue lists and filtered locally.", + "Searches Shikimori publishers.", + "catalogue is fetched and filtered locally.", + ): + assert expected in result.output + assert "Use --source with the backend names listed for a type" in result.output + def test_anime_search_json_reports_every_source(self, cli_runner, cli, fake_clock): with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps: _register_many(rsps, ANIME_SEARCH_FIXTURES) From b12d58315e788d6f6d6f158009e21825e4a1249c Mon Sep 17 00:00:00 2001 From: narugo1992 Date: Tue, 12 May 2026 19:49:50 +0800 Subject: [PATCH 8/8] dev(narugo1992): cover aggregate renderer edge cases --- test/render/test_json_renderer.py | 11 +++++++++ test/render/test_tty_phase2.py | 37 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/test/render/test_json_renderer.py b/test/render/test_json_renderer.py index c13ebc9..bece33b 100644 --- a/test/render/test_json_renderer.py +++ b/test/render/test_json_renderer.py @@ -137,6 +137,17 @@ def test_aggregate_sources_map_reports_ok_sources_only(self): assert decoded["_meta"]["sources_consulted"] == ["jikan"] assert decoded["sources"]["anilist"]["status"] == "failed" + def test_sources_map_keeps_legacy_scalar_entries(self): + from animedex.models.common import AnimedexModel + from animedex.render.json_renderer import render_json + + class LegacyAggregate(AnimedexModel): + sources: dict + + decoded = json.loads(render_json(LegacyAggregate(sources={"legacy": True}), include_source=True)) + + assert decoded["_meta"]["sources_consulted"] == ["legacy"] + class TestRichModelSourceAttribution: """Reviewer review B1 (PR #6). diff --git a/test/render/test_tty_phase2.py b/test/render/test_tty_phase2.py index 1eeb947..61c34b7 100644 --- a/test/render/test_tty_phase2.py +++ b/test/render/test_tty_phase2.py @@ -228,3 +228,40 @@ def to_common(self): out = render_tty(result) assert "Raw Label [src: raw]" in out + + def test_renders_source_field_nested_labels_fallbacks_and_dict_scores(self): + from animedex.models.aggregate import AggregateResult + from animedex.models.common import AnimedexModel, SourceTag + from animedex.render.tty import render_tty + + class DirectSourceProjection(AnimedexModel): + name: str + source: SourceTag + + class NamelessProjection(AnimedexModel): + source_tag: SourceTag + + class TitleObject: + romaji = "Nested Title" + + class LabelObject: + def __str__(self): + return "Object Label" + + result = AggregateResult( + items=[ + DirectSourceProjection(name="Direct Source", source=_src("direct")), + {"title": TitleObject(), "score": {"score": 8.5, "scale": 10}, "_source": "nested"}, + {"name": LabelObject(), "score": {"score": 7}, "_source": "object"}, + NamelessProjection(source_tag=_src("nameless")), + ], + sources={}, + ) + out = render_tty(result) + + assert "Direct Source [src: direct]" in out + assert "Nested Title [src: nested]" in out + assert "Score: 8.5/10" in out + assert "Object Label [src: object]" in out + assert "Score: 7" in out + assert "NamelessProjection [src: nameless]" in out