rbtune 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +8 -0
- data/README.md +152 -0
- data/Rakefile +2 -0
- data/bin/console +15 -0
- data/bin/rbplay +50 -0
- data/bin/setup +8 -0
- data/exe/rbtune +95 -0
- data/exe/timefree +108 -0
- data/lib/keychain.rb +47 -0
- data/lib/player/ffmpeg.rb +54 -0
- data/lib/player/mplayer.rb +66 -0
- data/lib/player/player.rb +29 -0
- data/lib/player/rtmpdump.rb +37 -0
- data/lib/rbtune.rb +8 -0
- data/lib/rbtune/agqr.rb +36 -0
- data/lib/rbtune/jcba.rb +32 -0
- data/lib/rbtune/listenradio.rb +45 -0
- data/lib/rbtune/radiko.rb +143 -0
- data/lib/rbtune/radiko_premium.rb +70 -0
- data/lib/rbtune/radio.rb +207 -0
- data/lib/rbtune/radiru.rb +52 -0
- data/lib/rbtune/simul.rb +93 -0
- data/lib/rbtune/station.rb +91 -0
- data/lib/rbtune/timefree.rb +51 -0
- data/lib/rbtune/version.rb +3 -0
- data/rbtune.gemspec +34 -0
- metadata +158 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9781278019389b83f08d690c0ee5e5bf4d19822b087c7e4208a59fd7302441d9
|
4
|
+
data.tar.gz: fbd6ec402edd97d7bee5e31aadcb62ea456446138766343b4822fad700bdf422
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d04c9cca92f778af564b323b921ba6cb0d5ec07643ecd42c5f83da025550195d8be7b4441640216c75a903d399a3c07ae4b7c3dc448e19ab26454fdc33323a99
|
7
|
+
data.tar.gz: 796f468334a6246ef96776df8763fe5b3ac8f52a0877d8f7ea2b91d3c3623c8e727a420bb7a33dbe5ab6a3e28b7d5a857396c9a811c8d46f96f9ee73b85fec41
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
Copyright 2020 ASAHI,Michiharu
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
4
|
+
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
6
|
+
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
8
|
+
|
data/README.md
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
# rbtune
|
2
|
+
|
3
|
+
日本国内のラジオ局のIPサイマル放送を受信するツールです。
|
4
|
+
録音機能もあり、OSの定時実行機能と組み合わせてラジオ番組の予約録音が可能です。
|
5
|
+
主な使い方として、RaspberryPi を24時間稼働させて、cron から rbtune を呼び出すことで、ラジオ番組の予約録音サーバにします。
|
6
|
+
|
7
|
+
おまけとして、radiko で放送後一週間程度番組を聴取できるタイムフリー機能から録音するツール timefree が付属しています。
|
8
|
+
|
9
|
+
|
10
|
+
## 対応しているIPサイマル放送
|
11
|
+
|
12
|
+
以下のIPサイマル放送に対応しています。
|
13
|
+
|
14
|
+
- NHKネットラジオ らじる★らじる
|
15
|
+
- radiko (radikoプレミアム)
|
16
|
+
- SimulRadio
|
17
|
+
- ListenRadio
|
18
|
+
- JCBA インターネットサイマルラジオ
|
19
|
+
- 超!A&G+
|
20
|
+
|
21
|
+
|
22
|
+
## インストールと設定
|
23
|
+
|
24
|
+
ffmpeg, rtmpdump, mplayer をインストールする必要があります。
|
25
|
+
|
26
|
+
$ sudo apt install ffmpeg rtmpdump mplayer
|
27
|
+
|
28
|
+
rbtune 本体は gem でインストールできます。Ruby 2.5以降が必要です。
|
29
|
+
|
30
|
+
$ gem install rbtune
|
31
|
+
|
32
|
+
|
33
|
+
### 放送局リストの取得
|
34
|
+
|
35
|
+
インストールしたらまず、ネットから放送局リストを取得します。
|
36
|
+
|
37
|
+
$ rbtune --fetch-stations
|
38
|
+
|
39
|
+
対応するすべてのサイトの情報を取得しますが、IPサイマル放送サイトの仕様変更により、取得ができなくなる場合があります。
|
40
|
+
放送局リストはホームディレクトリにある .rbtune.db に保存されます。
|
41
|
+
|
42
|
+
|
43
|
+
### radikoプレミアムの認証情報の設定
|
44
|
+
|
45
|
+
radikoのプレミアム会員であれば、他県の放送を聴取できるエリアフリー機能を利用できます。
|
46
|
+
--set-account オプションで登録メールアドレスとパスワードを設定します。
|
47
|
+
|
48
|
+
$ rbtune --set-account メールアドレス
|
49
|
+
radikoプレミアムのパスワードを入力してください
|
50
|
+
password :
|
51
|
+
|
52
|
+
パスワードを入力してエンターキーを押すと、登録できます。
|
53
|
+
何も入力せずにエンターキーを押すと、現在の設定のままになります。
|
54
|
+
|
55
|
+
各種設定はホームディレクトリにある .pit/default.yaml に保存されます。
|
56
|
+
保存パスワードには暗号化はほどこされていないので、流出にご注意ください。
|
57
|
+
|
58
|
+
|
59
|
+
### アンインストールするとき
|
60
|
+
|
61
|
+
rbtune ならびに timefree が不要になったら、以下のコマンドでアンインストールできます。
|
62
|
+
|
63
|
+
$ gem uninstall rbtune
|
64
|
+
|
65
|
+
|
66
|
+
## 使い方
|
67
|
+
|
68
|
+
rbtune --help を実行すると、以下のヘルプメニューが表示されます。
|
69
|
+
|
70
|
+
Usage: rbtune [options] station [minutes]
|
71
|
+
|
72
|
+
らじる★らじる、radikoなどの日本のラジオ局のIPサイマル放送を聴取・録音する
|
73
|
+
|
74
|
+
-o, --output FILE 録音するファイル名 (省略時、放送局コード)
|
75
|
+
-q, --quiet 録音時に再生しない
|
76
|
+
-l, --list-stations 放送局リストを表示して終了
|
77
|
+
--fetch-stations 放送局リストを取得して終了
|
78
|
+
--set-account ACCOUNT radikoプレミアムのアカウントを登録して終了
|
79
|
+
|
80
|
+
|
81
|
+
### 聴取する
|
82
|
+
|
83
|
+
ラジオ局を指定して実行すると、ラジオ番組を聴取します。
|
84
|
+
|
85
|
+
$ rbtune station
|
86
|
+
|
87
|
+
station には --list-stations で表示される放送局のIDまたは名前を指定します。
|
88
|
+
名前の一部を指定した場合、放送局リストで一番最初に見つけた局を受信します。
|
89
|
+
なお、局の都合や回線の状況により、放送局リストに存在する局を実際には受信できないことがあります。
|
90
|
+
|
91
|
+
|
92
|
+
### 録音する
|
93
|
+
|
94
|
+
ラジオ局に加えて、何分間録音するかを指定することで、放送中のラジオ番組をファイルに録音できます。
|
95
|
+
|
96
|
+
$ rbtune station minutes
|
97
|
+
|
98
|
+
minutes は分単位です。小数も指定でき、0.5分は30秒となりますが、回線の状況等により、指定した時間より短く録音される場合があります。
|
99
|
+
ファイルの保存先はカレントディレクトリですが、環境変数 RADIODIR を設定すると、ファイルはそのディレクトリに保存されます。(ディレクトリはあらかじめ作っておいてください)
|
100
|
+
|
101
|
+
録音したファイルは 放送局コード.年-月-日T時=分.ext という形式になります。ファイル拡張子 ext はIPサイマル放送によって異なります。
|
102
|
+
|
103
|
+
--output オプションを指定すると、保存されるファイル名は FILE.年-月-日T時=分.ext となります。
|
104
|
+
回線の状況等によって録音が中断した場合、録音の再開を試みます。その場合、ファイル名の 年-月-日T時=分 の部分は、再開した日時になります。
|
105
|
+
|
106
|
+
--quiet オプションを指定すると、受信した番組を無音のまま録音します。
|
107
|
+
|
108
|
+
|
109
|
+
### 録音機能についての注意
|
110
|
+
|
111
|
+
回線や放送サーバの状況によって、録音が中断したり、中断からの再開に失敗したり、番組の途中で録音が終了してしまう場合があります。
|
112
|
+
rbtune によるあらゆる聴取・録音の失敗について、作者は責任を追うことができません。
|
113
|
+
あしからずご了承ください。
|
114
|
+
|
115
|
+
|
116
|
+
# timefree
|
117
|
+
|
118
|
+
radikoのタイムフリーで聴取可能な番組を録音するツールです。rbtune と同時にインストールされます。
|
119
|
+
|
120
|
+
|
121
|
+
## 使い方
|
122
|
+
|
123
|
+
timefree --help を実行すると、以下のヘルプメニューが表示されます。
|
124
|
+
|
125
|
+
Usage: timefree [options] station date time minutes
|
126
|
+
|
127
|
+
radikoのタイムフリー機能で公開されている番組をファイルに録音する
|
128
|
+
|
129
|
+
date: [年/]月/日 or sun,mon,tue,wed,thu,fri and sat
|
130
|
+
time: 時:分
|
131
|
+
|
132
|
+
-o, --output FILE 録音するファイル名 (省略時、放送局コード)
|
133
|
+
-l, --list-stations 放送局リストを表示して終了
|
134
|
+
--fetch-stations 放送局リストを取得して終了
|
135
|
+
--set-account ACCOUNT radikoプレミアムのアカウントを登録して終了
|
136
|
+
|
137
|
+
|
138
|
+
timefree で --fetch-stations を行った場合、radiko と radikoプレミアムの放送局リストだけが取得されます。
|
139
|
+
|
140
|
+
date には 年/月/日 や 月/日 形式以外にも、英語の曜日の省略形が使えます。
|
141
|
+
日月火水木金土が、sun, mon, tue, wed, thu, fri, sat に対応します。
|
142
|
+
time は 時:分 形式で指定しますが、24〜29時も指定できます。
|
143
|
+
|
144
|
+
minutes は rbtune 同様、分単位です。
|
145
|
+
|
146
|
+
radikoのタイムフリー機能では、放送から約一週間分の番組を聴取できます。
|
147
|
+
当然、聴取期間が過ぎてしまった番組を録音することはできません。
|
148
|
+
|
149
|
+
|
150
|
+
## プロジェクトへの協力
|
151
|
+
|
152
|
+
バグ報告やプルリクエストは Github の https://github.com/fusuian/rbtune まで、よろしくお願いします。
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "rbtune"
|
5
|
+
require "rbtune/timefree"
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require "irb"
|
15
|
+
IRB.start(__FILE__)
|
data/bin/rbplay
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "rbtune"
|
4
|
+
require "keychain"
|
5
|
+
require "optparse"
|
6
|
+
|
7
|
+
opt = OptionParser.new
|
8
|
+
opt.version = Rbtune::VERSION
|
9
|
+
opt.banner += <<"EOS"
|
10
|
+
site station
|
11
|
+
|
12
|
+
ラジオ配信サイトクラスと放送局コードを指定して、ラジオ放送を受信する。
|
13
|
+
|
14
|
+
sites: #{Radio::bands * "|" }
|
15
|
+
|
16
|
+
EOS
|
17
|
+
|
18
|
+
opt.parse! ARGV
|
19
|
+
unless ARGV.size == 2
|
20
|
+
puts opt.help
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
klass = Module.const_get(ARGV.shift)
|
24
|
+
radio = klass.new
|
25
|
+
unless radio.is_a? Radio
|
26
|
+
puts "site #{klass} は正しくありません"
|
27
|
+
exit 1
|
28
|
+
end
|
29
|
+
|
30
|
+
channel = ARGV.shift
|
31
|
+
|
32
|
+
begin
|
33
|
+
if radio.is_a? RadikoPremium
|
34
|
+
kc = KeyChain.new("http://radiko.jp")
|
35
|
+
account, password = kc.account
|
36
|
+
radio.login account, password
|
37
|
+
end
|
38
|
+
radio.open
|
39
|
+
radio.tune channel
|
40
|
+
radio.play
|
41
|
+
|
42
|
+
rescue Radio::HTTPForbiddenException
|
43
|
+
puts 'radikoプレミアムの認証に失敗しました。rbtune --set-authentication で正しいアカウントとパスワードを設定してください'
|
44
|
+
|
45
|
+
rescue Interrupt
|
46
|
+
# do nothing
|
47
|
+
|
48
|
+
ensure
|
49
|
+
radio.close
|
50
|
+
end
|
data/bin/setup
ADDED
data/exe/rbtune
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
require "rbtune"
|
5
|
+
require "keychain"
|
6
|
+
require "optparse"
|
7
|
+
require "pp"
|
8
|
+
|
9
|
+
filename = nil
|
10
|
+
quiet = false
|
11
|
+
|
12
|
+
account = nil
|
13
|
+
list_stations = false
|
14
|
+
fetch_stations = false
|
15
|
+
|
16
|
+
|
17
|
+
opt = OptionParser.new
|
18
|
+
Version = Rbtune::VERSION
|
19
|
+
opt.banner += <<EOS
|
20
|
+
station [minutes]
|
21
|
+
|
22
|
+
らじる★らじる、radikoなどの日本のラジオ局のIPサイマル放送を聴取・録音する
|
23
|
+
|
24
|
+
EOS
|
25
|
+
|
26
|
+
opt.on("-o FILE", "--output", "録音するファイル名 (省略時、放送局コード)"){|v| filename = v}
|
27
|
+
opt.on("-q", "--quiet", "録音時に再生しない" ) { quiet = true }
|
28
|
+
opt.on("-l", "--list-stations", "放送局リストを表示して終了" ) { list_stations = true }
|
29
|
+
opt.on("--fetch-stations", "放送局リストを取得して終了" ) { fetch_stations = true }
|
30
|
+
opt.on("--set-account ACCOUNT", "radikoプレミアムのアカウントを登録して終了") {|v| account = v}
|
31
|
+
opt.parse! ARGV
|
32
|
+
|
33
|
+
kc = KeyChain.new("http://radiko.jp")
|
34
|
+
case
|
35
|
+
when account
|
36
|
+
RadikoPremium.set_authentication kc, account
|
37
|
+
exit
|
38
|
+
|
39
|
+
when list_stations
|
40
|
+
Station.list_stations
|
41
|
+
exit
|
42
|
+
|
43
|
+
when fetch_stations
|
44
|
+
Station.fetch_stations
|
45
|
+
exit
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
case ARGV.size
|
50
|
+
when 1
|
51
|
+
min = 0
|
52
|
+
when 2
|
53
|
+
min = ARGV[1].to_f
|
54
|
+
else
|
55
|
+
puts opt.help
|
56
|
+
exit 1
|
57
|
+
end
|
58
|
+
channel = ARGV[0].upcase
|
59
|
+
|
60
|
+
radio_class, station = Radio.search channel
|
61
|
+
if radio_class
|
62
|
+
puts "#{station.name} (#{radio_class})"
|
63
|
+
channel = station.id
|
64
|
+
else
|
65
|
+
puts "放送局コード #{channel} は登録されていません"
|
66
|
+
exit 1
|
67
|
+
end
|
68
|
+
|
69
|
+
radio = radio_class.new
|
70
|
+
radio.outdir = ENV['RADIODIR'] || '.'
|
71
|
+
|
72
|
+
begin
|
73
|
+
if radio.is_a? RadikoPremium
|
74
|
+
account, password = kc.account
|
75
|
+
radio.login account, password
|
76
|
+
end
|
77
|
+
radio.open
|
78
|
+
radio.tune channel
|
79
|
+
if min > 0
|
80
|
+
filename ||= channel
|
81
|
+
sec = min*60
|
82
|
+
radio.record filename, sec, quiet: quiet
|
83
|
+
else
|
84
|
+
radio.play
|
85
|
+
end
|
86
|
+
|
87
|
+
rescue Radio::HTTPForbiddenException
|
88
|
+
puts 'radikoプレミアムの認証に失敗しました。--set-account オプションで正しいアカウントとパスワードを設定してください'
|
89
|
+
|
90
|
+
rescue Interrupt
|
91
|
+
# do nothing
|
92
|
+
|
93
|
+
ensure
|
94
|
+
radio.close
|
95
|
+
end
|
data/exe/timefree
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "rbtune/version"
|
4
|
+
require "rbtune/timefree"
|
5
|
+
require "keychain"
|
6
|
+
require "optparse"
|
7
|
+
|
8
|
+
channel = nil
|
9
|
+
date = nil
|
10
|
+
time = nil
|
11
|
+
min = 30
|
12
|
+
filename = nil
|
13
|
+
|
14
|
+
account = nil
|
15
|
+
list_stations = false
|
16
|
+
fetch_stations = false
|
17
|
+
|
18
|
+
opt = OptionParser.new
|
19
|
+
opt.version = Rbtune::VERSION
|
20
|
+
opt.banner += <<"EOS"
|
21
|
+
station date time minutes
|
22
|
+
|
23
|
+
radikoのタイムフリー機能で公開されている番組をファイルに録音する
|
24
|
+
|
25
|
+
date: [年/]月/日 or sun,mon,tue,wed,thu,fri,sat
|
26
|
+
time: 時:分
|
27
|
+
|
28
|
+
EOS
|
29
|
+
opt.on("-o FILE", "--output", "録音するファイル名 (省略時、放送局コード)"){|v| filename=v}
|
30
|
+
opt.on("-l", "--list-stations", "放送局リストを表示して終了" ) { list_stations = true }
|
31
|
+
opt.on("--fetch-stations", "放送局リストを取得して終了" ) { fetch_stations = true }
|
32
|
+
opt.on("--set-account ACCOUNT", "radikoプレミアムのアカウントを登録して終了") {|v| account = v}
|
33
|
+
opt.parse! ARGV
|
34
|
+
|
35
|
+
kc = KeyChain.new("http://radiko.jp")
|
36
|
+
case
|
37
|
+
when account
|
38
|
+
RadikoPremium.set_authentication kc, account
|
39
|
+
exit
|
40
|
+
|
41
|
+
when list_stations
|
42
|
+
Station.list_stations
|
43
|
+
exit
|
44
|
+
|
45
|
+
when fetch_stations
|
46
|
+
Station.fetch_stations
|
47
|
+
exit
|
48
|
+
|
49
|
+
when ARGV.size != 4
|
50
|
+
puts opt.help
|
51
|
+
exit 1
|
52
|
+
end
|
53
|
+
channel = ARGV[0]
|
54
|
+
|
55
|
+
radio_class, station = Radio.search channel
|
56
|
+
if radio_class
|
57
|
+
puts "station: #{station.name}"
|
58
|
+
channel = station.id
|
59
|
+
else
|
60
|
+
puts "放送局コード #{channel} は登録されていません"
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
|
64
|
+
filename ||= channel
|
65
|
+
|
66
|
+
begin
|
67
|
+
date = ARGV[1]
|
68
|
+
time = ARGV[2].dup
|
69
|
+
# 25-29時が指定された場合、翌日の未明とする
|
70
|
+
day = time.sub!(/(2[5-9]):/){ "#{$1.to_i-24}:" }? 1 : 0
|
71
|
+
starttime = DateTime.parse("#{date}T#{time}") + day
|
72
|
+
# date が sun,mon,..,sat など曜日指定だと、当日以外は翌日以降を返すので、
|
73
|
+
# 未来だったら前の週の日付を求める (当日だったらそのまま)
|
74
|
+
starttime -= 7 if starttime > Date.today + 1
|
75
|
+
|
76
|
+
rescue Date::Error
|
77
|
+
puts "日時のフォーマットに誤りがあります: date #{date} time #{time}"
|
78
|
+
exit 1
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
min = ARGV[3].to_f
|
83
|
+
sec = min*60
|
84
|
+
|
85
|
+
|
86
|
+
begin
|
87
|
+
radio = TimeFree.new
|
88
|
+
radio.outdir = ENV['RADIODIR'] || '.'
|
89
|
+
if radio_class.is_a? RadikoPremium
|
90
|
+
account, password = kc.account
|
91
|
+
radio.login account, password
|
92
|
+
end
|
93
|
+
radio.open
|
94
|
+
radio.tune channel
|
95
|
+
radio.record filename, starttime, sec
|
96
|
+
|
97
|
+
rescue Radio::HTTPBadRequestException
|
98
|
+
puts "HTTPBadRequest: 番組の公開が終了しています"
|
99
|
+
|
100
|
+
rescue Radio::HTTPForbiddenException
|
101
|
+
puts 'radikoプレミアムの認証に失敗しました。timefree --set-account で正しいアカウントとパスワードを設定してください'
|
102
|
+
|
103
|
+
rescue Interrupt
|
104
|
+
# do nothing
|
105
|
+
|
106
|
+
ensure
|
107
|
+
radio.close
|
108
|
+
end
|