{"record":{"id":"16ad75cf4cdb2c75","repo":"tonhowtf/omniget","slug":"could-not-extract-post-id-reddit","errorCode":null,"errorMessage":"Could not extract post ID","messagePattern":"Could not extract post ID","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/platforms/reddit.rs","lineNumber":415,"sourceCode":"            }\n        }\n\n        self.native_download(info, opts, progress).await\n    }\n}\n\nimpl RedditDownloader {\n    async fn fallback_ytdlp(&self, url: &str) -> anyhow::Result<MediaInfo> {\n        let ytdlp_path = crate::core::ytdlp::ensure_ytdlp().await?;\n        let json = crate::core::ytdlp::get_video_info(&ytdlp_path, url, &[]).await?;\n        crate::platforms::generic_ytdlp::GenericYtdlpDownloader::parse_video_info(&json)\n    }\n\n    async fn native_get_media_info(&self, url: &str) -> anyhow::Result<MediaInfo> {\n        let canonical = self.resolve_to_canonical(url).await?;\n\n        let post_id = Self::extract_post_id(&canonical)\n            .ok_or_else(|| anyhow!(\"Could not extract post ID\"))?;\n\n        let subreddit = Self::extract_subreddit(&canonical).unwrap_or_default();\n\n        let data = self.fetch_post_data(&post_id).await?;\n\n        let media = Self::parse_media(&data).ok_or_else(|| anyhow!(\"No media found in post\"))?;\n\n        let source_id = if subreddit.is_empty() {\n            post_id.clone()\n        } else {\n            format!(\"{}_{}\", subreddit.to_lowercase(), post_id)\n        };\n\n        let title = format!(\"reddit_{}\", source_id);\n\n        match media {\n            RedditMedia::Video {\n                video_url,","sourceCodeStart":397,"sourceCodeEnd":433,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/platforms/reddit.rs#L397-L433","documentation":"After resolving the input URL to a canonical Reddit post URL, native_get_media_info calls extract_post_id; if the canonical URL does not match the expected post-ID patterns, it returns None and this anyhow error is thrown, stopping all downstream media extraction.","triggerScenarios":"resolve_to_canonical returns a URL whose path does not contain a recognizable post ID — e.g. a short link that failed to resolve, a gallery/comment permalink with an unexpected shape, or a non-post Reddit URL (subreddit, user page).","commonSituations":"Users paste subreddit/user/gallery URLs or share links (reddit.com/s/...) that canonicalization cannot turn into /comments/{id}/ form, or Reddit changes its URL structure.","solutions":["Validate the URL matches a /comments/{id} or /comments/{slug}/{id} pattern before calling the API.","Confirm short/share links (v.redd.it, reddit.com/s/xxx) resolve successfully — check network and redirects.","Log the canonical URL when this error occurs to see what resolve_to_canonical produced.","Update extract_post_id's regex if Reddit changed permalink formats (e.g. new URL schemes)."],"exampleFix":"// caller-side pre-validation\nfn looks_like_reddit_post(url: &str) -> bool {\n    url.contains(\"/comments/\") || url.contains(\"v.redd.it\")\n}\nif !looks_like_reddit_post(&user_url) {\n    return Err(anyhow!(\"Not a Reddit post URL: {}\", user_url));\n}","handlingStrategy":"validation","validationCode":"fn is_reddit_post_url(url: &str) -> bool {\n    let u = url.trim();\n    u.contains(\"/comments/\")\n        || u.contains(\"redd.it/\")\n        || regex::Regex::new(r\"reddit\\.com/(?:r/\\w+/)?comments/[a-z0-9]{5,}\")\n            .unwrap()\n            .is_match(u)\n}","typeGuard":null,"tryCatchPattern":"match native_get_media_info(url).await {\n    Err(e) if e.to_string() == \"Could not extract post ID\" => {\n        show_user(\"This doesn't look like a Reddit post URL\");\n    }\n    other => other,\n}","preventionTips":["Validate URLs against /comments/{id} patterns before invoking the extractor.","Expand share/short links (reddit.com/s/..., v.redd.it) with redirects before parsing.","Log the canonical URL on failure to debug resolve_to_canonical.","Reject subreddit/user/profile URLs early with a clear user message."],"tags":["parsing","url","reddit","validation"],"backgroundTag":"invalid-url-format","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"}