Skip to content

Instantly share code, notes, and snippets.

@noir-neo
Forked from ybenjo/README.md
Created November 4, 2018 07:18
Show Gist options
  • Select an option

  • Save noir-neo/c01cefae3a9fab72a33a9cb6e6873fa8 to your computer and use it in GitHub Desktop.

Select an option

Save noir-neo/c01cefae3a9fab72a33a9cb6e6873fa8 to your computer and use it in GitHub Desktop.
save AGQR radio programs.

agqr.rb

これは何

AGQR の放送を保存するスクリプト.

fork 元との違いは

yagays / agqr.rb には

  • 31日まである月に翌日の指定が失敗する

というバグが存在する.

使い方

適当なフォルダに agqr.rb を配置して crontab で

29,59 * * * * sleep 55; ruby agqr.rb

と指定する.

すると, agqr.rb を配置した一つ上のディレクトリに data ディレクトリを作り,

  • data/flv.flv ファイル
  • data/mp3 にエンコード済み .mp3 ファイル

を生成する.rtmpdump/ffmpeg の path は適当に書き換えてもらいたい.

必要なもの

  • Ruby 1.9.x or 2.x
  • rtmpdump
  • ffmpeg
  • cron

config.yaml について

録音したい番組をここで指定する.そのうち 26:00 のような表記に対応したい.

曜日は自分が読みやすいように漢字で指定している.

注意 title 要素にスペース,アンパサンド,クオート,括弧などを挟むと破滅する.

その他

  • fork 先では config.yamlmovie : true を指定しているが,ココロハルカスのように告知なく動画配信を行うラジオがあるため,自分は採用を見送った.
  • 比較的こまめに見なおしているが,コメントが英語日本語混ざっていて良くない.
# -*- coding: utf-8 -*-
# record AGQR
# usage: use with crontab
# 29,59 * * * * sleep 55; ruby agqr.rb
# requirements
# crontab, ruby >~ 1.9, ffmpeg, rtmpdump
require 'yaml'
rtmpdump = '/usr/local/bin/rtmpdump'
ffmpeg = '/usr/local/bin/ffmpeg'
agqr_stream_url = 'rtmp://fms-base1.mitene.ad.jp/agqr/aandg22'
current = File.dirname(File.expand_path(__FILE__))
save_dir = "/Users/neo/Dropbox/agqr"
Dir.mkdir(save_dir) if !File.exist?(save_dir)
%w(mp3 flv).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(' ','')
flv_path = "#{save_dir}/flv/#{title}.flv"
# record stream
rec_command = "#{rtmpdump} -r #{agqr_stream_url} --live -B #{length} -o #{flv_path} >/dev/null 2>&1"
system rec_command
# encode flv -> m4a
m4a_path = "#{save_dir}/mp3/#{title}.m4a"
m4a_encode_command = "#{ffmpeg} -y -i #{flv_path} -vn -acodec copy #{m4a_path} >/dev/null 2>&1"
system m4a_encode_command
# encode m4a -> mp3
mp3_path = "#{save_dir}/mp3/#{title}.mp3"
mp3_encode_command = "#{ffmpeg} -i #{m4a_path} #{mp3_path} >/dev/null 2>&1"
system mp3_encode_command
# delete m4a
system "rm -rf #{m4a_path}"
end
end
- title: tobe_ishitobi
wday: 日
time: '19:00'
length: 30
- title: carry_up
wday: 月
time: '19:00'
length: 30
- title: at_living
wday: 月
time: '21:30'
length: 30
- title: muuun
wday: 月
time: '22:00'
length: 60
- title: hoshihina
wday: 月
time: '23:00'
length: 30
- title: yonayona
wday: 月
time: '24:00'
length: 60
- title: yonayona
wday: 火
time: '24:00'
length: 60
- title: yonayona
wday: 水
time: '24:00'
length: 60
- title: yonayona
wday: 木
time: '24:00'
length: 60
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment