diff --git a/src/index.html b/src/index.html
index c710889..3fa0baa 100644
--- a/src/index.html
+++ b/src/index.html
@@ -209,6 +209,7 @@
+
diff --git a/src/js/auth.js b/src/js/auth.js
index bfa4ad7..b120957 100644
--- a/src/js/auth.js
+++ b/src/js/auth.js
@@ -67,7 +67,7 @@ async function handleLogin() {
await initializeApp();
} catch (error) {
console.error("[Auth] Login failed:", error);
- ui.authError.textContent = `${MESSAGES.CONNECTION_ERROR} ${error.message}`;
+ ui.authError.textContent = `${STRINGS.CONNECTION_ERROR} ${error.message}`;
state.api = null;
} finally {
handleLogin.isInProgress = false;
diff --git a/src/js/constants.js b/src/js/constants.js
index e383914..0cb6754 100644
--- a/src/js/constants.js
+++ b/src/js/constants.js
@@ -56,13 +56,6 @@ const DOM_IDS = {
SECTION_TOGGLE: "section-toggle",
};
-const MESSAGES = {
- NO_TRACK_PLAYING: "no track playing",
- NO_ARTISTS: "no artists",
- NO_PLAYLISTS: "no playlists",
- CONNECTION_ERROR: "connection failed:",
-};
-
const ICONS = {
PLAY:
document.getElementById("icon-play")?.src ||
diff --git a/src/js/library.js b/src/js/library.js
index 07c25dd..d3394cf 100644
--- a/src/js/library.js
+++ b/src/js/library.js
@@ -143,7 +143,7 @@ const TREE_CONFIGS = {
data: () => state.library,
expandedKey: "artists",
expandedMap: () => state.expanded.items.artists,
- message: MESSAGES.NO_ARTISTS,
+ message: STRINGS.NO_ARTISTS,
artType: "artArtist",
itemMapper: (artist) => ({
label: artist.title || artist.name,
@@ -164,7 +164,7 @@ const TREE_CONFIGS = {
data: () => state.playlists,
expandedKey: "playlists",
expandedMap: () => state.expanded.items.playlists,
- message: MESSAGES.NO_PLAYLISTS,
+ message: STRINGS.NO_PLAYLISTS,
artType: "artArtist",
itemMapper: (playlist) => ({
label: playlist.name,
diff --git a/src/js/player.js b/src/js/player.js
index 12c5015..a1e0e0e 100644
--- a/src/js/player.js
+++ b/src/js/player.js
@@ -5,8 +5,8 @@ function playTrack(song) {
return;
}
- ui.trackTitle.textContent = song.title || "Unknown";
- ui.trackArtist.textContent = song.artist || "Unknown Artist";
+ ui.trackTitle.textContent = song.title || STRINGS.UNKNOWN_TRACK;
+ ui.trackArtist.textContent = song.artist || STRINGS.UNKNOWN_ARTIST;
setCoverArt(song);
ui.player.src = state.api.getStreamUrl(song.id);
ui.player.play();
@@ -67,7 +67,7 @@ function highlightCurrentTrack() {
// clear player UI and reset to default state
function clearPlayerUI() {
ui.player.src = "";
- ui.trackTitle.textContent = MESSAGES.NO_TRACK_PLAYING;
+ ui.trackTitle.textContent = STRINGS.NO_TRACK_PLAYING;
ui.trackArtist.textContent = "";
clearLyrics();
ui.coverArt.src = "static/subsonic.png";
@@ -112,8 +112,8 @@ const updateMediaSession = (song) => {
if (!song) return;
withMediaSession((ms) => {
ms.metadata = new MediaMetadata({
- title: song.title || "Unknown",
- artist: song.artist || "Unknown Artist",
+ title: song.title || STRINGS.UNKNOWN_TRACK,
+ artist: song.artist || STRINGS.UNKNOWN_ARTIST,
album: song.album || "",
artwork: song.coverArt
? [
diff --git a/src/js/strings/en.js b/src/js/strings/en.js
new file mode 100644
index 0000000..893ff69
--- /dev/null
+++ b/src/js/strings/en.js
@@ -0,0 +1,10 @@
+const STRINGS = {
+ NO_TRACK_PLAYING: "no track playing",
+ NO_ARTISTS: "no artists",
+ NO_PLAYLISTS: "no playlists",
+ CONNECTION_ERROR: "connection failed:",
+ UNKNOWN_TRACK: "unknown",
+ UNKNOWN_ARTIST: "unknown artist",
+ SERVER_URL_EMPTY: "server URL cannot be empty",
+ SERVER_URL_REQUIRED: "server URL is required",
+};
diff --git a/src/js/strings/index.js b/src/js/strings/index.js
new file mode 100644
index 0000000..5ce2609
--- /dev/null
+++ b/src/js/strings/index.js
@@ -0,0 +1,2 @@
+// TODO: add language support
+export { STRINGS } from "./en.js";
diff --git a/src/js/validation.js b/src/js/validation.js
index c3ac16d..df911e5 100644
--- a/src/js/validation.js
+++ b/src/js/validation.js
@@ -14,12 +14,12 @@ function validateId(value, fieldName = "ID") {
// validate server URL is valid HTTP(S) format
function validateServerUrl(url) {
if (!url || typeof url !== "string") {
- return buildValidation(false, null, "Server URL is required");
+ return buildValidation(false, null, STRINGS.SERVER_URL_REQUIRED);
}
const trimmed = url.trim();
if (!trimmed) {
- return buildValidation(false, null, "Server URL cannot be empty");
+ return buildValidation(false, null, STRINGS.SERVER_URL_EMPTY);
}
try {