From 43f0b9a73cc97c2587a9fd702086859d36fc6647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=82=8F=E3=82=8F=E3=82=8F=E3=81=A8=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=82=85?= <17376330+u1-liquid@users.noreply.github.com> Date: Sun, 10 Nov 2024 13:03:18 +0900 Subject: [PATCH 01/18] =?UTF-8?q?fix(about-report-resolver):=20=E8=BB=A2?= =?UTF-8?q?=E9=80=81=E8=A8=AD=E5=AE=9A=E3=82=92=E4=B8=80=E5=BA=A6=E6=9C=89?= =?UTF-8?q?=E5=8A=B9=E3=81=AB=E3=81=99=E3=82=8B=E3=81=A8=E6=88=BB=E3=81=99?= =?UTF-8?q?=E3=81=93=E3=81=A8=E3=81=8C=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3=20(MisskeyIO#812)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked from atsu1125/misskey-core@5001b4b77c8e12818e6c039d61b95eaea1b55be7 Co-authored-by: atsu1125 --- .../server/api/endpoints/admin/abuse-report-resolver/update.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/update.ts b/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/update.ts index ab77109c8..8bc724cf0 100644 --- a/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/update.ts @@ -99,7 +99,7 @@ export default class extends Endpoint { } else if (ps.reportContentPattern === null) { properties.reportContentPattern = null; } - if (ps.forward) properties.forward = ps.forward; + if (ps.forward !== undefined) properties.forward = ps.forward; if (ps.expiresAt) { let expirationDate: Date | null = new Date(); const previousMonth = expirationDate.getUTCMonth(); From a761b2e6cee37f7a7fef9429158715a9bdd4cc9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=82=8F=E3=82=8F=E3=82=8F=E3=81=A8=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=82=85?= <17376330+u1-liquid@users.noreply.github.com> Date: Sun, 10 Nov 2024 13:03:38 +0900 Subject: [PATCH 02/18] =?UTF-8?q?fix(frontend):=20=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=BC=E3=81=AE=E3=83=97=E3=83=AD=E3=83=95=E3=82=A3?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=83=9A=E3=83=BC=E3=82=B8=E9=96=B2=E8=A6=A7?= =?UTF-8?q?=E6=99=82=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=8C=E7=99=BA=E7=94=9F?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=93=E3=81=A8=E3=81=8C=E3=81=82=E3=82=8B?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3=20(MisskeyIO#813)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkAccountMoved.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkAccountMoved.vue b/packages/frontend/src/components/MkAccountMoved.vue index 594e5ab7e..1349df7bf 100644 --- a/packages/frontend/src/components/MkAccountMoved.vue +++ b/packages/frontend/src/components/MkAccountMoved.vue @@ -27,7 +27,11 @@ const props = defineProps<{ movedFrom?: string; // user id }>(); -misskeyApi('users/show', { userId: props.movedTo ?? props.movedFrom }).then(u => user.value = u); +if (props.movedTo || props.movedFrom) { + misskeyApi('users/show', { + userId: props.movedTo ?? props.movedFrom + }).then(u => user.value = u); +} diff --git a/packages/frontend/src/components/MkMediaAudio.vue b/packages/frontend/src/components/MkMediaAudio.vue index b23ef9b72..88a55f17c 100644 --- a/packages/frontend/src/components/MkMediaAudio.vue +++ b/packages/frontend/src/components/MkMediaAudio.vue @@ -35,40 +35,43 @@ SPDX-License-Identifier: AGPL-3.0-only -
- -
- -
-
- -
-
{{ hms(elapsedTimeMs) }}
-
- +
+ +
+ +
+ +
+
+ +
+
{{ hms(elapsedTimeMs) }}
+
+ + +
-
@@ -82,12 +85,14 @@ import { i18n } from '@/i18n.js'; import * as os from '@/os.js'; import bytes from '@/filters/bytes.js'; import { hms } from '@/filters/hms.js'; +import MkAudioVisualizer from '@/components/MkAudioVisualizer.vue'; import MkMediaRange from '@/components/MkMediaRange.vue'; import { pleaseLogin } from '@/scripts/please-login.js'; import { $i, iAmModerator } from '@/account.js'; const props = defineProps<{ audio: Misskey.entities.DriveFile; + user?: Misskey.entities.UserLite; }>(); const keymap = { @@ -126,6 +131,7 @@ function hasFocus() { const playerEl = shallowRef(); const audioEl = shallowRef(); +const audioVisualizer = ref>(); // eslint-disable-next-line vue/no-setup-props-destructure const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.dataSaver.media) ? true : (props.audio.isSensitive && defaultStore.state.nsfw !== 'ignore')); @@ -240,6 +246,11 @@ const isPlaying = ref(false); const isActuallyPlaying = ref(false); const elapsedTimeMs = ref(0); const durationMs = ref(0); +const audioContext = ref(null); +const sourceNode = ref(null); +const gainNode = ref(null); +const analyserGainNode = ref(null); +const analyserNode = ref(null); const rangePercent = computed({ get: () => { return (elapsedTimeMs.value / durationMs.value) || 0; @@ -262,11 +273,33 @@ const bufferedDataRatio = computed(() => { function togglePlayPause() { if (!isReady.value || !audioEl.value) return; + if (!sourceNode.value) { + audioContext.value = new (window.AudioContext || window.webkitAudioContext)(); + sourceNode.value = audioContext.value.createMediaElementSource(audioEl.value); + + analyserGainNode.value = audioContext.value.createGain(); + gainNode.value = audioContext.value.createGain(); + analyserNode.value = audioContext.value.createAnalyser(); + + sourceNode.value.connect(analyserGainNode.value); + analyserGainNode.value.connect(analyserNode.value); + analyserNode.value.connect(gainNode.value); + gainNode.value.connect(audioContext.value.destination); + + analyserNode.value.fftSize = 2048; + + analyserGainNode.value.gain.setValueAtTime(0.8, audioContext.value.currentTime); + + gainNode.value.gain.setValueAtTime(volume.value, audioContext.value.currentTime); + } + if (isPlaying.value) { audioEl.value.pause(); + audioVisualizer.value?.pauseAnimation(); isPlaying.value = false; } else { audioEl.value.play(); + audioVisualizer.value?.resumeAnimation(); isPlaying.value = true; oncePlayed.value = true; } @@ -324,6 +357,7 @@ function init() { oncePlayed.value = false; isActuallyPlaying.value = false; isPlaying.value = false; + audioVisualizer.value?.pauseAnimation(); }); durationMs.value = audioEl.value.duration * 1000; @@ -332,8 +366,7 @@ function init() { durationMs.value = audioEl.value.duration * 1000; } }); - - audioEl.value.volume = volume.value; + gainNode.value?.gain.setValueAtTime(volume.value, audioContext.value?.currentTime); } }, { immediate: true, @@ -341,7 +374,7 @@ function init() { } watch(volume, (to) => { - if (audioEl.value) audioEl.value.volume = to; + if (audioEl.value) gainNode.value?.gain.setValueAtTime(to, audioContext.value?.currentTime); }); watch(speed, (to) => { diff --git a/packages/frontend/src/components/MkMediaBanner.vue b/packages/frontend/src/components/MkMediaBanner.vue index 7a128fbad..7eeab073c 100644 --- a/packages/frontend/src/components/MkMediaBanner.vue +++ b/packages/frontend/src/components/MkMediaBanner.vue @@ -5,12 +5,12 @@ SPDX-License-Identifier: AGPL-3.0-only