nehm 1.6.1 → 2.0.1

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.
data/lib/nehm/command.rb CHANGED
@@ -5,32 +5,32 @@ module Nehm
5
5
  ##
6
6
  # Base class for all Nehm commands. When creating a new nehm command, define
7
7
  # #initialize, #execute, #arguments, #program_name, #summary and #usage
8
- # (as appropriate).
9
- # See the above mentioned methods for details.
8
+ # (as appropriate)
9
+ # See the above mentioned methods for details
10
10
 
11
11
  class Command
12
12
 
13
13
  ##
14
- # Hash with options of the command.
14
+ # Hash with options of the command
15
15
 
16
16
  attr_accessor :options
17
17
 
18
18
  ##
19
- # Hash with descriptions of each options.
19
+ # Hash with descriptions of each option
20
20
 
21
21
  attr_accessor :options_descs
22
22
 
23
23
  ##
24
- # In 'initialize' should be defined all options by method 'add_option'.
25
- #
26
- # See get_command.rb as example.
24
+ # In 'initialize' should be defined all options by method 'add_option'
25
+ # See get_command.rb as example
27
26
 
28
27
  def initialize
29
28
  @options = {}
29
+ @options_descs = {}
30
30
  end
31
31
 
32
32
  ##
33
- # Invoke the command with the given list of arguments.
33
+ # Invoke the command with the given list of arguments
34
34
 
35
35
  def invoke(args)
36
36
  handle_options(args)
@@ -39,7 +39,7 @@ module Nehm
39
39
 
40
40
  ##
41
41
  # Handle the given list of arguments by parsing them and recording the
42
- # results.
42
+ # results
43
43
 
44
44
  def handle_options(args)
45
45
  parser = OptionParser.new(args, self)
@@ -47,16 +47,16 @@ module Nehm
47
47
  end
48
48
 
49
49
  ##
50
- # Override to provide command handling.
50
+ # Override to provide command handling
51
51
  #
52
52
  # #options will be filled in with your parsed options, unparsed options will
53
- # be left in #options[:args].
53
+ # be left in #options[:args]
54
54
 
55
55
  def execute
56
56
  end
57
57
 
58
58
  ##
59
- # Override to provide details of the arguments a command takes.
59
+ # Override to provide details of the arguments a command takes
60
60
  #
61
61
  # For example:
62
62
  #
@@ -73,51 +73,36 @@ module Nehm
73
73
  end
74
74
 
75
75
  ##
76
- # The name of the command for command-line invocation.
76
+ # The name of the command for command-line invocation
77
77
 
78
78
  def program_name
79
79
  end
80
80
 
81
81
  ##
82
- # Override to display a short description of what this command does.
82
+ # Override to display a short description of what this command does
83
83
 
84
84
  def summary
85
85
  end
86
86
 
87
87
  ##
88
- # Override to display the usage for an individual nehm command.
88
+ # Override to display the usage for an individual nehm command
89
89
  #
90
- # The text "[options]" is automatically appended to the usage text.
90
+ # The text "[options]" is automatically appended to the usage text
91
91
 
92
92
  def usage
93
93
  end
94
94
 
95
95
  ##
96
- # Add a command-line option.
96
+ # Add a command-line option
97
97
  #
98
- # Nehm don't use options with dashes to be more user-friendly.
98
+ # Nehm don't use options with dashes to be more user-friendly
99
99
  #
100
- # See 'get_command.rb' as example.
100
+ # See 'get_command.rb' as example
101
101
 
102
102
  def add_option(option, usage, desc)
103
- @options_descs ||= {}
104
-
105
103
  @options[option] = nil
106
104
  @options_descs[usage] = desc
107
105
  end
108
106
 
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
107
  end
123
108
  end
@@ -3,8 +3,8 @@ require 'nehm/command'
3
3
  module Nehm
4
4
 
5
5
  ##
6
- # The command manager contains information about all nehm commands, find
7
- # and run them
6
+ # The command manager contains information about all nehm commands
7
+ # It also find and run them
8
8
 
9
9
  module CommandManager
10
10
 
@@ -13,18 +13,15 @@ module Nehm
13
13
  :dl,
14
14
  :get,
15
15
  :help,
16
+ :search,
17
+ :select,
16
18
  :version
17
19
  ]
18
20
 
19
21
  ##
20
- # Run the command specified by 'args'.
22
+ # Run the command specified by 'args'
21
23
 
22
24
  def self.run(args)
23
- if args.empty?
24
- UI.say Nehm::Command::HELP
25
- UI.term
26
- end
27
-
28
25
  cmd_name = args.shift.downcase
29
26
  cmd = find_command(cmd_name)
30
27
  cmd.invoke(args)
@@ -42,25 +39,18 @@ module Nehm
42
39
  command_instance(possibilities.first)
43
40
  end
44
41
 
45
- module_function
46
-
47
- def find_command_possibilities(cmd_name)
42
+ def self.find_command_possibilities(cmd_name)
48
43
  len = cmd_name.length
49
44
  COMMANDS.select { |command| command[0, len] == cmd_name }
50
45
  end
51
46
 
52
- def command_instance(command_name)
47
+ def self.command_instance(command_name)
53
48
  command_name = command_name.to_s
54
49
  const_name = command_name.capitalize << 'Command'
55
50
 
56
- require_commands
51
+ require "nehm/commands/#{command_name}_command"
57
52
  Nehm.const_get(const_name).new
58
53
  end
59
54
 
60
- def require_commands
61
- project_root = File.dirname(File.absolute_path(__FILE__))
62
- Dir.glob(project_root + '/commands/*') { |file| require file }
63
- end
64
-
65
55
  end
66
56
  end
@@ -3,15 +3,10 @@ module Nehm
3
3
 
4
4
  def execute
5
5
  loop do
6
- UI.say "Download path: #{Cfg[:dl_path].magenta}" if Cfg[:dl_path]
7
- UI.say "Permalink: #{Cfg[:permalink].cyan}" if Cfg[:permalink]
8
- UI.say "iTunes playlist: #{PlaylistManager.default_playlist.to_s.cyan}" if !OS.linux? && PlaylistManager.default_playlist
6
+ show_info
9
7
  UI.newline
10
-
11
8
  show_menu
12
-
13
- sleep(1)
14
- UI.newline
9
+ sleep(UI::SLEEP_PERIOD)
15
10
  end
16
11
  end
17
12
 
@@ -29,14 +24,22 @@ module Nehm
29
24
 
30
25
  private
31
26
 
32
- def show_menu
33
- HighLine.new.choose do |menu|
34
- menu.prompt = 'Choose setting'.yellow
27
+ def show_info
28
+ dl_path = PathManager.default_dl_path
29
+ UI.say "Download path: #{dl_path.magenta}" if dl_path
35
30
 
36
- menu.choice('Edit download path'.freeze) { PathManager.set_dl_path }
37
- menu.choice('Edit permalink'.freeze) { UserManager.set_uid }
38
- menu.choice('Edit iTunes playlist'.freeze) { PlaylistManager.set_playlist } unless OS.linux?
39
- menu.choice('Exit'.freeze) { fail Interrupt }
31
+ permalink = UserManager.default_permalink
32
+ UI.say "Permalink: #{permalink.cyan}" if permalink
33
+
34
+ playlist = PlaylistManager.default_playlist
35
+ UI.say "iTunes playlist: #{playlist.to_s.cyan}" if playlist
36
+ end
37
+
38
+ def show_menu
39
+ UI.menu do |menu|
40
+ menu.choice(:inc, 'Edit download path'.freeze) { PathManager.set_dl_path }
41
+ menu.choice(:inc, 'Edit permalink'.freeze) { UserManager.set_uid }
42
+ menu.choice(:inc, 'Edit iTunes playlist'.freeze) { PlaylistManager.set_playlist } if OS.mac?
40
43
  end
41
44
  end
42
45
 
@@ -1,28 +1,30 @@
1
- require 'nehm/tracks'
2
-
3
1
  module Nehm
4
2
  class DlCommand < Command
5
3
 
6
4
  def initialize
7
5
  super
8
6
 
9
- add_option(:from, 'from PERMALINK'.green,
7
+ add_option(:from, 'from PERMALINK',
10
8
  'Get track(s) from user with PERMALINK')
11
9
 
12
- add_option(:to, 'to PATH'.green,
10
+ add_option(:to, 'to PATH',
13
11
  'Download track(s) to PATH')
14
12
  end
15
13
 
16
14
  def execute
17
- Tracks[:dl, @options]
15
+ @options[:dl] = true
16
+
17
+ get_cmd = CommandManager.command_instance('get')
18
+ get_cmd.options = @options
19
+ get_cmd.execute
18
20
  end
19
21
 
20
22
  def arguments
21
- { "#{'post'.green}" => 'Download last post (track or repost) from your profile',
22
- "#{'<number> posts'.green}" => 'Download last <number> posts from your profile',
23
- "#{'like'.green}" => 'Download your last like',
24
- "#{'<number> likes'.green}" => 'Download your last <number> likes',
25
- "#{'URL'.magenta}" => 'Download track from entered URL' }
23
+ { 'post' => 'Download last post (track or repost) from your profile',
24
+ 'NUMBER posts' => 'Download last NUMBER posts from your profile',
25
+ 'like' => 'Download your last like',
26
+ 'NUMBER likes' => 'Download your last NUMBER likes',
27
+ 'URL' => 'Download track from entered URL' }
26
28
  end
27
29
 
28
30
  def program_name
@@ -30,7 +32,7 @@ module Nehm
30
32
  end
31
33
 
32
34
  def summary
33
- 'Download and set tags any track from Soundcloud'
35
+ 'Download and set tags any track from SoundCloud'
34
36
  end
35
37
 
36
38
  def usage
@@ -1,31 +1,55 @@
1
- require 'nehm/tracks'
2
-
3
1
  module Nehm
4
2
  class GetCommand < Command
5
3
 
6
4
  def initialize
7
5
  super
8
6
 
9
- add_option(:from, 'from PERMALINK'.green,
7
+ add_option(:from, 'from PERMALINK',
10
8
  'Get track(s) from user with PERMALINK')
11
9
 
12
- add_option(:to, 'to PATH'.green,
10
+ add_option(:to, 'to PATH',
13
11
  'Download track(s) to PATH')
14
12
 
15
- add_option(:playlist, 'playlist PLAYLIST'.green,
13
+ add_option(:pl, 'pl PLAYLIST',
16
14
  'Add track(s) to iTunes playlist with PLAYLIST name')
17
15
  end
18
16
 
19
17
  def execute
20
- Tracks[:get, @options]
18
+ track_manager = TrackManager.new(@options)
19
+
20
+ UI.say 'Getting information about track(s)'
21
+ arg = @options[:args].pop
22
+ tracks =
23
+ case arg
24
+ when /^l.*s$/
25
+ count = @options[:args].pop.to_i
26
+ track_manager.likes(count, 0)
27
+ when /^p.*s$/
28
+ count = @options[:args].pop.to_i
29
+ track_manager.posts(count, 0)
30
+ when /^l/
31
+ track_manager.likes(1, 0)
32
+ when /^p/
33
+ track_manager.posts(1, 0)
34
+ when /https:\/\/soundcloud.com\//
35
+ track_manager.track_from_url(arg)
36
+ when nil
37
+ UI.term 'You must provide an argument'
38
+ else
39
+ UI.term "Invalid argument/option '#{arg}'"
40
+ end
41
+
42
+ UI.term 'There are no tracks yet' if tracks.nil?
43
+
44
+ track_manager.process_tracks(tracks)
21
45
  end
22
46
 
23
47
  def arguments
24
- { "#{'post'.green}" => 'Get last post (track or repost) from your profile',
25
- "#{'<number> posts'.green}" => 'Get last <number> posts from your profile',
26
- "#{'like'.green}" => 'Get your last like',
27
- "#{'<number> likes'.green}" => 'Get your last <number> likes',
28
- "#{'URL'.magenta}" => 'Get track from entered URL' }
48
+ { 'post' => 'Get last post (track or repost) from your profile',
49
+ 'NUMBER posts' => 'Get last NUMBER posts from your profile',
50
+ 'like' => 'Get your last like',
51
+ 'NUMBER likes' => 'Get your last NUMBER likes',
52
+ 'URL' => 'Get track from entered URL' }
29
53
  end
30
54
 
31
55
  def program_name
@@ -33,7 +57,7 @@ module Nehm
33
57
  end
34
58
 
35
59
  def summary
36
- 'Download tracks, set tags and add to your iTunes library tracks from Soundcloud'
60
+ 'Download tracks, set tags and add to your iTunes library tracks from SoundCloud'
37
61
  end
38
62
 
39
63
  def usage
@@ -1,12 +1,12 @@
1
1
  module Nehm
2
2
  class HelpCommand < Command
3
3
 
4
- SPACES_BTW_NAME_AND_DESC = 5
4
+ SPACES_BTWN_NAME_AND_DESC = 3
5
5
 
6
6
  def execute
7
7
  command_name = options[:args].pop
8
8
  if command_name.nil?
9
- UI.say Nehm::Command::HELP
9
+ UI.say HELP
10
10
  UI.term
11
11
  end
12
12
 
@@ -19,7 +19,7 @@ module Nehm
19
19
  end
20
20
 
21
21
  def arguments
22
- { 'COMMAND'.magenta => 'name of command to show help' }
22
+ { 'COMMAND' => 'name of command to show help' }
23
23
  end
24
24
 
25
25
  def program_name
@@ -70,14 +70,14 @@ module Nehm
70
70
  unless @longest
71
71
  names = []
72
72
  names += @cmd.arguments.keys unless @cmd.arguments.empty?
73
- names += @cmd.options.keys unless @cmd.options.empty?
73
+ names += @cmd.options_descs.keys unless @cmd.options_descs.empty?
74
74
  @longest ||= find_longest_name(names).length
75
75
  end
76
76
 
77
77
  hash.each do |name, desc|
78
78
  need_spaces = @longest - name.length
79
79
 
80
- UI.say " #{name}#{' ' * (need_spaces + SPACES_BTW_NAME_AND_DESC)}#{desc}"
80
+ UI.say " #{name.green}#{' ' * (need_spaces + SPACES_BTWN_NAME_AND_DESC)}#{desc}"
81
81
  end
82
82
  end
83
83
 
@@ -0,0 +1,41 @@
1
+ require 'nehm/tracks_view_command'
2
+
3
+ module Nehm
4
+
5
+ class SearchCommand < TracksViewCommand
6
+
7
+ def initialize
8
+ super
9
+ end
10
+
11
+ def execute
12
+ @query = @options[:args].join(' ')
13
+ super
14
+ end
15
+
16
+ def arguments
17
+ { 'QUERY' => 'Search query' }
18
+ end
19
+
20
+ def program_name
21
+ 'nehm search'
22
+ end
23
+
24
+ def summary
25
+ 'Search tracks, print them nicely and download selected tracks'
26
+ end
27
+
28
+ def usage
29
+ "#{program_name} QUERY [OPTIONS]"
30
+ end
31
+
32
+ protected
33
+
34
+ def get_tracks
35
+ UI.term 'You must provide an argument' if @query.empty?
36
+
37
+ @track_manager.search(@query, @limit, @offset)
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,56 @@
1
+ require 'nehm/tracks_view_command'
2
+
3
+ module Nehm
4
+
5
+ ##
6
+ # This command gets likes/posts from user's account,
7
+ # Prints as menu, and downloads selected tracks
8
+
9
+ class SelectCommand < TracksViewCommand
10
+
11
+ def initialize
12
+ super
13
+
14
+ add_option(:from, 'from PERMALINK',
15
+ 'Select track(s) from user with PERMALINK')
16
+ end
17
+
18
+ def arguments
19
+ { 'likes' => 'Select likes',
20
+ 'posts' => 'Select posts' }
21
+ end
22
+
23
+ def program_name
24
+ 'nehm select'
25
+ end
26
+
27
+ def execute
28
+ @type = @options[:args].shift
29
+ super
30
+ end
31
+
32
+ def summary
33
+ 'Get likes or posts from your account, nicely print them and download selected tracks'
34
+ end
35
+
36
+ def usage
37
+ "#{program_name} ARGUMENT [OPTIONS]"
38
+ end
39
+
40
+ protected
41
+
42
+ def get_tracks
43
+ case @type
44
+ when /l/
45
+ @track_manager.likes(@limit, @offset)
46
+ when /p/
47
+ @track_manager.posts(@limit, @offset)
48
+ when nil
49
+ UI.term 'You must provide an argument'
50
+ else
51
+ UI.term "Invalid argument/option '#{type}'"
52
+ end
53
+ end
54
+
55
+ end
56
+ end