Skip to content

feat: add ja.rawdevart - #660

Open
kinboy56 wants to merge 5 commits into
Aidoku-Community:mainfrom
kinboy56:rawdevart.art
Open

feat: add ja.rawdevart#660
kinboy56 wants to merge 5 commits into
Aidoku-Community:mainfrom
kinboy56:rawdevart.art

Conversation

@kinboy56

@kinboy56 kinboy56 commented Aug 2, 2026

Copy link
Copy Markdown

fix #34

Summary

  • Search, browse/filtering, series details, chapter list, and page list
  • 3 listings: Latest, Popular, Trending Today
  • Filters: sort (3 options), status, and genre (fetched dynamically, 60+ options)
  • Deep linking for both series and chapter URLs

Implementation notes

A few site quirks that aren't obvious from the API responses and are worth a reviewer's
attention:

  • The /spa endpoints require no special headers. The site's own scripts send a Referer
    and X-Requested-With, but a direct request without either returns a byte-identical response
    (verified by diffing both). Plain Request::get is used throughout; only the image requests
    set a Referer, since the CDN mirrors do require one.
  • Chapter pages carry no image urls in the api's HTML fragment as-is — the markup uses
    <img class="lazy" data-src="..."> with paths relative to a server field the same response
    provides (plus slaves as mirrors). abs: attribute resolution isn't used to join them,
    since it depends on the parsed document keeping a base url, which a Html::parse_fragment
    fragment doesn't reliably carry; the join is done by hand instead.
  • Chapters are keyed by chapter_number, not chapter_id. The page endpoint is
    /spa/manga/{manga_id}/{chapter_number}; passing a chapter_id there returns a null
    chapter_detail (confirmed against the live api). Chapter numbers are non-integer for roughly
    85% of entries in the sampled catalogue (e.g. 34.2) and were confirmed to be unique and
    non-null across every chapter checked, so they're safe to use as the key.
  • Genres are fetched instead of hardcoded. DynamicFilters reads the <option> markup the
    /spa/genre/all response embeds under genreOpt, so new genres the site adds don't need a
    source update. The "all" default plus every id past it are validated as numeric in a test.
  • manga_status can be entirely absent from the API response, not just true/false.
    Missing status maps to MangaStatus::Unknown rather than defaulting to "ongoing".
  • Chapter language is left unset on purpose. Setting it (as the previous, now-removed
    version of this source did) subjects chapters to the app's chapter-language filter, which can
    hide every chapter depending on the user's device settings for a single-language source. Most
    existing ja.* sources in this repo leave it unset for the same reason.
  • Series and chapter urls prefix the numeric id with two letters (e.g. /g/ne854721) that
    the site's routing ignores; the api only ever wants the digits. DeepLinkHandler strips the
    prefix and rejects anything that isn't left with a purely numeric id, and also trims query
    strings / fragments first, since shared links commonly carry tracking parameters.
  • Content rating isn't provided by the api. It's inferred from genre tags
    (adult/hentai/loli-family tags → NSFW, ecchi → Suggestive, otherwise Safe), since the
    source itself is registered as contains-nsfw.

Test plan

  • cargo test --release — 9 tests, all hitting the live api (no mocked responses), covering:
    all 3 listings, search, filter combinations, dynamic genre filter parsing, series details
    (title/cover/authors/tags/description/status), a chapter with a non-integer number round-tripped
    into a page request, page list urls, deep link parsing (including tracking-parameter and
    non-numeric-id variants), and a regression test against the specific series/chapter pair
    originally reported as unreadable
  • cargo fmt --check — clean
  • cargo clippy --release — no warnings
  • aidoku package + aidoku verify — schema validation passes for source.json and
    filters.json, icon is 128×128 and fully opaque
  • [x ] Manual on-device install via aidoku serve — not yet done in this environment

Checklist

  • The source can be compiled without any warnings or errors
  • cargo fmt has been run before submission
  • cargo clippy outputs no lint warnings
  • All files have an additional newline at the end
  • JSON files use tabs for indentation
  • status / content_rating are set on series when available (status is Unknown when
    the api doesn't provide it, rather than guessed)
  • DeepLinkHandler is implemented for both series and chapter urls
  • Genre filtering uses the site's own options via DynamicFilters, kept in sync automatically
  • Home page / listing components beyond simple listings — not implemented (optional per
    CONTRIBUTING.md)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

rawdevart.art

1 participant