From 0e35aec4a8ea20a292e60bdfae67da5cc692c0d1 Mon Sep 17 00:00:00 2001 From: imba97 Date: Tue, 1 Oct 2024 10:48:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=AF=B7=E6=B1=82=20Navidrome=20?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composables/navidrome/shared.ts | 56 ++++++----------- composables/navidrome/useNavidromeCover.ts | 15 ++--- composables/navidrome/useNavidromeData.ts | 28 ++++----- package.json | 2 - pnpm-lock.yaml | 71 ---------------------- server/api/playing/test.ts | 6 -- 6 files changed, 38 insertions(+), 140 deletions(-) delete mode 100644 server/api/playing/test.ts diff --git a/composables/navidrome/shared.ts b/composables/navidrome/shared.ts index b2801be..848b308 100644 --- a/composables/navidrome/shared.ts +++ b/composables/navidrome/shared.ts @@ -1,48 +1,32 @@ -import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios' -import fetchAdapter from '@haverstack/axios-fetch-adapter' import defu from 'defu' -let axiosInstance: AxiosInstance | null = null +const runtimeConfig = useRuntimeConfig() -export const axiosInfo = { - get commonOptions() { - const runtimeConfig = useRuntimeConfig() +export const navidromeRequest = { + baseURL: runtimeConfig.env.NAVIDROME_API_URL, - return { - params: { - u: runtimeConfig.env.NAVIDROME_USERNAME, - p: runtimeConfig.env.NAVIDROME_PASSWORD, - v: '1.16.1', - c: 'my-client', - f: 'json' - } - } + commonOptions: { + u: runtimeConfig.env.NAVIDROME_USERNAME, + p: runtimeConfig.env.NAVIDROME_PASSWORD, + v: '1.16.1', + c: 'my-client', + f: 'json' }, - get instance() { - if (axiosInstance) { - return axiosInstance - } - - const runtimeConfig = useRuntimeConfig() - - axiosInstance = axios.create({ - baseURL: runtimeConfig.env.NAVIDROME_API_URL, - adapter: fetchAdapter + async get(url: string, params: Record = {}) { + const queryString = new URLSearchParams(defu(this.commonOptions, params)).toString() + const response = await fetch(`${this.baseURL}${url}?${queryString}`, { + method: 'GET' }) - return axiosInstance + return response.json() }, - get testEnv() { - const runtimeConfig = useRuntimeConfig() - - return { - ...runtimeConfig.env - } + async arrayBuffer(url: string, params: Record = {}) { + const queryString = new URLSearchParams(defu(this.commonOptions, params)).toString() + const response = await fetch(`${this.baseURL}${url}?${queryString}`, { + method: 'GET' + }) + return response.arrayBuffer() } } - -export function mergeOptions(...options: AxiosRequestConfig[]) { - return defu(axiosInfo.commonOptions, ...options) -} diff --git a/composables/navidrome/useNavidromeCover.ts b/composables/navidrome/useNavidromeCover.ts index de4db12..e77f098 100644 --- a/composables/navidrome/useNavidromeCover.ts +++ b/composables/navidrome/useNavidromeCover.ts @@ -1,18 +1,15 @@ import { Buffer } from 'node:buffer' -import { axiosInfo, mergeOptions } from './shared' +import { navidromeRequest } from './shared' export default async function (id: string) { - const cover = await axiosInfo.instance.post('/getCoverArt.view', null, mergeOptions({ - params: { - id - }, - responseType: 'arraybuffer' - })) + const cover = await navidromeRequest.arrayBuffer('/getCoverArt.view', { + id + }) - if (!(cover.data instanceof Buffer)) { + if (!(cover instanceof ArrayBuffer)) { return '' } - return cover.data + return Buffer.from(cover) } diff --git a/composables/navidrome/useNavidromeData.ts b/composables/navidrome/useNavidromeData.ts index 4635580..a215537 100644 --- a/composables/navidrome/useNavidromeData.ts +++ b/composables/navidrome/useNavidromeData.ts @@ -1,4 +1,4 @@ -import { axiosInfo, mergeOptions } from './shared' +import { navidromeRequest } from './shared' export default async function () { let currentMusic @@ -28,13 +28,11 @@ export default async function () { } async function getHistory() { - const recent = await axiosInfo.instance.post('/getAlbumList.view', null, mergeOptions({ - params: { - type: 'recent', - size: 1 - } - })) - .then(res => _get(res.data, 'subsonic-response.albumList.album.0')) + const recent = await navidromeRequest.get('/getAlbumList.view', { + type: 'recent', + size: 1 + }) + .then(res => _get(res, 'subsonic-response.albumList.album.0')) if (!recent) { return @@ -74,15 +72,13 @@ async function getHistory() { } async function getPlaying() { - return await axiosInfo.instance.post('/getNowPlaying.view', null, axiosInfo.commonOptions) - .then(res => _get(res.data, 'subsonic-response.nowPlaying.entry.0', null)) + return await navidromeRequest.get('/getNowPlaying.view') + .then(res => _get(res, 'subsonic-response.nowPlaying.entry.0', null)) } async function getAlbum(id: string) { - return await axiosInfo.instance.post('/getAlbum.view', null, mergeOptions({ - params: { - id - } - })) - .then(res => _get(res.data, 'subsonic-response.album.song', [])) + return await navidromeRequest.get('/getAlbum.view', { + id + }) + .then(res => _get(res, 'subsonic-response.album.song', [])) } diff --git a/package.json b/package.json index 8de24b7..c8818d5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "@unocss/nuxt": "^0.63.1", "@unocss/reset": "^0.63.1", "@vueuse/nuxt": "^11.1.0", - "axios": "^1.7.4", "defu": "^6.1.4", "floating-vue": "^5.2.2", "nuxt": "^3.12.4", @@ -27,7 +26,6 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20240925.0", - "@haverstack/axios-fetch-adapter": "^0.12.0", "@iconify/json": "^2.2.237", "@imba97/eslint-config": "^0.0.2", "@types/fs-extra": "^11.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c022b91..5a59ef4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,6 @@ importers: '@vueuse/nuxt': specifier: ^11.1.0 version: 11.1.0(magicast@0.3.4)(nuxt@3.12.4(@parcel/watcher@2.4.1)(@types/node@20.14.12)(eslint@9.9.0(jiti@2.0.0))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.4)(rollup@4.19.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.5.4)(vite@5.3.4(@types/node@20.14.12)(sass@1.77.8)(terser@5.31.3))(webpack-sources@3.2.3))(rollup@4.19.0)(vue@3.4.38(typescript@5.5.4))(webpack-sources@3.2.3) - axios: - specifier: ^1.7.4 - version: 1.7.4 defu: specifier: ^6.1.4 version: 6.1.4 @@ -42,9 +39,6 @@ importers: '@cloudflare/workers-types': specifier: ^4.20240925.0 version: 4.20240925.0 - '@haverstack/axios-fetch-adapter': - specifier: ^0.12.0 - version: 0.12.0(axios@1.7.4) '@iconify/json': specifier: ^2.2.237 version: 2.2.237 @@ -1040,11 +1034,6 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@haverstack/axios-fetch-adapter@0.12.0': - resolution: {integrity: sha512-+9WzqzeIvEC6Qrs6ImSqaX5P+eCrWbhzR+GoB7+p8/yqxmq59CPEo0uFuu0wINU9DQuJMzyER9WYdpYVwZV9rw==} - peerDependencies: - axios: ^0.21.1 - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -2107,9 +2096,6 @@ packages: async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - autoprefixer@10.4.19: resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} @@ -2117,9 +2103,6 @@ packages: peerDependencies: postcss: ^8.1.0 - axios@1.7.4: - resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} - b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} @@ -2314,10 +2297,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2549,10 +2528,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -3021,23 +2996,10 @@ packages: '@nuxt/kit': optional: true - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - foreground-child@3.2.1: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -4187,9 +4149,6 @@ packages: protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -6060,10 +6019,6 @@ snapshots: '@floating-ui/utils@0.2.8': {} - '@haverstack/axios-fetch-adapter@0.12.0(axios@1.7.4)': - dependencies: - axios: 1.7.4 - '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.0': {} @@ -7728,8 +7683,6 @@ snapshots: async@3.2.5: {} - asynckit@0.4.0: {} - autoprefixer@10.4.19(postcss@8.4.39): dependencies: browserslist: 4.23.2 @@ -7740,14 +7693,6 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - axios@1.7.4: - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - b4a@1.6.6: {} balanced-match@1.0.2: {} @@ -7960,10 +7905,6 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@2.20.3: {} commander@7.2.0: {} @@ -8151,8 +8092,6 @@ snapshots: defu@6.1.4: {} - delayed-stream@1.0.0: {} - delegates@1.0.0: {} denque@2.1.0: {} @@ -8776,19 +8715,11 @@ snapshots: optionalDependencies: '@nuxt/kit': 3.13.2(magicast@0.3.4)(rollup@4.19.0)(webpack-sources@3.2.3) - follow-redirects@1.15.6: {} - foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - fraction.js@4.3.7: {} fresh@0.5.2: {} @@ -10082,8 +10013,6 @@ snapshots: protocols@2.0.1: {} - proxy-from-env@1.1.0: {} - punycode@2.3.1: {} queue-microtask@1.2.3: {} diff --git a/server/api/playing/test.ts b/server/api/playing/test.ts deleted file mode 100644 index 99a4e59..0000000 --- a/server/api/playing/test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { axiosInfo } from '~/composables/navidrome/shared' - -export default defineEventHandler(async () => { - return await axiosInfo.instance.post('/getNowPlaying.view', null, axiosInfo.commonOptions) - .then(res => _get(res.data, 'subsonic-response.nowPlaying.entry.0', null)) -})