rget 3.2.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
-
|