{"record":{"id":"56ea1345db758f05","repo":"dgtlmoon/changedetection.io","slug":"processor-processor-name-does-not-support-asse","errorCode":null,"errorMessage":"Processor '{processor_name}' does not support assets","messagePattern":"Processor '(.+?)' does not support assets","errorType":"http","errorClass":null,"httpStatus":404,"severity":"error","filePath":"changedetectionio/blueprint/ui/diff.py","lineNumber":626,"sourceCode":"                datastore=datastore,\n                request=request\n            )\n\n            if result is None:\n                from flask import abort\n                abort(404, description=f\"Asset '{asset_name}' not found\")\n\n            binary_data, content_type, cache_control = result\n\n            response = make_response(binary_data)\n            response.headers['Content-Type'] = content_type\n            if cache_control:\n                response.headers['Cache-Control'] = cache_control\n            return response\n        else:\n            logger.warning(f\"Processor {processor_name} does not implement get_asset()\")\n            from flask import abort\n            abort(404, description=f\"Processor '{processor_name}' does not support assets\")\n\n    return diff_blueprint\n","sourceCodeStart":608,"sourceCodeEnd":629,"githubUrl":"https://github.com/dgtlmoon/changedetection.io/blob/5d9c7c6da76340597243e8163c4f2439237fa0e8/changedetectionio/blueprint/ui/diff.py#L608-L629","documentation":"abort(404) raised when the processor serving /diff/<uuid>/asset/... does not implement the get_asset() hook at all. The endpoint checks hasattr(processor_module, 'get_asset'); text-based processors typically don't provide binary assets, so any asset request against them 404s with this description and a server-side warning log.","triggerScenarios":"GET /diff/<uuid>/asset/<name> for a watch whose processor module has no get_asset function; also when the processor name resolves to a module without the hook (lookup returns a module but the attribute check fails).","commonSituations":"UI or scripts assuming all processors serve screenshots; custom processors that never implemented get_asset; after changing a watch's processor type, stale links still point at the asset route.","solutions":["Only request assets from processors that implement get_asset (e.g. visual/screenshot-capable ones)","Enable the screenshot/visual mode for the watch if you need screenshot assets","For custom processors, implement get_asset(watch, datastore, request, asset_name) returning (binary_data, content_type, cache_control) or None"],"exampleFix":"# before (custom processor lacking the hook)\n# requests.get(f'{base}/diff/{uuid}/asset/screenshot.png') -> 404\n\n# after\ndef get_asset(watch, datastore, request, asset_name):\n    p = os.path.join(watch.data_dir, asset_name)\n    if not os.path.isfile(p):\n        return None\n    return open(p,'rb').read(), 'image/png', 'max-age=60'","handlingStrategy":"type-guard","validationCode":"from changedetectionio.processors import get_processor_submodule\ndef processor_serves_assets(name):\n    m = get_processor_submodule(name, 'difference') or get_processor_submodule(name, None)\n    return m is not None and hasattr(m, 'get_asset')","typeGuard":"def has_get_asset(processor_module) -> bool:\n    \"\"\"True when the processor can serve binary assets.\"\"\"\n    return callable(getattr(processor_module, 'get_asset', None))","tryCatchPattern":"if not hasattr(processor_module, 'get_asset'):\n    logger.warning(f\"Processor {processor_name} does not implement get_asset()\")\n    abort(404, description=f\"Processor '{processor_name}' does not support assets\")","preventionTips":["Advertise asset support in processor metadata and check it in the UI","Implement get_asset() in custom processors that manage binary artifacts","Don't assume screenshot-style assets exist for text processors"],"tags":["flask","processor-plugin","asset","http-404"],"backgroundTag":"plugin-capability-missing","analyzedSha":"5d9c7c6da76340597243e8163c4f2439237fa0e8","analyzedAt":"2026-08-27T19:41:16.067Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}