From 9599b802a4920d5a60553ca1b405cb49efb31cfb Mon Sep 17 00:00:00 2001 From: Leafus Date: Mon, 19 May 2025 16:34:21 +0000 Subject: [PATCH] feat: add music to front page of instance (#6) --- .../1743894419864-AddMusicFieldsToMeta.js | 20 +++++++++++++ .../src/core/entities/MetaEntityService.ts | 2 ++ packages/backend/src/models/Meta.ts | 11 +++++++ .../backend/src/models/json-schema/meta.ts | 8 +++++ .../src/server/api/endpoints/admin/meta.ts | 10 +++++++ .../server/api/endpoints/admin/update-meta.ts | 10 +++++++ .../src/components/MkVisitorDashboard.vue | 2 ++ .../src/components/PwVisitorMusic.vue | 30 +++++++++++++++++++ .../frontend/src/pages/admin/branding.vue | 17 +++++++++++ 9 files changed, 110 insertions(+) create mode 100644 packages/backend/migration/1743894419864-AddMusicFieldsToMeta.js create mode 100644 packages/frontend/src/components/PwVisitorMusic.vue diff --git a/packages/backend/migration/1743894419864-AddMusicFieldsToMeta.js b/packages/backend/migration/1743894419864-AddMusicFieldsToMeta.js new file mode 100644 index 0000000000..9cbf6d7443 --- /dev/null +++ b/packages/backend/migration/1743894419864-AddMusicFieldsToMeta.js @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddMusicFieldsToMeta1743894419864 implements MigrationInterface { + name = 'AddMusicFieldsToMeta1743894419864' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "meta" ADD "musicSource" character varying(1024)`); + await queryRunner.query(`ALTER TABLE "meta" ADD "musicEnabled" boolean NOT NULL DEFAULT false`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "musicEnabled"`); + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "musicSource"`); + } +} diff --git a/packages/backend/src/core/entities/MetaEntityService.ts b/packages/backend/src/core/entities/MetaEntityService.ts index a2d2ee8528..750cdb9115 100644 --- a/packages/backend/src/core/entities/MetaEntityService.ts +++ b/packages/backend/src/core/entities/MetaEntityService.ts @@ -114,6 +114,8 @@ export class MetaEntityService { sidebarLogoUrl: instance.sidebarLogoUrl, backgroundImageUrl: instance.backgroundImageUrl, logoImageUrl: instance.logoImageUrl, + musicSource: instance.musicSource, + musicEnabled: instance.musicEnabled, maxNoteTextLength: this.config.maxNoteLength, maxRemoteNoteTextLength: this.config.maxRemoteNoteLength, maxCwLength: this.config.maxCwLength, diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts index 6276e47618..09fac44c8c 100644 --- a/packages/backend/src/models/Meta.ts +++ b/packages/backend/src/models/Meta.ts @@ -142,6 +142,17 @@ export class MiMeta { @Column('boolean', { default: false, }) + public musicSource: string | null; + + @Column('boolean', { + default: false, + }) + public musicEnabled: boolean; + + @Column('varchar', { + length: 1024, + nullable: true, + }) public iconUrl: string | null; @Column('varchar', { diff --git a/packages/backend/src/models/json-schema/meta.ts b/packages/backend/src/models/json-schema/meta.ts index 10334f1b78..8b78512bd9 100644 --- a/packages/backend/src/models/json-schema/meta.ts +++ b/packages/backend/src/models/json-schema/meta.ts @@ -321,6 +321,14 @@ export const packedMetaLiteSchema = { type: 'string', optional: false, nullable: true, }, + musicSource: { + type: 'string', + optional: false, nullable: true, + }, + musicEnabled: { + type: 'boolean', + optional: false, nullable: false, + }, privacyPolicyUrl: { type: 'string', optional: false, nullable: true, diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 35e455bab8..54ec3582de 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -453,6 +453,14 @@ export const meta = { type: 'string', optional: false, nullable: true, }, + musicSource: { + type: 'string', + optional: false, nullable: true, + }, + musicEnabled: { + type: 'boolean', + optional: false, nullable: false, + }, translationTimeout: { type: 'number', optional: false, nullable: false, @@ -696,6 +704,8 @@ export default class extends Endpoint { // eslint- app512IconUrl: instance.app512IconUrl, sidebarLogoUrl: instance.sidebarLogoUrl, backgroundImageUrl: instance.backgroundImageUrl, + musicSource: instance.musicSource, + musicEnabled: instance.musicEnabled, logoImageUrl: instance.logoImageUrl, defaultLightTheme: instance.defaultLightTheme, defaultDarkTheme: instance.defaultDarkTheme, diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 4868fceb89..d279d93820 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -63,6 +63,8 @@ export const paramDef = { app512IconUrl: { type: 'string', nullable: true }, sidebarLogoUrl: { type: 'string', nullable: true }, backgroundImageUrl: { type: 'string', nullable: true }, + musicSource: { type: 'string', nullable: true }, + musicEnabled: { type: 'boolean', nullable: false }, logoImageUrl: { type: 'string', nullable: true }, name: { type: 'string', nullable: true }, shortName: { type: 'string', nullable: true }, @@ -316,6 +318,14 @@ export default class extends Endpoint { // eslint- set.backgroundImageUrl = ps.backgroundImageUrl; } + if (ps.musicEnabled !== undefined) { + set.musicEnabled = ps.musicEnabled; + } + + if (ps.musicSource !== undefined) { + set.musicSource = ps.musicSource; + } + if (ps.logoImageUrl !== undefined) { set.logoImageUrl = ps.logoImageUrl; } diff --git a/packages/frontend/src/components/MkVisitorDashboard.vue b/packages/frontend/src/components/MkVisitorDashboard.vue index 942085f7bb..4f3b94e0e5 100644 --- a/packages/frontend/src/components/MkVisitorDashboard.vue +++ b/packages/frontend/src/components/MkVisitorDashboard.vue @@ -5,6 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only