Aller au contenu
javinfo

Résolution API

Normalisez n'importe quelle écriture d'un code et obtenez variantes, sources, carte, provenance et flux.

/resolve dit ce qu'est un code et ce que dit chaque source. /movie renvoie le premier fournisseur qui répond ; ces endpoints consultent toutes les sources et gardent les désaccords.

Utilisez-les pour normaliser abp002, ABP-002 ou ABP-2, lister toutes les sources d'un titre, ou obtenir une carte de partage ou une carte des flux en un appel.

EndpointRenvoiePour 1 000 appels
GET /resolveCode canonique, variantes, sources, lien, carte intégrée$1.20
POST /resolve/batchTrouvé ou introuvable pour jusqu'à 100 codes$0.40 par groupe entamé de 10 codes uniques
GET /resolve/compareDeux titres côte à côte$0.40
GET /resolve/provenanceSource et confiance par champ$0.40
GET /resolve/streamsDisponibilité en flux, extrait et aimant$0.40

GET /resolve

Normalise une écriture en un code canonique et renvoie tout ce qui s'y rattache : variantes, sources, un lien vers /movie, une carte de 1200×630.

ParamètreTypeObligatoireSignification
qstringouiLe code ou l'écriture à résoudre. Au moins 2 caractères.
formatpng, jpg ou svgnonEncodage de la carte. Par défaut png.
curl -s 'https://api.javinfo.dev/resolve?q=abp002&format=jpg' \
  -H "x-javinfo-key: jvi_your_key_here"
{
  "input": "abp002",
  "code": "ABP-002",
  "shareSlug": "85150B9G60S0M",
  "found": true,
  "variants": ["ABP-002", "ABP002"],          // 7 total
  "contentIdGuess": "118abp00002",
  "sources": ["fanza", "javdatabase"],        // 6 total
  "link": "/movie?q=ABP-002",
  "card": {
    "format": "jpg",
    "mime": "image/jpeg",
    "dataUri": "data:image/jpeg;base64,…"
  }
}

La carte est intégrée dans card.dataUri, donc la réponse est volumineuse : environ 1,1 MB avec png (par défaut), 900 KB avec svg, 180 KB avec jpg. Choisissez jpg quand la taille compte : raster avec perte, environ six fois plus léger que png. La charge base64 est tronquée dans l'exemple ; dataUri est un URI data: complet pour un <img src>.

ChampSignification
inputLa chaîne envoyée, inchangée.
codeLe code canonique.
variantsChaque écriture qui désigne le même titre, de la plus canonique à la moins canonique.
sourcesIds publics des sources qui listent le titre.
contentIdGuessId de contenu DMM quand l'index de la vitrine l'a, sinon null.
linkChemin d'API pour le même titre, /movie?q=<code>. Il est relatif à https://api.javinfo.dev et demande votre en-tête x-javinfo-key.
cardLa carte 1200×630 sous forme d'URI de données, ou null.
foundtrue sur un 200. Un échec est un 404.
shareSlugSlug avec somme de contrôle pour le code canonique.

La carte affiche le code, le titre anglais (raccourci ou le code s'il n'y en a pas), jusqu'à trois noms et le studio, jusqu'à quatre puces de genre, puis la note, la durée, la date de sortie et les magnets quand ils sont connus. Un badge STREAMABLE signale un stream. La jaquette est à droite, sur une copie floutée. null si le rendu est indisponible : traitez-la comme facultative et gardez les métadonnées.

Un code sans correspondance est un 404, pas une carte vide :

{
  "defined": false,
  "code": "NOT_FOUND",
  "status": 404,
  "message": "no title found for \"ZZZZ-99999\""
}

POST /resolve/batch

Vérifie jusqu'à 100 codes en une requête : nettoyez une liste utilisateur ou comparez votre catalogue sans 100 appels séquentiels.

Champ du corpsTypeObligatoireSignification
codestableau de chaînesouiDe 1 à 100 chaînes non vides.
curl -s -X POST 'https://api.javinfo.dev/resolve/batch' \
  -H "x-javinfo-key: jvi_your_key_here" \
  -H 'content-type: application/json' \
  -d '{"codes":["ABP-002","beb001","ZZZZ-99999"]}'
{
  "count": 3,
  "found": 2,
  "results": [
    { "input": "ABP-002", "code": "ABP-002", "found": true },
    { "input": "beb001", "code": "BEB-001", "found": true },
    { "input": "ZZZZ-99999", "code": "ZZZZ-99999", "found": false }
  ]
}

Un code introuvable est found: false dans un 200 normal, pas un 404 ; code contient la meilleure estimation canonique. count compte les codes après déduplication ; found, ceux qui ont abouti.

Les codes sont élagués et dédupliqués avant comptage. "ABP-002" et " ABP-002 " coûtent un emplacement et n'apparaissent qu'une fois dans results. Après élagage la correspondance est exacte : abp-002 et ABP-002 sont deux emplacements.

Un tableau codes vide, plus de 100 codes ou une chaîne vide sont un 400 :

{
  "defined": false,
  "code": "BAD_REQUEST",
  "status": 400,
  "message": "Input validation failed",
  "data": {
    "issues": [
      {
        "origin": "array",
        "code": "too_small",
        "minimum": 1,
        "inclusive": true,
        "path": ["codes"],
        "message": "Too small: expected array to have >=1 items"
      }
    ]
  }
}

La même forme couvre les autres échecs de validation, avec une entrée issues différente.

GET /resolve/compare

Deux titres côte à côte : fiche de base de chacun, champs partagés, score de similarité.

ParamètreTypeObligatoireSignification
astringouiPremier code. Au moins 2 caractères.
bstringouiSecond code. Au moins 2 caractères.
curl -s 'https://api.javinfo.dev/resolve/compare?a=SSIS-001&b=ABP-002' \
  -H "x-javinfo-key: jvi_your_key_here"
{
  "a": {
    "input": "SSIS-001",
    "code": "SSIS-001",
    "shareSlug": "AD9MJMSD60R32E",
    "found": true,
    "variants": [
      "SSIS-001",
      "SSIS001",
      "…"
    ],
    "contentIdGuess": "ssis00001",
    "sources": [
      "fanza",
      "javdatabase",
      "javlibrary",
      "javbus",
      "missav",
      "sextb"
    ],
    "link": "/movie?q=SSIS-001"
  },
  "b": {
    "input": "ABP-002",
    "code": "ABP-002",
    "shareSlug": "85150B9G60S0M",
    "found": true,
    "variants": [
      "ABP-002",
      "ABP002",
      "…"
    ],
    "contentIdGuess": "118abp00002",
    "sources": [
      "fanza",
      "javdatabase",
      "javlibrary",
      "javbus",
      "missav",
      "sextb"
    ],
    "link": "/movie?q=ABP-002"
  },
  "shared": {
    "actresses": [],
    "categories": [],
    "maker": null
  },
  "similarity": 0.05
}

Chaque côté a la forme /resolve, sans carte. sources liste les sources qui correspondent ; contentIdGuess est l'id de contenu DMM quand l'index de la vitrine l'a, comme sur /resolve.

shared contient l'intersection insensible à la casse de actresses et categories ; maker n'est rempli que si les deux titres portent exactement la même chaîne.

similarity est un mélange de 0 à 1, surtout actrices partagées (0.34) et catégories (0.26), plus le même maker (0.1), la durée (0.06) et la proximité des dates (0.06), arrondi à 3 décimales. Si un code manque, ce côté est found: false, shared vide, similarity 0. Jamais 404.

GET /resolve/provenance

Montre la source de chaque champ, la confiance de l'API, et ce que disaient les autres.

ParamètreTypeObligatoireSignification
qstringouiLe code ou l'écriture à résoudre. Au moins 2 caractères.
curl -s 'https://api.javinfo.dev/resolve/provenance?q=ABP-002' \
  -H "x-javinfo-key: jvi_your_key_here"
{
  "code": "ABP-002",
  "found": true,
  "sources": ["fanza", "javbus"],            // 6 total, alphabetical
  "fields": {
    "title": {
      "value": "NEW TOKYO Style 01 - Aikarin",
      "source": "fanza",
      "confidence": 1,
      "candidates": [                        // 6 total, trust order
        { "source": "fanza", "value": "NEW TOKYO Style 01 - Aikarin" },
        { "source": "javdatabase", "value": "NEW TOKYO Style 01 - Aikarin" }
      ]
    },
    "titleJa": {
      "value": "NEW TOKYO流儀 01 あいかりん",
      "source": "javlibrary",
      "confidence": 0.8,
      "candidates": [                        // 4 total
        { "source": "javlibrary", "value": "NEW TOKYO流儀 01 あいかりん" },
        { "source": "javbus", "value": "NEW TOKYO流儀 01 あいかりん" }
      ]
    },
    "rating": {
      "value": 8.1,
      "source": "javlibrary",
      "confidence": 0.8,
      "candidates": [{ "source": "javlibrary", "value": 8.1 }]
    }
    // releaseDate, runtimeMins, maker, label, series, categories,
    // actresses and cover follow the same shape
  },
  "data": {
    "title": "NEW TOKYO Style 01 - Aikarin",
    "titleJa": "NEW TOKYO流儀 01 あいかりん",
    "rating": 8.1
    // the merged value for every field above
  }
}

fields couvre title, titleJa, releaseDate, runtimeMins, maker, label, series, categories, actresses, cover et rating.

Les scalaires vont à la source de plus fort poids ; les tableaux comme categories et actresses sont réunis, pas remplacés. candidates liste les sources ayant proposé une valeur, de la meilleure à la moins bonne, pour voir un désaccord.

confidence est le poids gagnant divisé par le meilleur poids de la réponse : 1 pour la source principale, moins pour les autres. Poids, du plus fort au plus faible : vitrines 1, javdatabase 0.85, javlibrary 0.8, javbus 0.7, missav 0.6, sextb 0.55. sources est alphabétique ; candidates suit la confiance.

Code inconnu : 404 avec le corps de GET /resolve.

GET /resolve/streams

Indique où regarder ou télécharger un titre : flux HLS, extraits, aimants, sous-titres, taille de galerie.

ParamètreTypeObligatoireSignification
qstringouiLe code ou l'écriture à résoudre. Au moins 2 caractères.
curl -s 'https://api.javinfo.dev/resolve/streams?q=ABP-002' \
  -H "x-javinfo-key: jvi_your_key_here"
{
  "code": "ABP-002",
  "found": true,
  "playback": "hls",
  "availability": {
    "magnets": 47,
    "stream": true,
    "sample": false,
    "trailer": false,
    "gallery": 0,
    "subtitles": [],
    "uncensored": false,
    "score": 0.7
  },
  "streams": {
    "master": "https://surrit.com/c511196b-b4f8-47bf-a6b0-64ba625fc2a4/playlist.m3u8",
    "variants": [
      "https://surrit.com/c511196b-b4f8-47bf-a6b0-64ba625fc2a4/1280x720/video.m3u8",
      "https://surrit.com/c511196b-b4f8-47bf-a6b0-64ba625fc2a4/842x480/video.m3u8"
    ]
  },
  "sampleUrl": null,
  "galleryCount": 106,
  "sources": ["fanza", "javdatabase"]        // 6 total
}

playback répond en une ligne : hls avec un flux, sinon magnet avec des aimants, sinon sample avec seul un extrait ou une bande-annonce, sinon none.

availability ajoute le détail :

ChampSignification
magnetsInfohashes d'aimants distincts sur toutes les sources.
streamUn master HLS est présent.
sampleUn extrait ou une bande-annonce est présent.
trailerUne bande-annonce spécifiquement.
galleryNombre d'images de la galerie de la source choisie pour les médias.
subtitlesLangues de sous-titres détectées dans les métadonnées. Seul zh est étiqueté aujourd'hui.
uncensoredLes métadonnées marquent le titre comme non censuré.
scoreComplétude de 0 à 1 : aimants 0.35, flux 0.35, extrait 0.15, galerie 0.1, sous-titres 0.05.

streams vaut {master, variants} avec un flux HLS, sinon null. master est la playlist pour un lecteur ; variants, les playlists par résolution. sampleUrl est le clip d'extrait s'il existe ; galleryCount, le plus grand nombre d'images entre les sources.

Code inconnu : 404 avec le corps de GET /resolve.

Coût

Seul un 200 frais est facturé. Cache (X-Cache: HIT), réponses 4xx et réponses dégradées (X-Degraded) sont gratuits. Resolve, compare et provenance cachent 1 heure ; streams 15 minutes. Batch ne cache rien.

GET /resolve coûte $1.20 pour 1 000 appels parce qu'il génère la carte ; les autres endpoints resolve, $0.40 pour 1 000 appels.

Batch facture les codes restants après élagage et déduplication, par groupes entamés de 10 :

Codes uniquesPour 1 000 appels
1–10$0.40
11–20$0.80
21–30$1.20
100$4.00

Codes d'état

EndpointCodes
GET /resolve200, 400, 401, 402, 404, 429
POST /resolve/batch200, 400, 401, 402, 429
GET /resolve/compare200, 400, 401, 402, 429
GET /resolve/provenance200, 400, 401, 402, 404, 429
GET /resolve/streams200, 400, 401, 402, 404, 429

Un q de moins de 2 caractères, un format inconnu et les échecs batch ci-dessus sont 400.

Erreurs courantes

Sans clé ou mauvaise clé : 401, corps différents.

# No key
curl -s 'https://api.javinfo.dev/resolve?q=ABP-002'
{
  "defined": false,
  "code": "UNAUTHORIZED",
  "status": 401,
  "message": "Unauthorized"
}
# Bad key
curl -s 'https://api.javinfo.dev/resolve?q=ABP-002' \
  -H "x-javinfo-key: jvi_not_a_real_key"
{ "error": "invalid api key" }

402 signifie que le solde est inférieur au prix de l'appel. Rien n'est facturé ; Retry-After: 3600 est une indication aux clients automatisés.

{
  "defined": false,
  "code": "PAYMENT_REQUIRED",
  "status": 402,
  "message": "insufficient balance"
}

429 est le plafond par compte et minute ; Retry-After donne les secondes à attendre.

{ "error": "rate limit exceeded" }

Côté compte : Limites de débit et facturation et Erreurs. Référence générée : /docs/api/discovery/resolve.

Sur cette page