diff --git a/tests/test_video_side_shell.py b/tests/test_video_side_shell.py
index 45292cdf..032391bc 100644
--- a/tests/test_video_side_shell.py
+++ b/tests/test_video_side_shell.py
@@ -207,6 +207,13 @@ def test_video_library_mapping_ui_present_and_video_only():
assert 'body[data-side="video"] #plex-library-selector-container' in css
+def test_video_side_hides_music_api_config_and_shows_placeholders():
+ css = _CSS_PATH.read_text(encoding="utf-8")
+ assert 'body[data-side="video"] [data-music-only]' in css # music API hidden on video
+ assert "data-music-only" in _INDEX # the music API group is marked
+ assert "TMDB API Key" in _INDEX and "TVDB API Key" in _INDEX # video placeholders
+
+
def test_video_settings_module_referenced_and_isolated():
assert "video/video-settings.js" in _INDEX
stripped = _VSETTINGS_JS.strip()
diff --git a/webui/index.html b/webui/index.html
index 372285af..f9468d4b 100644
--- a/webui/index.html
+++ b/webui/index.html
@@ -4288,7 +4288,7 @@
diff --git a/webui/static/video/video-side.css b/webui/static/video/video-side.css
index a9f6766c..f3cc27da 100644
--- a/webui/static/video/video-side.css
+++ b/webui/static/video/video-side.css
@@ -129,6 +129,11 @@ body[data-side="video"] #jellyfin-library-selector-container,
body[data-side="video"] #navidrome-folder-selector-container {
display: none !important;
}
+/* Music-only settings sections (e.g. the music API services) are hidden on the
+ video side; their video counterparts carry data-video-only. */
+body[data-side="video"] [data-music-only] {
+ display: none !important;
+}
/* ── Dashboard header: match music, minus the sweep animation ──────────── */
/* The header reuses music's .dashboard-header markup/CSS for an identical look;