Перейти к содержимому

Уведомления о завершении рендера

Рендер сцены в Blender, экспорт таймлайна в DaVinci, склейка в ffmpeg, большая сборка make — всё это идёт десятки минут, а то и часы. Вместо того чтобы поглядывать на прогресс-бар, повесим push на завершение: сколько шло и чем закончилось.

Самое простое — дописать через && (успех) и || (ошибка):

Окно терминала
blender -b scene.blend -o //out/ -f 1 && \
notifly-send "✅ Рендер готов" "scene.blend" 5 || \
notifly-send "❌ Рендер упал" "См. терминал" 8

Тот же приём в виде ;, если статус не важен, а важен сам факт завершения:

Окно терминала
make -j$(nproc) ; notifly-send "🏁 Сборка завершена" "rc=$?" 5

Чтобы в push приходили длительность и код возврата, запускаем команду в обёртке:

#!/usr/bin/env bash
# ~/bin/notifly-render — `notifly-render ffmpeg -i in.mkv ... out.mp4`
set -u
set -a; source ~/.notifly.env; set +a
START=$(date +%s)
LABEL="$*"
LABEL="${LABEL:0:60}" # обрезаем длинную командную строку
"$@" # запускаем сам долгий процесс
RC=$?
END=$(date +%s)
ELAPSED=$(printf '%02d:%02d:%02d' $(( (END-START)/3600 )) $(( (END-START)%3600/60 )) $(( (END-START)%60 )))
if (( RC == 0 )); then
notifly-send "✅ Готово: $LABEL" "Время: $ELAPSED" 5
else
notifly-send "❌ Ошибка (rc=$RC): $LABEL" "Время: $ELAPSED" 8
fi
exit $RC

Использование:

Окно терминала
notifly-render blender -b scene.blend -o //out/ -a
notifly-render ffmpeg -i input.mov -c:v libx265 -crf 24 out.mp4
notifly-render make -j$(nproc)

Успех приходит на приоритете 5, ошибка — на 8 (громче, проходит DND по правилам ОС; см. приоритеты).

Resolve умеет запускать скрипт после рендера через Deliver → «Render» с внешней командой, но проще обернуть headless-рендер:

Окно терминала
notifly-render /opt/resolve/bin/resolve -nogui -render project.drp
Окно терминала
for f in shots/*.blend; do
if notifly-render blender -b "$f" -o "//render/$(basename "$f" .blend)_" -a; then
:
fi
done
notifly-send "🎬 Все шоты готовы" "Рендеров: $(ls render/*.png | wc -l)" 6

Аналог обёртки для Windows. Предполагается настроенная функция Send-Notifly.

C:\scripts\Notifly-Render.ps1
param([Parameter(Mandatory, ValueFromRemainingArguments)] [string[]]$Cmd)
. $env:USERPROFILE\Documents\WindowsPowerShell\Notifly.ps1
$start = Get-Date
$label = ($Cmd -join ' ')
$label = $label.Substring(0, [Math]::Min(60, $label.Length))
& $Cmd[0] $Cmd[1..($Cmd.Count-1)] # запускаем долгий процесс
$rc = $LASTEXITCODE
$dur = ((Get-Date) - $start).ToString('hh\:mm\:ss')
if ($rc -eq 0) {
Send-Notifly -Title "✅ Готово: $label" -Message "Время: $dur" -Priority 5
} else {
Send-Notifly -Title "❌ Ошибка (rc=$rc): $label" -Message "Время: $dur" -Priority 8
}
exit $rc

Использование и алиас в профиле PowerShell:

Окно терминала
Set-Alias nrender C:\scripts\Notifly-Render.ps1
nrender blender -b scene.blend -o //out/ -a
nrender ffmpeg -i input.mov -c:v libx265 -crf 24 out.mp4

Одноразовый вариант через &&-аналог PowerShell:

Окно терминала
blender -b scene.blend -o //out/ -a
if ($LASTEXITCODE -eq 0) { Send-Notifly -Title "✅ Рендер готов" -Priority 5 }
else { Send-Notifly -Title "❌ Рендер упал" -Priority 8 }
  • Не караулите прогресс-бар. Ушли пить кофе — push вернёт вас в нужный момент.
  • Сразу видно результат. Длительность и код возврата: успех тихо, провал — громко.
  • Метрики для оценки. Со временем понятно, сколько реально идёт рендер сцены.
  • Добавить в сообщение размер итогового файла (du -h out.mp4).
  • Приложить хвост лога рендера через extras — см. дополнительные поля.
  • Ставить рендеры в очередь и слать один итоговый push на всю пачку.