diff --git a/core/video/youtube.py b/core/video/youtube.py index d1acba08..9f51181e 100644 --- a/core/video/youtube.py +++ b/core/video/youtube.py @@ -182,7 +182,9 @@ def _ydl_opts(limit, db=None): "extract_flat": True, # fast: enumerate uploads without per-video format probing "skip_download": True, "playlistend": int(limit), - "user_agent": _UA, + # NB: do NOT pin user_agent here — yt-dlp manages its own (current) client + # identity; a static UA trips YouTube's heuristics and truncates large + # playlist pagination (the reason a fresh ytdl-sub pages further than us). } opts.update(_cookie_opts()) return opts diff --git a/webui/static/video/video-detail.js b/webui/static/video/video-detail.js index 6fb344b6..826e1a00 100644 --- a/webui/static/video/video-detail.js +++ b/webui/static/video/video-detail.js @@ -1571,10 +1571,8 @@ ytVideoMap = {}; vids.forEach(function (v) { ytVideoMap[v.youtube_id] = v; }); var total = pl.video_count || vids.length; - // Anonymous, YouTube throttles us to ~100-200; with YouTube cookies set in - // Settings, yt-dlp pages the whole playlist (like ytdl-sub). Be honest when partial. - var note = total > vids.length - ? 'Showing ' + vids.length + ' of ' + total + ' videos — add YouTube cookies in Settings to load the full playlist.' : ''; + // YouTube throttles large-playlist listing for our client — be honest when partial. + var note = total > vids.length ? 'Showing ' + vids.length + ' of ' + total + ' videos.' : ''; var season = { season_number: 1, title: 'Videos', poster_url: ytProx(pl.thumbnail_url), episode_owned: 0, episode_total: vids.length, episodes: vids.map(ytEpisodeOf) }; return { kind: 'playlist', source: 'youtube', id: pl.playlist_id, title: pl.title || 'Playlist',