Telegram's file API returns application/octet-stream instead of the
actual image type. Added inferMimeType() that detects the real type
from the URL extension (jpg→image/jpeg, png→image/png, etc.) when
the server response Content-Type is generic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
checkHealth() now returns 'ok' | 'rate_limited' | 'auth_error' | 'unreachable'
instead of boolean, so /status can display the specific issue with color-coded
indicators instead of just "Nicht erreichbar" for all failures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add centralized friendlyError() helper mapping technical errors to
clear German messages (rate limit, auth, network, timeout, etc.)
- Improve /status to handle rate limits gracefully
- Improve album upload: abort early on rate limit/auth, show partial
results with failure reason
- Better file-type rejection: show the rejected extension, suggest
sending as photo instead
- Friendlier Telegram download errors (file too big, getFile failures)
- Add global bot.catch() handler for unhandled Grammy errors
- Truncate long unknown errors to 150 chars
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show German messages with retry time for 429 and helpful guidance for
401 instead of raw API error JSON.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Payload CMS REST API requires document data (alt, tenant, etc.) as a
JSON string in a _payload form field, not as individual form fields.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>