From 047a3a8b298758778890793c39e1d01512ee3e49 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Tue, 8 Sep 2026 09:52:40 +0200 Subject: [PATCH] feat: song editor --- backend/src/app.ts | 5 +- backend/src/routes/room/update.ts | 1 - web/src/components/player/QueueViewer.vue | 2 +- web/src/components/popups/SongEditor.vue | 61 ++++++++++++++++++- web/src/composables/AssociationView.vue | 10 ++- web/src/composables/SearchView.vue | 4 ++ web/src/composables/importTypePicker.ts | 2 + web/src/stores/authstore.ts | 2 +- web/src/ts/dtype/playlist.d.ts | 2 - web/src/ts/messages/index.ts | 3 +- web/src/ts/player/index.ts | 12 ++-- web/src/ts/player/playlists/loader.ts | 1 - web/src/ts/player/plugins/interface.d.ts | 5 +- .../player/plugins/musickit/search/index.ts | 26 +++++--- web/src/views/SharedView.vue | 28 ++++++++- web/src/views/StartPage.vue | 56 +++++++++-------- 16 files changed, 169 insertions(+), 51 deletions(-) diff --git a/backend/src/app.ts b/backend/src/app.ts index 4cd54d1..1512c64 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -43,7 +43,8 @@ const run = () => { 'frontendURL': config.webUrl, 'corsWhitelist': [ config.webUrl ], 'recheckTimeout': 300 * 1000, - 'advancedVerification': 'sdk' + 'advancedVerification': 'sdk', + 'defaultRedirectURL': '/app' }, app, async () => { @@ -75,8 +76,6 @@ const run = () => { response.redirect( config.webUrl ?? 'https://music.janishutz.com' ); } ); - // TODO: Need way for frontend to get the connection type for shares - // Load extra routes devtoken.routes( app, foss ); diff --git a/backend/src/routes/room/update.ts b/backend/src/routes/room/update.ts index 5aa75ae..ddf36d2 100644 --- a/backend/src/routes/room/update.ts +++ b/backend/src/routes/room/update.ts @@ -16,7 +16,6 @@ import { const routes = ( app: express.Application, foss: boolean, config: Config ) => { const sdk = getLoginSdk( foss ); - // FIXME: Here, if not in sse mode, simply close the connection after sending 'poll' app.get( '/room/:id/connect', corsManager.middleware( false ), sseMiddleware( 'client', config ) ); app.get( '/room/:id/poll', corsManager.middleware( false ), ( request: express.Request, response: express.Response ) => { diff --git a/web/src/components/player/QueueViewer.vue b/web/src/components/player/QueueViewer.vue index 4fa10f9..3d3e7d7 100644 --- a/web/src/components/player/QueueViewer.vue +++ b/web/src/components/player/QueueViewer.vue @@ -64,7 +64,7 @@ Save - +
diff --git a/web/src/components/popups/SongEditor.vue b/web/src/components/popups/SongEditor.vue index ce1f506..0150894 100644 --- a/web/src/components/popups/SongEditor.vue +++ b/web/src/components/popups/SongEditor.vue @@ -1,16 +1,75 @@ diff --git a/web/src/composables/AssociationView.vue b/web/src/composables/AssociationView.vue index 9193a3d..90acd8d 100644 --- a/web/src/composables/AssociationView.vue +++ b/web/src/composables/AssociationView.vue @@ -49,6 +49,12 @@ isShowingAssociationManager.value = false; fullPlayer.value = false; }; + + const retry = () => { + associationResults.value = []; + isAnalyzing.value = false; + needsFiles.value = true; + };