{
  "openapi": "3.0.0",
  "info": {
    "title": "OpenSubsonic API",
    "description": "OpenSubsonic API documentation.",
    "version": "1.16.1"
  },
  "servers": [
    {
      "url": "{url}",
      "variables": {
        "url": {
          "default": "https://example-opensubsonic-compatible-server.com",
          "description": "The URL of the OpenSubsonic server."
        }
      }
    }
  ],
  "security": [
    {
      "apiKeyAuth": [],
      "protocolVersion": [],
      "clientName": [],
      "format": []
    },
    {
      "username": [],
      "legacyPassword": [],
      "protocolVersion": [],
      "clientName": [],
      "format": []
    },
    {
      "username": [],
      "token": [],
      "salt": [],
      "protocolVersion": [],
      "clientName": [],
      "format": []
    }
  ],
  "tags": [
    {
      "name": "System"
    },
    {
      "name": "User Management"
    },
    {
      "name": "Media Library Scanning"
    },
    {
      "name": "Searching"
    },
    {
      "name": "Browsing"
    },
    {
      "name": "Playlists"
    },
    {
      "name": "Lists"
    },
    {
      "name": "Media Retrieval"
    },
    {
      "name": "Media Annotation"
    },
    {
      "name": "Sharing"
    },
    {
      "name": "Bookmarks"
    },
    {
      "name": "Internet Radio"
    },
    {
      "name": "Podcast"
    },
    {
      "name": "Jukebox"
    },
    {
      "name": "Chat"
    },
    {
      "name": "Transcoding"
    },
    {
      "name": "Extension"
    },
    {
      "name": "Addition"
    },
    {
      "name": "Change"
    },
    {
      "name": "Clarification"
    }
  ],
  "paths": {
    "/rest/addChatMessage": {
      "get": {
        "summary": "Adds a message to the chat log.",
        "description": "Adds a message to the chat log.",
        "operationId": "getAddChatMessage",
        "tags": [
          "Chat"
        ],
        "parameters": [
          {
            "name": "message",
            "in": "query",
            "description": "The chat message.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "addChatMessage",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/addchatmessage/"
        }
      },
      "post": {
        "summary": "Adds a message to the chat log.",
        "description": "Adds a message to the chat log.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postAddChatMessage",
        "tags": [
          "Chat"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "message": {
                    "type": "string",
                    "description": "The chat message."
                  }
                },
                "required": [
                  "message"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "addChatMessage",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/addchatmessage/"
        }
      }
    },
    "/rest/changePassword": {
      "get": {
        "summary": "Changes the password of an existing user on the server.",
        "description": "Changes the password of an existing user on the server, using the following parameters. You can only change your own password unless you have admin privileges.",
        "tags": [
          "User Management"
        ],
        "operationId": "changePassword",
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "description": "The name of the user which should change its password.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "password",
            "in": "query",
            "description": "The new password of the new user, either in clear text of hex-encoded (see above).",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "changePassword",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/changepassword/"
        }
      },
      "post": {
        "summary": "Changes the password of an existing user on the server.",
        "description": "Changes the password of an existing user on the server, using the following parameters. You can only change your own password unless you have admin privileges.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postChangePassword",
        "tags": [
          "User Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "The name of the user which should change its password."
                  },
                  "password": {
                    "type": "string",
                    "description": "The new password of the new user, either in clear text of hex-encoded (see above)."
                  }
                },
                "required": [
                  "username",
                  "password"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "changePassword",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/changepassword/"
        }
      }
    },
    "/rest/createBookmark": {
      "get": {
        "summary": "Creates or updates a bookmark.",
        "description": "Creates or updates a bookmark (a position within a media file). Bookmarks are personal and not visible to other users.",
        "tags": [
          "Bookmarks"
        ],
        "operationId": "createBookmark",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of the media file to bookmark. If a bookmark already exists for this file it will be overwritten.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "position",
            "in": "query",
            "description": "The position (in milliseconds) within the media file.",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "comment",
            "in": "query",
            "description": "A user-defined comment.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "createBookmark",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createbookmark/"
        }
      },
      "post": {
        "summary": "Creates or updates a bookmark.",
        "description": "Creates or updates a bookmark (a position within a media file). Bookmarks are personal and not visible to other users.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postCreateBookmark",
        "tags": [
          "Bookmarks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of the media file to bookmark. If a bookmark already exists for this file it will be overwritten."
                  },
                  "position": {
                    "type": "integer",
                    "description": "The position (in milliseconds) within the media file."
                  },
                  "comment": {
                    "type": "string",
                    "description": "A user-defined comment."
                  }
                },
                "required": [
                  "id",
                  "position"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "createBookmark",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createbookmark/"
        }
      }
    },
    "/rest/createInternetRadioStation": {
      "get": {
        "summary": "Adds a new internet radio station.",
        "description": "Adds a new internet radio station. Only users with admin privileges are allowed to call this method.",
        "operationId": "createInternetRadioStation",
        "tags": [
          "Internet Radio"
        ],
        "parameters": [
          {
            "name": "streamUrl",
            "in": "query",
            "description": "The stream URL for the station.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "The station name.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "homepageUrl",
            "in": "query",
            "description": "The home page URL for the station.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "createInternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createinternetradiostation/"
        }
      },
      "post": {
        "summary": "Adds a new internet radio station.",
        "description": "Adds a new internet radio station. Only users with admin privileges are allowed to call this method.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postCreateInternetRadioStation",
        "tags": [
          "Internet Radio"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "streamUrl": {
                    "type": "string",
                    "description": "The stream URL for the station."
                  },
                  "name": {
                    "type": "string",
                    "description": "The station name."
                  },
                  "homepageUrl": {
                    "type": "string",
                    "description": "The home page URL for the station."
                  }
                },
                "required": [
                  "streamUrl",
                  "name"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "createInternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createinternetradiostation/"
        }
      }
    },
    "/rest/createPlaylist": {
      "get": {
        "summary": "Creates (or updates) a playlist.",
        "description": "Creates (or updates) a playlist.",
        "operationId": "createPlaylist",
        "tags": [
          "Playlists"
        ],
        "parameters": [
          {
            "name": "playlistId",
            "in": "query",
            "description": "The playlist ID. Required if updating an existing playlist.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "The human-readable name of the playlist. Required if creating a new playlist.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "songId",
            "in": "query",
            "description": "ID of a song in the playlist. Use one `songId` parameter for each song in the playlist.",
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatePlaylistResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "createPlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createplaylist/"
        }
      },
      "post": {
        "summary": "Creates (or updates) a playlist.",
        "description": "Creates (or updates) a playlist.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postCreatePlaylist",
        "tags": [
          "Playlists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "playlistId": {
                    "type": "string",
                    "description": "The playlist ID. Required if updating an existing playlist."
                  },
                  "name": {
                    "type": "string",
                    "description": "The human-readable name of the playlist. Required if creating a new playlist."
                  },
                  "songId": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "ID of a song in the playlist. Use one `songId` parameter for each song in the playlist."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatePlaylistResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "createPlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createplaylist/"
        }
      }
    },
    "/rest/createPodcastChannel": {
      "get": {
        "summary": "Adds a new Podcast channel.",
        "description": "Adds a new Podcast channel. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).",
        "operationId": "createPodcastChannel",
        "tags": [
          "Podcast"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "description": "The URL of the Podcast to add.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "createPodcastChannel",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createpodcastchannel/"
        }
      },
      "post": {
        "summary": "Adds a new Podcast channel.",
        "description": "Adds a new Podcast channel. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postCreatePodcastChannel",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The URL of the Podcast to add."
                  }
                },
                "required": [
                  "url"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "createPodcastChannel",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createpodcastchannel/"
        }
      }
    },
    "/rest/createShare": {
      "get": {
        "summary": "Creates a public URL that can be used by anyone to stream music or video from the server.",
        "description": "Creates a public URL that can be used by anyone to stream music or video from the server. The URL is short and suitable for posting on Facebook, Twitter etc. Note: The user must be authorized to share (see Settings > Users > User is allowed to share files with anyone). Since 1.6.0.",
        "operationId": "createShare",
        "tags": [
          "Sharing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of a song, album or video to share. Use one id parameter for each entry to share.",
            "explode": true,
            "required": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "description",
            "in": "query",
            "description": "A user-defined description that will be displayed to people visiting the shared media.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "expires",
            "in": "query",
            "description": "The time at which the share expires. Given as milliseconds since 1970.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateSharesResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "createShare",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createshare/"
        }
      },
      "post": {
        "summary": "Creates a public URL that can be used by anyone to stream music or video from the server.",
        "description": "Creates a public URL that can be used by anyone to stream music or video from the server. The URL is short and suitable for posting on Facebook, Twitter etc. Note: The user must be authorized to share (see Settings > Users > User is allowed to share files with anyone). Since 1.6.0.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`).",
        "operationId": "postCreateShare",
        "tags": [
          "Sharing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "ID of a song, album or video to share. Use one id parameter for each entry to share."
                  },
                  "description": {
                    "type": "string",
                    "description": "A user-defined description that will be displayed to people visiting the shared media."
                  },
                  "expires": {
                    "type": "integer",
                    "description": "The time at which the share expires. Given as milliseconds since 1970."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateSharesResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "createShare",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createshare/"
        }
      }
    },
    "/rest/createUser": {
      "get": {
        "summary": "Creates a new user on the server.",
        "description": "Creates a new user on the server.",
        "operationId": "createUser",
        "tags": [
          "User Management"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "description": "The name of the new user.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "password",
            "in": "query",
            "description": "The password of the new user, either in clear text of hex-encoded (see above).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "email",
            "in": "query",
            "description": "The email address of the new user.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ldapAuthenticated",
            "in": "query",
            "description": "Whether the user is authenticated in LDAP.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "adminRole",
            "in": "query",
            "description": "Whether the user is administrator.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "settingsRole",
            "in": "query",
            "description": "Whether the user is allowed to change personal settings and password.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "streamRole",
            "in": "query",
            "description": "Whether the user is allowed to play files.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "jukeboxRole",
            "in": "query",
            "description": "Whether the user is allowed to play files in jukebox mode.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "downloadRole",
            "in": "query",
            "description": "Whether the user is allowed to download files.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "uploadRole",
            "in": "query",
            "description": "Whether the user is allowed to upload files.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "playlistRole",
            "in": "query",
            "description": "Whether the user is allowed to create and delete playlists. Since 1.8.0, changing this role has no effect.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "coverArtRole",
            "in": "query",
            "description": "Whether the user is allowed to change cover art and tags.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "commentRole",
            "in": "query",
            "description": "Whether the user is allowed to create and edit comments and ratings.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "podcastRole",
            "in": "query",
            "description": "Whether the user is allowed to administrate Podcasts.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "shareRole",
            "in": "query",
            "description": "(Since 1.8.0) Whether the user is allowed to share files with anyone.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "videoConversionRole",
            "in": "query",
            "description": "(Since 1.15.0) Whether the user is allowed to start video conversions.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) IDs of the music folders the user is allowed access to. Include the parameter once for each folder. Default all folders.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "createUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createuser/"
        }
      },
      "post": {
        "summary": "Creates a new user on the server.",
        "description": "Creates a new user on the server.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postCreateUser",
        "tags": [
          "User Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "The name of the new user."
                  },
                  "password": {
                    "type": "string",
                    "description": "The password of the new user, either in clear text or hex-encoded."
                  },
                  "email": {
                    "type": "string",
                    "description": "The email address of the new user."
                  },
                  "ldapAuthenticated": {
                    "type": "boolean",
                    "description": "Whether the user is authenticated in LDAP.",
                    "default": false
                  },
                  "adminRole": {
                    "type": "boolean",
                    "description": "Whether the user is administrator.",
                    "default": false
                  },
                  "settingsRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to change personal settings and password.",
                    "default": true
                  },
                  "streamRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to play files.",
                    "default": true
                  },
                  "jukeboxRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to play files in jukebox mode.",
                    "default": false
                  },
                  "downloadRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to download files.",
                    "default": false
                  },
                  "uploadRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to upload files.",
                    "default": false
                  },
                  "playlistRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to create and delete playlists. Since 1.8.0, changing this role has no effect.",
                    "default": false
                  },
                  "coverArtRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to change cover art and tags.",
                    "default": false
                  },
                  "commentRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to create and edit comments and ratings.",
                    "default": false
                  },
                  "podcastRole": {
                    "type": "boolean",
                    "description": "Whether the user is allowed to administrate Podcasts.",
                    "default": false
                  },
                  "shareRole": {
                    "type": "boolean",
                    "description": "(Since 1.8.0) Whether the user is allowed to share files with anyone.",
                    "default": false
                  },
                  "videoConversionRole": {
                    "type": "boolean",
                    "description": "(Since 1.15.0) Whether the user is allowed to start video conversions.",
                    "default": false
                  },
                  "musicFolderId": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "(Since 1.12.0) IDs of the music folders the user is allowed access to. Include the parameter once for each folder. Default all folders."
                  }
                },
                "required": [
                  "username",
                  "password",
                  "email"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "createUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createuser/"
        }
      }
    },
    "/rest/deleteBookmark": {
      "get": {
        "summary": "Deletes a bookmark.",
        "description": "Deletes a bookmark (a position within a media file). Bookmarks are personal and not visible to other users.",
        "operationId": "deleteBookmark",
        "tags": [
          "Bookmarks"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of the media file for which to delete the bookmark. Other users’ bookmarks are not affected.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deleteBookmark",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deletebookmark/"
        }
      },
      "post": {
        "summary": "Deletes a bookmark.",
        "description": "Deletes a bookmark (a position within a media file). Bookmarks are personal and not visible to other users.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeleteBookmark",
        "tags": [
          "Bookmarks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of the media file for which to delete the bookmark. Other users’ bookmarks are not affected."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deleteBookmark",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deletebookmark/"
        }
      }
    },
    "/rest/deleteInternetRadioStation": {
      "get": {
        "summary": "Deletes an existing internet radio station.",
        "description": "Deletes an existing internet radio station. Only users with admin privileges are allowed to call this method.",
        "operationId": "deleteInternetRadioStation",
        "tags": [
          "Internet Radio"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID for the station.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deleteInternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteinternetradiostation/"
        }
      },
      "post": {
        "summary": "Deletes an existing internet radio station.",
        "description": "Deletes an existing internet radio station. Only users with admin privileges are allowed to call this method.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeleteInternetRadioStation",
        "tags": [
          "Internet Radio"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The ID for the station."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deleteInternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteinternetradiostation/"
        }
      }
    },
    "/rest/deletePlaylist": {
      "get": {
        "summary": "Deletes a saved playlist.",
        "description": "Deletes a saved playlist.",
        "operationId": "deletePlaylist",
        "tags": [
          "Playlists"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of the playlist to delete, as obtained by `getPlaylists`.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deletePlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteplaylist/"
        }
      },
      "post": {
        "summary": "Deletes a saved playlist.",
        "description": "Deletes a saved playlist.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeletePlaylist",
        "tags": [
          "Playlists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of the playlist to delete, as obtained by `getPlaylists`."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deletePlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteplaylist/"
        }
      }
    },
    "/rest/deletePodcastChannel": {
      "get": {
        "summary": "Deletes a Podcast channel.",
        "description": "Deletes a Podcast channel. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).",
        "operationId": "deletePodcastChannel",
        "tags": [
          "Podcast"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the Podcast channel to delete.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deletePodcastChannel",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deletepodcastchannel/"
        }
      },
      "post": {
        "summary": "Deletes a Podcast channel.",
        "description": "Deletes a Podcast channel. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeletePodcastChannel",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The ID of the Podcast channel to delete."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deletePodcastChannel",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deletepodcastchannel/"
        }
      }
    },
    "/rest/deletePodcastEpisode": {
      "get": {
        "summary": "Deletes a Podcast episode.",
        "description": "Deletes a Podcast episode. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).",
        "operationId": "deletePodcastEpisode",
        "tags": [
          "Podcast"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the Podcast episode to delete.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deletePodcastEpisode",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deletepodcastepisode/"
        }
      },
      "post": {
        "summary": "Deletes a Podcast episode.",
        "description": "Deletes a Podcast episode. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeletePodcastEpisode",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The ID of the Podcast episode to delete."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deletePodcastEpisode",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deletepodcastepisode/"
        }
      }
    },
    "/rest/deleteShare": {
      "get": {
        "summary": "Deletes an existing share.",
        "description": "Deletes an existing share",
        "operationId": "deleteShare",
        "tags": [
          "Sharing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of the share to delete.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deleteShare",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteshare/"
        }
      },
      "post": {
        "summary": "Deletes an existing share.",
        "description": "Deletes an existing share.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeleteShare",
        "tags": [
          "Sharing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of the share to delete."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deleteShare",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteshare/"
        }
      }
    },
    "/rest/deleteUser": {
      "get": {
        "summary": "Deletes an existing user on the server.",
        "description": "Deletes an existing user on the server.",
        "operationId": "deleteUser",
        "tags": [
          "User Management"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "description": "The name of the user to delete.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "deleteUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteuser/"
        }
      },
      "post": {
        "summary": "Deletes an existing user on the server.",
        "description": "Deletes an existing user on the server.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDeleteUser",
        "tags": [
          "User Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "The name of the user to delete."
                  }
                },
                "required": [
                  "username"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "deleteUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/deleteuser/"
        }
      }
    },
    "/rest/download": {
      "get": {
        "summary": "Downloads a given media file.",
        "description": "Downloads a given media file. Similar to stream, but this method returns the original media data without transcoding or downsampling.",
        "operationId": "download",
        "tags": [
          "Media Retrieval"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          }
        }
      },
      "post": {
        "summary": "Downloads a given media file.",
        "description": "Downloads a given media file. Similar to stream, but this method returns the original media data without transcoding or downsampling.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDownload",
        "tags": [
          "Media Retrieval"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "A string which uniquely identifies the file to download. Obtained by calls to getMusicDirectory."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/downloadPodcastEpisode": {
      "get": {
        "summary": "Request the server to start downloading a given Podcast episode.",
        "description": "Request the server to start downloading a given Podcast episode. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).",
        "operationId": "downloadPodcastEpisode",
        "tags": [
          "Podcast"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the Podcast episode to download",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "downloadPodcastEpisode",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/downloadpodcastepisode/"
        }
      },
      "post": {
        "summary": "Request the server to start downloading a given Podcast episode.",
        "description": "Request the server to start downloading a given Podcast episode. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postDownloadPodcastEpisode",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The ID of the Podcast episode to download."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/getAlbum": {
      "get": {
        "summary": "Returns details for an album.",
        "description": "Returns details for an album, including a list of songs. This method organizes music according to ID3 tags.",
        "operationId": "getAlbum",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The album ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getAlbum",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbum/"
        }
      },
      "post": {
        "summary": "Returns details for an album.",
        "description": "Returns details for an album, including a list of songs. This method organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetAlbum",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The album ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getAlbum",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbum/"
        }
      }
    },
    "/rest/getAlbumInfo": {
      "get": {
        "summary": "Returns album info.",
        "description": "Returns album notes, image URLs etc, using data from last.fm.",
        "operationId": "getAlbumInfo",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The album ID or song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumInfoResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getAlbumInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbuminfo/"
        }
      },
      "post": {
        "summary": "Returns album info.",
        "description": "Returns album notes, image URLs etc, using data from last.fm.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetAlbumInfo",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The album ID or song ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumInfoResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getAlbumInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbuminfo/"
        }
      }
    },
    "/rest/getAlbumInfo2": {
      "get": {
        "summary": "Returns album info (v2).",
        "description": "Similar to getAlbumInfo, but organizes music according to ID3 tags.",
        "operationId": "getAlbumInfo2",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The album ID or song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumInfoResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getAlbumInfo2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbuminfo2/"
        }
      },
      "post": {
        "summary": "Returns album info (v2).",
        "description": "Similar to getAlbumInfo, but organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetAlbumInfo2",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The album ID or song ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumInfoResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getAlbumInfo2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbuminfo2/"
        }
      }
    },
    "/rest/getAlbumList": {
      "get": {
        "summary": "Returns a list of random, newest, highest rated etc. albums.",
        "description": "Returns a list of random, newest, highest rated etc. albums. Similar to the album lists on the home page of the Subsonic web interface.",
        "operationId": "getAlbumList",
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AlbumListType"
            }
          },
          {
            "name": "size",
            "in": "query",
            "description": "The number of albums to return. Max 500.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 500
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "The list offset. Useful if you for example want to page through the list of newest albums.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "fromYear",
            "in": "query",
            "description": "Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "toYear",
            "in": "query",
            "description": "Required if `type=='byYear'`. The last year in the range.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "genre",
            "in": "query",
            "description": "Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumListResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getAlbumList",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbumlist/"
        }
      },
      "post": {
        "summary": "Returns a list of random, newest, highest rated etc. albums.",
        "description": "Returns a list of random, newest, highest rated etc. albums. Similar to the album lists on the home page of the Subsonic web interface.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetAlbumList",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "$ref": "#/components/schemas/AlbumListType"
                  },
                  "size": {
                    "type": "integer",
                    "description": "The number of albums to return. Max 500.",
                    "default": 10,
                    "minimum": 1,
                    "maximum": 500
                  },
                  "offset": {
                    "type": "integer",
                    "description": "The list offset. Useful if you for example want to page through the list of newest albums.",
                    "default": 0,
                    "minimum": 0
                  },
                  "fromYear": {
                    "type": "integer",
                    "description": "Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned."
                  },
                  "toYear": {
                    "type": "integer",
                    "description": "Required if `type=='byYear'`. The last year in the range."
                  },
                  "genre": {
                    "type": "string",
                    "description": "Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”."
                  },
                  "musicFolderId": {
                    "type": "string",
                    "description": "(Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`."
                  }
                },
                "required": [
                  "type"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumListResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getAlbumList",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbumlist/"
        }
      }
    },
    "/rest/getAlbumList2": {
      "get": {
        "summary": "Returns a list of random, newest, highest rated etc. albums (v2).",
        "description": "Similar to `getAlbumList`, but organizes music according to ID3 tags.",
        "operationId": "getAlbumList2",
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AlbumListType"
            }
          },
          {
            "name": "size",
            "in": "query",
            "description": "The number of albums to return. Max 500.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 500
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "The list offset. Useful if you for example want to page through the list of newest albums.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "fromYear",
            "in": "query",
            "description": "Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "toYear",
            "in": "query",
            "description": "Required if `type=='byYear'`. The last year in the range.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "genre",
            "in": "query",
            "description": "Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumList2Response"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getAlbumList2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbumlist2/"
        }
      },
      "post": {
        "summary": "Returns a list of random, newest, highest rated etc. albums (v2).",
        "description": "Similar to `getAlbumList`, but organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetAlbumList2",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "$ref": "#/components/schemas/AlbumListType"
                  },
                  "size": {
                    "type": "integer",
                    "description": "The number of albums to return. Max 500.",
                    "default": 10,
                    "minimum": 1,
                    "maximum": 500
                  },
                  "offset": {
                    "type": "integer",
                    "description": "The list offset. Useful if you for example want to page through the list of newest albums.",
                    "default": 0,
                    "minimum": 0
                  },
                  "fromYear": {
                    "type": "integer",
                    "description": "Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned."
                  },
                  "toYear": {
                    "type": "integer",
                    "description": "Required if `type=='byYear'`. The last year in the range."
                  },
                  "genre": {
                    "type": "string",
                    "description": "Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”."
                  },
                  "musicFolderId": {
                    "type": "string",
                    "description": "(Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`."
                  }
                },
                "required": [
                  "type"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetAlbumList2Response"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getAlbumList2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbumlist2/"
        }
      }
    },
    "/rest/getArtist": {
      "get": {
        "summary": "Returns details for an artist.",
        "description": "Returns details for an artist, including a list of albums. This method organizes music according to ID3 tags.",
        "operationId": "getArtist",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The artist ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getArtist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartist/"
        }
      },
      "post": {
        "summary": "Returns details for an artist.",
        "description": "Returns details for an artist, including a list of albums. This method organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetArtist",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The artist ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getArtist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartist/"
        }
      }
    },
    "/rest/getArtistInfo": {
      "get": {
        "summary": "Returns artist info.",
        "description": "Returns artist info with biography, image URLs and similar artists, using data from last.fm.",
        "operationId": "getArtistInfo",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The artist, album or song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Max number of similar artists to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "includeNotPresent",
            "in": "query",
            "description": "Whether to return artists that are not present in the media library.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistInfoResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getArtistInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartistinfo/"
        }
      },
      "post": {
        "summary": "Returns artist info.",
        "description": "Returns artist info with biography, image URLs and similar artists, using data from last.fm.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetArtistInfo",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The artist, album or song ID."
                  },
                  "count": {
                    "type": "integer",
                    "description": "Max number of similar artists to return.",
                    "default": 20,
                    "minimum": 0
                  },
                  "includeNotPresent": {
                    "type": "boolean",
                    "description": "Whether to return artists that are not present in the media library.",
                    "default": false
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistInfoResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getArtistInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartistinfo/"
        }
      }
    },
    "/rest/getArtistInfo2": {
      "get": {
        "summary": "Returns artist info (v2).",
        "description": "Similar to `getArtistInfo`, but organizes music according to ID3 tags.",
        "operationId": "getArtistInfo2",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The artist, album or song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Max number of similar artists to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "includeNotPresent",
            "in": "query",
            "description": "Whether to return artists that are not present in the media library.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistInfo2Response"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getArtistInfo2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartistinfo2/"
        }
      },
      "post": {
        "summary": "Returns artist info (v2).",
        "description": "Similar to `getArtistInfo`, but organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetArtistInfo2",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The artist, album or song ID."
                  },
                  "count": {
                    "type": "integer",
                    "description": "Max number of similar artists to return.",
                    "default": 20,
                    "minimum": 0
                  },
                  "includeNotPresent": {
                    "type": "boolean",
                    "description": "Whether to return artists that are not present in the media library.",
                    "default": false
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistInfo2Response"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getArtistInfo2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartistinfo2/"
        }
      }
    },
    "/rest/getArtists": {
      "get": {
        "summary": "Returns all artists.",
        "description": "Similar to `getIndexes`, but organizes music according to ID3 tags.",
        "operationId": "getArtists",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "If specified, only return artists in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getArtists",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartists/"
        }
      },
      "post": {
        "summary": "Returns all artists.",
        "description": "Similar to `getIndexes`, but organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetArtists",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "musicFolderId": {
                    "type": "string",
                    "description": "If specified, only return artists in the music folder with the given ID. See `getMusicFolders`."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArtistsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getArtists",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartists/"
        }
      }
    },
    "/rest/getAvatar": {
      "get": {
        "summary": "Returns the avatar (personal image) for a user.",
        "description": "Returns the avatar (personal image) for a user.",
        "operationId": "getAvatar",
        "tags": [
          "Media Retrieval"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          }
        },
        "externalDocs": {
          "description": "getAvatar",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getavatar/"
        }
      },
      "post": {
        "summary": "Returns the avatar (personal image) for a user.",
        "description": "Returns the avatar (personal image) for a user.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetAvatar",
        "tags": [
          "Media Retrieval"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "The username for which to retrieve the avatar."
                  }
                },
                "required": [
                  "username"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getAvatar",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getavatar/"
        }
      }
    },
    "/rest/getBookmarks": {
      "get": {
        "summary": "Returns all bookmarks for this user.",
        "description": "Returns all bookmarks for this user. A bookmark is a position within a certain media file.",
        "operationId": "getBookmarks",
        "tags": [
          "Bookmarks"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetBookmarksResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getBookmarks",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getbookmarks/"
        }
      },
      "post": {
        "summary": "Returns all bookmarks for this user.",
        "description": "Returns all bookmarks for this user. A bookmark is a position within a certain media file.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetBookmarks",
        "tags": [
          "Bookmarks"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetBookmarksResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getBookmarks",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getbookmarks/"
        }
      }
    },
    "/rest/getCaptions": {
      "get": {
        "summary": "Returns captions (subtitles) for a video.",
        "description": "Returns captions (subtitles) for a video. Use `getVideoInfo` to get a list of available captions.",
        "operationId": "getCaptions",
        "tags": [
          "Media Retrieval"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the video.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "description": "Preferred captions format (“srt” or “vtt”).",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "srt",
                "vtt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the raw video captions.",
            "content": {
              "application/binary": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getCaptions",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getcaptions/"
        }
      },
      "post": {
        "summary": "Returns captions (subtitles) for a video.",
        "description": "Returns captions (subtitles) for a video. Use `getVideoInfo` to get a list of available captions.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetCaptions",
        "tags": [
          "Media Retrieval"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The ID of the video."
                  },
                  "format": {
                    "type": "string",
                    "description": "Preferred captions format (“srt” or “vtt”).",
                    "enum": [
                      "srt",
                      "vtt"
                    ]
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Returns the raw video captions.",
            "content": {
              "application/binary": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getCaptions",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getcaptions/"
        }
      }
    },
    "/rest/getChatMessages": {
      "get": {
        "summary": "Returns the current visible (non-expired) chat messages.",
        "description": "Returns the current visible (non-expired) chat messages.",
        "operationId": "getChatMessages",
        "tags": [
          "Chat"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetChatMessagesResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getChatMessages",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getchatmessages/"
        }
      },
      "post": {
        "summary": "Returns the current visible (non-expired) chat messages.",
        "description": "Returns the current visible (non-expired) chat messages.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetChatMessages",
        "tags": [
          "Chat"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetChatMessagesResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getChatMessages",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getchatmessages/"
        }
      }
    },
    "/rest/getCoverArt": {
      "get": {
        "summary": "Returns a cover art image.",
        "description": "Returns a cover art image.",
        "operationId": "getCoverArt",
        "tags": [
          "Media Retrieval",
          "Clarification"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The coverArt ID. Returned by most entities likes `Child` or `AlbumID3`",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "size",
            "in": "query",
            "description": "If specified, scale image to this size.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          }
        },
        "externalDocs": {
          "description": "getCoverArt",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getcoverart/"
        }
      },
      "post": {
        "summary": "Returns a cover art image.",
        "description": "Returns a cover art image.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetCoverArt",
        "tags": [
          "Media Retrieval"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The coverArt ID. Returned by most entities likes `Child` or `AlbumID3`"
                  },
                  "size": {
                    "type": "integer",
                    "description": "If specified, scale image to this size."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getCoverArt",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getcoverart/"
        }
      }
    },
    "/rest/getGenres": {
      "get": {
        "summary": "Returns all genres.",
        "description": "Returns all genres.",
        "operationId": "getGenres",
        "tags": [
          "Browsing"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGenresResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getGenres",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getgenres/"
        }
      },
      "post": {
        "summary": "Returns all genres.",
        "description": "Returns all genres.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetGenres",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGenresResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getGenres",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getgenres/"
        }
      }
    },
    "/rest/getIndexes": {
      "get": {
        "summary": "Returns an indexed structure of all artists.",
        "description": "Returns an indexed structure of all artists.",
        "operationId": "getIndexes",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "If specified, only return artists in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ifModifiedSince",
            "in": "query",
            "description": "If specified, only return a result if the artist collection has changed since the given time (in milliseconds since 1 Jan 1970).",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetIndexesResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getIndexes",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getindexes/"
        }
      },
      "post": {
        "summary": "Returns an indexed structure of all artists.",
        "description": "Returns an indexed structure of all artists.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetIndexes",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "musicFolderId": {
                    "type": "string",
                    "description": "If specified, only return artists in the music folder with the given ID. See `getMusicFolders`."
                  },
                  "ifModifiedSince": {
                    "type": "integer",
                    "description": "If specified, only return a result if the artist collection has changed since the given time (in milliseconds since 1 Jan 1970)."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetIndexesResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getIndexes",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getindexes/"
        }
      }
    },
    "/rest/getInternetRadioStations": {
      "get": {
        "summary": "Returns all internet radio stations.",
        "description": "Returns all internet radio stations. Takes no extra parameters.",
        "operationId": "getInternetRadioStations",
        "tags": [
          "Internet Radio"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetInternetRadioStationsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getInternetRadioStations",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getinternetradiostations/"
        }
      },
      "post": {
        "summary": "Returns all internet radio stations.",
        "description": "Returns all internet radio stations. Takes no extra parameters.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetInternetRadioStations",
        "tags": [
          "Internet Radio"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetInternetRadioStationsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getInternetRadioStations",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getinternetradiostations/"
        }
      }
    },
    "/rest/getLicense": {
      "get": {
        "summary": "Get details about the software license.",
        "description": "Get details about the software license.",
        "operationId": "getLicense",
        "tags": [
          "System"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLicenseResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getLicense",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlicense/"
        }
      },
      "post": {
        "summary": "Get details about the software license.",
        "description": "Get details about the software license.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetLicense",
        "tags": [
          "System"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLicenseResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getLicense",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlicense/"
        }
      }
    },
    "/rest/getLyrics": {
      "get": {
        "summary": "Searches for and returns lyrics for a given song.",
        "description": "Searches for and returns lyrics for a given song.",
        "operationId": "getLyrics",
        "tags": [
          "Media Retrieval"
        ],
        "parameters": [
          {
            "name": "artist",
            "in": "query",
            "description": "The artist name.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "title",
            "in": "query",
            "description": "The song title.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLyricsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getLyrics",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlyrics/"
        }
      },
      "post": {
        "summary": "Searches for and returns lyrics for a given song.",
        "description": "Searches for and returns lyrics for a given song.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetLyrics",
        "tags": [
          "Media Retrieval"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "artist": {
                    "type": "string",
                    "description": "The artist name."
                  },
                  "title": {
                    "type": "string",
                    "description": "The song title."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLyricsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/getLyricsBySongId": {
      "get": {
        "summary": "Add support for synchronized lyrics, multiple languages, and retrieval by song ID. ",
        "description": "OpenSubsonic extension name `songLyrics` (As returned by `getOpenSubsonicExtensions`). Retrieves all structured lyrics from the server for a given song. The lyrics can come from embedded tags (SYLT/USLT), LRC file/text file, or any other external source.",
        "operationId": "getLyricsBySongId",
        "tags": [
          "Media Retrieval",
          "Extension"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The track ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "enhanced",
            "in": "query",
            "description": "When true, the response includes cueLine arrays with word/syllable-level timing data, required cue byteStart and byteEnd offsets into cueLine.value, and non-main kind tracks (translations, pronunciations). When false or omitted, only kind=main entries are returned with no cueLine data.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLyricsBySongIdResponse"
                }
              }
            }
          },
          "404": {
            "description": "Extension not supported."
          }
        },
        "externalDocs": {
          "description": "getLyricsBySongId",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlyricsbysongid/"
        }
      },
      "post": {
        "summary": "Add support for synchronized lyrics, multiple languages, and retrieval by song ID.",
        "description": "OpenSubsonic extension name `songLyrics` (As returned by `getOpenSubsonicExtensions`). Retrieves all structured lyrics from the server for a given song. The lyrics can come from embedded tags (SYLT/USLT), LRC file/text file, or any other external source.",
        "operationId": "postGetLyricsBySongId",
        "tags": [
          "Media Retrieval",
          "Extension"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The track ID."
                  },
                  "enhanced": {
                    "type": "boolean",
                    "default": false,
                    "description": "When true, the response includes cueLine arrays with word/syllable-level timing data, required cue byteStart and byteEnd offsets into cueLine.value, and non-main kind tracks (translations, pronunciations). When false or omitted, only kind=main entries are returned with no cueLine data."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetLyricsBySongIdResponse"
                }
              }
            }
          },
          "404": {
            "description": "Extension not supported."
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getLyricsBySongId",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlyricsbysongid/"
        }
      }
    },
    "/rest/getMusicDirectory": {
      "get": {
        "summary": "Returns a listing of all files in a music directory.",
        "description": "Returns a listing of all files in a music directory. Typically used to get list of albums for an artist, or list of songs for an album.",
        "operationId": "getMusicDirectory",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "A string which uniquely identifies the music folder. Obtained by calls to `getIndexes` or `getMusicDirectory`.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMusicDirectoryResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getMusicDirectory",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getmusicdirectory/"
        }
      },
      "post": {
        "summary": "Returns a listing of all files in a music directory.",
        "description": "Returns a listing of all files in a music directory. Typically used to get list of albums for an artist, or list of songs for an album.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetMusicDirectory",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "A string which uniquely identifies the music folder. Obtained by calls to `getIndexes` or `getMusicDirectory`."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMusicDirectoryResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getMusicDirectory",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getmusicdirectory/"
        }
      }
    },
    "/rest/getMusicFolders": {
      "get": {
        "summary": "Returns all configured top-level music folders.",
        "description": "Returns all configured top-level music folders. Takes no extra parameters.",
        "operationId": "getMusicFolders",
        "tags": [
          "Browsing"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMusicFoldersResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getMusicFolders",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getmusicfolders/"
        }
      },
      "post": {
        "summary": "Returns all configured top-level music folders.",
        "description": "Returns all configured top-level music folders. Takes no extra parameters.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetMusicFolders",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetMusicFoldersResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getMusicFolders",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getmusicfolders/"
        }
      }
    },
    "/rest/getNewestPodcasts": {
      "get": {
        "summary": "Returns the most recently published Podcast episodes.",
        "description": "Returns the most recently published Podcast episodes.",
        "operationId": "getNewestPodcasts",
        "tags": [
          "Podcast"
        ],
        "parameters": [
          {
            "name": "count",
            "in": "query",
            "description": "The maximum number of episodes to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetNewestPodcastsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getNewestPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getnewestpodcasts/"
        }
      },
      "post": {
        "summary": "Returns the most recently published Podcast episodes.",
        "description": "Returns the most recently published Podcast episodes.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetNewestPodcasts",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "integer",
                    "description": "The maximum number of episodes to return.",
                    "default": 20
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetNewestPodcastsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getNewestPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getnewestpodcasts/"
        }
      }
    },
    "/rest/getNowPlaying": {
      "get": {
        "summary": "Returns what is currently being played by all users.",
        "description": "Returns what is currently being played by all users. Takes no extra parameters.",
        "operationId": "getNowPlaying",
        "tags": [
          "Lists"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetNowPlayingResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getNowPlaying",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getnowplaying/"
        }
      },
      "post": {
        "summary": "Returns what is currently being played by all users.",
        "description": "Returns what is currently being played by all users. Takes no extra parameters.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetNowPlaying",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetNowPlayingResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/getOpenSubsonicExtensions": {
      "get": {
        "summary": "List the OpenSubsonic extensions supported by this server.",
        "description": "List the OpenSubsonic extensions supported by this server.",
        "operationId": "getOpenSubsonicExtensions",
        "tags": [
          "System",
          "Addition"
        ],
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOpenSubsonicExtensionsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getOpenSubsonicExtensions",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getopensubsonicextensions/"
        }
      },
      "post": {
        "summary": "List the OpenSubsonic extensions supported by this server.",
        "description": "List the OpenSubsonic extensions supported by this server.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetOpenSubsonicExtensions",
        "tags": [
          "System",
          "Addition"
        ],
        "security": [],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetOpenSubsonicExtensionsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getOpenSubsonicExtensions",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getopensubsonicextensions/"
        }
      }
    },
    "/rest/getPlaylist": {
      "get": {
        "summary": "Returns a listing of files in a saved playlist.",
        "description": "Returns a listing of files in a saved playlist.",
        "operationId": "getPlaylist",
        "tags": [
          "Playlists"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of the playlist to return, as obtained by `getPlaylists`.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlaylistResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getPlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplaylist/"
        }
      },
      "post": {
        "summary": "Returns a listing of files in a saved playlist.",
        "description": "Returns a listing of files in a saved playlist.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetPlaylist",
        "tags": [
          "Playlists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of the playlist to return, as obtained by `getPlaylists`."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlaylistResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getPlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplaylist/"
        }
      }
    },
    "/rest/getPlaylists": {
      "get": {
        "summary": "Returns all playlists a user is allowed to play.",
        "description": "Returns all playlists a user is allowed to play.",
        "operationId": "getPlaylists",
        "tags": [
          "Playlists"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "description": "(Since 1.8.0) If specified, return playlists for this user rather than for the authenticated user. The authenticated user must have admin role if this parameter is used.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlaylistsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getPlaylists",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplaylists/"
        }
      },
      "post": {
        "summary": "Returns all playlists a user is allowed to play.",
        "description": "Returns all playlists a user is allowed to play.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetPlaylists",
        "tags": [
          "Playlists"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "(Since 1.8.0) If specified, return playlists for this user rather than for the authenticated user. The authenticated user must have admin role if this parameter is used."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlaylistsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getPlaylists",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplaylists/"
        }
      }
    },
    "/rest/getPlayQueue": {
      "get": {
        "summary": "Returns the state of the play queue for this user.",
        "description": "Returns the state of the play queue for this user (as set by savePlayQueue). This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book).",
        "operationId": "getPlayQueue",
        "tags": [
          "Bookmarks"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlayQueueResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getPlayQueue",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplayqueue/"
        }
      },
      "post": {
        "summary": "Returns the state of the play queue for this user.",
        "description": "Returns the state of the play queue for this user (as set by savePlayQueue). This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetPlayQueue",
        "tags": [
          "Bookmarks"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlayQueueResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getPlayQueue",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplayqueue/"
        }
      }
    },
    "/rest/getPlayQueueByIndex": {
      "get": {
        "summary": "Returns the state of the play queue for this user, using queue index.",
        "description": "Returns the state of the play queue for this user (as set by savePlayQueue). This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book).",
        "operationId": "getPlayQueueByIndex",
        "tags": [
          "Bookmarks"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlayQueueByIndexResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getPlayQueueByIndex",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplayqueuebyindex/"
        }
      },
      "post": {
        "summary": "Returns the state of the play queue for this user.",
        "description": "Returns the state of the play queue for this user (as set by savePlayQueue). This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetPlayQueueByIndex",
        "tags": [
          "Bookmarks"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPlayQueueByIndexResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getPlayQueueByIndex",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplayqueuebyindex/"
        }
      }
    },
    "/rest/getTranscodeDecision": {
      "post": {
        "summary": "Get Transcode Decision",
        "description": "Returns a transcode decision for a given media file.",
        "operationId": "getTranscodeDecision",
        "tags": [
          "Transcoding"
        ],
        "parameters": [
          {
            "name": "mediaId",
            "in": "query",
            "description": "The ID of the media.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mediaType",
            "in": "query",
            "description": "The type of the media.",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "song",
                "podcast"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClientInfo"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A transcode decision.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "type": "object",
                      "properties": {
                        "transcodeDecision": {
                          "$ref": "#/components/schemas/TranscodeDecision"
                        }
                      }
                    }
                  ]
                }
              },
              "application/xml": {
                "schema": {
                  "allOf": [
                    {
                      "type": "object",
                      "properties": {
                        "transcodeDecision": {
                          "$ref": "#/components/schemas/TranscodeDecision"
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/rest/getTranscodeStream": {
      "get": {
        "summary": "Get Transcoded Stream",
        "description": "Returns a transcoded media stream. Clients should not try to reconstruct the `transcodeParams`. Instead, they must use the `transcodeParams` provided in the response of the `getTranscodeDecision` endpoint.",
        "operationId": "getTranscodeStream",
        "tags": [
          "Transcoding"
        ],
        "parameters": [
          {
            "name": "mediaId",
            "in": "query",
            "description": "The ID of the media.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mediaType",
            "in": "query",
            "description": "The type of the media.",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "song",
                "podcast"
              ]
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "The time offset in seconds from which to start transcoding.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "name": "transcodeParams",
            "in": "query",
            "description": "Server-specific transcoding parameters. This should be obtained from the `getTranscodeDecision` endpoint.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The transcoded media stream.",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - The request was malformed or invalid."
          },
          "401": {
            "description": "Unauthorized - Authentication failed."
          },
          "404": {
            "description": "Not Found - The requested track does not exist."
          },
          "500": {
            "description": "Internal Server Error - The server encountered an error during transcoding."
          }
        }
      }
    },
    "/rest/getPodcastEpisode": {
      "get": {
        "summary": "Returns details for a podcast episode.",
        "description": "OpenSubsonic extension name getPodcastEpisode (As returned by `getOpenSubsonicExtensions`). Returns details for a podcast episode.",
        "operationId": "getPodcastEpisode",
        "tags": [
          "Podcast",
          "Extension"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The podcast episode ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPodcastEpisodeResponse"
                }
              }
            }
          },
          "404": {
            "description": "Extension not supported."
          }
        },
        "externalDocs": {
          "description": "getPodcastEpisode",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getpodcastepisode/"
        }
      },
      "post": {
        "summary": "Returns details for a podcast episode.",
        "description": "OpenSubsonic extension name `getPodcastEpisode` (As returned by `getOpenSubsonicExtensions`). Returns details for a podcast episode.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetPodcastEpisode",
        "tags": [
          "Podcast",
          "Extension"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The podcast episode ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPodcastEpisodeResponse"
                }
              }
            }
          },
          "404": {
            "description": "Extension not supported."
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getPodcastEpisode",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getpodcastepisode/"
        }
      }
    },
    "/rest/getPodcasts": {
      "get": {
        "summary": "Returns all Podcast channels the server subscribes to, and (optionally) their episodes.",
        "description": "Returns all Podcast channels the server subscribes to, and (optionally) their episodes. This method can also be used to return details for only one channel - refer to the id parameter. A typical use case for this method would be to first retrieve all channels without episodes, and then retrieve all episodes for the single channel the user selects.",
        "operationId": "getPodcasts",
        "tags": [
          "Podcast"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "(Since 1.9.0) If specified, only return the Podcast channel with this ID.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeEpisodes",
            "in": "query",
            "description": "(Since 1.9.0) Whether to include Podcast episodes in the returned result.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPodcastsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getpodcasts/"
        }
      },
      "post": {
        "summary": "Returns all Podcast channels the server subscribes to, and (optionally) their episodes.",
        "description": "Returns all Podcast channels the server subscribes to, and (optionally) their episodes. This method can also be used to return details for only one channel - refer to the id parameter. A typical use case for this method would be to first retrieve all channels without episodes, and then retrieve all episodes for the single channel the user selects.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetPodcasts",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "(Since 1.9.0) If specified, only return the Podcast channel with this ID."
                  },
                  "includeEpisodes": {
                    "type": "boolean",
                    "description": "(Since 1.9.0) Whether to include Podcast episodes in the returned result.",
                    "default": true
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetPodcastsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getpodcasts/"
        }
      }
    },
    "/rest/getRandomSongs": {
      "get": {
        "summary": "Returns random songs matching the given criteria.",
        "description": "Returns random songs matching the given criteria.",
        "operationId": "getRandomSongs",
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "size",
            "in": "query",
            "description": "The maximum number of songs to return. Max 500.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 0,
              "maximum": 500
            }
          },
          {
            "name": "genre",
            "in": "query",
            "description": "Only returns songs belonging to this genre.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fromYear",
            "in": "query",
            "description": "(Since 1.9.0) Only return songs from this year or later.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "toYear",
            "in": "query",
            "description": "Only return songs published before or in this year.",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "Only return songs in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetRandomSongsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getRandomSongs",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getrandomsongs/"
        }
      },
      "post": {
        "summary": "Returns random songs matching the given criteria.",
        "description": "Returns random songs matching the given criteria.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetRandomSongs",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "size": {
                    "type": "integer",
                    "description": "The maximum number of songs to return. Max 500.",
                    "default": 10,
                    "minimum": 0,
                    "maximum": 500
                  },
                  "genre": {
                    "type": "string",
                    "description": "Only returns songs belonging to this genre."
                  },
                  "fromYear": {
                    "type": "integer",
                    "description": "(Since 1.9.0) Only return songs from this year or later."
                  },
                  "toYear": {
                    "type": "integer",
                    "description": "Only return songs published before or in this year."
                  },
                  "musicFolderId": {
                    "type": "string",
                    "description": "Only return songs in the music folder with the given ID. See `getMusicFolders`."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetRandomSongsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getRandomSongs",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getrandomsongs/"
        }
      }
    },
    "/rest/getScanStatus": {
      "get": {
        "summary": "Returns the current status for media library scanning.",
        "description": "Returns the current status for media library scanning. Takes no extra parameters.",
        "operationId": "getScanStatus",
        "tags": [
          "Media Library Scanning"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetScanStatusResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getScanStatus",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getscanstatus/"
        }
      },
      "post": {
        "summary": "Returns the current status for media library scanning.",
        "description": "Returns the current status for media library scanning. Takes no extra parameters.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetScanStatus",
        "tags": [
          "Media Library Scanning"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetScanStatusResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getScanStatus",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getscanstatus/"
        }
      }
    },
    "/rest/getShares": {
      "get": {
        "summary": "Returns information about shared media this user is allowed to manage.",
        "description": "Returns information about shared media this user is allowed to manage. Takes no extra parameters.",
        "operationId": "getShares",
        "tags": [
          "Sharing"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSharesResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getShares",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getshares/"
        }
      },
      "post": {
        "summary": "Returns information about shared media this user is allowed to manage.",
        "description": "Returns information about shared media this user is allowed to manage. Takes no extra parameters.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetShares",
        "tags": [
          "Sharing"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSharesResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getShares",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getshares/"
        }
      }
    },
    "/rest/getSimilarSongs": {
      "get": {
        "summary": "Returns a random collection of songs from the given artist and similar artists.",
        "description": "Returns a random collection of songs from the given artist and similar artists, using data from last.fm. Typically used for artist radio features.",
        "operationId": "getSimilarSongs",
        "tags": [
          "Browsing",
          "Clarification"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The artist, album or song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Max number of songs to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSimilarSongsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getSimilarSongs",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs/"
        }
      },
      "post": {
        "summary": "Returns a random collection of songs from the given artist and similar artists.",
        "description": "Returns a random collection of songs from the given artist and similar artists, using data from last.fm. Typically used for artist radio features.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetSimilarSongs",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The artist, album or song ID."
                  },
                  "count": {
                    "type": "integer",
                    "default": 50,
                    "minimum": 0,
                    "description": "Max number of songs to return."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSimilarSongsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getSimilarSongs",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs/"
        }
      }
    },
    "/rest/getSimilarSongs2": {
      "get": {
        "summary": "Returns a random collection of songs from the given artist and similar artists (v2).",
        "description": "Similar to `getSimilarSongs`, but organizes music according to ID3 tags.",
        "operationId": "getSimilarSongs2",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The artist, album or song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Max number of songs to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSimilarSongs2Response"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getSimilarSongs2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs2/"
        }
      },
      "post": {
        "summary": "Returns a random collection of songs from the given artist and similar artists (v2).",
        "description": "Similar to `getSimilarSongs`, but organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetSimilarSongs2",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The artist, album or song ID."
                  },
                  "count": {
                    "type": "integer",
                    "default": 50,
                    "minimum": 0,
                    "description": "Max number of songs to return."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSimilarSongs2Response"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getSimilarSongs2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs2/"
        }
      }
    },
    "/rest/getSong": {
      "get": {
        "summary": "Returns details for a song.",
        "description": "Returns details for a song.",
        "operationId": "getSong",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The song ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSongResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getSong",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsong/"
        }
      },
      "post": {
        "summary": "Returns details for a song.",
        "description": "Returns details for a song.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetSong",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The song ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSongResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/getSongsByGenre": {
      "get": {
        "summary": "Returns songs in a given genre.",
        "description": "Returns songs in a given genre.",
        "operationId": "getSongsByGenre",
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "genre",
            "in": "query",
            "description": "The genre, as returned by `getGenres`.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "The maximum number of songs to return. Max 500.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 0,
              "maximum": 500
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "The offset. Useful if you want to page through the songs in a genre.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSongsByGenreResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getSongsByGenre",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsongsbygenre/"
        }
      },
      "post": {
        "summary": "Returns songs in a given genre.",
        "description": "Returns songs in a given genre.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetSongsByGenre",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "genre": {
                    "type": "string",
                    "description": "The genre, as returned by `getGenres`."
                  },
                  "count": {
                    "type": "integer",
                    "description": "The maximum number of songs to return. Max 500.",
                    "default": 10,
                    "minimum": 0,
                    "maximum": 500
                  },
                  "offset": {
                    "type": "integer",
                    "description": "The offset. Useful if you want to page through the songs in a genre.",
                    "default": 0,
                    "minimum": 0
                  },
                  "musicFolderId": {
                    "type": "string",
                    "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`."
                  }
                },
                "required": [
                  "genre"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSongsByGenreResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getSongsByGenre",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsongsbygenre/"
        }
      }
    },
    "/rest/getStarred": {
      "get": {
        "summary": "Returns starred songs, albums and artists.",
        "description": "Returns starred songs, albums and artists.",
        "operationId": "getStarred",
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStarredResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getStarred",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getstarred/"
        }
      },
      "post": {
        "summary": "Returns starred songs, albums and artists.",
        "description": "Returns starred songs, albums and artists.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetStarred",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStarredResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getStarred",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getstarred/"
        }
      }
    },
    "/rest/getStarred2": {
      "get": {
        "summary": "Returns starred songs, albums and artists.",
        "description": "Similar to `getStarred`, but organizes music according to ID3 tags.",
        "operationId": "getStarred2",
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStarred2Response"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getStarred2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getstarred2/"
        }
      },
      "post": {
        "summary": "Returns starred songs, albums and artists.",
        "description": "Similar to `getStarred`, but organizes music according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetStarred2",
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStarred2Response"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getStarred2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getstarred2/"
        }
      }
    },
    "/rest/getTopSongs": {
      "get": {
        "summary": "Returns top songs for the given artist.",
        "description": "Returns top songs for the given artist, using data from last.fm.",
        "operationId": "getTopSongs",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The artist name.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "The maximum number of songs to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetTopSongsResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getTopSongs",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/gettopsongs/"
        }
      },
      "post": {
        "summary": "Returns top songs for the given artist.",
        "description": "Returns top songs for the given artist, using data from last.fm.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetTopSongs",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "The artist name.",
                    "type": "string"
                  },
                  "count": {
                    "description": "The maximum number of songs to return.",
                    "type": "integer",
                    "default": 50,
                    "minimum": 0
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetTopSongsResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getTopSongs",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/gettopsongs/"
        }
      }
    },
    "/rest/getUser": {
      "get": {
        "summary": "Get details about a given user, including which authorization roles and folder access it has.",
        "description": "Get details about a given user, including which authorization roles and folder access it has. Can be used to enable/disable certain features in the client, such as jukebox control.",
        "operationId": "getUser",
        "tags": [
          "User Management"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "description": "The name of the user to retrieve. You can only retrieve your own user unless you have admin privileges.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUserResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getuser/"
        }
      },
      "post": {
        "summary": "Get details about a given user, including which authorization roles and folder access it has.",
        "description": "Get details about a given user, including which authorization roles and folder access it has. Can be used to enable/disable certain features in the client, such as jukebox control.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetUser",
        "tags": [
          "User Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "The name of the user to retrieve. You can only retrieve your own user unless you have admin privileges."
                  }
                },
                "required": [
                  "username"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUserResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getuser/"
        }
      }
    },
    "/rest/getUsers": {
      "get": {
        "summary": "Get details about all users, including which authorization roles and folder access they have",
        "description": "Get details about all users, including which authorization roles and folder access they have. Only users with admin privileges are allowed to call this method.",
        "operationId": "getUsers",
        "tags": [
          "User Management"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUsersResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getUsers",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getusers/"
        }
      },
      "post": {
        "summary": "Get details about all users, including which authorization roles and folder access they have",
        "description": "Get details about all users, including which authorization roles and folder access they have. Only users with admin privileges are allowed to call this method.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetUsers",
        "tags": [
          "User Management"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUsersResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getUsers",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getusers/"
        }
      }
    },
    "/rest/getVideoInfo": {
      "get": {
        "summary": "Returns details for a video.",
        "description": "Returns details for a video, including information about available audio tracks, subtitles (captions) and conversions.",
        "operationId": "getVideoInfo",
        "tags": [
          "Browsing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The video ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetVideoInfoResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getVideoInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getvideoinfo/"
        }
      },
      "post": {
        "summary": "Returns details for a video.",
        "description": "Returns details for a video, including information about available audio tracks, subtitles (captions) and conversions.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetVideoInfo",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The video ID."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetVideoInfoResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getVideoInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getvideoinfo/"
        }
      }
    },
    "/rest/getVideos": {
      "get": {
        "summary": "Returns all video files.",
        "description": "Returns all video files.",
        "operationId": "getVideos",
        "tags": [
          "Browsing"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetVideosResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "getVideos",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getvideos/"
        }
      },
      "post": {
        "summary": "Returns all video files.",
        "description": "Returns all video files.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postGetVideos",
        "tags": [
          "Browsing"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetVideosResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "getVideos",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getvideos/"
        }
      }
    },
    "/rest/hls.m3u8": {
      "get": {
        "summary": "Downloads a given media file (HLS).",
        "description": "Creates an HLS (HTTP Live Streaming) playlist used for streaming video or audio. HLS is a streaming protocol implemented by Apple and works by breaking the overall stream into a sequence of small HTTP-based file downloads. It’s supported by iOS and newer versions of Android. This method also supports adaptive bitrate streaming, see the bitRate parameter.",
        "operationId": "hls.m3u8",
        "tags": [
          "Media Retrieval"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "A string which uniquely identifies the media file to stream.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "bitRate",
            "in": "query",
            "description": "If specified, the server will attempt to limit the bitrate to this value, in kilobits per second. If this parameter is specified more than once, the server will create a variant playlist, suitable for adaptive bitrate streaming. The playlist will support streaming at all the specified bitrates. The server will automatically choose video dimensions that are suitable for the given bitrates. Since 1.9.0 you may explicitly request a certain width (480) and height (360) like so: bitRate=1000@480x360",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "audioTrack",
            "in": "query",
            "description": "The ID of the audio track to use. See `getVideoInfo` for how to get the list of available audio tracks for a video.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/vnd.apple.mpegurl": {
                "schema": {
                  "type": "string"
                }
              },
              "text/xml": {
                "schema": {
                  "type": "object",
                  "description": "Error response TODO: TO BE DESCRIBED"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "hls.m3u8",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/hls/"
        }
      },
      "post": {
        "summary": "Downloads a given media file (HLS).",
        "description": "Creates an HLS (HTTP Live Streaming) playlist used for streaming video or audio. HLS is a streaming protocol implemented by Apple and works by breaking the overall stream into a sequence of small HTTP-based file downloads. It’s supported by iOS and newer versions of Android. This method also supports adaptive bitrate streaming, see the bitRate parameter.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postHls.m3u8",
        "tags": [
          "Media Retrieval"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "A string which uniquely identifies the media file to stream."
                  },
                  "bitRate": {
                    "type": "integer",
                    "description": "If specified, the server will attempt to limit the bitrate to this value, in kilobits per second. If set to zero, no limit is imposed."
                  },
                  "audioTrack": {
                    "type": "string",
                    "description": "The ID of the audio track to use. See `getVideoInfo` for how to get the list of available audio tracks for a video."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/vnd.apple.mpegurl": {
                "schema": {
                  "type": "string"
                }
              },
              "text/xml": {
                "schema": {
                  "type": "object",
                  "description": "Error response TODO: TO BE DESCRIBED"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "hls.m3u8",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/hls/"
        }
      }
    },
    "/rest/jukeboxControl": {
      "get": {
        "summary": "Controls the jukebox, i.e., playback directly on the server’s audio hardware.",
        "description": "Controls the jukebox, i.e., playback directly on the server’s audio hardware. Note: The user must be authorized to control the jukebox (see Settings > Users > User is allowed to play files in jukebox mode).",
        "operationId": "jukeboxControl",
        "tags": [
          "Jukebox"
        ],
        "parameters": [
          {
            "name": "action",
            "in": "query",
            "description": "The operation to perform. Must be one of: get, status (since 1.7.0), set (since 1.7.0), start, stop, skip, add, clear, remove, shuffle, setGain",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/JukeboxAction"
            }
          },
          {
            "name": "index",
            "in": "query",
            "description": "Used by `skip` and `remove`. Zero-based index of the song to skip to or remove.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "(Since 1.7.0) Used by `skip`. Start playing this many seconds into the track.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "id",
            "in": "query",
            "description": "Used by `add` and `set`. ID of song to add to the jukebox playlist. Use multiple id parameters to add many songs in the same request. (set is similar to a clear followed by a add, but will not change the currently playing track.)",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "gain",
            "in": "query",
            "description": "Used by `setGain` to control the playback volume. A float value between 0.0 and 1.0.",
            "required": false,
            "schema": {
              "type": "number",
              "format": "float",
              "minimum": 0,
              "maximum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JukeboxControlResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "jukeboxControl",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/jukeboxcontrol/"
        }
      },
      "post": {
        "summary": "Controls the jukebox, i.e., playback directly on the server’s audio hardware.",
        "description": "Controls the jukebox, i.e., playback directly on the server’s audio hardware. Note: The user must be authorized to control the jukebox (see Settings > Users > User is allowed to play files in jukebox mode).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postJukeboxControl",
        "tags": [
          "Jukebox"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "action": {
                        "description": "The operation to perform. Must be one of: get, status (since 1.7.0), set (since 1.7.0), start, stop, skip, add, clear, remove, shuffle, setGain",
                        "enum": [
                          "get",
                          "status",
                          "start",
                          "stop",
                          "clear",
                          "shuffle"
                        ]
                      }
                    },
                    "required": [
                      "action"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "action": {
                        "description": "'remove' action.",
                        "enum": [
                          "remove"
                        ]
                      },
                      "index": {
                        "description": "Zero-based index of the song to remove.",
                        "type": "integer",
                        "minimum": 0
                      }
                    },
                    "required": [
                      "action",
                      "index"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "action": {
                        "description": "'skip' action.",
                        "enum": [
                          "skip"
                        ]
                      },
                      "index": {
                        "description": "Zero-based index of the song to skip.",
                        "type": "integer",
                        "minimum": 0
                      },
                      "offset": {
                        "description": "(Since 1.7.0) Used by `skip`. Start playing this many seconds into the track.",
                        "type": "integer",
                        "minimum": 0
                      }
                    },
                    "required": [
                      "action",
                      "index"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "action": {
                        "description": "'add' action.",
                        "enum": [
                          "add"
                        ]
                      },
                      "id": {
                        "description": "ID of song to add to the jukebox playlist. Use multiple id parameters to add many songs in the same request. (set is similar to a clear followed by an add, but will not change the currently playing track.)",
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "action",
                      "id"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "action": {
                        "description": "'set' action.",
                        "enum": [
                          "set"
                        ]
                      },
                      "id": {
                        "description": "ID of song to add to the jukebox playlist. Use multiple id parameters to add many songs in the same request. (set is similar to a clear followed by an add, but will not change the currently playing track.)",
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "action",
                      "id"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "action": {
                        "description": "'setGain' action.",
                        "enum": [
                          "setGain"
                        ]
                      },
                      "gain": {
                        "description": "Used by `setGain` to control the playback volume. A float value between 0.0 and 1.0.",
                        "type": "number",
                        "format": "float",
                        "minimum": 0,
                        "maximum": 1
                      }
                    },
                    "required": [
                      "action",
                      "gain"
                    ]
                  }
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JukeboxControlResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "jukeboxControl",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/jukeboxcontrol/"
        }
      }
    },
    "/rest/ping": {
      "get": {
        "summary": "Used to test connectivity with the server.",
        "description": "Test connectivity with the server.",
        "operationId": "ping",
        "tags": [
          "System"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "ping",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/ping/"
        }
      },
      "post": {
        "summary": "Used to test connectivity with the server.",
        "description": "Test connectivity with the server.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postPing",
        "tags": [
          "System"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "ping",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/ping/"
        }
      }
    },
    "/rest/refreshPodcasts": {
      "get": {
        "summary": "Requests the server to check for new Podcast episodes.",
        "description": "Requests the server to check for new Podcast episodes. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).",
        "operationId": "refreshPodcasts",
        "tags": [
          "Podcast"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "refreshPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/refreshpodcasts/"
        }
      },
      "post": {
        "summary": "Requests the server to check for new Podcast episodes.",
        "description": "Requests the server to check for new Podcast episodes. Note: The user must be authorized for Podcast administration (see Settings > Users > User is allowed to administrate Podcasts).\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postRefreshPodcasts",
        "tags": [
          "Podcast"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "refreshPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/refreshpodcasts/"
        }
      }
    },
    "/rest/reportPlayback": {
      "get": {
        "summary": "Reports playback timeline state for a song.",
        "description": "OpenSubsonic extension name `playbackReport` (As returned by `getOpenSubsonicExtensions`). Reports playback timeline state for a song.",
        "operationId": "reportPlayback",
        "tags": [
          "Media Annotation",
          "Extension"
        ],
        "parameters": [
          {
            "name": "mediaId",
            "in": "query",
            "description": "The ID of the media.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mediaType",
            "in": "query",
            "description": "The type of the media.",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "song",
                "podcast"
              ]
            }
          },
          {
            "name": "positionMs",
            "in": "query",
            "description": "The playback position in milliseconds.",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "state",
            "in": "query",
            "description": "Playback state.",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "starting",
                "playing",
                "paused",
                "stopped"
              ]
            }
          },
          {
            "name": "playbackRate",
            "in": "query",
            "description": "Playback speed multiplier.",
            "required": false,
            "schema": {
              "type": "number",
              "format": "float",
              "default": 1
            }
          },
          {
            "name": "ignoreScrobble",
            "in": "query",
            "description": "If true, server should only update now-playing display/state and should not trigger scrobble/playcount side effects.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "404": {
            "description": "Extension not supported."
          }
        },
        "externalDocs": {
          "description": "reportPlayback",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/reportplayback/"
        }
      },
      "post": {
        "summary": "Reports playback timeline state for a song.",
        "description": "OpenSubsonic extension name `playbackReport` (As returned by `getOpenSubsonicExtensions`). Reports playback timeline state for a song.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postReportPlayback",
        "tags": [
          "Media Annotation",
          "Extension"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "mediaId": {
                    "type": "string",
                    "description": "TThe ID of the media."
                  },
                  "mediaType": {
                    "type": "string",
                    "description": "The type of the media.",
                    "enum": [
                      "song",
                      "podcast"
                    ]
                  },
                  "positionMs": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "The playback position in milliseconds."
                  },
                  "state": {
                    "type": "string",
                    "description": "Playback state.",
                    "enum": [
                      "starting",
                      "playing",
                      "paused",
                      "stopped"
                    ]
                  },
                  "playbackRate": {
                    "type": "number",
                    "format": "float",
                    "default": 1,
                    "description": "Playback speed multiplier."
                  },
                  "ignoreScrobble": {
                    "type": "boolean",
                    "default": false,
                    "description": "If true, server should only update now-playing display/state and should not trigger scrobble/playcount side effects."
                  }
                },
                "required": [
                  "mediaId",
                  "mediaType",
                  "positionMs",
                  "state"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "404": {
            "description": "Extension not supported."
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "reportPlayback",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/reportplayback/"
        }
      }
    },
    "/rest/savePlayQueue": {
      "get": {
        "summary": "Saves the state of the play queue for this user.",
        "description": "Saves the state of the play queue for this user. This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book). `id` is optional. Send a call without any parameters to clear the currently saved queue.",
        "operationId": "savePlayQueue",
        "tags": [
          "Bookmarks",
          "Change"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of a song in the play queue. Use one id parameter for each song in the play queue. Specify no IDs to clear",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "current",
            "in": "query",
            "description": "The ID of the current playing song.  This is required if one or more IDs is provided.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "position",
            "in": "query",
            "description": "The position in milliseconds within the currently playing song.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "savePlayQueue",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/saveplayqueue/"
        }
      },
      "post": {
        "summary": "Saves the state of the play queue for this user.",
        "description": "Saves the state of the play queue for this user. This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book). `id` is optional. Send a call without any parameters to clear the currently saved queue.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postSavePlayQueue",
        "tags": [
          "Bookmarks",
          "Change"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of a song in the play queue. Use one id parameter for each song in the play queue. Specify no IDs to clear"
                  },
                  "current": {
                    "type": "string",
                    "description": "The ID of the current playing song. This is required if one or mode IDs is provided"
                  },
                  "position": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "The position in milliseconds within the currently playing song."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/savePlayQueueByIndex": {
      "get": {
        "summary": "Saves the state of the play queue for this user, using queue index.",
        "description": "Saves the state of the play queue for this user. This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book). `id` is optional. Send a call without any parameters to clear the currently saved queue.",
        "operationId": "savePlayQueueByIndex",
        "tags": [
          "Bookmarks",
          "Change"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of a song in the play queue. Use one id parameter for each song in the play queue. Specify no IDs to clear",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currentIndex",
            "in": "query",
            "description": "The index of the current playing song. This is required if one or more IDs is provided.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "position",
            "in": "query",
            "description": "The position in milliseconds within the currently playing song.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "savePlayQueueByIndex",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/saveplayqueuebyindex/"
        }
      },
      "post": {
        "summary": "Saves the state of the play queue for this user.",
        "description": "Saves the state of the play queue for this user. This includes the tracks in the play queue, the currently playing track, and the position within this track. Typically used to allow a user to move between different clients/apps while retaining the same play queue (for instance when listening to an audio book). `id` is optional. Send a call without any parameters to clear the currently saved queue.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postSavePlayQueueByIndex",
        "tags": [
          "Bookmarks",
          "Change"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID of a song in the play queue. Use one id parameter for each song in the play queue. Specify no IDs to clear"
                  },
                  "currentIndex": {
                    "type": "string",
                    "description": "The index of the current playing song. This is required if one or more IDs is provided."
                  },
                  "position": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "The position in milliseconds within the currently playing song."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/scrobble": {
      "get": {
        "summary": "Registers the local playback of one or more media files.",
        "description": "Registers the local playback of one or more media files. Typically used when playing media that is cached on the client. This operation includes the following:\n\n* “Scrobbles” the media files on last.fm if the user has configured his/her last.fm credentials on the server.\n* Updates the play count and last played timestamp for the media files. (Since 1.11.0)\n* Makes the media files appear in the “Now playing” page in the web app, and appear in the list of songs returned by getNowPlaying (Since 1.11.0)\n\nSince 1.8.0 you may specify multiple id (and optionally time) parameters to scrobble multiple files.",
        "operationId": "scrobble",
        "tags": [
          "Media Annotation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "A string which uniquely identifies the file to scrobble.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "time",
            "in": "query",
            "description": "(Since 1.8.0) The time (in milliseconds since 1 Jan 1970) at which the song was listened to.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "submission",
            "in": "query",
            "description": "Whether this is a “submission” or a “now playing” notification.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "scrobble",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/scrobble/"
        }
      },
      "post": {
        "summary": "Registers the local playback of one or more media files.",
        "description": "Registers the local playback of one or more media files. Typically used when playing media that is cached on the client. This operation includes the following:\n\n* “Scrobbles” the media files on last.fm if the user has configured his/her last.fm credentials on the server.\n* Updates the play count and last played timestamp for the media files. (Since 1.11.0)\n* Makes the media files appear in the “Now playing” page in the web app, and appear in the list of songs returned by getNowPlaying (Since 1.11.0)\n\nSince 1.8.0 you may specify multiple id (and optionally time) parameters to scrobble multiple files.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postScrobble",
        "tags": [
          "Media Annotation"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "A string which uniquely identifies the file to scrobble."
                  },
                  "time": {
                    "type": "integer",
                    "description": "(Since 1.8.0) The time (in milliseconds since 1 Jan 1970) at which the song was listened to.",
                    "minimum": 0
                  },
                  "submission": {
                    "type": "boolean",
                    "description": "Whether this is a “submission” or a “now playing” notification.",
                    "default": true
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "scrobble",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/scrobble/"
        }
      }
    },
    "/rest/search": {
      "get": {
        "summary": "Returns a listing of files matching the given search criteria. Supports paging through the result.",
        "deprecated": true,
        "description": "Deprecated since 1.4.0, use search2 instead.\n\nReturns a listing of files matching the given search criteria. Supports paging through the result.",
        "operationId": "search",
        "tags": [
          "Searching"
        ],
        "parameters": [
          {
            "name": "artist",
            "in": "query",
            "description": "Artist to search for.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "album",
            "in": "query",
            "description": "Album to search for.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "title",
            "in": "query",
            "description": "Song title to search for.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "any",
            "in": "query",
            "description": "Searches all fields.",
            "allowEmptyValue": true,
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Search result offset. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "newerThan",
            "in": "query",
            "description": "Only return matches that are newer than this. Given as milliseconds since 1970.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "search",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search/"
        }
      },
      "post": {
        "summary": "Returns a listing of files matching the given search criteria. Supports paging through the result.",
        "deprecated": true,
        "description": "Deprecated since 1.4.0, use search2 instead.\n\nReturns a listing of files matching the given search criteria. Supports paging through the result.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postSearch",
        "tags": [
          "Searching"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "artist": {
                    "type": "string",
                    "description": "Artist to search for."
                  },
                  "album": {
                    "type": "string",
                    "description": "Album to search for."
                  },
                  "title": {
                    "type": "string",
                    "description": "Song title to search for."
                  },
                  "any": {
                    "type": "boolean",
                    "description": "Searches all fields.",
                    "default": false
                  },
                  "count": {
                    "type": "integer",
                    "description": "Maximum number of results to return.",
                    "default": 20,
                    "minimum": 0
                  },
                  "offset": {
                    "type": "integer",
                    "description": "Search result offset. Used for paging.",
                    "default": 0,
                    "minimum": 0
                  },
                  "newerThan": {
                    "type": "integer",
                    "description": "Only return matches that are newer than this. Given as milliseconds since 1970.",
                    "minimum": 0
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "search",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search/"
        }
      }
    },
    "/rest/search2": {
      "get": {
        "summary": "Returns a listing of files matching the given search criteria. Supports paging through the result. (v2)",
        "description": "Returns albums, artists and songs matching the given search criteria. Supports paging through the result.",
        "operationId": "search2",
        "tags": [
          "Searching"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "description": "Search query.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "artistCount",
            "in": "query",
            "description": "Maximum number of artists to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "artistOffset",
            "in": "query",
            "description": "Search result offset for artists. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "albumCount",
            "in": "query",
            "description": "Maximum number of albums to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "albumOffset",
            "in": "query",
            "description": "Search result offset for albums. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "songCount",
            "in": "query",
            "description": "Maximum number of songs to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "songOffset",
            "in": "query",
            "description": "Search result offset for songs. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Search2Response"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "search2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search2/"
        }
      },
      "post": {
        "summary": "Returns a listing of files matching the given search criteria. Supports paging through the result. (v2)",
        "description": "Returns albums, artists and songs matching the given search criteria. Supports paging through the result.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postSearch2",
        "tags": [
          "Searching"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "description": "Search query.",
                    "type": "string"
                  },
                  "artistCount": {
                    "description": "Maximum number of artists to return.",
                    "type": "integer",
                    "default": 20,
                    "minimum": 0
                  },
                  "artistOffset": {
                    "description": "Search result offset for artists. Used for paging.",
                    "type": "integer",
                    "default": 0,
                    "minimum": 0
                  },
                  "albumCount": {
                    "description": "Maximum number of albums to return.",
                    "type": "integer",
                    "default": 20,
                    "minimum": 0
                  },
                  "albumOffset": {
                    "description": "Search result offset for albums. Used for paging.",
                    "type": "integer",
                    "default": 0,
                    "minimum": 0
                  },
                  "songCount": {
                    "description": "Maximum number of songs to return.",
                    "type": "integer",
                    "default": 20,
                    "minimum": 0
                  },
                  "songOffset": {
                    "description": "Search result offset for songs. Used for paging.",
                    "type": "integer",
                    "default": 0,
                    "minimum": 0
                  },
                  "musicFolderId": {
                    "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Search2Response"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "search2",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search2/"
        }
      }
    },
    "/rest/search3": {
      "get": {
        "summary": "Returns albums, artists and songs matching the given search criteria. Supports paging through the result. (v3)",
        "description": "Returns albums, artists and songs matching the given search criteria. Supports paging through the result.\n\nMusic is organized according to ID3 tags.",
        "operationId": "search3",
        "tags": [
          "Searching",
          "Clarification"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "description": "Search query. Servers must support an empty query and return all the data to allow clients to properly access all the media information for offline sync.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "artistCount",
            "in": "query",
            "description": "Maximum number of artists to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "artistOffset",
            "in": "query",
            "description": "Search result offset for artists. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "albumCount",
            "in": "query",
            "description": "Maximum number of albums to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "albumOffset",
            "in": "query",
            "description": "Search result offset for albums. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "songCount",
            "in": "query",
            "description": "Maximum number of songs to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 0
            }
          },
          {
            "name": "songOffset",
            "in": "query",
            "description": "Search result offset for songs. Used for paging.",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Search3Response"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "search3",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search3/"
        }
      },
      "post": {
        "summary": "Returns albums, artists and songs matching the given search criteria. Supports paging through the result. (v3)",
        "description": "Returns albums, artists and songs matching the given search criteria. Supports paging through the result.\n\nMusic is organized according to ID3 tags.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postSearch3",
        "tags": [
          "Searching",
          "Clarification"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "Search query. Servers must support an empty query and return all the data to allow clients to properly access all the media information for offline sync."
                  },
                  "artistCount": {
                    "type": "integer",
                    "default": 20,
                    "minimum": 0,
                    "description": "Maximum number of artists to return."
                  },
                  "artistOffset": {
                    "type": "integer",
                    "default": 0,
                    "minimum": 0,
                    "description": "Search result offset for artists. Used for paging."
                  },
                  "albumCount": {
                    "type": "integer",
                    "default": 20,
                    "minimum": 0,
                    "description": "Maximum number of albums to return."
                  },
                  "albumOffset": {
                    "type": "integer",
                    "default": 0,
                    "minimum": 0,
                    "description": "Search result offset for albums. Used for paging."
                  },
                  "songCount": {
                    "type": "integer",
                    "default": 20,
                    "minimum": 0,
                    "description": "Maximum number of songs to return."
                  },
                  "songOffset": {
                    "type": "integer",
                    "default": 0,
                    "minimum": 0,
                    "description": "Search result offset for songs. Used for paging."
                  },
                  "musicFolderId": {
                    "type": "string",
                    "description": "(Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`."
                  }
                },
                "required": [
                  "query"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Search3Response"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "search3",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search3/"
        }
      }
    },
    "/rest/setRating": {
      "get": {
        "summary": "Sets the rating for a music file.",
        "description": "Sets the rating for a music file.",
        "operationId": "setRating",
        "tags": [
          "Media Annotation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "A string which uniquely identifies the file (song) or folder (album/artist) to rate.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rating",
            "in": "query",
            "description": "The rating between 1 and 5 (inclusive), or 0 to remove the rating.",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 5
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "setRating",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/setrating/"
        }
      },
      "post": {
        "summary": "Sets the rating for a music file.",
        "description": "Sets the rating for a music file.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postSetRating",
        "tags": [
          "Media Annotation"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "A string which uniquely identifies the file (song) or folder (album/artist) to rate.",
                    "type": "string"
                  },
                  "rating": {
                    "description": "The rating between 1 and 5 (inclusive), or 0 to remove the rating.",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 5
                  }
                },
                "required": [
                  "id",
                  "rating"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/star": {
      "get": {
        "summary": "Attaches a star to a song, album or artist.",
        "description": "Attaches a star to a song, album or artist.",
        "operationId": "star",
        "tags": [
          "Media Annotation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "albumId",
            "in": "query",
            "description": "The ID of an album to star. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "artistId",
            "in": "query",
            "description": "The ID of an artist to star. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "star",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/star/"
        }
      },
      "post": {
        "summary": "Attaches a star to a song, album or artist.",
        "description": "Attaches a star to a song, album or artist.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postStar",
        "tags": [
          "Media Annotation"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed."
                  },
                  "albumId": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The ID of an album to star. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed."
                  },
                  "artistId": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The ID of an artist to star. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "star",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/star/"
        }
      }
    },
    "/rest/startScan": {
      "get": {
        "summary": "Initiates a rescan of the media libraries.",
        "description": "Initiates a rescan of the media libraries. Takes no extra parameters.",
        "operationId": "startScan",
        "tags": [
          "Media Library Scanning"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StartScanResponse"
                }
              }
            }
          }
        },
        "externalDocs": {
          "description": "startScan",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/startscan/"
        }
      },
      "post": {
        "summary": "Initiates a rescan of the media libraries.",
        "description": "Initiates a rescan of the media libraries. Takes no extra parameters.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postStartScan",
        "tags": [
          "Media Library Scanning"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StartScanResponse"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "startScan",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/startscan/"
        }
      }
    },
    "/rest/stream": {
      "get": {
        "summary": "Streams a given media file.",
        "description": "Streams a given media file.\n\nOpenSubsonic servers must not count access to this endpoint as a play and increase playcount. Clients can use the Scrobble endpoint to indicate that a media is played ensuring proper data in all cases.\n\nIf the server support the Transcode Offet extension, then it must accept the timeOffset parameter for music too.",
        "operationId": "stream",
        "tags": [
          "Media Retrieval",
          "Clarification",
          "Addition",
          "Extension"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "maxBitRate",
            "in": "query",
            "description": "(Since 1.2.0) If specified, the server will attempt to limit the bitrate to this value, in kilobits per second. If set to zero, no limit is imposed.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "format",
            "in": "query",
            "description": "(Since 1.6.0) Specifies the preferred target format (e.g., “mp3” or “flv”) in case there are multiple applicable transcodings. Starting with 1.9.0 you can use the special value “raw” to disable transcoding.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "timeOffset",
            "in": "query",
            "description": "By default only applicable to video streaming. If specified, start streaming at the given offset (in seconds) into the media. The `Transcode Offset` extension enables the parameter to music too.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "size",
            "in": "query",
            "description": "(Since 1.6.0) Only applicable to video streaming. Requested video size specified as WxH, for instance “640x480”.",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]+x[0-9]+$"
            }
          },
          {
            "name": "estimateContentLength",
            "in": "query",
            "description": "(Since 1.8.0). If set to “true”, the Content-Length HTTP header will be set to an estimated value for transcoded or downsampled media.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "converted",
            "in": "query",
            "description": "(Since 1.14.0) Only applicable to video streaming. Servers can optimize videos for streaming by converting them to MP4. If a conversion exists for the video in question, then setting this parameter to “true” will cause the converted video to be returned instead of the original.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          }
        },
        "externalDocs": {
          "description": "stream",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/stream/"
        }
      },
      "post": {
        "summary": "Streams a given media file.",
        "description": "Streams a given media file.\n\nOpenSubsonic servers must not count access to this endpoint as a play and increase playcount. Clients can use the Scrobble endpoint to indicate that a media is played ensuring proper data in all cases.\n\nIf the server supports the Transcode Offset extension, then it must accept the timeOffset parameter for music too.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postStream",
        "tags": [
          "Media Retrieval",
          "Clarification",
          "Addition",
          "Extension"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory."
                  },
                  "maxBitRate": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "(Since 1.2.0) If specified, the server will attempt to limit the bitrate to this value, in kilobits per second. If set to zero, no limit is imposed."
                  },
                  "format": {
                    "type": "string",
                    "description": "(Since 1.6.0) Specifies the preferred target format (e.g., “mp3” or “flv”) in case there are multiple applicable transcodings. Starting with 1.9.0 you can use the special value “raw” to disable transcoding."
                  },
                  "timeOffset": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "By default only applicable to video streaming. If specified, start streaming at the given offset (in seconds) into the media. The `Transcode Offset` extension enables the parameter to music too."
                  },
                  "size": {
                    "type": "string",
                    "pattern": "^[0-9]+x[0-9]+$",
                    "description": "(Since 1.6.0) Only applicable to video streaming. Requested video size specified as WxH, for instance “640x480”."
                  },
                  "estimateContentLength": {
                    "type": "boolean",
                    "default": false,
                    "description": "(Since 1.8.0). If set to “true”, the Content-Length HTTP header will be set to an estimated value for transcoded or downsampled media."
                  },
                  "converted": {
                    "type": "boolean",
                    "default": false,
                    "description": "(Since 1.14.0) Only applicable to video streaming. Servers can optimize videos for streaming by converting them to MP4. If a conversion exists for the video in question, then setting this parameter to “true” will cause the converted video to be returned instead of the original."
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BinaryResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    },
    "/rest/tokenInfo": {
      "get": {
        "summary": "Returns information about an API key",
        "description": "OpenSubsonic extension name `apiKeyAuthentication` (As returned by `getOpenSubsonicExtensions`). Returns data about an API key.",
        "operationId": "tokenInfo",
        "tags": [
          "System",
          "Addition",
          "Extension"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetTokenInfoResponse"
                }
              }
            }
          },
          "404": {
            "description": "Extension not supported"
          }
        },
        "externalDocs": {
          "description": "tokenInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/tokeninfo/"
        }
      },
      "post": {
        "summary": "Returns information about an API key",
        "description": "OpenSubsonic extension name `apiKeyAuthentication` (As returned by `getOpenSubsonicExtensions`). Returns data about an API key.",
        "operationId": "postTokenInfo",
        "tags": [
          "System",
          "Addition",
          "Extension"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful or failed response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetTokenInfoResponse"
                }
              }
            }
          },
          "404": {
            "description": "Extension not supported"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "tokenInfo",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/tokeninfo/"
        }
      }
    },
    "/rest/unstar": {
      "get": {
        "summary": "Removes a star to a song, album or artist.",
        "description": "Removes a star to a song, album or artist.",
        "operationId": "unstar",
        "tags": [
          "Media Annotation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "albumId",
            "in": "query",
            "description": "The ID of an album to star. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "artistId",
            "in": "query",
            "description": "The ID of an artist to star. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "unstar",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/unstar/"
        }
      },
      "post": {
        "summary": "Removes a star to a song, album or artist.",
        "description": "Removes a star to a song, album or artist.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postUnstar",
        "tags": [
          "Media Annotation"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "The ID of the file (song) or folder (album/artist) to unstar. Multiple parameters allowed."
                  },
                  "albumId": {
                    "description": "The ID of an album to unstar. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed."
                  },
                  "artistId": {
                    "description": "The ID of an artist to unstar. Use this rather than `id` if the client accesses the media collection according to ID3 tags rather than file structure. Multiple parameters allowed."
                  }
                }
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "unstar",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/unstar/"
        }
      }
    },
    "/rest/updateInternetRadioStation": {
      "get": {
        "summary": "Updates an existing internet radio station.",
        "description": "Updates an existing internet radio station. Only users with admin privileges are allowed to call this method.",
        "operationId": "updateInternetRadioStation",
        "tags": [
          "Internet Radio"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "The ID of the station.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "streamUrl",
            "in": "query",
            "description": "The stream URL for the station.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "The user-defined name for the station.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "homepageUrl",
            "in": "query",
            "description": "The home page URL for the station.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "updateInternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateinternetradiostation/"
        }
      },
      "post": {
        "summary": "Updates an existing internet radio station.",
        "description": "Updates an existing internet radio station. Only users with admin privileges are allowed to call this method.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postUpdateInternetRadioStation",
        "tags": [
          "Internet Radio"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "The ID of the station."
                  },
                  "streamUrl": {
                    "type": "string",
                    "description": "The stream URL for the station."
                  },
                  "name": {
                    "type": "string",
                    "description": "The user-defined name for the station."
                  },
                  "homepageUrl": {
                    "type": "string",
                    "description": "The home page URL for the station."
                  }
                },
                "required": [
                  "id",
                  "streamUrl",
                  "name"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "updateInternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateinternetradiostation/"
        }
      }
    },
    "/rest/updatePlaylist": {
      "get": {
        "summary": "Updates a playlist. Only the owner of a playlist is allowed to update it.",
        "description": "Updates a playlist. Only the owner of a playlist is allowed to update it.",
        "operationId": "updatePlaylist",
        "tags": [
          "Playlists"
        ],
        "parameters": [
          {
            "name": "playlistId",
            "in": "query",
            "description": "The playlist ID.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "The human-readable name of the playlist.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "comment",
            "in": "query",
            "description": "The playlist comment.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "public",
            "in": "query",
            "description": "`true` if the playlist should be visible to all users, `false` otherwise.",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "songIdToAdd",
            "in": "query",
            "description": "Add this song with this ID to the playlist. Multiple parameters allowed.",
            "explode": true,
            "style": "form",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "songIndexToRemove",
            "in": "query",
            "description": "Remove the song at this position in the playlist. Multiple parameters allowed.",
            "explode": true,
            "style": "form",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "integer"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "updatePlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateplaylist/"
        }
      },
      "post": {
        "summary": "Updates a playlist. Only the owner of a playlist is allowed to update it.",
        "description": "Updates a playlist. Only the owner of a playlist is allowed to update it.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postUpdatePlaylist",
        "tags": [
          "Playlists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "playlistId": {
                    "description": "The playlist ID.",
                    "type": "string"
                  },
                  "name": {
                    "description": "The human-readable name of the playlist.",
                    "type": "string"
                  },
                  "comment": {
                    "description": "The playlist comment.",
                    "type": "string"
                  },
                  "public": {
                    "description": "`true` if the playlist should be visible to all users, `false` otherwise.",
                    "type": "boolean"
                  },
                  "songIdToAdd": {
                    "description": "Add this song with this ID to the playlist. Multiple parameters allowed.",
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "songIndexToRemove": {
                    "description": "Remove the song at this position in the playlist. Multiple parameters allowed.",
                    "type": "array",
                    "items": {
                      "type": "integer"
                    }
                  }
                },
                "required": [
                  "playlistId"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "updatePlaylist",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateplaylist/"
        }
      }
    },
    "/rest/updateShare": {
      "get": {
        "summary": "Updates the description and/or expiration date for an existing share.",
        "description": "Updates the description and/or expiration date for an existing share.",
        "operationId": "updateShare",
        "tags": [
          "Sharing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID of the share to update.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "description",
            "in": "query",
            "description": "A user-defined description that will be displayed to people visiting the shared media.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "expires",
            "in": "query",
            "description": "The time at which the share expires. Given as milliseconds since 1970, or zero to remove the expiration.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "updateShare",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateshare/"
        }
      },
      "post": {
        "summary": "Updates the description and/or expiration date for an existing share.",
        "description": "Updates the description and/or expiration date for an existing share.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postUpdateShare",
        "tags": [
          "Sharing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "ID of the share to update.",
                    "type": "string"
                  },
                  "description": {
                    "description": "A user-defined description that will be displayed to people visiting the shared media.",
                    "type": "string"
                  },
                  "expires": {
                    "description": "The time at which the share expires. Given as milliseconds since 1970, or zero to remove the expiration.",
                    "type": "integer",
                    "minimum": 0
                  }
                },
                "required": [
                  "id"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        },
        "externalDocs": {
          "description": "updateShare",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateshare/"
        }
      }
    },
    "/rest/updateUser": {
      "get": {
        "summary": "Modifies an existing user on the server.",
        "description": "Modifies an existing user on the server.",
        "operationId": "updateUser",
        "tags": [
          "User Management"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "description": "The name of the user.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "password",
            "in": "query",
            "description": "The password of the user, either in clear text of hex-encoded (see above).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "email",
            "in": "query",
            "description": "The email address of the user.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ldapAuthenticated",
            "in": "query",
            "description": "Whether the user is authenicated in LDAP.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "adminRole",
            "in": "query",
            "description": "Whether the user is administrator.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "settingsRole",
            "in": "query",
            "description": "Whether the user is allowed to change personal settings and password.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "streamRole",
            "in": "query",
            "description": "Whether the user is allowed to play files.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "jukeboxRole",
            "in": "query",
            "description": "Whether the user is allowed to play files in jukebox mode.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "downloadRole",
            "in": "query",
            "description": "Whether the user is allowed to download files.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "uploadRole",
            "in": "query",
            "description": "Whether the user is allowed to upload files.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "coverArtRole",
            "in": "query",
            "description": "Whether the user is allowed to change cover art and tags.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "commentRole",
            "in": "query",
            "description": "Whether the user is allowed to create and edit comments and ratings.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "podcastRole",
            "in": "query",
            "description": "Whether the user is allowed to administrate Podcasts.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "shareRole",
            "in": "query",
            "description": "Whether the user is allowed to share files with anyone.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "videoConversionRole",
            "in": "query",
            "description": "(Since 1.15.0) Whether the user is allowed to start video conversions.",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "musicFolderId",
            "in": "query",
            "description": "(Since 1.12.0) IDs of the music folders the user is allowed access to. Include the parameter once for each folder.",
            "required": false,
            "explode": true,
            "style": "form",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "maxBitRate",
            "in": "query",
            "description": "(Since 1.13.0) The maximum bit rate (in Kbps) for the user. Audio streams of higher bit rates are automatically downsampled to this bit rate. Legal values: 0 (no limit), 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320.",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                32,
                40,
                48,
                56,
                64,
                80,
                96,
                112,
                128,
                160,
                192,
                224,
                256,
                320
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          }
        },
        "externalDocs": {
          "description": "updateUser",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/updateuser/"
        }
      },
      "post": {
        "summary": "Modifies an existing user on the server.",
        "description": "Modifies an existing user on the server.\n\nRequires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`)",
        "operationId": "postUpdateUser",
        "tags": [
          "User Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string",
                    "description": "The name of the user."
                  },
                  "password": {
                    "type": "string",
                    "description": "The password of the user, either in clear text or hex-encoded."
                  },
                  "email": {
                    "type": "string",
                    "description": "The email address of the user."
                  },
                  "ldapAuthenticated": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is authenticated in LDAP."
                  },
                  "adminRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is an administrator."
                  },
                  "settingsRole": {
                    "type": "boolean",
                    "default": true,
                    "description": "Whether the user is allowed to change personal settings and password."
                  },
                  "streamRole": {
                    "type": "boolean",
                    "default": true,
                    "description": "Whether the user is allowed to play files."
                  },
                  "jukeboxRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to play files in jukebox mode."
                  },
                  "downloadRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to download files."
                  },
                  "uploadRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to upload files."
                  },
                  "coverArtRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to change cover art and tags."
                  },
                  "commentRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to create and edit comments and ratings."
                  },
                  "podcastRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to administrate Podcasts."
                  },
                  "shareRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the user is allowed to share files with anyone."
                  },
                  "videoConversionRole": {
                    "type": "boolean",
                    "default": false,
                    "description": "(Since 1.15.0) Whether the user is allowed to start video conversions."
                  },
                  "musicFolderId": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "(Since 1.12.0) IDs of the music folders the user is allowed access to. Include the parameter once for each folder."
                  },
                  "maxBitRate": {
                    "type": "integer",
                    "enum": [
                      0,
                      32,
                      40,
                      48,
                      56,
                      64,
                      80,
                      96,
                      112,
                      128,
                      160,
                      192,
                      224,
                      256,
                      320
                    ],
                    "description": "(Since 1.13.0) The maximum bit rate (in Kbps) for the user. Audio streams of higher bit rates are automatically downsampled to this bit rate. Legal values: 0 (no limit), 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320."
                  }
                },
                "required": [
                  "username",
                  "password"
                ]
              }
            }
          }
        },
        "parameters": [],
        "responses": {
          "200": {
            "$ref": "#/components/responses/EmptySubsonicResponse"
          },
          "405": {
            "$ref": "#/components/responses/HTTPFormPostNotSupported"
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "EmptySubsonicResponse": {
        "description": "Successful or failed response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/SubsonicResponse"
            }
          }
        }
      },
      "HTTPFormPostNotSupported": {
        "description": "HTTP form POST (`formPost`) Extension not supported"
      },
      "BinaryResponse": {
        "description": "Success (binary) or error (xml) response",
        "content": {
          "application/binary": {
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "text/xml": {
            "schema": {
              "type": "object",
              "description": "Error response TODO: TO BE DESCRIBED"
            }
          }
        }
      }
    },
    "parameters": {},
    "securitySchemes": {
      "apiKeyAuth": {
        "type": "apiKey",
        "name": "apiKey",
        "in": "query",
        "description": "[OS] An API key used for authentication. If specified, `p`, `t`, `s` nor `u` can be specified."
      },
      "username": {
        "type": "apiKey",
        "in": "query",
        "name": "u",
        "description": "The username."
      },
      "legacyPassword": {
        "type": "apiKey",
        "in": "query",
        "name": "p",
        "description": "The password, either in clear text or hex-encoded with a “enc:” prefix. Since 1.13.0 this should only be used for testing purposes. `u` must be specified."
      },
      "token": {
        "type": "apiKey",
        "in": "query",
        "name": "t",
        "description": "(Since 1.13.0) The authentication token computed as md5(password + salt). `u` and `s` must be specified. See https://opensubsonic.netlify.app/docs/api-reference/#authentication for details."
      },
      "salt": {
        "type": "apiKey",
        "in": "query",
        "name": "s",
        "description": "(Since 1.13.0) A random string (“salt”) used as input for computing the password hash. `u` and `t` must be specified. See https://opensubsonic.netlify.app/docs/api-reference/#authentication for details."
      },
      "protocolVersion": {
        "type": "apiKey",
        "name": "v",
        "description": "The protocol version implemented by the client, i.e., the version of the subsonic-rest-api.xsd schema used (see below).",
        "in": "query"
      },
      "clientName": {
        "type": "apiKey",
        "name": "c",
        "description": "A unique string identifying the client application.",
        "in": "query"
      },
      "format": {
        "name": "f",
        "type": "apiKey",
        "description": "The response format. Must be 'xml' or 'json'. For the purposes of this document, only `json` is allowed.",
        "in": "query"
      }
    },
    "schemas": {
      "SubsonicError": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "enum": [
              0,
              10,
              20,
              30,
              40,
              41,
              42,
              43,
              44,
              50,
              60,
              70
            ],
            "description": "The error code.\n* 0: A generic error.\n* 10: Required parameter is missing.\n* 20: Incompatible Subsonic REST protocol version. Client must upgrade.\n* 30: Incompatible Subsonic REST protocol version. Server must upgrade.\n* 40: Wrong username or password.\n* 41: Token authentication not supported for LDAP users.\n* 42: Provided authentication mechanism not supported.\n* 43: Multiple conflicting authentication mechanisms provided.\n* 44: Invalid API key.\n* 50: User is not authorized for the given operation.\n* 60: The trial period for the Subsonic server is over. Please upgrade to Subsonic Premium. Visit subsonic.org for details.\n* 70: The requested data was not found."
          },
          "message": {
            "type": "string",
            "description": "The optional error message"
          },
          "helpUrl": {
            "type": "string",
            "description": "A URL (documentation, configuration, etc) which may provide additional context for the error)"
          }
        },
        "required": [
          "code"
        ],
        "example": {
          "code": 42,
          "message": "Authentication mechanism not supported. Use API keys",
          "helpUrl": "https://example.org/users/apiKey"
        },
        "externalDocs": {
          "description": "Error",
          "url": "https://opensubsonic.netlify.app/docs/responses/error/"
        }
      },
      "SubsonicBaseResponse": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "description": "The server supported Subsonic API version."
          },
          "type": {
            "type": "string",
            "description": "The server actual name. [Ex: Navidrome or gonic]"
          },
          "serverVersion": {
            "type": "string",
            "description": "The server version."
          },
          "openSubsonic": {
            "type": "boolean",
            "description": "Must return true if the server support OpenSubsonic API v1"
          }
        },
        "required": [
          "version",
          "type",
          "serverVersion",
          "openSubsonic"
        ]
      },
      "SubsonicSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicBaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "description": "The command result. `ok`",
                "enum": [
                  "ok"
                ]
              }
            },
            "required": [
              "status"
            ],
            "externalDocs": {
              "description": "SubsonicResponse",
              "url": "https://opensubsonic.netlify.app/docs/responses/subsonic-response/"
            }
          }
        ]
      },
      "SubsonicFailureResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicBaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "description": "The command result. `failed`",
                "enum": [
                  "failed"
                ]
              },
              "error": {
                "$ref": "#/components/schemas/SubsonicError"
              }
            },
            "required": [
              "status",
              "error"
            ],
            "externalDocs": {
              "description": "SubsonicResponse",
              "url": "https://opensubsonic.netlify.app/docs/responses/subsonic-response/"
            }
          }
        ]
      },
      "SubsonicResponse": {
        "type": "object",
        "description": "Common answer wrapper.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SubsonicSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "SubsonicResponse",
          "url": "https://opensubsonic.netlify.app/docs/responses/subsonic-response/"
        }
      },
      "ItemGenre": {
        "type": "object",
        "description": "A genre returned in list of genres for an item.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Genre name"
          }
        },
        "required": [
          "name"
        ],
        "externalDocs": {
          "description": "ItemGenre",
          "url": "https://opensubsonic.netlify.app/docs/responses/itemgenre/"
        }
      },
      "ArtistID3": {
        "type": "object",
        "description": "An artist from ID3 tags.",
        "properties": {
          "id": {
            "type": "string",
            "description": "The id of the artist"
          },
          "name": {
            "type": "string",
            "description": "The artist name."
          },
          "coverArt": {
            "type": "string",
            "description": "A covertArt id."
          },
          "artistImageUrl": {
            "type": "string",
            "description": "An url to an external image source."
          },
          "albumCount": {
            "type": "integer",
            "description": "Artist album count."
          },
          "starred": {
            "type": "string",
            "format": "date-time",
            "description": "Date the artist was starred. [ISO 8601]"
          },
          "musicBrainzId": {
            "type": "string",
            "description": "The artist MusicBrainzID."
          },
          "sortName": {
            "type": "string",
            "description": "The artist sort name."
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The list of all roles this artist has in the library."
          }
        },
        "required": [
          "id",
          "name"
        ],
        "externalDocs": {
          "description": "ArtistID3",
          "url": "https://opensubsonic.netlify.app/docs/responses/artistid3/"
        }
      },
      "Contributor": {
        "type": "object",
        "description": "A contributor artist for a song or an album",
        "properties": {
          "role": {
            "type": "string",
            "description": "The contributor role."
          },
          "subRole": {
            "type": "string",
            "description": "The subRole for roles that may require it. Ex: The instrument for the performer role (TMCL/performer tags). Note: For consistency between different tag formats, the TIPL sub roles should be directly exposed in the role field."
          },
          "artist": {
            "$ref": "#/components/schemas/ArtistID3"
          }
        },
        "required": [
          "role",
          "artist"
        ],
        "externalDocs": {
          "description": "Contributor",
          "url": "https://opensubsonic.netlify.app/docs/responses/contributor/"
        }
      },
      "ReplayGain": {
        "type": "object",
        "description": "The replay gain data of a song. Note: If the data is not present the field must be ommited in the answer. (But the replayGain field on Child must always be present)",
        "properties": {
          "trackGain": {
            "type": "number",
            "description": "The track replay gain value. (In Db)"
          },
          "albumGain": {
            "type": "number",
            "description": "The album replay gain value. (In Db)"
          },
          "trackPeak": {
            "type": "number",
            "description": "The track peak value. (Must be positive)",
            "minimum": 0
          },
          "albumPeak": {
            "type": "number",
            "description": "The album peak value. (Must be positive)",
            "minimum": 0
          },
          "baseGain": {
            "type": "number",
            "description": "The base gain value. (In Db) (Ogg Opus Output Gain for example)"
          },
          "fallbackGain": {
            "type": "number",
            "description": "An optional fallback gain that clients should apply when the corresponding gain value is missing. (Can be computed from the tracks or exposed as an user setting.)"
          }
        },
        "externalDocs": {
          "description": "Replay Gain",
          "url": "https://opensubsonic.netlify.app/docs/responses/replaygain/"
        }
      },
      "GenericMediaType": {
        "type": "string",
        "enum": [
          "music",
          "video",
          "podcast",
          "audiobook"
        ],
        "description": "The generic type of media [music/podcast/audiobook/video]"
      },
      "MediaType": {
        "type": "string",
        "enum": [
          "song",
          "album",
          "artist"
        ],
        "description": "Note: If you support `musicBrainzId` you must support this field to ensure clients knows what the ID refers to."
      },
      "ExplicitStatus": {
        "type": "string",
        "enum": [
          "clean",
          "explicit",
          ""
        ],
        "description": "Returns “explicit”, “clean” or “”. (For songs extracted from tags “ITUNESADVISORY”: 1 = explicit, 2 = clean, MP4 “rtng”: 1 or 4 = explicit, 2 = clean. See `albumID3` for albums)"
      },
      "Child": {
        "type": "object",
        "description": "A media.",
        "properties": {
          "id": {
            "type": "string",
            "description": "The id of the media."
          },
          "parent": {
            "type": "string",
            "description": "The id of the parent (folder/album)"
          },
          "isDir": {
            "type": "boolean",
            "description": "The media is a directory"
          },
          "title": {
            "type": "string",
            "description": "The media name."
          },
          "album": {
            "type": "string",
            "description": "The album name."
          },
          "artist": {
            "type": "string",
            "description": "The artist name."
          },
          "track": {
            "type": "integer",
            "description": "The track number."
          },
          "year": {
            "type": "integer",
            "description": "The media year."
          },
          "genre": {
            "type": "string",
            "description": "The media genre"
          },
          "coverArt": {
            "type": "string",
            "description": "The coverArt id."
          },
          "size": {
            "type": "integer",
            "description": "A file size of the media."
          },
          "contentType": {
            "type": "string",
            "description": "The mimeType of the media."
          },
          "suffix": {
            "type": "string",
            "description": "The file suffix of the media."
          },
          "transcodedContentType": {
            "type": "string",
            "description": "The transcoded mediaType if transcoding should happen."
          },
          "transcodedSuffix": {
            "type": "string",
            "description": "The file suffix of the transcoded media."
          },
          "duration": {
            "type": "integer",
            "description": "The duration of the media in seconds."
          },
          "bitRate": {
            "type": "integer",
            "description": "The bitrate of the media."
          },
          "bitDepth": {
            "type": "integer",
            "description": "The bit depth of the media."
          },
          "samplingRate": {
            "type": "integer",
            "description": "The sampling rate of the media."
          },
          "channelCount": {
            "type": "integer",
            "description": "The number of channels of the media."
          },
          "path": {
            "type": "string",
            "description": "The full path of the media."
          },
          "isVideo": {
            "type": "boolean",
            "description": "Media is a video"
          },
          "userRating": {
            "type": "integer",
            "description": "The user rating of the media [1-5]",
            "minimum": 1,
            "maximum": 5
          },
          "averageRating": {
            "type": "number",
            "description": "The average rating of the media [1.0-5.0]",
            "minimum": 0,
            "maximum": 5
          },
          "playCount": {
            "type": "integer",
            "description": "The play count."
          },
          "discNumber": {
            "type": "integer",
            "description": "The disc number."
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "Date the media was created. [ISO 8601]"
          },
          "starred": {
            "type": "string",
            "format": "date-time",
            "description": "Date the media was starred. [ISO 8601]"
          },
          "albumId": {
            "type": "string",
            "description": "The corresponding album id"
          },
          "artistId": {
            "type": "string",
            "description": "The corresponding artist id"
          },
          "type": {
            "$ref": "#/components/schemas/GenericMediaType"
          },
          "mediaType": {
            "$ref": "#/components/schemas/MediaType"
          },
          "bookmarkPosition": {
            "type": "integer",
            "description": "The bookmark position in seconds"
          },
          "originalWidth": {
            "type": "integer",
            "description": "The video original Width"
          },
          "originalHeight": {
            "type": "integer",
            "description": "The video original Height"
          },
          "played": {
            "type": "string",
            "format": "date-time",
            "description": "Date the album was last played. [ISO 8601]"
          },
          "bpm": {
            "type": "integer",
            "description": "The BPM of the song."
          },
          "comment": {
            "type": "string",
            "description": "The comment tag of the song."
          },
          "sortName": {
            "type": "string",
            "description": "The song sort name."
          },
          "musicBrainzId": {
            "type": "string",
            "description": "The track MusicBrainzID."
          },
          "isrc": {
            "type": "array",
            "description": "The track ISRC(s).",
            "example": [
              "USSM18300073",
              "DELV42300297"
            ],
            "items": {
              "type": "string"
            }
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ItemGenre"
            },
            "description": "The list of all genres of the song."
          },
          "artists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            },
            "description": "The list of all song artists of the song. (Note: Only the required `ArtistID3` fields should be returned by default)"
          },
          "displayArtist": {
            "type": "string",
            "description": "The single value display artist."
          },
          "albumArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            },
            "description": "The list of all album artists of the song. (Note: Only the required `ArtistID3` fields should be returned by default)"
          },
          "displayAlbumArtist": {
            "type": "string",
            "description": "The single value display album artist."
          },
          "contributors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Contributor"
            },
            "description": "The list of all contributor artists of the song."
          },
          "displayComposer": {
            "type": "string",
            "description": "The single value display composer."
          },
          "moods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The list of all moods of the song."
          },
          "replayGain": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ReplayGain"
              }
            ],
            "description": "The replay gain data of the song."
          },
          "explicitStatus": {
            "$ref": "#/components/schemas/ExplicitStatus"
          },
          "works": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A work associated with a song.",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "The work name."
                },
                "musicBrainzId": {
                  "type": "string",
                  "description": "The MusicBrainz Work ID."
                }
              },
              "required": [
                "name"
              ],
              "externalDocs": {
                "description": "Work",
                "url": "https://opensubsonic.netlify.app/docs/responses/work/"
              }
            },
            "description": "The list of works associated with the song."
          },
          "movements": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A movement associated with a song.",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "The movement name."
                },
                "number": {
                  "type": "integer",
                  "description": "The movement number."
                },
                "count": {
                  "type": "integer",
                  "description": "The total number of movements."
                }
              },
              "required": [
                "name"
              ],
              "externalDocs": {
                "description": "Movement",
                "url": "https://opensubsonic.netlify.app/docs/responses/movement/"
              }
            },
            "description": "The list of movements associated with the song."
          }
        },
        "required": [
          "id",
          "isDir",
          "title"
        ],
        "externalDocs": {
          "description": "Child",
          "url": "https://opensubsonic.netlify.app/docs/responses/child/"
        }
      },
      "Playlist": {
        "type": "object",
        "description": "Playlist.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id of the playlist"
          },
          "name": {
            "type": "string",
            "description": "Name of the playlist"
          },
          "comment": {
            "type": "string",
            "description": "A comment"
          },
          "owner": {
            "type": "string",
            "description": "Owner of the playlist"
          },
          "public": {
            "type": "boolean",
            "description": "Is the playlist public"
          },
          "songCount": {
            "type": "integer",
            "description": "number of songs"
          },
          "duration": {
            "type": "integer",
            "description": "Playlist duration in seconds"
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "Creation date [ISO 8601]"
          },
          "changed": {
            "type": "string",
            "format": "date-time",
            "description": "Last changed date [ISO 8601]"
          },
          "coverArt": {
            "type": "string",
            "description": "A cover Art Id"
          },
          "allowedUser": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A list of allowed usernames"
          },
          "readonly": {
            "type": "boolean",
            "description": "[OS] If true the playlist cannot be edited by the current user"
          },
          "validUntil": {
            "type": "string",
            "format": "date-time",
            "description": "[OS] Date the playlist contents are considered valid until [ISO 8601]. Empty or absent means no caching guarantee."
          }
        },
        "required": [
          "id",
          "name",
          "songCount",
          "duration",
          "created",
          "changed"
        ],
        "externalDocs": {
          "description": "Playlist",
          "url": "https://opensubsonic.netlify.app/docs/responses/playlist/"
        }
      },
      "PlaylistWithSongs": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Playlist"
          },
          {
            "type": "object",
            "properties": {
              "entry": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Child"
                },
                "description": "The list of songs"
              }
            },
            "externalDocs": {
              "description": "PlaylistWithSongs",
              "url": "https://opensubsonic.netlify.app/docs/responses/playlistwithsongs/"
            }
          }
        ]
      },
      "CreatePlaylistSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "playlist": {
                "$ref": "#/components/schemas/PlaylistWithSongs"
              }
            },
            "required": [
              "playlist"
            ]
          }
        ]
      },
      "CreatePlaylistResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested playlist element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CreatePlaylistSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "CreatePlaylistResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createplaylist/"
        }
      },
      "Share": {
        "type": "object",
        "description": "Share.",
        "properties": {
          "id": {
            "type": "string",
            "description": "The share Id"
          },
          "url": {
            "type": "string",
            "description": "The share url"
          },
          "description": {
            "type": "string",
            "description": "A description"
          },
          "username": {
            "type": "string",
            "description": "The username"
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "Creation date [ISO 8601]"
          },
          "expires": {
            "type": "string",
            "format": "date-time",
            "description": "Share expiration [ISO 8601]"
          },
          "lastVisited": {
            "type": "string",
            "format": "date-time",
            "description": "Last visit [ISO 8601]"
          },
          "visitCount": {
            "type": "integer",
            "description": "Visit count"
          },
          "entry": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "A list of share"
          }
        },
        "required": [
          "id",
          "url",
          "username",
          "created",
          "visitCount"
        ],
        "externalDocs": {
          "description": "Share",
          "url": "https://opensubsonic.netlify.app/docs/responses/share/"
        }
      },
      "Shares": {
        "type": "object",
        "description": "Shares.",
        "properties": {
          "share": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Share"
            },
            "description": "A list of share"
          }
        },
        "externalDocs": {
          "description": "Shares",
          "url": "https://opensubsonic.netlify.app/docs/responses/shares/"
        }
      },
      "CreateSharesSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "shares": {
                "$ref": "#/components/schemas/Shares"
              }
            },
            "required": [
              "shares"
            ]
          }
        ]
      },
      "CreateSharesResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested shares element on success. Which in turns contains a single share element for the newly created share",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CreateSharesSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "CreateSharesResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/createshare/"
        }
      },
      "RecordLabel": {
        "type": "object",
        "description": "A record label for an album.",
        "properties": {
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "externalDocs": {
          "description": "RecordLabel",
          "url": "https://opensubsonic.netlify.app/docs/responses/recordlabel/"
        }
      },
      "ItemDate": {
        "type": "object",
        "description": "A date for a media item that may be just a year, or year-month, or full date.",
        "properties": {
          "year": {
            "type": "integer",
            "description": "The year"
          },
          "month": {
            "type": "integer",
            "description": "The month (1-12)",
            "minimum": 1,
            "maximum": 12
          },
          "day": {
            "type": "integer",
            "description": "The day (1-31)",
            "minimum": 1,
            "maximum": 31
          }
        },
        "externalDocs": {
          "description": "ItemDate",
          "url": "https://opensubsonic.netlify.app/docs/responses/itemdate/"
        }
      },
      "DiscTitle": {
        "type": "object",
        "description": "A disc title for an album with an optional cover art",
        "properties": {
          "disc": {
            "type": "integer",
            "description": "The disc number."
          },
          "title": {
            "type": "string",
            "description": "The name of the disc."
          },
          "coverArt": {
            "type": "string",
            "description": "The cover art ID of the disc."
          }
        },
        "required": [
          "disc",
          "title"
        ],
        "externalDocs": {
          "description": "DiscTitle",
          "url": "https://opensubsonic.netlify.app/docs/responses/disctitle/"
        }
      },
      "AlbumID3": {
        "type": "object",
        "description": "Album with songs.",
        "properties": {
          "id": {
            "type": "string",
            "description": "The id of the album"
          },
          "name": {
            "type": "string",
            "description": "The album name."
          },
          "version": {
            "type": "string",
            "description": "The album version name (Remastered, Anniversary Box Set, …)."
          },
          "artist": {
            "type": "string",
            "description": "Artist name."
          },
          "artistId": {
            "type": "string",
            "description": "The id of the artist"
          },
          "coverArt": {
            "type": "string",
            "description": "A covertArt id."
          },
          "songCount": {
            "type": "integer",
            "description": "Number of songs"
          },
          "duration": {
            "type": "integer",
            "description": "Total duration of the album in seconds"
          },
          "playCount": {
            "type": "integer",
            "description": "Number of play of the album"
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "Date the album was added. [ISO 8601]"
          },
          "starred": {
            "type": "string",
            "format": "date-time",
            "description": "Date the album was added. [ISO 8601]"
          },
          "year": {
            "type": "integer",
            "description": "The album year"
          },
          "genre": {
            "type": "string",
            "description": "The album genre"
          },
          "played": {
            "type": "string",
            "format": "date-time",
            "description": "Date the album was last played. [ISO 8601]"
          },
          "userRating": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "The user rating of the album. [1-5]"
          },
          "recordLabels": {
            "type": "array",
            "description": "The labels producing the album.",
            "items": {
              "$ref": "#/components/schemas/RecordLabel"
            }
          },
          "musicBrainzId": {
            "type": "string",
            "description": "The album MusicBrainzID."
          },
          "genres": {
            "type": "array",
            "description": "The list of all genres of the album.",
            "items": {
              "$ref": "#/components/schemas/ItemGenre"
            }
          },
          "artists": {
            "type": "array",
            "description": "The list of all album artists of the album.",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            }
          },
          "displayArtist": {
            "type": "string",
            "description": "The single value display artist."
          },
          "releaseTypes": {
            "type": "array",
            "description": "The types of this album release. (Album, Compilation, EP, Remix, …).",
            "items": {
              "type": "string"
            }
          },
          "moods": {
            "type": "array",
            "description": "The list of all moods of the album.",
            "items": {
              "type": "string"
            }
          },
          "sortName": {
            "type": "string",
            "description": "The album sort name."
          },
          "originalReleaseDate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ItemDate"
              }
            ],
            "description": "Date the album was originally released."
          },
          "releaseDate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ItemDate"
              }
            ],
            "description": "Date the specific edition of the album was released. Note: for files using ID3 tags, releaseDate should generally be read from the TDRL tag. Servers that use a different source for this field should document the behavior."
          },
          "isCompilation": {
            "type": "boolean",
            "description": "True if the album is a compilation."
          },
          "explicitStatus": {
            "$ref": "#/components/schemas/ExplicitStatus"
          },
          "discTitles": {
            "type": "array",
            "description": "The list of all disc titles of the album.",
            "items": {
              "$ref": "#/components/schemas/DiscTitle"
            }
          },
          "song": {
            "type": "array",
            "description": "The list of songs",
            "items": {
              "$ref": "#/components/schemas/Child"
            }
          }
        },
        "required": [
          "id",
          "name",
          "songCount",
          "duration",
          "created"
        ],
        "externalDocs": {
          "description": "AlbumID3",
          "url": "https://opensubsonic.netlify.app/docs/responses/albumid3/"
        }
      },
      "AlbumID3WithSongs": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AlbumID3"
          },
          {
            "type": "object",
            "properties": {
              "song": {
                "type": "array",
                "description": "The list of songs",
                "items": {
                  "$ref": "#/components/schemas/Child"
                }
              }
            },
            "required": [
              "song"
            ],
            "externalDocs": {
              "description": "AlbumID3WithSongs",
              "url": "https://opensubsonic.netlify.app/docs/responses/albumid3withsongs/"
            }
          }
        ]
      },
      "GetAlbumSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "album": {
                "$ref": "#/components/schemas/AlbumID3WithSongs"
              }
            },
            "required": [
              "album"
            ]
          }
        ]
      },
      "GetAlbumResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested album element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetAlbumSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetAlbumResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbum/"
        }
      },
      "AlbumInfo": {
        "type": "object",
        "description": "Album info.",
        "properties": {
          "notes": {
            "type": "string",
            "description": "Album notes"
          },
          "musicBrainzId": {
            "type": "string",
            "description": "Album musicBrainzId"
          },
          "lastFmUrl": {
            "type": "string",
            "description": "Album lastFmUrl"
          },
          "smallImageUrl": {
            "type": "string",
            "description": "Album smallImageUrl"
          },
          "mediumImageUrl": {
            "type": "string",
            "description": "Album mediumImageUrl"
          },
          "largeImageUrl": {
            "type": "string",
            "description": "Album largeImageUrl"
          }
        },
        "externalDocs": {
          "description": "AlbumInfo",
          "url": "https://opensubsonic.netlify.app/docs/responses/albuminfo/"
        }
      },
      "GetAlbumInfoSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "albumInfo": {
                "$ref": "#/components/schemas/AlbumInfo"
              }
            },
            "required": [
              "albumInfo"
            ]
          }
        ]
      },
      "GetAlbumInfoResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested albumInfo element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetAlbumInfoSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetAlbumInfoResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbuminfo/"
        }
      },
      "AlbumListType": {
        "type": "string",
        "description": "The list type. Must be one of the following: random, newest, highest, frequent, recent. Since 1.8.0 you can also use alphabeticalByName or alphabeticalByArtist to page through all albums alphabetically, and starred to retrieve starred albums. Since 1.10.1 you can use byYear and byGenre to list albums in a given year range or genre.",
        "enum": [
          "random",
          "newest",
          "highest",
          "frequent",
          "recent",
          "alphabeticalByName",
          "alphabeticalByArtist",
          "starred",
          "byYear",
          "byGenre"
        ]
      },
      "AlbumList": {
        "type": "object",
        "description": "Album list.",
        "properties": {
          "album": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Artist albums"
          }
        },
        "externalDocs": {
          "description": "AlbumList",
          "url": "https://opensubsonic.netlify.app/docs/responses/albumlist/"
        }
      },
      "GetAlbumListSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "albumList": {
                "$ref": "#/components/schemas/AlbumList"
              }
            },
            "required": [
              "albumList"
            ]
          }
        ]
      },
      "GetAlbumListResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested albumList element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetAlbumListSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetAlbumListResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbumlist/"
        }
      },
      "AlbumList2": {
        "type": "object",
        "properties": {
          "album": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlbumID3"
            },
            "description": "Artist albums",
            "externalDocs": {
              "description": "AlbumList2",
              "url": "https://opensubsonic.netlify.app/docs/responses/albumlist2/"
            }
          }
        }
      },
      "GetAlbumList2SuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "albumList2": {
                "$ref": "#/components/schemas/AlbumList2"
              }
            },
            "required": [
              "albumList2"
            ]
          }
        ]
      },
      "GetAlbumList2Response": {
        "type": "object",
        "description": "A subsonic-response element with a nested albumList2 element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetAlbumList2SuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetAlbumList2Response",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getalbumlist2/"
        }
      },
      "ArtistWithAlbumsID3": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ArtistID3"
          },
          {
            "type": "object",
            "properties": {
              "album": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AlbumID3"
                },
                "description": "Artist albums"
              }
            },
            "required": [
              "album"
            ],
            "externalDocs": {
              "description": "ArtistWithAlbumsID3",
              "url": "https://opensubsonic.netlify.app/docs/responses/artistwithalbumsid3/"
            }
          }
        ]
      },
      "GetArtistSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "artist": {
                "$ref": "#/components/schemas/ArtistWithAlbumsID3"
              }
            },
            "required": [
              "artist"
            ]
          }
        ]
      },
      "GetArtistResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested artist element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetArtistSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetArtistResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartist/"
        }
      },
      "Artist": {
        "type": "object",
        "description": "Artist details.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Artist id"
          },
          "name": {
            "type": "string",
            "description": "Artist name"
          },
          "artistImageUrl": {
            "type": "string",
            "description": "Artist image url"
          },
          "starred": {
            "type": "string",
            "format": "date-time",
            "description": "Artist starred date [ISO 8601]"
          },
          "userRating": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "Artist rating [1-5]"
          },
          "averageRating": {
            "type": "number",
            "minimum": 1,
            "maximum": 5,
            "description": "Artist average rating [1.0-5.0]"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "externalDocs": {
          "description": "Artist",
          "url": "https://opensubsonic.netlify.app/docs/responses/artist/"
        }
      },
      "ArtistInfo": {
        "type": "object",
        "description": "Artist info.",
        "properties": {
          "biography": {
            "type": "string",
            "description": "Artist biography"
          },
          "musicBrainzId": {
            "type": "string",
            "description": "Artist musicBrainzId"
          },
          "lastFmUrl": {
            "type": "string",
            "description": "Artist lastFmUrl"
          },
          "smallImageUrl": {
            "type": "string",
            "description": "Artist smallImageUrl"
          },
          "mediumImageUrl": {
            "type": "string",
            "description": "Artist mediumImageUrl"
          },
          "largeImageUrl": {
            "type": "string",
            "description": "Artist largeImageUrl"
          },
          "similarArtist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Artist"
            },
            "description": "Similar artists"
          }
        },
        "externalDocs": {
          "description": "ArtistInfo",
          "url": "https://opensubsonic.netlify.app/docs/responses/artistinfo/"
        }
      },
      "GetArtistInfoSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "artistInfo": {
                "$ref": "#/components/schemas/ArtistInfo"
              }
            },
            "required": [
              "artistInfo"
            ]
          }
        ]
      },
      "GetArtistInfoResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested artistInfo element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetArtistInfoSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetArtistInfoResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartistinfo/"
        }
      },
      "ArtistInfo2": {
        "type": "object",
        "description": "Artist info.",
        "properties": {
          "biography": {
            "type": "string",
            "description": "Artist biography"
          },
          "musicBrainzId": {
            "type": "string",
            "description": "Artist musicBrainzId"
          },
          "lastFmUrl": {
            "type": "string",
            "description": "Artist lastFmUrl"
          },
          "smallImageUrl": {
            "type": "string",
            "description": "Artist smallImageUrl"
          },
          "mediumImageUrl": {
            "type": "string",
            "description": "Artist mediumImageUrl"
          },
          "largeImageUrl": {
            "type": "string",
            "description": "Artist largeImageUrl"
          },
          "similarArtist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            },
            "description": "Similar artists"
          }
        },
        "externalDocs": {
          "description": "ArtistInfo2",
          "url": "https://opensubsonic.netlify.app/docs/responses/artistinfo2/"
        }
      },
      "GetArtistInfo2SuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "artistInfo2": {
                "$ref": "#/components/schemas/ArtistInfo2"
              }
            },
            "required": [
              "artistInfo2"
            ]
          }
        ]
      },
      "GetArtistInfo2Response": {
        "type": "object",
        "description": "A subsonic-response element with a nested artistInfo2 element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetArtistInfo2SuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetArtistInfo2Response",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartistinfo2/"
        }
      },
      "ArtistsID3": {
        "type": "object",
        "description": "A list of indexed Artists.",
        "externalDocs": {
          "description": "ArtistsID3",
          "url": "https://opensubsonic.netlify.app/docs/responses/artistsid3/"
        },
        "properties": {
          "ignoredArticles": {
            "type": "string",
            "description": "List of ignored articles space separated"
          },
          "index": {
            "type": "array",
            "description": "Index list",
            "items": {
              "$ref": "#/components/schemas/IndexID3"
            }
          }
        }
      },
      "GetArtistsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "artists": {
                "$ref": "#/components/schemas/ArtistsID3"
              }
            },
            "required": [
              "artists"
            ]
          }
        ]
      },
      "GetArtistsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested artists element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetArtistsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetArtistsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getartists/"
        }
      },
      "Bookmark": {
        "type": "object",
        "description": "A bookmark.",
        "externalDocs": {
          "description": "Bookmark",
          "url": "https://opensubsonic.netlify.app/docs/responses/bookmark/"
        },
        "properties": {
          "position": {
            "type": "integer",
            "description": "Bookmark position in milliseconds"
          },
          "username": {
            "type": "string",
            "description": "Username"
          },
          "comment": {
            "type": "string",
            "description": "Bookmark comment"
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "Bookmark creation date [ISO 8601]"
          },
          "changed": {
            "type": "string",
            "format": "date-time",
            "description": "Bookmark last updated date [ISO 8601]"
          },
          "entry": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Child"
              }
            ],
            "description": "The bookmark file"
          }
        },
        "required": [
          "position",
          "username",
          "created",
          "changed",
          "entry"
        ]
      },
      "Bookmarks": {
        "type": "object",
        "description": "Bookmarks list.",
        "externalDocs": {
          "description": "Bookmarks",
          "url": "https://opensubsonic.netlify.app/docs/responses/bookmarks/"
        },
        "properties": {
          "bookmark": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookmark"
            },
            "description": "List of bookmark"
          }
        }
      },
      "GetBookmarksSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "bookmarks": {
                "$ref": "#/components/schemas/Bookmarks"
              }
            },
            "required": [
              "bookmarks"
            ]
          }
        ]
      },
      "GetBookmarksResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested bookmarks element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetBookmarksSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetBookmarksResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getbookmarks/"
        }
      },
      "ChatMessage": {
        "type": "object",
        "description": "A chatMessage.",
        "externalDocs": {
          "description": "ChatMessage",
          "url": "https://opensubsonic.netlify.app/docs/responses/chatmessage/"
        },
        "properties": {
          "username": {
            "type": "string",
            "description": "Username"
          },
          "time": {
            "type": "integer",
            "description": "Time in millis since Jan 1 1970"
          },
          "message": {
            "type": "string",
            "description": "The message"
          }
        },
        "required": [
          "username",
          "time",
          "message"
        ]
      },
      "ChatMessages": {
        "type": "object",
        "description": "Chat messages list.",
        "externalDocs": {
          "description": "ChatMessages",
          "url": "https://opensubsonic.netlify.app/docs/responses/chatmessages/"
        },
        "properties": {
          "chatMessage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChatMessage"
            },
            "description": "List of chatMessage"
          }
        }
      },
      "GetChatMessagesSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "chatMessages": {
                "$ref": "#/components/schemas/ChatMessages"
              }
            },
            "required": [
              "chatMessages"
            ]
          }
        ]
      },
      "GetChatMessagesResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested chatMessages element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetChatMessagesSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetChatMessagesResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getchatmessages/"
        }
      },
      "Genre": {
        "type": "object",
        "description": "A genre.",
        "externalDocs": {
          "description": "Genre",
          "url": "https://opensubsonic.netlify.app/docs/responses/genre/"
        },
        "properties": {
          "value": {
            "type": "string",
            "description": "Genre name"
          },
          "songCount": {
            "type": "integer",
            "description": "Genre song count"
          },
          "albumCount": {
            "type": "integer",
            "description": "Genre album count"
          }
        },
        "required": [
          "value",
          "songCount",
          "albumCount"
        ]
      },
      "Genres": {
        "type": "object",
        "description": "Genres list.",
        "externalDocs": {
          "description": "Genres",
          "url": "https://opensubsonic.netlify.app/docs/responses/genres/"
        },
        "properties": {
          "genre": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Genre"
            },
            "description": "List of genre"
          }
        }
      },
      "GetGenresSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "genres": {
                "$ref": "#/components/schemas/Genres"
              }
            },
            "required": [
              "genres"
            ]
          }
        ]
      },
      "GetGenresResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested genres element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetGenresSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetGenresResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getgenres/"
        }
      },
      "Index": {
        "type": "object",
        "description": "An indexed artist list.",
        "externalDocs": {
          "description": "Index",
          "url": "https://opensubsonic.netlify.app/docs/responses/index_/"
        },
        "properties": {
          "name": {
            "type": "string",
            "description": "Index name"
          },
          "artist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Artist"
            },
            "description": "Artist list"
          }
        },
        "required": [
          "name"
        ]
      },
      "IndexID3": {
        "type": "object",
        "description": "An indexed artist list by ID3 tags.",
        "externalDocs": {
          "description": "IndexID3",
          "url": "https://opensubsonic.netlify.app/docs/responses/indexid3/"
        },
        "properties": {
          "name": {
            "type": "string",
            "description": "Index name"
          },
          "artist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            },
            "description": "Artist list"
          }
        },
        "required": [
          "name"
        ]
      },
      "Indexes": {
        "type": "object",
        "description": "Artist list.",
        "externalDocs": {
          "description": "Indexes",
          "url": "https://opensubsonic.netlify.app/docs/responses/indexes/"
        },
        "properties": {
          "ignoredArticles": {
            "type": "string",
            "description": "The ignored articles"
          },
          "lastModified": {
            "type": "integer",
            "description": "Last time the index was modified in milliseconds after January 1, 1970 UTC"
          },
          "shortcut": {
            "type": "array",
            "description": "Shortcut",
            "items": {
              "$ref": "#/components/schemas/Artist"
            }
          },
          "child": {
            "type": "array",
            "description": "Array of children",
            "items": {
              "$ref": "#/components/schemas/Child"
            }
          },
          "index": {
            "type": "array",
            "description": "Indexed artists",
            "items": {
              "$ref": "#/components/schemas/Index"
            }
          }
        },
        "required": [
          "ignoredArticles",
          "lastModified"
        ]
      },
      "GetIndexesSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "indexes": {
                "$ref": "#/components/schemas/Indexes"
              }
            },
            "required": [
              "indexes"
            ]
          }
        ]
      },
      "GetIndexesResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested indexes element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetIndexesSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetIndexesResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getindexes/"
        }
      },
      "InternetRadioStation": {
        "type": "object",
        "description": "An internetRadioStation.",
        "externalDocs": {
          "description": "InternetRadioStation",
          "url": "https://opensubsonic.netlify.app/docs/responses/internetradiostation/"
        },
        "properties": {
          "id": {
            "type": "string",
            "description": "The Id"
          },
          "name": {
            "type": "string",
            "description": "The name"
          },
          "streamUrl": {
            "type": "string",
            "description": "The streamUrl"
          },
          "homePageUrl": {
            "type": "string",
            "description": "The home page URL for the station."
          },
          "coverArt": {
            "type": "string",
            "description": "The cover art id."
          }
        },
        "required": [
          "id",
          "name",
          "streamUrl"
        ]
      },
      "InternetRadioStations": {
        "type": "object",
        "description": "internetRadioStations.",
        "externalDocs": {
          "description": "InternetRadioStations",
          "url": "https://opensubsonic.netlify.app/docs/responses/internetradiostations/"
        },
        "properties": {
          "internetRadioStation": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InternetRadioStation"
            },
            "description": "A list of internetRadioStation"
          }
        }
      },
      "GetInternetRadioStationsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "internetRadioStations": {
                "$ref": "#/components/schemas/InternetRadioStations"
              }
            },
            "required": [
              "internetRadioStations"
            ]
          }
        ]
      },
      "GetInternetRadioStationsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested internetRadioStations element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetInternetRadioStationsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetInternetRadioStationsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getinternetradiostations/"
        }
      },
      "License": {
        "type": "object",
        "description": "getLicense result.",
        "externalDocs": {
          "description": "License",
          "url": "https://opensubsonic.netlify.app/docs/responses/license/"
        },
        "properties": {
          "valid": {
            "type": "boolean",
            "description": "The status of the license"
          },
          "email": {
            "type": "string",
            "description": "User email"
          },
          "licenseExpires": {
            "type": "string",
            "format": "date-time",
            "description": "End of license date. [ISO 8601]"
          },
          "trialExpires": {
            "type": "string",
            "format": "date-time",
            "description": "End of trial date. [ISO 8601]"
          }
        },
        "required": [
          "valid"
        ]
      },
      "GetLicenseSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "license": {
                "$ref": "#/components/schemas/License"
              }
            },
            "required": [
              "license"
            ]
          }
        ]
      },
      "GetLicenseResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested license element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetLicenseSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetLicenseResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlicense/"
        }
      },
      "Lyrics": {
        "type": "object",
        "description": "Lyrics.",
        "externalDocs": {
          "description": "Lyrics",
          "url": "https://opensubsonic.netlify.app/docs/responses/lyrics/"
        },
        "properties": {
          "value": {
            "type": "string",
            "description": "The lyrics"
          },
          "artist": {
            "type": "string",
            "description": "The artist name"
          },
          "title": {
            "type": "string",
            "description": "The song title"
          }
        },
        "required": [
          "value"
        ]
      },
      "GetLyricsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "lyrics": {
                "$ref": "#/components/schemas/Lyrics"
              }
            },
            "required": [
              "lyrics"
            ]
          }
        ]
      },
      "GetLyricsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested lyrics element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetLyricsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetLicenseResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlyrics/"
        }
      },
      "Line": {
        "type": "object",
        "description": "One line of a song lyric",
        "externalDocs": {
          "description": "Line",
          "url": "https://opensubsonic.netlify.app/docs/responses/line/"
        },
        "properties": {
          "value": {
            "type": "string",
            "description": "The actual text of this line"
          },
          "start": {
            "type": "number",
            "description": "The start time of the lyrics, relative to the start time of the track, in milliseconds. If this is not part of synced lyrics, start __must__ be omitted"
          }
        },
        "required": [
          "value"
        ]
      },
      "Agent": {
        "type": "object",
        "description": "Reusable metadata for a vocal agent within a structuredLyrics entry",
        "externalDocs": {
          "description": "Agent",
          "url": "https://opensubsonic.netlify.app/docs/responses/agent/"
        },
        "properties": {
          "id": {
            "type": "string",
            "description": "Opaque identifier for this agent. The value is only meaningful within the parent structuredLyrics entry and must be unique within that entry"
          },
          "role": {
            "type": "string",
            "description": "Semantic vocal-layer classification for cueLines that reference this agent. One of: main (lead/default vocal layer), voice (additional explicit individual voice part), bg (background vocals), group (group/chorus vocals). When a structuredLyrics entry uses agents for cue-attributed lyrics, it must define exactly one main agent",
            "enum": [
              "main",
              "voice",
              "bg",
              "group"
            ]
          },
          "name": {
            "type": "string",
            "description": "Optional human-readable label for this agent, such as a singer or character name from the source metadata"
          }
        },
        "required": [
          "id",
          "role"
        ]
      },
      "Cue": {
        "type": "object",
        "description": "A word or syllable cue within a cueLine",
        "externalDocs": {
          "description": "Cue",
          "url": "https://opensubsonic.netlify.app/docs/responses/cue/"
        },
        "properties": {
          "start": {
            "type": "integer",
            "description": "Start time in milliseconds"
          },
          "end": {
            "type": "integer",
            "description": "End time in milliseconds. Within a cueLine, end must be either present on all cues or none. When the source provides partial end times, servers must fill missing values (e.g., using the next cue's start, or the cueLine's end for the final cue). When no cues have end times (e.g., Enhanced LRC with start-only timing), end is omitted from all cues. This is a documented contract rule; this schema does not enforce the all-or-none shape structurally"
          },
          "byteStart": {
            "type": "integer",
            "minimum": 0,
            "description": "Required zero-based inclusive UTF-8 byte offset into the parent cueLine.value where this cue begins. The parent cueLine must include value, and the offsets must be calculated against the final cueLine.value with no normalization step"
          },
          "byteEnd": {
            "type": "integer",
            "minimum": 0,
            "description": "Required zero-based inclusive UTF-8 byte offset into the parent cueLine.value where this cue ends. byteStart must be less than or equal to byteEnd, the parent cueLine must include value, and the offsets must be calculated against the final cueLine.value with no normalization step. This schema does not enforce the cross-field ordering constraint structurally"
          },
          "value": {
            "type": "string",
            "description": "The text of this word or syllable"
          }
        },
        "required": [
          "start",
          "byteStart",
          "byteEnd",
          "value"
        ]
      },
      "CueLine": {
        "type": "object",
        "description": "Word/syllable-level timing data for a lyrics line",
        "externalDocs": {
          "description": "CueLine",
          "url": "https://opensubsonic.netlify.app/docs/responses/cueline/"
        },
        "properties": {
          "index": {
            "type": "integer",
            "description": "Zero-based index into the parent line array this cueLine corresponds to"
          },
          "start": {
            "type": "integer",
            "description": "Start time in milliseconds (may differ from the parent line if cues are more precise)"
          },
          "end": {
            "type": "integer",
            "description": "End time in milliseconds"
          },
          "value": {
            "type": "string",
            "description": "Required full text of the line. Nested cue byteStart and byteEnd offsets are always calculated against this exact final UTF-8 string"
          },
          "agentId": {
            "type": "string",
            "description": "Opaque identifier referencing an agent in the same structuredLyrics entry. If the parent structuredLyrics entry includes agents, every cueLine in that entry must include agentId, and the value must match exactly one agents[].id in that entry. If the parent entry does not include agents, cueLines must not include agentId. When multiple cueLines share the same index, the cueLine whose referenced agent has role main must come first"
          },
          "cue": {
            "type": "array",
            "description": "Ordered list of word/syllable cues. Every cue includes required byteStart and byteEnd offsets into value",
            "items": {
              "$ref": "#/components/schemas/Cue"
            }
          }
        },
        "required": [
          "index",
          "value",
          "cue"
        ]
      },
      "StructuredLyrics": {
        "type": "object",
        "description": "Structured lyrics",
        "externalDocs": {
          "description": "StructuredLyrics",
          "url": "https://opensubsonic.netlify.app/docs/responses/structuredlyrics/"
        },
        "properties": {
          "lang": {
            "type": "string",
            "description": "The lyrics language (ideally ISO 639). If the language is unknown (e.g. lrc file), the server must return `und` (ISO standard) or `xxx` (common value for taggers). Ideally, the server will return lang as an ISO 639 (2/3) code. However, tagged files and external lyrics can come with any value as a potential language code, so clients should take care when displaying lang.\n\nFurthermore, there is special behavior for the value xxx. While not an ISO code, it is commonly used by taggers and other parsing software. Clients should treat xxx as not having a specified language (equivalent to the und code)."
          },
          "synced": {
            "type": "boolean",
            "description": "True if the lyrics are synced, false otherwise"
          },
          "line": {
            "type": "array",
            "description": "The actual lyrics. Ordered by start time (synced) or appearance order (unsynced)",
            "items": {
              "$ref": "#/components/schemas/Line"
            }
          },
          "displayArtist": {
            "type": "string",
            "description": "The artist name to display. This could be the localized name, or any other value"
          },
          "displayTitle": {
            "type": "string",
            "description": "The title to display. This could be the song title (localized), or any other value"
          },
          "offset": {
            "type": "number",
            "description": "The offset to apply to all lyrics, in milliseconds. Positive means lyrics appear sooner, negative means later. If not included, the offset must be assumed to be 0"
          },
          "kind": {
            "type": "string",
            "description": "The primary lyric-layer classification for this structuredLyrics entry. One of: main (primary vocals for this entry, default if omitted), translation (a translation of another lyric layer into another language), pronunciation (a phonetic/romanized rendering, e.g. romaji for Japanese, pinyin for Chinese). Tracks are independent across kind values; clients should not assume 1:1 line or cue alignment between entries. Only returned when enhanced=true",
            "enum": [
              "main",
              "translation",
              "pronunciation"
            ]
          },
          "agents": {
            "type": "array",
            "description": "Reusable per-track attribution metadata for cueLine entries. When present, agents must contain at least one entry, and each agents[].id must be unique within this structuredLyrics entry. Agents are optional for simple unattributed single-layer lyrics. When a structuredLyrics entry represents multiple vocal agents or layers, it must include agents; a single-agent attributed or default entry may also include agents, and if it does, exactly one agent must use role main. Agents should not be emitted without cueLine data",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/Agent"
            }
          },
          "cueLine": {
            "type": "array",
            "description": "Word/syllable-level timing data. Each cueLine corresponds to a line in this structuredLyrics entry by its index field. Every cueLine includes value, and every cue includes byteStart and byteEnd offsets into that exact string. If agents is present, every cueLine in the entry must include agentId, and each agentId must match exactly one agents[].id in that entry. If agents is absent, cueLines must not include agentId. Only returned when enhanced=true and synced is true",
            "items": {
              "$ref": "#/components/schemas/CueLine"
            }
          }
        },
        "required": [
          "lang",
          "synced",
          "line"
        ]
      },
      "LyricsList": {
        "type": "object",
        "description": "List of structured lyrics",
        "externalDocs": {
          "description": "LyricsList",
          "url": "https://opensubsonic.netlify.app/docs/responses/lyricslist/"
        },
        "properties": {
          "structuredLyrics": {
            "type": "array",
            "description": "Structured lyrics. There can be multiple lyrics of the same type with the same language",
            "items": {
              "$ref": "#/components/schemas/StructuredLyrics"
            }
          }
        }
      },
      "GetLyricsBySongIdSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "lyricsList": {
                "$ref": "#/components/schemas/LyricsList"
              }
            },
            "required": [
              "lyricsList"
            ]
          }
        ]
      },
      "GetLyricsBySongIdResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested lyricsList",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetLyricsBySongIdSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetLyricsBySongIdResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getlyricsbysongid/"
        }
      },
      "Directory": {
        "type": "object",
        "description": "Directory.",
        "externalDocs": {
          "description": "Directory",
          "url": "https://opensubsonic.netlify.app/docs/responses/directory/"
        },
        "properties": {
          "id": {
            "type": "string",
            "description": "The id"
          },
          "parent": {
            "type": "string",
            "description": "Parent item"
          },
          "name": {
            "type": "string",
            "description": "The directory name"
          },
          "starred": {
            "type": "string",
            "format": "date-time",
            "description": "Starred date [ISO 8601]"
          },
          "userRating": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "The user rating [1-5]"
          },
          "averageRating": {
            "type": "number",
            "minimum": 1,
            "maximum": 5,
            "description": "The average rating [1-5]"
          },
          "playCount": {
            "type": "integer",
            "description": "The play count"
          },
          "child": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "The directory content"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "GetMusicDirectorySuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "directory": {
                "$ref": "#/components/schemas/Directory"
              }
            },
            "required": [
              "directory"
            ]
          }
        ]
      },
      "GetMusicDirectoryResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested directory element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetMusicDirectorySuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetMusicDirectoryResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getmusicdirectory/"
        }
      },
      "MusicFolder": {
        "type": "object",
        "description": "MusicFolder.",
        "externalDocs": {
          "description": "MusicFolder",
          "url": "https://opensubsonic.netlify.app/docs/responses/musicfolder/"
        },
        "properties": {
          "id": {
            "type": "integer",
            "description": "The id"
          },
          "name": {
            "type": "string",
            "description": "The folder name"
          }
        },
        "required": [
          "id"
        ]
      },
      "MusicFolders": {
        "type": "object",
        "description": "MusicFolders.",
        "externalDocs": {
          "description": "MusicFolders",
          "url": "https://opensubsonic.netlify.app/docs/responses/musicfolders/"
        },
        "properties": {
          "musicFolder": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MusicFolder"
            },
            "description": "The folders"
          }
        }
      },
      "GetMusicFoldersSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "musicFolders": {
                "$ref": "#/components/schemas/MusicFolders"
              }
            },
            "required": [
              "musicFolders"
            ]
          }
        ]
      },
      "GetMusicFoldersResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested musicFolders element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetMusicFoldersSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetMusicFoldersResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getmusicfolders/"
        }
      },
      "PodcastStatus": {
        "type": "string",
        "description": "An enumeration of possible podcast statuses",
        "externalDocs": {
          "description": "PodcastStatus",
          "url": "https://opensubsonic.netlify.app/docs/responses/podcaststatus/"
        },
        "enum": [
          "new",
          "downloading",
          "completed",
          "error",
          "deleted",
          "skipped"
        ]
      },
      "PodcastEpisode": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Child"
          },
          {
            "type": "object",
            "description": "A podcast episode.",
            "externalDocs": {
              "description": "PodcastEpisode",
              "url": "https://opensubsonic.netlify.app/docs/responses/podcastepisode/"
            },
            "properties": {
              "streamId": {
                "type": "string",
                "description": "ID used for streaming podcast"
              },
              "channelId": {
                "type": "string",
                "description": "TID of the podcast channel"
              },
              "description": {
                "type": "string",
                "description": "Episode description"
              },
              "status": {
                "$ref": "#/components/schemas/PodcastStatus"
              },
              "publishDate": {
                "type": "string",
                "format": "date-time",
                "description": "Date the episode was published [ISO 8601]"
              }
            },
            "required": [
              "channelId",
              "status"
            ]
          }
        ]
      },
      "NewestPodcasts": {
        "type": "object",
        "description": "NewestPodcasts.",
        "externalDocs": {
          "description": "NewestPodcasts",
          "url": "https://opensubsonic.netlify.app/docs/responses/newestpodcasts/"
        },
        "properties": {
          "episode": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PodcastEpisode"
            }
          }
        }
      },
      "GetNewestPodcastsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "newestPodcasts": {
                "$ref": "#/components/schemas/NewestPodcasts"
              }
            },
            "required": [
              "newestPodcasts"
            ]
          }
        ]
      },
      "GetNewestPodcastsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `newestPodcasts` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetNewestPodcastsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetNewestPodcastsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getnewestpodcasts/"
        }
      },
      "NowPlayingEntry": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Child"
          },
          {
            "type": "object",
            "description": "NowPlayingEntry.",
            "externalDocs": {
              "description": "NowPlayingEntry",
              "url": "https://opensubsonic.netlify.app/docs/responses/nowplayingentry/"
            },
            "properties": {
              "username": {
                "type": "string",
                "description": "The username"
              },
              "minutesAgo": {
                "type": "integer",
                "description": "Last update"
              },
              "playerId": {
                "type": "integer",
                "description": "Player Id"
              },
              "playerName": {
                "type": "string",
                "description": "Player name"
              },
              "state": {
                "type": "string",
                "description": "Playback state.",
                "enum": [
                  "starting",
                  "playing",
                  "paused",
                  "stopped"
                ]
              },
              "positionMs": {
                "type": "integer",
                "description": "Current playback position in milliseconds (Calculated by the server from the last playbackReport call received)"
              },
              "playbackRate": {
                "type": "number",
                "format": "float",
                "description": "Playback speed multiplier"
              }
            },
            "required": [
              "username",
              "minutesAgo",
              "playerId"
            ]
          }
        ]
      },
      "NowPlaying": {
        "type": "object",
        "description": "nowPlaying.",
        "externalDocs": {
          "description": "NowPlaying",
          "url": "https://opensubsonic.netlify.app/docs/responses/nowplaying/"
        },
        "properties": {
          "entry": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NowPlayingEntry"
            },
            "description": "The now playing entries"
          }
        },
        "required": [
          "entry"
        ]
      },
      "GetNowPlayingSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "nowPlaying": {
                "$ref": "#/components/schemas/NowPlaying"
              }
            },
            "required": [
              "nowPlaying"
            ]
          }
        ]
      },
      "GetNowPlayingResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `nowPlaying` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetNowPlayingSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetNowPlayingResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getnowplaying/"
        }
      },
      "OpenSubsonicExtension": {
        "type": "object",
        "description": "A supported OpenSubsonic API extension.",
        "externalDocs": {
          "description": "OpenSubsonicExtension",
          "url": "https://opensubsonic.netlify.app/docs/responses/opensubsonicextension/"
        },
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the extension."
          },
          "versions": {
            "type": "array",
            "description": "The list of supported versions of the this extension.",
            "items": {
              "type": "integer"
            }
          }
        },
        "required": [
          "name",
          "versions"
        ]
      },
      "GetOpenSubsonicExtensionsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "openSubsonicExtensions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/OpenSubsonicExtension"
                }
              }
            },
            "required": [
              "openSubsonicExtensions"
            ]
          }
        ]
      },
      "GetOpenSubsonicExtensionsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `openSubsonicExtensions` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetOpenSubsonicExtensionsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetOpenSubsonicExtensionsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getopensubsonicextensions/"
        }
      },
      "GetPlaylistSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "playlist": {
                "$ref": "#/components/schemas/PlaylistWithSongs"
              }
            },
            "required": [
              "playlist"
            ]
          }
        ]
      },
      "GetPlaylistResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested playlist element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetPlaylistSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetPlaylistResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplaylist/"
        }
      },
      "Playlists": {
        "type": "object",
        "description": "Playlists.",
        "externalDocs": {
          "description": "Playlists",
          "url": "https://opensubsonic.netlify.app/docs/responses/playlists/"
        },
        "properties": {
          "playlist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Playlist"
            },
            "description": "The playlists"
          }
        }
      },
      "GetPlaylistsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "playlists": {
                "$ref": "#/components/schemas/Playlists"
              }
            },
            "required": [
              "playlists"
            ]
          }
        ]
      },
      "GetPlaylistsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `playlists` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetPlaylistsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetPlaylistsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplaylists/"
        }
      },
      "PlayQueue": {
        "type": "object",
        "description": "NowPlayingEntry.",
        "externalDocs": {
          "description": "PlayQueue",
          "url": "https://opensubsonic.netlify.app/docs/responses/playqueue/"
        },
        "properties": {
          "current": {
            "type": "string",
            "description": "ID of currently playing track. This will be provided if one or more entries exists"
          },
          "position": {
            "type": "integer",
            "description": "Position in milliseconds of currently playing track. If not provided, treat this value as 0"
          },
          "username": {
            "type": "string",
            "description": "The user this queue belongs to"
          },
          "changed": {
            "type": "string",
            "format": "date-time",
            "description": "Date modified [ISO 8601]"
          },
          "changedBy": {
            "type": "string",
            "description": "Name of client app"
          },
          "entry": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "The list of songs in the queue"
          }
        },
        "required": [
          "username",
          "changed",
          "changedBy"
        ]
      },
      "PlayQueueByIndex": {
        "type": "object",
        "description": "NowPlayingEntry with queue index.",
        "externalDocs": {
          "description": "PlayQueueByIndex",
          "url": "https://opensubsonic.netlify.app/docs/responses/playgueuebyindex/"
        },
        "properties": {
          "currentIndex": {
            "type": "integer",
            "description": "Index of currently playing track.  This must be provided if one or more entries exists"
          },
          "position": {
            "type": "integer",
            "description": "Position in milliseconds of currently playing track. If not provided, treat this value as 0"
          },
          "username": {
            "type": "string",
            "description": "The user this queue belongs to"
          },
          "changed": {
            "type": "string",
            "format": "date-time",
            "description": "Date modified [ISO 8601]"
          },
          "changedBy": {
            "type": "string",
            "description": "Name of client app"
          },
          "entry": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "The list of songs in the queue"
          }
        },
        "required": [
          "username",
          "changed",
          "changedBy"
        ]
      },
      "GetPlayQueueSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "playQueue": {
                "$ref": "#/components/schemas/PlayQueue"
              }
            },
            "required": [
              "playQueue"
            ]
          }
        ]
      },
      "GetPlayQueueResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `playQueue` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetPlayQueueSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetPlayQueueResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getplayqueue/"
        }
      },
      "GetPlayQueueByIndexSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "playQueueByIndex": {
                "$ref": "#/components/schemas/PlayQueueByIndex"
              }
            },
            "required": [
              "playQueueByIndex"
            ]
          }
        ]
      },
      "GetPlayQueueByIndexResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `PlayQueueByIndex` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetPlayQueueByIndexSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetPlayQueueByIndexSuccessResponse",
          "url": "https://opensubsonic.netlify.app/docs/responses/playqueuebyindex/"
        }
      },
      "GetPodcastEpisodeSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "podcastEpisode": {
                "$ref": "#/components/schemas/PodcastEpisode"
              }
            },
            "required": [
              "podcastEpisode"
            ]
          }
        ]
      },
      "GetPodcastEpisodeResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `podcastEpisode` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetPodcastEpisodeSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetPodcastEpisodeResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getpodcastepisode/"
        }
      },
      "PodcastChannel": {
        "type": "object",
        "description": "A Podcast channel",
        "externalDocs": {
          "description": "PodcastChannel",
          "url": "https://opensubsonic.netlify.app/docs/responses/podcastchannel/"
        },
        "properties": {
          "id": {
            "type": "string",
            "description": "The channel ID"
          },
          "url": {
            "type": "string",
            "description": "Podcast channel URL"
          },
          "title": {
            "type": "string",
            "description": "The channel title"
          },
          "description": {
            "type": "string",
            "description": "The channel description"
          },
          "coverArt": {
            "type": "string",
            "description": "ID used for retrieving cover art"
          },
          "originalImageUrl": {
            "type": "string",
            "description": "URL for original image of podcast channel"
          },
          "status": {
            "$ref": "#/components/schemas/PodcastStatus"
          },
          "errorMessage": {
            "type": "string",
            "description": "An error message"
          },
          "episode": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PodcastEpisode"
            },
            "description": "Podcast episodes with this channel"
          }
        },
        "required": [
          "id",
          "url",
          "status"
        ]
      },
      "Podcasts": {
        "type": "object",
        "description": "Podcasts.",
        "externalDocs": {
          "description": "Podcasts",
          "url": "https://opensubsonic.netlify.app/docs/responses/podcasts/"
        },
        "properties": {
          "channel": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PodcastChannel"
            },
            "description": "Podcast channel(s)"
          }
        }
      },
      "GetPodcastsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "podcasts": {
                "$ref": "#/components/schemas/Podcasts"
              }
            },
            "required": [
              "podcasts"
            ]
          }
        ]
      },
      "GetPodcastsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `podcasts` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetPodcastsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetPodcastsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getpodcasts/"
        }
      },
      "Songs": {
        "type": "object",
        "description": "Songs list.",
        "externalDocs": {
          "description": "Songs",
          "url": "https://opensubsonic.netlify.app/docs/responses/songs/"
        },
        "properties": {
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "List of songs"
          }
        }
      },
      "GetRandomSongsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "randomSongs": {
                "$ref": "#/components/schemas/Songs"
              }
            },
            "required": [
              "randomSongs"
            ]
          }
        ]
      },
      "GetRandomSongsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `randomSongs` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetRandomSongsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetRandomSongsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getrandomsongs/"
        }
      },
      "ScanStatus": {
        "type": "object",
        "description": "Scan status information.",
        "externalDocs": {
          "description": "ScanStatus",
          "url": "https://opensubsonic.netlify.app/docs/responses/scanstatus/"
        },
        "properties": {
          "scanning": {
            "type": "boolean",
            "description": "The status of the scan"
          },
          "count": {
            "type": "integer",
            "description": "Scanned item count"
          }
        },
        "required": [
          "scanning"
        ]
      },
      "GetScanStatusSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "scanStatus": {
                "$ref": "#/components/schemas/ScanStatus"
              }
            },
            "required": [
              "scanStatus"
            ]
          }
        ]
      },
      "GetScanStatusResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `scanStatus` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetScanStatusSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetScanStatusResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getscanstatus/"
        }
      },
      "GetSharesSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "shares": {
                "$ref": "#/components/schemas/Shares"
              }
            },
            "required": [
              "shares"
            ]
          }
        ]
      },
      "GetSharesResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `shares` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetSharesSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetSharesResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getshares/"
        }
      },
      "SimilarSongs": {
        "type": "object",
        "description": "SimilarSongs list.",
        "externalDocs": {
          "description": "SimilarSongs",
          "url": "https://opensubsonic.netlify.app/docs/responses/similarsongs/"
        },
        "properties": {
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "List of songs"
          }
        }
      },
      "GetSimilarSongsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "similarSongs": {
                "$ref": "#/components/schemas/SimilarSongs"
              }
            },
            "required": [
              "similarSongs"
            ]
          }
        ]
      },
      "GetSimilarSongsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `similarSongs` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetSimilarSongsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetSimilarSongsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs/"
        }
      },
      "SimilarSongs2": {
        "type": "object",
        "description": "SimilarSongs2 list.",
        "externalDocs": {
          "description": "SimilarSongs2",
          "url": "https://opensubsonic.netlify.app/docs/responses/similarsongs2/"
        },
        "properties": {
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "List of songs"
          }
        }
      },
      "GetSimilarSongs2SuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "similarSongs2": {
                "$ref": "#/components/schemas/SimilarSongs2"
              }
            },
            "required": [
              "similarSongs2"
            ]
          }
        ]
      },
      "GetSimilarSongs2Response": {
        "type": "object",
        "description": "A subsonic-response element with a nested `similarSongs2` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetSimilarSongs2SuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetSimilarSongs2Response",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs2/"
        }
      },
      "GetSongSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "song": {
                "$ref": "#/components/schemas/Child"
              }
            },
            "required": [
              "song"
            ]
          }
        ]
      },
      "GetSongResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `song` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetSongSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetSongResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsong/"
        }
      },
      "GetSongsByGenreSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "songsByGenre": {
                "$ref": "#/components/schemas/Songs"
              }
            },
            "required": [
              "songsByGenre"
            ]
          }
        ]
      },
      "GetSongsByGenreResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `songsByGenre` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetSongsByGenreSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetSongsByGenreResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getsongsbygenre/"
        }
      },
      "Starred": {
        "type": "object",
        "description": "starred.",
        "externalDocs": {
          "description": "Starred",
          "url": "https://opensubsonic.netlify.app/docs/responses/starred/"
        },
        "properties": {
          "artist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Artist"
            },
            "description": "Starred artists"
          },
          "album": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Starred albums"
          },
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Starred songs"
          }
        }
      },
      "GetStarredSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "starred": {
                "$ref": "#/components/schemas/Starred"
              }
            },
            "required": [
              "starred"
            ]
          }
        ]
      },
      "GetStarredResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `starred` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetStarredSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetStarredResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getstarred/"
        }
      },
      "Starred2": {
        "type": "object",
        "description": "Starred2.",
        "externalDocs": {
          "description": "Starred2",
          "url": "https://opensubsonic.netlify.app/docs/responses/starred2/"
        },
        "properties": {
          "artist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            },
            "description": "Starred artists"
          },
          "album": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlbumID3"
            },
            "description": "Starred albums"
          },
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Starred songs"
          }
        }
      },
      "GetStarred2SuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "starred2": {
                "$ref": "#/components/schemas/Starred2"
              }
            },
            "required": [
              "starred2"
            ]
          }
        ]
      },
      "GetStarred2Response": {
        "type": "object",
        "description": "A subsonic-response element with a nested `starred2` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetStarred2SuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetStarred2Response",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getstarred2/"
        }
      },
      "TopSongs": {
        "type": "object",
        "description": "TopSongs list.",
        "externalDocs": {
          "description": "TopSongs",
          "url": "https://opensubsonic.netlify.app/docs/responses/topsongs/"
        },
        "properties": {
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "List of songs"
          }
        }
      },
      "GetTopSongsSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "topSongs": {
                "$ref": "#/components/schemas/TopSongs"
              }
            },
            "required": [
              "topSongs"
            ]
          }
        ]
      },
      "GetTopSongsResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `topSongs` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetTopSongsSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetTopSongsResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/gettopsongs/"
        }
      },
      "User": {
        "type": "object",
        "description": "user.",
        "externalDocs": {
          "description": "User",
          "url": "https://opensubsonic.netlify.app/docs/responses/user/"
        },
        "properties": {
          "username": {
            "type": "string",
            "description": "Username"
          },
          "scrobblingEnabled": {
            "type": "boolean",
            "description": "Scrobbling enabled"
          },
          "maxBitRate": {
            "type": "integer"
          },
          "adminRole": {
            "type": "boolean",
            "description": "Whether the user is an admin"
          },
          "settingsRole": {
            "type": "boolean",
            "description": "Whether the user is can edit settings"
          },
          "downloadRole": {
            "type": "boolean",
            "description": "Whether the user can download"
          },
          "uploadRole": {
            "type": "boolean",
            "description": "Whether the user can upload"
          },
          "playlistRole": {
            "type": "boolean",
            "description": "Whether the user can create playlists"
          },
          "coverArtRole": {
            "type": "boolean",
            "description": "Whether the user can get cover art"
          },
          "commentRole": {
            "type": "boolean",
            "description": "Whether the user can create comments"
          },
          "podcastRole": {
            "type": "boolean",
            "description": "Whether the user can create/refresh podcasts"
          },
          "streamRole": {
            "type": "boolean",
            "description": "Whether the user can stream"
          },
          "jukeboxRole": {
            "type": "boolean",
            "description": "Whether the user can control the jukebox"
          },
          "shareRole": {
            "type": "boolean",
            "description": "Whether the user can create a stream"
          },
          "videoConversionRole": {
            "type": "boolean",
            "description": "Whether the user can convert videos"
          },
          "avatarLastChanged": {
            "type": "string",
            "format": "date-time",
            "description": "Last time the avatar was changed [ISO 8601]"
          },
          "folder": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Folder ID(s)"
          }
        },
        "required": [
          "username",
          "scrobblingEnabled",
          "adminRole",
          "settingsRole",
          "downloadRole",
          "uploadRole",
          "playlistRole",
          "coverArtRole",
          "commentRole",
          "podcastRole",
          "streamRole",
          "jukeboxRole",
          "shareRole",
          "videoConversionRole"
        ]
      },
      "GetUserSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "user": {
                "$ref": "#/components/schemas/User"
              }
            },
            "required": [
              "user"
            ]
          }
        ]
      },
      "GetUserResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `user` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetUserSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetUserResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getuser/"
        }
      },
      "Users": {
        "type": "object",
        "description": "users.",
        "externalDocs": {
          "description": "Users",
          "url": "https://opensubsonic.netlify.app/docs/responses/users/"
        },
        "properties": {
          "user": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/User"
            },
            "description": "Array of users"
          }
        }
      },
      "GetUsersSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "users": {
                "$ref": "#/components/schemas/Users"
              }
            },
            "required": [
              "users"
            ]
          }
        ]
      },
      "GetUsersResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `user` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetUsersSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetUsersResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getusers/"
        }
      },
      "VideoInfo": {
        "type": "object",
        "description": "videoInfo. TODO",
        "externalDocs": {
          "description": "VideoInfo",
          "url": "https://opensubsonic.netlify.app/docs/responses/videoinfo/"
        }
      },
      "GetVideoInfoSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "videoInfo": {
                "$ref": "#/components/schemas/VideoInfo"
              }
            },
            "required": [
              "videoInfo"
            ]
          }
        ]
      },
      "GetVideoInfoResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `videoInfo` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetVideoInfoSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetVideoInfoResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getvideoinfo/"
        }
      },
      "Videos": {
        "type": "object",
        "description": "videos. TODO",
        "externalDocs": {
          "description": "Videos",
          "url": "https://opensubsonic.netlify.app/docs/responses/videos/"
        }
      },
      "GetVideosSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "videos": {
                "$ref": "#/components/schemas/Videos"
              }
            },
            "required": [
              "videos"
            ]
          }
        ]
      },
      "GetVideosResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `videos` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetVideosSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetVideosResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/getvideos/"
        }
      },
      "JukeboxAction": {
        "type": "string",
        "description": "JukeBox action.",
        "enum": [
          "get",
          "status",
          "set",
          "start",
          "stop",
          "skip",
          "add",
          "clear",
          "remove",
          "shuffle",
          "setGain"
        ]
      },
      "JukeboxStatus": {
        "type": "object",
        "description": "jukeboxStatus.",
        "externalDocs": {
          "description": "JukeboxStatus",
          "url": "https://opensubsonic.netlify.app/docs/responses/jukeboxstatus/"
        },
        "properties": {
          "currentIndex": {
            "type": "integer",
            "description": "The current index of the song being played"
          },
          "playing": {
            "type": "boolean",
            "description": "Whether the queue is currently playing"
          },
          "volume": {
            "type": "integer",
            "description": "Volume, in a range of [0.0, 1.0]",
            "format": "float",
            "minimum": 0,
            "maximum": 1
          },
          "position": {
            "type": "integer",
            "description": "The current position of the track in seconds"
          }
        },
        "required": [
          "currentIndex",
          "playing",
          "volume"
        ]
      },
      "JukeboxPlaylist": {
        "allOf": [
          {
            "$ref": "#/components/schemas/JukeboxStatus"
          },
          {
            "type": "object",
            "properties": {
              "entry": {
                "type": "array",
                "description": "The songs currently enqueued in the jukebox",
                "items": {
                  "$ref": "#/components/schemas/Child"
                }
              }
            },
            "externalDocs": {
              "description": "JukeboxPlaylist",
              "url": "https://opensubsonic.netlify.app/docs/responses/jukeboxplaylist/"
            }
          }
        ]
      },
      "JukeboxControlSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "jukeboxStatus": {
                "$ref": "#/components/schemas/JukeboxStatus"
              },
              "jukeboxPlaylist": {
                "$ref": "#/components/schemas/JukeboxPlaylist"
              }
            }
          }
        ]
      },
      "JukeboxControlResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested :\n\n- jukeboxStatus for all actions but get\n- jukeboxPlaylist for get action",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/JukeboxControlSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "JukeboxControlSuccessResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/jukeboxcontrol/"
        }
      },
      "SearchResult": {
        "type": "object",
        "description": "searchResult. TODO",
        "externalDocs": {
          "description": "SearchResult",
          "url": "https://opensubsonic.netlify.app/docs/responses/searchresult/"
        }
      },
      "SearchSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "searchResult": {
                "$ref": "#/components/schemas/SearchResult"
              }
            },
            "required": [
              "searchResult"
            ]
          }
        ]
      },
      "SearchResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `searchResult` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SearchSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "SearchResultResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search/"
        }
      },
      "SearchResult2": {
        "type": "object",
        "description": "searchResult2",
        "externalDocs": {
          "description": "SearchResult2",
          "url": "https://opensubsonic.netlify.app/docs/responses/searchresult2/"
        },
        "properties": {
          "artist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Artist"
            },
            "description": "Starred artists"
          },
          "album": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Starred albums"
          },
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Starred songs"
          }
        }
      },
      "Search2SuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "searchResult2": {
                "$ref": "#/components/schemas/SearchResult2"
              }
            },
            "required": [
              "searchResult2"
            ]
          }
        ]
      },
      "Search2Response": {
        "type": "object",
        "description": "A subsonic-response element with a nested `searchResult2` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Search2SuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "SearchResult2Response",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search2/"
        }
      },
      "SearchResult3": {
        "type": "object",
        "description": "searchResult3",
        "externalDocs": {
          "description": "SearchResult3",
          "url": "https://opensubsonic.netlify.app/docs/responses/searchresult3/"
        },
        "properties": {
          "artist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArtistID3"
            },
            "description": "Matching artists"
          },
          "album": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlbumID3"
            },
            "description": "Matching albums"
          },
          "song": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Child"
            },
            "description": "Matching songs"
          }
        }
      },
      "Search3SuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "searchResult3": {
                "$ref": "#/components/schemas/SearchResult3"
              }
            },
            "required": [
              "searchResult3"
            ]
          }
        ]
      },
      "Search3Response": {
        "type": "object",
        "description": "A subsonic-response element with a nested `searchResult3` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Search3SuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "SearchResult3Response",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/search3/"
        }
      },
      "StartScanSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "scanStatus": {
                "$ref": "#/components/schemas/ScanStatus"
              }
            },
            "required": [
              "scanStatus"
            ]
          }
        ]
      },
      "StartScanResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested `scanStatus` element on success.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/StartScanSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "StartScanResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/startscan/"
        }
      },
      "TokenInfo": {
        "type": "object",
        "description": "Information about an API key",
        "externalDocs": {
          "description": "TokenInfo",
          "url": "https://opensubsonic.netlify.app/docs/responses/tokeninfo/"
        },
        "properties": {
          "username": {
            "type": "string",
            "description": "Username associated with token"
          }
        },
        "required": [
          "username"
        ]
      },
      "GetTokenInfoSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/SubsonicSuccessResponse"
          },
          {
            "type": "object",
            "properties": {
              "tokenInfo": {
                "$ref": "#/components/schemas/TokenInfo"
              }
            },
            "required": [
              "tokenInfo"
            ]
          }
        ]
      },
      "GetTokenInfoResponse": {
        "type": "object",
        "description": "A subsonic-response element with a nested tokenInfo on success, or error 44 on invalid token.",
        "properties": {
          "subsonic-response": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/GetTokenInfoSuccessResponse"
              },
              {
                "$ref": "#/components/schemas/SubsonicFailureResponse"
              }
            ]
          }
        },
        "externalDocs": {
          "description": "GetTokenInfoResponse",
          "url": "https://opensubsonic.netlify.app/docs/endpoints/gettokeninfo/"
        }
      },
      "TranscodeDecision": {
        "title": "TranscodeDecision",
        "type": "object",
        "properties": {
          "canDirectPlay": {
            "type": "boolean"
          },
          "canTranscode": {
            "type": "boolean"
          },
          "transcodeReason": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "errorReason": {
            "type": "string",
            "default": ""
          },
          "transcodeParams": {
            "type": "string"
          },
          "sourceStream": {
            "$ref": "#/components/schemas/StreamDetails"
          },
          "transcodeStream": {
            "$ref": "#/components/schemas/StreamDetails"
          }
        },
        "required": [
          "canDirectPlay",
          "canTranscode"
        ]
      },
      "Transcoding": {
        "title": "Transcoding",
        "type": "object",
        "description": "The transcoding extension",
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the extension.",
            "enum": [
              "transcoding"
            ]
          },
          "version": {
            "type": "string",
            "description": "The version of the extension."
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The endpoints provided by this extension."
          }
        },
        "required": [
          "name",
          "version",
          "endpoints"
        ]
      },
      "Limitation": {
        "title": "Limitation",
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the limitation.",
            "enum": [
              "audioChannels",
              "audioBitrate",
              "audioProfile",
              "audioSamplerate",
              "audioBitdepth"
            ]
          },
          "comparison": {
            "type": "string",
            "description": "The comparison operator.",
            "enum": [
              "Equals",
              "NotEquals",
              "LessThanEqual",
              "GreaterThanEqual"
            ]
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string",
              "example": "44100"
            },
            "description": "The values to compare against. For LessThanEqual and GreaterThanEqual only the first value will be used."
          },
          "required": {
            "type": "boolean",
            "description": "Whether this limitation is required."
          }
        },
        "required": [
          "name",
          "comparison",
          "values",
          "required"
        ]
      },
      "CodecProfile": {
        "title": "CodecProfile",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "AudioCodec"
            ]
          },
          "name": {
            "type": "string"
          },
          "limitations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Limitation"
            }
          }
        },
        "required": [
          "type",
          "name"
        ]
      },
      "TranscodingProfile": {
        "title": "TranscodingProfile",
        "type": "object",
        "properties": {
          "container": {
            "type": "string"
          },
          "audioCodec": {
            "type": "string"
          },
          "protocol": {
            "type": "string",
            "enum": [
              "http",
              "hls"
            ]
          },
          "maxAudioChannels": {
            "type": "integer"
          }
        },
        "required": [
          "container",
          "audioCodec",
          "protocol"
        ]
      },
      "DirectPlayProfile": {
        "title": "DirectPlayProfile",
        "type": "object",
        "properties": {
          "containers": {
            "type": "array",
            "description": "The list of supported containers. An empty array means any containers.",
            "items": {
              "type": "string",
              "example": "mp4"
            }
          },
          "audioCodecs": {
            "type": "array",
            "description": "The list of supported codecs. An empty array means any codecs.",
            "items": {
              "type": "string",
              "example": "flac"
            }
          },
          "protocols": {
            "type": "array",
            "description": "The list of supported protocols. An empty array means any protocols.",
            "items": {
              "type": "string",
              "enum": [
                "http",
                "hls"
              ],
              "example": "http"
            }
          },
          "maxAudioChannels": {
            "type": "integer"
          }
        },
        "required": [
          "containers",
          "audioCodecs",
          "protocols"
        ]
      },
      "ClientInfo": {
        "title": "ClientInfo",
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          },
          "maxAudioBitrate": {
            "type": "integer"
          },
          "maxTranscodingAudioBitrate": {
            "type": "integer"
          },
          "directPlayProfiles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DirectPlayProfile"
            }
          },
          "transcodingProfiles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranscodingProfile"
            }
          },
          "codecProfiles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CodecProfile"
            }
          }
        },
        "required": [
          "name",
          "platform"
        ]
      },
      "StreamDetails": {
        "title": "StreamDetails",
        "type": "object",
        "properties": {
          "protocol": {
            "type": "string",
            "enum": [
              "http",
              "hls"
            ]
          },
          "container": {
            "type": "string"
          },
          "codec": {
            "type": "string"
          },
          "audioChannels": {
            "type": "integer"
          },
          "audioBitrate": {
            "type": "integer"
          },
          "audioProfile": {
            "type": "string"
          },
          "audioSamplerate": {
            "type": "integer"
          },
          "audioBitdepth": {
            "type": "integer"
          }
        },
        "required": [
          "protocol",
          "container",
          "codec"
        ]
      }
    }
  }
}
