{"record":{"id":"f94084dd49127480","repo":"tonhowtf/omniget","slug":"noopdownloader-cannot-drive-download-this-item-is-driven-by","errorCode":null,"errorMessage":"NoopDownloader cannot drive download; this item is driven by an external plugin","messagePattern":"NoopDownloader cannot drive download; this item is driven by an external plugin","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src-tauri/src/platforms/noop.rs","lineNumber":42,"sourceCode":"    }\n\n    fn can_handle(&self, _url: &str) -> bool {\n        false\n    }\n\n    async fn get_media_info(&self, _url: &str) -> anyhow::Result<MediaInfo> {\n        Err(anyhow::anyhow!(\n            \"NoopDownloader cannot fetch media info; this item is driven by an external plugin\"\n        ))\n    }\n\n    async fn download(\n        &self,\n        _info: &MediaInfo,\n        _opts: &DownloadOptions,\n        _progress: tokio::sync::mpsc::Sender<omniget_core::models::progress::ProgressUpdate>,\n    ) -> anyhow::Result<DownloadResult> {\n        Err(anyhow::anyhow!(\n            \"NoopDownloader cannot drive download; this item is driven by an external plugin\"\n        ))\n    }\n}\n","sourceCodeStart":24,"sourceCodeEnd":47,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/src/platforms/noop.rs#L24-L47","documentation":"Same placeholder contract as error 1118 but for the download step: `NoopDownloader::download` always errors because actual downloading for these items is delegated to an external plugin. Hitting this error means the built-in download pipeline was invoked on a plugin-owned item that the noop backend must not drive.","triggerScenarios":"Calling `download(info, opts, progress_tx)` on a `NoopDownloader` — a plugin-owned or unrecognized-platform item dispatched through the built-in download loop instead of the external plugin executor.","commonSituations":"External plugin missing or failed to load, so the scheduler still enqueued the item into the built-in pipeline; dispatcher bug assigning NoopDownloader to resumable/legacy items; queue replay after restart where plugin ownership metadata was lost.","solutions":["Route plugin-owned items to the external plugin's download executor; never enqueue NoopDownloader items into the built-in pipeline","Ensure the responsible external plugin is installed, loaded, and healthy before starting the item's download","Persist plugin-ownership metadata with each queue item so restarts don't misroute it to the noop backend","Surface a distinct 'requires external plugin' state in the UI rather than attempting the built-in download"],"exampleFix":"// before\nlet result = downloader.download(&info, &opts, progress_tx).await?;\n// after\nif downloader.is_noop() {\n    return plugin_executor::download(&item, &opts, progress_tx).await\n        .context(\"item requires external plugin driver\");\n}\nlet result = downloader.download(&info, &opts, progress_tx).await?;","handlingStrategy":"type-guard","validationCode":"fn ensure_builtin_download(d: &dyn PlatformDownloader) -> Result<(), String> {\n    if d.is_noop() { Err(\"item requires external plugin driver\".into()) } else { Ok(()) }\n}","typeGuard":"fn can_builtin_download(d: &dyn PlatformDownloader) -> bool {\n    !d.is_noop()\n}","tryCatchPattern":"match downloader.download(&info, &opts, tx).await {\n    Err(e) if e.to_string().contains(\"NoopDownloader cannot drive download\") => {\n        plugin_executor::download(&item, &opts, tx).await.context(\"requires external plugin\")\n    }\n    other => other,\n}","preventionTips":["Persist plugin-ownership metadata per queue item so restarts don't misroute to the noop backend","Gate the built-in download loop on the item's backend type; send noop items to the plugin executor","Alert when a plugin fails to load and block its items instead of silently falling back to NoopDownloader","Cover the dispatch path with tests that simulate a missing plugin"],"tags":["noop","plugin","download","routing"],"backgroundTag":"method-not-implemented","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}