{ "openapi": "3.1.0", "info": { "title": "Mangarr API", "description": "", "version": "1.0.0" }, "servers": [ { "url": "/", "description": "" } ], "paths": { "/api/content-sources": { "get": { "operationId": "api_content-sources_get_collection", "tags": [ "ContentSource" ], "responses": { "200": { "description": "ContentSource collection", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ContentSource" } } }, "application/ld+json": { "schema": { "type": "object", "properties": { "hydra:member": { "type": "array", "items": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "hydra:totalItems": { "type": "integer", "minimum": 0 }, "hydra:view": { "type": "object", "properties": { "@id": { "type": "string", "format": "iri-reference" }, "@type": { "type": "string" }, "hydra:first": { "type": "string", "format": "iri-reference" }, "hydra:last": { "type": "string", "format": "iri-reference" }, "hydra:previous": { "type": "string", "format": "iri-reference" }, "hydra:next": { "type": "string", "format": "iri-reference" } }, "example": { "@id": "string", "type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:previous": "string", "hydra:next": "string" } }, "hydra:search": { "type": "object", "properties": { "@type": { "type": "string" }, "hydra:template": { "type": "string" }, "hydra:variableRepresentation": { "type": "string" }, "hydra:mapping": { "type": "array", "items": { "type": "object", "properties": { "@type": { "type": "string" }, "variable": { "type": "string" }, "property": { "type": [ "string", "null" ] }, "required": { "type": "boolean" } } } } } } }, "required": [ "hydra:member" ] } }, "text/html": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ContentSource" } } }, "application/hal+json": { "schema": { "type": "object", "properties": { "_embedded": { "type": "array", "items": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "totalItems": { "type": "integer", "minimum": 0 }, "itemsPerPage": { "type": "integer", "minimum": 0 }, "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "first": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "last": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "next": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "previous": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } } }, "required": [ "_links", "_embedded" ] } }, "multipart/form-data": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ContentSource" } } }, "application/x-cbz": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ContentSource" } } } } } }, "summary": "Retrieves the collection of ContentSource resources.", "description": "Retrieves the collection of ContentSource resources.", "parameters": [ { "name": "page", "in": "query", "description": "The collection page number", "required": false, "deprecated": false, "allowEmptyValue": true, "schema": { "type": "integer", "default": 1 }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "post": { "operationId": "api_content-sources_post", "tags": [ "ContentSource" ], "responses": { "201": { "description": "ContentSource resource created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" } }, "summary": "Creates a ContentSource resource.", "description": "Creates a ContentSource resource.", "parameters": [], "requestBody": { "description": "The new ContentSource resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/content-sources/export": { "get": { "operationId": "api_content-sourcesexport_get", "tags": [ "ContentSource" ], "responses": { "200": { "description": "ContentSource resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a ContentSource resource.", "description": "Retrieves a ContentSource resource.", "parameters": [], "deprecated": false }, "parameters": [] }, "/api/content-sources/import": { "post": { "operationId": "api_content-sourcesimport_post", "tags": [ "ContentSource" ], "responses": { "201": { "description": "ContentSource resource created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" } }, "summary": "Creates a ContentSource resource.", "description": "Creates a ContentSource resource.", "parameters": [], "requestBody": { "description": "The new ContentSource resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/content-sources/{id}": { "get": { "operationId": "api_content-sources_id_get", "tags": [ "ContentSource" ], "responses": { "200": { "description": "ContentSource resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a ContentSource resource.", "description": "Retrieves a ContentSource resource.", "parameters": [ { "name": "id", "in": "path", "description": "GetContentSourceResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "put": { "operationId": "api_content-sources_id_put", "tags": [ "ContentSource" ], "responses": { "200": { "description": "ContentSource resource updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" }, "404": { "description": "Resource not found" } }, "summary": "Replaces the ContentSource resource.", "description": "Replaces the ContentSource resource.", "parameters": [ { "name": "id", "in": "path", "description": "UpsertContentSourceResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "requestBody": { "description": "The updated ContentSource resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/ContentSource.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/ContentSource" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/ContentSource" } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/conversions/convert": { "post": { "operationId": "api_conversionsconvert_post", "tags": [ "Conversion" ], "responses": { "200": { "description": "File converted successfully", "content": { "application/x-cbz": { "schema": { "type": "string", "format": "binary" } } } } }, "summary": "Convert comic book file to CBZ", "description": "Converts a CBR or CBZ file to CBZ format and returns the converted file for download", "parameters": [], "requestBody": { "description": "", "content": { "multipart/form-data": { "schema": { "type": "object", "required": [ "file" ], "properties": { "file": { "type": "string", "format": "binary", "description": "Comic book file to convert (CBR, CBZ, max 150MB)" } } } } }, "required": false }, "deprecated": false }, "parameters": [] }, "/api/jobs": { "get": { "operationId": "api_jobs_get_collection", "tags": [ "Job" ], "responses": { "200": { "description": "Job collection", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Job" } } }, "application/ld+json": { "schema": { "type": "object", "properties": { "hydra:member": { "type": "array", "items": { "$ref": "#/components/schemas/Job.jsonld" } }, "hydra:totalItems": { "type": "integer", "minimum": 0 }, "hydra:view": { "type": "object", "properties": { "@id": { "type": "string", "format": "iri-reference" }, "@type": { "type": "string" }, "hydra:first": { "type": "string", "format": "iri-reference" }, "hydra:last": { "type": "string", "format": "iri-reference" }, "hydra:previous": { "type": "string", "format": "iri-reference" }, "hydra:next": { "type": "string", "format": "iri-reference" } }, "example": { "@id": "string", "type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:previous": "string", "hydra:next": "string" } }, "hydra:search": { "type": "object", "properties": { "@type": { "type": "string" }, "hydra:template": { "type": "string" }, "hydra:variableRepresentation": { "type": "string" }, "hydra:mapping": { "type": "array", "items": { "type": "object", "properties": { "@type": { "type": "string" }, "variable": { "type": "string" }, "property": { "type": [ "string", "null" ] }, "required": { "type": "boolean" } } } } } } }, "required": [ "hydra:member" ] } }, "text/html": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Job" } } }, "application/hal+json": { "schema": { "type": "object", "properties": { "_embedded": { "type": "array", "items": { "$ref": "#/components/schemas/Job.jsonhal" } }, "totalItems": { "type": "integer", "minimum": 0 }, "itemsPerPage": { "type": "integer", "minimum": 0 }, "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "first": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "last": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "next": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "previous": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } } }, "required": [ "_links", "_embedded" ] } }, "multipart/form-data": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Job" } } }, "application/x-cbz": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Job" } } } } } }, "summary": "Retrieves the collection of Job resources.", "description": "Retrieves the collection of Job resources.", "parameters": [ { "name": "status", "in": "query", "description": "Filtrer par status (s\u00e9par\u00e9s par des virgules pour plusieurs statuts, ex: \"pending,in_progress\" ou sous forme de tableau avec \"status[]=\")", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "oneOf": [ { "type": "string", "example": "pending,in_progress" }, { "type": "array", "items": { "type": "string", "enum": [ "pending", "in_progress", "completed", "failed", "cancelled" ] }, "example": [ "pending", "in_progress" ] } ] }, "style": "form", "explode": false, "allowReserved": false }, { "name": "type", "in": "query", "description": "Filtrer par type de job (ex: scraping_job)", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "form", "explode": false, "allowReserved": false }, { "name": "createdAfter", "in": "query", "description": "Date de cr\u00e9ation minimum (format ISO8601)", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string", "format": "date-time" }, "style": "form", "explode": false, "allowReserved": false }, { "name": "createdBefore", "in": "query", "description": "Date de cr\u00e9ation maximum (format ISO8601)", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string", "format": "date-time" }, "style": "form", "explode": false, "allowReserved": false }, { "name": "page", "in": "query", "description": "Num\u00e9ro de la page", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 1, "minimum": 1 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "limit", "in": "query", "description": "Nombre d'\u00e9l\u00e9ments par page", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 20, "minimum": 1 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "sortBy", "in": "query", "description": "Champ de tri", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string", "enum": [ "createdAt", "type", "status" ], "default": "createdAt" }, "style": "form", "explode": false, "allowReserved": false }, { "name": "sortOrder", "in": "query", "description": "Ordre de tri", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string", "enum": [ "ASC", "DESC" ], "default": "DESC" }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/manga/chapters/fetch": { "post": { "operationId": "api_mangachaptersfetch_post", "tags": [ "Mangadex" ], "responses": { "202": { "description": "Demande de r\u00e9cup\u00e9ration accept\u00e9e et mise en file d'attente" }, "422": { "description": "Donn\u00e9es de validation invalides" } }, "summary": "R\u00e9cup\u00e9rer les chapitres d'un manga", "description": "Lance le processus de r\u00e9cup\u00e9ration des chapitres depuis la source externe pour un manga donn\u00e9", "parameters": [], "requestBody": { "description": "Donn\u00e9es requises pour r\u00e9cup\u00e9rer les chapitres", "content": { "application/json": { "schema": { "type": "object", "properties": { "mangaId": { "type": "string", "format": "uuid", "description": "L'identifiant unique du manga", "example": "123e4567-e89b-12d3-a456-426614174000" } }, "required": [ "mangaId" ] } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/manga/chapters/{id}": { "delete": { "operationId": "delete_chapter", "tags": [ "Chapters" ], "responses": { "204": { "description": "Chapter successfully deleted" }, "404": { "description": "Chapter not found" } }, "summary": "Delete a chapter (soft delete)", "description": "Marks a chapter as deleted by setting its visibility to false", "parameters": [ { "name": "id", "in": "path", "description": "The chapter ID", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/manga/chapters/{id}/cbz": { "delete": { "operationId": "delete_cbz", "tags": [ "Cbz" ], "responses": { "204": { "description": "CBZ file successfully deleted" }, "404": { "description": "Chapter or CBZ file not found" } }, "summary": "Delete chapter CBZ file", "description": "Removes the CBZ file for a specific chapter and updates the chapter accordingly", "parameters": [ { "name": "id", "in": "path", "description": "The chapter ID", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/manga/chapters/{id}/download": { "get": { "operationId": "download_chapter_cbz", "tags": [ "Cbz" ], "responses": { "204": { "description": "Cbz resource", "content": { "application/json": { "schema": {} }, "application/ld+json": { "schema": {} }, "text/html": { "schema": {} }, "application/hal+json": { "schema": {} }, "multipart/form-data": { "schema": {} }, "application/x-cbz": { "schema": {} } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a Cbz resource.", "description": "Retrieves a Cbz resource.", "parameters": [ { "name": "id", "in": "path", "description": "DownloadCbzResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangadex-search": { "get": { "operationId": "api_mangadex-search_get", "tags": [ "Mangadex" ], "responses": { "200": { "description": "Mangadex resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Mangadex.MangaSearchCollection" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Mangadex.MangaSearchCollection.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Mangadex.MangaSearchCollection" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Mangadex.MangaSearchCollection.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Mangadex.MangaSearchCollection" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Mangadex.MangaSearchCollection" } } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a Mangadex resource.", "description": "Retrieves a Mangadex resource.", "parameters": [ { "name": "title", "in": "query", "description": "The title to search for", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangas": { "get": { "operationId": "api_mangas_get_collection", "tags": [ "Manga" ], "responses": { "200": { "description": "Manga collection", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Manga.MangaCollection" } } }, "application/ld+json": { "schema": { "type": "object", "properties": { "hydra:member": { "type": "array", "items": { "$ref": "#/components/schemas/Manga.MangaCollection.jsonld" } }, "hydra:totalItems": { "type": "integer", "minimum": 0 }, "hydra:view": { "type": "object", "properties": { "@id": { "type": "string", "format": "iri-reference" }, "@type": { "type": "string" }, "hydra:first": { "type": "string", "format": "iri-reference" }, "hydra:last": { "type": "string", "format": "iri-reference" }, "hydra:previous": { "type": "string", "format": "iri-reference" }, "hydra:next": { "type": "string", "format": "iri-reference" } }, "example": { "@id": "string", "type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:previous": "string", "hydra:next": "string" } }, "hydra:search": { "type": "object", "properties": { "@type": { "type": "string" }, "hydra:template": { "type": "string" }, "hydra:variableRepresentation": { "type": "string" }, "hydra:mapping": { "type": "array", "items": { "type": "object", "properties": { "@type": { "type": "string" }, "variable": { "type": "string" }, "property": { "type": [ "string", "null" ] }, "required": { "type": "boolean" } } } } } } }, "required": [ "hydra:member" ] } }, "text/html": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Manga.MangaCollection" } } }, "application/hal+json": { "schema": { "type": "object", "properties": { "_embedded": { "type": "array", "items": { "$ref": "#/components/schemas/Manga.MangaCollection.jsonhal" } }, "totalItems": { "type": "integer", "minimum": 0 }, "itemsPerPage": { "type": "integer", "minimum": 0 }, "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "first": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "last": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "next": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } }, "previous": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } } }, "required": [ "_links", "_embedded" ] } }, "multipart/form-data": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Manga.MangaCollection" } } }, "application/x-cbz": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Manga.MangaCollection" } } } } } }, "summary": "Retrieves the collection of Manga resources.", "description": "Retrieves the collection of Manga resources.", "parameters": [ { "name": "page", "in": "query", "description": "The collection page number", "required": false, "deprecated": false, "allowEmptyValue": true, "schema": { "type": "integer", "default": 1 }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangas/by-id/{id}": { "get": { "operationId": "api_mangasby-id_id_get", "tags": [ "Manga" ], "responses": { "200": { "description": "Manga resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a Manga resource.", "description": "Retrieves a Manga resource.", "parameters": [ { "name": "id", "in": "path", "description": "The manga identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangas/by-slug/{slug}": { "get": { "operationId": "get_manga_by_slug", "tags": [ "Manga" ], "responses": { "200": { "description": "Manga resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Manga.MangaDetail" } } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a Manga resource.", "description": "Retrieves a Manga resource.", "parameters": [ { "name": "slug", "in": "path", "description": "GetMangaBySlugResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangas/create": { "post": { "operationId": "api_mangascreate_post", "tags": [ "Manga" ], "responses": { "201": { "description": "Manga resource created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Manga" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" } }, "summary": "Create a new manga directly", "description": "Creates a new manga with provided data", "parameters": [], "requestBody": { "description": "The new Manga resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Manga" } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/mangas/create-from-mangadex": { "post": { "operationId": "api_mangascreate-from-mangadex_post", "tags": [ "Mangadex" ], "responses": { "201": { "description": "Mangadex resource created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Mangadex" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Mangadex.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Mangadex" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Mangadex.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Mangadex" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Mangadex" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" } }, "summary": "Create a new manga from Mangadex", "description": "Creates a new manga by fetching its data from Mangadex using an external ID", "parameters": [], "requestBody": { "description": "", "content": { "application/json": { "schema": { "type": "object", "required": [ "externalId" ], "properties": { "externalId": { "type": "string", "description": "The Mangadex ID of the manga" } } } } }, "required": false }, "deprecated": false }, "parameters": [] }, "/api/mangas/search": { "get": { "operationId": "api_mangassearch_get", "tags": [ "Manga" ], "responses": { "200": { "description": "R\u00e9sultats de la recherche", "content": { "application/json": { "schema": { "type": "object", "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem" } } } } } } }, "400": { "description": "Param\u00e8tres de recherche invalides" } }, "summary": "Recherche des mangas dans la biblioth\u00e8que locale", "description": "Recherche des mangas par titre, slug ou auteur (minimum 3 caract\u00e8res)", "parameters": [ { "name": "q", "in": "query", "description": "Terme de recherche (minimum 3 caract\u00e8res)", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string", "minLength": 3 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "page", "in": "query", "description": "Num\u00e9ro de page", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 1, "minimum": 1 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "limit", "in": "query", "description": "Nombre de r\u00e9sultats par page", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 20, "minimum": 1, "maximum": 50 }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangas/{id}/chapters": { "get": { "operationId": "api_mangas_idchapters_get", "tags": [ "Chapters" ], "responses": { "200": { "description": "Chapters resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Chapters.ChapterCollection" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Chapters.ChapterCollection.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Chapters.ChapterCollection" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Chapters.ChapterCollection.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Chapters.ChapterCollection" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Chapters.ChapterCollection" } } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a Chapters resource.", "description": "Retrieves a Chapters resource.", "parameters": [ { "name": "id", "in": "path", "description": "The manga identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false }, { "name": "page", "in": "query", "description": "The page number", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 1 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "limit", "in": "query", "description": "Number of items per page", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 20 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "sortOrder", "in": "query", "description": "Sort order for chapters", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string", "enum": [ "asc", "desc" ], "default": "desc" }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/mangas/{id}/edit": { "put": { "operationId": "api_mangas_idedit_put", "tags": [ "Manga" ], "responses": { "200": { "description": "Manga resource updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Manga" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" }, "404": { "description": "Resource not found" } }, "summary": "Edit an existing manga", "description": "Updates an existing manga with provided data (partial update supported)", "parameters": [ { "name": "id", "in": "path", "description": "EditMangaResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "requestBody": { "description": "The updated Manga resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Manga.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Manga" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Manga" } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/mangas/{id}/preferred-sources": { "get": { "operationId": "api_mangas_idpreferred-sources_get", "tags": [ "Scraping" ], "responses": { "200": { "description": "Sources r\u00e9cup\u00e9r\u00e9es avec succ\u00e8s", "content": { "application/json": { "schema": { "type": "object", "properties": { "mangaId": { "type": "string" }, "hasPreferredSources": { "type": "boolean" }, "sources": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "baseUrl": { "type": "string" }, "description": { "type": "string" }, "isActive": { "type": "boolean" } } } } } }, "example": { "mangaId": "1", "hasPreferredSources": true, "sources": [ { "id": "1", "name": "MangaDex", "baseUrl": "https://mangadex.org", "description": "Source principale", "isActive": true }, { "id": "2", "name": "MangaKakalot", "baseUrl": "https://mangakakalot.com", "description": "Source secondaire", "isActive": true } ] } } } }, "404": { "description": "Resource not found" } }, "summary": "R\u00e9cup\u00e9rer les sources pr\u00e9f\u00e9r\u00e9es d'un manga", "description": "Retourne les sources pr\u00e9f\u00e9r\u00e9es configur\u00e9es pour un manga, ou toutes les sources disponibles si aucune pr\u00e9f\u00e9rence d\u00e9finie", "parameters": [ { "name": "id", "in": "path", "description": "GetMangaPreferredSourcesResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "post": { "operationId": "api_mangas_idpreferred-sources_post", "tags": [ "Scraping" ], "responses": { "200": { "description": "Scraping resource created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Scraping.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Scraping.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Scraping" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" } }, "summary": "Configurer les sources pr\u00e9f\u00e9r\u00e9es d'un manga", "description": "D\u00e9finit l'ordre de priorit\u00e9 des sources de scraping pour un manga. Format attendu: {\"sourceIds\": [\"source1\", \"source2\"]}", "parameters": [ { "name": "id", "in": "path", "description": "SetMangaPreferredSourcesResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "requestBody": { "description": "", "content": { "application/json": { "schema": { "type": "object", "properties": { "sourceIds": { "type": "array", "items": { "type": "string" } } } }, "example": { "sourceIds": [ "1", "2" ] } } }, "required": false }, "deprecated": false }, "parameters": [] }, "/api/mangas/{id}/volumes/{volume}/download": { "get": { "operationId": "download_manga_volume", "tags": [ "Cbz" ], "responses": { "204": { "description": "Cbz resource", "content": { "application/json": { "schema": {} }, "application/ld+json": { "schema": {} }, "text/html": { "schema": {} }, "application/hal+json": { "schema": {} }, "multipart/form-data": { "schema": {} }, "application/x-cbz": { "schema": {} } } }, "404": { "description": "Resource not found" } }, "summary": "Retrieves a Cbz resource.", "description": "Retrieves a Cbz resource.", "parameters": [ { "name": "id", "in": "path", "description": "DownloadVolumeResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false }, { "name": "volume", "in": "path", "description": "DownloadVolumeResource identifier", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/reader/chapter/{chapterId}": { "get": { "operationId": "api_readerchapter_chapterId_get", "tags": [ "Reader" ], "responses": { "200": { "description": "Contexte du chapitre", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "number": { "type": "string" }, "manga": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" } } }, "navigation": { "type": "object", "properties": { "previous": { "type": "object", "nullable": true, "properties": { "id": { "type": "string" }, "number": { "type": "string" } } }, "next": { "type": "object", "nullable": true, "properties": { "id": { "type": "string" }, "number": { "type": "string" } } } } } } } } } }, "404": { "description": "Chapitre non trouv\u00e9" } }, "summary": "R\u00e9cup\u00e8re le contexte d'un chapitre", "description": "Retourne les m\u00e9tadonn\u00e9es du chapitre et sa navigation", "parameters": [ { "name": "chapterId", "in": "path", "description": "", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/reader/chapter/{chapterId}/page/{pageNumber}": { "get": { "operationId": "api_readerchapter_chapterIdpage_pageNumber_get", "tags": [ "Reader" ], "responses": { "200": { "description": "Page du chapitre", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "string" }, "pageNumber": { "type": "integer" }, "base64Content": { "type": "string", "description": "Contenu de l'image en base64" }, "mimeType": { "type": "string", "example": "image/jpeg" }, "dimensions": { "type": "object", "properties": { "width": { "type": "integer" }, "height": { "type": "integer" } } } } } } } }, "404": { "description": "Chapitre ou page non trouv\u00e9" } }, "summary": "R\u00e9cup\u00e8re une page sp\u00e9cifique d'un chapitre", "description": "Retourne le contenu d'une page en base64 avec ses m\u00e9tadonn\u00e9es", "parameters": [ { "name": "chapterId", "in": "path", "description": "L'identifiant du chapitre", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false }, { "name": "pageNumber", "in": "path", "description": "Le num\u00e9ro de la page \u00e0 r\u00e9cup\u00e9rer", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "minimum": 1 }, "style": "simple", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/reader/chapter/{chapterId}/pages": { "get": { "operationId": "api_readerchapter_chapterIdpages_get", "tags": [ "Reader" ], "responses": { "200": { "description": "Collection pagin\u00e9e des pages du chapitre", "content": { "application/json": { "schema": { "type": "object", "properties": { "pages": { "type": "array", "items": { "type": "object", "properties": { "number": { "type": "integer" }, "dimensions": { "type": "object", "properties": { "width": { "type": "integer" }, "height": { "type": "integer" } } } } } }, "totalItems": { "type": "integer" }, "currentPage": { "type": "integer" }, "itemsPerPage": { "type": "integer" }, "totalPages": { "type": "integer" } } } } } }, "404": { "description": "Chapitre non trouv\u00e9" } }, "summary": "R\u00e9cup\u00e8re les pages d'un chapitre", "description": "Retourne une collection pagin\u00e9e des pages du chapitre", "parameters": [ { "name": "chapterId", "in": "path", "description": "", "required": true, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "string" }, "style": "simple", "explode": false, "allowReserved": false }, { "name": "page", "in": "query", "description": "", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 1 }, "style": "form", "explode": false, "allowReserved": false }, { "name": "itemsPerPage", "in": "query", "description": "", "required": false, "deprecated": false, "allowEmptyValue": false, "schema": { "type": "integer", "default": 20 }, "style": "form", "explode": false, "allowReserved": false } ], "deprecated": false }, "parameters": [] }, "/api/scraping/chapters": { "post": { "operationId": "api_scrapingchapters_post", "tags": [ "Scraping" ], "responses": { "202": { "description": "Scraping resource created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Scraping.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Scraping.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Scraping" } } }, "links": {} }, "400": { "description": "Invalid input" }, "422": { "description": "Unprocessable entity" } }, "summary": "Creates a Scraping resource.", "description": "Creates a Scraping resource.", "parameters": [], "requestBody": { "description": "The new Scraping resource", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/ld+json": { "schema": { "$ref": "#/components/schemas/Scraping.jsonld" } }, "text/html": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/hal+json": { "schema": { "$ref": "#/components/schemas/Scraping.jsonhal" } }, "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Scraping" } }, "application/x-cbz": { "schema": { "$ref": "#/components/schemas/Scraping" } } }, "required": true }, "deprecated": false }, "parameters": [] }, "/api/scraping/test-configuration": { "post": { "operationId": "api_scrapingtest-configuration_post", "tags": [ "Scraping", "Configuration" ], "responses": { "200": { "description": "Test de configuration r\u00e9ussi", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "description": "Indique si le test a r\u00e9ussi" }, "imageUrls": { "type": "array", "items": { "type": "string", "format": "uri" }, "description": "Liste des URLs d'images trouv\u00e9es" }, "totalImages": { "type": "integer", "description": "Nombre total d'images trouv\u00e9es" }, "testedUrl": { "type": "string", "format": "uri", "description": "URL qui a \u00e9t\u00e9 test\u00e9e" }, "scrapingType": { "type": "string", "description": "Type de scraping utilis\u00e9" }, "errors": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "description": "Type d'erreur (selector_error, url_error, general_error)" }, "field": { "type": "string", "description": "Champ concern\u00e9 par l'erreur" }, "message": { "type": "string", "description": "Message d'erreur d\u00e9taill\u00e9" }, "suggestion": { "type": "string", "description": "Suggestion pour corriger l'erreur" } } }, "description": "Liste des erreurs d\u00e9taill\u00e9es (vide en cas de succ\u00e8s)" } } }, "examples": { "succes": { "summary": "Test r\u00e9ussi", "value": { "success": true, "imageUrls": [ "https://mangasite.example.com/images/chapter1/page1.jpg", "https://mangasite.example.com/images/chapter1/page2.jpg", "https://mangasite.example.com/images/chapter1/page3.jpg" ], "totalImages": 3, "testedUrl": "https://mangasite.example.com/manga/one-piece/chapter/1", "scrapingType": "html", "errors": [] } }, "echec_selecteur": { "summary": "\u00c9chec - S\u00e9lecteur invalide", "value": { "success": false, "imageUrls": [], "totalImages": 0, "testedUrl": "https://mangasite.example.com/manga/one-piece/chapter/1", "scrapingType": "html", "errors": [ { "type": "selector_error", "field": "imageSelector", "message": "Le s\u00e9lecteur d'image '.invalid-selector' ne trouve aucun \u00e9l\u00e9ment sur la page", "suggestion": "V\u00e9rifiez que le s\u00e9lecteur CSS est correct et qu'il correspond aux \u00e9l\u00e9ments d'image sur la page" } ] } }, "echec_url": { "summary": "\u00c9chec - URL inaccessible", "value": { "success": false, "imageUrls": [], "totalImages": 0, "testedUrl": "https://invalid-site.example.com/chapter/1", "scrapingType": "html", "errors": [ { "type": "url_error", "field": "testUrl", "message": "Impossible d'acc\u00e9der \u00e0 l'URL de test: https://invalid-site.example.com/chapter/1", "suggestion": "V\u00e9rifiez que l'URL est correcte et accessible, et que le chapitre existe" } ] } } } } } }, "422": { "description": "Erreur de validation des donn\u00e9es d'entr\u00e9e", "content": { "application/json": { "schema": { "type": "object", "properties": { "type": { "type": "string", "example": "https://tools.ietf.org/html/rfc2616#section-10" }, "title": { "type": "string", "example": "An error occurred" }, "detail": { "type": "string", "example": "baseUrl: L'URL de base doit \u00eatre une URL valide" }, "violations": { "type": "array", "items": { "type": "object", "properties": { "propertyPath": { "type": "string", "description": "Champ contenant l'erreur" }, "message": { "type": "string", "description": "Message d'erreur de validation" } } } } } }, "example": { "type": "https://symfony.com/errors/validation", "title": "Validation Failed", "detail": "baseUrl: L'URL de base doit \u00eatre une URL valide", "violations": [ { "propertyPath": "baseUrl", "message": "L'URL de base doit \u00eatre une URL valide" } ] } } } }, "400": { "description": "Invalid input" } }, "summary": "Tester une configuration de scraper", "description": "Teste une configuration de scraper en temps r\u00e9el sans l'enregistrer dans la base de donn\u00e9es. Cette API permet de valider les param\u00e8tres de scraping et de voir imm\u00e9diatement les URLs d'images qui seraient extraites.", "parameters": [], "requestBody": { "description": "Configuration du scraper \u00e0 tester", "content": { "application/json": { "schema": { "type": "object", "properties": { "baseUrl": { "type": "string", "format": "uri", "description": "URL de base du site web source", "example": "https://mangasite.example.com" }, "chapterUrlFormat": { "type": "string", "description": "Format d'URL pour acc\u00e9der aux chapitres avec placeholders {slug} et {chapter}", "example": "https://mangasite.example.com/manga/{slug}/chapter/{chapter}" }, "scrapingType": { "type": "string", "enum": [ "html", "javascript" ], "description": "Type de scraping \u00e0 utiliser (html pour les sites statiques, javascript pour les sites dynamiques)", "example": "html" }, "testUrl": { "type": "string", "format": "uri", "description": "URL compl\u00e8te d'un chapitre existant \u00e0 utiliser pour le test", "example": "https://mangasite.example.com/manga/one-piece/chapter/1" }, "mangaSlug": { "type": "string", "description": "Slug du manga utilis\u00e9 dans les URLs (sera utilis\u00e9 pour construire les URLs futures)", "example": "one-piece" }, "chapterNumber": { "type": "number", "minimum": 0, "description": "Num\u00e9ro du chapitre \u00e0 tester", "example": 1 }, "imageSelector": { "type": "string", "nullable": true, "description": "S\u00e9lecteur CSS pour identifier les images dans la page", "example": "img.manga-page, .chapter-image img" }, "nextPageSelector": { "type": "string", "nullable": true, "description": "S\u00e9lecteur CSS pour le lien vers la page suivante (pour les lecteurs horizontaux)", "example": "a.next-page, .navigation .next" }, "chapterSelector": { "type": "string", "nullable": true, "description": "S\u00e9lecteur CSS pour identifier la zone contenant le chapitre", "example": ".chapter-content, #manga-reader" } }, "required": [ "baseUrl", "chapterUrlFormat", "scrapingType", "testUrl", "mangaSlug", "chapterNumber" ] }, "examples": { "lecteur_vertical": { "summary": "Configuration pour un lecteur vertical", "description": "Exemple de configuration pour un site avec toutes les images sur une seule page", "value": { "baseUrl": "https://mangasite.example.com", "chapterUrlFormat": "https://mangasite.example.com/manga/{slug}/chapter/{chapter}", "scrapingType": "html", "testUrl": "https://mangasite.example.com/manga/one-piece/chapter/1", "mangaSlug": "one-piece", "chapterNumber": 1, "imageSelector": "img.manga-page", "nextPageSelector": null, "chapterSelector": ".chapter-content" } }, "lecteur_horizontal": { "summary": "Configuration pour un lecteur horizontal", "description": "Exemple de configuration pour un site avec navigation page par page", "value": { "baseUrl": "https://mangasite.example.com", "chapterUrlFormat": "https://mangasite.example.com/read/{slug}/{chapter}/1", "scrapingType": "html", "testUrl": "https://mangasite.example.com/read/one-piece/1/1", "mangaSlug": "one-piece", "chapterNumber": 1, "imageSelector": "#manga-image", "nextPageSelector": "a.next-page", "chapterSelector": ".reader-container" } } } } }, "required": false }, "deprecated": false }, "parameters": [] } }, "components": { "schemas": { "Cbz": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" } } }, "Cbz.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "id": { "type": "string" } } }, "Cbz.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "id": { "type": "string" } } }, "ChapterListItem": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" }, "number": { "type": "number" }, "title": { "type": [ "string", "null" ] }, "volume": { "type": [ "integer", "null" ] }, "isVisible": { "type": "boolean" }, "isAvailable": { "type": "boolean" }, "createdAt": { "type": "string" } } }, "ChapterListItem.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" }, "number": { "type": "number" }, "title": { "type": [ "string", "null" ] }, "volume": { "type": [ "integer", "null" ] }, "isVisible": { "type": "boolean" }, "isAvailable": { "type": "boolean" }, "createdAt": { "type": "string" } } }, "ChapterListItem.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "id": { "type": "string" }, "number": { "type": "number" }, "title": { "type": [ "string", "null" ] }, "volume": { "type": [ "integer", "null" ] }, "isVisible": { "type": "boolean" }, "isAvailable": { "type": "boolean" }, "createdAt": { "type": "string" } } }, "Chapters": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" } } }, "Chapters.ChapterCollection": { "type": "object", "description": "", "deprecated": false, "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/ChapterListItem" } }, "total": { "type": "integer" }, "page": { "type": "integer" }, "limit": { "type": "integer" }, "hasNextPage": { "type": "boolean" }, "hasPreviousPage": { "type": "boolean" } } }, "Chapters.ChapterCollection.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/ChapterListItem.jsonhal" } }, "total": { "type": "integer" }, "page": { "type": "integer" }, "limit": { "type": "integer" }, "hasNextPage": { "type": "boolean" }, "hasPreviousPage": { "type": "boolean" } } }, "Chapters.ChapterCollection.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/ChapterListItem.jsonld" } }, "total": { "type": "integer" }, "page": { "type": "integer" }, "limit": { "type": "integer" }, "hasNextPage": { "type": "boolean" }, "hasPreviousPage": { "type": "boolean" } } }, "Chapters.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "id": { "type": "string" } } }, "Chapters.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "id": { "type": "string" } } }, "ContentSource": { "type": "object", "description": "Exporte toutes les sources de contenu au format JSON", "deprecated": false }, "ContentSource.jsonhal": { "type": "object", "description": "Exporte toutes les sources de contenu au format JSON", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } } } }, "ContentSource.jsonld": { "type": "object", "description": "Exporte toutes les sources de contenu au format JSON", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" } } }, "Conversion": { "type": "object", "description": "", "deprecated": false, "properties": { "file": { "type": [ "string", "null" ], "format": "binary" }, "fileName": { "type": [ "string", "null" ] }, "fileContent": {}, "filename": { "type": [ "string", "null" ] }, "originalConvertedFilePath": { "type": [ "string", "null" ] } } }, "Conversion.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "file": { "type": [ "string", "null" ], "format": "binary" }, "fileName": { "type": [ "string", "null" ] }, "fileContent": {}, "filename": { "type": [ "string", "null" ] }, "originalConvertedFilePath": { "type": [ "string", "null" ] } } }, "Conversion.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "file": { "type": [ "string", "null" ], "format": "binary" }, "fileName": { "type": [ "string", "null" ] }, "fileContent": {}, "filename": { "type": [ "string", "null" ] }, "originalConvertedFilePath": { "type": [ "string", "null" ] } } }, "Job": { "type": "object", "description": "Liste des jobs", "deprecated": false, "properties": { "id": { "description": "Identifiant unique du job", "type": "string" }, "type": { "description": "Type du job (ex: scraping_job)", "type": "string" }, "status": { "description": "Status du job", "type": "string" }, "createdAt": { "description": "Date de cr\u00e9ation du job", "type": "string", "format": "date-time" }, "startedAt": { "description": "Date de d\u00e9but d'ex\u00e9cution du job", "type": [ "string", "null" ], "format": "date-time" }, "completedAt": { "description": "Date de fin d'ex\u00e9cution du job", "type": [ "string", "null" ], "format": "date-time" }, "failureReason": { "description": "Raison de l'\u00e9chec si le job a \u00e9chou\u00e9", "type": [ "string", "null" ] }, "attempts": { "minimum": 0, "description": "Nombre de tentatives effectu\u00e9es", "type": "integer" }, "maxAttempts": { "exclusiveMinimum": 0, "description": "Nombre maximum de tentatives autoris\u00e9es", "type": "integer" }, "context": { "description": "Donn\u00e9es contextuelles du job", "type": "array", "items": { "type": "string" } } }, "required": [ "type", "status", "createdAt" ] }, "Job.jsonhal": { "type": "object", "description": "Liste des jobs", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "id": { "description": "Identifiant unique du job", "type": "string" }, "type": { "description": "Type du job (ex: scraping_job)", "type": "string" }, "status": { "description": "Status du job", "type": "string" }, "createdAt": { "description": "Date de cr\u00e9ation du job", "type": "string", "format": "date-time" }, "startedAt": { "description": "Date de d\u00e9but d'ex\u00e9cution du job", "type": [ "string", "null" ], "format": "date-time" }, "completedAt": { "description": "Date de fin d'ex\u00e9cution du job", "type": [ "string", "null" ], "format": "date-time" }, "failureReason": { "description": "Raison de l'\u00e9chec si le job a \u00e9chou\u00e9", "type": [ "string", "null" ] }, "attempts": { "minimum": 0, "description": "Nombre de tentatives effectu\u00e9es", "type": "integer" }, "maxAttempts": { "exclusiveMinimum": 0, "description": "Nombre maximum de tentatives autoris\u00e9es", "type": "integer" }, "context": { "description": "Donn\u00e9es contextuelles du job", "type": "array", "items": { "type": "string" } } }, "required": [ "type", "status", "createdAt" ] }, "Job.jsonld": { "type": "object", "description": "Liste des jobs", "deprecated": false, "properties": { "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "id": { "description": "Identifiant unique du job", "type": "string" }, "type": { "description": "Type du job (ex: scraping_job)", "type": "string" }, "status": { "description": "Status du job", "type": "string" }, "createdAt": { "description": "Date de cr\u00e9ation du job", "type": "string", "format": "date-time" }, "startedAt": { "description": "Date de d\u00e9but d'ex\u00e9cution du job", "type": [ "string", "null" ], "format": "date-time" }, "completedAt": { "description": "Date de fin d'ex\u00e9cution du job", "type": [ "string", "null" ], "format": "date-time" }, "failureReason": { "description": "Raison de l'\u00e9chec si le job a \u00e9chou\u00e9", "type": [ "string", "null" ] }, "attempts": { "minimum": 0, "description": "Nombre de tentatives effectu\u00e9es", "type": "integer" }, "maxAttempts": { "exclusiveMinimum": 0, "description": "Nombre maximum de tentatives autoris\u00e9es", "type": "integer" }, "context": { "description": "Donn\u00e9es contextuelles du job", "type": "array", "items": { "type": "string" } } }, "required": [ "type", "status", "createdAt" ] }, "Manga": { "type": "object", "description": "", "deprecated": false, "required": [ "title", "slug", "description", "author", "publicationYear", "genres", "status" ], "properties": { "title": { "minLength": 1, "maxLength": 255, "type": "string" }, "slug": { "pattern": "^([a-z0-9-]+)$", "type": "string" }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "minimum": 1900, "maximum": 2100, "type": "integer" }, "genres": { "minItems": 1, "type": "array", "items": { "type": "string" } }, "status": { "enum": [ "ongoing", "completed", "hiatus" ], "type": "string" }, "externalId": { "type": [ "string", "null" ] }, "imageUrl": { "format": "uri", "externalDocs": { "url": "https://schema.org/url" }, "type": [ "string", "null" ] }, "rating": { "minimum": 0, "maximum": 5, "type": [ "number", "null" ] } } }, "Manga.MangaCollection": { "type": "object", "description": "", "deprecated": false, "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaListItem" } }, "total": { "type": "integer" }, "page": { "type": "integer" }, "limit": { "type": "integer" }, "hasNextPage": { "type": "boolean" }, "hasPreviousPage": { "type": "boolean" } } }, "Manga.MangaCollection.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaListItem.jsonhal" } }, "total": { "type": "integer" }, "page": { "type": "integer" }, "limit": { "type": "integer" }, "hasNextPage": { "type": "boolean" }, "hasPreviousPage": { "type": "boolean" } } }, "Manga.MangaCollection.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaListItem.jsonld" } }, "total": { "type": "integer" }, "page": { "type": "integer" }, "limit": { "type": "integer" }, "hasNextPage": { "type": "boolean" }, "hasPreviousPage": { "type": "boolean" } } }, "Manga.MangaDetail": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "slug": { "type": "string" }, "alternativeSlugs": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "externalId": { "type": [ "string", "null" ] }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "rating": { "type": [ "number", "null" ] } } }, "Manga.MangaDetail.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "id": { "type": "string" }, "title": { "type": "string" }, "slug": { "type": "string" }, "alternativeSlugs": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "externalId": { "type": [ "string", "null" ] }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "rating": { "type": [ "number", "null" ] } } }, "Manga.MangaDetail.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "id": { "type": "string" }, "title": { "type": "string" }, "slug": { "type": "string" }, "alternativeSlugs": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "externalId": { "type": [ "string", "null" ] }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "rating": { "type": [ "number", "null" ] } } }, "Manga.MangaSearchCollection": { "type": "object", "description": "", "deprecated": false, "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem" } } } }, "Manga.MangaSearchCollection.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem.jsonhal" } } } }, "Manga.MangaSearchCollection.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem.jsonld" } } } }, "Manga.jsonhal": { "type": "object", "description": "", "deprecated": false, "required": [ "title", "slug", "description", "author", "publicationYear", "genres", "status" ], "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "title": { "minLength": 1, "maxLength": 255, "type": "string" }, "slug": { "pattern": "^([a-z0-9-]+)$", "type": "string" }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "minimum": 1900, "maximum": 2100, "type": "integer" }, "genres": { "minItems": 1, "type": "array", "items": { "type": "string" } }, "status": { "enum": [ "ongoing", "completed", "hiatus" ], "type": "string" }, "externalId": { "type": [ "string", "null" ] }, "imageUrl": { "format": "uri", "externalDocs": { "url": "https://schema.org/url" }, "type": [ "string", "null" ] }, "rating": { "minimum": 0, "maximum": 5, "type": [ "number", "null" ] } } }, "Manga.jsonld": { "type": "object", "description": "", "deprecated": false, "required": [ "title", "slug", "description", "author", "publicationYear", "genres", "status" ], "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "title": { "minLength": 1, "maxLength": 255, "type": "string" }, "slug": { "pattern": "^([a-z0-9-]+)$", "type": "string" }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "minimum": 1900, "maximum": 2100, "type": "integer" }, "genres": { "minItems": 1, "type": "array", "items": { "type": "string" } }, "status": { "enum": [ "ongoing", "completed", "hiatus" ], "type": "string" }, "externalId": { "type": [ "string", "null" ] }, "imageUrl": { "format": "uri", "externalDocs": { "url": "https://schema.org/url" }, "type": [ "string", "null" ] }, "rating": { "minimum": 0, "maximum": 5, "type": [ "number", "null" ] } } }, "MangaListItem": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "slug": { "type": "string" }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "rating": { "type": [ "number", "null" ] }, "createdAt": { "type": "string", "format": "date-time" } } }, "MangaListItem.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "slug": { "type": "string" }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "rating": { "type": [ "number", "null" ] }, "createdAt": { "type": "string", "format": "date-time" } } }, "MangaListItem.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "id": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "slug": { "type": "string" }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "rating": { "type": [ "number", "null" ] }, "createdAt": { "type": "string", "format": "date-time" } } }, "MangaSearchItem": { "type": "object", "description": "", "deprecated": false, "properties": { "externalId": { "type": "string" }, "title": { "type": "string" }, "slug": { "type": "string" }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "rating": { "type": [ "number", "null" ] } } }, "MangaSearchItem.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "externalId": { "type": "string" }, "title": { "type": "string" }, "slug": { "type": "string" }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "rating": { "type": [ "number", "null" ] } } }, "MangaSearchItem.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "externalId": { "type": "string" }, "title": { "type": "string" }, "slug": { "type": "string" }, "description": { "type": "string" }, "author": { "type": "string" }, "publicationYear": { "type": "integer" }, "genres": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" }, "imageUrl": { "type": [ "string", "null" ] }, "thumbnailUrl": { "type": [ "string", "null" ] }, "rating": { "type": [ "number", "null" ] } } }, "Mangadex": { "type": "object", "description": "", "deprecated": false, "required": [ "externalId" ], "properties": { "externalId": { "type": "string" } } }, "Mangadex.MangaSearchCollection": { "type": "object", "description": "", "deprecated": false, "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem" } } } }, "Mangadex.MangaSearchCollection.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem.jsonhal" } } } }, "Mangadex.MangaSearchCollection.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/MangaSearchItem.jsonld" } } } }, "Mangadex.jsonhal": { "type": "object", "description": "", "deprecated": false, "required": [ "externalId" ], "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "externalId": { "type": "string" } } }, "Mangadex.jsonld": { "type": "object", "description": "", "deprecated": false, "required": [ "externalId" ], "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "externalId": { "type": "string" } } }, "Reader": { "type": "object", "description": "", "deprecated": false }, "Reader.jsonhal": { "type": "object", "description": "", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } } } }, "Reader.jsonld": { "type": "object", "description": "", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" } } }, "Scraping": { "type": "object", "description": "", "deprecated": false, "required": [ "chapterId" ], "properties": { "chapterId": { "description": "ID du chapitre \u00e0 scraper", "type": "string" } } }, "Scraping.MangaPreferredSourcesDetail": { "type": "object", "description": "R\u00e9cup\u00e9rer les sources pr\u00e9f\u00e9r\u00e9es d'un manga ou toutes les sources si aucune pr\u00e9f\u00e9rence", "deprecated": false, "properties": { "mangaId": { "type": "string" }, "sources": { "type": "array", "items": { "type": "string" } }, "hasPreferredSources": { "type": "boolean" } } }, "Scraping.MangaPreferredSourcesDetail.jsonhal": { "type": "object", "description": "R\u00e9cup\u00e9rer les sources pr\u00e9f\u00e9r\u00e9es d'un manga ou toutes les sources si aucune pr\u00e9f\u00e9rence", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "mangaId": { "type": "string" }, "sources": { "type": "array", "items": { "type": "string" } }, "hasPreferredSources": { "type": "boolean" } } }, "Scraping.MangaPreferredSourcesDetail.jsonld": { "type": "object", "description": "R\u00e9cup\u00e9rer les sources pr\u00e9f\u00e9r\u00e9es d'un manga ou toutes les sources si aucune pr\u00e9f\u00e9rence", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "mangaId": { "type": "string" }, "sources": { "type": "array", "items": { "type": "string" } }, "hasPreferredSources": { "type": "boolean" } } }, "Scraping.TestScraperConfigurationResource": { "type": "object", "description": "Teste une configuration de scraper sans l'enregistrer", "deprecated": false, "properties": { "success": { "type": "boolean" }, "imageUrls": { "type": "array", "items": { "type": "string", "format": "uri" } }, "totalImages": { "type": "integer", "minimum": 0 }, "testedUrl": { "type": "string", "format": "uri" }, "scrapingType": { "type": "string", "enum": [ "html", "javascript" ] }, "errors": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "selector_error", "url_error", "general_error" ], "description": "Type d'erreur rencontr\u00e9e" }, "field": { "type": "string", "description": "Champ de configuration concern\u00e9 par l'erreur" }, "message": { "type": "string", "description": "Message d'erreur d\u00e9taill\u00e9" }, "suggestion": { "type": "string", "description": "Suggestion pour corriger l'erreur" } }, "required": [ "type", "field", "message", "suggestion" ] } } } }, "Scraping.TestScraperConfigurationResource.jsonhal": { "type": "object", "description": "Teste une configuration de scraper sans l'enregistrer", "deprecated": false, "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "success": { "type": "boolean" }, "imageUrls": { "type": "array", "items": { "type": "string", "format": "uri" } }, "totalImages": { "type": "integer", "minimum": 0 }, "testedUrl": { "type": "string", "format": "uri" }, "scrapingType": { "type": "string", "enum": [ "html", "javascript" ] }, "errors": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "selector_error", "url_error", "general_error" ], "description": "Type d'erreur rencontr\u00e9e" }, "field": { "type": "string", "description": "Champ de configuration concern\u00e9 par l'erreur" }, "message": { "type": "string", "description": "Message d'erreur d\u00e9taill\u00e9" }, "suggestion": { "type": "string", "description": "Suggestion pour corriger l'erreur" } }, "required": [ "type", "field", "message", "suggestion" ] } } } }, "Scraping.TestScraperConfigurationResource.jsonld": { "type": "object", "description": "Teste une configuration de scraper sans l'enregistrer", "deprecated": false, "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "success": { "type": "boolean" }, "imageUrls": { "type": "array", "items": { "type": "string", "format": "uri" } }, "totalImages": { "type": "integer", "minimum": 0 }, "testedUrl": { "type": "string", "format": "uri" }, "scrapingType": { "type": "string", "enum": [ "html", "javascript" ] }, "errors": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "selector_error", "url_error", "general_error" ], "description": "Type d'erreur rencontr\u00e9e" }, "field": { "type": "string", "description": "Champ de configuration concern\u00e9 par l'erreur" }, "message": { "type": "string", "description": "Message d'erreur d\u00e9taill\u00e9" }, "suggestion": { "type": "string", "description": "Suggestion pour corriger l'erreur" } }, "required": [ "type", "field", "message", "suggestion" ] } } } }, "Scraping.jsonhal": { "type": "object", "description": "", "deprecated": false, "required": [ "chapterId" ], "properties": { "_links": { "type": "object", "properties": { "self": { "type": "object", "properties": { "href": { "type": "string", "format": "iri-reference" } } } } }, "chapterId": { "description": "ID du chapitre \u00e0 scraper", "type": "string" } } }, "Scraping.jsonld": { "type": "object", "description": "", "deprecated": false, "required": [ "chapterId" ], "properties": { "@context": { "readOnly": true, "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "@vocab": { "type": "string" }, "hydra": { "type": "string", "enum": [ "http://www.w3.org/ns/hydra/core#" ] } }, "required": [ "@vocab", "hydra" ], "additionalProperties": true } ] }, "@id": { "readOnly": true, "type": "string" }, "@type": { "readOnly": true, "type": "string" }, "chapterId": { "description": "ID du chapitre \u00e0 scraper", "type": "string" } } } }, "responses": {}, "parameters": {}, "examples": {}, "requestBodies": {}, "headers": {}, "securitySchemes": { "access_token": { "type": "http", "description": "", "scheme": "bearer" } } }, "security": [ { "access_token": [] } ], "tags": [] }