- Media Server
+
+
+
Media Server
+
+
diff --git a/media_server/static/js/app.js b/media_server/static/js/app.js
index 903e064..19a1066 100644
--- a/media_server/static/js/app.js
+++ b/media_server/static/js/app.js
@@ -161,7 +161,8 @@
// Re-apply last media status if available
if (lastStatus) {
- document.getElementById('track-title').textContent = lastStatus.title || t('player.no_media');
+ const fallbackTitle = lastStatus.state === 'idle' ? t('player.no_media') : t('player.title_unavailable');
+ document.getElementById('track-title').textContent = lastStatus.title || fallbackTitle;
document.getElementById('source').textContent = lastStatus.source || t('player.unknown_source');
}
@@ -173,6 +174,21 @@
}
}
+ async function fetchVersion() {
+ try {
+ const response = await fetch('/api/health');
+ if (response.ok) {
+ const data = await response.json();
+ const label = document.getElementById('version-label');
+ if (data.version) {
+ label.textContent = `v${data.version}`;
+ }
+ }
+ } catch (error) {
+ console.error('Error fetching version:', error);
+ }
+ }
+
let ws = null;
let reconnectTimeout = null;
let currentState = 'idle';
@@ -200,6 +216,9 @@
// Initialize locale (async - loads JSON file)
await initLocale();
+ // Load version from health endpoint
+ fetchVersion();
+
const token = localStorage.getItem('media_server_token');
if (token) {
connectWebSocket(token);
@@ -463,14 +482,11 @@
function updateConnectionStatus(connected) {
const dot = document.getElementById('status-dot');
- const text = document.getElementById('status-text');
if (connected) {
dot.classList.add('connected');
- text.textContent = t('player.status.connected');
} else {
dot.classList.remove('connected');
- text.textContent = t('player.status.disconnected');
}
}
@@ -479,12 +495,13 @@
lastStatus = status;
// Update track info
- document.getElementById('track-title').textContent = status.title || t('player.no_media');
+ const fallbackTitle = status.state === 'idle' ? t('player.no_media') : t('player.title_unavailable');
+ document.getElementById('track-title').textContent = status.title || fallbackTitle;
document.getElementById('artist').textContent = status.artist || '';
document.getElementById('album').textContent = status.album || '';
// Update mini player info
- document.getElementById('mini-track-title').textContent = status.title || t('player.no_media');
+ document.getElementById('mini-track-title').textContent = status.title || fallbackTitle;
document.getElementById('mini-artist').textContent = status.artist || '';
// Update state
@@ -1614,7 +1631,7 @@ async function loadThumbnail(imgElement, fileName) {
{ headers: { 'Authorization': `Bearer ${token}` } }
);
- if (response.ok) {
+ if (response.status === 200) {
const blob = await response.blob();
const url = URL.createObjectURL(blob);
@@ -1626,7 +1643,7 @@ async function loadThumbnail(imgElement, fileName) {
imgElement.src = url;
} else {
- // Fallback to icon
+ // Fallback to icon (204 = no thumbnail available)
const parent = imgElement.parentElement;
imgElement.remove();
const icon = document.createElement('div');
diff --git a/media_server/static/locales/en.json b/media_server/static/locales/en.json
index 0b6f74c..4abbc6a 100644
--- a/media_server/static/locales/en.json
+++ b/media_server/static/locales/en.json
@@ -18,6 +18,7 @@
"player.status.connected": "Connected",
"player.status.disconnected": "Disconnected",
"player.no_media": "No media playing",
+ "player.title_unavailable": "Title unavailable",
"player.source": "Source:",
"player.unknown_source": "Unknown",
"state.playing": "Playing",
diff --git a/media_server/static/locales/ru.json b/media_server/static/locales/ru.json
index 77f37e2..1cc4b37 100644
--- a/media_server/static/locales/ru.json
+++ b/media_server/static/locales/ru.json
@@ -18,6 +18,7 @@
"player.status.connected": "Подключено",
"player.status.disconnected": "Отключено",
"player.no_media": "Медиа не воспроизводится",
+ "player.title_unavailable": "Название недоступно",
"player.source": "Источник:",
"player.unknown_source": "Неизвестно",
"state.playing": "Воспроизведение",