rbtune 1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendor
11
+ authkey.png
12
+ player.swf
13
+ *.aac
14
+ *.m4a
15
+ *.wma
16
+ *.gem
17
+ *.ts
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rbtune.gemspec
4
+ gemspec
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
+
@@ -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 まで、よろしくお願いします。
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -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__)
@@ -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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -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
@@ -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