{"record":{"id":"8e90b34648893a85","repo":"tonhowtf/omniget","slug":"playlist-empty-or-unavailable-legacy","errorCode":null,"errorMessage":"Playlist empty or unavailable","messagePattern":"Playlist empty or unavailable","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/src/platforms/bilibili/legacy.rs","lineNumber":44,"sourceCode":"pub fn bilibili_extra_flags() -> Vec<String> {\n    vec![\n        \"--referer\".to_string(),\n        \"https://www.bilibili.com\".to_string(),\n    ]\n}\n\npub async fn get_media_info(url: &str) -> anyhow::Result<MediaInfo> {\n    let ytdlp_path = ytdlp::find_ytdlp_cached()\n        .await\n        .ok_or_else(|| anyhow!(\"yt-dlp not found\"))?;\n\n    let extra = bilibili_extra_flags();\n\n    if is_playlist_or_series(url) {\n        let (title, entries) = ytdlp::get_playlist_info(&ytdlp_path, url, &extra).await?;\n\n        if entries.is_empty() {\n            return Err(anyhow!(\"Playlist empty or unavailable\"));\n        }\n\n        let qualities: Vec<MediaVideoQuality> = entries\n            .iter()\n            .enumerate()\n            .map(|(i, e)| MediaVideoQuality {\n                label: format!(\"{}. {}\", i + 1, e.title),\n                width: 0,\n                height: 0,\n                url: e.url.clone(),\n                format: \"mp4\".to_string(),\n            })\n            .collect();\n\n        return Ok(MediaInfo {\n            title,\n            author: \"Bilibili\".to_string(),\n            platform: \"bilibili\".to_string(),","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/src/platforms/bilibili/legacy.rs#L26-L62","documentation":"When the URL is detected as a playlist/series, `get_media_info` fetches playlist metadata via `ytdlp::get_playlist_info`; if the returned entry list is empty the function treats the playlist as unusable and throws `Playlist empty or unavailable`. It guards downstream code that assumes at least one entry.","triggerScenarios":"Calling `get_media_info` with a Bilibili playlist/collection URL whose yt-dlp extraction returns zero entries — deleted/private videos, region-locked collections, login-required content, or yt-dlp failing silently and yielding an empty entries vector.","commonSituations":"Fetching a season/collection whose videos were removed or made members-only; passing a URL that looks like a playlist but points to an empty favourites folder; missing cookies for login-gated content; outdated yt-dlp that cannot parse a new Bilibili page layout.","solutions":["Open the URL in a browser to confirm the playlist actually contains playable videos.","Refresh yt-dlp to the latest version (`yt-dlp -U`) — Bilibili layouts change often.","Add login cookies/credentials so private or members-only entries are extractable.","Retry later or use the direct video URL of an individual item instead of the collection URL."],"exampleFix":"// before\nlet info = get_media_info(\"https://www.bilibili.com/medialist/...empty...\", ).await?;\n// after\nlet entries = probe_playlist(&url).unwrap_or_default();\nif !entries.is_empty() { let info = get_media_info(&url).await?; }","handlingStrategy":"validation","validationCode":"// before calling get_media_info on a playlist URL\nlet entries = ytdlp::get_playlist_info(&ytdlp_path, url, &extra).await?.1;\nif entries.is_empty() { /* surface 'playlist unavailable' before the download path */ }","typeGuard":null,"tryCatchPattern":"match get_media_info(url).await {\n    Err(e) if e.to_string().contains(\"Playlist empty\") => show_unavailable_playlist_msg(url),\n    Err(e) => return Err(e),\n    Ok(info) => info,\n}","preventionTips":["Verify the playlist has playable videos in a browser first.","Keep yt-dlp updated — Bilibili page layouts change frequently.","Configure cookies/login for private or members-only collections.","Fall back to individual video URLs when collection extraction fails."],"tags":["playlist","external-tool","bilibili"],"backgroundTag":"empty-result-set","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}