Aceito
O daemon precisa gravar lives da Twitch que podem durar 12+ horas sem
interrupção. A URL do HLS playback (.m3u8) é assinada com um token de curta
duração (poucas horas, às vezes menos) — diferente do Client-Id público do
GQL não-documentado usado pelo monitor para polling de status, que é um
identificador fixo do client web da Twitch (não um token de sessão), sem
expiração nem renovação. Se o token de playback expira no meio de uma
gravação longa, o consumidor da URL passa a receber 403 nos segments
seguintes.
ffmpeg -i <url.m3u8> output.mp4 recebe a URL uma vez, no
spawn — não sabe re-autenticar nem re-obter playlist quando o token de
playback expira. Numa live de 12h, sempre quebra antes do fim. Só serviria
se a gravação fosse mais curta que a janela do token, ou se a fonte não
exigisse URL assinada — nenhum dos dois é o caso da Twitch.proc.exited captura
o código de saída e o daemon decide o que fazer (cruzando com o estado do
monitor: canal ainda live → transiente, respawna; canal offline → fim de
live, encerra limpo).STREAMLINK_BIN_PATH.streamlink como child process supervisionado (Bun.spawn), gravando o
stream bruto como MPEG-TS (.ts) via -o, sem re-encoding no caminho
crítico.
Client-Id público fixo, sem expiração nem
renovação. Superfície de estado do daemon diminui por consequência direta
desta escolha.moov do MP4. Renomear .ts pra .mp4 não converte os bytes; players
estritos (iOS/QuickTime, Chrome default) rejeitam. Rewrap pra MP4 fica como
job assíncrono pós-gravação (ffmpeg -c copy, sem re-encode) — ver seção
"Roadmap" do README.moov ser escrito. Motivo direto pra manter
gravação e mux como fases separadas em vez de gravar MP4 desde o início.streamlink no PATH) precisa existir no
ambiente de execução — documentado em "Pré-requisitos" no README, com
fallback via STREAMLINK_BIN_PATH para instalações fora do PATH padrão.