From 0356af4175cd16249c6728785972b08287a9db35 Mon Sep 17 00:00:00 2001 From: MomentQYC <“zixipersonal@gmail.com”> Date: Fri, 4 Oct 2024 23:46:39 +0800 Subject: [PATCH] WIP --- .../src/server/api/endpoints/notes/tts.ts | 9 +++- packages/frontend/src/components/MkNote.vue | 2 +- .../src/pages/admin/external-services.vue | 2 +- .../frontend/src/scripts/get-note-menu.ts | 4 +- packages/frontend/src/scripts/misskey-api.ts | 45 +++++++++++-------- 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/notes/tts.ts b/packages/backend/src/server/api/endpoints/notes/tts.ts index 86b3ad7e99..0238456947 100644 --- a/packages/backend/src/server/api/endpoints/notes/tts.ts +++ b/packages/backend/src/server/api/endpoints/notes/tts.ts @@ -99,8 +99,15 @@ export default class extends Endpoint { // eslint- timeout: 60000, }); + let contentType = res.headers.get('content-type') || 'application/octet-stream'; + if (res.headers.get('content-type') === 'audio/flac') { - return res.body; + return { + body: res.body, + headers: { + 'Content-Type': contentType, + } + }; } else { throw new ApiError(meta.errors.unavailable); } diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 3402e9c488..b3da34365b 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -543,7 +543,7 @@ function showMenu(): void { return; } - const { menu, cleanup } = getNoteMenu({ note: note.value, translating, translation, isDeleted, currentClip: currentClip?.value }); + const { menu, cleanup } = getNoteMenu({ note: note.value, translating, translation, convert, converting, isDeleted, currentClip: currentClip?.value }); os.popupMenu(menu, menuButton.value).then(focus).finally(cleanup); } diff --git a/packages/frontend/src/pages/admin/external-services.vue b/packages/frontend/src/pages/admin/external-services.vue index 33eea64662..96b305e8f8 100644 --- a/packages/frontend/src/pages/admin/external-services.vue +++ b/packages/frontend/src/pages/admin/external-services.vue @@ -24,12 +24,12 @@ SPDX-License-Identifier: AGPL-3.0-only -
+ Save
diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts index 92cc27a335..315fc053df 100644 --- a/packages/frontend/src/scripts/get-note-menu.ts +++ b/packages/frontend/src/scripts/get-note-menu.ts @@ -304,11 +304,11 @@ export function getNoteMenu(props: { props.converting.value = true; const res = await misskeyApi('notes/tts', { noteId: appearNote.id, - }); + }, undefined, undefined, true); if (res.headers.get('Content-Type')?.startsWith('audio/')) { props.convert.value = await res.blob(); } else { - console.error('API did not return audio data.'); + console.error('API did not return audio data.',res.headers.get('Content-Type') , await res.text()); } props.converting.value = false; } diff --git a/packages/frontend/src/scripts/misskey-api.ts b/packages/frontend/src/scripts/misskey-api.ts index 1b1159fd01..8c23084597 100644 --- a/packages/frontend/src/scripts/misskey-api.ts +++ b/packages/frontend/src/scripts/misskey-api.ts @@ -20,7 +20,8 @@ export function misskeyApi< data: P = {} as any, token?: string | null | undefined, signal?: AbortSignal, -): Promise<_ResT> { + returnResponse: boolean = false +): Promise<_ResT | Response> { if (endpoint.includes('://')) throw new Error('invalid endpoint'); pendingApiRequestsCount.value++; @@ -28,7 +29,7 @@ export function misskeyApi< pendingApiRequestsCount.value--; }; - const promise = new Promise<_ResT>((resolve, reject) => { + const promise = new Promise<_ResT | Response>((resolve, reject) => { // Append a credential if ($i) (data as any).i = $i.token; if (token !== undefined) (data as any).i = token; @@ -44,14 +45,17 @@ export function misskeyApi< }, signal, }).then(async (res) => { - const body = res.status === 204 ? null : await res.json(); - - if (res.status === 200) { - resolve(body); - } else if (res.status === 204) { - resolve(undefined as _ResT); // void -> undefined + if (returnResponse) { + resolve(res); } else { - reject(body.error); + const body = res.status === 204 ? null : await res.json(); + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(undefined as _ResT); // void -> undefined + } else { + reject(body.error); + } } }).catch(reject); }); @@ -70,7 +74,8 @@ export function misskeyApiGet< >( endpoint: E, data: P = {} as any, -): Promise<_ResT> { + returnResponse: boolean = false +): Promise<_ResT | Response> { pendingApiRequestsCount.value++; const onFinally = () => { @@ -79,21 +84,24 @@ export function misskeyApiGet< const query = new URLSearchParams(data as any); - const promise = new Promise<_ResT>((resolve, reject) => { + const promise = new Promise<_ResT | Response>((resolve, reject) => { // Send request window.fetch(`${apiUrl}/${endpoint}?${query}`, { method: 'GET', credentials: 'omit', cache: 'default', }).then(async (res) => { - const body = res.status === 204 ? null : await res.json(); - - if (res.status === 200) { - resolve(body); - } else if (res.status === 204) { - resolve(undefined as _ResT); // void -> undefined + if (returnResponse) { + resolve(res); } else { - reject(body.error); + const body = res.status === 204 ? null : await res.json(); + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(undefined as _ResT); // void -> undefined + } else { + reject(body.error); + } } }).catch(reject); }); @@ -102,3 +110,4 @@ export function misskeyApiGet< return promise; } +