nehm 1.5.6.2 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +8 -0
- data/README.md +6 -7
- data/bin/nehm +6 -1
- data/lib/nehm.rb +31 -48
- data/lib/nehm/applescript.rb +7 -2
- data/lib/nehm/artwork.rb +6 -6
- data/lib/nehm/cfg.rb +5 -1
- data/lib/nehm/client.rb +78 -6
- data/lib/nehm/command.rb +123 -0
- data/lib/nehm/command_manager.rb +66 -0
- data/lib/nehm/commands/configure_command.rb +44 -0
- data/lib/nehm/commands/dl_command.rb +41 -0
- data/lib/nehm/commands/get_command.rb +44 -0
- data/lib/nehm/commands/help_command.rb +85 -0
- data/lib/nehm/commands/version_command.rb +23 -0
- data/lib/nehm/option_parser.rb +31 -0
- data/lib/nehm/os.rb +5 -0
- data/lib/nehm/path_manager.rb +28 -31
- data/lib/nehm/playlist.rb +7 -1
- data/lib/nehm/playlist_manager.rb +31 -14
- data/lib/nehm/track.rb +23 -21
- data/lib/nehm/tracks.rb +153 -0
- data/lib/nehm/ui.rb +35 -0
- data/lib/nehm/user_manager.rb +19 -42
- data/lib/nehm/version.rb +1 -1
- data/nehm.gemspec +2 -2
- metadata +24 -18
- data/lib/nehm/configure.rb +0 -24
- data/lib/nehm/get.rb +0 -100
- data/lib/nehm/help.rb +0 -93
- data/lib/nehm/user.rb +0 -81
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0aa2bd91903adaec7cb6b378a83d169944a23e3a
|
4
|
+
data.tar.gz: 6fcea548ac666b3bef9ea038f0de23f1992d9eb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5d5e134ee8b62dcb0ee356e5b4fcca17b64652c1581090f552bdb5f303f9d96e5f8a0c012f4617c2b1efca7973b7de5e2372e8422f955d3d9ca412ec2a72f9c
|
7
|
+
data.tar.gz: 1de3a085d88651abb6a3a8f16fd6d17116f3ee1ef8c7ba7baf1f4026eeca4203d43fe3cb79908dff1229e409a6ac145902a71c4d84d5c889792de0665083da9c
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# nehm change log
|
2
2
|
|
3
|
+
## 1.6.1
|
4
|
+
* Fix nehm's fails when download tracks from url
|
5
|
+
|
6
|
+
## 1.6
|
7
|
+
* Rewritten about 90% of code to make it more comfortable to read (improve code climate from 2.9 to 3.6)
|
8
|
+
* Add newlines before and after downloading track
|
9
|
+
* Clearer 'help' command
|
10
|
+
|
3
11
|
## 1.5.6.2
|
4
12
|
* Excluding space and dash from removing in track's file name
|
5
13
|
|
data/README.md
CHANGED
@@ -8,6 +8,11 @@
|
|
8
8
|
[![Dependency Status](https://gemnasium.com/bogem/nehm.svg)](https://gemnasium.com/bogem/nehm)
|
9
9
|
[![Code Climate](https://codeclimate.com/github/bogem/nehm/badges/gpa.svg)](https://codeclimate.com/github/bogem/nehm)
|
10
10
|
|
11
|
+
## DISCLAIMER
|
12
|
+
***For personal use only***
|
13
|
+
|
14
|
+
***Nehm developer doesn't responsible for any illegal usage of this program***
|
15
|
+
|
11
16
|
## Installation
|
12
17
|
|
13
18
|
**1. Install `taglib` library**
|
@@ -71,9 +76,7 @@ Enter path to desirable download directory (press enter to set it to ...
|
|
71
76
|
|
72
77
|
* Get tracks to another directory
|
73
78
|
|
74
|
-
`nehm get post
|
75
|
-
|
76
|
-
*(if you type `to current`, `nehm` will get track to current working directory)*
|
79
|
+
`nehm get post to ~/Downloads` or `nehm dl like from bogem to .`
|
77
80
|
|
78
81
|
* Get tracks to another iTunes playlist
|
79
82
|
|
@@ -95,10 +98,6 @@ Enter path to desirable download directory (press enter to set it to ...
|
|
95
98
|
|
96
99
|
`nehm help`
|
97
100
|
|
98
|
-
## TODO
|
99
|
-
|
100
|
-
* Getting/downloading playlists from posts
|
101
|
-
|
102
101
|
##FAQ
|
103
102
|
|
104
103
|
**Q: What is permalink?**
|
data/bin/nehm
CHANGED
@@ -3,8 +3,13 @@ nehm_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
3
|
$LOAD_PATH.unshift(nehm_dir) unless $LOAD_PATH.include?(nehm_dir)
|
4
4
|
require 'nehm'
|
5
5
|
|
6
|
+
$stderr = STDOUT
|
7
|
+
|
6
8
|
begin
|
7
|
-
Nehm
|
9
|
+
Nehm.start(ARGV)
|
8
10
|
rescue Interrupt # SIGINT
|
9
11
|
puts "\nGoodbye!"
|
12
|
+
Nehm::UI.term
|
13
|
+
rescue StandardError, Timeout::Error => ex
|
14
|
+
Nehm::UI.term "While executing nehm ... (#{ex.class})\n #{ex}"
|
10
15
|
end
|
data/lib/nehm.rb
CHANGED
@@ -1,67 +1,50 @@
|
|
1
|
+
require 'colored'
|
1
2
|
require 'highline'
|
2
|
-
require 'paint'
|
3
3
|
|
4
|
-
require 'nehm/applescript'
|
5
|
-
require 'nehm/artwork'
|
6
|
-
require 'nehm/cfg'
|
7
|
-
require 'nehm/configure'
|
8
4
|
require 'nehm/client'
|
9
|
-
require 'nehm/
|
10
|
-
require 'nehm/
|
11
|
-
require 'nehm/os'
|
5
|
+
require 'nehm/cfg'
|
6
|
+
require 'nehm/command_manager'
|
12
7
|
require 'nehm/path_manager'
|
13
|
-
require 'nehm/playlist'
|
14
8
|
require 'nehm/playlist_manager'
|
15
|
-
require 'nehm/
|
16
|
-
require 'nehm/user'
|
9
|
+
require 'nehm/ui'
|
17
10
|
require 'nehm/user_manager'
|
18
|
-
require 'nehm/version'
|
19
11
|
|
20
12
|
module Nehm
|
21
|
-
module App
|
22
|
-
def self.do(args)
|
23
|
-
init unless initialized?
|
24
13
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
Get[:get, args]
|
29
|
-
when 'dl'
|
30
|
-
Get[:dl, args]
|
31
|
-
when 'configure'
|
32
|
-
Configure.menu
|
33
|
-
when 'version'
|
34
|
-
puts Nehm::VERSION
|
35
|
-
when 'help', nil
|
36
|
-
Help.show(args.first)
|
37
|
-
else
|
38
|
-
puts Paint["Invalid command '#{command}'", :red]
|
39
|
-
puts "Input #{Paint['nehm help', :yellow]} for all avalaible commands"
|
40
|
-
end
|
41
|
-
end
|
14
|
+
# TODO: add rake tests
|
15
|
+
# TODO: add search command
|
16
|
+
# TODO: add select command
|
42
17
|
|
43
|
-
|
18
|
+
def self.start(args)
|
19
|
+
init unless initialized?
|
44
20
|
|
45
|
-
|
46
|
-
|
47
|
-
puts 'Before using the nehm, you should set it up:'
|
48
|
-
Cfg.create unless Cfg.exist?
|
21
|
+
CommandManager.run(args)
|
22
|
+
end
|
49
23
|
|
50
|
-
|
51
|
-
puts "\n"
|
24
|
+
module_function
|
52
25
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
26
|
+
def init
|
27
|
+
UI.success 'Hello!'
|
28
|
+
UI.say 'Before using the nehm, you should set it up:'
|
29
|
+
Cfg.create unless Cfg.exist?
|
57
30
|
|
58
|
-
|
31
|
+
PathManager.set_dl_path
|
32
|
+
UI.newline
|
59
33
|
|
60
|
-
|
34
|
+
unless OS.linux?
|
35
|
+
PlaylistManager.set_playlist
|
36
|
+
UI.newline
|
61
37
|
end
|
62
38
|
|
63
|
-
|
64
|
-
|
65
|
-
|
39
|
+
UserManager.set_uid
|
40
|
+
UI.newline
|
41
|
+
|
42
|
+
UI.success "Now you can use nehm!\n"
|
43
|
+
sleep(1)
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialized?
|
47
|
+
File.exist?(Cfg::FILE_PATH)
|
66
48
|
end
|
49
|
+
|
67
50
|
end
|
data/lib/nehm/applescript.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module Nehm
|
2
|
-
|
2
|
+
|
3
|
+
##
|
4
|
+
# AppleScript module calls all AppleScript scripts and returns results
|
5
|
+
|
3
6
|
module AppleScript
|
7
|
+
|
4
8
|
def self.add_track_to_playlist(track_path, playlist_name)
|
5
9
|
`osascript \"#{script_path(:add_track_to_playlist)}\" \"#{track_path}\" \"#{playlist_name}\" > /dev/null`
|
6
10
|
end
|
@@ -18,7 +22,8 @@ module Nehm
|
|
18
22
|
|
19
23
|
def script_path(script_name)
|
20
24
|
applescripts_path = File.expand_path(File.join(File.dirname(__FILE__), 'applescripts'))
|
21
|
-
File.join(applescripts_path, "#{script_name
|
25
|
+
File.join(applescripts_path, "#{script_name}.applescript")
|
22
26
|
end
|
27
|
+
|
23
28
|
end
|
24
29
|
end
|
data/lib/nehm/artwork.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module Nehm
|
2
|
-
|
2
|
+
|
3
|
+
##
|
4
|
+
# Artwork objects contains all information of track's artwork
|
5
|
+
|
3
6
|
class Artwork
|
7
|
+
|
4
8
|
def initialize(track)
|
5
9
|
@track = track
|
6
10
|
end
|
@@ -9,11 +13,6 @@ module Nehm
|
|
9
13
|
File.join('/tmp', "#{@track.id}.jpg")
|
10
14
|
end
|
11
15
|
|
12
|
-
# Use in Get.dl
|
13
|
-
def name
|
14
|
-
'artwork'
|
15
|
-
end
|
16
|
-
|
17
16
|
def suicide
|
18
17
|
File.delete(file_path)
|
19
18
|
end
|
@@ -28,5 +27,6 @@ module Nehm
|
|
28
27
|
end
|
29
28
|
url.sub('large', 't500x500')
|
30
29
|
end
|
30
|
+
|
31
31
|
end
|
32
32
|
end
|
data/lib/nehm/cfg.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'bogy'
|
2
2
|
|
3
|
-
|
4
3
|
module Nehm
|
4
|
+
|
5
|
+
##
|
5
6
|
# Cfg module manipulates with nehm's config file (~/.nehmconfig)
|
7
|
+
|
6
8
|
module Cfg
|
9
|
+
|
7
10
|
FILE_PATH = File.join(ENV['HOME'], '.nehmconfig')
|
8
11
|
CONFIG_FILE = Bogy.new(file: FILE_PATH)
|
9
12
|
|
@@ -26,5 +29,6 @@ module Nehm
|
|
26
29
|
def self.key?(key)
|
27
30
|
CONFIG_FILE.to_h.key?(key.to_s)
|
28
31
|
end
|
32
|
+
|
29
33
|
end
|
30
34
|
end
|
data/lib/nehm/client.rb
CHANGED
@@ -1,23 +1,95 @@
|
|
1
1
|
require 'certifi'
|
2
|
+
require 'faraday'
|
3
|
+
require 'json'
|
2
4
|
require 'soundcloud'
|
3
5
|
|
4
6
|
module Nehm
|
5
|
-
|
7
|
+
|
8
|
+
##
|
9
|
+
# Client module contains all SC API interaction methods
|
10
|
+
|
6
11
|
module Client
|
7
|
-
|
12
|
+
|
13
|
+
##
|
14
|
+
# SSL certificate file path for SC API
|
15
|
+
|
8
16
|
ENV['SSL_CERT_FILE'] = Certifi.where
|
9
17
|
|
18
|
+
##
|
10
19
|
# SoundCloud API client ID
|
20
|
+
|
11
21
|
CLIENT_ID = '11a37feb6ccc034d5975f3f803928a32'
|
12
22
|
|
13
|
-
|
14
|
-
|
23
|
+
##
|
24
|
+
# SoundCloud client object
|
25
|
+
|
26
|
+
SC_CLIENT = Soundcloud.new(client_id: CLIENT_ID)
|
27
|
+
|
28
|
+
##
|
29
|
+
# Max limit of tracks for correct SoundCloud requests
|
30
|
+
|
31
|
+
TRACKS_LIMIT = 200
|
32
|
+
|
33
|
+
##
|
34
|
+
# Returns raw array of likes or posts (depends on argument 'type')
|
35
|
+
|
36
|
+
def self.tracks(count, type, uid)
|
37
|
+
UI.term "Invalid number of #{type}" if count == 0
|
38
|
+
|
39
|
+
iterations = count.to_f / TRACKS_LIMIT
|
40
|
+
iterations = iterations.ceil
|
41
|
+
|
42
|
+
tracks = []
|
43
|
+
iterations.times do |i|
|
44
|
+
limit = count < TRACKS_LIMIT ? count : TRACKS_LIMIT
|
45
|
+
count -= TRACKS_LIMIT
|
46
|
+
|
47
|
+
tracks +=
|
48
|
+
case type
|
49
|
+
when :likes
|
50
|
+
likes(limit, i * TRACKS_LIMIT, uid)
|
51
|
+
when :posts
|
52
|
+
posts(limit, i * TRACKS_LIMIT, uid)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
tracks
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Returns user hash from SoundCloud or nil if user doesn't exist
|
60
|
+
|
61
|
+
def self.user(permalink)
|
62
|
+
SC_CLIENT.get('/resolve', url: "https://soundcloud.com/#{permalink}")
|
63
|
+
rescue SoundCloud::ResponseError => e
|
64
|
+
return nil if e.message =~ /404/
|
65
|
+
end
|
66
|
+
|
67
|
+
##
|
68
|
+
# Returns track hash from SoundCloud by specified url
|
69
|
+
|
70
|
+
def self.track(url)
|
71
|
+
SC_CLIENT.get('/resolve', url: url)
|
15
72
|
end
|
16
73
|
|
17
74
|
module_function
|
18
75
|
|
19
|
-
def
|
20
|
-
|
76
|
+
def likes(limit, offset, uid)
|
77
|
+
SC_CLIENT.get("/users/#{uid}/favorites?limit=#{limit}&offset=#{offset}")
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Stantard SoundCloud Ruby wrapper doesn't support reposts if user
|
82
|
+
# isn't authorized
|
83
|
+
# But api-v2.soundcloud.com supports it
|
84
|
+
|
85
|
+
# TODO: use net/http instead of Faraday
|
86
|
+
|
87
|
+
def posts(limit, offset, uid)
|
88
|
+
conn = Faraday.new(url: 'https://api-v2.soundcloud.com/')
|
89
|
+
response = conn.get("/profile/soundcloud:users:#{uid}?limit=#{limit}&offset=#{offset}")
|
90
|
+
parsed = JSON.parse(response.body)
|
91
|
+
parsed['collection']
|
21
92
|
end
|
93
|
+
|
22
94
|
end
|
23
95
|
end
|
data/lib/nehm/command.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'nehm/option_parser'
|
2
|
+
|
3
|
+
module Nehm
|
4
|
+
|
5
|
+
##
|
6
|
+
# Base class for all Nehm commands. When creating a new nehm command, define
|
7
|
+
# #initialize, #execute, #arguments, #program_name, #summary and #usage
|
8
|
+
# (as appropriate).
|
9
|
+
# See the above mentioned methods for details.
|
10
|
+
|
11
|
+
class Command
|
12
|
+
|
13
|
+
##
|
14
|
+
# Hash with options of the command.
|
15
|
+
|
16
|
+
attr_accessor :options
|
17
|
+
|
18
|
+
##
|
19
|
+
# Hash with descriptions of each options.
|
20
|
+
|
21
|
+
attr_accessor :options_descs
|
22
|
+
|
23
|
+
##
|
24
|
+
# In 'initialize' should be defined all options by method 'add_option'.
|
25
|
+
#
|
26
|
+
# See get_command.rb as example.
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
@options = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Invoke the command with the given list of arguments.
|
34
|
+
|
35
|
+
def invoke(args)
|
36
|
+
handle_options(args)
|
37
|
+
execute
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# Handle the given list of arguments by parsing them and recording the
|
42
|
+
# results.
|
43
|
+
|
44
|
+
def handle_options(args)
|
45
|
+
parser = OptionParser.new(args, self)
|
46
|
+
parser.parse
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Override to provide command handling.
|
51
|
+
#
|
52
|
+
# #options will be filled in with your parsed options, unparsed options will
|
53
|
+
# be left in #options[:args].
|
54
|
+
|
55
|
+
def execute
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Override to provide details of the arguments a command takes.
|
60
|
+
#
|
61
|
+
# For example:
|
62
|
+
#
|
63
|
+
# def usage
|
64
|
+
# "#{program_name} COMMAND"
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# def arguments
|
68
|
+
# ['COMMAND', 'name of command to show help']
|
69
|
+
# end
|
70
|
+
|
71
|
+
def arguments
|
72
|
+
{}
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# The name of the command for command-line invocation.
|
77
|
+
|
78
|
+
def program_name
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Override to display a short description of what this command does.
|
83
|
+
|
84
|
+
def summary
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# Override to display the usage for an individual nehm command.
|
89
|
+
#
|
90
|
+
# The text "[options]" is automatically appended to the usage text.
|
91
|
+
|
92
|
+
def usage
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Add a command-line option.
|
97
|
+
#
|
98
|
+
# Nehm don't use options with dashes to be more user-friendly.
|
99
|
+
#
|
100
|
+
# See 'get_command.rb' as example.
|
101
|
+
|
102
|
+
def add_option(option, usage, desc)
|
103
|
+
@options_descs ||= {}
|
104
|
+
|
105
|
+
@options[option] = nil
|
106
|
+
@options_descs[usage] = desc
|
107
|
+
end
|
108
|
+
|
109
|
+
HELP = <<-EOF
|
110
|
+
#{'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
|
111
|
+
|
112
|
+
#{'Avalaible nehm commands:'.yellow}
|
113
|
+
#{'get'.green} Download, set tags and add to your iTunes library last post or like from your profile
|
114
|
+
#{'dl'.green} Download and set tags last post or like from your profile
|
115
|
+
#{'configure'.green} Configure application
|
116
|
+
#{'help'.green} Show help for specified command
|
117
|
+
#{'version'.green} Show version of installed nehm
|
118
|
+
|
119
|
+
See #{'nehm help [command]'.yellow} to read about a specific subcommand
|
120
|
+
EOF
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|