diff --git a/Dockerfile b/Dockerfile index ccd63e8..df46d24 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -ARG webchanges_tag=v3.38.0 +ARG webchanges_tag=v3.39.0 FROM python:3.15.0-alpine3.24 AS builder ARG webchanges_tag diff --git a/data/config.schema.json b/data/config.schema.json index 5b04e42..9c568a7 100644 --- a/data/config.schema.json +++ b/data/config.schema.json @@ -334,6 +334,11 @@ "description": "Sender's email address. Do not use a primary mailbox; create a throwaway account for webchanges.", "default": "" }, + "reply_to": { + "type": "string", + "description": "Reply-To email address(es), used by email clients when replying to the report. For multiple addresses, concatenate with commas. If blank, no Reply-To header is sent.", + "default": "" + }, "subject": { "type": "string", "description": "Subject line. Use {count}, {jobs}, and {jobs_files} placeholders (see html.title for details).", @@ -984,6 +989,21 @@ { "$ref": "#/$defs/_ConfigReportXmpp" }, { "type": "array", "items": { "$ref": "#/$defs/_ConfigReportXmpp" }, "minItems": 1 } ] + }, + "mattermost": { + "type": ["object", "array"], + "description": "Deprecated (legacy); replace with 'webhook' and add 'markdown: true'. Still runs as a webhook reporter with Markdown.", + "deprecated": true + }, + "shell": { + "type": ["object", "array"], + "description": "Deprecated (legacy); replace with 'run_command'. Still runs its 'command' (a string or a list of arguments, without a shell) with the text report on its standard input; sub-directives 'command', 'ignore_stdout' (default true) and 'ignore_stderr' (default false).", + "deprecated": true + }, + "slack": { + "type": ["object", "array"], + "description": "Deprecated (legacy); rename to 'webhook' (same sub-directives). Still runs as a webhook reporter.", + "deprecated": true } } }, diff --git a/data/config.yaml b/data/config.yaml index b093b88..534de01 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -1,5 +1,5 @@ # webchanges configuration file. See https://webchanges.readthedocs.io/en/stable/configuration.html -# Originally written on 2026-10-25T15:52:52+00:00Z by version 3.38.0. +# Originally written on 2026-10-27T20:13:10+00:00Z by version 3.39.0. # yaml-language-server: $schema=config.schema.json display: @@ -42,6 +42,7 @@ report: html: true from: '' to: '' + reply_to: '' subject: '[webchanges] {count} changes{jobs_files}: {jobs}' method: smtp smtp: diff --git a/data/jobs.schema.json b/data/jobs.schema.json index 8fb48b8..95a6b57 100644 --- a/data/jobs.schema.json +++ b/data/jobs.schema.json @@ -169,6 +169,11 @@ "description": "If true, accepts a server's weak (1024-bit) Diffie-Hellman key by lowering the OpenSSL security level (certificates are still verified). Supported by http_client httpx and requests, not by curl_cffi.", "default": false }, + "ignore_incomplete_reads": { + "type": "boolean", + "description": "If true, suppresses errors caused by the server closing the connection before sending the complete response. Not supported with use_browser: true.", + "default": false + }, "params": { "type": "object", "additionalProperties": { "type": "string" }, @@ -369,9 +374,22 @@ "deprecated": true, "deprecationMessage": "Use 'url' with 'use_browser: true' instead of 'navigate'." }, + "useragent": { + "type": "string", + "description": "Deprecated (legacy): set a 'User-Agent' header in 'headers' instead.", + "deprecated": true, + "deprecationMessage": "Set a 'User-Agent' header in 'headers' instead of 'useragent'." + }, + "browser": { + "type": "string", + "enum": ["chromium", "firefox", "webkit"], + "description": "Deprecated (legacy): use 'use_browser: ' instead ('chromium' is 'use_browser: true').", + "deprecated": true, + "deprecationMessage": "Use 'use_browser: ' instead of 'browser'." + }, "wait_for": { "type": ["integer", "string"], - "description": "No longer supported (Pyppeteer): use 'wait_for_function', 'wait_for_selector' or 'wait_for_timeout' instead.", + "description": "No longer supported (Pyppeteer): use 'wait_for_function', 'wait_for_selector' or 'wait_for_timeout' instead. In legacy 'navigate' jobs, a selector, run as 'wait_for_selector'.", "deprecated": true, "deprecationMessage": "Use 'wait_for_function', 'wait_for_selector' or 'wait_for_timeout' instead of 'wait_for'." }, @@ -383,8 +401,9 @@ }, "stderr": { "type": "string", - "description": "Ignored; accepted for compatibility with urlwatch (command jobs).", - "deprecated": true + "enum": ["ignore", "forward", "fail", "stdout"], + "description": "What to do with the standard error output of a command job: 'ignore' reports it only when the command fails (exits with a non-zero code), 'forward' also writes it to webchanges' own standard error, 'fail' fails the job if there is any, and 'stdout' merges it into the standard output, i.e. into the data. For backward compatibility, 'urlwatch' is accepted for 'forward'.", + "default": "ignore" }, "differ": { "oneOf": [ @@ -744,6 +763,11 @@ "type": "boolean", "description": "If true, only report the first occurrence of an error." }, + "treat_new_as_changed": { + "type": "boolean", + "description": "If true, report a new job (its first successful run) as changed, with its content shown as a diff from empty content, instead of as new.", + "default": false + }, "compared_versions": { "type": "integer", "description": "Number of versions to keep/compare."