AGQR の放送を保存するスクリプト.
- 各パッケージのパスを自環境に合わせて変更
- 音声ファイルの保存先を実行ファイルと同じディレクトリに変更
- /mp4 ディレクトリが作成できるよう修正
- 配信 URL を現行の物に修正
- 配信形式が HLS に変更されたので追随した
AGQR の放送を保存するスクリプト.
| # -*- coding: utf-8 -*- | |
| # record AGQR | |
| # usage: use with crontab | |
| # 29,59 * * * sleep 55; ruby agqr.rb | |
| # requirements | |
| # crontab, ruby >~ 1.9, ffmpeg, | |
| require 'yaml' | |
| ffmpeg = '/usr/bin/ffmpeg' | |
| agqr_stream_url = 'https://www.uniqueradio.jp/agplayer5/hls/mbr-ff.m3u8' | |
| current = File.dirname(File.expand_path(__FILE__)) | |
| save_dir = "#{current}/data/" | |
| Dir.mkdir(save_dir) if !File.exist?(save_dir) | |
| %w(mp4).each do |dir| | |
| path = save_dir + '/' + dir | |
| Dir.mkdir(path) if !File.exist?(path) | |
| end | |
| schedule_yaml = "#{current}/schedule.yaml" | |
| if !File.exist?(schedule_yaml) | |
| puts "Config file (#{schedule_yaml}) is not found!" | |
| puts "Please make #{schedule_yaml}." | |
| exit 1 | |
| end | |
| today = Time.now | |
| # ruby 1.9.x でも動くために汚いけど書き換える | |
| # WDAY = %w(日 月 火 水 木 金 土).zip((0..6).to_a).to_h | |
| tmp = { } | |
| %w(日 月 火 水 木 金 土).each_with_index do |v, i| | |
| tmp[v] = i | |
| end | |
| WDAY = tmp | |
| schedule = YAML.load_file(schedule_yaml) | |
| schedule.each do |program| | |
| program_wday = WDAY[program['wday']] | |
| is_next_day_program = false | |
| # appropriate wday | |
| h, m = program['time'].split(':').map(&:to_i) | |
| if h.zero? && m.zero? | |
| # check next day's wday | |
| # if today.wday is 6 (Sat), next_wday is 0 (Sun) | |
| next_wday = (today.wday + 1).modulo(7) | |
| is_appropriate_wday = program_wday == next_wday | |
| is_next_day_program = true | |
| else | |
| # check today's wday | |
| is_appropriate_wday = program_wday == today.wday | |
| end | |
| # appropriate time | |
| if is_next_day_program | |
| # 日付を跨ぐので録音開始の日付が1日ずれる | |
| next_day = today + 60 * 60 * 24 | |
| # today.day + 1 してたら 31 を超えるとTimeがエラー吐く | |
| program_start = Time.new(next_day.year, next_day.month, next_day.day, h, m, 0) | |
| else | |
| program_start = Time.new(today.year, today.month, today.day, h, m, 0) | |
| end | |
| is_appropriate_time = (program_start - today).abs < 120 | |
| length = program['length'] * 60 + 10 | |
| if is_appropriate_wday && is_appropriate_time | |
| title = (program['title'].to_s + '_' + today.strftime('%Y%m%d')).gsub(' ','') | |
| mp4_path = "#{save_dir}/mp4/#{title}.mp4" | |
| # record stream | |
| rec_command = "#{ffmpeg} -protocol_whitelist file,http,https,tcp,tls,crypto -i #{agqr_stream_url} -movflags faststart -t #{length} -c copy #{mp4_path} >/dev/null 2>&1" | |
| system rec_command | |
| end | |
| end |
| - title: hidakakuma | |
| wday: 火 | |
| time: '23:00' | |
| length: 30 | |
| - title: toshitai | |
| wday: 火 | |
| time: '23:30' | |
| length: 30 | |
| - title: lst | |
| wday: 水 | |
| time: '21:00' | |
| length: 30 | |
| - title: hitokana | |
| wday: 木 | |
| time: '23:00' | |
| length: 30 | |
| - title: suikoro | |
| wday: 日 | |
| time: '17:00' | |
| length: 30 | |
| - title: kokoradi | |
| wday: 日 | |
| time: '20:00' | |
| length: 30 |