openapi: 3.0.0 info: title: Koel API version: 5.1.0 description: 'The API for [Koel](https://koel.dev), the music streaming application that works.' contact: name: An Phan url: 'https://phanan.net' email: me@phanan.net license: name: MIT url: 'https://github.com/koel/koel/blob/master/LICENSE.md' servers: - url: 'https://koel.test' description: Local tags: - name: interaction - name: download paths: /api/user: post: summary: Create a user tags: - user responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/User' operationId: post-user security: - Bearer Token: [ ] description: Create a new user requestBody: content: application/json: schema: type: object properties: name: type: string email: type: string format: email password: type: string format: password is_admin: type: boolean required: - name - email - password - is_admin parameters: [ ] '/api/user/{userId}': parameters: - schema: type: integer name: userId in: path required: true description: ID of the user patch: summary: Update a user tags: - user responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/User' operationId: patch-user-userId description: Update a user security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: name: type: string email: type: string format: email password: type: string format: password description: 'If provided, will update the user''s password' is_admin: type: boolean required: - name - email - is_admin delete: summary: Delete a user tags: - user responses: '204': description: No Content operationId: delete-user-userId description: Delete a user security: - Bearer Token: [ ] /api/me: get: summary: Get profile tags: - authentication responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/User' operationId: get-me security: - Bearer Token: [ ] description: Get the current user's profile post: summary: Log in tags: - authentication responses: '200': description: OK content: application/json: schema: type: object properties: token: type: string required: - token operationId: post-me description: 'Log a user in. Upon a successful login, an API token will be returned. This token should be stored for further authenticated request (either as a Bearer token or as an `api-token` parameter).' requestBody: content: application/json: schema: type: object properties: email: type: string format: email password: type: string format: password required: - email - password put: summary: Update profile tags: - authentication responses: '200': description: OK content: application/json: schema: type: object properties: token: type: string description: New API token if the password is changed. operationId: put-me description: Update the current user's profile security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: name: type: string email: type: string format: email password: type: string format: password description: 'If provided, will update the current user''s password' required: - name - email delete: summary: Log out tags: - authentication responses: '204': description: No Content operationId: delete-me description: Log the current user out security: - Bearer Token: [ ] parameters: [ ] /api/data: get: summary: Get application data tags: - data responses: '200': description: OK content: application/json: schema: type: object properties: albums: type: array items: $ref: '#/components/schemas/Album' allowDownload: type: boolean description: Whether the current installation of Koel allows downloading artists: type: array items: $ref: '#/components/schemas/Artist' cdnUrl: type: string format: uri description: 'The CDN URL of the application, if configured' currentUser: $ref: '#/components/schemas/User' currentVersion: type: string description: Version of the current installation of Koel latestVersion: type: string description: The latest version of Koel playlists: type: array items: $ref: '#/components/schemas/Playlist' recentlyPlayed: type: array description: An array containing the IDs of the most recently-played songs items: type: string settings: type: object description: Settings for the current Koel installation. Only available if the current authenticated user is an admin. properties: media_path: type: string required: - media_path songs: type: array items: $ref: '#/components/schemas/Song' supportsTranscoding: type: boolean description: Whether the current installation of Koel supports transcoding media useLastfm: type: boolean useYouTube: type: boolean useiTunes: type: boolean users: description: Only available if the current authenticated user is an admin type: array items: $ref: '#/components/schemas/User' interactions: type: array items: $ref: '#/components/schemas/InteractionExcerpt' required: - albums - allowDownload - artists - cdnUrl - currentUser - currentVersion - latestVersion - playlists - recentlyPlayed - songs - supportsTranscoding - useLastfm - useYouTube - useiTunes - interactions operationId: get-data description: 'Retrieve a set of application data catered for the current authenticated user (songs, albums, artists, playlists, interactions, and if the user is an admin, settings as well). This call should typically be made right after the user is logged in, to populate the application''s interface with relevant information.' security: - Bearer Token: [ ] parameters: [ ] /api/interaction/play: post: summary: Increase play count responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Interaction' operationId: post-interaction-play description: 'Increase a song''s play count as the currently authenticated user. This request should be made whenever a song is played. ' security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: song: type: string description: ID of the song required: - song tags: - interaction parameters: [ ] /api/interaction/like: post: summary: Toggle like/unlike a song responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Interaction' operationId: post-interaction-like description: Toggle like ("favorite") or unlike ("unfavorite") a song. The "liked" status of the song will be reversed by this operation. security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: song: type: string description: ID of the song required: - song tags: - interaction /api/interaction/batch/like: post: summary: Like multiple songs tags: - interaction responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/Interaction' operationId: post-interaction-batch-like description: 'Like several songs at once, useful for "batch" (e.g., drag-and-drop) actions' security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: songs: type: array description: An array of song IDs items: type: string required: - songs parameters: [ ] /api/interaction/batch/unlike: post: summary: Unlike multiple songs tags: - interaction responses: '204': description: OK operationId: post-interaction-batch-unlike description: 'Unlike several songs at once, useful for "batch" (e.g., drag-and-drop) actions' security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: songs: type: array description: An array of song IDs items: type: string required: - songs '/api/interaction/recently-played/{count}': parameters: - schema: type: integer name: count in: path description: The maximum number of songs to be returned (optional) get: summary: Get recently played songs tags: - interaction responses: '200': description: OK content: application/json: schema: type: array description: An array of song IDs items: type: string operationId: get-interaction-recently-played-count description: Get a list of songs recently played by the current authenticated user security: - Bearer Token: [ ] /api/playlist: get: summary: Get current user's playlists tags: - playlist responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/Playlist' operationId: get-playlist description: Get all playlists owned by the current authenticated user security: - Bearer Token: [ ] post: summary: Create another playlist tags: - playlist responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Playlist' operationId: post-playlist description: Create a new playlist that's owned by the current authenticated user security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: name: type: string rules: type: array items: $ref: '#/components/schemas/SmartPlaylistRule' songs: type: array description: An array of song IDs to populate the playlist. Only used if the playlist is not a smart one (i.e. `rules` are empty). items: type: string format: md5 required: - name '/api/playlist/{playlistId}/songs': parameters: - schema: type: integer name: playlistId in: path required: true description: ID of the playlist patch: summary: Update a playlist tags: - playlist responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Playlist' operationId: patch-playlist-playlistId description: 'Update a playlist (name and, if a smart playlist, its rules)' security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: name: type: string rules: type: array items: $ref: '#/components/schemas/Playlist' delete: summary: '' operationId: delete-playlist-playlistId responses: '200': description: OK description: Delete a playlist security: - Bearer Token: [ ] get: summary: Get playlist's songs operationId: get-playlist-playlistId responses: '200': description: OK content: application/json: schema: type: array description: An array of song IDs items: type: string description: Get a playlist's songs security: - Bearer Token: [ ] '/api/playlist/{playlistId}/sync': parameters: - schema: type: integer name: playlistId in: path required: true description: ID of the playlist put: summary: '' operationId: put-playlist-playlistId-sync responses: '200': description: OK description: 'Populate playlist''s content. Instead of adding or removing songs individually, a playlist''s content is replaced entirely with an array of song IDs.' requestBody: content: application/json: schema: type: object properties: songs: type: array description: An array of song IDs items: type: string required: - songs /api/songs: put: summary: Update song(s) information tags: - media information responses: '200': description: OK content: application/json: schema: type: object properties: artists: type: array items: $ref: '#/components/schemas/Artist' albums: type: array items: $ref: '#/components/schemas/Album' songs: type: array items: $ref: '#/components/schemas/Song' required: - artists - albums - songs operationId: put-songs description: Update the information of a song or multiple songs security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: songs: type: array items: type: string data: type: object properties: title: type: string artistName: type: string albumName: type: string lyrics: type: string required: - songs - data '/api/album/{albumId}/info': parameters: - schema: type: integer name: albumId in: path required: true description: ID of the album get: summary: Get album's extra information tags: - media information responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AlbumExtraInformation' operationId: get-album-albumId-info description: 'Get extra information (image, description etc.) about an album. Currently this information is only available if Last.fm integration is enabled. If it''s not the case, `null` will be returned.' security: - Bearer Token: [ ] '/api/artist/{artistId}/info': parameters: - schema: type: integer name: artistId in: path required: true description: ID of the artist get: summary: Get artist's extra information tags: - media information responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ArtistExtraInformation' operationId: get-artist-artistId-info description: 'Get extra information (image, biography etc.) about an artist. Currently this information is only available if Last.fm integration is enabled. If it''s not the case, `null` will be returned.' security: - Bearer Token: [ ] '/api/song/{songId}/info': parameters: - schema: type: string name: songId in: path required: true description: ID of the song get: summary: Get song's extra information tags: - media information responses: '200': description: OK content: application/json: schema: type: object properties: lyrics: type: string album_info: $ref: '#/components/schemas/AlbumExtraInformation' artist_info: $ref: '#/components/schemas/ArtistExtraInformation' youtube: $ref: '#/components/schemas/YouTubeSearchResult' required: - lyrics - album_info operationId: get-song-songId-info description: 'Get a song''s extra information. The response of this request is a superset of both corresponding `album/{albumId}/info` and `artist/{artistId}/info` responses, combined with the song''s lyrics and related YouTube videos, if applicable. ' security: - Bearer Token: [ ] '/api/album/{albumId}/cover': parameters: - schema: type: integer name: albumId in: path required: true description: ID of the album put: summary: Upload album's cover tags: - media information responses: '200': description: OK content: application/json: schema: type: object properties: coverUrl: type: string format: uri required: - coverUrl operationId: put-album-albumId-cover description: Upload an image as an album's cover security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: cover: description: 'The cover image''s content, in [Data URI format](https://en.wikipedia.org/wiki/Data_URI_scheme)' type: string required: - cover '/api/artist/{artistId}/image': parameters: - schema: type: integer name: artistId in: path required: true description: ID of the artist put: summary: Upload artist's image tags: - media information responses: '200': description: OK content: application/json: schema: type: object properties: imageUrl: type: string format: uri required: - imageUrl operationId: put-artist-artistId-image description: Upload an artist's image security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: image: type: string description: 'The image''s content, in [Data URI format](https://en.wikipedia.org/wiki/Data_URI_scheme)' required: - image '/api/album/{album}/thumbnail': parameters: - schema: type: integer name: album in: path required: true description: ID of the album get: summary: Get album's thumbnail tags: - media information responses: '200': description: OK content: application/json: schema: type: - object - 'null' properties: thumbnailUrl: type: string format: uri required: - thumbnailUrl operationId: get-album-album-thumbnail description: Get an album's thumbnail (a 48px-wide blurry version of the album's cover). Returns the full URL to the thumbnail or NULL if the album has no cover. security: - Bearer Token: [ ] /api/settings: put: summary: Save the application settings tags: - settings responses: '204': description: No Content operationId: post-settings description: Save the application settings. Right now there's only one setting to be saved (`media_path`). The current authenticated user must be an admin. security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: media_path: type: string description: Absolute path to the media folder required: - media_path /api/os/s3/song: post: summary: Save a song from S3 tags: - S3 integration responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Song' operationId: post-os-s3-song description: Create a new song or update an existing one with data sent from AWS security: [ ] requestBody: content: application/json: schema: type: object properties: bucket: type: string key: type: string tags: type: object required: - duration - artist - album - title properties: duration: type: number artist: type: string albumartist: type: string album: type: string cover: type: object properties: data: type: string description: The base64-encoded binary content of the album cover extension: type: string required: - data - extension title: type: string track: type: number lyrics: type: string required: - bucket - key - tags delete: summary: Remove a song from S3 operationId: delete-os-s3-song responses: '204': description: No Content description: Remove a song whose information matches the data sent from AWS S3 (`bucket` and `key`) security: [ ] requestBody: content: application/json: schema: type: object properties: bucket: type: string key: type: string required: - bucket - key /api/upload: post: summary: Upload a song tags: [ ] responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SongWithAlbumAndArtist' operationId: post-upload description: Upload a song. The current authenticated user must be an admin. security: - Bearer Token: [ ] requestBody: content: multipart/form-data: schema: type: object properties: file: type: string format: binary required: - file '/api/{songId}/scrobble': parameters: - schema: type: string name: songId in: path required: true description: ID of the song post: summary: Scrobble a song tags: - last.fm responses: '204': description: No Content operationId: post-api-songId-scrobble description: 'Create a [Last.fm scrobble entry](https://www.last.fm/api/scrobbling) for a song. Only functional if Last.fm integration has been configured and the current authenticated user has connected to Last.fm.' security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: timestamp: type: integer /api/lastfm/session-key: post: summary: Set Last.fm session key tags: - last.fm responses: '204': description: No Content operationId: post-api-lastfm-session-key description: 'Set the Last.fm session key for the current authenticated user. This call should be made after the user is [connected to Last.fm](https://www.last.fm/api/authentication).' security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: key: type: string description: 'The Last.fm [session key](https://www.last.fm/api/show/auth.getSession)' required: - key /lastfm/connect: get: summary: Connect to Last.fm tags: - last.fm responses: { } operationId: get-lastfm-connect description: '[Connect](https://www.last.fm/api/authentication) the current user to Last.fm. This is actually NOT an API request. The application should instead redirect the current user to this route, which will send them to Last.fm for authentication. After authentication is successful, the user will be redirected back to `/lastfm/callback?token=`.' security: - api-token: [ ] '/play/{songId}/{transcode}/{bitrate}': parameters: - schema: type: string name: songId in: path required: true description: ID of the song - schema: type: boolean name: transcode in: path description: Whether to transcode the song (optional) - schema: type: number name: bitrate in: path description: Bit rate to transcode to (optional) get: summary: Play a song tags: - playback responses: { } operationId: get-play-songId-transcode-bitrate description: 'The GET request to play/stream a song. This is NOT an XmlHttpRequest By default Koel will serve the file as-is, unless it''s a FLAC file. If the value of `transcode` is truthy, Koel will attempt to transcode the file into `bitRate` kbps using ffmpeg.' security: - api-token: [ ] /download/songs: get: summary: Download songs tags: - download responses: { } operationId: get-download-songs description: Download a song or several songs. This is NOT an XmlHttpRequest. The response will be a download response of either the media file or a zip file containing multiple media files. security: - api-token: [ ] parameters: - schema: type: array in: query name: songs description: Array of IDs of songs to download '/download/album/{albumId}': parameters: - schema: type: integer name: albumId in: path required: true description: ID of the album get: summary: Download album tags: - download responses: { } operationId: get-download-album-albumId description: Download a whole album. This is NOT an XmlHttpRequest. The response will be a download response of either one media file or a zip file containing multiple media files. security: - api-token: [ ] '/download/artist/{artistId}': parameters: - schema: type: integer name: artistId in: path required: true description: ID of the artist get: summary: Download artist tags: - download responses: { } operationId: get-download-artist-artistId description: Download a whole artist's biography. This is NOT an XmlHttpRequest. The response will be a download response of either one media file or a zip file containing multiple media files. security: - api-token: [ ] '/download/playlist/{playlistId}': parameters: - schema: type: integer name: playlistId in: path required: true description: ID of the playlist get: summary: Download playlist tags: - download responses: { } operationId: get-download-playlist-playlistId description: Download a whole playlist. This is NOT an XmlHttpRequest. The response will be a download response of either one media file or a zip file containing multiple media files. security: - api-token: [ ] /api/search: get: summary: 'Search for songs, albums, and artists' tags: - search responses: '200': description: OK content: application/json: schema: type: object properties: results: type: object required: - songs - artists - albums properties: songs: type: array description: An array of max 6 best-matching songs' IDs items: type: string artists: type: array description: An array of max 6 best-matching artists' IDs items: type: integer albums: type: array description: An array of max 6 best-matching albums' IDs items: type: number required: - results operationId: get-api-search description: 'Search for songs, albums, and artists, with a maximum of {count} results each.' security: - Bearer Token: [ ] parameters: - schema: type: string in: query name: q description: The keywords to search required: true - schema: type: integer minimum: 1 default: 6 in: query name: count description: 'The maximum number of results for songs, artists, and albums' parameters: [ ] /api/search/songs: get: summary: Search for songs tags: - search responses: { } operationId: get-api-search-songs description: Get all songs that matches a search query. security: - Bearer Token: [ ] requestBody: content: application/json: schema: type: object properties: songs: type: array description: An array of matching songs' IDs items: { } required: - songs components: schemas: User: title: User type: object description: A User model x-examples: Sample User: id: 1 name: Phan An email: me@phanan.net password: '' is_admin: true preferences: last_fm_session_key: 12OcZD8_lsuGEFvxxY0k4lJihOYBZGWa properties: id: type: integer name: type: string email: type: string is_admin: type: boolean preferences: type: object properties: last_fm_session_key: type: string required: - id - name - email - is_admin - preferences Song: title: Song type: object description: A Song model x-examples: Sample Song: id: f88c7671623c6b8be881e2a04e685509 artist_id: 3 album_id: 3 title: When the Lights Are Down disc: 1 track: 2 length: 221 properties: id: type: string description: An md5 string artist_id: type: integer album_id: type: integer title: type: string disc: type: integer track: type: number length: type: number format: float description: The duration of the song in seconds required: - id - artist_id - album_id - title - disc - track - length Artist: title: Artist type: object description: An Artist model properties: id: type: integer name: type: string required: - id - name x-examples: Unknown Artist: id: 1 name: Unknown Artist Various Artists: id: 2 name: Various Artists Sample Artist: id: 3 name: Kamelot Album: title: Album type: object description: An Album entity properties: id: type: integer artist_id: type: integer name: type: string required: - id - artist_id - name x-examples: Unknown Album: id: 1 artist_id: 1 name: Unknown Album Sample Album: id: 2 artist_id: 3 name: The Black Halo InteractionExcerpt: title: Interaction type: object description: 'An excerpt of the Interaction model, containing only the minimal data' properties: song_id: type: string liked: type: boolean play_count: type: integer required: - song_id - liked - play_count Playlist: title: Playlist type: object description: A Playlist model properties: id: type: integer name: type: string rules: type: - array - 'null' description: An array of Rule objects if the playlist is a Smart playlist items: $ref: '#/components/schemas/Playlist' is_smart: type: boolean description: Whether the playlist is of Smart (dynamic) type required: - id - name - rules - is_smart SmartPlaylistRule: title: SmartPlaylistRule type: object description: A SmartPlaylistRule model properties: id: type: integer rules: type: array description: An array of "subrules" (constraints) of the current rule items: type: object properties: id: type: integer model: type: string enum: - title - album.name - artist.name - interactions.play_count - interactions.last_played_at - length - created_at - updated_at operator: type: string enum: - is - isNot - contains - notContain - isBetween - isGreaterThan - isLessThan - beginsWith - endsWith - notInLast value: type: array items: type: string required: - id - model - operator - value required: - id - rules Interaction: title: Interaction type: object description: An Interaction model properties: song_id: type: string liked: type: boolean play_count: type: integer song: $ref: '#/components/schemas/Song' user: $ref: '#/components/schemas/User' required: - song_id - liked - play_count - song - user AlbumExtraInformation: title: AlbumExtraInformation type: object description: 'Extra information about an album, currently provided by Last.fm' properties: url: type: string format: uri description: URL to the album's page on Last.fm image: type: string format: uri description: URL to the album's image on Last.fm wiki: type: object required: - summary - full properties: summary: type: string full: type: string tracks: type: array items: type: object properties: title: type: string length: type: integer url: type: string format: uri required: - title - length - url cover: type: string description: URL to the album cover by Koel required: - url - image - wiki - tracks - cover x-examples: Sample: url: 'https://www.last.fm/music/Queen/Innuendo' image: 'https://lastfm-img2.akamaized.net/i/u/300x300/b56adcd16ca6454498981a8470a3ec06.png' wiki: summary: Innuendo is a 1991 album by English rock band Queen... full: Innuendo is a 1991 album by English rock band Queen. It is the band's fourteenth studio album and the last to be composed entirely of new material. It is also their final studio album to be released while lead singer Freddie Mercury was still alive. tracks: - title: Innuendo length: 392 url: 'https://www.last.fm/music/Queen/_/Innuendo' - title: I'm Going Slightly Mad length: 247 url: 'https://www.last.fm/music/Queen/_/I%27m+Going+Slightly+Mad' cover: 'https://koel.yourdomain.net/img/covers/5a771ec82a5d72.25096250.png' ArtistExtraInformation: title: ArtistExtraInformation type: object description: 'Extra information about an artist, currently provided by Last.fm' properties: url: type: string format: uri description: URL to the artist's page on Last.fm image: type: string format: uri description: URL to the artist's image on Last.fm bio: type: object required: - summary - full properties: summary: type: string full: type: string required: - url - image - bio x-examples: Sample: url: 'https://www.last.fm/music/Queen' image: 'https://koel.yourdomain.net/img/artists/5a772708e7de19.84120679.png' bio: summary: Queen were an English rock band originally consisting of four members... full: 'Queen were an English rock band originally consisting of four members: vocalist Freddie Mercury, guitarist Brian May, bass guitarist John Deacon, and drummer Roger Taylor.' YouTubeSearchResult: title: YouTubeSearchResult type: object description: A search result object returned by YouTube properties: kind: type: string etag: type: string nextPageToken: type: string regionCode: type: string pageInfo: type: object required: - totalResults - resultsPerPage properties: totalResults: type: integer resultsPerPage: type: integer items: type: array items: type: object properties: kind: type: string etag: type: string id: type: array items: type: object properties: kind: type: string videoId: type: string required: - kind - videoId snippet: type: object required: - publishedAt - channelId - title - description - thumbnails - channelTitle - liveBroadcastContent properties: publishedAt: type: string format: date-time channelId: type: string title: type: string description: type: string thumbnails: type: array items: type: object properties: default: type: object required: - url - width - height properties: url: type: string format: uri width: type: integer height: type: integer medium: type: object required: - url - width - height properties: url: type: string format: uri width: type: integer height: type: integer high: type: object required: - url - width - height properties: url: type: string format: uri width: type: integer height: type: integer required: - default - medium - high channelTitle: type: string liveBroadcastContent: type: string required: - kind - etag - id - snippet required: - kind - etag - nextPageToken - regionCode - pageInfo - items x-examples: Sample: kind: youtube#searchListResponse etag: '"XI7nbFXulYBIpL0ayR_gDh3eu1k/UMIztE1sQ8L9tu7igiTaSoBA9tw"' nextPageToken: CAoQAA regionCode: CH pageInfo: totalResults: 1000000 resultsPerPage: 10 items: - kind: youtube#searchResult etag: '"XI7nbFXulYBIpL0ayR_gDh3eu1k/bRRI2oEvvXIbCBFKv8WrLUaG-0A"' id: kind: youtube#video videoId: t99KH0TR-J4 snippet: publishedAt: '2013-10-15T14:24:31.000Z' channelId: UCiMhD4jzUqG-IgPzUmmytRQ title: Queen - The Show Must Go On (Official Video) description: 'Subscribe to the Official Queen Channel Here http://bit.ly/Subscribe2Queen Taken from Innuendo, 1991. Queen - The Show Must Go On (promo video, 1991) ...' thumbnails: default: url: 'https://i.ytimg.com/vi/t99KH0TR-J4/default.jpg' width: 120 height: 90 medium: url: 'https://i.ytimg.com/vi/t99KH0TR-J4/mqdefault.jpg' width: 320 height: 180 high: url: 'https://i.ytimg.com/vi/t99KH0TR-J4/hqdefault.jpg' width: 480 height: 360 channelTitle: Queen Official liveBroadcastContent: none SongWithAlbumAndArtist: title: SongWithAlbumAndArtist type: object description: A Song model with loaded album and artist information x-examples: { } properties: id: type: string description: An md5 string artist_id: type: integer album_id: type: integer title: type: string disc: type: integer track: type: number length: type: number format: float description: The duration of the song in seconds album: $ref: '#/components/schemas/Album' artist: $ref: '#/components/schemas/Artist' required: - id - artist_id - album_id - title - disc - track - length - album - artist securitySchemes: Bearer Token: type: http scheme: bearer api-token: name: The API token as a query parameter type: apiKey in: query