59 lines
1.6 KiB
Crystal
59 lines
1.6 KiB
Crystal
require "./base_controller"
|
||
require "../utils/url_validator"
|
||
|
||
module FosdemRecorder
|
||
class DownloadController < BaseController
|
||
def self.process(url)
|
||
UrlValidator.validate_event! url
|
||
meta = EventPage.get_meta(url)
|
||
|
||
now = Time.local #Time::Location.load("Europe/Brussels")
|
||
|
||
event_start = meta.event_start
|
||
raise "Event start is missing!" if event_start.nil?
|
||
|
||
event_stop = meta.event_stop
|
||
raise "Event stop is missing!" if event_stop.nil?
|
||
|
||
event_start_localtime = event_start.to_local
|
||
postpone_download = (event_start_localtime >= now)
|
||
|
||
# compute remaining duration when needed
|
||
duration = Duration.new(start: event_start, stop: event_stop)
|
||
remaining_duration = duration.from_now
|
||
timeformat = event_start_localtime.to_s("%H:%M %Y-%m-%d")
|
||
|
||
# FIXME: mark the file as partial
|
||
cmd = [
|
||
"ffmpeg",
|
||
|
||
# First the stream URL
|
||
"-i", meta.stream_url,
|
||
|
||
# Then the codec (simple copy)
|
||
"-c", "copy",
|
||
|
||
# Fix malformed AAC bitstream when detected
|
||
"-bsf:a", "aac_adtstoasc",
|
||
|
||
# Make the stream playable as we download it
|
||
"-movflags", "frag_keyframe+empty_moov+default_base_moof+faststart",
|
||
|
||
# Set record duration
|
||
"-t", remaining_duration.to_s,
|
||
|
||
# Set output filename
|
||
"\"#{meta.title_sanitized}.mp4\""
|
||
].join(" ")
|
||
|
||
if postpone_download
|
||
cmd = "echo #{cmd} | at #{timeformat}"
|
||
else
|
||
cmd = "echo #{cmd} | at now"
|
||
end
|
||
puts "Command: #{cmd}".colorize.fore(:yellow)
|
||
system cmd
|
||
end
|
||
end
|
||
end
|