diff --git a/docs/specs/nodeinfo21/schema.yml b/docs/specs/nodeinfo21/schema.yml index 9658c4321..f9a07b7cf 100644 --- a/docs/specs/nodeinfo21/schema.yml +++ b/docs/specs/nodeinfo21/schema.yml @@ -1,4 +1,4 @@ -openapi: "3.0.3" +openapi: "3.1.0" info: description: "Interactive documentation for [Funkwhale](https://funkwhale.audio) API." version: "2.0.0" @@ -21,11 +21,40 @@ servers: - "https" default: "https" tags: + - name: Collections + - name: History - name: Instance - description: Information about the server - - name: Content - description: Information about content on the server + - name: Recordings + - name: Releases + - name: Tags paths: + /api/v2/collections: + get: + tags: + - Collections + summary: Retrieve a list of collections from the server + description: Retrieve a list of collections stored on the server + operationId: getCollection + parameters: + - $ref: "#/components/parameters/query" + - $ref: "#/components/parameters/pageParam" + - $ref: "#/components/parameters/pageSizeParam" + responses: + "200": + description: Successful operation + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/Pagination" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/Collection" /api/v2/instance/nodeinfo/2.1: get: tags: @@ -40,37 +69,161 @@ paths: application/json: schema: $ref: "#/components/schemas/Nodeinfo" - application/xml: + "401": + $ref: "#/components/responses/Unauthorized" + /api/v2/recordings: + get: + tags: + - Recordings + summary: Retrieve a list of recordings + description: Retrieve a list of recordings uploaded to the server + operationId: getRecordings + parameters: + - $ref: "#/components/parameters/query" + - $ref: "#/components/parameters/pageParam" + - $ref: "#/components/parameters/pageSizeParam" + - name: release + in: query + required: false + description: Filter recordings by their associated release + schema: + type: string + - name: artist + in: query + required: false + description: Filter recordings by their associated artist + schema: + type: string + - name: id + in: query + required: false + description: Filter recordings by ID + schema: + type: array + items: + type: string + - name: collection + in: query + required: false + description: Filter recordings by collection ID + schema: + type: string + format: uuid + - name: mbid + in: query + required: false + description: Filter recordings by MusicBrainz ID + schema: + type: array + items: + type: string + responses: + "200": + description: Successful operation + content: + application/json: schema: - $ref: "#/components/schemas/Nodeinfo" + allOf: + - $ref: "#/components/schemas/Pagination" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/Recording" + "401": + $ref: "#/components/responses/Unauthorized" + /api/v2/releases: + get: + tags: + - Releases + summary: Retrieve information about releases on the server + description: Retrieve a list of releases on the pod + operationId: getReleases + parameters: + - $ref: "#/components/parameters/query" + - $ref: "#/components/parameters/pageParam" + - $ref: "#/components/parameters/pageSizeParam" + - name: artist + in: query + required: false + description: Filter releases by artist + schema: + type: integer + - name: id + in: query + required: false + description: Filter releases by ID + schema: + type: array + items: + type: string + - name: collection + in: query + required: false + description: Filter releases by collection ID + schema: + type: string + format: uuid + - name: mbid + in: query + required: false + description: Filter recordings by MusicBrainz ID + schema: + type: array + items: + type: string + responses: + "200": + description: Successful operation + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/Pagination" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/Release" + post: + tags: + - Releases + summary: Add a new release to the server + description: Add a new release object to the server + operationId: postRelease + requestBody: + description: The release information you want to upload + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/CreateRelease" + responses: + "200": + description: Successful operation + content: + application/json: + schema: + $ref: "#/components/schemas/SimpleRelease" "401": $ref: "#/components/responses/Unauthorized" /api/v2/tags/podcasts: get: tags: - - Content + - Tags summary: Retrieve podcast categories description: Retrieve a list of podcast categories and the number of uploads tagged with those categories operationId: getTagsPodcasts parameters: - - name: q - in: query - required: false - description: A free text field to filter category names - schema: - type: string - - name: page - in: query - required: false - description: The number of the result page you want to return - schema: - type: number - - name: page_size - in: query - required: false - description: The number of results to return on each page. Defaults to 50. - schema: - type: number + - $ref: "#/components/parameters/query" + - $ref: "#/components/parameters/pageParam" + - $ref: "#/components/parameters/pageSizeParam" - name: ordering in: query required: false @@ -91,18 +244,24 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Categories" - application/xml: - schema: - $ref: "#/components/schemas/Categories" + allOf: + - $ref: "#/components/schemas/Pagination" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/Category" "401": $ref: "#/components/responses/Unauthorized" /api/v2/tags/podcasts/{category}: get: tags: - - Content - summary: Retrieve podcast categories - description: Retrieve a list of podcast categories and the number of uploads tagged with those categories + - Tags + summary: Retrieve podcasts by category + description: Retrieve all podcasts in a category operationId: getTagPodcasts parameters: - name: category @@ -118,15 +277,12 @@ paths: application/json: schema: $ref: "#/components/schemas/Category" - application/xml: - schema: - $ref: "#/components/schemas/Category" "401": $ref: "#/components/responses/Unauthorized" /api/v2/tags/music: get: tags: - - Content + - Tags summary: Retrieve music genres description: Retrieve a list of music genres and the number of uploads tagged with those categories operationId: getTagsMusic @@ -137,18 +293,8 @@ paths: description: A free text field to filter genre names schema: type: string - - name: page - in: query - required: false - description: The number of the result page you want to return - schema: - type: number - - name: page_size - in: query - required: false - description: The number of results to return on each page. Defaults to 50. - schema: - type: number + - $ref: "#/components/parameters/pageParam" + - $ref: "#/components/parameters/pageSizeParam" - name: ordering in: query required: false @@ -169,18 +315,24 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Genres" - application/xml: - schema: - $ref: "#/components/schemas/Genres" + allOf: + - $ref: "#/components/schemas/Pagination" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/Genre" "401": $ref: "#/components/responses/Unauthorized" /api/v2/tags/music/{genre}: get: tags: - - Content - summary: Retrieve podcast categories - description: Retrieve a list of podcast categories and the number of uploads tagged with those categories + - Tags + summary: Retrieve music by genre + description: Retrieve all podcasts in a genre operationId: getTagMusic parameters: - name: genre @@ -196,9 +348,34 @@ paths: application/json: schema: $ref: "#/components/schemas/Genre" - application/xml: + "401": + $ref: "#/components/responses/Unauthorized" + /api/v2/history/listenings: + get: + tags: + - History + summary: Fetch a list of listenings + description: Fetch a list of listenings from public and followed users + operationId: getHistory + parameters: + - $ref: "#/components/parameters/pageParam" + - $ref: "#/components/parameters/pageSizeParam" + responses: + "200": + description: Successful operation + content: + application/json: schema: - $ref: "#/components/schemas/Genre" + allOf: + - $ref: "#/components/schemas/Pagination" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/Listening" "401": $ref: "#/components/responses/Unauthorized" components: @@ -209,44 +386,72 @@ components: application/json: schema: $ref: "#/components/schemas/Error" - example: - code: 401 - message: User not authorized - application/xml: - schema: - $ref: "#/components/schemas/Error" - example: - code: 401 - message: User not authorized + examples: + code: + value: 401 + message: + value: User not authorized + parameters: + pageParam: + name: page + in: query + required: false + description: The number of the result page you want to return + schema: + type: number + pageSizeParam: + name: page_size + in: query + required: false + description: The number of results to return on each page. Defaults to 50. + schema: + type: number + default: 50 + query: + name: q + in: query + required: false + description: A free text field to filter results + schema: + type: string schemas: - Categories: - type: object - properties: - total: - type: number - next: - type: string - format: url - previous: - type: string - format: url - results: - type: array - items: - $ref: "#/components/schemas/Category" - example: - total: 5 - next: https://demo.funkwhale.audio/api/v2/categories?page=2&page_size=2&q=crime - previous: null - results: - - category: "True Crime" - created_date: "2020-01-01T00:00:00.000Z" - tagged_items: 5 - results_page: "https://demo.funkwhale.audio/library/categories/True%20Crime" - - category: "True Stories" - created_date: "2023-12-15T23:32:52.000Z" - tagged_items: 200 - results_page: "https://demo.funkwhale.audio/library/categories/True%20Stories" + Actor: + allOf: + - $ref: "#/components/schemas/SimpleActor" + - type: object + properties: + lastFetchDate: + type: string + format: date-time + manuallyApprovesFollowers: + type: boolean + type: + type: string + enum: + - person + - tombstone + - application + - group + - organization + - service + Artist: + allOf: + - $ref: "#/components/schemas/SimpleArtist" + - type: object + properties: + creationDate: + type: string + format: date-time + recordingCount: + type: integer + tags: + type: array + items: + type: string + releases: + type: array + items: + $ref: "#/components/schemas/SimpleRelease" Category: type: object properties: @@ -260,39 +465,90 @@ components: results_page: type: string format: url - example: - category: "True Crime" - created_date: "2020-01-01T00:00:00.000Z" - tagged_items: 5 - results_page: "https://demo.funkwhale.audio/library/categories/True%20Crime" - Genres: + Collection: + allOf: + - $ref: "#/components/schemas/SimpleCollection" + - type: object + properties: + items: + type: integer + CoverUrls: type: object + required: + - uuid + - mimetype + - size + - creationDate + - urls properties: - total: - type: number - next: + uuid: type: string - format: url - previous: + format: uuid + mimetype: type: string - format: url - results: + size: + type: integer + creationDate: + type: string + format: date-time + urls: + type: object + required: + - original + properties: + source: + type: string + format: url + original: + type: string + format: url + CreateRelease: + type: object + required: + - title + - artist + properties: + title: + type: string + releaseDate: + type: string + format: date-time + tags: type: array items: - $ref: "#/components/schemas/Genre" - example: - total: 5 - next: https://demo.funkwhale.audio/api/v2/categories?page=2&page_size=2&q=rock - previous: null - results: - - genre: "Acoustic Rock" - created_date: "2020-01-01T00:00:00.000Z" - tagged_items: 5 - results_page: "https://demo.funkwhale.audio/library/categories/Acoustic%20Rock" - - genre: "Surf Rock" - created_date: "2023-12-15T23:32:52.000Z" - tagged_items: 200 - results_page: "https://demo.funkwhale.audio/library/categories/Surf%20Rock" + type: string + type: + $ref: "#/components/schemas/ReleaseTypeEnum" + description: + type: object + required: + - text + - contentType + properties: + text: + type: string + description: A description of the release + contentType: + type: string + enum: + - "text/html" + - "text/markdown" + - "text/plain" + html: + type: string + artist: + type: string + description: The name of the associated artist + Error: + type: object + properties: + code: + type: string + message: + type: string + required: + - code + - message Genre: type: object properties: @@ -306,11 +562,24 @@ components: results_page: type: string format: url - example: - genre: "Acoustic Rock" - created_date: "2020-01-01T00:00:00.000Z" - tagged_items: 5 - results_page: "https://demo.funkwhale.audio/library/categories/Acoustic%20Rock" + Listening: + type: object + required: + - guid + - createdDate + - user + - recording + properties: + guid: + type: string + format: uuid + createdDate: + type: string + format: date-time + recording: + $ref: "#/components/schemas/SimpleRecording" + user: + $ref: "#/components/schemas/SimpleUser" Nodeinfo: type: object required: @@ -338,7 +607,8 @@ components: - "Funkwhale" version: type: string - example: "1.4.0" + examples: + - "1.4.0" repository: type: string format: url @@ -365,7 +635,7 @@ components: - "tent" - "xmpp" - "zot" - example: + examples: - "activitypub" services: type: object @@ -505,11 +775,11 @@ components: type: number hoursOfContent: type: number - example: - artists: 1000 - releases: 10000 - recordings: 150000 - hoursOfContent: 7500 + examples: + - artists: 1000 + releases: 10000 + recordings: 150000 + hoursOfContent: 7500 topMusicCategories: type: array items: @@ -570,23 +840,271 @@ components: type: array items: type: string - example: + examples: - "channels" - "podcasts" - "collections" - "audiobooks" - "federation" - "anonymousCanListen" - Error: + Pagination: type: object - properties: - code: - type: string - message: - type: string required: - - code - - message + - total + properties: + total: + type: integer + next: + type: string + format: url + previous: + type: string + format: url + Recording: + allOf: + - $ref: "#/components/schemas/SimpleRecording" + - type: object + required: + - creationDate + - downloadsCount + - attributedTo + properties: + creationDate: + type: string + format: date-time + copyright: + format: string + license: + format: string + tags: + format: array + items: + type: string + mbid: + type: string + format: uuid + downloadsCount: + type: integer + discNumber: + type: integer + position: + type: integer + attributedTo: + $ref: "#/components/schemas/SimpleActor" + collections: + type: array + items: + $ref: "#/components/schemas/SimpleCollection" + Release: + allOf: + - $ref: "#/components/schemas/SimpleRelease" + - type: object + properties: + creationDate: + type: string + format: date-time + releaseDate: + type: string + format: date + recordingCount: + type: integer + duration: + type: integer + attributedTo: + $ref: "#/components/schemas/SimpleActor" + local: + type: boolean + recordings: + type: array + items: + $ref: "#/components/schemas/SimpleRecording" + ReleaseGroup: + type: object + required: + - guid + - artist + - primaryType + properties: + guid: + type: string + format: uuid + artist: + $ref: "#/components/schemas/SimpleArtist" + primaryType: + $ref: "#/components/schemas/ReleaseTypeEnum" + secondaryType: + type: string + enum: + - compilation + - soundtrack + - spokenword + - interview + - audiobook + - audio-drama + - live + - remix + - dj-mix + - mixtape + - demo + - field-recording + releases: + type: array + items: + $ref: "#/components/schemas/SimpleRelease" + ReleaseTypeEnum: + type: string + default: album + description: The type of release + enum: + - album + - single + - ep + - broadcast + - other + SimpleActor: + type: object + required: + - fid + - preferredUsername + - fullUsername + - local + - domain + properties: + fid: + type: string + format: url + url: + type: string + format: url + fullUsername: + type: string + preferredUsername: + type: string + name: + type: string + domain: + type: string + local: + type: boolean + SimpleArtist: + type: object + required: + - id + - fid + - name + - contentCategory + - local + properties: + id: + type: integer + fid: + type: string + format: url + mbid: + type: string + format: uuid + name: + type: string + contentCategory: + type: string + enum: + - music + - podcast + - other + local: + type: boolean + channel: + type: string + format: uuid + SimpleCollection: + type: object + required: + - uuid + - name + - local + - owner + properties: + uuid: + type: string + format: uuid + name: + type: string + local: + type: boolean + owner: + $ref: "#/components/schemas/SimpleActor" + SimpleRecording: + type: object + required: + - id + - fid + - name + - playable + - local + - release + - artist + - cover + properties: + id: + type: integer + fid: + type: string + format: url + name: + type: string + playable: + type: boolean + local: + type: boolean + release: + $ref: "#/components/schemas/SimpleRelease" + artist: + $ref: "#/components/schemas/SimpleArtist" + cover: + $ref: "#/components/schemas/CoverUrls" + SimpleRelease: + type: object + required: + - id + - fid + - name + - local + properties: + id: + type: integer + fid: + type: string + format: url + mbid: + type: string + format: uuid + name: + type: string + playable: + type: boolean + releaseGroup: + type: string + format: uuid + cover: + $ref: "#/components/schemas/CoverUrls" + SimpleUser: + type: object + required: + - id + - username + - fullUsername + - avatar + properties: + id: + type: integer + username: + type: string + fullUsername: + type: string + preferredUsername: + type: string + avatar: + $ref: "#/components/schemas/CoverUrls" securitySchemes: oauth2: type: oauth2 @@ -602,7 +1120,7 @@ components: "read:edits": "Read-only access to edits" "write:edits": "Write-only access to edits" "read:favorites": "Read-only access to favorites" - "write:favorites": "Write-only access to favorits" + "write:favorites": "Write-only access to favorites" "read:filters": "Read-only to to content filters" "write:filters": "Write-only access to content-filters" "read:follows": "Read-only to follows"