diff --git a/webui/static/video/video-detail.js b/webui/static/video/video-detail.js
index 59e550b7..a3729ea3 100644
--- a/webui/static/video/video-detail.js
+++ b/webui/static/video/video-detail.js
@@ -410,7 +410,7 @@
var watching = !!d._vw_watched;
// Lazily resolve the real watched state once (airing library shows are on
// by default), then re-render — see the new curated watchlist system.
- if (isAiringShow && d.source !== 'tmdb' && !d._vw_checked && window.VideoWatchlist) {
+ if (isAiringShow && !d._vw_checked && window.VideoWatchlist) {
d._vw_checked = true;
fetch('/api/video/watchlist/check', { method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ kind: 'show', tmdb_ids: [d.tmdb_id] }) })
@@ -436,9 +436,9 @@
html += '';
}
- // Preview (tmdb, un-owned) items have no library row to monitor — acquisition
- // (add-to-watchlist / get-missing) lands with the downloads phase.
- if (d.source === 'tmdb') { a.innerHTML = html; return; }
+ // Watchlist (follow an AIRING show to wishlist its new episodes) applies whether
+ // the show is owned or a TMDB preview — the curated watchlist is keyed by
+ // tmdb_id. Ended/cancelled shows are terminal (isAiringShow=false) → no button.
if (isAiringShow) {
html +=
'';
}
- if (d.kind === 'show') { // "Get Missing" filters the episode list (show-only)
+ // "Get Missing" filters the OWNED episode list — library shows only.
+ if (d.kind === 'show' && d.source !== 'tmdb') {
html += '';
@@ -1224,10 +1225,14 @@
var watching = !!data._vw_watched;
var apply = function () {
var url = watching ? '/api/video/watchlist/remove' : '/api/video/watchlist/add';
+ // On a TMDB preview, data.id is the tmdb id (NOT a library row) — don't send
+ // a bogus library_id or library poster proxy; use the TMDB poster instead.
+ var owned = data.source !== 'tmdb';
var body = watching
? { kind: 'show', tmdb_id: data.tmdb_id }
: { kind: 'show', tmdb_id: data.tmdb_id, title: data.title,
- library_id: data.id, poster_url: '/api/video/poster/show/' + data.id };
+ poster_url: owned ? ('/api/video/poster/show/' + data.id) : proxied(data.poster_url) };
+ if (owned) body.library_id = data.id;
fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) })
.then(function (r) { return r.json(); })
.then(function (res) {