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
|