rsvg scrive su .tmp poi rename; il feeder ignora PNG parziali. YouTube relay: no doppio avvio, reconnect RTMP; overlay restart solo dopo 3 miss. Co-authored-by: Cursor <cursoragent@cursor.com>
51 lines
1.3 KiB
Ruby
51 lines
1.3 KiB
Ruby
module Streams
|
|
module Overlay
|
|
class Refresh
|
|
class Error < StandardError; end
|
|
|
|
def self.call(session)
|
|
new(session).call
|
|
end
|
|
|
|
def initialize(session)
|
|
@session = session.reload
|
|
end
|
|
|
|
def call
|
|
return false if @session.terminal?
|
|
|
|
dir = Streams::Overlay.overlay_dir(@session.id)
|
|
FileUtils.mkdir_p(dir)
|
|
badge = BadgeLabel.for(@session)
|
|
svg = SvgBuilder.new(@session, badge: badge).to_svg
|
|
svg_path = dir.join("overlay.svg")
|
|
png_path = Streams::Overlay.overlay_png_path(@session)
|
|
atomic_write(svg_path, svg)
|
|
render_png!(svg_path, png_path)
|
|
true
|
|
rescue StandardError => e
|
|
Rails.logger.warn("[Overlay::Refresh] session=#{@session.id} #{e.class}: #{e.message}")
|
|
false
|
|
end
|
|
|
|
private
|
|
|
|
def atomic_write(path, content)
|
|
tmp = "#{path}.tmp"
|
|
File.write(tmp, content)
|
|
File.rename(tmp, path)
|
|
end
|
|
|
|
def render_png!(svg_path, png_path)
|
|
tmp = "#{png_path}.tmp"
|
|
unless system("rsvg-convert", "-w", "1280", "-h", "720", "-o", tmp, svg_path.to_s, out: File::NULL, err: File::NULL)
|
|
raise Error, "rsvg-convert fallito per session #{@session.id}"
|
|
end
|
|
|
|
File.rename(tmp, png_path)
|
|
FileUtils.touch(png_path)
|
|
end
|
|
end
|
|
end
|
|
end
|