nehm 1.5.3 → 1.5.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5bd2f9e928ec72d11c65ff7e1a8d4ab251e401c8
4
- data.tar.gz: 0422b2fceff29c45f852fe547670e6cd17753505
3
+ metadata.gz: 9da0b37e8738ecc87f3169744ac7bad706e04814
4
+ data.tar.gz: ccc01546551cd7f5836a59cb16d1323347917470
5
5
  SHA512:
6
- metadata.gz: fa9bfb36d31c334f211885c42e0c85bc2eae664b4fc7e7ef8000a38f6933124de3bf5be6b0e56762aa83a6974e2770764780483944301c332575833319e7bd50
7
- data.tar.gz: 36b2cfedab998142757a7a871868fa1d885b718a25560c468d80a09f4975a79714936405ebe296b92384d42684dd081f5f406c6e435457663f7255940a40c444
6
+ metadata.gz: 3a2405ccecfd65c5012471cc694caae4735c92a75e923c77e95f0bf9551309a7a2d5b350d2e7caf50b4cb5015113fe7bc6b3f5924ae3fffe4fff6b3abad0c97c
7
+ data.tar.gz: 1933d9e9b7430102a13a6b01e423109190fc5559a37c88eb651fe5a321899ad1ea8307d1c7e2a7455d91905718824162fe4b8b0b1b3881f9d6dec35f82869906
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # nehm change log
2
2
 
3
+ ## 1.5.4
4
+ * Add availability to get/dl 300+ likes and posts
5
+ * More convenient CLI
6
+ * Fix: nehm fails if you try to get/dl playlist
7
+ * Fix: nehm fails if you try to get/dl unstreamable track
8
+ * Minor optimizations and bug fixes
9
+
3
10
  ## 1.5.3
4
11
  * Fix bugs, associated with special characters in track's name
5
12
  * Minor improvements
data/README.md CHANGED
@@ -4,6 +4,10 @@
4
4
 
5
5
  *nehm* is a console tool, which downloads, sets IDv3 tags and adds to your iTunes library your SoundCloud posts or likes in convenient way
6
6
 
7
+ [![Gem Version](https://badge.fury.io/rb/nehm.svg)](http://badge.fury.io/rb/nehm)
8
+ [![Dependency Status](https://gemnasium.com/bogem/nehm.svg)](https://gemnasium.com/bogem/nehm)
9
+ [![Code Climate](https://codeclimate.com/github/bogem/nehm/badges/gpa.svg)](https://codeclimate.com/github/bogem/nehm)
10
+
7
11
  ## Installation
8
12
 
9
13
  **1. Install `taglib` library**
@@ -51,6 +55,8 @@ Enter path to desirable download directory (press enter to set it to ...
51
55
 
52
56
  `nehm get post`
53
57
 
58
+ ***(nehm doesn't get and download playlists. It just skips them)***
59
+
54
60
  * Get multiple last posts or likes
55
61
 
56
62
  `nehm get 3 posts` or `nehm get 3 likes`
@@ -89,16 +95,16 @@ Enter path to desirable download directory (press enter to set it to ...
89
95
 
90
96
  `nehm help`
91
97
 
98
+ ## TODO
99
+
100
+ * Getting/downloading playlists from posts
101
+
92
102
  ##FAQ
93
103
 
94
104
  **Q: What is permalink?**
95
105
 
96
106
  A: Permalink is the last word in your profile url. **Example:** for profile url ***soundcloud.com/qwerty*** permalink is ***qwerty***
97
107
 
98
- ## Contributing
99
-
100
- Bug reports and pull requests are welcome.
101
-
102
108
  ## License
103
109
 
104
110
  MIT License
data/lib/nehm.rb CHANGED
@@ -28,10 +28,10 @@ module App
28
28
  Get[:dl, args]
29
29
  when 'configure'
30
30
  Configure.menu
31
- when 'help'
31
+ when 'help', nil
32
32
  Help.show(args.first)
33
33
  else
34
- puts Paint['Invalid command', :red]
34
+ puts Paint["Invalid command '#{command}'", :red]
35
35
  puts "Input #{Paint['nehm help', :yellow]} for all avalaible commands"
36
36
  end
37
37
 
@@ -15,7 +15,7 @@ module AppleScript
15
15
  module_function
16
16
 
17
17
  def script_path(script_name)
18
- applescripts_path = File.expand_path(File.join(File.dirname(__FILE__), "applescripts"))
18
+ applescripts_path = File.expand_path(File.join(File.dirname(__FILE__), 'applescripts'))
19
19
  File.join(applescripts_path, "#{script_name.to_s}.applescript")
20
20
  end
21
21
  end
@@ -2,9 +2,9 @@
2
2
  module Configure
3
3
  def self.menu
4
4
  loop do
5
- puts 'Download path: ' + Paint[Cfg[:dl_path], :magenta]
6
- puts 'Permalink: ' + Paint[Cfg[:permalink], :cyan]
7
- puts 'iTunes playlist: ' + Paint[PlaylistManager.playlist, :cyan] unless OS.linux?
5
+ puts "Download path: #{Paint[Cfg[:dl_path], :magenta]}"
6
+ puts "Permalink: #{Paint[Cfg[:permalink], :cyan]}"
7
+ puts "iTunes playlist: #{Paint[PlaylistManager.playlist, :cyan]}" unless OS.linux?
8
8
  puts "\n"
9
9
 
10
10
  HighLine.new.choose do |menu|
data/lib/nehm/get.rb CHANGED
@@ -4,9 +4,9 @@ require 'taglib'
4
4
  module Get
5
5
  def self.[](get_or_dl, args)
6
6
  # Processing arguments
7
- options = [{ name: 'to', module: PathManager, setter: :temp_dl_path= },
8
- { name: 'from', module: UserManager, setter: :temp_user= },
9
- { name: 'playlist', module: PlaylistManager, setter: :temp_playlist= }]
7
+ options = [{ name: 'to', method: PathManager.method(:temp_dl_path=) },
8
+ { name: 'from', method: UserManager.method(:temp_user=) },
9
+ { name: 'playlist', method: PlaylistManager.method(:temp_playlist=) }]
10
10
 
11
11
  options.each do |option|
12
12
  if args.include? option[:name]
@@ -15,10 +15,11 @@ module Get
15
15
  args.delete_at(index + 1)
16
16
  args.delete_at(index)
17
17
 
18
- option[:module].send(option[:setter], value)
18
+ option[:method].call(value)
19
19
  end
20
20
  end
21
21
 
22
+ puts 'Getting information about track(s)'
22
23
  user = UserManager.user
23
24
  tracks = []
24
25
  tracks +=
@@ -35,19 +36,29 @@ module Get
35
36
  user.posts(count)
36
37
  when %r{https:\/\/soundcloud.com\/}
37
38
  track_from_url(args.last)
39
+ when nil
40
+ puts Paint['You must provide option', :red]
41
+ puts "Input #{Paint['nehm help', :yellow]} for help"
42
+ exit
38
43
  else
39
- puts Paint['Invalid argument(s)', :red]
44
+ puts Paint["Invalid argument(s) '#{args.last}'", :red]
40
45
  puts "Input #{Paint['nehm help', :yellow]} for help"
41
46
  exit
42
47
  end
43
48
 
44
49
  playlist = PlaylistManager.playlist
45
50
  tracks.each do |track|
46
- dl(track)
47
- dl(track.artwork)
48
- tag(track)
49
- track.artwork.suicide
50
- playlist.add_track(track.file_path) if playlist && get_or_dl == :get && !OS.linux?
51
+ if track.streamable?
52
+ dl(track)
53
+ dl(track.artwork)
54
+ tag(track)
55
+ track.artwork.suicide
56
+ playlist.add_track(track.file_path) if playlist && get_or_dl == :get && !OS.linux?
57
+ else
58
+ puts "#{Paint['Track', :yellow]} #{Paint[track.name, :cyan]} #{Paint['undownloadable', :yellow]}"
59
+ puts 'Skip it'
60
+ end
61
+ puts "\n"
51
62
  end
52
63
  puts Paint['Done!', :green]
53
64
  end
@@ -63,7 +74,7 @@ module Get
63
74
  puts 'Downloading ' + arg.name
64
75
  path = arg.file_path
65
76
  url = arg.url
66
- command = "curl -# -o \"" + path + "\" -L " + url
77
+ command = "curl -# -o \"#{path}\" -L #{url}"
67
78
  `#{command}`
68
79
  end
69
80
 
data/lib/nehm/help.rb CHANGED
@@ -2,10 +2,13 @@
2
2
  module Help
3
3
  def self.available_commands
4
4
  puts <<-HELP.gsub(/^ {6}/, '')
5
+ #{Paint['nehm', :green]} is a console tool, which downloads, sets IDv3 tags and adds to your iTunes library your SoundCloud posts or likes in convenient way
6
+
5
7
  #{Paint['Avalaible nehm commands:', :yellow]}
6
8
  #{Paint['get', :green]} Downloading, setting tags and adding to your iTunes library last post or like from your profile
7
9
  #{Paint['dl', :green]} Downloading and setting tags last post or like from your profile
8
10
  #{Paint['configure', :green]} Configuring application
11
+
9
12
  See #{Paint['nehm help [command]', :yellow]} to read about a specific subcommand
10
13
  HELP
11
14
  end
@@ -17,7 +20,7 @@ module Help
17
20
  when nil
18
21
  Help.available_commands
19
22
  else
20
- puts Paint["Command #{command} doesn't exist", :red]
23
+ puts Paint["Command '#{command}' doesn't exist", :red]
21
24
  puts "\n"
22
25
  Help.available_commands
23
26
  end
data/lib/nehm/track.rb CHANGED
@@ -19,7 +19,7 @@ class Track
19
19
  end
20
20
 
21
21
  def file_name
22
- "#{name}.mp3".tr('/', '')
22
+ "#{name}.mp3".tr("/'\"", '')
23
23
  end
24
24
 
25
25
  def file_path
@@ -35,6 +35,10 @@ class Track
35
35
  artist + ' - ' + title
36
36
  end
37
37
 
38
+ def streamable?
39
+ @hash['streamable']
40
+ end
41
+
38
42
  def title
39
43
  if @hash['title'].include?('-')
40
44
  title = @hash['title'].split('-')
data/lib/nehm/user.rb CHANGED
@@ -2,6 +2,8 @@ require 'json'
2
2
  require 'faraday'
3
3
 
4
4
  class User
5
+ SOUNDCLOUD_MAX_LIMIT = 180
6
+
5
7
  def initialize(id)
6
8
  @id = id
7
9
  end
@@ -13,10 +15,20 @@ class User
13
15
  exit
14
16
  end
15
17
 
16
- likes = Client.get("/users/#{@id}/favorites?limit=#{count}")
18
+ d = count / SOUNDCLOUD_MAX_LIMIT
19
+ m = count % SOUNDCLOUD_MAX_LIMIT
20
+ d = m == 0 ? d : d + 1
21
+
22
+ likes = []
23
+ d.times do |i|
24
+ limit = count > SOUNDCLOUD_MAX_LIMIT ? SOUNDCLOUD_MAX_LIMIT : count
25
+ count -= SOUNDCLOUD_MAX_LIMIT
26
+
27
+ likes += Client.get("/users/#{@id}/favorites?limit=#{limit}&offset=#{(i)*SOUNDCLOUD_MAX_LIMIT}")
28
+ end
17
29
 
18
30
  if likes.empty?
19
- puts Paint["There are no likes yet :(", :red]
31
+ puts Paint['There are no likes yet :(', :red]
20
32
  exit
21
33
  end
22
34
 
@@ -31,20 +43,36 @@ class User
31
43
  exit
32
44
  end
33
45
 
34
- # Official SC API wrapper doesn't support for posts
46
+ d = count / SOUNDCLOUD_MAX_LIMIT
47
+ m = count % SOUNDCLOUD_MAX_LIMIT
48
+ d = m == 0 ? d : d + 1
49
+
50
+ # Official SC API wrapper doesn't support posts
35
51
  # So I should get posts by HTTP requests
36
- #TODO: Get more than 300 posts (max limit = 300)
37
52
  conn = Faraday.new(url: 'https://api-v2.soundcloud.com/')
38
- response = conn.get("/profile/soundcloud:users:#{@id}?limit=#{count}&offset=0")
39
53
 
40
- parsed = JSON.parse(response.body)
41
- posts = parsed['collection']
54
+ posts = []
55
+ d.times do |i|
56
+ limit = count > SOUNDCLOUD_MAX_LIMIT ? SOUNDCLOUD_MAX_LIMIT : count
57
+ count -= SOUNDCLOUD_MAX_LIMIT
58
+
59
+ response = conn.get("/profile/soundcloud:users:#{@id}?limit=#{limit}&offset=#{i*SOUNDCLOUD_MAX_LIMIT}")
60
+ parsed = JSON.parse(response.body)
61
+ collection = parsed['collection']
62
+
63
+ break if collection.nil?
64
+
65
+ posts += collection
66
+ end
42
67
 
43
68
  if posts.empty?
44
- puts Paint["There are no posts yet :(", :red]
69
+ puts Paint['There are no posts yet :(', :red]
45
70
  exit
46
71
  end
47
72
 
73
+ rejected = posts.reject! { |hash| hash['type'] == 'playlist' }
74
+ puts Paint["Was skipped #{rejected.count} playlist(s) (nehm doesn't download playlists)", :yellow] if rejected
75
+
48
76
  posts.map { |hash| Track.new(hash['track']) }
49
77
  end
50
78
  end
data/lib/nehm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nehm
2
- VERSION = '1.5.3'.freeze
2
+ VERSION = '1.5.4'.freeze
3
3
  end
data/nehm.gemspec CHANGED
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ['lib']
21
21
  spec.required_ruby_version = '>= 1.9.3'
22
22
 
23
- spec.add_dependency 'soundcloud', '>= 0.3.2'
24
- spec.add_dependency 'taglib-ruby', '>= 0.7.0'
23
+ spec.add_dependency 'bogy', '>= 1.1'
24
+ spec.add_dependency 'certifi'
25
25
  spec.add_dependency 'faraday', '>= 0.9.1'
26
26
  spec.add_dependency 'highline', '>= 1.7.2'
27
- spec.add_dependency 'certifi'
28
27
  spec.add_dependency 'paint'
29
- spec.add_dependency 'bogy'
28
+ spec.add_dependency 'soundcloud', '>= 0.3.2'
29
+ spec.add_dependency 'taglib-ruby', '>= 0.7.0'
30
30
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nehm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Albert Nigmatzianov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-29 00:00:00.000000000 Z
11
+ date: 2015-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: soundcloud
14
+ name: bogy
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.2
19
+ version: '1.1'
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
- version: 0.3.2
26
+ version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: taglib-ruby
28
+ name: certifi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.7.0
33
+ version: '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: 0.7.0
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: faraday
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.7.2
69
69
  - !ruby/object:Gem::Dependency
70
- name: certifi
70
+ name: paint
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,33 +81,33 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: paint
84
+ name: soundcloud
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 0.3.2
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 0.3.2
97
97
  - !ruby/object:Gem::Dependency
98
- name: bogy
98
+ name: taglib-ruby
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: 0.7.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: 0.7.0
111
111
  description: " nehm is a console tool, which downloads, sets IDv3 tags and adds to
112
112
  your iTunes library your SoundCloud posts or likes in convenient way. See homepage
113
113
  for instructions "