8 Commits 1683f9dbc2 ... 3c8caf17f8

Author SHA1 Message Date
  Owen Diffey 3c8caf17f8 chore: Update package version to v3.12.0-rc1 1 month ago
  Owen Diffey 82e87358d4 chore: Add v3.12.0-rc1 changelog 1 month ago
  Owen Diffey 979d273d83 fix: Eslint fixes 1 month ago
  Owen Diffey b19f9a2803 chore: Update packages 1 month ago
  Owen Diffey a5a1e0a57b fix(AdvancedTable): Hidden columns table header visible 1 month ago
  Kristian Vos d0e8f0cf83 fix: adding to playlist from YouTube search didn't work 1 month ago
  Owen Diffey ab3dbee934 chore: Update config version 1 month ago
  Owen Diffey e3e1e913df refactor: Remove unused steps from remove account modal 1 month ago

+ 47 - 0
CHANGELOG.md

@@ -1,5 +1,52 @@
 # Changelog
 
+## [v3.12.0-rc1] - 2025-01-19
+
+### **Breaking Changes**
+
+This release includes breaking changes to our docker setup, in particular the
+usage of named volumes and the removal of many redundant configuration options.
+
+In addition to this, GitHub authentication has been removed. If your instance
+has GitHub users, keep this in mind. If a user only has GitHub currently, you
+could instruct them to set a password before updating, or they can reset their
+password after updating if this is enabled on your instance.
+
+Before updating or pulling changes please make a full backup,
+and after updating restore using the [Utility Script](./.wiki/Utility_Script.md).
+Please refer to the [Configuration documentation](.wiki/Configuration.md)
+for more information on how you should now configure docker.
+
+Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
+
+### Added
+
+- feat: Add env config change check to musare.sh update
+- chore: Add backend debug
+- chore: Add vscode settings and extensions
+- feat: OIDC authentication
+- feat: Add default station and playlist privacy preferences
+- feat: Add privacy option to create station modal
+- feat: Add configuration option to retrict site to logged in users
+
+### Changed
+
+- refactor: Use node alpine docker images
+- refactor: Use non-root user in docker
+- refactor: Separates docker environment builds and combines modes into APP_ENV
+- refactor: Remove unnecessary configuration options
+- refactor: Split docker networks
+- refactor: Improve musare.sh handling and styling
+- chore: Update to node 22
+- refactor: Move users actions logic to module jobs
+- refactor: Remove GitHub authentication
+
+### Fixed
+
+- fix: Station undefined in autorequestExcludedMediaSources
+- fix: Advanced table hidden columns table header visible
+- fix: Adding song to playlist from YouTube search in EditPlaylist wouldn't work
+
 ## [v3.11.0] - 2024-03-02
 
 This release includes all changes from v3.11.0-rc1, in addition to the following.

+ 1 - 1
backend/config/default.json

@@ -1,5 +1,5 @@
 {
-	"configVersion": 12,
+	"configVersion": 13,
 	"migration": false,
 	"secret": "default",
 	"port": 8080,

+ 1 - 1
backend/config/template.json

@@ -1,5 +1,5 @@
 {
-	"configVersion": 12,
+	"configVersion": 13,
 	"migration": false,
 	"secret": "CHANGE_ME",
 	"url": {

+ 1 - 1
backend/index.js

@@ -7,7 +7,7 @@ import fs from "fs";
 import * as readline from "node:readline";
 import packageJson from "./package.json" with { type: "json" };
 
-const REQUIRED_CONFIG_VERSION = 12;
+const REQUIRED_CONFIG_VERSION = 13;
 
 // eslint-disable-next-line
 Array.prototype.remove = function (item) {

+ 3 - 3
backend/logic/spotify.js

@@ -773,7 +773,7 @@ class _SpotifyModule extends CoreClass {
 						result
 					}
 				});
-			} catch (err) {
+			} catch {
 				this.publishProgress({
 					status: "working",
 					message: `Failed to get alternative artist source for ${artistId}`,
@@ -862,7 +862,7 @@ class _SpotifyModule extends CoreClass {
 						result
 					}
 				});
-			} catch (err) {
+			} catch {
 				this.publishProgress({
 					status: "working",
 					message: `Failed to get alternative album source for ${albumId}`,
@@ -935,7 +935,7 @@ class _SpotifyModule extends CoreClass {
 						result
 					}
 				});
-			} catch (err) {
+			} catch {
 				this.publishProgress({
 					status: "working",
 					message: `Failed to get alternative media for ${mediaSource}`,

File diff suppressed because it is too large
+ 238 - 305
backend/package-lock.json


+ 12 - 12
backend/package.json

@@ -1,7 +1,7 @@
 {
   "name": "musare-backend",
   "private": true,
-  "version": "3.11.0",
+  "version": "3.12.0-rc1",
   "type": "module",
   "description": "An open-source collaborative music listening and catalogue curation application. Currently supporting YouTube based content.",
   "main": "index.js",
@@ -16,17 +16,17 @@
   },
   "dependencies": {
     "async": "^3.2.6",
-    "axios": "^1.7.7",
+    "axios": "^1.7.9",
     "bcrypt": "^5.1.1",
     "bluebird": "^3.7.2",
     "body-parser": "^1.20.3",
     "config": "^3.3.12",
     "cookie-parser": "^1.4.7",
     "cors": "^2.8.5",
-    "express": "^4.21.1",
+    "express": "^4.21.2",
     "extensionless": "^1.9.9",
     "moment": "^2.30.1",
-    "mongoose": "^6.13.3",
+    "mongoose": "^6.13.6",
     "nodemailer": "^6.9.16",
     "redis": "^4.7.0",
     "retry-axios": "^3.1.3",
@@ -37,19 +37,19 @@
     "ws": "^8.18.0"
   },
   "devDependencies": {
-    "@typescript-eslint/eslint-plugin": "^7.18.0",
-    "@typescript-eslint/parser": "^7.18.0",
+    "@typescript-eslint/eslint-plugin": "^8.20.0",
+    "@typescript-eslint/parser": "^8.20.0",
     "eslint": "^8.57.1",
     "eslint-config-airbnb-base": "^15.0.0",
-    "eslint-config-prettier": "^9.1.0",
+    "eslint-config-prettier": "^10.0.1",
     "eslint-plugin-import": "^2.31.0",
-    "eslint-plugin-jsdoc": "^50.4.3",
-    "eslint-plugin-prettier": "^5.2.1",
-    "nodemon": "^3.1.7",
-    "prettier": "3.3.3",
+    "eslint-plugin-jsdoc": "^50.6.2",
+    "eslint-plugin-prettier": "^5.2.3",
+    "nodemon": "^3.1.9",
+    "prettier": "3.4.2",
     "trace-unhandled": "^2.0.1",
     "ts-node": "^10.9.2",
-    "typescript": "^5.6.3"
+    "typescript": "^5.7.3"
   },
   "overrides": {
     "@aws-sdk/credential-providers": "npm:dry-uninstall"

File diff suppressed because it is too large
+ 413 - 169
frontend/package-lock.json


+ 24 - 25
frontend/package.json

@@ -5,7 +5,7 @@
     "*.vue"
   ],
   "private": true,
-  "version": "3.11.0",
+  "version": "3.12.0-rc1",
   "description": "An open-source collaborative music listening and catalogue curation application. Currently supporting YouTube based content.",
   "main": "main.js",
   "author": "Musare Team",
@@ -22,45 +22,44 @@
   "devDependencies": {
     "@pinia/testing": "^0.1.7",
     "@types/can-autoplay": "^3.0.5",
-    "@types/dompurify": "^3.0.5",
-    "@typescript-eslint/eslint-plugin": "^7.18.0",
-    "@typescript-eslint/parser": "^7.18.0",
-    "@vitest/coverage-v8": "^2.1.4",
+    "@typescript-eslint/eslint-plugin": "^8.20.0",
+    "@typescript-eslint/parser": "^8.20.0",
+    "@vitest/coverage-v8": "^3.0.2",
     "@vue/test-utils": "^2.4.6",
     "eslint": "^8.57.1",
-    "eslint-config-prettier": "^9.1.0",
+    "eslint-config-prettier": "^10.0.1",
     "eslint-plugin-import": "^2.31.0",
-    "eslint-plugin-prettier": "^5.2.1",
-    "eslint-plugin-vue": "^9.30.0",
-    "jsdom": "^25.0.1",
-    "less": "^4.2.0",
-    "prettier": "^3.3.3",
+    "eslint-plugin-prettier": "^5.2.3",
+    "eslint-plugin-vue": "^9.32.0",
+    "jsdom": "^26.0.0",
+    "less": "^4.2.1",
+    "prettier": "^3.4.2",
     "vite-plugin-dynamic-import": "^1.6.0",
-    "vitest": "^2.1.4",
+    "vitest": "^3.0.2",
     "vue-eslint-parser": "^9.4.3",
-    "vue-tsc": "^2.1.10"
+    "vue-tsc": "^2.2.0"
   },
   "dependencies": {
-    "@intlify/unplugin-vue-i18n": "^5.3.0",
-    "@vitejs/plugin-vue": "^5.1.4",
+    "@intlify/unplugin-vue-i18n": "^6.0.3",
+    "@vitejs/plugin-vue": "^5.2.1",
     "can-autoplay": "^3.0.2",
-    "chart.js": "^4.4.6",
+    "chart.js": "^4.4.7",
     "date-fns": "^4.1.0",
-    "dompurify": "^3.1.7",
+    "dompurify": "^3.2.3",
     "eslint-config-airbnb-base": "^15.0.0",
-    "marked": "^15.0.0",
+    "marked": "^15.0.6",
     "normalize.css": "^8.0.1",
-    "pinia": "^2.2.6",
+    "pinia": "^2.3.0",
     "toasters": "^2.3.1",
-    "typescript": "^5.6.3",
-    "vite": "^5.4.10",
-    "vue": "^3.5.12",
+    "typescript": "^5.7.3",
+    "vite": "^6.0.7",
+    "vue": "^3.5.13",
     "vue-chartjs": "^5.3.2",
     "vue-content-loader": "^2.0.1",
     "vue-draggable-list": "^0.2.0",
-    "vue-i18n": "^10.0.4",
+    "vue-i18n": "^11.0.1",
     "vue-json-pretty": "^2.4.0",
-    "vue-router": "^4.4.5",
-    "vue-tippy": "^6.5.0"
+    "vue-router": "^4.5.0",
+    "vue-tippy": "^6.6.0"
   }
 }

+ 1 - 1
frontend/src/components/AdvancedTable.vue

@@ -1598,7 +1598,7 @@ watch(selectedRows, (newSelectedRows, oldSelectedRows) => {
 					<thead>
 						<tr>
 							<draggable-list
-								v-model:list="orderedColumns"
+								v-model:list="sortedFilteredColumns"
 								item-key="name"
 								@update="columnOrderChanged"
 								tag="th"

+ 1 - 1
frontend/src/components/modals/EditPlaylist/Tabs/AddSongs.vue

@@ -259,7 +259,7 @@ watch(
 								@click="
 									addYouTubeSongToPlaylist(
 										playlist._id,
-										result.id,
+										`youtube:${result.id}`,
 										index
 									)
 								"

+ 1 - 1
frontend/src/components/modals/EditPlaylist/Tabs/ImportPlaylists.vue

@@ -151,7 +151,7 @@ const onMusarePlaylistFileChange = () => {
 					"An error occured whilst parsing the playlist file. Is it valid?"
 				);
 			else importMusarePlaylistFileContents.value = parsed;
-		} catch (err) {
+		} catch {
 			new Toast(
 				"An error occured whilst parsing the playlist file. Is it valid?"
 			);

+ 5 - 5
frontend/src/components/modals/EditSong/index.vue

@@ -812,7 +812,7 @@ const getYouTubeData = type => {
 
 			if (title) setValue({ title });
 			else throw new Error("No title found");
-		} catch (e) {
+		} catch {
 			new Toast(
 				"Unable to fetch YouTube video title. Try starting the video."
 			);
@@ -830,7 +830,7 @@ const getYouTubeData = type => {
 
 			if (author) setValue({ addArtist: author });
 			else throw new Error("No video author found");
-		} catch (e) {
+		} catch {
 			new Toast(
 				"Unable to fetch YouTube video author. Try starting the video."
 			);
@@ -847,7 +847,7 @@ const getSoundCloudData = type => {
 				if (title) setValue({ title });
 				else throw new Error("No title found");
 			});
-		} catch (e) {
+		} catch {
 			new Toast("Unable to fetch SoundCloud track title.");
 		}
 	}
@@ -866,7 +866,7 @@ const getSoundCloudData = type => {
 				if (artworkUrl) setValue({ thumbnail: artworkUrl });
 				else throw new Error("No thumbnail found");
 			});
-		} catch (e) {
+		} catch {
 			new Toast("Unable to fetch SoundCloud track artwork.");
 		}
 	}
@@ -879,7 +879,7 @@ const getSoundCloudData = type => {
 				if (user) setValue({ addArtist: user.username });
 				else throw new Error("No artist found");
 			});
-		} catch (e) {
+		} catch {
 			new Toast("Unable to fetch SoundCloud track artist.");
 		}
 	}

+ 7 - 43
frontend/src/components/modals/RemoveAccount.vue

@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { defineAsyncComponent, ref } from "vue";
+import { defineAsyncComponent, onMounted, ref } from "vue";
 import Toast from "toasters";
 import { storeToRefs } from "pinia";
 import { useConfigStore } from "@/stores/config";
@@ -60,11 +60,6 @@ const confirmPasswordMatch = () =>
 		else new Toast(res.message);
 	});
 
-const confirmOIDCLink = () => {
-	// TODO
-	step.value = "remove-account";
-};
-
 const remove = () =>
 	socket.dispatch("users.remove", res => {
 		if (res.status === "success") {
@@ -77,6 +72,10 @@ const remove = () =>
 
 		return new Toast(res.message);
 	});
+
+onMounted(() => {
+	if (oidcAuthentication.value) step.value = "remove-account";
+});
 </script>
 
 <template>
@@ -85,7 +84,7 @@ const remove = () =>
 		class="confirm-account-removal-modal"
 	>
 		<template #body>
-			<div id="steps">
+			<div v-if="!oidcAuthentication" id="steps">
 				<p
 					class="step"
 					:class="{ selected: step === 'confirm-identity' }"
@@ -93,22 +92,13 @@ const remove = () =>
 					1
 				</p>
 				<span class="divider"></span>
-				<p
-					class="step"
-					:class="{
-						selected: step === 'export-data'
-					}"
-				>
-					2
-				</p>
-				<span class="divider"></span>
 				<p
 					class="step"
 					:class="{
 						selected: step === 'remove-account'
 					}"
 				>
-					3
+					2
 				</p>
 			</div>
 
@@ -173,32 +163,6 @@ const remove = () =>
 				</div>
 			</div>
 
-			<div
-				class="content-box"
-				v-else-if="oidcAuthentication && step === 'confirm-identity'"
-			>
-				<h2 class="content-box-title">Verify your OIDC</h2>
-				<p class="content-box-description">
-					Check your account is still linked to remove your account.
-				</p>
-
-				<div class="content-box-inputs">
-					<a class="button is-oidc" @click="confirmOIDCLink()">
-						<div class="icon">
-							<img
-								class="invert"
-								src="/assets/social/github.svg"
-							/>
-						</div>
-						&nbsp; Check whether OIDC is linked
-					</a>
-				</div>
-			</div>
-
-			<div v-if="step === 'export-data'">
-				DOWNLOAD A BACKUP OF YOUR DATA BEFORE ITS PERMENATNELY DELETED
-			</div>
-
 			<div
 				class="content-box"
 				id="remove-account-container"

+ 1 - 1
frontend/src/composables/useYoutubeDirect.ts

@@ -40,7 +40,7 @@ export const useYoutubeDirect = () => {
 					return youtubeVideoIdMatch.groups.youtubeId;
 				}
 			}
-		} catch (error) {
+		} catch {
 			return null;
 		}
 

+ 1 - 1
frontend/src/pages/Station/Sidebar/Users.vue

@@ -67,7 +67,7 @@ const copyToClipboard = async () => {
 		await navigator.clipboard.writeText(
 			configStore.urls.client + route.fullPath
 		);
-	} catch (err) {
+	} catch {
 		new Toast("Failed to copy to clipboard.");
 	}
 };

Some files were not shown because too many files changed in this diff