rget 3.2.3 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +6 -3
- data/bin/add_mp3info +10 -0
- data/bin/rget +4 -4
- data/lib/freshlive.rb +2 -2
- data/lib/hibiki.rb +9 -3
- data/lib/nicovideo.rb +12 -7
- data/lib/onsen.rb +7 -2
- data/lib/podcast.rb +3 -3
- data/lib/webradio.rb +44 -16
- data/rget.gemspec +3 -2
- data/rget.yaml +5 -6
- metadata +20 -6
- data/lib/animate.rb +0 -10
- data/lib/seaside-c.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28ed24cb1351d9eb22625a2f8cfbed704895040c
|
4
|
+
data.tar.gz: 4460fcfd5d9b9dd8198b4c7203f3d637d5ed714f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16049b9c31ab2f9ad6131131475e5cab1a43689f757ffc5fb6c6449d5d20d1372b4fec620033813d0eb5f02b475951ba8416e07b6282b48b994a253e1decba32
|
7
|
+
data.tar.gz: 41ce5d9d60d95c31b0b49c6734a1a5a4efd96e94f6356967597a58ffd3442adfdaa9602c8e6fcd2b65c527fdaf3d4f987d96873a72cee38458d0ab8b9b6c881f
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -3,15 +3,18 @@
|
|
3
3
|
Downloading newest radio programs on the web. Supported radio stations are:
|
4
4
|
|
5
5
|
* hibiki
|
6
|
-
* animate
|
7
6
|
* onsen
|
8
|
-
* seaside communications
|
9
7
|
* niconico
|
10
8
|
* freshlive.tv
|
11
9
|
|
12
10
|
If you want to save files as MP3, needs `ffmpeg` command.
|
13
11
|
|
14
|
-
For customize radio programs, copy `rget.yaml` to `~/.rget` or current work directory and edit it.
|
12
|
+
For customize radio programs, copy `rget.yaml` to `~/.rget` or current work directory and edit it. config file search paths are:
|
13
|
+
|
14
|
+
* RGET\_CONFIG environment variable
|
15
|
+
* ./rget.yaml
|
16
|
+
* ~/.rget
|
17
|
+
* <command path>/../rget.yaml (for gem)
|
15
18
|
|
16
19
|
## Installation
|
17
20
|
|
data/bin/add_mp3info
ADDED
data/bin/rget
CHANGED
@@ -13,11 +13,12 @@ class GetWebRadio < Thor
|
|
13
13
|
|
14
14
|
config_file = nil
|
15
15
|
[
|
16
|
+
ENV['RGET_CONFIG'],
|
16
17
|
'./rget.yaml',
|
17
18
|
'~/.rget',
|
18
19
|
"#{Pathname(__dir__)}/../rget.yaml",
|
19
20
|
].each do |file|
|
20
|
-
path = Pathname(file).expand_path
|
21
|
+
path = Pathname(file).expand_path rescue next
|
21
22
|
if path.exist?
|
22
23
|
config_file = path.to_s
|
23
24
|
break
|
@@ -32,13 +33,12 @@ class GetWebRadio < Thor
|
|
32
33
|
config['programs'].each do |command, params|
|
33
34
|
desc command, params['desc']
|
34
35
|
define_method(command) do
|
35
|
-
url = params['url']
|
36
36
|
opts = OpenStruct.new(config['options'].merge(options))
|
37
37
|
begin
|
38
38
|
if params['podcast']
|
39
|
-
Podcast.new(
|
39
|
+
Podcast.new(params, opts){|media|media.download}
|
40
40
|
else
|
41
|
-
WebRadio(
|
41
|
+
WebRadio(params, opts){|media|media.download}
|
42
42
|
end
|
43
43
|
rescue WebRadio::NotFoundError => e
|
44
44
|
$stderr.puts e.message
|
data/lib/freshlive.rb
CHANGED
@@ -9,12 +9,12 @@ class FreshLive < WebRadio
|
|
9
9
|
@doc = Nokogiri(open(@archive).read).root
|
10
10
|
end
|
11
11
|
|
12
|
-
def download
|
12
|
+
def download
|
13
13
|
offset = 0
|
14
14
|
begin
|
15
15
|
meta = program_meta(program_id(offset))
|
16
16
|
serial = meta['data']['title'].scan(/\d+$/).first.to_i
|
17
|
-
open("#{
|
17
|
+
open("#{@label}##{'%02d' % serial}.ts", 'wb') do |w|
|
18
18
|
ts_list(meta['data']['archiveStreamUrl']).each do |u|
|
19
19
|
w.write(open(u, 'rb').read)
|
20
20
|
end
|
data/lib/hibiki.rb
CHANGED
@@ -12,8 +12,8 @@ class Hibiki < WebRadio
|
|
12
12
|
@url = @url.sub(%r|/detail\Z|, '')
|
13
13
|
end
|
14
14
|
|
15
|
-
def download
|
16
|
-
hibiki_download(
|
15
|
+
def download
|
16
|
+
hibiki_download(@label, Pathname(@url).basename.to_s)
|
17
17
|
end
|
18
18
|
|
19
19
|
def dump
|
@@ -37,13 +37,19 @@ private
|
|
37
37
|
|
38
38
|
def hibiki_media_info(agent, program_id)
|
39
39
|
agent.request_headers = header
|
40
|
-
|
40
|
+
json = agent.get("https://vcms-api.hibiki-radio.jp/api/v1/programs/#{program_id}").body
|
41
|
+
JSON.parse(json, symbolize_names: true)
|
42
|
+
end
|
43
|
+
|
44
|
+
def find_cover(media_info)
|
45
|
+
media_info[:episode][:episode_parts].map{|s|s[:pc_image_url]}.reject(&:empty?)[0]
|
41
46
|
end
|
42
47
|
|
43
48
|
def hibiki_download(name, program_id)
|
44
49
|
begin
|
45
50
|
agent = Mechanize.new
|
46
51
|
media_info = hibiki_media_info(agent, program_id)
|
52
|
+
@cover = find_cover(media_info) unless @cover
|
47
53
|
serial = media_info[:episode][:name].scan(/([\d\.]+)/).flatten.first
|
48
54
|
video_id = media_info[:episode][:video][:id]
|
49
55
|
|
data/lib/nicovideo.rb
CHANGED
@@ -6,7 +6,7 @@ require 'open-uri'
|
|
6
6
|
require 'rss'
|
7
7
|
|
8
8
|
class Nicovideo < WebRadio
|
9
|
-
def initialize(
|
9
|
+
def initialize(params, options)
|
10
10
|
account = Pit::get('nicovideo', :require => {
|
11
11
|
:id => 'your nicovideo id',
|
12
12
|
:pass => 'your nicovideo password'
|
@@ -16,20 +16,21 @@ class Nicovideo < WebRadio
|
|
16
16
|
super
|
17
17
|
end
|
18
18
|
|
19
|
-
def download
|
19
|
+
def download
|
20
20
|
begin
|
21
21
|
player_url = get_player_url(@url)
|
22
22
|
rescue NoMethodError
|
23
23
|
raise DownloadError.new('video not found')
|
24
24
|
end
|
25
|
-
|
26
25
|
video_id = Pathname(URI(player_url).path).basename.to_s
|
26
|
+
@cover = thumbinfo(video_id, 'thumbnail_url') unless @cover
|
27
|
+
|
27
28
|
video = @nico.video(video_id)
|
28
|
-
title = video.title ||
|
29
|
+
title = video.title || thumbinfo(video_id, 'title') || video_id
|
29
30
|
title.tr!('0-9', '0-9')
|
30
31
|
serial = title.scan(/(?:[#第]|[ ]EP|track-)(\d+)|/).flatten.compact[0].to_i
|
31
32
|
appendix = title =~ /おまけ|アフタートーク/ ? 'a' : ''
|
32
|
-
@file = "#{
|
33
|
+
@file = "#{@label}##{'%02d' % serial}#{appendix}.#{video.type}"
|
33
34
|
@mp3_file = @file.sub(/\....$/, '.mp3')
|
34
35
|
mp3nize(@file, @mp3_file) do
|
35
36
|
open(@file, 'wb:ASCII-8BIT') do |o|
|
@@ -76,8 +77,12 @@ private
|
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
79
|
-
def
|
80
|
+
def thumbinfo(video_id, elem = nil)
|
80
81
|
xml = open("http://ext.nicovideo.jp/api/getthumbinfo/#{video_id}").read
|
81
|
-
|
82
|
+
if elem
|
83
|
+
return xml.scan(%r|<#{elem}>(.*)</#{elem}>|m).flatten.first
|
84
|
+
else
|
85
|
+
return xml
|
86
|
+
end
|
82
87
|
end
|
83
88
|
end
|
data/lib/onsen.rb
CHANGED
@@ -4,8 +4,13 @@ require 'webradio'
|
|
4
4
|
require 'nokogiri'
|
5
5
|
|
6
6
|
class Onsen < WebRadio
|
7
|
-
def
|
8
|
-
|
7
|
+
def initialize(params, options)
|
8
|
+
super
|
9
|
+
@cover = "//*[@id='newProgramWrap']//img[1]/@src" unless @cover
|
10
|
+
end
|
11
|
+
|
12
|
+
def download
|
13
|
+
onsen_download(@label, @url.scan(%r|/([^/]*)/$|).flatten.first)
|
9
14
|
end
|
10
15
|
|
11
16
|
def dump
|
data/lib/podcast.rb
CHANGED
@@ -9,9 +9,9 @@ class Podcast
|
|
9
9
|
yield self if block_given?
|
10
10
|
end
|
11
11
|
|
12
|
-
def download
|
12
|
+
def download
|
13
13
|
rss = RSS::Parser.parse(@url)
|
14
|
-
|
14
|
+
label = @label || rss.channel.title
|
15
15
|
episode = rss.items.first
|
16
16
|
serial = episode.link.scan(%r|\d+[^/\.]*|).flatten.first
|
17
17
|
if serial.to_i > 2000 # may be year
|
@@ -22,7 +22,7 @@ class Podcast
|
|
22
22
|
return
|
23
23
|
end
|
24
24
|
|
25
|
-
file = "#{
|
25
|
+
file = "#{label}##{serial}.mp3"
|
26
26
|
if File.exist? file
|
27
27
|
puts "'#{file}' is existent. skipped."
|
28
28
|
return
|
data/lib/webradio.rb
CHANGED
@@ -2,39 +2,36 @@
|
|
2
2
|
|
3
3
|
require 'open-uri'
|
4
4
|
require 'open3'
|
5
|
+
require 'mp3info'
|
5
6
|
|
6
7
|
class WebRadio
|
7
8
|
class NotFoundError < StandardError; end
|
8
9
|
class DownloadError < StandardError; end
|
9
10
|
|
10
|
-
def self.instance(
|
11
|
-
case url
|
11
|
+
def self.instance(params, options)
|
12
|
+
case params['url']
|
12
13
|
when %r[^http://hibiki-radio\.jp/]
|
13
14
|
require 'hibiki'
|
14
|
-
Hibiki.new(
|
15
|
-
when %r[^http://sp\.animate\.tv/]
|
16
|
-
require 'animate'
|
17
|
-
Animate.new(url)
|
15
|
+
Hibiki.new(params, options)
|
18
16
|
when %r[^http://(www\.)?onsen\.ag/program/]
|
19
17
|
require 'onsen'
|
20
|
-
Onsen.new(
|
21
|
-
when %r[^http://seaside-c\.jp/program/], %r[http://nakamuland\.net/]
|
22
|
-
require 'seaside-c'
|
23
|
-
SeasideCommnunications.new(url, options)
|
18
|
+
Onsen.new(params, options)
|
24
19
|
when %r[nicovideo\.jp]
|
25
20
|
require 'nicovideo'
|
26
|
-
Nicovideo.new(
|
21
|
+
Nicovideo.new(params, options)
|
27
22
|
when %r[^https://freshlive\.tv/]
|
28
23
|
require 'freshlive'
|
29
|
-
FreshLive.new(
|
24
|
+
FreshLive.new(params, options)
|
30
25
|
else
|
31
|
-
raise
|
26
|
+
raise "unsupported url: #{params['url']}"
|
32
27
|
end
|
33
28
|
end
|
34
29
|
|
35
|
-
def initialize(
|
30
|
+
def initialize(params, options)
|
36
31
|
raise 'do not instanciate directly, use WebRadio method.' if self.class == WebRadio
|
37
|
-
@url = url
|
32
|
+
@url = params['url']
|
33
|
+
@label = params['label']
|
34
|
+
@cover = params['cover']
|
38
35
|
@options = options
|
39
36
|
if !@options.dump && @options.path =~ %r|^dropbox://|
|
40
37
|
require 'dropbox'
|
@@ -42,7 +39,7 @@ class WebRadio
|
|
42
39
|
end
|
43
40
|
end
|
44
41
|
|
45
|
-
def download
|
42
|
+
def download
|
46
43
|
raise 'not implemented.'
|
47
44
|
end
|
48
45
|
|
@@ -79,6 +76,7 @@ private
|
|
79
76
|
end
|
80
77
|
end
|
81
78
|
if !@options.mp3 || src == dst
|
79
|
+
add_cover(dst)
|
82
80
|
move(src) if @options.path
|
83
81
|
return
|
84
82
|
end
|
@@ -96,6 +94,7 @@ private
|
|
96
94
|
result = Open3.capture3(ffmpeg)
|
97
95
|
if result[2].to_i == 0
|
98
96
|
File.delete(src) if delete_src
|
97
|
+
add_cover(dst)
|
99
98
|
puts "done."
|
100
99
|
else
|
101
100
|
File.delete(dst) if File.exist?(dst)
|
@@ -106,6 +105,35 @@ private
|
|
106
105
|
move(dst) if @options.path
|
107
106
|
end
|
108
107
|
|
108
|
+
def add_cover(dst)
|
109
|
+
begin
|
110
|
+
mp3 = Mp3Info.new(dst)
|
111
|
+
mp3.tag.title = File.basename(dst, '.mp3')
|
112
|
+
mp3.tag2.add_picture(cover_image) if @cover
|
113
|
+
mp3.close
|
114
|
+
rescue
|
115
|
+
$stderr.puts "add mp3 info failed (#$!)"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def cover_image
|
120
|
+
if @cover =~ /^https?:/
|
121
|
+
cover_image_as_url()
|
122
|
+
else # XPath
|
123
|
+
cover_image_as_xpath()
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def cover_image_as_url
|
128
|
+
open(@cover, 'rb', &:read)
|
129
|
+
end
|
130
|
+
|
131
|
+
def cover_image_as_xpath
|
132
|
+
html = Nokogiri(open(@url, &:read))
|
133
|
+
image_url = (URI(@url) + (html.xpath(@cover).text)).to_s
|
134
|
+
open(image_url, 'r:ASCII-8BIT', &:read)
|
135
|
+
end
|
136
|
+
|
109
137
|
def exist?(dst)
|
110
138
|
if @dropbox
|
111
139
|
begin
|
data/rget.gemspec
CHANGED
@@ -4,10 +4,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "rget"
|
7
|
-
spec.version = "
|
7
|
+
spec.version = "4.0.0"
|
8
8
|
spec.authors = ["TADA Tadashi"]
|
9
9
|
spec.email = ["t@tdtds.jp"]
|
10
|
-
spec.description = %q{Downloading newest radio programs on the web. Supported radio stations are hibiki,
|
10
|
+
spec.description = %q{Downloading newest radio programs on the web. Supported radio stations are hibiki, onsen, niconico and freshlive.}
|
11
11
|
spec.summary = %q{Downloading newest radio programs on the web.}
|
12
12
|
spec.homepage = "https://bitbucket.org/tdtds/rget"
|
13
13
|
spec.license = "GPL"
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_runtime_dependency "niconico", ">= 1.8.0"
|
23
23
|
spec.add_runtime_dependency "pit"
|
24
24
|
spec.add_runtime_dependency "dropbox-api", ">= 0.4.6"
|
25
|
+
spec.add_runtime_dependency "mp3info"
|
25
26
|
|
26
27
|
spec.add_development_dependency "bundler", "~> 1.3"
|
27
28
|
spec.add_development_dependency "rake"
|
data/rget.yaml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
options:
|
2
|
-
mp3nize: ffmpeg -i '$1' -ab 64k '$2'
|
2
|
+
mp3nize: ffmpeg -i '$1' -vn -acodec copy '$2' || ffmpeg -i '$1' -vn -y -ab 64k '$2'
|
3
3
|
programs:
|
4
4
|
imas_cg:
|
5
5
|
desc: デレラジ☆
|
@@ -42,12 +42,11 @@ programs:
|
|
42
42
|
desc: アイドルマスターWebラジオ~バンプレストスペシャル~ラジオは……遊びでは、ないんですから
|
43
43
|
url: http://ch.nicovideo.jp/search/%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC?channel_id=ch346&mode=s&sort=f&order=d&type=video
|
44
44
|
label: バンプレスト
|
45
|
-
amina1422:
|
46
|
-
desc: 佐藤亜美菜のこの世に小文字はいりません!
|
47
|
-
url: http://feeds.feedburner.com/amina1422
|
48
|
-
label: よにこも
|
49
|
-
podcast: true
|
50
45
|
takamori:
|
51
46
|
desc: 高森重戦舎 (声優バラエティ専門「声フレ」チャンネル内)
|
52
47
|
url: https://freshlive.tv/seifre
|
53
48
|
label: 高森重戦舎
|
49
|
+
matsui:
|
50
|
+
desc: ラジオ「松井恵理子のにじらじっ!」
|
51
|
+
url: http://www.onsen.ag/program/matsui/
|
52
|
+
label: 松井恵理子のにじらじ
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rget
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TADA Tadashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.4.6
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mp3info
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,10 +137,11 @@ dependencies:
|
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
139
|
description: Downloading newest radio programs on the web. Supported radio stations
|
126
|
-
are hibiki,
|
140
|
+
are hibiki, onsen, niconico and freshlive.
|
127
141
|
email:
|
128
142
|
- t@tdtds.jp
|
129
143
|
executables:
|
144
|
+
- add_mp3info
|
130
145
|
- nicodl
|
131
146
|
- rget
|
132
147
|
extensions: []
|
@@ -137,16 +152,15 @@ files:
|
|
137
152
|
- LICENSE.txt
|
138
153
|
- README.md
|
139
154
|
- Rakefile
|
155
|
+
- bin/add_mp3info
|
140
156
|
- bin/nicodl
|
141
157
|
- bin/rget
|
142
|
-
- lib/animate.rb
|
143
158
|
- lib/dropbox.rb
|
144
159
|
- lib/freshlive.rb
|
145
160
|
- lib/hibiki.rb
|
146
161
|
- lib/nicovideo.rb
|
147
162
|
- lib/onsen.rb
|
148
163
|
- lib/podcast.rb
|
149
|
-
- lib/seaside-c.rb
|
150
164
|
- lib/uliza.rb
|
151
165
|
- lib/webradio.rb
|
152
166
|
- rget.gemspec
|
@@ -171,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
185
|
version: '0'
|
172
186
|
requirements: []
|
173
187
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.6.
|
188
|
+
rubygems_version: 2.6.13
|
175
189
|
signing_key:
|
176
190
|
specification_version: 4
|
177
191
|
summary: Downloading newest radio programs on the web.
|
data/lib/animate.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'uliza'
|
4
|
-
|
5
|
-
class Animate < Uliza
|
6
|
-
def download(name)
|
7
|
-
uliza_download(name, open(@url, 'User-Agent' => 'iPhone', &:read), /(?:活動|第)(\d+)(?:週目『|回 「)/, %r|src="(http://www2.uliza.jp/IF/iphone/iPhonePlaylist.m3u8.*?)"|)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
data/lib/seaside-c.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'webradio'
|
2
|
-
|
3
|
-
class SeasideCommnunications < WebRadio
|
4
|
-
def download(name)
|
5
|
-
html = open(@url, &:read)
|
6
|
-
playlist_url, serial = html.scan(%r[(http:.*?\_(\d+).wax)]).flatten
|
7
|
-
unless playlist_url
|
8
|
-
raise WebRadio::DownloadError.new("recent radio program not found.")
|
9
|
-
end
|
10
|
-
serial = serial.to_i
|
11
|
-
|
12
|
-
playlist = open(playlist_url, &:read)
|
13
|
-
wma_url, = playlist.scan(%r[http://.*?\.wma])
|
14
|
-
|
15
|
-
@wma_file = "#{name}##{serial}.wma"
|
16
|
-
@mp3_file = @wma_file.sub(/\.wma$/, '.mp3')
|
17
|
-
mp3nize(@wma_file, @mp3_file) do
|
18
|
-
open(@wma_file, 'wb:ASCII-8BIT') do |wma|
|
19
|
-
wma.write(open(wma_url, &:read))
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|