xmfun 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 57e6f8c8ed8e94b3301e745df32a1be299c35adc
4
- data.tar.gz: 114ed2d3d93e2143d22e39cce59e708c9813a8f0
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NGY4NmI2ODczZjRkY2M4MmM5ZTdkMDY5MTk0NGJjMzQyMDA0YzA2ZA==
5
+ data.tar.gz: !binary |-
6
+ YTQxNjk4YjgyYTZiNzdlZTFkNmNhMzY2YTczYjQzNWUyY2I1NmExNg==
5
7
  SHA512:
6
- metadata.gz: 812327659aaca61580bf2f841cc0fe84eb3e57c7ae6c8f57d334c0043df6b3958a7989bff9e3f80e18089cc69d203f3e348ee0082b622df6e50ad4a9a90704b1
7
- data.tar.gz: 3f249647c5051ad5d22ab1c18c514008c3954022928720ee7c0ec02528ddb1d48e3f89d0f1fe0495e0c0c55cbd9470395484aba6a7434ab08a0b9477e899a3b9
8
+ metadata.gz: !binary |-
9
+ ZDhlOGI2YTE2ZjAyZDVhYWJkYzZlZDMyZWNkM2U2N2NkZTNhYmJjYjQwMmNl
10
+ ZTM0MjY2ZGUyOTA3NGFhNGQ4MTU2YTViNzI3YjViOTM5ZTYzZmRkYzZjNGQx
11
+ NDM2NmY2NmRmZDMzZTRlYTk2NjdiNTliYWI3ODM1MDUzYjM0MGQ=
12
+ data.tar.gz: !binary |-
13
+ Mzg2NGFiYTU0MjAwY2YwM2ZlNzM2YmIyODBiODE0N2Q5ZDVlZWJmOTFiODc2
14
+ NzgxZWQ2OTkwMzYwYTdlMDNmYjM4NDE1YzgxNDY1YTUzZmYxODA4ZGYzNWQ0
15
+ ZjEzZDFhNDExMWIyYWE3ZTYyZGYzYjBkYjk4OGJlMTUwYTQwMDg=
data/bin/xmfun CHANGED
@@ -7,9 +7,7 @@ url = ''
7
7
  dst = '.'
8
8
 
9
9
  Clap.run ARGV,
10
- #"-c" => lambda { |collect_id| url = "http://www.xiami.com/song/playlist/id/#{collect_id}/type/3" },
11
- #"-s" => lambda { |song_id| url = "http://www.xiami.com/song/playlist/id/#{song_id}/object_name/default/object_id/0" },
12
- "-u" => lambda { |xm_url| url = Xmfun::UrlParser.parse(xm_url) },
10
+ "-u" => lambda { |xm_url| url = Xmfun::Util::UrlParser.parse(xm_url) },
13
11
  "-d" => lambda { |d| dst = d },
14
12
  "-v" => lambda { puts Xmfun::VERSION },
15
13
  "-h" => lambda { puts Xmfun.help }
@@ -3,8 +3,8 @@
3
3
  require 'xmfun/version'
4
4
  require 'xmfun/mp3/track'
5
5
  require 'xmfun/mp3/mp3_tagger'
6
- require 'xmfun/url_parser'
7
- require 'xmfun/decoder'
6
+ require 'xmfun/util/url_parser'
7
+ require 'xmfun/util/decoder'
8
8
  require 'xmfun/downloader'
9
9
 
10
10
 
@@ -3,72 +3,76 @@
3
3
  require 'open-uri'
4
4
  require 'nokogiri'
5
5
  require 'nori'
6
- require 'clap'
7
6
  require 'parallel'
8
7
  require 'ruby-progressbar'
9
8
 
10
-
11
9
  module Xmfun
12
10
  class Downloader
13
11
  def self.download(url, dst)
12
+ make_dst(dst)
13
+
14
+ tracks = Nokogiri::XML(open(url, "Client-IP" => "220.181.111.168")).css("track")
14
15
 
16
+ if tracks.size > 1
17
+ download_collect(tracks)
18
+ else
19
+ download_song(tracks[0])
20
+ end
21
+ end
22
+
23
+ private
24
+ def self.make_dst(dst)
15
25
  if Dir.exist?(dst)
16
26
  Dir.chdir(dst)
17
27
  else
18
28
  Dir.mkdir(dst)
19
29
  Dir.chdir(dst)
20
30
  end
21
- f = Nokogiri::XML(open(url, "Client-IP" => "220.181.111.168"))
22
-
23
- tracks = f.css("track")
31
+ end
24
32
 
25
- if tracks.size > 1
26
- # progress
27
- progress = ProgressBar.create( :title => "Progress",
28
- :total => tracks.size,
29
- :format => '%a %bᗧ%i %p%% %t',
30
- :progress_mark => ' ',
31
- :remainder_mark => '・'
32
- )
33
+ def self.make_progress_bar(size)
34
+ ProgressBar.create( :title => "Progress",
35
+ :total => size,
36
+ :format => '%a %bᗧ%i %p%% %t',
37
+ :progress_mark => ' ',
38
+ :remainder_mark => '・' )
39
+ end
33
40
 
34
- #download collect
35
- Parallel.map( tracks, :in_threads => Parallel.processor_count, :finish => lambda { |item, i, result| progress.increment } ) do |track|
41
+ def self.download_collect(collect)
42
+ progress = make_progress_bar(collect.size)
36
43
 
37
- track = Xmfun::Mp3::Track.new(Nori.new.parse(track.to_s)['track'])
44
+ Parallel.map( collect, :in_threads => Parallel.processor_count, :finish => lambda { |item, i, result| progress.increment } ) do |track|
38
45
 
39
- URI.parse(track.location).open do |f|
40
- File.open(track.file_name, 'w') { |mp3| mp3.write(f.read) }
41
- end
46
+ track = Xmfun::Mp3::Track.new(Nori.new.parse(track.to_s)['track'])
42
47
 
43
- # add mp3 meta info
44
- Xmfun::Mp3::Mp3Tagger.tag(track)
45
- end
46
- else
47
- #download single sone
48
- song = tracks[0]
49
- track = Xmfun::Mp3::Track.new(Nori.new.parse(song.to_s)['track'])
50
-
51
- uri = URI.parse(track.location)
52
-
53
- progress = nil
54
-
55
- uri.open(:content_length_proc => lambda do |content_length|
56
- if content_length && 0 < content_length
57
- progress = ProgressBar.create( :title => "Progress",
58
- :total => content_length,
59
- :format => '%a %bᗧ%i %p%% %t',
60
- :progress_mark => ' ',
61
- :remainder_mark => '・')
62
- end
63
- end,
64
- :progress_proc => lambda {|size| progress.progress = size if progress}) do |f|
48
+ URI.parse(track.location).open do |f|
65
49
  File.open(track.file_name, 'w') { |mp3| mp3.write(f.read) }
66
50
  end
67
51
 
68
- # add mp3 meta info
69
52
  Xmfun::Mp3::Mp3Tagger.tag(track)
70
53
  end
54
+ end
55
+
56
+ def self.download_song(song)
57
+ track = Xmfun::Mp3::Track.new(Nori.new.parse(song.to_s)['track'])
58
+ progress = nil
59
+
60
+ content_length_lambda = lambda do |content_length|
61
+ if content_length && 0 < content_length
62
+ progress = make_progress_bar content_length
63
+ end
64
+ end
65
+
66
+ progress_lambda = lambda { |size| progress.progress = size if progress }
67
+
68
+ uri = URI.parse(track.location)
69
+
70
+ uri.open( :content_length_proc => content_length_lambda,
71
+ :progress_proc => progress_lambda ) do |f|
72
+ File.open(track.file_name, 'w') { |mp3| mp3.write(f.read) }
73
+ end
71
74
 
75
+ Xmfun::Mp3::Mp3Tagger.tag(track)
72
76
  end
73
77
  end
74
78
  end
@@ -1,13 +1,12 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  require 'ostruct'
4
- require 'xmfun/decoder'
5
4
 
6
5
  module Xmfun
7
6
  module Mp3
8
7
  class Track
9
8
  def self.new(track_hash)
10
- track_hash["location"] = Xmfun::Decoder.decode(track_hash["location"])
9
+ track_hash["location"] = Xmfun::Util::Decoder.decode(track_hash["location"])
11
10
  track_hash["file_name"] = "#{track_hash["title"]}_#{track_hash["artist"]}.mp3"
12
11
  OpenStruct.new track_hash
13
12
  end
@@ -15,5 +14,3 @@ module Xmfun
15
14
  end
16
15
  end
17
16
 
18
-
19
-
@@ -0,0 +1,18 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ require 'cgi'
4
+ require 'active_support/core_ext/array/grouping'
5
+
6
+ module Xmfun
7
+ module Util
8
+ class Decoder
9
+ def self.decode(input)
10
+ text = input[1..-1].chars.to_a
11
+ row = input[0].to_i
12
+
13
+ tmp = text.in_groups(row).transpose.join
14
+ CGI::unescape(tmp).gsub('^', '0')
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Xmfun
4
+ module Util
5
+ class UrlParser
6
+ def self.parse(url)
7
+ if uri? url
8
+ url_array = url.split("//").last.split(/(\/|\?)/)
9
+ type, id = url_array[2], url_array[4]
10
+
11
+ case type
12
+ when "album" then "http://www.xiami.com/song/playlist/id/#{id}/type/1"
13
+ when "artist" then "http://www.xiami.com/song/playlist/id/#{id}/type/2"
14
+ when "collect" then "http://www.xiami.com/song/playlist/id/#{id}/type/3"
15
+ when "song" then "http://www.xiami.com/song/playlist/id/#{id}/object_name/default/object_id/0"
16
+ else ""
17
+ end
18
+ else
19
+ false
20
+ end
21
+ end
22
+
23
+ def self.uri?(uri)
24
+ uri =~ /\A#{URI::regexp(['http', 'https'])}\z/
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module Xmfun
4
- VERSION = "0.0.3"
4
+ VERSION = "0.0.4"
5
5
  end
@@ -2,9 +2,9 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  module Xmfun
5
- describe Decoder do
5
+ describe Util::Decoder do
6
6
  before do
7
- @decoder = Xmfun::Decoder
7
+ @decoder = Xmfun::Util::Decoder
8
8
  @location = "8h2fmF%2956mtDe%fc185utFii12F%65ph3e5d24%Elt%l.%F35233_%4Ece%5-lp2ec272E74%k57e235E%%F.oF1%%123eE2eefE%53mxm16527_Fyd%6ab75EA5i%69EF_la%c52d88E-%.a29%333.u38E6a-8%n"
9
9
  @url = "http://m5.file.xiami.com/1/169/7169/320390/3562717_365342_l.mp3?auth_key=30dc8ee47200ee626fdc2eadac2e3fb8-1407888000-0-null"
10
10
  end
@@ -19,15 +19,18 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "clap", "~> 1.0.0"
22
- spec.add_dependency "nokogiri", "~> 1.6.3.1"
23
22
  spec.add_dependency "nori", "~> 2.4.0"
23
+ spec.add_dependency "nokogiri", "~> 1.6.3.1"
24
24
  spec.add_dependency "parallel", "~> 1.2.2"
25
25
  spec.add_dependency "ruby-mp3info", "~> 0.8.4"
26
+ spec.add_dependency "activesupport", "~> 4.1.5"
26
27
  spec.add_dependency "ruby-progressbar", "~> 1.5.1"
27
28
 
28
29
  spec.add_development_dependency "bundler", "~> 1.3"
29
30
  spec.add_development_dependency "rake", "~> 10.3.2"
30
31
  spec.add_development_dependency "rspec", "~> 3.0.0"
31
32
  spec.add_development_dependency "pry", "~> 0.10.0"
32
- spec.add_development_dependency "pry-byebug", "~> 1.3.3"
33
+ if RUBY_VERSION =~ /^2\./
34
+ spec.add_development_dependency "pry-byebug", "~> 1.3.3"
35
+ end
33
36
  end
metadata CHANGED
@@ -1,169 +1,169 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmfun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - ipmsteven
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-25 00:00:00.000000000 Z
11
+ date: 2014-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clap
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: nokogiri
28
+ name: nori
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 1.6.3.1
33
+ version: 2.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 1.6.3.1
40
+ version: 2.4.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: nori
42
+ name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 2.4.0
47
+ version: 1.6.3.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 2.4.0
54
+ version: 1.6.3.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: parallel
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.2.2
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.2.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ruby-mp3info
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.8.4
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.8.4
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 4.1.5
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 4.1.5
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: ruby-progressbar
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - "~>"
101
+ - - ~>
88
102
  - !ruby/object:Gem::Version
89
103
  version: 1.5.1
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - "~>"
108
+ - - ~>
95
109
  - !ruby/object:Gem::Version
96
110
  version: 1.5.1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ~>
102
116
  - !ruby/object:Gem::Version
103
117
  version: '1.3'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - "~>"
122
+ - - ~>
109
123
  - !ruby/object:Gem::Version
110
124
  version: '1.3'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rake
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - "~>"
129
+ - - ~>
116
130
  - !ruby/object:Gem::Version
117
131
  version: 10.3.2
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - "~>"
136
+ - - ~>
123
137
  - !ruby/object:Gem::Version
124
138
  version: 10.3.2
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rspec
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - "~>"
143
+ - - ~>
130
144
  - !ruby/object:Gem::Version
131
145
  version: 3.0.0
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - "~>"
150
+ - - ~>
137
151
  - !ruby/object:Gem::Version
138
152
  version: 3.0.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: pry
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - "~>"
157
+ - - ~>
144
158
  - !ruby/object:Gem::Version
145
159
  version: 0.10.0
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ~>
151
165
  - !ruby/object:Gem::Version
152
166
  version: 0.10.0
153
- - !ruby/object:Gem::Dependency
154
- name: pry-byebug
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: 1.3.3
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: 1.3.3
167
167
  description: Yet another xiami music downloader
168
168
  email:
169
169
  - steven.lyl147@gmail.com
@@ -172,20 +172,20 @@ executables:
172
172
  extensions: []
173
173
  extra_rdoc_files: []
174
174
  files:
175
- - ".gitignore"
176
- - ".rspec"
177
- - ".travis.yml"
175
+ - .gitignore
176
+ - .rspec
177
+ - .travis.yml
178
178
  - Gemfile
179
179
  - LICENSE.txt
180
180
  - README.md
181
181
  - Rakefile
182
182
  - bin/xmfun
183
183
  - lib/xmfun.rb
184
- - lib/xmfun/decoder.rb
185
184
  - lib/xmfun/downloader.rb
186
185
  - lib/xmfun/mp3/mp3_tagger.rb
187
186
  - lib/xmfun/mp3/track.rb
188
- - lib/xmfun/url_parser.rb
187
+ - lib/xmfun/util/decoder.rb
188
+ - lib/xmfun/util/url_parser.rb
189
189
  - lib/xmfun/version.rb
190
190
  - spec/spec_helper.rb
191
191
  - spec/xmfun/decode_spec.rb
@@ -200,12 +200,12 @@ require_paths:
200
200
  - lib
201
201
  required_ruby_version: !ruby/object:Gem::Requirement
202
202
  requirements:
203
- - - ">="
203
+ - - ! '>='
204
204
  - !ruby/object:Gem::Version
205
205
  version: '0'
206
206
  required_rubygems_version: !ruby/object:Gem::Requirement
207
207
  requirements:
208
- - - ">="
208
+ - - ! '>='
209
209
  - !ruby/object:Gem::Version
210
210
  version: '0'
211
211
  requirements: []
@@ -1,36 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- require 'cgi'
4
-
5
- module Xmfun
6
- class Decoder
7
- def self.decode(input)
8
- text = input[1..-1]
9
- row = input[0].to_i
10
- col = text.size / row - 1
11
- reminder = text.size % row
12
- result = []
13
- start = 0
14
-
15
- row.times do |r|
16
- if reminder == 0
17
- result << text[start..(start+col)]
18
- start = start + col + 1
19
- else
20
- result << text[start..(start+col+1)]
21
- start = start + col + 2
22
- end
23
- if reminder != 0
24
- reminder = reminder - 1
25
- end
26
- end
27
-
28
- tmp = (0..(result[0].size-1)).to_a.map do |n|
29
- result.map{|i| i[n]}.join
30
- end.join
31
-
32
- CGI::unescape(tmp).gsub('^', '0')
33
- end
34
-
35
- end
36
- end
@@ -1,26 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- module Xmfun
4
- class UrlParser
5
- def self.parse(url)
6
- if uri? url
7
- url_array = url.split("//").last.split(/(\/|\?)/)
8
- type, id = url_array[2], url_array[4]
9
-
10
- case type
11
- when "album" then "http://www.xiami.com/song/playlist/id/#{id}/type/1"
12
- when "artist" then "http://www.xiami.com/song/playlist/id/#{id}/type/2"
13
- when "collect" then "http://www.xiami.com/song/playlist/id/#{id}/type/3"
14
- when "song" then "http://www.xiami.com/song/playlist/id/#{id}/object_name/default/object_id/0"
15
- else ""
16
- end
17
- else
18
- false
19
- end
20
- end
21
-
22
- def self.uri?(uri)
23
- uri =~ /\A#{URI::regexp(['http', 'https'])}\z/
24
- end
25
- end
26
- end