1793 lines
52 KiB
YAML
1793 lines
52 KiB
YAML
openapi: "3.0.3"
|
|
info:
|
|
description: |
|
|
API explorer for the [Funkwhale](https://funkwhale.audio) API.
|
|
|
|
Backward compatibility between minor versions (1.X to 1.Y) is guaranteed for all the
|
|
endpoints documented here.
|
|
|
|
## Usage
|
|
|
|
Click on an endpoint name to inspect its properties, parameters and responses.
|
|
|
|
Use the "Try it out" button to send a real world payload to the endpoint and inspect
|
|
the corresponding response.
|
|
|
|
## OAuth Authentication
|
|
|
|
Funkwhale uses the OAuth [authorization grant flow](https://tools.ietf.org/html/rfc6749#section-4.1) for external apps. This flow is
|
|
a secure way to authenticate apps that requires a user's explicit consent to perform actions. You can use our demo server at <https://demo.funkwhale.audio>
|
|
for testing purposes.
|
|
|
|
To authenticate with the Funkwhale API:
|
|
|
|
1. Create an application by sending a `POST` request to `api/v1/oauth/apps`. Include your scopes and redirect URI (use `urn:ietf:wg:oauth:2.0:oob`
|
|
to get an authorization code you can copy)
|
|
2. Send an [authorization request](https://www.rfc-editor.org/rfc/rfc6749#section-4.1.2) to the `/authorize` endpoint to receive an authorization code
|
|
3. [Request an access token](https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3) from `/api/v1/oauth/token`
|
|
4. Use your access token to authenticate your calls with the following format: `Authorization: Bearer <token>`
|
|
5. Refresh your access token by sending a refresh request to `/api/v1/oauth/token`
|
|
|
|
For more detailed instructions, see [our API authentication documentation](https://docs.funkwhale.audio/developer_documentation/api/authentication.html).
|
|
|
|
## Application token authentication
|
|
|
|
If you have an account on your target pod, you can create an application at `/settings/applications/new`. Once you authorize the application you
|
|
can retrieve an access token. Use your access token to authenticate your calls with the following format: `Authorization: Bearer <token>`
|
|
|
|
## Rate limiting
|
|
|
|
Funkwhale supports rate-limiting as of version 0.2.0. Pod admins can choose to rate limit specific endpoints to prevent abuse and improve the stability of the service.
|
|
If the server drops a request due to rate-limiting, it returns a `429` status code.
|
|
|
|
Each API call returns HTTP headers to pass the following information:
|
|
|
|
- What was the scope of the request (`X-RateLimit-Scope`)
|
|
- What is the rate-limit associated with the request scope (`X-RateLimit-Limit`)
|
|
- How many more requests in the scope can be made within the rate-limit timeframe (`X-RateLimit-Remaining`)
|
|
- How much time does the client need to wait to send another request (`Retry-After`)
|
|
|
|
For more information, check our [rate limit documentation](https://docs.funkwhale.audio/developer_documentation/api/rate-limit.html)
|
|
|
|
## Resources
|
|
|
|
For more information about API usage, refer to [our API documentation](https://docs.funkwhale.audio/developer_documentation/api/index.html).
|
|
|
|
version: "1.0.0"
|
|
title: "Funkwhale API"
|
|
|
|
servers:
|
|
- url: https://demo.funkwhale.audio
|
|
description: Demo server
|
|
- url: https://open.audio
|
|
description: Real server with real content
|
|
- url: https://{domain}
|
|
description: Custom server
|
|
variables:
|
|
domain:
|
|
default: yourdomain
|
|
description: Your Funkwhale Domain
|
|
protocol:
|
|
enum:
|
|
- 'http'
|
|
- 'https'
|
|
default: 'https'
|
|
|
|
components:
|
|
responses:
|
|
200:
|
|
description: Success
|
|
201:
|
|
description: Successfully created
|
|
204:
|
|
description: Successfully deleted
|
|
400:
|
|
description: Bad request
|
|
securitySchemes:
|
|
oauth2:
|
|
type: oauth2
|
|
description: This API uses OAuth 2 with the Authorization Code flow. You can register an app using the /oauth/apps/ endpoint.
|
|
flows:
|
|
authorizationCode:
|
|
authorizationUrl: /authorize
|
|
tokenUrl: /api/v1/oauth/token/
|
|
refreshUrl: /api/v1/oauth/token/
|
|
scopes:
|
|
"read": "Read-only access to all user data"
|
|
"write": "Write-only access on all user data"
|
|
"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"
|
|
"read:filters": "Read-only to to content filters"
|
|
"write:filters": "Write-only access to content-filters"
|
|
"read:follows": "Read-only to follows"
|
|
"write:follows": "Write-only access to follows"
|
|
"read:libraries": "Read-only access to library and uploads"
|
|
"write:libraries": "Write-only access to libraries"
|
|
"read:listenings": "Read-only access to listening history"
|
|
"write:listenings": "Write-only access to listening history"
|
|
"read:notifications": "Read-only access to notifications"
|
|
"write:notifications": "Write-only access to notifications"
|
|
"read:playlists": "Read-only access to playlists"
|
|
"write:playlists": "Write-only access to playlists"
|
|
"read:profile": "Read-only access to profile data"
|
|
"write:profile": "Write-only access to profile data"
|
|
"read:radios": "Read-only access to radios"
|
|
"write:radios": "Write-only access to radios"
|
|
"read:reports": "Read-only access to reports"
|
|
"write:reports": "Write-only access to reports"
|
|
"read:security": "Read-only access security settings"
|
|
"write:security": "write-only access security settings"
|
|
jwt:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
description: "You can get a token by using the /token endpoint"
|
|
|
|
security:
|
|
- jwt: []
|
|
- oauth2: []
|
|
|
|
tags:
|
|
- name: Auth and security
|
|
description: Login, logout, rate-limit and authorization endpoints
|
|
- name: Library and metadata
|
|
description: Information and metadata about musical and audio entities (albums, tracks, artists, etc.)
|
|
- name: Uploads and audio content
|
|
description: Manipulation and uploading of audio files
|
|
externalDocs:
|
|
url: https://docs.funkwhale.audio/users/managing.html
|
|
- name: Channels and subscriptions
|
|
description: Channel management and subscription
|
|
externalDocs:
|
|
url: https://docs.funkwhale.audio/users/upload.html#using-a-channel
|
|
- name: Content curation
|
|
description: Favorites, playlists, radios
|
|
- name: User activity
|
|
description: Listenings
|
|
- name: Other
|
|
description: Other endpoints that don't fit in the categories above
|
|
|
|
paths:
|
|
/api/v1/oauth/apps/:
|
|
post:
|
|
tags:
|
|
- "Auth and security"
|
|
summary:
|
|
Register an OAuth application
|
|
security: []
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/OAuthApplication"
|
|
- $ref: "./api/definitions.yml#/OAuthApplicationCreation"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
name:
|
|
type: "string"
|
|
example: "My Awesome Funkwhale Client"
|
|
description: "A human readable name for your app"
|
|
redirect_uris:
|
|
type: "string"
|
|
example: "https://myapp/oauth2/funkwhale"
|
|
description: "A list of redirect uris, separated by spaces"
|
|
scopes:
|
|
type: "string"
|
|
description: "A list of scopes requested by your app, separated by spaces"
|
|
example: "read write:playlists write:favorites"
|
|
/api/v1/oauth/token/:
|
|
post:
|
|
tags:
|
|
- "Auth and security"
|
|
summary:
|
|
Request an OAuth bearer token in exchange of an authorization_code or a refresh_token
|
|
security: []
|
|
responses:
|
|
200:
|
|
$ref: "#/components/responses/200"
|
|
|
|
/api/v1/auth/registration/:
|
|
post:
|
|
summary: Create an account
|
|
description: |
|
|
Register a new account on this instance. An invitation code will be required
|
|
if sign up is disabled.
|
|
tags:
|
|
- "Auth and security"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
required:
|
|
- username
|
|
- email
|
|
- password1
|
|
- password2
|
|
properties:
|
|
username:
|
|
type: "string"
|
|
example: "alice"
|
|
email:
|
|
type: "string"
|
|
format: "email"
|
|
invitation:
|
|
type: "string"
|
|
example: "INVITECODE"
|
|
description: An invitation code, required if signups are closed on the instance.
|
|
password1:
|
|
type: "string"
|
|
example: "passw0rd"
|
|
password2:
|
|
type: "string"
|
|
description: Must be identical to password1
|
|
example: "passw0rd"
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
/api/v1/auth/password/reset/:
|
|
post:
|
|
summary: Request a password reset
|
|
description: |
|
|
Request a password reset. An e-mail with reset instructions will be sent to the provided e-mail address,
|
|
if it's associated with a user account.
|
|
tags:
|
|
- "Auth and security"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
email:
|
|
type: "string"
|
|
format: "email"
|
|
responses:
|
|
200:
|
|
$ref: "#/components/responses/200"
|
|
/api/v1/users/me/:
|
|
get:
|
|
summary: Retrive profile information
|
|
description: |
|
|
Retrieve profile informations of the current user
|
|
tags:
|
|
- "Auth and security"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Me"
|
|
delete:
|
|
summary: Delete the user account performing the request
|
|
tags:
|
|
- "Auth and security"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
confirm:
|
|
type: "boolean"
|
|
description: "Must be set to true, to avoid accidental deletion"
|
|
password:
|
|
type: "string"
|
|
description: "The current password of the account"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Me"
|
|
/api/v1/users/users/change-email/:
|
|
post:
|
|
summary: Update the e-mail address associated with a user account
|
|
tags:
|
|
- "Auth and security"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
email:
|
|
type: "string"
|
|
format: "email"
|
|
password:
|
|
type: "string"
|
|
description: "The current password of the account"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Me"
|
|
|
|
/api/v1/rate-limit/:
|
|
get:
|
|
summary: Retrive rate-limit information and current usage status
|
|
tags:
|
|
- "Auth and security"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/RateLimitStatus"
|
|
|
|
/api/v1/artists/:
|
|
get:
|
|
summary: List artists
|
|
tags:
|
|
- "Library and metadata"
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
parameters:
|
|
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/ArtistOrdering"
|
|
- $ref: "./api/parameters.yml#/Playable"
|
|
- $ref: "./api/parameters.yml#/HasAlbums"
|
|
- $ref: "./api/parameters.yml#/Library"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Related"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
- $ref: "./api/parameters.yml#/ContentCategory"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Artist"
|
|
/api/v1/artists/{id}/:
|
|
get:
|
|
summary: Retrieve a single artist
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/ObjectId"
|
|
- $ref: "./api/parameters.yml#/Refresh"
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Artist"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
/api/v1/artists/{id}/libraries/:
|
|
get:
|
|
summary: List available user libraries containing work from this artist
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/ObjectId"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/LibraryPage"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
|
|
/api/v1/albums/:
|
|
get:
|
|
summary: List albums
|
|
tags:
|
|
- "Library and metadata"
|
|
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- name: "artist"
|
|
in: "query"
|
|
required: false
|
|
description: "Only include albums by the requested artist"
|
|
schema:
|
|
nullable: true
|
|
type: "integer"
|
|
format: "int64"
|
|
- $ref: "./api/parameters.yml#/AlbumOrdering"
|
|
- $ref: "./api/parameters.yml#/Library"
|
|
- $ref: "./api/parameters.yml#/Playable"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Related"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
- $ref: "./api/parameters.yml#/ContentCategory"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Album"
|
|
/api/v1/albums/{id}/:
|
|
get:
|
|
summary: Retrieve a single album
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/ObjectId"
|
|
- $ref: "./api/parameters.yml#/Refresh"
|
|
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Album"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
|
|
/api/v1/albums/{id}/libraries/:
|
|
get:
|
|
summary: List available user libraries containing tracks from this album
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/ObjectId"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/LibraryPage"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
|
|
/api/v1/tracks/:
|
|
get:
|
|
summary: List tracks
|
|
tags:
|
|
- "Library and metadata"
|
|
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
parameters:
|
|
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- name: "artist"
|
|
in: "query"
|
|
required: false
|
|
description: "Only include tracks by the requested artist"
|
|
schema:
|
|
nullable: true
|
|
type: "integer"
|
|
format: "int64"
|
|
- name: "favorites"
|
|
in: "query"
|
|
required: false
|
|
description: "filter/exclude tracks favorited by the current user"
|
|
schema:
|
|
nullable: true
|
|
type: "boolean"
|
|
- name: "album"
|
|
in: "query"
|
|
required: false
|
|
description: "Only include tracks from the requested album"
|
|
schema:
|
|
nullable: true
|
|
type: "integer"
|
|
format: "int64"
|
|
- name: "license"
|
|
in: "query"
|
|
description: "Only include tracks with the given license"
|
|
required: false
|
|
schema:
|
|
example: "cc-by-sa-4.0"
|
|
nullable: true
|
|
type: "string"
|
|
- $ref: "./api/parameters.yml#/TrackOrdering"
|
|
- $ref: "./api/parameters.yml#/Library"
|
|
- $ref: "./api/parameters.yml#/Playable"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Related"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Track"
|
|
/api/v1/tracks/{id}/:
|
|
get:
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/ObjectId"
|
|
- $ref: "./api/parameters.yml#/Refresh"
|
|
summary: Retrieve a single track
|
|
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Track"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
|
|
/api/v1/tracks/{id}/libraries/:
|
|
get:
|
|
summary: List available user libraries containing given track
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/ObjectId"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/LibraryPage"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
/api/v1/listen/{uuid}/:
|
|
get:
|
|
summary: Download the audio file matching the given track uuid
|
|
description: |
|
|
Given a track uuid (and not ID), return the first found audio file
|
|
accessible by the user making the request.
|
|
|
|
In case of a remote upload, this endpoint will fetch the audio file from the remote
|
|
and cache it before sending the response.
|
|
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
description: Track uuid
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
- name: to
|
|
in: query
|
|
required: false
|
|
description: |
|
|
If specified, the endpoint will return a transcoded version of the original
|
|
audio file.
|
|
|
|
Since transcoding happens on the fly, it can significantly increase response time,
|
|
and it's recommended to request transcoding only for files that are not playable
|
|
by the client.
|
|
|
|
This endpoint support bytess-range requests.
|
|
schema:
|
|
$ref: "./api/properties.yml#/transcode_options"
|
|
- name: upload
|
|
in: query
|
|
required: false
|
|
description: |
|
|
An upload uuid
|
|
|
|
If specified, will return the audio for the given upload uuid.
|
|
|
|
This is useful for tracks that have multiple uploads available.
|
|
|
|
schema:
|
|
type: string
|
|
format: uuid
|
|
- name: token
|
|
in: query
|
|
required: false
|
|
description: |
|
|
A listen token as returned by /users/me
|
|
|
|
This offers an alternative authentication method for situations where HTTP headers
|
|
can't be modified to include a Bearer token.
|
|
schema:
|
|
type: string
|
|
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
'*/*':
|
|
schema:
|
|
description: "Audio file, as binary data"
|
|
type: string
|
|
format: binary
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
|
|
/api/v1/licenses/:
|
|
get:
|
|
summary: List licenses
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
tags:
|
|
- "Library and metadata"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/License"
|
|
|
|
/api/v1/licenses/{code}/:
|
|
get:
|
|
summary: Retrieve a single license
|
|
security:
|
|
- oauth2:
|
|
- "read:libraries"
|
|
parameters:
|
|
- name: code
|
|
in: path
|
|
description: License code
|
|
required: true
|
|
schema:
|
|
type: string
|
|
example: cc0-1.0
|
|
|
|
tags:
|
|
- "Library and metadata"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/License"
|
|
404:
|
|
description: "Not Found"
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ResourceNotFound"
|
|
|
|
/api/v1/libraries/:
|
|
get:
|
|
summary: List owned libraries
|
|
tags:
|
|
- "Uploads and audio content"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/OwnedLibrary"
|
|
post:
|
|
tags:
|
|
- "Uploads and audio content"
|
|
description:
|
|
Create a new library
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/OwnedLibraryCreate"
|
|
|
|
/api/v1/libraries/{uuid}/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Retrieve a library
|
|
tags:
|
|
- "Uploads and audio content"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/OwnedLibrary"
|
|
post:
|
|
summary: Update a library
|
|
tags:
|
|
- "Uploads and audio content"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/OwnedLibraryCreate"
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/OwnedLibrary"
|
|
delete:
|
|
summary: Delete a library and all associated uploads
|
|
description: |
|
|
This will delete the library, all associated uploads, follows, and broadcast
|
|
the event on the federation.
|
|
tags:
|
|
- "Uploads and audio content"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
|
|
/api/v1/channels/:
|
|
get:
|
|
summary: List channels
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/Tags"
|
|
- $ref: "./api/parameters.yml#/Subscribed"
|
|
- $ref: "./api/parameters.yml#/External"
|
|
- $ref: "./api/parameters.yml#/ChannelOrdering"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Channel"
|
|
post:
|
|
summary: Create a new channel
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ChannelCreate"
|
|
|
|
/api/v1/channels/metadata-choices:
|
|
summary: List metadata (locales, itunes categories) for creating and editing channels.
|
|
description: "Channels and subscriptions"
|
|
get:
|
|
summary: List channels metadata options
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
language:
|
|
type: "array"
|
|
items:
|
|
type: object
|
|
properties:
|
|
value:
|
|
type: string
|
|
description: ID of the locale in ISO 639 format
|
|
example: "en"
|
|
language:
|
|
type: string
|
|
example: "English"
|
|
itunes_category:
|
|
type: "array"
|
|
items:
|
|
type: object
|
|
properties:
|
|
value:
|
|
type: string
|
|
description: ID of the category
|
|
example: "Business"
|
|
label:
|
|
type: string
|
|
description: Readable label of the category
|
|
example: "Business"
|
|
children:
|
|
type: array
|
|
description: Some categories have subcategories
|
|
items:
|
|
type: string
|
|
example: "Entrepreneurship"
|
|
|
|
/api/v1/channels/{uuid}/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Retrieve a channel
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Channel"
|
|
post:
|
|
summary: Update a channel
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ChannelUpdate"
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Channel"
|
|
delete:
|
|
summary: Delete a channel and all associated uploads
|
|
description: |
|
|
This will delete the channel, all associated uploads, follows, and broadcast
|
|
the event on the federation.
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
|
|
/api/v1/channels/rss-suscribe/:
|
|
post:
|
|
summary: Subscribe to a third-party podcast via its RSS feed
|
|
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
url:
|
|
type: "string"
|
|
description: URL of the RSS feed
|
|
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Subscription"
|
|
|
|
/api/v1/channels/{uuid}/rss/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Get the RSS feed of a podcast channel. Only available for channel hosted on the pod where the API is queried.
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/rss+xml: {}
|
|
|
|
/api/v1/channels/{uuid}/subscribe/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
post:
|
|
summary: Subscribe to the given channel
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Subscription"
|
|
|
|
/api/v1/channels/{uuid}/unsubscribe/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
post:
|
|
summary: Unsubscribe from the given channel
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
|
|
/api/v1/uploads/:
|
|
get:
|
|
summary: List owned uploads
|
|
tags:
|
|
- "Uploads and audio content"
|
|
parameters:
|
|
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/OwnedUpload"
|
|
post:
|
|
tags:
|
|
- "Uploads and audio content"
|
|
description:
|
|
Upload a new file in a library. The event will be broadcasted on federation,
|
|
according to the library visibility and followers.
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- library
|
|
- import_reference
|
|
- source
|
|
- audio_file
|
|
- import_status
|
|
properties:
|
|
library:
|
|
type: string
|
|
format: uuid
|
|
description: "The library in which the audio should be stored"
|
|
import_reference:
|
|
type: string
|
|
example: "Import launched via API client on 04/19"
|
|
source:
|
|
type: string
|
|
example: "upload://filename.mp3"
|
|
audio_file:
|
|
type: string
|
|
format: binary
|
|
import_status:
|
|
type: string
|
|
description: "Setting import_status to draft will prevent processing, but allow further modifications to audio and metadata. Once ready, use the PATCH method to set import_status to pending. Default to `pending` if unspecified."
|
|
default: "pending"
|
|
enum:
|
|
- "draft"
|
|
- "pending"
|
|
import_metadata:
|
|
$ref: "./api/definitions.yml#/ImportMetadata"
|
|
|
|
/api/v1/subscriptions/{uuid}/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Retrieve a subscription
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Subscription"
|
|
|
|
/api/v1/subscriptions/:
|
|
get:
|
|
summary: List subscriptions
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Subscription"
|
|
|
|
/api/v1/subscriptions/all/:
|
|
get:
|
|
summary: Retrieve all subscriptions in a lightweight format, without pagination
|
|
tags:
|
|
- "Channels and subscriptions"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/SubscriptionsAll"
|
|
|
|
/api/v1/uploads/{uuid}/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Retrieve an upload
|
|
tags:
|
|
- "Uploads and audio content"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/OwnedUpload"
|
|
patch:
|
|
summary: Update a draft upload
|
|
description: |
|
|
This will update a draft upload, before it is processed.
|
|
|
|
All fields supported for `POST /api/v1/uploads` can be updated here.
|
|
|
|
Setting `import_status` to `pending` will trigger processing, and make future
|
|
modifications impossible.
|
|
|
|
tags:
|
|
- "Uploads and audio content"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/OwnedUpload"
|
|
delete:
|
|
summary: Delete an upload
|
|
description: |
|
|
This will delete the upload from the server and broadcast the event
|
|
on the federation.
|
|
tags:
|
|
- "Uploads and audio content"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
|
|
/api/v1/uploads/{uuid}/audio-file-metadata:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Retrieve the tags embedded in the audio file
|
|
tags:
|
|
- "Uploads and audio content"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties: {}
|
|
|
|
/api/v1/favorites/tracks/:
|
|
get:
|
|
tags:
|
|
- "Content curation"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/TrackFavorite"
|
|
post:
|
|
summary: Mark the given track as favorite
|
|
tags:
|
|
- "Content curation"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
track:
|
|
type: "integer"
|
|
format: "int64"
|
|
example: 98
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
id:
|
|
type: "integer"
|
|
format: "int64"
|
|
example: 876
|
|
track:
|
|
type: "integer"
|
|
format: "int64"
|
|
example: 98
|
|
creation_date:
|
|
$ref: "./api/properties.yml#/creation_date"
|
|
/api/v1/favorites/tracks/remove/:
|
|
post:
|
|
summary: Remove the given track from favorites
|
|
tags:
|
|
- "Content curation"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
track:
|
|
type: "integer"
|
|
format: "int64"
|
|
example: 98
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
|
|
|
|
#################
|
|
# User activity #
|
|
#################
|
|
|
|
/api/v1/history/listenings:
|
|
get:
|
|
tags:
|
|
- "User activity"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
- $ref: "./api/parameters.yml#/Scope"
|
|
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Listening"
|
|
post:
|
|
summary: Record a track in your history
|
|
tags:
|
|
- "User activity"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "object"
|
|
properties:
|
|
track:
|
|
type: "integer"
|
|
format: "int64"
|
|
example: 98
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/ListeningCreate"
|
|
|
|
##########
|
|
# Others #
|
|
##########
|
|
|
|
/api/v1/search:
|
|
get:
|
|
tags:
|
|
- "Other"
|
|
description:
|
|
Search artists, tracks, albums and other resources
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
responses:
|
|
200:
|
|
$ref: "#/components/responses/200"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
|
|
/api/v1/instance/settings:
|
|
get:
|
|
tags:
|
|
- "Other"
|
|
description:
|
|
Retrieve pod-level configuration such as description or max playlist size
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: "array"
|
|
description: "List of settings with their id, label and values"
|
|
items:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: "string"
|
|
description: "Name of the setting"
|
|
example: "max_channels"
|
|
section:
|
|
type: "string"
|
|
description: "Group of the setting"
|
|
example: "audio"
|
|
identifier:
|
|
type: "string"
|
|
description: "Unique identifier of the setting"
|
|
example: "audio__max_channels"
|
|
default:
|
|
description: Default value of the setting
|
|
value:
|
|
description: Current value of the setting
|
|
verbose_name:
|
|
type: "string"
|
|
description: Human-readable label of the setting
|
|
help_text:
|
|
type: "string"
|
|
description: Human-readable description of the setting
|
|
field:
|
|
type: "object"
|
|
properties:
|
|
input_type:
|
|
type: string
|
|
description: "Input type of the setting"
|
|
|
|
|
|
/api/v1/attachments/:
|
|
post:
|
|
tags:
|
|
- "Other"
|
|
description:
|
|
Upload a new file as an attachment that can be later associated with other objects.
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
|
|
/api/v1/attachments/{uuid}/:
|
|
parameters:
|
|
- name: uuid
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "string"
|
|
format: "uuid"
|
|
get:
|
|
summary: Retrieve an attachment
|
|
tags:
|
|
- "Other"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Attachment"
|
|
delete:
|
|
summary: Delete an attachment
|
|
tags:
|
|
- "Other"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
|
|
/api/v1/playlists/:
|
|
get:
|
|
summary: List playlists
|
|
tags:
|
|
- "Content curation"
|
|
parameters:
|
|
- $ref: "./api/parameters.yml#/Search"
|
|
- $ref: "./api/parameters.yml#/PlaylistOrdering"
|
|
- in: query
|
|
name: artist
|
|
description: Restrict to playlists containing tracks from the given artist
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
- in: query
|
|
name: album
|
|
description: Restrict to playlists containing tracks from the given album
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
- in: query
|
|
name: track
|
|
description: Restrict to playlists containing the given track
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
- $ref: "./api/parameters.yml#/Playable"
|
|
- $ref: "./api/parameters.yml#/PageNumber"
|
|
- $ref: "./api/parameters.yml#/PageSize"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/Playlist"
|
|
post:
|
|
tags:
|
|
- "Content curation"
|
|
description: Create a new playlist
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/PlaylistCreate"
|
|
/api/v1/playlists/{id}/:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
get:
|
|
summary: Retrieve a playlist
|
|
tags:
|
|
- "Content curation"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Playlist"
|
|
post:
|
|
summary: Update a playlist
|
|
tags:
|
|
- "Content curation"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/PlaylistCreate"
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Playlist"
|
|
delete:
|
|
description: Delete the playlist
|
|
tags:
|
|
- "Content curation"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
/api/v1/playlists/{id}/tracks:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
get:
|
|
description: Retrieve all tracks in the playlist
|
|
tags:
|
|
- "Content curation"
|
|
responses:
|
|
200:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/PlaylistTrack"
|
|
/api/v1/playlists/{id}/add:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
post:
|
|
tags:
|
|
- "Content curation"
|
|
summary: Append one or more tracks to a playlist
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
tracks:
|
|
type: array
|
|
description: An array of track IDs
|
|
items:
|
|
type: "integer"
|
|
format: "int64"
|
|
example: 13
|
|
allow_duplicates:
|
|
type: boolean
|
|
default: false
|
|
description: |
|
|
Wether to raise an error when the same track is added
|
|
multiple time in the playlist
|
|
responses:
|
|
201:
|
|
description: ""
|
|
content:
|
|
application/json:
|
|
schema:
|
|
allOf:
|
|
- $ref: "./api/definitions.yml#/ResultPage"
|
|
- type: "object"
|
|
properties:
|
|
results:
|
|
type: "array"
|
|
items:
|
|
$ref: "./api/definitions.yml#/PlaylistTrack"
|
|
/api/v1/playlists/{id}/move:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
post:
|
|
tags:
|
|
- "Content curation"
|
|
summary: Move a track to another index within its playlist
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
from:
|
|
type: "integer"
|
|
format: "int64"
|
|
description: Current index of the track
|
|
to:
|
|
type: "integer"
|
|
format: "int64"
|
|
description: New index of the track
|
|
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
/api/v1/playlists/{id}/remove:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
post:
|
|
tags:
|
|
- "Content curation"
|
|
summary: Remove a track from its playlist
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
index:
|
|
type: "integer"
|
|
format: "int64"
|
|
description: Index of the track to remove
|
|
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
/api/v1/playlists/{id}/clear:
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: "integer"
|
|
format: "int64"
|
|
delete:
|
|
description: Remove all tracks in the playlist
|
|
tags:
|
|
- "Content curation"
|
|
responses:
|
|
204:
|
|
$ref: "#/components/responses/204"
|
|
/api/v1/radios/sessions:
|
|
post:
|
|
tags:
|
|
- "Content curation"
|
|
description: Start a new radio session
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/RadioSessionCreate"
|
|
/api/v1/radios/tracks:
|
|
post:
|
|
tags:
|
|
- "Content curation"
|
|
description: Get a new track for a radio session
|
|
responses:
|
|
201:
|
|
$ref: "#/components/responses/201"
|
|
400:
|
|
$ref: "#/components/responses/400"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: "./api/definitions.yml#/Track"
|