media: кодеки для magick в образе и диагностика ресайза
Базовый пакет imagemagick в alpine идёт без кодеков, поэтому magick не мог прочитать jpeg-вложение и падал с "exit status 1". Ставим imagemagick-jpeg, -heic, -webp, -tiff. Чтобы такое было видно из логов: runMagick подставляет stderr в ошибку и отдельно ловит "код выхода 0, но пустой вывод" (так magick ведёт себя без кодека на запись), а веб логирует формат, размеры до и после, время скачивания и ресайза. Если ресайз всё же не удался, отдаём оригинал вместо 502; в кэш не кладём записи больше 4 МБ, чтобы неужатые оригиналы не съели память. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -84,9 +84,19 @@ func runMagick(ctx context.Context, data []byte, args ...string) ([]byte, error)
|
||||
cmd := exec.CommandContext(ctx, "magick", cmdArgs...)
|
||||
cmd.Stdin = bytes.NewReader(data)
|
||||
|
||||
// Без stderr от magick ошибка выглядит как голое "exit status 1"
|
||||
// и не подсказывает, чего не хватает (обычно — кодека).
|
||||
var stderr bytes.Buffer
|
||||
cmd.Stderr = &stderr
|
||||
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("magick: %w", err)
|
||||
return nil, fmt.Errorf("magick: %w: %s", err, strings.TrimSpace(stderr.String()))
|
||||
}
|
||||
|
||||
// Без кодека magick иногда завершается успешно, но не пишет ничего.
|
||||
if len(out) == 0 {
|
||||
return nil, fmt.Errorf("magick produced empty output: %s", strings.TrimSpace(stderr.String()))
|
||||
}
|
||||
|
||||
return out, nil
|
||||
|
||||
Reference in New Issue
Block a user