From 6c360c3c199d1ac3ca3ebe67baef51069709ef1e Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sat, 12 Jul 2025 11:23:59 -0700 Subject: [PATCH] add autogen opensubsonic schema --- eslint.config.mjs | 2 +- package.json | 11 +- pnpm-lock.yaml | 348 +- src/shared/api/subsonic/subsonic-schema.d.ts | 7831 ++++++++++++++++++ tsconfig.node.json | 1 + tsconfig.web.json | 1 + 6 files changed, 8068 insertions(+), 126 deletions(-) create mode 100644 src/shared/api/subsonic/subsonic-schema.d.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 87ecdc94f..8b0094ce9 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -6,7 +6,7 @@ import eslintPluginReactHooks from 'eslint-plugin-react-hooks'; import eslintPluginReactRefresh from 'eslint-plugin-react-refresh'; export default tseslint.config( - { ignores: ['**/node_modules', '**/dist', '**/out'] }, + { ignores: ['**/node_modules', '**/dist', '**/out', '**/*-schema.d.ts'] }, tseslint.configs.recommended, perfectionist.configs['recommended-natural'], eslintPluginReact.configs.flat.recommended, diff --git a/package.json b/package.json index 5015c3782..c33f6ba13 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,8 @@ "dev": "electron-vite dev", "dev:remote": "vite dev --config remote.vite.config.ts", "dev:watch": "electron-vite dev --watch", + "generate-api": "pnpm run generate-api:subsonic", + "generate-api:subsonic": "openapi-typescript https://opensubsonic.netlify.app/docs/openapi/openapi.json -o ./src/shared/api/subsonic/subsonic-schema.d.ts", "i18next": "i18next -c src/i18n/i18next-parser.config.js", "postinstall": "electron-builder install-app-deps", "lint": "pnpm run lint-code && pnpm run lint-styles", @@ -71,9 +73,9 @@ "@mantine/hooks": "^8.2.8", "@mantine/modals": "^8.2.8", "@mantine/notifications": "^8.2.8", - "@tanstack/react-query": "^4.32.1", - "@tanstack/react-query-devtools": "^4.32.1", - "@tanstack/react-query-persist-client": "^4.32.1", + "@tanstack/react-query": "^5.83.0", + "@tanstack/react-query-devtools": "^5.83.0", + "@tanstack/react-query-persist-client": "^5.83.0", "@ts-rest/core": "^3.23.0", "@xhayper/discord-rpc": "^1.3.0", "audiomotion-analyzer": "^4.5.0", @@ -103,6 +105,7 @@ "mpris-service": "^2.1.2", "nanoid": "^3.3.3", "node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f", + "openapi-fetch": "^0.14.0", "overlayscrollbars": "^2.11.1", "overlayscrollbars-react": "^0.5.6", "qs": "^6.14.0", @@ -135,6 +138,7 @@ "@types/lodash": "^4.17.18", "@types/md5": "^2.3.5", "@types/node": "^22.15.32", + "@types/qs": "^6.14.0", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", "@types/react-window": "^1.8.5", @@ -155,6 +159,7 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "i18next-parser": "^9.0.2", + "openapi-typescript": "^7.8.0", "postcss-preset-mantine": "^1.17.0", "prettier": "^3.5.3", "prettier-plugin-packagejson": "^2.5.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad4871883..eb18da49a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,14 +60,14 @@ importers: specifier: ^8.2.8 version: 8.2.8(@mantine/core@8.2.8(@mantine/hooks@8.2.8(react@19.1.0))(@types/react@18.3.23)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@mantine/hooks@8.2.8(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-query': - specifier: ^4.32.1 - version: 4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^5.83.0 + version: 5.83.0(react@19.1.0) '@tanstack/react-query-devtools': - specifier: ^4.32.1 - version: 4.36.1(@tanstack/react-query@4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^5.83.0 + version: 5.83.0(@tanstack/react-query@5.83.0(react@19.1.0))(react@19.1.0) '@tanstack/react-query-persist-client': - specifier: ^4.32.1 - version: 4.36.1(@tanstack/react-query@4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + specifier: ^5.83.0 + version: 5.83.0(@tanstack/react-query@5.83.0(react@19.1.0))(react@19.1.0) '@ts-rest/core': specifier: ^3.23.0 version: 3.52.1(@types/node@22.15.32)(zod@3.25.23) @@ -155,6 +155,9 @@ importers: node-mpv: specifier: github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f version: https://codeload.github.com/jeffvli/Node-MPV/tar.gz/32b4d64395289ad710c41d481d2707a7acfc228f + openapi-fetch: + specifier: ^0.14.0 + version: 0.14.0 overlayscrollbars: specifier: ^2.11.1 version: 2.11.3 @@ -246,6 +249,9 @@ importers: '@types/node': specifier: ^22.15.32 version: 22.15.32 + '@types/qs': + specifier: ^6.14.0 + version: 6.14.0 '@types/react': specifier: ^18.3.23 version: 18.3.23 @@ -266,7 +272,7 @@ importers: version: 8.18.1 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.5.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)) + version: 4.5.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0)) concurrently: specifier: ^7.1.0 version: 7.6.0 @@ -284,7 +290,7 @@ importers: version: 3.2.1 electron-vite: specifier: ^3.1.0 - version: 3.1.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)) + version: 3.1.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0)) eslint: specifier: ^9.24.0 version: 9.27.0 @@ -306,6 +312,9 @@ importers: i18next-parser: specifier: ^9.0.2 version: 9.3.0 + openapi-typescript: + specifier: ^7.8.0 + version: 7.8.0(typescript@5.8.3) postcss-preset-mantine: specifier: ^1.17.0 version: 1.17.0(postcss@8.5.3) @@ -335,7 +344,7 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2) + version: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0) vite-plugin-conditional-import: specifier: ^0.1.7 version: 0.1.7 @@ -344,7 +353,7 @@ importers: version: 1.6.0 vite-plugin-ejs: specifier: ^1.7.0 - version: 1.7.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)) + version: 1.7.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0)) packages: @@ -1040,6 +1049,16 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.22.2': + resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} + + '@redocly/openapi-core@1.34.3': + resolution: {integrity: sha512-3arRdUp1fNx55itnjKiUhO6t4Mf91TsrTIYINDNLAZPS0TPd5YpiXRctwjel0qqWoOOhjA34cZ3m4dksLDFUYg==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@remix-run/router@1.23.0': resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} @@ -1163,39 +1182,31 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tanstack/match-sorter-utils@8.19.4': - resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} - engines: {node: '>=12'} + '@tanstack/query-core@5.83.0': + resolution: {integrity: sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==} - '@tanstack/query-core@4.36.1': - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + '@tanstack/query-devtools@5.81.2': + resolution: {integrity: sha512-jCeJcDCwKfoyyBXjXe9+Lo8aTkavygHHsUHAlxQKKaDeyT0qyQNLKl7+UyqYH2dDF6UN/14873IPBHchcsU+Zg==} - '@tanstack/query-persist-client-core@4.36.1': - resolution: {integrity: sha512-eocgCeI7D7TRv1IUUBMfVwOI0wdSmMkBIbkKhqEdTrnUHUQEeOaYac8oeZk2cumAWJdycu6P/wB+WqGynTnzXg==} + '@tanstack/query-persist-client-core@5.83.0': + resolution: {integrity: sha512-hdKgHkr1MYnwZX+QHj/9JjXZx9gL2RUCD5xSX0EHZiqUQhMk4Gcryq9xosn8LmYRMlhkjk7n9uV+X4UXRvgoIg==} - '@tanstack/react-query-devtools@4.36.1': - resolution: {integrity: sha512-WYku83CKP3OevnYSG8Y/QO9g0rT75v1om5IvcWUwiUZJ4LanYGLVCZ8TdFG5jfsq4Ej/lu2wwDAULEUnRIMBSw==} + '@tanstack/react-query-devtools@5.83.0': + resolution: {integrity: sha512-yfp8Uqd3I1jgx8gl0lxbSSESu5y4MO2ThOPBnGNTYs0P+ZFu+E9g5IdOngyUGuo6Uz6Qa7p9TLdZEX3ntik2fQ==} peerDependencies: - '@tanstack/react-query': ^4.36.1 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-query': ^5.83.0 + react: ^18 || ^19 - '@tanstack/react-query-persist-client@4.36.1': - resolution: {integrity: sha512-32I5b9aAu4NCiXZ7Te/KEQLfHbYeTNriVPrKYcvEThnZ9tlW01vLcSoxpUIsMYRsembvJUUAkzYBAiZHLOd6pQ==} + '@tanstack/react-query-persist-client@5.83.0': + resolution: {integrity: sha512-uEqJnSbqlvzlhYJ+RU+2c2DmbbT7cw6eFjiewEXZFXaSGWNjvUG02LePrwL8cdLlRQFcZKas30IdckboOoVg9Q==} peerDependencies: - '@tanstack/react-query': ^4.36.1 + '@tanstack/react-query': ^5.83.0 + react: ^18 || ^19 - '@tanstack/react-query@4.36.1': - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + '@tanstack/react-query@5.83.0': + resolution: {integrity: sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + react: ^18 || ^19 '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -1269,6 +1280,9 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/react-dom@18.3.7': resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: @@ -1428,6 +1442,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1674,6 +1692,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -1752,6 +1773,9 @@ packages: colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorjs.io@0.5.2: resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} @@ -1800,10 +1824,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -2701,6 +2721,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} + infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} @@ -2870,10 +2894,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -2903,6 +2923,10 @@ packages: engines: {node: '>=10'} hasBin: true + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3339,6 +3363,18 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + openapi-fetch@0.14.0: + resolution: {integrity: sha512-PshIdm1NgdLvb05zp8LqRQMNSKzIlPkyMxYFxwyHR+UlKD4t2nUjkDhNxeRbhRSEd3x5EUNh2w5sJYwkhOH4fg==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + + openapi-typescript@7.8.0: + resolution: {integrity: sha512-1EeVWmDzi16A+siQlo/SwSGIT7HwaFAVjvMA7/jG5HMLSnrUOzPL7uSTRZZa4v/LCRxHTApHKtNY6glApEoiUQ==} + hasBin: true + peerDependencies: + typescript: ^5.x + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3402,6 +3438,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + parse5-htmlparser2-tree-adapter@7.1.0: resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} @@ -3470,6 +3510,10 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3797,9 +3841,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} @@ -4288,9 +4329,9 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} - superjson@1.13.3: - resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} - engines: {node: '>=10'} + supports-color@10.0.0: + resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + engines: {node: '>=18'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -4489,6 +4530,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4744,6 +4788,14 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4851,7 +4903,7 @@ snapshots: '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4937,7 +4989,7 @@ snapshots: '@babel/parser': 7.27.2 '@babel/template': 7.27.2 '@babel/types': 7.27.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5039,7 +5091,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -5069,7 +5121,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -5078,7 +5130,7 @@ snapshots: '@electron/osx-sign@1.3.1': dependencies: compare-version: 0.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -5091,7 +5143,7 @@ snapshots: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) detect-libc: 2.0.4 fs-extra: 10.1.0 got: 11.8.6 @@ -5110,7 +5162,7 @@ snapshots: dependencies: '@electron/asar': 3.2.18 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) dir-compare: 4.2.0 fs-extra: 11.3.1 minimatch: 9.0.5 @@ -5121,7 +5173,7 @@ snapshots: '@electron/windows-sign@1.2.2': dependencies: cross-dirname: 0.1.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fs-extra: 11.3.1 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -5214,7 +5266,7 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5232,7 +5284,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -5337,7 +5389,7 @@ snapshots: '@malept/flatpak-bundler@0.4.0': dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fs-extra: 9.1.0 lodash: 4.17.21 tmp-promise: 3.0.3 @@ -5547,6 +5599,29 @@ snapshots: '@babel/runtime': 7.27.1 react: 19.1.0 + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.22.2': {} + + '@redocly/openapi-core@1.34.3(supports-color@10.0.0)': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.2 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@10.0.0) + js-levenshtein: 1.1.6 + js-yaml: 4.1.0 + minimatch: 5.1.6 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + '@remix-run/router@1.23.0': {} '@rolldown/pluginutils@1.0.0-beta.9': {} @@ -5621,37 +5696,30 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tanstack/match-sorter-utils@8.19.4': - dependencies: - remove-accents: 0.5.0 + '@tanstack/query-core@5.83.0': {} - '@tanstack/query-core@4.36.1': {} + '@tanstack/query-devtools@5.81.2': {} - '@tanstack/query-persist-client-core@4.36.1': + '@tanstack/query-persist-client-core@5.83.0': dependencies: - '@tanstack/query-core': 4.36.1 + '@tanstack/query-core': 5.83.0 - '@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-query-devtools@5.83.0(@tanstack/react-query@5.83.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-query': 4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/query-devtools': 5.81.2 + '@tanstack/react-query': 5.83.0(react@19.1.0) react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - superjson: 1.13.3 - use-sync-external-store: 1.5.0(react@19.1.0) - '@tanstack/react-query-persist-client@4.36.1(@tanstack/react-query@4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': + '@tanstack/react-query-persist-client@5.83.0(@tanstack/react-query@5.83.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/query-persist-client-core': 4.36.1 - '@tanstack/react-query': 4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - - '@tanstack/react-query@4.36.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@tanstack/query-core': 4.36.1 + '@tanstack/query-persist-client-core': 5.83.0 + '@tanstack/react-query': 5.83.0(react@19.1.0) + react: 19.1.0 + + '@tanstack/react-query@5.83.0(react@19.1.0)': + dependencies: + '@tanstack/query-core': 5.83.0 react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - optionalDependencies: - react-dom: 19.1.0(react@19.1.0) '@tootallnate/once@2.0.0': {} @@ -5732,6 +5800,8 @@ snapshots: '@types/prop-types@15.7.14': {} + '@types/qs@6.14.0': {} + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: '@types/react': 18.3.23 @@ -5798,7 +5868,7 @@ snapshots: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) eslint: 9.27.0 typescript: 5.8.3 transitivePeerDependencies: @@ -5813,7 +5883,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) eslint: 9.27.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -5826,7 +5896,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -5852,7 +5922,7 @@ snapshots: '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-react@4.5.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2))': + '@vitejs/plugin-react@4.5.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) @@ -5860,7 +5930,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.9 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2) + vite: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -5896,7 +5966,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color @@ -5933,6 +6003,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -5966,7 +6038,7 @@ snapshots: builder-util-runtime: 9.3.1 chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) dmg-builder: 26.0.12(electron-builder-squirrel-windows@26.0.12) dotenv: 16.5.0 dotenv-expand: 11.0.7 @@ -6186,7 +6258,7 @@ snapshots: builder-util-runtime@9.3.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) sax: 1.4.1 transitivePeerDependencies: - supports-color @@ -6199,10 +6271,10 @@ snapshots: builder-util-runtime: 9.3.1 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fs-extra: 10.1.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@10.0.0) is-ci: 3.0.1 js-yaml: 4.1.0 sanitize-filename: 1.6.3 @@ -6283,6 +6355,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + change-case@5.4.4: {} + charenc@0.0.2: {} cheerio-select@2.1.0: @@ -6364,6 +6438,8 @@ snapshots: colord@2.9.3: {} + colorette@1.4.0: {} + colorjs.io@0.5.2: {} colors@1.4.0: {} @@ -6418,10 +6494,6 @@ snapshots: convert-source-map@2.0.0: {} - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 - core-util-is@1.0.2: optional: true @@ -6521,9 +6593,11 @@ snapshots: dependencies: ms: 2.0.0 - debug@4.4.1: + debug@4.4.1(supports-color@10.0.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.0.0 decompress-response@6.0.0: dependencies: @@ -6713,7 +6787,7 @@ snapshots: electron-localshortcut@3.2.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) electron-is-accelerator: 0.1.2 keyboardevent-from-electron-accelerator: 2.0.0 keyboardevents-areequal: 0.2.2 @@ -6755,7 +6829,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@3.1.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)): + electron-vite@3.1.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0)): dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) @@ -6763,14 +6837,14 @@ snapshots: esbuild: 0.25.4 magic-string: 0.30.17 picocolors: 1.1.1 - vite: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2) + vite: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0) transitivePeerDependencies: - supports-color electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.4.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fs-extra: 7.0.1 lodash: 4.17.21 temp: 0.9.4 @@ -7038,7 +7112,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -7092,7 +7166,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -7499,14 +7573,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color @@ -7518,14 +7592,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@10.0.0): dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color @@ -7598,6 +7672,8 @@ snapshots: indent-string@4.0.0: {} + index-to-position@1.1.0: {} + infer-owner@1.0.4: {} inflight@1.0.6: @@ -7758,8 +7834,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-what@4.1.16: {} - isarray@1.0.0: {} isarray@2.0.5: {} @@ -7792,6 +7866,8 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + js-levenshtein@1.1.6: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -8192,6 +8268,22 @@ snapshots: dependencies: mimic-fn: 2.1.0 + openapi-fetch@0.14.0: + dependencies: + openapi-typescript-helpers: 0.0.15 + + openapi-typescript-helpers@0.0.15: {} + + openapi-typescript@7.8.0(typescript@5.8.3): + dependencies: + '@redocly/openapi-core': 1.34.3(supports-color@10.0.0) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.3.0 + supports-color: 10.0.0 + typescript: 5.8.3 + yargs-parser: 21.1.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -8265,6 +8357,12 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 + type-fest: 4.41.0 + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 @@ -8321,6 +8419,8 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 + pluralize@8.0.0: {} + possible-typed-array-names@1.1.0: {} postcss-js@4.0.1(postcss@8.5.3): @@ -8596,7 +8696,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color @@ -8636,8 +8736,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - remove-accents@0.5.0: {} - remove-trailing-separator@1.1.0: {} replace-ext@2.0.0: {} @@ -8966,7 +9064,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) socks: 2.8.6 transitivePeerDependencies: - supports-color @@ -9157,7 +9255,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.8.3) css-functions-list: 3.2.3 css-tree: 3.1.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 10.1.1 @@ -9195,13 +9293,11 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) transitivePeerDependencies: - supports-color - superjson@1.13.3: - dependencies: - copy-anything: 3.0.5 + supports-color@10.0.0: {} supports-color@7.2.0: dependencies: @@ -9421,6 +9517,8 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js-replace@1.0.1: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -9529,12 +9627,12 @@ snapshots: fast-glob: 3.3.3 magic-string: 0.30.17 - vite-plugin-ejs@1.7.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)): + vite-plugin-ejs@1.7.0(vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0)): dependencies: ejs: 3.1.10 - vite: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2) + vite: 6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0) - vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2): + vite@6.3.5(@types/node@22.15.32)(sass-embedded@1.89.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.2)(yaml@2.8.0): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -9548,6 +9646,7 @@ snapshots: sass-embedded: 1.89.0 sugarss: 4.0.1(postcss@8.5.3) terser: 5.39.2 + yaml: 2.8.0 void-elements@3.1.0: {} @@ -9661,6 +9760,11 @@ snapshots: yallist@4.0.0: {} + yaml-ast-parser@0.0.43: {} + + yaml@2.8.0: + optional: true + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/src/shared/api/subsonic/subsonic-schema.d.ts b/src/shared/api/subsonic/subsonic-schema.d.ts new file mode 100644 index 000000000..4519cdfb6 --- /dev/null +++ b/src/shared/api/subsonic/subsonic-schema.d.ts @@ -0,0 +1,7831 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/rest/addChatMessage": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Adds a message to the chat log. + * @description Adds a message to the chat log. + */ + get: operations["getAddChatMessage"]; + put?: never; + /** + * Adds a message to the chat log. + * @description Adds a message to the chat log. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postAddChatMessage"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/changePassword": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["changePassword"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postChangePassword"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/createBookmark": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["createBookmark"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postCreateBookmark"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/createInternetRadioStation": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Adds a new internet radio station. + * @description Adds a new internet radio station. Only users with admin privileges are allowed to call this method. + */ + get: operations["createInternetRadioStation"]; + put?: never; + /** + * Adds a new internet radio station. + * @description Adds a new internet radio station. Only users with admin privileges are allowed to call this method. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postCreateInternetRadioStation"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/createPlaylist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Creates (or updates) a playlist. + * @description Creates (or updates) a playlist. + */ + get: operations["createPlaylist"]; + put?: never; + /** + * Creates (or updates) a playlist. + * @description Creates (or updates) a playlist. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postCreatePlaylist"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/createPodcastChannel": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["createPodcastChannel"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postCreatePodcastChannel"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/createShare": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["createShare"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`). + */ + post: operations["postCreateShare"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/createUser": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Creates a new user on the server. + * @description Creates a new user on the server. + */ + get: operations["createUser"]; + put?: never; + /** + * Creates a new user on the server. + * @description Creates a new user on the server. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postCreateUser"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deleteBookmark": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Deletes a bookmark. + * @description Deletes a bookmark (a position within a media file). Bookmarks are personal and not visible to other users. + */ + get: operations["deleteBookmark"]; + put?: never; + /** + * Deletes a bookmark. + * @description Deletes a bookmark (a position within a media file). Bookmarks are personal and not visible to other users. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeleteBookmark"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deleteInternetRadioStation": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Deletes an existing internet radio station. + * @description Deletes an existing internet radio station. Only users with admin privileges are allowed to call this method. + */ + get: operations["deleteInternetRadioStation"]; + put?: never; + /** + * Deletes an existing internet radio station. + * @description Deletes an existing internet radio station. Only users with admin privileges are allowed to call this method. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeleteInternetRadioStation"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deletePlaylist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Deletes a saved playlist. + * @description Deletes a saved playlist. + */ + get: operations["deletePlaylist"]; + put?: never; + /** + * Deletes a saved playlist. + * @description Deletes a saved playlist. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeletePlaylist"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deletePodcastChannel": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["deletePodcastChannel"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeletePodcastChannel"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deletePodcastEpisode": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["deletePodcastEpisode"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeletePodcastEpisode"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deleteShare": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Deletes an existing share. + * @description Deletes an existing share + */ + get: operations["deleteShare"]; + put?: never; + /** + * Deletes an existing share. + * @description Deletes an existing share. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeleteShare"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/deleteUser": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Deletes an existing user on the server. + * @description Deletes an existing user on the server. + */ + get: operations["deleteUser"]; + put?: never; + /** + * Deletes an existing user on the server. + * @description Deletes an existing user on the server. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDeleteUser"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/download": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["download"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDownload"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/downloadPodcastEpisode": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["downloadPodcastEpisode"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postDownloadPodcastEpisode"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getAlbum": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns details for an album. + * @description Returns details for an album, including a list of songs. This method organizes music according to ID3 tags. + */ + get: operations["getAlbum"]; + put?: never; + /** + * Returns details for an album. + * @description Returns details for an album, including a list of songs. This method organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetAlbum"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getAlbumInfo": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns album info. + * @description Returns album notes, image URLs etc, using data from last.fm. + */ + get: operations["getAlbumInfo"]; + put?: never; + /** + * Returns album info. + * @description Returns album notes, image URLs etc, using data from last.fm. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetAlbumInfo"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getAlbumInfo2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns album info (v2). + * @description Similar to getAlbumInfo, but organizes music according to ID3 tags. + */ + get: operations["getAlbumInfo2"]; + put?: never; + /** + * Returns album info (v2). + * @description Similar to getAlbumInfo, but organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetAlbumInfo2"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getAlbumList": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getAlbumList"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetAlbumList"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getAlbumList2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns a list of random, newest, highest rated etc. albums (v2). + * @description Similar to `getAlbumList`, but organizes music according to ID3 tags. + */ + get: operations["getAlbumList2"]; + put?: never; + /** + * Returns a list of random, newest, highest rated etc. albums (v2). + * @description Similar to `getAlbumList`, but organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetAlbumList2"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getArtist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns details for an artist. + * @description Returns details for an artist, including a list of albums. This method organizes music according to ID3 tags. + */ + get: operations["getArtist"]; + put?: never; + /** + * Returns details for an artist. + * @description Returns details for an artist, including a list of albums. This method organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetArtist"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getArtistInfo": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns artist info. + * @description Returns artist info with biography, image URLs and similar artists, using data from last.fm. + */ + get: operations["getArtistInfo"]; + put?: never; + /** + * Returns artist info. + * @description Returns artist info with biography, image URLs and similar artists, using data from last.fm. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetArtistInfo"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getArtistInfo2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns artist info (v2). + * @description Similar to `getArtistInfo`, but organizes music according to ID3 tags. + */ + get: operations["getArtistInfo2"]; + put?: never; + /** + * Returns artist info (v2). + * @description Similar to `getArtistInfo`, but organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetArtistInfo2"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getArtists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all artists. + * @description Similar to `getIndexes`, but organizes music according to ID3 tags. + */ + get: operations["getArtists"]; + put?: never; + /** + * Returns all artists. + * @description Similar to `getIndexes`, but organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetArtists"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getAvatar": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns the avatar (personal image) for a user. + * @description Returns the avatar (personal image) for a user. + */ + get: operations["getAvatar"]; + put?: never; + /** + * Returns the avatar (personal image) for a user. + * @description Returns the avatar (personal image) for a user. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetAvatar"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getBookmarks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all bookmarks for this user. + * @description Returns all bookmarks for this user. A bookmark is a position within a certain media file. + */ + get: operations["getBookmarks"]; + put?: never; + /** + * Returns all bookmarks for this user. + * @description Returns all bookmarks for this user. A bookmark is a position within a certain media file. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetBookmarks"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getCaptions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns captions (subtitles) for a video. + * @description Returns captions (subtitles) for a video. Use `getVideoInfo` to get a list of available captions. + */ + get: operations["getCaptions"]; + put?: never; + /** + * Returns captions (subtitles) for a video. + * @description Returns captions (subtitles) for a video. Use `getVideoInfo` to get a list of available captions. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetCaptions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getChatMessages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns the current visible (non-expired) chat messages. + * @description Returns the current visible (non-expired) chat messages. + */ + get: operations["getChatMessages"]; + put?: never; + /** + * Returns the current visible (non-expired) chat messages. + * @description Returns the current visible (non-expired) chat messages. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetChatMessages"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getCoverArt": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns a cover art image. + * @description Returns a cover art image. + */ + get: operations["getCoverArt"]; + put?: never; + /** + * Returns a cover art image. + * @description Returns a cover art image. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetCoverArt"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getGenres": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all genres. + * @description Returns all genres. + */ + get: operations["getGenres"]; + put?: never; + /** + * Returns all genres. + * @description Returns all genres. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetGenres"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getIndexes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns an indexed structure of all artists. + * @description Returns an indexed structure of all artists. + */ + get: operations["getIndexes"]; + put?: never; + /** + * Returns an indexed structure of all artists. + * @description Returns an indexed structure of all artists. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetIndexes"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getInternetRadioStations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all internet radio stations. + * @description Returns all internet radio stations. Takes no extra parameters. + */ + get: operations["getInternetRadioStations"]; + put?: never; + /** + * Returns all internet radio stations. + * @description Returns all internet radio stations. Takes no extra parameters. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetInternetRadioStations"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getLicense": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get details about the software license. + * @description Get details about the software license. + */ + get: operations["getLicense"]; + put?: never; + /** + * Get details about the software license. + * @description Get details about the software license. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetLicense"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getLyrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Searches for and returns lyrics for a given song. + * @description Searches for and returns lyrics for a given song. + */ + get: operations["getLyrics"]; + put?: never; + /** + * Searches for and returns lyrics for a given song. + * @description Searches for and returns lyrics for a given song. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetLyrics"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getLyricsBySongId": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getLyricsBySongId"]; + put?: never; + /** + * 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. + */ + post: operations["postGetLyricsBySongId"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getMusicDirectory": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getMusicDirectory"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetMusicDirectory"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getMusicFolders": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all configured top-level music folders. + * @description Returns all configured top-level music folders. Takes no extra parameters. + */ + get: operations["getMusicFolders"]; + put?: never; + /** + * Returns all configured top-level music folders. + * @description Returns all configured top-level music folders. Takes no extra parameters. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetMusicFolders"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getNewestPodcasts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns the most recently published Podcast episodes. + * @description Returns the most recently published Podcast episodes. + */ + get: operations["getNewestPodcasts"]; + put?: never; + /** + * Returns the most recently published Podcast episodes. + * @description Returns the most recently published Podcast episodes. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetNewestPodcasts"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getNowPlaying": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns what is currently being played by all users. + * @description Returns what is currently being played by all users. Takes no extra parameters. + */ + get: operations["getNowPlaying"]; + put?: never; + /** + * Returns what is currently being played by all users. + * @description Returns what is currently being played by all users. Takes no extra parameters. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetNowPlaying"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getOpenSubsonicExtensions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List the OpenSubsonic extensions supported by this server. + * @description List the OpenSubsonic extensions supported by this server. + */ + get: operations["getOpenSubsonicExtensions"]; + put?: never; + /** + * List the OpenSubsonic extensions supported by this server. + * @description List the OpenSubsonic extensions supported by this server. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetOpenSubsonicExtensions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getPlaylist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns a listing of files in a saved playlist. + * @description Returns a listing of files in a saved playlist. + */ + get: operations["getPlaylist"]; + put?: never; + /** + * Returns a listing of files in a saved playlist. + * @description Returns a listing of files in a saved playlist. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetPlaylist"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getPlaylists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all playlists a user is allowed to play. + * @description Returns all playlists a user is allowed to play. + */ + get: operations["getPlaylists"]; + put?: never; + /** + * Returns all playlists a user is allowed to play. + * @description Returns all playlists a user is allowed to play. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetPlaylists"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getPlayQueue": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["getPlayQueue"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetPlayQueue"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getPlayQueueByIndex": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["getPlayQueueByIndex"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetPlayQueueByIndex"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getPodcastEpisode": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns details for a podcast episode. + * @description OpenSubsonic extension name getPodcastEpisode (As returned by `getOpenSubsonicExtensions`). Returns details for a podcast episode. + */ + get: operations["getPodcastEpisode"]; + put?: never; + /** + * Returns details for a podcast episode. + * @description OpenSubsonic extension name `getPodcastEpisode` (As returned by `getOpenSubsonicExtensions`). Returns details for a podcast episode. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetPodcastEpisode"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getPodcasts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getPodcasts"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetPodcasts"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getRandomSongs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns random songs matching the given criteria. + * @description Returns random songs matching the given criteria. + */ + get: operations["getRandomSongs"]; + put?: never; + /** + * Returns random songs matching the given criteria. + * @description Returns random songs matching the given criteria. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetRandomSongs"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getScanStatus": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns the current status for media library scanning. + * @description Returns the current status for media library scanning. Takes no extra parameters. + */ + get: operations["getScanStatus"]; + put?: never; + /** + * Returns the current status for media library scanning. + * @description Returns the current status for media library scanning. Takes no extra parameters. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetScanStatus"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getShares": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getShares"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetShares"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getSimilarSongs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getSimilarSongs"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetSimilarSongs"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getSimilarSongs2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getSimilarSongs2"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetSimilarSongs2"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getSong": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns details for a song. + * @description Returns details for a song. + */ + get: operations["getSong"]; + put?: never; + /** + * Returns details for a song. + * @description Returns details for a song. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetSong"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getSongsByGenre": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns songs in a given genre. + * @description Returns songs in a given genre. + */ + get: operations["getSongsByGenre"]; + put?: never; + /** + * Returns songs in a given genre. + * @description Returns songs in a given genre. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetSongsByGenre"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getStarred": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns starred songs, albums and artists. + * @description Returns starred songs, albums and artists. + */ + get: operations["getStarred"]; + put?: never; + /** + * Returns starred songs, albums and artists. + * @description Returns starred songs, albums and artists. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetStarred"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getStarred2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns starred songs, albums and artists. + * @description Similar to `getStarred`, but organizes music according to ID3 tags. + */ + get: operations["getStarred2"]; + put?: never; + /** + * Returns starred songs, albums and artists. + * @description Similar to `getStarred`, but organizes music according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetStarred2"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getTopSongs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns top songs for the given artist. + * @description Returns top songs for the given artist, using data from last.fm. + */ + get: operations["getTopSongs"]; + put?: never; + /** + * Returns top songs for the given artist. + * @description Returns top songs for the given artist, using data from last.fm. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetTopSongs"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getUser": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getUser"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetUser"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getUsers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["getUsers"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetUsers"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getVideoInfo": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns details for a video. + * @description Returns details for a video, including information about available audio tracks, subtitles (captions) and conversions. + */ + get: operations["getVideoInfo"]; + put?: never; + /** + * Returns details for a video. + * @description Returns details for a video, including information about available audio tracks, subtitles (captions) and conversions. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetVideoInfo"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/getVideos": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns all video files. + * @description Returns all video files. + */ + get: operations["getVideos"]; + put?: never; + /** + * Returns all video files. + * @description Returns all video files. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postGetVideos"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/hls.m3u8": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["hls.m3u8"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postHls.m3u8"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/jukeboxControl": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["jukeboxControl"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postJukeboxControl"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/ping": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Used to test connectivity with the server. + * @description Test connectivity with the server. + */ + get: operations["ping"]; + put?: never; + /** + * Used to test connectivity with the server. + * @description Test connectivity with the server. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postPing"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/refreshPodcasts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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). + */ + get: operations["refreshPodcasts"]; + put?: never; + /** + * 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). + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postRefreshPodcasts"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/savePlayQueue": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["savePlayQueue"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postSavePlayQueue"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/savePlayQueueByIndex": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["savePlayQueueByIndex"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postSavePlayQueueByIndex"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/scrobble": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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: + * + * * “Scrobbles” the media files on last.fm if the user has configured his/her last.fm credentials on the server. + * * Updates the play count and last played timestamp for the media files. (Since 1.11.0) + * * 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) + * + * Since 1.8.0 you may specify multiple id (and optionally time) parameters to scrobble multiple files. + */ + get: operations["scrobble"]; + put?: never; + /** + * 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: + * + * * “Scrobbles” the media files on last.fm if the user has configured his/her last.fm credentials on the server. + * * Updates the play count and last played timestamp for the media files. (Since 1.11.0) + * * 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) + * + * Since 1.8.0 you may specify multiple id (and optionally time) parameters to scrobble multiple files. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postScrobble"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/search": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns a listing of files matching the given search criteria. Supports paging through the result. + * @deprecated + * @description Deprecated since 1.4.0, use search2 instead. + * + * Returns a listing of files matching the given search criteria. Supports paging through the result. + */ + get: operations["search"]; + put?: never; + /** + * Returns a listing of files matching the given search criteria. Supports paging through the result. + * @deprecated + * @description Deprecated since 1.4.0, use search2 instead. + * + * Returns a listing of files matching the given search criteria. Supports paging through the result. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postSearch"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/search2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["search2"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postSearch2"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/search3": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + * + * Music is organized according to ID3 tags. + */ + get: operations["search3"]; + put?: never; + /** + * 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. + * + * Music is organized according to ID3 tags. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postSearch3"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/setRating": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Sets the rating for a music file. + * @description Sets the rating for a music file. + */ + get: operations["setRating"]; + put?: never; + /** + * Sets the rating for a music file. + * @description Sets the rating for a music file. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postSetRating"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/star": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Attaches a star to a song, album or artist. + * @description Attaches a star to a song, album or artist. + */ + get: operations["star"]; + put?: never; + /** + * Attaches a star to a song, album or artist. + * @description Attaches a star to a song, album or artist. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postStar"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/startScan": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Initiates a rescan of the media libraries. + * @description Initiates a rescan of the media libraries. Takes no extra parameters. + */ + get: operations["startScan"]; + put?: never; + /** + * Initiates a rescan of the media libraries. + * @description Initiates a rescan of the media libraries. Takes no extra parameters. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postStartScan"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/stream": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Streams a given media file. + * @description Streams a given media file. + * + * OpenSubsonic 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. + * + * If the server support the Transcode Offet extension, then it must accept the timeOffset parameter for music too. + */ + get: operations["stream"]; + put?: never; + /** + * Streams a given media file. + * @description Streams a given media file. + * + * OpenSubsonic 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. + * + * If the server supports the Transcode Offset extension, then it must accept the timeOffset parameter for music too. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postStream"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/tokenInfo": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns information about an API key + * @description OpenSubsonic extension name `apiKeyAuthentication` (As returned by `getOpenSubsonicExtensions`). Returns data about an API key. + */ + get: operations["tokenInfo"]; + put?: never; + /** + * Returns information about an API key + * @description OpenSubsonic extension name `apiKeyAuthentication` (As returned by `getOpenSubsonicExtensions`). Returns data about an API key. + */ + post: operations["postTokenInfo"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/unstar": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Removes a star to a song, album or artist. + * @description Removes a star to a song, album or artist. + */ + get: operations["unstar"]; + put?: never; + /** + * Removes a star to a song, album or artist. + * @description Removes a star to a song, album or artist. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postUnstar"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/updateInternetRadioStation": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Updates an existing internet radio station. + * @description Updates an existing internet radio station. Only users with admin privileges are allowed to call this method. + */ + get: operations["updateInternetRadioStation"]; + put?: never; + /** + * Updates an existing internet radio station. + * @description Updates an existing internet radio station. Only users with admin privileges are allowed to call this method. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postUpdateInternetRadioStation"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/updatePlaylist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["updatePlaylist"]; + put?: never; + /** + * 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. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postUpdatePlaylist"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/updateShare": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Updates the description and/or expiration date for an existing share. + * @description Updates the description and/or expiration date for an existing share. + */ + get: operations["updateShare"]; + put?: never; + /** + * Updates the description and/or expiration date for an existing share. + * @description Updates the description and/or expiration date for an existing share. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postUpdateShare"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/rest/updateUser": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Modifies an existing user on the server. + * @description Modifies an existing user on the server. + */ + get: operations["updateUser"]; + put?: never; + /** + * Modifies an existing user on the server. + * @description Modifies an existing user on the server. + * + * Requires OpenSubsonic extension name `formPost` (As returned by `getOpenSubsonicExtensions`) + */ + post: operations["postUpdateUser"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** @example { + * "code": 42, + * "message": "Authentication mechanism not supported. Use API keys", + * "helpUrl": "https://example.org/users/apiKey" + * } */ + SubsonicError: { + /** + * @description The error code. + * * 0: A generic error. + * * 10: Required parameter is missing. + * * 20: Incompatible Subsonic REST protocol version. Client must upgrade. + * * 30: Incompatible Subsonic REST protocol version. Server must upgrade. + * * 40: Wrong username or password. + * * 41: Token authentication not supported for LDAP users. + * * 42: Provided authentication mechanism not supported. + * * 43: Multiple conflicting authentication mechanisms provided. + * * 44: Invalid API key. + * * 50: User is not authorized for the given operation. + * * 60: The trial period for the Subsonic server is over. Please upgrade to Subsonic Premium. Visit subsonic.org for details. + * * 70: The requested data was not found. + * @enum {integer} + */ + code: 0 | 10 | 20 | 30 | 40 | 41 | 42 | 43 | 44 | 50 | 60 | 70; + /** @description The optional error message */ + message?: string; + /** @description A URL (documentation, configuration, etc) which may provide additional context for the error) */ + helpUrl?: string; + }; + SubsonicBaseResponse: { + /** @description The server supported Subsonic API version. */ + version: string; + /** @description The server actual name. [Ex: Navidrome or gonic] */ + type: string; + /** @description The server version. */ + serverVersion: string; + /** @description Must return true if the server support OpenSubsonic API v1 */ + openSubsonic: boolean; + }; + SubsonicSuccessResponse: components["schemas"]["SubsonicBaseResponse"] & { + /** + * @description The command result. `ok` + * @enum {string} + */ + status: "ok"; + }; + SubsonicFailureResponse: components["schemas"]["SubsonicBaseResponse"] & { + /** + * @description The command result. `failed` + * @enum {string} + */ + status: "failed"; + error: components["schemas"]["SubsonicError"]; + }; + /** @description Common answer wrapper. */ + SubsonicResponse: { + "subsonic-response"?: components["schemas"]["SubsonicSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A genre returned in list of genres for an item. */ + ItemGenre: { + /** @description Genre name */ + name: string; + }; + /** @description An artist from ID3 tags. */ + ArtistID3: { + /** @description The id of the artist */ + id: string; + /** @description The artist name. */ + name: string; + /** @description A covertArt id. */ + coverArt?: string; + /** @description An url to an external image source. */ + artistImageUrl?: string; + /** @description Artist album count. */ + albumCount?: number; + /** + * Format: date-time + * @description Date the artist was starred. [ISO 8601] + */ + starred?: string; + /** @description The artist MusicBrainzID. */ + musicBrainzId?: string; + /** @description The artist sort name. */ + sortName?: string; + /** @description The list of all roles this artist has in the library. */ + roles?: string[]; + }; + /** @description A contributor artist for a song or an album */ + Contributor: { + /** @description The contributor role. */ + role: 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. */ + subRole?: string; + artist: components["schemas"]["ArtistID3"]; + }; + /** @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) */ + ReplayGain: { + /** @description The track replay gain value. (In Db) */ + trackGain?: number; + /** @description The album replay gain value. (In Db) */ + albumGain?: number; + /** @description The track peak value. (Must be positive) */ + trackPeak?: number; + /** @description The album peak value. (Must be positive) */ + albumPeak?: number; + /** @description The base gain value. (In Db) (Ogg Opus Output Gain for example) */ + baseGain?: 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.) */ + fallbackGain?: number; + }; + /** + * @description The generic type of media [music/podcast/audiobook/video] + * @enum {string} + */ + GenericMediaType: "music" | "video" | "podcast" | "audiobook"; + /** + * @description Note: If you support `musicBrainzId` you must support this field to ensure clients knows what the ID refers to. + * @enum {string} + */ + MediaType: "song" | "album" | "artist"; + /** + * @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) + * @enum {string} + */ + ExplicitStatus: "clean" | "explicit" | ""; + /** @description A media. */ + Child: { + /** @description The id of the media. */ + id: string; + /** @description The id of the parent (folder/album) */ + parent?: string; + /** @description The media is a directory */ + isDir: boolean; + /** @description The media name. */ + title: string; + /** @description The album name. */ + album?: string; + /** @description The artist name. */ + artist?: string; + /** @description The track number. */ + track?: number; + /** @description The media year. */ + year?: number; + /** @description The media genre */ + genre?: string; + /** @description The coverArt id. */ + coverArt?: string; + /** @description A file size of the media. */ + size?: number; + /** @description The mimeType of the media. */ + contentType?: string; + /** @description The file suffix of the media. */ + suffix?: string; + /** @description The transcoded mediaType if transcoding should happen. */ + transcodedContentType?: string; + /** @description The file suffix of the transcoded media. */ + transcodedSuffix?: string; + /** @description The duration of the media in seconds. */ + duration?: number; + /** @description The bitrate of the media. */ + bitRate?: number; + /** @description The bit depth of the media. */ + bitDepth?: number; + /** @description The sampling rate of the media. */ + samplingRate?: number; + /** @description The number of channels of the media. */ + channelCount?: number; + /** @description The full path of the media. */ + path?: string; + /** @description Media is a video */ + isVideo?: boolean; + /** @description The user rating of the media [1-5] */ + userRating?: number; + /** @description The average rating of the media [1.0-5.0] */ + averageRating?: number; + /** @description The play count. */ + playCount?: number; + /** @description The disc number. */ + discNumber?: number; + /** + * Format: date-time + * @description Date the media was created. [ISO 8601] + */ + created?: string; + /** + * Format: date-time + * @description Date the media was starred. [ISO 8601] + */ + starred?: string; + /** @description The corresponding album id */ + albumId?: string; + /** @description The corresponding artist id */ + artistId?: string; + type?: components["schemas"]["GenericMediaType"]; + mediaType?: components["schemas"]["MediaType"]; + /** @description The bookmark position in seconds */ + bookmarkPosition?: number; + /** @description The video original Width */ + originalWidth?: number; + /** @description The video original Height */ + originalHeight?: number; + /** + * Format: date-time + * @description Date the album was last played. [ISO 8601] + */ + played?: string; + /** @description The BPM of the song. */ + bpm?: number; + /** @description The comment tag of the song. */ + comment?: string; + /** @description The song sort name. */ + sortName?: string; + /** @description The track MusicBrainzID. */ + musicBrainzId?: string; + /** + * @description The track ISRC(s). + * @example [ + * "USSM18300073", + * "DELV42300297" + * ] + */ + isrc?: string[]; + /** @description The list of all genres of the song. */ + genres?: components["schemas"]["ItemGenre"][]; + /** @description The list of all song artists of the song. (Note: Only the required `ArtistID3` fields should be returned by default) */ + artists?: components["schemas"]["ArtistID3"][]; + /** @description The single value display artist. */ + displayArtist?: string; + /** @description The list of all album artists of the song. (Note: Only the required `ArtistID3` fields should be returned by default) */ + albumArtists?: components["schemas"]["ArtistID3"][]; + /** @description The single value display album artist. */ + displayAlbumArtist?: string; + /** @description The list of all contributor artists of the song. */ + contributors?: components["schemas"]["Contributor"][]; + /** @description The single value display composer. */ + displayComposer?: string; + /** @description The list of all moods of the song. */ + moods?: string[]; + /** @description The replay gain data of the song. */ + replayGain?: components["schemas"]["ReplayGain"]; + explicitStatus?: components["schemas"]["ExplicitStatus"]; + }; + /** @description Playlist. */ + Playlist: { + /** @description Id of the playlist */ + id: string; + /** @description Name of the playlist */ + name: string; + /** @description A comment */ + comment?: string; + /** @description Owner of the playlist */ + owner?: string; + /** @description Is the playlist public */ + public?: boolean; + /** @description number of songs */ + songCount: number; + /** @description Playlist duration in seconds */ + duration: number; + /** + * Format: date-time + * @description Creation date [ISO 8601] + */ + created: string; + /** + * Format: date-time + * @description Last changed date [ISO 8601] + */ + changed: string; + /** @description A cover Art Id */ + coverArt?: string; + /** @description A list of allowed usernames */ + allowedUser?: string[]; + }; + PlaylistWithSongs: components["schemas"]["Playlist"] & { + /** @description The list of songs */ + entry?: components["schemas"]["Child"][]; + }; + CreatePlaylistSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + playlist: components["schemas"]["PlaylistWithSongs"]; + }; + /** @description A subsonic-response element with a nested playlist element on success. */ + CreatePlaylistResponse: { + "subsonic-response"?: components["schemas"]["CreatePlaylistSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Share. */ + Share: { + /** @description The share Id */ + id: string; + /** @description The share url */ + url: string; + /** @description A description */ + description?: string; + /** @description The username */ + username: string; + /** + * Format: date-time + * @description Creation date [ISO 8601] + */ + created: string; + /** + * Format: date-time + * @description Share expiration [ISO 8601] + */ + expires?: string; + /** + * Format: date-time + * @description Last visit [ISO 8601] + */ + lastVisited?: string; + /** @description Visit count */ + visitCount: number; + /** @description A list of share */ + entry?: components["schemas"]["Child"][]; + }; + /** @description Shares. */ + Shares: { + /** @description A list of share */ + share?: components["schemas"]["Share"][]; + }; + CreateSharesSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + shares: components["schemas"]["Shares"]; + }; + /** @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 */ + CreateSharesResponse: { + "subsonic-response"?: components["schemas"]["CreateSharesSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A record label for an album. */ + RecordLabel: { + name: string; + }; + /** @description A date for a media item that may be just a year, or year-month, or full date. */ + ItemDate: { + /** @description The year */ + year?: number; + /** @description The month (1-12) */ + month?: number; + /** @description The day (1-31) */ + day?: number; + }; + /** @description A disc title for an album */ + DiscTitle: { + /** @description The disc number. */ + disc: number; + /** @description The name of the disc. */ + title: string; + }; + /** @description Album with songs. */ + AlbumID3: { + /** @description The id of the album */ + id: string; + /** @description The album name. */ + name: string; + /** @description The album version name (Remastered, Anniversary Box Set, …). */ + version?: string; + /** @description Artist name. */ + artist?: string; + /** @description The id of the artist */ + artistId?: string; + /** @description A covertArt id. */ + coverArt?: string; + /** @description Number of songs */ + songCount: number; + /** @description Total duration of the album in seconds */ + duration: number; + /** @description Number of play of the album */ + playCount?: number; + /** + * Format: date-time + * @description Date the album was added. [ISO 8601] + */ + created: string; + /** + * Format: date-time + * @description Date the album was added. [ISO 8601] + */ + starred?: string; + /** @description The album year */ + year?: number; + /** @description The album genre */ + genre?: string; + /** + * Format: date-time + * @description Date the album was last played. [ISO 8601] + */ + played?: string; + /** @description The user rating of the album. [1-5] */ + userRating?: number; + /** @description The labels producing the album. */ + recordLabels?: components["schemas"]["RecordLabel"][]; + /** @description The album MusicBrainzID. */ + musicBrainzId?: string; + /** @description The list of all genres of the album. */ + genres?: components["schemas"]["ItemGenre"][]; + /** @description The list of all album artists of the album. */ + artists?: components["schemas"]["ArtistID3"][]; + /** @description The single value display artist. */ + displayArtist?: string; + /** @description The types of this album release. (Album, Compilation, EP, Remix, …). */ + releaseTypes?: string[]; + /** @description The list of all moods of the album. */ + moods?: string[]; + /** @description The album sort name. */ + sortName?: string; + /** @description Date the album was originally released. */ + originalReleaseDate?: 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. */ + releaseDate?: components["schemas"]["ItemDate"]; + /** @description True if the album is a compilation. */ + isCompilation?: boolean; + explicitStatus?: components["schemas"]["ExplicitStatus"]; + /** @description The list of all disc titles of the album. */ + discTitles?: components["schemas"]["DiscTitle"][]; + /** @description The list of songs */ + song?: components["schemas"]["Child"][]; + }; + AlbumID3WithSongs: components["schemas"]["AlbumID3"] & { + /** @description The list of songs */ + song: components["schemas"]["Child"][]; + }; + GetAlbumSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + album: components["schemas"]["AlbumID3WithSongs"]; + }; + /** @description A subsonic-response element with a nested album element on success. */ + GetAlbumResponse: { + "subsonic-response"?: components["schemas"]["GetAlbumSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Album info. */ + AlbumInfo: { + /** @description Album notes */ + notes?: string; + /** @description Album musicBrainzId */ + musicBrainzId?: string; + /** @description Album lastFmUrl */ + lastFmUrl?: string; + /** @description Album smallImageUrl */ + smallImageUrl?: string; + /** @description Album mediumImageUrl */ + mediumImageUrl?: string; + /** @description Album largeImageUrl */ + largeImageUrl?: string; + }; + GetAlbumInfoSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + albumInfo: components["schemas"]["AlbumInfo"]; + }; + /** @description A subsonic-response element with a nested albumInfo element on success. */ + GetAlbumInfoResponse: { + "subsonic-response"?: components["schemas"]["GetAlbumInfoSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** + * @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 {string} + */ + AlbumListType: "random" | "newest" | "highest" | "frequent" | "recent" | "alphabeticalByName" | "alphabeticalByArtist" | "starred" | "byYear" | "byGenre"; + /** @description Album list. */ + AlbumList: { + /** @description Artist albums */ + album?: components["schemas"]["Child"][]; + }; + GetAlbumListSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + albumList: components["schemas"]["AlbumList"]; + }; + /** @description A subsonic-response element with a nested albumList element on success. */ + GetAlbumListResponse: { + "subsonic-response"?: components["schemas"]["GetAlbumListSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + AlbumList2: { + /** @description Artist albums */ + album?: components["schemas"]["AlbumID3"][]; + }; + GetAlbumList2SuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + albumList2: components["schemas"]["AlbumList"]; + }; + /** @description A subsonic-response element with a nested albumList2 element on success. */ + GetAlbumList2Response: { + "subsonic-response"?: components["schemas"]["GetAlbumList2SuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + ArtistWithAlbumsID3: components["schemas"]["ArtistID3"] & { + /** @description Artist albums */ + album: components["schemas"]["AlbumID3"][]; + }; + GetArtistSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + artist: components["schemas"]["ArtistWithAlbumsID3"]; + }; + /** @description A subsonic-response element with a nested artist element on success. */ + GetArtistResponse: { + "subsonic-response"?: components["schemas"]["GetArtistSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Artist details. */ + Artist: { + /** @description Artist id */ + id: string; + /** @description Artist name */ + name: string; + /** @description Artist image url */ + artistImageUrl?: string; + /** + * Format: date-time + * @description Artist starred date [ISO 8601] + */ + starred?: string; + /** @description Artist rating [1-5] */ + userRating?: number; + /** @description Artist average rating [1.0-5.0] */ + averageRating?: number; + }; + /** @description Artist info. */ + ArtistInfo: { + /** @description Artist biography */ + biography?: string; + /** @description Artist musicBrainzId */ + musicBrainzId?: string; + /** @description Artist lastFmUrl */ + lastFmUrl?: string; + /** @description Artist smallImageUrl */ + smallImageUrl?: string; + /** @description Artist mediumImageUrl */ + mediumImageUrl?: string; + /** @description Artist largeImageUrl */ + largeImageUrl?: string; + /** @description Similar artists */ + similarArtist?: components["schemas"]["Artist"][]; + }; + GetArtistInfoSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + artistInfo: components["schemas"]["ArtistInfo"]; + }; + /** @description A subsonic-response element with a nested artistInfo element on success. */ + GetArtistInfoResponse: { + "subsonic-response"?: components["schemas"]["GetArtistInfoSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Artist info. */ + ArtistInfo2: { + /** @description Artist biography */ + biography?: string; + /** @description Artist musicBrainzId */ + musicBrainzId?: string; + /** @description Artist lastFmUrl */ + lastFmUrl?: string; + /** @description Artist smallImageUrl */ + smallImageUrl?: string; + /** @description Artist mediumImageUrl */ + mediumImageUrl?: string; + /** @description Artist largeImageUrl */ + largeImageUrl?: string; + /** @description Similar artists */ + similarArtist?: components["schemas"]["ArtistID3"][]; + }; + GetArtistInfo2SuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + artistInfo2: components["schemas"]["ArtistInfo2"]; + }; + /** @description A subsonic-response element with a nested artistInfo2 element on success. */ + GetArtistInfo2Response: { + "subsonic-response"?: components["schemas"]["GetArtistInfo2SuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A list of indexed Artists. */ + ArtistsID3: { + /** @description List of ignored articles space separated */ + ignoredArticles?: string; + /** @description Index list */ + index?: components["schemas"]["ArtistID3"][]; + }; + GetArtistsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + artists: components["schemas"]["ArtistsID3"]; + }; + /** @description A subsonic-response element with a nested artists element on success. */ + GetArtistsResponse: { + "subsonic-response"?: components["schemas"]["GetArtistsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A bookmark. */ + Bookmark: { + /** @description Bookmark position in seconds */ + position: number; + /** @description Username */ + username: string; + /** @description Bookmark comment */ + comment?: string; + /** + * Format: date-time + * @description Bookmark creation date [ISO 8601] + */ + created: string; + /** + * Format: date-time + * @description Bookmark last updated date [ISO 8601] + */ + changed: string; + /** @description The bookmark file */ + entry: components["schemas"]["Child"]; + }; + /** @description Bookmarks list. */ + Bookmarks: { + /** @description List of bookmark */ + bookmark?: components["schemas"]["Bookmark"][]; + }; + GetBookmarksSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + bookmarks: components["schemas"]["Bookmarks"]; + }; + /** @description A subsonic-response element with a nested bookmarks element on success. */ + GetBookmarksResponse: { + "subsonic-response"?: components["schemas"]["GetBookmarksSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A chatMessage. */ + ChatMessage: { + /** @description Username */ + username: string; + /** @description Time in millis since Jan 1 1970 */ + time: number; + /** @description The message */ + message: string; + }; + /** @description Chat messages list. */ + ChatMessages: { + /** @description List of chatMessage */ + chatMessage?: components["schemas"]["ChatMessage"][]; + }; + GetChatMessagesSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + chatMessages: components["schemas"]["ChatMessages"]; + }; + /** @description A subsonic-response element with a nested chatMessages element on success. */ + GetChatMessagesResponse: { + "subsonic-response"?: components["schemas"]["GetChatMessagesSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A genre. */ + Genre: { + /** @description Genre name */ + value: string; + /** @description Genre song count */ + songCount: number; + /** @description Genre album count */ + albumCount: number; + }; + /** @description Genres list. */ + Genres: { + /** @description List of genre */ + genre?: components["schemas"]["Genre"][]; + }; + GetGenresSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + genres: components["schemas"]["Genres"]; + }; + /** @description A subsonic-response element with a nested genres element on success. */ + GetGenresResponse: { + "subsonic-response"?: components["schemas"]["GetGenresSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description An indexed artist list. */ + Index: { + /** @description Index name */ + name: string; + /** @description Artist list */ + artist?: components["schemas"]["Artist"][]; + }; + /** @description Artist list. */ + Indexes: { + /** @description The ignored articles */ + ignoredArticles: string; + /** @description Last time the index was modified in milliseconds after January 1, 1970 UTC */ + lastModified: number; + /** @description Shortcut */ + shortcut?: components["schemas"]["Artist"][]; + /** @description Array of children */ + child?: components["schemas"]["Child"][]; + /** @description Indexed artists */ + index?: components["schemas"]["Index"][]; + }; + GetIndexesSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + indexes: components["schemas"]["Indexes"]; + }; + /** @description A subsonic-response element with a nested indexes element on success. */ + GetIndexesResponse: { + "subsonic-response"?: components["schemas"]["GetIndexesSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description An internetRadioStation. */ + InternetRadioStation: { + /** @description The Id */ + id: string; + /** @description The name */ + name: string; + /** @description The streamUrl */ + streamUrl: string; + /** @description Genre name */ + homePageUrl?: string; + }; + /** @description internetRadioStations. */ + InternetRadioStations: { + /** @description A list of internetRadioStation */ + internetRadioStation?: components["schemas"]["InternetRadioStation"][]; + }; + GetInternetRadioStationsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + internetRadioStations: components["schemas"]["InternetRadioStations"]; + }; + /** @description A subsonic-response element with a nested internetRadioStations element on success. */ + GetInternetRadioStationsResponse: { + "subsonic-response"?: components["schemas"]["GetInternetRadioStationsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description getLicense result. */ + License: { + /** @description The status of the license */ + valid: boolean; + /** @description User email */ + email?: string; + /** + * Format: date-time + * @description End of license date. [ISO 8601] + */ + licenseExpires?: string; + /** + * Format: date-time + * @description End of trial date. [ISO 8601] + */ + trialExpires?: string; + }; + GetLicenseSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + license: components["schemas"]["License"]; + }; + /** @description A subsonic-response element with a nested license element on success. */ + GetLicenseResponse: { + "subsonic-response"?: components["schemas"]["GetLicenseSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Lyrics. */ + Lyrics: { + /** @description The lyrics */ + value: string; + /** @description The artist name */ + artist?: string; + /** @description The song title */ + title?: string; + }; + GetLyricsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + lyrics: components["schemas"]["Lyrics"]; + }; + /** @description A subsonic-response element with a nested lyrics element on success. */ + GetLyricsResponse: { + "subsonic-response"?: components["schemas"]["GetLyricsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description One line of a song lyric */ + Line: { + /** @description The actual text of this line */ + value: string; + /** @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 */ + start?: number; + }; + /** @description Structured lyrics */ + StructuredLyrics: { + /** @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. + * + * Furthermore, 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). */ + lang: string; + /** @description True if the lyrics are synced, false otherwise */ + synced: boolean; + /** @description The actual lyrics. Ordered by start time (synced) or appearance order (unsynced) */ + line: components["schemas"]["Line"][]; + /** @description The artist name to display. This could be the localized name, or any other value */ + displayArtist?: string; + /** @description The title to display. This could be the song title (localized), or any other value */ + displayTitle?: string; + /** @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 */ + offset?: number; + }; + /** @description List of structured lyrics */ + LyricsList: { + /** @description Structured lyrics. There can be multiple lyrics of the same type with the same language */ + structuredLyrics?: components["schemas"]["StructuredLyrics"][]; + }; + GetLyricsBySongIdSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + lyricsList: components["schemas"]["LyricsList"]; + }; + /** @description A subsonic-response element with a nested lyricsList */ + GetLyricsBySongIdResponse: { + "subsonic-response"?: components["schemas"]["GetLyricsBySongIdSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Directory. */ + Directory: { + /** @description The id */ + id: string; + /** @description Parent item */ + parent?: string; + /** @description The directory name */ + name: string; + /** + * Format: date-time + * @description Starred date [ISO 8601] + */ + starred?: string; + /** @description The user rating [1-5] */ + userRating?: number; + /** @description The average rating [1-5] */ + averageRating?: number; + /** @description The play count */ + playCount?: number; + /** @description The directory content */ + child?: components["schemas"]["Child"][]; + }; + GetMusicDirectorySuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + directory: components["schemas"]["Directory"]; + }; + /** @description A subsonic-response element with a nested directory element on success. */ + GetMusicDirectoryResponse: { + "subsonic-response"?: components["schemas"]["GetMusicDirectorySuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description MusicFolder. */ + MusicFolder: { + /** @description The id */ + id: number; + /** @description The folder name */ + name?: string; + }; + /** @description MusicFolders. */ + MusicFolders: { + /** @description The folders */ + musicFolder?: components["schemas"]["MusicFolder"][]; + }; + GetMusicFoldersSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + musicFolders: components["schemas"]["MusicFolders"]; + }; + /** @description A subsonic-response element with a nested musicFolders element on success. */ + GetMusicFoldersResponse: { + "subsonic-response"?: components["schemas"]["GetMusicFoldersSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** + * @description An enumeration of possible podcast statuses + * @enum {string} + */ + PodcastStatus: "new" | "downloading" | "completed" | "error" | "deleted" | "skipped"; + PodcastEpisode: components["schemas"]["Child"] & { + /** @description ID used for streaming podcast */ + streamId?: string; + /** @description TID of the podcast channel */ + channelId: string; + /** @description Episode description */ + description?: string; + status: components["schemas"]["PodcastStatus"]; + /** + * Format: date-time + * @description Date the episode was published [ISO 8601] + */ + publishDate?: string; + }; + /** @description NewestPodcasts. */ + NewestPodcasts: { + episode?: components["schemas"]["PodcastEpisode"][]; + }; + GetNewestPodcastsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + newestPodcasts: components["schemas"]["NewestPodcasts"]; + }; + /** @description A subsonic-response element with a nested `newestPodcasts` element on success. */ + GetNewestPodcastsResponse: { + "subsonic-response"?: components["schemas"]["GetNewestPodcastsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + NowPlayingEntry: components["schemas"]["Child"] & { + /** @description The username */ + username: string; + /** @description Last update */ + minutesAgo: number; + /** @description Player Id */ + playerId: number; + /** @description Player name */ + playerName?: string; + }; + /** @description nowPlaying. */ + NowPlaying: { + /** @description The now playing entries */ + entry: components["schemas"]["NowPlayingEntry"][]; + }; + GetNowPlayingSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + nowPlaying: components["schemas"]["NowPlaying"]; + }; + /** @description A subsonic-response element with a nested `nowPlaying` element on success. */ + GetNowPlayingResponse: { + "subsonic-response"?: components["schemas"]["GetNowPlayingSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A supported OpenSubsonic API extension. */ + OpenSubsonicExtension: { + /** @description The name of the extension. */ + name: string; + /** @description The list of supported versions of the this extension. */ + versions: number[]; + }; + GetOpenSubsonicExtensionsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + openSubsonicExtensions: components["schemas"]["OpenSubsonicExtension"][]; + }; + /** @description A subsonic-response element with a nested `openSubsonicExtensions` element on success. */ + GetOpenSubsonicExtensionsResponse: { + "subsonic-response"?: components["schemas"]["GetOpenSubsonicExtensionsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + GetPlaylistSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + playlist: components["schemas"]["PlaylistWithSongs"]; + }; + /** @description A subsonic-response element with a nested playlist element on success. */ + GetPlaylistResponse: { + "subsonic-response"?: components["schemas"]["GetPlaylistSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Playlists. */ + Playlists: { + /** @description The playlists */ + playlist?: components["schemas"]["Playlist"][]; + }; + GetPlaylistsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + playlists: components["schemas"]["Playlists"]; + }; + /** @description A subsonic-response element with a nested `playlists` element on success. */ + GetPlaylistsResponse: { + "subsonic-response"?: components["schemas"]["GetPlaylistsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description NowPlayingEntry. */ + PlayQueue: { + /** @description ID of currently playing track */ + current?: string; + /** @description Position in milliseconds of currently playing track */ + position?: number; + /** @description The user this queue belongs to */ + username: string; + /** + * Format: date-time + * @description Date modified [ISO 8601] + */ + changed: string; + /** @description Name of client app */ + changedBy: string; + /** @description The list of songs in the queue */ + entry?: components["schemas"]["Child"][]; + }; + /** @description NowPlayingEntry with queue index. */ + PlayQueueByIndex: { + /** @description index of currently playing track */ + currentIndex?: number; + /** @description Position in milliseconds of currently playing track */ + position?: number; + /** @description The user this queue belongs to */ + username: string; + /** + * Format: date-time + * @description Date modified [ISO 8601] + */ + changed: string; + /** @description Name of client app */ + changedBy: string; + /** @description The list of songs in the queue */ + entry?: components["schemas"]["Child"][]; + }; + GetPlayQueueSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + playQueue: components["schemas"]["PlayQueue"]; + }; + /** @description A subsonic-response element with a nested `playQueue` element on success. */ + GetPlayQueueResponse: { + "subsonic-response"?: components["schemas"]["GetPlayQueueSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + GetPlayQueueByIndexSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + playQueueByIndex: components["schemas"]["PlayQueueByIndex"]; + }; + /** @description A subsonic-response element with a nested `PlayQueueByIndex` element on success. */ + GetPlayQueueByIndexResponse: { + "subsonic-response"?: components["schemas"]["GetPlayQueueByIndexSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + GetPodcastEpisodeSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + podcastEpisode: components["schemas"]["PodcastEpisode"]; + }; + /** @description A subsonic-response element with a nested `podcastEpisode` element on success. */ + GetPodcastEpisodeResponse: { + "subsonic-response"?: components["schemas"]["GetPodcastEpisodeSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description A Podcast channel */ + PodcastChannel: { + /** @description The channel ID */ + id: string; + /** @description Podcast channel URL */ + url: string; + /** @description The channel title */ + title?: string; + /** @description The channel description */ + description?: string; + /** @description ID used for retrieving cover art */ + coverArt?: string; + /** @description URL for original image of podcast channel */ + originalImageUrl?: string; + status: components["schemas"]["PodcastStatus"]; + /** @description An error message */ + errorMessage?: string; + /** @description Podcast episodes with this channel */ + episode?: components["schemas"]["PodcastEpisode"][]; + }; + /** @description Podcasts. */ + Podcasts: { + /** @description Podcast channel(s) */ + channel?: components["schemas"]["PodcastChannel"][]; + }; + GetPodcastsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + podcasts: components["schemas"]["Podcasts"]; + }; + /** @description A subsonic-response element with a nested `podcasts` element on success. */ + GetPodcastsResponse: { + "subsonic-response"?: components["schemas"]["GetPodcastsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Songs list. */ + Songs: { + /** @description List of songs */ + song?: components["schemas"]["Child"][]; + }; + GetRandomSongsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + randomSongs: components["schemas"]["Songs"]; + }; + /** @description A subsonic-response element with a nested `randomSongs` element on success. */ + GetRandomSongsResponse: { + "subsonic-response"?: components["schemas"]["GetRandomSongsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Scan status information. */ + ScanStatus: { + /** @description The status of the scan */ + scanning: boolean; + /** @description Scanned item count */ + count?: number; + }; + GetScanStatusSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + scanStatus: components["schemas"]["ScanStatus"]; + }; + /** @description A subsonic-response element with a nested `scanStatus` element on success. */ + GetScanStatusResponse: { + "subsonic-response"?: components["schemas"]["GetScanStatusSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + GetSharesSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + shares: components["schemas"]["Shares"]; + }; + /** @description A subsonic-response element with a nested `shares` element on success. */ + GetSharesResponse: { + "subsonic-response"?: components["schemas"]["GetSharesSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description SimilarSongs list. */ + SimilarSongs: { + /** @description List of songs */ + song?: components["schemas"]["Child"][]; + }; + GetSimilarSongsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + similarSongs: components["schemas"]["SimilarSongs"]; + }; + /** @description A subsonic-response element with a nested `similarSongs` element on success. */ + GetSimilarSongsResponse: { + "subsonic-response"?: components["schemas"]["GetSimilarSongsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description SimilarSongs2 list. */ + SimilarSongs2: { + /** @description List of songs */ + song?: components["schemas"]["Child"][]; + }; + GetSimilarSongs2SuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + similarSongs2: components["schemas"]["SimilarSongs2"]; + }; + /** @description A subsonic-response element with a nested `similarSongs2` element on success. */ + GetSimilarSongs2Response: { + "subsonic-response"?: components["schemas"]["GetSimilarSongs2SuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + GetSongSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + song: components["schemas"]["Child"]; + }; + /** @description A subsonic-response element with a nested `song` element on success. */ + GetSongResponse: { + "subsonic-response"?: components["schemas"]["GetSongSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + GetSongsByGenreSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + songsByGenre: components["schemas"]["Songs"]; + }; + /** @description A subsonic-response element with a nested `songsByGenre` element on success. */ + GetSongsByGenreResponse: { + "subsonic-response"?: components["schemas"]["GetSongsByGenreSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description starred. */ + Starred: { + /** @description Starred artists */ + artist?: components["schemas"]["Artist"][]; + /** @description Starred albums */ + album?: components["schemas"]["Child"][]; + /** @description Starred songs */ + song?: components["schemas"]["Child"][]; + }; + GetStarredSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + starred: components["schemas"]["Starred"]; + }; + /** @description A subsonic-response element with a nested `starred` element on success. */ + GetStarredResponse: { + "subsonic-response"?: components["schemas"]["GetStarredSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Starred2. */ + Starred2: { + /** @description Starred artists */ + artist?: components["schemas"]["ArtistID3"][]; + /** @description Starred albums */ + album?: components["schemas"]["AlbumID3"][]; + /** @description Starred songs */ + song?: components["schemas"]["Child"][]; + }; + GetStarred2SuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + starred2: components["schemas"]["Starred2"]; + }; + /** @description A subsonic-response element with a nested `starred2` element on success. */ + GetStarred2Response: { + "subsonic-response"?: components["schemas"]["GetStarred2SuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description TopSongs list. */ + TopSongs: { + /** @description List of songs */ + song?: components["schemas"]["Child"][]; + }; + GetTopSongsSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + topSongs: components["schemas"]["TopSongs"]; + }; + /** @description A subsonic-response element with a nested `topSongs` element on success. */ + GetTopSongsResponse: { + "subsonic-response"?: components["schemas"]["GetTopSongsSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description user. */ + User: { + /** @description Username */ + username: string; + /** @description Scrobbling enabled */ + scrobblingEnabled: boolean; + maxBitRate?: number; + /** @description Whether the user is an admin */ + adminRole: boolean; + /** @description Whether the user is can edit settings */ + settingsRole: boolean; + /** @description Whether the user can download */ + downloadRole: boolean; + /** @description Whether the user can upload */ + uploadRole: boolean; + /** @description Whether the user can create playlists */ + playlistRole: boolean; + /** @description Whether the user can get cover art */ + coverArtRole: boolean; + /** @description Whether the user can create comments */ + commentRole: boolean; + /** @description Whether the user can create/refresh podcasts */ + podcastRole: boolean; + /** @description Whether the user can stream */ + streamRole: boolean; + /** @description Whether the user can control the jukebox */ + jukeboxRole: boolean; + /** @description Whether the user can create a stream */ + shareRole: boolean; + /** @description Whether the user can convert videos */ + videoConversionRole: boolean; + /** + * Format: date-time + * @description Last time the avatar was changed [ISO 8601] + */ + avatarLastChanged?: string; + /** @description Folder ID(s) */ + folder?: number[]; + }; + GetUserSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + user: components["schemas"]["User"]; + }; + /** @description A subsonic-response element with a nested `user` element on success. */ + GetUserResponse: { + "subsonic-response"?: components["schemas"]["GetUserSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description users. */ + Users: { + /** @description Array of users */ + user?: components["schemas"]["User"][]; + }; + GetUsersSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + users: components["schemas"]["Users"]; + }; + /** @description A subsonic-response element with a nested `user` element on success. */ + GetUsersResponse: { + "subsonic-response"?: components["schemas"]["GetUsersSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description videoInfo. TODO */ + VideoInfo: Record; + GetVideoInfoSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + videoInfo: components["schemas"]["VideoInfo"]; + }; + /** @description A subsonic-response element with a nested `videoInfo` element on success. */ + GetVideoInfoResponse: { + "subsonic-response"?: components["schemas"]["GetVideoInfoSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description videos. TODO */ + Videos: Record; + GetVideosSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + videos: components["schemas"]["Videos"]; + }; + /** @description A subsonic-response element with a nested `videos` element on success. */ + GetVideosResponse: { + "subsonic-response"?: components["schemas"]["GetVideosSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** + * @description JukeBox action. + * @enum {string} + */ + JukeboxAction: "get" | "status" | "set" | "start" | "stop" | "skip" | "add" | "clear" | "remove" | "shuffle" | "setGain"; + /** @description jukeboxStatus. */ + JukeboxStatus: { + /** @description The current index of the song being played */ + currentIndex: number; + /** @description Whether the queue is currently playing */ + playing: boolean; + /** + * Format: float + * @description Volume, in a range of [0.0, 1.0] + */ + volume: number; + /** @description The current position of the track in seconds */ + position?: number; + }; + JukeboxPlaylist: components["schemas"]["JukeboxStatus"] & { + /** @description The songs currently enqueued in the jukebox */ + entry?: components["schemas"]["Child"][]; + }; + JukeboxControlSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + jukeboxStatus?: components["schemas"]["JukeboxStatus"]; + jukeboxPlaylist?: components["schemas"]["JukeboxPlaylist"]; + }; + /** @description A subsonic-response element with a nested : + * + * - jukeboxStatus for all actions but get + * - jukeboxPlaylist for get action */ + JukeboxControlResponse: { + "subsonic-response"?: components["schemas"]["JukeboxControlSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description searchResult. TODO */ + SearchResult: Record; + SearchSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + searchResult: components["schemas"]["SearchResult"]; + }; + /** @description A subsonic-response element with a nested `searchResult` element on success. */ + SearchResponse: { + "subsonic-response"?: components["schemas"]["SearchSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description searchResult2 */ + SearchResult2: { + /** @description Starred artists */ + artist?: components["schemas"]["Artist"][]; + /** @description Starred albums */ + album?: components["schemas"]["Child"][]; + /** @description Starred songs */ + song?: components["schemas"]["Child"][]; + }; + Search2SuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + searchResult2: components["schemas"]["SearchResult2"]; + }; + /** @description A subsonic-response element with a nested `searchResult2` element on success. */ + Search2Response: { + "subsonic-response"?: components["schemas"]["Search2SuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description searchResult3 */ + SearchResult3: { + /** @description Matching artists */ + artist?: components["schemas"]["ArtistID3"][]; + /** @description Matching albums */ + album?: components["schemas"]["AlbumID3"][]; + /** @description Matching songs */ + song?: components["schemas"]["Child"][]; + }; + Search3SuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + searchResult3: components["schemas"]["SearchResult3"]; + }; + /** @description A subsonic-response element with a nested `searchResult3` element on success. */ + Search3Response: { + "subsonic-response"?: components["schemas"]["Search3SuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + StartScanSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + scanStatus: components["schemas"]["ScanStatus"]; + }; + /** @description A subsonic-response element with a nested `scanStatus` element on success. */ + StartScanResponse: { + "subsonic-response"?: components["schemas"]["StartScanSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + /** @description Information about an API key */ + TokenInfo: { + /** @description Username associated with token */ + username: string; + }; + GetTokenInfoSuccessResponse: components["schemas"]["SubsonicSuccessResponse"] & { + tokenInfo: components["schemas"]["TokenInfo"]; + }; + /** @description A subsonic-response element with a nested tokenInfo on success, or error 44 on invalid token. */ + GetTokenInfoResponse: { + "subsonic-response"?: components["schemas"]["GetTokenInfoSuccessResponse"] | components["schemas"]["SubsonicFailureResponse"]; + }; + }; + responses: { + /** @description Successful or failed response */ + EmptySubsonicResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SubsonicResponse"]; + }; + }; + /** @description HTTP form POST (`formPost`) Extension not supported */ + HTTPFormPostNotSupported: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Success (binary) or error (xml) response */ + BinaryResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/binary": string; + "text/xml": Record; + }; + }; + }; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getAddChatMessage: { + parameters: { + query: { + /** @description The chat message. */ + message: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postAddChatMessage: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The chat message. */ + message: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + changePassword: { + parameters: { + query: { + /** @description The name of the user which should change its password. */ + username: string; + /** @description The new password of the new user, either in clear text of hex-encoded (see above). */ + password: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postChangePassword: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The name of the user which should change its password. */ + username: string; + /** @description The new password of the new user, either in clear text of hex-encoded (see above). */ + password: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + createBookmark: { + parameters: { + query: { + /** @description ID of the media file to bookmark. If a bookmark already exists for this file it will be overwritten. */ + id: string; + /** @description The position (in milliseconds) within the media file. */ + position: number; + /** @description A user-defined comment. */ + comment?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postCreateBookmark: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of the media file to bookmark. If a bookmark already exists for this file it will be overwritten. */ + id: string; + /** @description The position (in milliseconds) within the media file. */ + position: number; + /** @description A user-defined comment. */ + comment?: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + createInternetRadioStation: { + parameters: { + query: { + /** @description The stream URL for the station. */ + streamUrl: string; + /** @description The station name. */ + name: string; + /** @description The home page URL for the station. */ + homepageUrl?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postCreateInternetRadioStation: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The stream URL for the station. */ + streamUrl: string; + /** @description The station name. */ + name: string; + /** @description The home page URL for the station. */ + homepageUrl?: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + createPlaylist: { + parameters: { + query?: { + /** @description The playlist ID. Required if updating an existing playlist. */ + playlistId?: string; + /** @description The human-readable name of the playlist. Required if creating a new playlist. */ + name?: string; + /** @description ID of a song in the playlist. Use one `songId` parameter for each song in the playlist. */ + songId?: string[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreatePlaylistResponse"]; + }; + }; + }; + }; + postCreatePlaylist: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The playlist ID. Required if updating an existing playlist. */ + playlistId?: string; + /** @description The human-readable name of the playlist. Required if creating a new playlist. */ + name?: string; + /** @description ID of a song in the playlist. Use one `songId` parameter for each song in the playlist. */ + songId?: string[]; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreatePlaylistResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + createPodcastChannel: { + parameters: { + query: { + /** @description The URL of the Podcast to add. */ + url: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postCreatePodcastChannel: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The URL of the Podcast to add. */ + url: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + createShare: { + parameters: { + query: { + /** @description ID of a song, album or video to share. Use one id parameter for each entry to share. */ + id: string[]; + /** @description A user-defined description that will be displayed to people visiting the shared media. */ + description?: string; + /** @description The time at which the share expires. Given as milliseconds since 1970. */ + expires?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreateSharesResponse"]; + }; + }; + }; + }; + postCreateShare: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of a song, album or video to share. Use one id parameter for each entry to share. */ + id: string[]; + /** @description A user-defined description that will be displayed to people visiting the shared media. */ + description?: string; + /** @description The time at which the share expires. Given as milliseconds since 1970. */ + expires?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CreateSharesResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + createUser: { + parameters: { + query: { + /** @description The name of the new user. */ + username: string; + /** @description The password of the new user, either in clear text of hex-encoded (see above). */ + password: string; + /** @description The email address of the new user. */ + email: string; + /** @description Whether the user is authenticated in LDAP. */ + ldapAuthenticated?: boolean; + /** @description Whether the user is administrator. */ + adminRole?: boolean; + /** @description Whether the user is allowed to change personal settings and password. */ + settingsRole?: boolean; + /** @description Whether the user is allowed to play files. */ + streamRole?: boolean; + /** @description Whether the user is allowed to play files in jukebox mode. */ + jukeboxRole?: boolean; + /** @description Whether the user is allowed to download files. */ + downloadRole?: boolean; + /** @description Whether the user is allowed to upload files. */ + uploadRole?: boolean; + /** @description Whether the user is allowed to create and delete playlists. Since 1.8.0, changing this role has no effect. */ + playlistRole?: boolean; + /** @description Whether the user is allowed to change cover art and tags. */ + coverArtRole?: boolean; + /** @description Whether the user is allowed to create and edit comments and ratings. */ + commentRole?: boolean; + /** @description Whether the user is allowed to administrate Podcasts. */ + podcastRole?: boolean; + /** @description (Since 1.8.0) Whether the user is allowed to share files with anyone. */ + shareRole?: boolean; + /** @description (Since 1.15.0) Whether the user is allowed to start video conversions. */ + videoConversionRole?: boolean; + /** @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. */ + musicFolderId?: string[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postCreateUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The name of the new user. */ + username: string; + /** @description The password of the new user, either in clear text or hex-encoded. */ + password: string; + /** @description The email address of the new user. */ + email: string; + /** + * @description Whether the user is authenticated in LDAP. + * @default false + */ + ldapAuthenticated?: boolean; + /** + * @description Whether the user is administrator. + * @default false + */ + adminRole?: boolean; + /** + * @description Whether the user is allowed to change personal settings and password. + * @default true + */ + settingsRole?: boolean; + /** + * @description Whether the user is allowed to play files. + * @default true + */ + streamRole?: boolean; + /** + * @description Whether the user is allowed to play files in jukebox mode. + * @default false + */ + jukeboxRole?: boolean; + /** + * @description Whether the user is allowed to download files. + * @default false + */ + downloadRole?: boolean; + /** + * @description Whether the user is allowed to upload files. + * @default false + */ + uploadRole?: boolean; + /** + * @description Whether the user is allowed to create and delete playlists. Since 1.8.0, changing this role has no effect. + * @default false + */ + playlistRole?: boolean; + /** + * @description Whether the user is allowed to change cover art and tags. + * @default false + */ + coverArtRole?: boolean; + /** + * @description Whether the user is allowed to create and edit comments and ratings. + * @default false + */ + commentRole?: boolean; + /** + * @description Whether the user is allowed to administrate Podcasts. + * @default false + */ + podcastRole?: boolean; + /** + * @description (Since 1.8.0) Whether the user is allowed to share files with anyone. + * @default false + */ + shareRole?: boolean; + /** + * @description (Since 1.15.0) Whether the user is allowed to start video conversions. + * @default false + */ + videoConversionRole?: boolean; + /** @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. */ + musicFolderId?: string[]; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deleteBookmark: { + parameters: { + query: { + /** @description ID of the media file for which to delete the bookmark. Other users’ bookmarks are not affected. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeleteBookmark: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of the media file for which to delete the bookmark. Other users’ bookmarks are not affected. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deleteInternetRadioStation: { + parameters: { + query: { + /** @description The ID for the station. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeleteInternetRadioStation: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID for the station. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deletePlaylist: { + parameters: { + query: { + /** @description ID of the playlist to delete, as obtained by `getPlaylists`. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeletePlaylist: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of the playlist to delete, as obtained by `getPlaylists`. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deletePodcastChannel: { + parameters: { + query: { + /** @description The ID of the Podcast channel to delete. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeletePodcastChannel: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the Podcast channel to delete. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deletePodcastEpisode: { + parameters: { + query: { + /** @description The ID of the Podcast episode to delete. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeletePodcastEpisode: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the Podcast episode to delete. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deleteShare: { + parameters: { + query: { + /** @description ID of the share to delete. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeleteShare: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of the share to delete. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + deleteUser: { + parameters: { + query: { + /** @description The name of the user to delete. */ + username: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDeleteUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The name of the user to delete. */ + username: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + download: { + parameters: { + query: { + /** @description A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["BinaryResponse"]; + }; + }; + postDownload: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description A string which uniquely identifies the file to download. Obtained by calls to getMusicDirectory. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["BinaryResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + downloadPodcastEpisode: { + parameters: { + query: { + /** @description The ID of the Podcast episode to download */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postDownloadPodcastEpisode: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the Podcast episode to download. */ + id: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getAlbum: { + parameters: { + query: { + /** @description The album ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumResponse"]; + }; + }; + }; + }; + postGetAlbum: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The album ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getAlbumInfo: { + parameters: { + query: { + /** @description The album ID or song ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumInfoResponse"]; + }; + }; + }; + }; + postGetAlbumInfo: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The album ID or song ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumInfoResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getAlbumInfo2: { + parameters: { + query: { + /** @description The album ID or song ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumInfoResponse"]; + }; + }; + }; + }; + postGetAlbumInfo2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The album ID or song ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumInfoResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getAlbumList: { + parameters: { + query: { + type: components["schemas"]["AlbumListType"]; + /** @description The number of albums to return. Max 500. */ + size?: number; + /** @description The list offset. Useful if you for example want to page through the list of newest albums. */ + offset?: number; + /** @description Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned. */ + fromYear?: number; + /** @description Required if `type=='byYear'`. The last year in the range. */ + toYear?: number; + /** @description Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”. */ + genre?: string; + /** @description (Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumListResponse"]; + }; + }; + }; + }; + postGetAlbumList: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + type: components["schemas"]["AlbumListType"]; + /** + * @description The number of albums to return. Max 500. + * @default 10 + */ + size?: number; + /** + * @description The list offset. Useful if you for example want to page through the list of newest albums. + * @default 0 + */ + offset?: number; + /** @description Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned. */ + fromYear?: number; + /** @description Required if `type=='byYear'`. The last year in the range. */ + toYear?: number; + /** @description Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”. */ + genre?: string; + /** @description (Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumListResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getAlbumList2: { + parameters: { + query: { + type: components["schemas"]["AlbumListType"]; + /** @description The number of albums to return. Max 500. */ + size?: number; + /** @description The list offset. Useful if you for example want to page through the list of newest albums. */ + offset?: number; + /** @description Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned. */ + fromYear?: number; + /** @description Required if `type=='byYear'`. The last year in the range. */ + toYear?: number; + /** @description Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”. */ + genre?: string; + /** @description (Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumList2Response"]; + }; + }; + }; + }; + postGetAlbumList2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + type: components["schemas"]["AlbumListType"]; + /** + * @description The number of albums to return. Max 500. + * @default 10 + */ + size?: number; + /** + * @description The list offset. Useful if you for example want to page through the list of newest albums. + * @default 0 + */ + offset?: number; + /** @description Required if `type=='byYear'`. The first year in the range. If `fromYear` > `toYear` a reverse chronological list is returned. */ + fromYear?: number; + /** @description Required if `type=='byYear'`. The last year in the range. */ + toYear?: number; + /** @description Required if `type=='byGenre'`. The name of the genre, e.g., “Rock”. */ + genre?: string; + /** @description (Since 1.11.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetAlbumList2Response"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getArtist: { + parameters: { + query: { + /** @description The artist ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistResponse"]; + }; + }; + }; + }; + postGetArtist: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getArtistInfo: { + parameters: { + query: { + /** @description The artist, album or song ID. */ + id: string; + /** @description Max number of similar artists to return. */ + count?: number; + /** @description Whether to return artists that are not present in the media library. */ + includeNotPresent?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistInfoResponse"]; + }; + }; + }; + }; + postGetArtistInfo: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist, album or song ID. */ + id: string; + /** + * @description Max number of similar artists to return. + * @default 20 + */ + count?: number; + /** + * @description Whether to return artists that are not present in the media library. + * @default false + */ + includeNotPresent?: boolean; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistInfoResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getArtistInfo2: { + parameters: { + query: { + /** @description The artist, album or song ID. */ + id: string; + /** @description Max number of similar artists to return. */ + count?: number; + /** @description Whether to return artists that are not present in the media library. */ + includeNotPresent?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistInfo2Response"]; + }; + }; + }; + }; + postGetArtistInfo2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist, album or song ID. */ + id: string; + /** + * @description Max number of similar artists to return. + * @default 20 + */ + count?: number; + /** + * @description Whether to return artists that are not present in the media library. + * @default false + */ + includeNotPresent?: boolean; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistInfo2Response"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getArtists: { + parameters: { + query?: { + /** @description If specified, only return artists in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistsResponse"]; + }; + }; + }; + }; + postGetArtists: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @description If specified, only return artists in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetArtistsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getAvatar: { + parameters: { + query: { + username: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["BinaryResponse"]; + }; + }; + postGetAvatar: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The username for which to retrieve the avatar. */ + username: string; + }; + }; + }; + responses: { + 200: components["responses"]["BinaryResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getBookmarks: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetBookmarksResponse"]; + }; + }; + }; + }; + postGetBookmarks: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetBookmarksResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getCaptions: { + parameters: { + query: { + /** @description The ID of the video. */ + id: string; + /** @description Preferred captions format (“srt” or “vtt”). */ + format?: "srt" | "vtt"; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns the raw video captions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/binary": string; + "text/plain": string; + }; + }; + }; + }; + postGetCaptions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the video. */ + id: string; + /** + * @description Preferred captions format (“srt” or “vtt”). + * @enum {string} + */ + format?: "srt" | "vtt"; + }; + }; + }; + responses: { + /** @description Returns the raw video captions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/binary": string; + "text/plain": string; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getChatMessages: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetChatMessagesResponse"]; + }; + }; + }; + }; + postGetChatMessages: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetChatMessagesResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getCoverArt: { + parameters: { + query: { + /** @description The coverArt ID. Returned by most entities likes `Child` or `AlbumID3` */ + id: string; + /** @description If specified, scale image to this size. */ + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["BinaryResponse"]; + }; + }; + postGetCoverArt: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The coverArt ID. Returned by most entities likes `Child` or `AlbumID3` */ + id: string; + /** @description If specified, scale image to this size. */ + size?: number; + }; + }; + }; + responses: { + 200: components["responses"]["BinaryResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getGenres: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetGenresResponse"]; + }; + }; + }; + }; + postGetGenres: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetGenresResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getIndexes: { + parameters: { + query?: { + /** @description If specified, only return artists in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + /** @description If specified, only return a result if the artist collection has changed since the given time (in milliseconds since 1 Jan 1970). */ + ifModifiedSince?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetIndexesResponse"]; + }; + }; + }; + }; + postGetIndexes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @description If specified, only return artists in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + /** @description If specified, only return a result if the artist collection has changed since the given time (in milliseconds since 1 Jan 1970). */ + ifModifiedSince?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetIndexesResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getInternetRadioStations: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetInternetRadioStationsResponse"]; + }; + }; + }; + }; + postGetInternetRadioStations: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetInternetRadioStationsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getLicense: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetLicenseResponse"]; + }; + }; + }; + }; + postGetLicense: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetLicenseResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getLyrics: { + parameters: { + query?: { + /** @description The artist name. */ + artist?: string; + /** @description The song title. */ + title?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetLyricsResponse"]; + }; + }; + }; + }; + postGetLyrics: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist name. */ + artist?: string; + /** @description The song title. */ + title?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetLyricsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getLyricsBySongId: { + parameters: { + query: { + /** @description The track ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetLyricsBySongIdResponse"]; + }; + }; + /** @description Extension not supported. */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + postGetLyricsBySongId: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The track ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetLyricsBySongIdResponse"]; + }; + }; + /** @description Extension not supported. */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getMusicDirectory: { + parameters: { + query: { + /** @description A string which uniquely identifies the music folder. Obtained by calls to `getIndexes` or `getMusicDirectory`. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetMusicDirectoryResponse"]; + }; + }; + }; + }; + postGetMusicDirectory: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description A string which uniquely identifies the music folder. Obtained by calls to `getIndexes` or `getMusicDirectory`. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetMusicDirectoryResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getMusicFolders: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetMusicFoldersResponse"]; + }; + }; + }; + }; + postGetMusicFolders: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetMusicFoldersResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getNewestPodcasts: { + parameters: { + query?: { + /** @description The maximum number of episodes to return. */ + count?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetNewestPodcastsResponse"]; + }; + }; + }; + }; + postGetNewestPodcasts: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** + * @description The maximum number of episodes to return. + * @default 20 + */ + count?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetNewestPodcastsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getNowPlaying: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetNowPlayingResponse"]; + }; + }; + }; + }; + postGetNowPlaying: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetNowPlayingResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getOpenSubsonicExtensions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetOpenSubsonicExtensionsResponse"]; + }; + }; + }; + }; + postGetOpenSubsonicExtensions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetOpenSubsonicExtensionsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getPlaylist: { + parameters: { + query: { + /** @description ID of the playlist to return, as obtained by `getPlaylists`. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlaylistResponse"]; + }; + }; + }; + }; + postGetPlaylist: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of the playlist to return, as obtained by `getPlaylists`. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlaylistResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getPlaylists: { + parameters: { + 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. */ + username?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlaylistsResponse"]; + }; + }; + }; + }; + postGetPlaylists: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @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. */ + username?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlaylistsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getPlayQueue: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlayQueueResponse"]; + }; + }; + }; + }; + postGetPlayQueue: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlayQueueResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getPlayQueueByIndex: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlayQueueByIndexResponse"]; + }; + }; + }; + }; + postGetPlayQueueByIndex: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPlayQueueByIndexResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getPodcastEpisode: { + parameters: { + query: { + /** @description The podcast episode ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPodcastEpisodeResponse"]; + }; + }; + /** @description Extension not supported. */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + postGetPodcastEpisode: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The podcast episode ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPodcastEpisodeResponse"]; + }; + }; + /** @description Extension not supported. */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getPodcasts: { + parameters: { + query?: { + /** @description (Since 1.9.0) If specified, only return the Podcast channel with this ID. */ + id?: string; + /** @description (Since 1.9.0) Whether to include Podcast episodes in the returned result. */ + includeEpisodes?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPodcastsResponse"]; + }; + }; + }; + }; + postGetPodcasts: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @description (Since 1.9.0) If specified, only return the Podcast channel with this ID. */ + id?: string; + /** + * @description (Since 1.9.0) Whether to include Podcast episodes in the returned result. + * @default true + */ + includeEpisodes?: boolean; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetPodcastsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getRandomSongs: { + parameters: { + query?: { + /** @description The maximum number of songs to return. Max 500. */ + size?: number; + /** @description Only returns songs belonging to this genre. */ + genre?: string; + /** @description (Since 1.9.0) Only return songs from this year or later. */ + fromYear?: number; + /** @description Only return songs published before or in this year. */ + toYear?: number; + /** @description Only return songs in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetRandomSongsResponse"]; + }; + }; + }; + }; + postGetRandomSongs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** + * @description The maximum number of songs to return. Max 500. + * @default 10 + */ + size?: number; + /** @description Only returns songs belonging to this genre. */ + genre?: string; + /** @description (Since 1.9.0) Only return songs from this year or later. */ + fromYear?: number; + /** @description Only return songs published before or in this year. */ + toYear?: number; + /** @description Only return songs in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetRandomSongsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getScanStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetScanStatusResponse"]; + }; + }; + }; + }; + postGetScanStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetScanStatusResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getShares: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSharesResponse"]; + }; + }; + }; + }; + postGetShares: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSharesResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getSimilarSongs: { + parameters: { + query: { + /** @description The artist, album or song ID. */ + id: string; + /** @description Max number of songs to return. */ + count?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSimilarSongsResponse"]; + }; + }; + }; + }; + postGetSimilarSongs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist, album or song ID. */ + id: string; + /** + * @description Max number of songs to return. + * @default 50 + */ + count?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSimilarSongsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getSimilarSongs2: { + parameters: { + query: { + /** @description The artist, album or song ID. */ + id: string; + /** @description Max number of songs to return. */ + count?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSimilarSongs2Response"]; + }; + }; + }; + }; + postGetSimilarSongs2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist, album or song ID. */ + id: string; + /** + * @description Max number of songs to return. + * @default 50 + */ + count?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSimilarSongs2Response"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getSong: { + parameters: { + query: { + /** @description The song ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSongResponse"]; + }; + }; + }; + }; + postGetSong: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The song ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSongResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getSongsByGenre: { + parameters: { + query: { + /** @description The genre, as returned by `getGenres`. */ + genre: string; + /** @description The maximum number of songs to return. Max 500. */ + count?: number; + /** @description The offset. Useful if you want to page through the songs in a genre. */ + offset?: number; + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSongsByGenreResponse"]; + }; + }; + }; + }; + postGetSongsByGenre: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The genre, as returned by `getGenres`. */ + genre: string; + /** + * @description The maximum number of songs to return. Max 500. + * @default 10 + */ + count?: number; + /** + * @description The offset. Useful if you want to page through the songs in a genre. + * @default 0 + */ + offset?: number; + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetSongsByGenreResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getStarred: { + parameters: { + query?: { + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetStarredResponse"]; + }; + }; + }; + }; + postGetStarred: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetStarredResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getStarred2: { + parameters: { + query?: { + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetStarred2Response"]; + }; + }; + }; + }; + postGetStarred2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetStarred2Response"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getTopSongs: { + parameters: { + query: { + /** @description The artist name. */ + id: string; + /** @description The maximum number of songs to return. */ + count?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetTopSongsResponse"]; + }; + }; + }; + }; + postGetTopSongs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The artist name. */ + id: string; + /** + * @description The maximum number of songs to return. + * @default 50 + */ + count?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetTopSongsResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getUser: { + parameters: { + query: { + /** @description The name of the user to retrieve. You can only retrieve your own user unless you have admin privileges. */ + username: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetUserResponse"]; + }; + }; + }; + }; + postGetUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The name of the user to retrieve. You can only retrieve your own user unless you have admin privileges. */ + username: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetUserResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getUsers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetUsersResponse"]; + }; + }; + }; + }; + postGetUsers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetUsersResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getVideoInfo: { + parameters: { + query: { + /** @description The video ID. */ + id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetVideoInfoResponse"]; + }; + }; + }; + }; + postGetVideoInfo: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The video ID. */ + id: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetVideoInfoResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + getVideos: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetVideosResponse"]; + }; + }; + }; + }; + postGetVideos: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetVideosResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + "hls.m3u8": { + parameters: { + query: { + /** @description A string which uniquely identifies the media file to stream. */ + id: string; + /** @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 */ + bitRate?: number; + /** @description The ID of the audio track to use. See `getVideoInfo` for how to get the list of available audio tracks for a video. */ + audioTrack?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.apple.mpegurl": string; + "text/xml": Record; + }; + }; + }; + }; + "postHls.m3u8": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description A string which uniquely identifies the media file to stream. */ + id: string; + /** @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. */ + bitRate?: number; + /** @description The ID of the audio track to use. See `getVideoInfo` for how to get the list of available audio tracks for a video. */ + audioTrack?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.apple.mpegurl": string; + "text/xml": Record; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + jukeboxControl: { + parameters: { + 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 */ + action: components["schemas"]["JukeboxAction"]; + /** @description Used by `skip` and `remove`. Zero-based index of the song to skip to or remove. */ + index?: number; + /** @description (Since 1.7.0) Used by `skip`. Start playing this many seconds into the track. */ + offset?: number; + /** @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.) */ + id?: string[]; + /** @description Used by `setGain` to control the playback volume. A float value between 0.0 and 1.0. */ + gain?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JukeboxControlResponse"]; + }; + }; + }; + }; + postJukeboxControl: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** + * @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 {unknown} + */ + action: "get" | "status" | "start" | "stop" | "clear" | "shuffle"; + } | { + /** + * @description 'remove' action. + * @enum {unknown} + */ + action: "remove"; + /** @description Zero-based index of the song to remove. */ + index: number; + } | { + /** + * @description 'skip' action. + * @enum {unknown} + */ + action: "skip"; + /** @description Zero-based index of the song to skip. */ + index: number; + /** @description (Since 1.7.0) Used by `skip`. Start playing this many seconds into the track. */ + offset?: number; + } | { + /** + * @description 'add' action. + * @enum {unknown} + */ + action: "add"; + /** @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.) */ + id: string[]; + } | { + /** + * @description 'set' action. + * @enum {unknown} + */ + action: "set"; + /** @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.) */ + id: string[]; + } | { + /** + * @description 'setGain' action. + * @enum {unknown} + */ + action: "setGain"; + /** + * Format: float + * @description Used by `setGain` to control the playback volume. A float value between 0.0 and 1.0. + */ + gain: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JukeboxControlResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + ping: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postPing: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + refreshPodcasts: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postRefreshPodcasts: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + savePlayQueue: { + parameters: { + query?: { + /** @description ID of a song in the play queue. Use one id parameter for each song in the play queue. */ + id?: string; + /** @description The ID of the current playing song. */ + current?: string; + /** @description The position in milliseconds within the currently playing song. */ + position?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postSavePlayQueue: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of a song in the play queue. Use one id parameter for each song in the play queue. */ + id?: string; + /** @description The ID of the current playing song. */ + current?: string; + /** @description The position in milliseconds within the currently playing song. */ + position?: number; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + savePlayQueueByIndex: { + parameters: { + query?: { + /** @description ID of a song in the play queue. Use one id parameter for each song in the play queue. */ + id?: string; + /** @description The index of the current playing song. */ + currentIndex?: number; + /** @description The position in milliseconds within the currently playing song. */ + position?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postSavePlayQueueByIndex: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of a song in the play queue. Use one id parameter for each song in the play queue. */ + id?: string; + /** @description The ID of the current playing song. */ + current?: string; + /** @description The position in milliseconds within the currently playing song. */ + position?: number; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + scrobble: { + parameters: { + query: { + /** @description A string which uniquely identifies the file to scrobble. */ + id: string; + /** @description (Since 1.8.0) The time (in milliseconds since 1 Jan 1970) at which the song was listened to. */ + time?: number; + /** @description Whether this is a “submission” or a “now playing” notification. */ + submission?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postScrobble: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description A string which uniquely identifies the file to scrobble. */ + id: string; + /** @description (Since 1.8.0) The time (in milliseconds since 1 Jan 1970) at which the song was listened to. */ + time?: number; + /** + * @description Whether this is a “submission” or a “now playing” notification. + * @default true + */ + submission?: boolean; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + search: { + parameters: { + query?: { + /** @description Artist to search for. */ + artist?: string; + /** @description Album to search for. */ + album?: string; + /** @description Song title to search for. */ + title?: string; + /** @description Searches all fields. */ + any?: boolean; + /** @description Maximum number of results to return. */ + count?: number; + /** @description Search result offset. Used for paging. */ + offset?: number; + /** @description Only return matches that are newer than this. Given as milliseconds since 1970. */ + newerThan?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SearchResponse"]; + }; + }; + }; + }; + postSearch: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description Artist to search for. */ + artist?: string; + /** @description Album to search for. */ + album?: string; + /** @description Song title to search for. */ + title?: string; + /** + * @description Searches all fields. + * @default false + */ + any?: boolean; + /** + * @description Maximum number of results to return. + * @default 20 + */ + count?: number; + /** + * @description Search result offset. Used for paging. + * @default 0 + */ + offset?: number; + /** @description Only return matches that are newer than this. Given as milliseconds since 1970. */ + newerThan?: number; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SearchResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + search2: { + parameters: { + query: { + /** @description Search query. */ + query: string; + /** @description Maximum number of artists to return. */ + artistCount?: number; + /** @description Search result offset for artists. Used for paging. */ + artistOffset?: number; + /** @description Maximum number of albums to return. */ + albumCount?: number; + /** @description Search result offset for albums. Used for paging. */ + albumOffset?: number; + /** @description Maximum number of songs to return. */ + songCount?: number; + /** @description Search result offset for songs. Used for paging. */ + songOffset?: number; + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Search2Response"]; + }; + }; + }; + }; + postSearch2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description Search query. */ + query: string; + /** + * @description Maximum number of artists to return. + * @default 20 + */ + artistCount?: number; + /** + * @description Search result offset for artists. Used for paging. + * @default 0 + */ + artistOffset?: number; + /** + * @description Maximum number of albums to return. + * @default 20 + */ + albumCount?: number; + /** + * @description Search result offset for albums. Used for paging. + * @default 0 + */ + albumOffset?: number; + /** + * @description Maximum number of songs to return. + * @default 20 + */ + songCount?: number; + /** + * @description Search result offset for songs. Used for paging. + * @default 0 + */ + songOffset?: number; + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Search2Response"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + search3: { + parameters: { + 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. */ + query: string; + /** @description Maximum number of artists to return. */ + artistCount?: number; + /** @description Search result offset for artists. Used for paging. */ + artistOffset?: number; + /** @description Maximum number of albums to return. */ + albumCount?: number; + /** @description Search result offset for albums. Used for paging. */ + albumOffset?: number; + /** @description Maximum number of songs to return. */ + songCount?: number; + /** @description Search result offset for songs. Used for paging. */ + songOffset?: number; + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Search3Response"]; + }; + }; + }; + }; + postSearch3: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @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. */ + query: string; + /** + * @description Maximum number of artists to return. + * @default 20 + */ + artistCount?: number; + /** + * @description Search result offset for artists. Used for paging. + * @default 0 + */ + artistOffset?: number; + /** + * @description Maximum number of albums to return. + * @default 20 + */ + albumCount?: number; + /** + * @description Search result offset for albums. Used for paging. + * @default 0 + */ + albumOffset?: number; + /** + * @description Maximum number of songs to return. + * @default 20 + */ + songCount?: number; + /** + * @description Search result offset for songs. Used for paging. + * @default 0 + */ + songOffset?: number; + /** @description (Since 1.12.0) Only return albums in the music folder with the given ID. See `getMusicFolders`. */ + musicFolderId?: string; + }; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Search3Response"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + setRating: { + parameters: { + query: { + /** @description A string which uniquely identifies the file (song) or folder (album/artist) to rate. */ + id: string; + /** @description The rating between 1 and 5 (inclusive), or 0 to remove the rating. */ + rating: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postSetRating: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description A string which uniquely identifies the file (song) or folder (album/artist) to rate. */ + id: string; + /** @description The rating between 1 and 5 (inclusive), or 0 to remove the rating. */ + rating: number; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + star: { + parameters: { + query?: { + /** @description The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed. */ + id?: 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. */ + albumId?: 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. */ + artistId?: string[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postStar: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed. */ + id?: 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. */ + albumId?: 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. */ + artistId?: string[]; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + startScan: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StartScanResponse"]; + }; + }; + }; + }; + postStartScan: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StartScanResponse"]; + }; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + stream: { + parameters: { + query: { + /** @description A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory. */ + id: string; + /** @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. */ + maxBitRate?: number; + /** @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. */ + format?: string; + /** @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. */ + timeOffset?: number; + /** @description (Since 1.6.0) Only applicable to video streaming. Requested video size specified as WxH, for instance “640x480”. */ + size?: string; + /** @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. */ + estimateContentLength?: boolean; + /** @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. */ + converted?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["BinaryResponse"]; + }; + }; + postStream: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory. */ + id: string; + /** @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. */ + maxBitRate?: number; + /** @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. */ + format?: string; + /** @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. */ + timeOffset?: number; + /** @description (Since 1.6.0) Only applicable to video streaming. Requested video size specified as WxH, for instance “640x480”. */ + size?: string; + /** + * @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. + * @default false + */ + estimateContentLength?: boolean; + /** + * @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. + * @default false + */ + converted?: boolean; + }; + }; + }; + responses: { + 200: components["responses"]["BinaryResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + tokenInfo: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetTokenInfoResponse"]; + }; + }; + /** @description Extension not supported */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + postTokenInfo: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/x-www-form-urlencoded": Record; + }; + }; + responses: { + /** @description Successful or failed response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GetTokenInfoResponse"]; + }; + }; + /** @description Extension not supported */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + unstar: { + parameters: { + query?: { + /** @description The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed. */ + id?: 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. */ + albumId?: 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. */ + artistId?: string[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postUnstar: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the file (song) or folder (album/artist) to unstar. Multiple parameters allowed. */ + id?: unknown; + /** @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. */ + albumId?: unknown; + /** @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. */ + artistId?: unknown; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + updateInternetRadioStation: { + parameters: { + query: { + /** @description The ID of the station. */ + id: string; + /** @description The stream URL for the station. */ + streamUrl: string; + /** @description The user-defined name for the station. */ + name: string; + /** @description The home page URL for the station. */ + homepageUrl?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postUpdateInternetRadioStation: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The ID of the station. */ + id: string; + /** @description The stream URL for the station. */ + streamUrl: string; + /** @description The user-defined name for the station. */ + name: string; + /** @description The home page URL for the station. */ + homepageUrl?: string; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + updatePlaylist: { + parameters: { + query: { + /** @description The playlist ID. */ + playlistId: string; + /** @description The human-readable name of the playlist. */ + name?: string; + /** @description The playlist comment. */ + comment?: string; + /** @description `true` if the playlist should be visible to all users, `false` otherwise. */ + public?: boolean; + /** @description Add this song with this ID to the playlist. Multiple parameters allowed. */ + songIdToAdd?: string[]; + /** @description Remove the song at this position in the playlist. Multiple parameters allowed. */ + songIndexToRemove?: number[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postUpdatePlaylist: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The playlist ID. */ + playlistId: string; + /** @description The human-readable name of the playlist. */ + name?: string; + /** @description The playlist comment. */ + comment?: string; + /** @description `true` if the playlist should be visible to all users, `false` otherwise. */ + public?: boolean; + /** @description Add this song with this ID to the playlist. Multiple parameters allowed. */ + songIdToAdd?: string[]; + /** @description Remove the song at this position in the playlist. Multiple parameters allowed. */ + songIndexToRemove?: number[]; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + updateShare: { + parameters: { + query: { + /** @description ID of the share to update. */ + id: string; + /** @description A user-defined description that will be displayed to people visiting the shared media. */ + description?: string; + /** @description The time at which the share expires. Given as milliseconds since 1970, or zero to remove the expiration. */ + expires?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postUpdateShare: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description ID of the share to update. */ + id: string; + /** @description A user-defined description that will be displayed to people visiting the shared media. */ + description?: string; + /** @description The time at which the share expires. Given as milliseconds since 1970, or zero to remove the expiration. */ + expires?: number; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; + updateUser: { + parameters: { + query: { + /** @description The name of the user. */ + username: string; + /** @description The password of the user, either in clear text of hex-encoded (see above). */ + password: string; + /** @description The email address of the user. */ + email?: string; + /** @description Whether the user is authenicated in LDAP. */ + ldapAuthenticated?: boolean; + /** @description Whether the user is administrator. */ + adminRole?: boolean; + /** @description Whether the user is allowed to change personal settings and password. */ + settingsRole?: boolean; + /** @description Whether the user is allowed to play files. */ + streamRole?: boolean; + /** @description Whether the user is allowed to play files in jukebox mode. */ + jukeboxRole?: boolean; + /** @description Whether the user is allowed to download files. */ + downloadRole?: boolean; + /** @description Whether the user is allowed to upload files. */ + uploadRole?: boolean; + /** @description Whether the user is allowed to change cover art and tags. */ + coverArtRole?: boolean; + /** @description Whether the user is allowed to create and edit comments and ratings. */ + commentRole?: boolean; + /** @description Whether the user is allowed to administrate Podcasts. */ + podcastRole?: boolean; + /** @description Whether the user is allowed to share files with anyone. */ + shareRole?: boolean; + /** @description (Since 1.15.0) Whether the user is allowed to start video conversions. */ + videoConversionRole?: boolean; + /** @description (Since 1.12.0) IDs of the music folders the user is allowed access to. Include the parameter once for each folder. */ + musicFolderId?: string[]; + /** @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. */ + maxBitRate?: 0 | 32 | 40 | 48 | 56 | 64 | 80 | 96 | 112 | 128 | 160 | 192 | 224 | 256 | 320; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + }; + }; + postUpdateUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description The name of the user. */ + username: string; + /** @description The password of the user, either in clear text or hex-encoded. */ + password: string; + /** @description The email address of the user. */ + email?: string; + /** + * @description Whether the user is authenticated in LDAP. + * @default false + */ + ldapAuthenticated?: boolean; + /** + * @description Whether the user is an administrator. + * @default false + */ + adminRole?: boolean; + /** + * @description Whether the user is allowed to change personal settings and password. + * @default true + */ + settingsRole?: boolean; + /** + * @description Whether the user is allowed to play files. + * @default true + */ + streamRole?: boolean; + /** + * @description Whether the user is allowed to play files in jukebox mode. + * @default false + */ + jukeboxRole?: boolean; + /** + * @description Whether the user is allowed to download files. + * @default false + */ + downloadRole?: boolean; + /** + * @description Whether the user is allowed to upload files. + * @default false + */ + uploadRole?: boolean; + /** + * @description Whether the user is allowed to change cover art and tags. + * @default false + */ + coverArtRole?: boolean; + /** + * @description Whether the user is allowed to create and edit comments and ratings. + * @default false + */ + commentRole?: boolean; + /** + * @description Whether the user is allowed to administrate Podcasts. + * @default false + */ + podcastRole?: boolean; + /** + * @description Whether the user is allowed to share files with anyone. + * @default false + */ + shareRole?: boolean; + /** + * @description (Since 1.15.0) Whether the user is allowed to start video conversions. + * @default false + */ + videoConversionRole?: boolean; + /** @description (Since 1.12.0) IDs of the music folders the user is allowed access to. Include the parameter once for each folder. */ + musicFolderId?: string[]; + /** + * @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. + * @enum {integer} + */ + maxBitRate?: 0 | 32 | 40 | 48 | 56 | 64 | 80 | 96 | 112 | 128 | 160 | 192 | 224 | 256 | 320; + }; + }; + }; + responses: { + 200: components["responses"]["EmptySubsonicResponse"]; + 405: components["responses"]["HTTPFormPostNotSupported"]; + }; + }; +} diff --git a/tsconfig.node.json b/tsconfig.node.json index b56947c78..4a1636373 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -3,6 +3,7 @@ "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*", "src/i18n/**/*", "src/types/**/*", "src/shared/**/*"], "compilerOptions": { "composite": true, + "noUncheckedIndexedAccess": true, "types": ["electron-vite/node"], "esModuleInterop": true, "baseUrl": ".", diff --git a/tsconfig.web.json b/tsconfig.web.json index 370f5a819..02e6b58bd 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -12,6 +12,7 @@ ], "compilerOptions": { "composite": true, + "noUncheckedIndexedAccess": true, "jsx": "react-jsx", "baseUrl": ".", "paths": {