diff --git a/docs/swagger.yml b/docs/swagger.yml index 71c74e442634ac013efd175c26759e4fdb434623..5b277f0e08eb984c140211bcdf481ecdde36799f 100644 --- a/docs/swagger.yml +++ b/docs/swagger.yml @@ -1,4 +1,4 @@ -openapi: "3.0" +openapi: "3.0.0" info: description: "Documentation for [Funkwhale](https://funkwhale.audio) API. The API is **not** stable yet." version: "1.0.0" @@ -7,6 +7,8 @@ info: servers: - url: https://demo.funkwhale.audio/api/v1 description: Demo server + - url: https://open.audio/api/v1 + description: Open Audio - url: https://node1.funkwhale.test/api/v1 description: Node 1 (local) @@ -50,47 +52,471 @@ paths: /artists/: get: + summary: List artists tags: - "artists" parameters: - name: "q" in: "query" + default: null description: "Search query used to filter artists" schema: required: false type: "string" example: "carpenter" - - name: "listenable" + - allOf: + - $ref: "#/parameters/Ordering" + - default: "-creation_date" + schema: + required: false + type: "string" + example: "creation_date" + enum: + - creation_date + - id + - name + - $ref: "#/parameters/Playable" + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + + responses: + 200: + content: + application/json: + schema: + allOf: + - $ref: "#/definitions/ResultPage" + - type: "object" + properties: + results: + type: "array" + items: + $ref: "#/definitions/Artist" + /artists/{id}/: + get: + summary: Retrieve a single artist + parameters: + - $ref: "#/parameters/ObjectId" + + tags: + - "artists" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/Artist" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + /artists/{id}/libraries/: + get: + summary: List available user libraries containing work from this artist + parameters: + - $ref: "#/parameters/ObjectId" + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + + tags: + - "artists" + - "libraries" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/LibraryPage" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + + /albums/: + get: + summary: List albums + tags: + - "albums" + parameters: + - name: "q" + in: "query" + default: null + description: "Search query used to filter albums" + schema: + required: false + type: "string" + example: "carpenter" + - name: "artist" + in: "query" + default: null + description: "Only include albums by the requested artist" + schema: + required: false + type: "integer" + format: "int64" + - allOf: + - $ref: "#/parameters/Ordering" + - default: "-creation_date" + schema: + required: false + type: "string" + example: "creation_date" + enum: + - creation_date + - release_date + - title + - $ref: "#/parameters/Playable" + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + + responses: + 200: + content: + application/json: + schema: + allOf: + - $ref: "#/definitions/ResultPage" + - type: "object" + properties: + results: + type: "array" + items: + $ref: "#/definitions/Album" + /albums/{id}/: + get: + summary: Retrieve a single album + parameters: + - $ref: "#/parameters/ObjectId" + + tags: + - "albums" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/Album" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + + /albums/{id}/libraries/: + get: + summary: List available user libraries containing tracks from this album + parameters: + - $ref: "#/parameters/ObjectId" + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + + tags: + - "albums" + - "libraries" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/LibraryPage" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + + /tracks/: + get: + summary: List tracks + tags: + - "tracks" + parameters: + - name: "q" + in: "query" + default: null + description: "Search query used to filter tracks" + schema: + required: false + type: "string" + example: "carpenter" + - name: "artist" + in: "query" + default: null + description: "Only include tracks by the requested artist" + schema: + required: false + type: "integer" + format: "int64" + - name: "album" + in: "query" + default: null + description: "Only include tracks from the requested album" + schema: + required: false + type: "integer" + format: "int64" + - name: "license" in: "query" - description: "Filter/exclude artists with listenable tracks" + description: "Only include tracks with the given license" + default: null schema: + example: "cc-by-sa-4.0" required: false - type: "boolean" + type: "string" + - allOf: + - $ref: "#/parameters/Ordering" + - default: "-creation_date" + schema: + required: false + type: "string" + example: "creation_date" + enum: + - creation_date + - release_date + - title + - $ref: "#/parameters/Playable" + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + responses: 200: content: application/json: schema: - type: "object" - properties: - count: - $ref: "#/properties/resultsCount" - results: - type: "array" - items: - $ref: "#/definitions/ArtistWithAlbums" + allOf: + - $ref: "#/definitions/ResultPage" + - type: "object" + properties: + results: + type: "array" + items: + $ref: "#/definitions/Track" + /tracks/{id}/: + get: + summary: Retrieve a single track + parameters: + - $ref: "#/parameters/ObjectId" + + tags: + - "tracks" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/Track" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + + /tracks/{id}/libraries/: + get: + summary: List available user libraries containing given track + parameters: + - $ref: "#/parameters/ObjectId" + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + + tags: + - "tracks" + - "libraries" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/LibraryPage" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + + /licenses/: + get: + summary: List licenses + tags: + - "licenses" + parameters: + - $ref: "#/parameters/PageNumber" + - $ref: "#/parameters/PageSize" + responses: + 200: + content: + application/json: + schema: + allOf: + - $ref: "#/definitions/ResultPage" + - type: "object" + properties: + results: + type: "array" + items: + $ref: "#/definitions/License" + + /licenses/{code}/: + get: + summary: Retrieve a single license + parameters: + - name: code + in: path + description: License code + required: true + schema: + type: string + example: cc0-1.0 + + tags: + - "licenses" + responses: + 200: + content: + application/json: + schema: + $ref: "#/definitions/License" + 404: + content: + application/json: + schema: + $ref: "#/definitions/ResourceNotFound" + + +parameters: + ObjectId: + name: id + in: path + description: Object ID + required: true + schema: + type: integer + format: int64 + Ordering: + name: "ordering" + in: "query" + description: "Ordering for the results, prefix with - for DESC ordering" + + PageNumber: + in: query + name: page + schema: + type: "integer" + format: "int64" + example: 1 + default: 1 + minimum: 1 + PageSize: + in: query + name: page_size + schema: + type: "integer" + format: "int64" + example: 16 + default: 25 + minimum: 1 + maximum: 25 + Playable: + name: "playable" + in: "query" + default: null + description: "Filter/exclude resources with playable tracks" + schema: + required: false + type: "boolean" -properties: - resultsCount: - type: "integer" - format: "int64" - description: "The total number of resources matching the request" mbid: type: "string" formats: "uuid" description: "A musicbrainz ID" + definitions: - Artist: + ResultPage: + type: "object" + properties: + count: + type: "integer" + format: "int64" + example: 42 + description: "The total number of results (all pages included)" + next: + type: "string" + format: "uri" + description: "Link to the next page of results" + previous: + type: "string" + format: "uri" + description: "Link to the previous page of results" + + + Image: + type: "object" + properties: + original: + type: "string" + description: "URL to the original image" + example: "https://mydomain/media/albums/covers/ec2c53aeaac6.jpg" + small_square_crop: + type: "string" + description: "URL to a small, squared thumbnail of the image" + example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-50x50-70.jpg" + + medium_square_crop: + type: "string" + description: "URL to a medium, squared thumbnail of the image" + example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-200x200-70.jpg" + + square_crop: + type: "string" + description: "URL to a large, squared thumbnail of the image" + example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-400x400-70.jpg" + + Actor: + type: object + description: "A federation/ ActivityPub actor" + properties: + fid: + type: string + format: uri + description: "The actor Federation ID (unique accross federation)" + uuid: + type: string + format: uuid + description: "Local ID of the library" + creation_date: + type: "string" + format: "date-time" + preferred_username: + type: "string" + example: "alice" + name: + type: string + example: "Alice Unicorn" + last_fetch_date: + type: "string" + format: "date-time" + description: "Last time the actor profile was fetched on its origin server" + domain: + type: "string" + format: "hostname" + example: "open.audio" + type: + type: "string" + example: "Person" + enum: + - Person + - Application + - Group + - Organization + manually_approves_followers: + type: "boolean" + full_username: + type: string + example: "alice@open.audio" + + BaseArtist: type: "object" properties: mbid: @@ -106,10 +532,10 @@ definitions: creation_date: type: "string" format: "date-time" - ArtistWithAlbums: + Artist: type: "object" allOf: - - $ref: "#/definitions/Artist" + - $ref: "#/definitions/BaseArtist" - type: "object" properties: albums: @@ -117,7 +543,7 @@ definitions: items: $ref: "#/definitions/ArtistAlbum" - Album: + BaseAlbum: type: "object" properties: mbid: @@ -142,19 +568,112 @@ definitions: required: false format: "date" example: "2001-01-01" + is_playable: + type: "boolean" + cover: + $ref: "#/definitions/Image" + + Album: + type: "object" + allOf: + - $ref: "#/definitions/BaseAlbum" + - type: "object" + properties: + tracks: + type: "array" + items: + $ref: "#/definitions/AlbumTrack" ArtistAlbum: type: "object" allOf: - - $ref: "#/definitions/Album" + - $ref: "#/definitions/BaseAlbum" - type: "object" properties: tracks_count: type: "integer" format: "int64" example: 16 + Library: + type: "object" + properties: + fid: + type: string + format: uri + description: "The library Federation ID (unique accross federation)" + uuid: + type: string + format: uuid + description: "Local ID of the library" + name: + type: string + example: "My awesome library" + description: + type: string + nullable: true + example: "This library contains all the stuff I love!" + uploads_count: + type: "integer" + format: "int64" + example: 687 + privacy_level: + type: string + example: "me" + enum: + - "me" + - "instance" + - "everyone" + actor: + $ref: "#/definitions/Actor" + LibraryPage: + allOf: + - $ref: "#/definitions/ResultPage" + - type: "object" + properties: + results: + type: "array" + items: + $ref: "#/definitions/Library" - Track: + License: + type: "object" + properties: + id: + type: string + format: uri + example: http://creativecommons.org/publicdomain/zero/1.0/ + description: "The license ID" + url: + type: string + format: uri + example: http://creativecommons.org/publicdomain/zero/1.0/ + description: "The license url (can be different than the ID)" + code: + type: string + description: "A unique code to identify the license" + example: cc0-1.0 + redistribute: + type: boolean + example: true + description: "Does the license allow free redistribution?" + derivative: + type: boolean + example: true + description: "Does the license allow the creation of derivative work?" + commercial: + type: boolean + example: true + description: "Does the license allow commercial use?" + attribution: + type: boolean + example: false + description: "Does the license requires crediting the author?" + copyleft: + type: boolean + example: false + description: "Does the license enforce a similar license of derivative work?" + + BaseTrack: type: "object" properties: mbid: @@ -181,6 +700,94 @@ definitions: type: "number" minimum: 1 example: 1 - creation_date: + disc_number: + required: false + type: "number" + minimum: 1 + example: 1 + listen_url: type: "string" - format: "date-time" + format: "uri" + description: "URL to stream the track" + copyright: + type: "string" + example: "Creative Commons Attribution-NonCommercial-NoDerivatives 4.0: http://creativecommons.org/licenses/by-nc-nd/4.0/" + description: "Copyright information as extracted from upload tags" + license: + type: "string" + description: "Identifier of the license that is linked to the track" + example: "cc-by-nc-nd-4.0" + + AlbumTrack: + type: "object" + allOf: + - $ref: "#/definitions/BaseTrack" + - type: "object" + properties: + artist: + $ref: "#/definitions/BaseArtist" + uploads: + type: "array" + description: "List of uploads associated with this track" + items: + $ref: "#/definitions/Upload" + Track: + type: "object" + allOf: + - $ref: "#/definitions/BaseTrack" + - type: "object" + properties: + album: + $ref: "#/definitions/Album" + artist: + $ref: "#/definitions/BaseArtist" + uploads: + type: "array" + description: "List of uploads associated with this track" + items: + $ref: "#/definitions/Upload" + Upload: + type: "object" + properties: + uuid: + type: string + format: uuid + size: + type: "integer" + format: "int64" + example: 278987000 + description: "Size of the file, in bytes" + duration: + type: "integer" + format: "int64" + example: 184 + description: "Duration of the audio, in seconds" + bitrate: + type: "integer" + format: "int64" + example: 128000 + description: "Bitrate of the file, in bytes/s" + mimetype: + type: string + example: "audio/ogg" + enum: + - "audio/ogg" + - "audio/mpeg" + - "audio/x-flac" + - "audio/flac" + extension: + type: string + example: "ogg" + description: "File extension of the upload" + + listen_url: + type: "string" + format: "uri" + description: "URL to stream the upload" + + ResourceNotFound: + type: "object" + properties: + detail: + type: "string" + example: "Not found."