## Image

Following is the structure of the `SpotubeImageObject`:

| Property | Type            |
| -------- | --------------- |
| width    | `int` or `null` |
| height   | `int` or `null` |
| url      | `string`        |

## User

Structure of the `SpotubeUserObject`, which is used to represent a user in Spotube returned by Spotube Plugins.

| Property    | Type                                               |
| ----------- | -------------------------------------------------- |
| id          | `string`                                           |
| name        | `string`                                           |
| externalUri | `string`                                           |
| images      | List of [`SpotubeImageObject`][SpotubeImageObject] |

> `externalUri` is a URL that points to the user's profile on the external service (e.g. Listenbrainz)

## Artist

### SpotubeSimpleArtistObject

Following is the structure of the `SpotubeArtistObject`:

| Property    | Type                                                         |
| ----------- | ------------------------------------------------------------ |
| id          | `string`                                                     |
| name        | `string`                                                     |
| externalUri | `string`                                                     |
| images      | List of [`SpotubeImageObject`][SpotubeImageObject] or `null` |

### SpotubeFullArtistObject

Following is the structure of the `SpotubeFullArtistObject`:

| Property    | Type                                                  |
| ----------- | ----------------------------------------------------- |
| id          | `string`                                              |
| name        | `string`                                              |
| externalUri | `string`                                              |
| images      | List of [`SpotubeImageObject`][SpotubeImageObject] or |
| followers   | `number`                                              |
| genres      | List of `string` or `null`                            |

## Album

### SpotubeSimpleAlbumObject

Following is the structure of the `SpotubeAlbumObject`:

| Property    | Type                                                             |
| ----------- | ---------------------------------------------------------------- |
| id          | `string`                                                         |
| name        | `string`                                                         |
| externalUri | `string`                                                         |
| images      | List of [`SpotubeImageObject`][SpotubeImageObject]               |
| albumType   | `album`, `single` or `compilation`                               |
| artists     | List of [`SpotubeSimpleArtistObject`][SpotubeSimpleArtistObject] |
| releaseDate | `string` (YYYY-MM-DD format) or `null`                           |

### SpotubeFullAlbumObject

Following is the structure of the `SpotubeFullAlbumObject`:

| Property    | Type                                                             |
| ----------- | ---------------------------------------------------------------- |
| id          | `string`                                                         |
| name        | `string`                                                         |
| externalUri | `string`                                                         |
| images      | List of [`SpotubeImageObject`][SpotubeImageObject]               |
| albumType   | `album`, `single` or `compilation`                               |
| artists     | List of [`SpotubeSimpleArtistObject`][SpotubeSimpleArtistObject] |
| releaseDate | `string` (YYYY-MM-DD format)                                     |
| totalTracks | `number`                                                         |
| recordLabel | `string` or `null`                                               |

## Track

Following is the structure of the `SpotubeFullTrackObject`:

| Property                     | Type                                                             |
| ---------------------------- | ---------------------------------------------------------------- |
| id                           | `string`                                                         |
| name                         | `string`                                                         |
| externalUri                  | `string`                                                         |
| artists                      | List of [`SpotubeSimpleArtistObject`][SpotubeSimpleArtistObject] |
| album                        | [`SpotubeSimpleAlbumObject`][SpotubeSimpleAlbumObject]           |
| durationMs (in milliseconds) | `number`                                                         |
| explicit                     | `boolean`                                                        |
| [isrc][isrc_wiki]            | `string`                                                         |

> `isrc` stands for International Standard Recording Code, which is a unique identifier for tracks.
> It is used to identify recordings and is often used in music distribution and royalty collection. The format is typically a 12-character alphanumeric code.

## Playlist

### SpotubeSimplePlaylistObject

Following is the structure of the `SpotubeSimplePlaylistObject`:

| Property    | Type                                                         |
| ----------- | ------------------------------------------------------------ |
| id          | `string`                                                     |
| name        | `string`                                                     |
| description | `string`                                                     |
| externalUri | `string`                                                     |
| images      | List of [`SpotubeImageObject`][SpotubeImageObject] or `null` |
| owner       | [`SpotubeUserObject`][SpotubeUserObject]                     |

### SpotubeFullPlaylistObject

Following is the structure of the `SpotubeFullPlaylistObject`:

| Property      | Type                                                         |
| ------------- | ------------------------------------------------------------ |
| id            | `string`                                                     |
| name          | `string`                                                     |
| description   | `string`                                                     |
| externalUri   | `string`                                                     |
| images        | List of [`SpotubeImageObject`][SpotubeImageObject] or `null` |
| owner         | [`SpotubeUserObject`][SpotubeUserObject]                     |
| collaborators | List of [`SpotubeUserObject`][SpotubeUserObject] or `null`   |
| collaborative | `boolean`                                                    |
| public        | `boolean`                                                    |

## Search Response

Following is the structure of the `SpotubeSearchResponseObject`:

| Property  | Type                                                                 |
| --------- | -------------------------------------------------------------------- |
| albums    | List of [`SpotubeSimpleAlbumObject`][SpotubeSimpleAlbumObject]       |
| artists   | List of [`SpotubeFullArtistObject`][SpotubeFullArtistObject]         |
| playlists | List of [`SpotubeSimplePlaylistObject`][SpotubeSimplePlaylistObject] |
| tracks    | List of [`SpotubeFullTrackObject`][SpotubeFullTrackObject]           |

## Browse Section

Following is the structure of `SpotubeBrowseSectionObject`:

| Property    | Type             |
| ----------- | ---------------- |
| id          | `string`         |
| title       | `string`         |
| externalUri | `string`         |
| browseMore  | `boolean`        |
| items       | List of `Object` |

The `items` property array can contain multiple type of `Object` in it but it will always be

- [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject]
- [`SpotubeFullAlbumObject`][SpotubeFullAlbumObject]
- [`SpotubeFullArtistObject`][SpotubeFullArtistObject]

## Pagination Response

`SpotubePaginationResponseObject` is generic model. The `items` property can contain any type of `Object` in it.

This is the structure of `SpotubePaginationResponseObject`:

| Property   | Type                                            |
| ---------- | ----------------------------------------------- |
| limit      | `number`                                        |
| nextOffset | `number` or `null`                              |
| total      | `number`                                        |
| hasMore    | `boolean`                                       |
| items      | List of generic type `T` which extends `Object` |

[isrc_wiki]: https://en.wikipedia.org/wiki/International_Standard_Recording_Code
[SpotubeImageObject]: /reference/models#image
[SpotubeSimpleArtistObject]: /reference/models#spotubesimpleartistobject
[SpotubeSimpleAlbumObject]: /reference/models#spotubesimplealbumobject
[SpotubeUserObject]: /reference/models#user
[SpotubeFullArtistObject]: /reference/models#spotubefullartistobject
[SpotubeSimplePlaylistObject]: /reference/models#spotubesimpleplaylistobject
[SpotubeFullTrackObject]: /reference/models#track
[SpotubeFullPlaylistObject]: /reference/models#spotubefullplaylistobject
[SpotubeFullAlbumObject]: /reference/models#spotubefullalbumobject
