vnehm 1.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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +4 -0
- data/LICENSE +19 -0
- data/README.md +84 -0
- data/Rakefile +70 -0
- data/bin/vnehm +14 -0
- data/lib/vnehm/applescript.rb +29 -0
- data/lib/vnehm/applescripts/add_track_to_playlist.applescript +11 -0
- data/lib/vnehm/applescripts/list_of_playlists.applescript +3 -0
- data/lib/vnehm/applescripts/music_master_library.applescript +3 -0
- data/lib/vnehm/cfg.rb +47 -0
- data/lib/vnehm/client.rb +54 -0
- data/lib/vnehm/command.rb +108 -0
- data/lib/vnehm/command_manager.rb +57 -0
- data/lib/vnehm/commands/configure_command.rb +46 -0
- data/lib/vnehm/commands/dl_command.rb +36 -0
- data/lib/vnehm/commands/get_command.rb +53 -0
- data/lib/vnehm/commands/help_command.rb +85 -0
- data/lib/vnehm/commands/list_command.rb +50 -0
- data/lib/vnehm/commands/search_command.rb +67 -0
- data/lib/vnehm/commands/version_command.rb +23 -0
- data/lib/vnehm/menu.rb +78 -0
- data/lib/vnehm/option_parser.rb +29 -0
- data/lib/vnehm/os.rb +13 -0
- data/lib/vnehm/path_manager.rb +49 -0
- data/lib/vnehm/playlist.rb +24 -0
- data/lib/vnehm/playlist_manager.rb +66 -0
- data/lib/vnehm/token_manager.rb +33 -0
- data/lib/vnehm/track.rb +51 -0
- data/lib/vnehm/track_manager.rb +86 -0
- data/lib/vnehm/tracks_view_command.rb +88 -0
- data/lib/vnehm/ui.rb +52 -0
- data/lib/vnehm/version.rb +3 -0
- data/lib/vnehm.rb +79 -0
- data/vnehm.gemspec +29 -0
- metadata +141 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
module Vnehm
|
2
|
+
class HelpCommand < Command
|
3
|
+
|
4
|
+
SPACES_BTWN_NAME_AND_DESC = 3
|
5
|
+
|
6
|
+
def execute
|
7
|
+
command_name = options[:args].pop
|
8
|
+
if command_name.nil?
|
9
|
+
UI.say HELP
|
10
|
+
UI.term
|
11
|
+
end
|
12
|
+
|
13
|
+
@cmd = CommandManager.find_command(command_name)
|
14
|
+
|
15
|
+
show_usage
|
16
|
+
show_summary
|
17
|
+
show_arguments unless @cmd.arguments.empty?
|
18
|
+
show_options unless @cmd.options.empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
def arguments
|
22
|
+
{ 'КОМАНДА' => 'имя команды (может быть сокращено), справку которой нужно показать' }
|
23
|
+
end
|
24
|
+
|
25
|
+
def program_name
|
26
|
+
'vnehm help'
|
27
|
+
end
|
28
|
+
|
29
|
+
def summary
|
30
|
+
'Показ справки для определенной команды'
|
31
|
+
end
|
32
|
+
|
33
|
+
def usage
|
34
|
+
"#{program_name} КОМАНДА"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def find_longest_name(names)
|
40
|
+
names.inject do |longest, word|
|
41
|
+
word.length > longest.length ? word : longest
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def show_usage
|
46
|
+
UI.say "#{'Использование:'.yellow} #{@cmd.usage}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def show_summary
|
50
|
+
UI.newline
|
51
|
+
UI.say "#{'Описание:'.yellow}"
|
52
|
+
UI.say " #{@cmd.summary}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def show_arguments
|
56
|
+
UI.newline
|
57
|
+
UI.say "#{'Аргументы:'.yellow}"
|
58
|
+
show_info(@cmd.arguments)
|
59
|
+
end
|
60
|
+
|
61
|
+
def show_options
|
62
|
+
UI.newline
|
63
|
+
UI.say "#{'Опции:'.yellow}"
|
64
|
+
show_info(@cmd.options_descs)
|
65
|
+
end
|
66
|
+
|
67
|
+
def show_info(hash)
|
68
|
+
@longest ||= nil
|
69
|
+
|
70
|
+
unless @longest
|
71
|
+
names = []
|
72
|
+
names += @cmd.arguments.keys unless @cmd.arguments.empty?
|
73
|
+
names += @cmd.options_descs.keys unless @cmd.options_descs.empty?
|
74
|
+
@longest ||= find_longest_name(names).length
|
75
|
+
end
|
76
|
+
|
77
|
+
hash.each do |name, desc|
|
78
|
+
need_spaces = @longest - name.length
|
79
|
+
|
80
|
+
UI.say " #{name.green}#{' ' * (need_spaces + SPACES_BTWN_NAME_AND_DESC)}#{desc}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'vnehm/tracks_view_command'
|
2
|
+
|
3
|
+
module Vnehm
|
4
|
+
|
5
|
+
##
|
6
|
+
# This command gets likes/posts from user's account,
|
7
|
+
# Prints as menu, and downloads selected tracks
|
8
|
+
|
9
|
+
class ListCommand < TracksViewCommand
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
super
|
13
|
+
|
14
|
+
add_option(:to, 'to ПУТЬ',
|
15
|
+
'Скачивать аудиозапись(и) в ПУТЬ')
|
16
|
+
|
17
|
+
add_option(:pl, 'pl ПЛЕЙЛИСТ',
|
18
|
+
"Добавлять аудиозапись(и) в плейлист iTunes'a c именем" \
|
19
|
+
' ПЛЕЙЛИСТ')
|
20
|
+
|
21
|
+
add_option(:limit, 'limit ЧИСЛО',
|
22
|
+
'Показывать ЧИСЛО аудиозаписей на каждой страницe')
|
23
|
+
|
24
|
+
add_option(:offset, 'offset ЧИСЛО',
|
25
|
+
'Показывать с ЧИСЛО+1 аудиозаписи')
|
26
|
+
|
27
|
+
add_option(:dl, 'dl yes',
|
28
|
+
'Не добавлять аудиозапись(и) в iTunes. Просто скачать их')
|
29
|
+
end
|
30
|
+
|
31
|
+
def program_name
|
32
|
+
'vnehm list'
|
33
|
+
end
|
34
|
+
|
35
|
+
def summary
|
36
|
+
'Вывод списка ваших аудиозаписей из VK и загрузка выбранных треков'
|
37
|
+
end
|
38
|
+
|
39
|
+
def usage
|
40
|
+
"#{program_name} [ОПЦИИ]"
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def get_tracks
|
46
|
+
@track_manager.tracks(@limit, @offset)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'vnehm/tracks_view_command'
|
2
|
+
|
3
|
+
module Vnehm
|
4
|
+
|
5
|
+
class SearchCommand < TracksViewCommand
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
|
10
|
+
add_option(:"-t", '-t ПУТЬ',
|
11
|
+
'Скачивать аудиозапись(и) в ПУТЬ')
|
12
|
+
|
13
|
+
add_option(:"-pl", '-pl ПЛЕЙЛИСТ',
|
14
|
+
"Добавлять аудиозапись(и) в плейлист iTunes'a c именем" \
|
15
|
+
' ПЛЕЙЛИСТ')
|
16
|
+
|
17
|
+
add_option(:"-lim", '-lim ЧИСЛО',
|
18
|
+
'Показывать ЧИСЛО аудиозаписей на каждой страницe')
|
19
|
+
|
20
|
+
add_option(:"-dl", '-dl yes',
|
21
|
+
'Не добавлять аудиозаписи в iTunes. Просто скачать их')
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def execute
|
26
|
+
# Convert dash-options to normal options
|
27
|
+
options_to_convert = { :"-t" => :to,
|
28
|
+
:"-pl" => :pl,
|
29
|
+
:"-lim" => :limit,
|
30
|
+
:"-dl" => :dl }
|
31
|
+
|
32
|
+
options_to_convert.each do |k,v|
|
33
|
+
value = @options[k]
|
34
|
+
@options.delete(k)
|
35
|
+
@options[v] = value unless value.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
@query = @options[:args].join(' ')
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
def arguments
|
43
|
+
{ 'ЗАПРОС' => 'Искать аудиозаписи по ЗАПРОСу' }
|
44
|
+
end
|
45
|
+
|
46
|
+
def program_name
|
47
|
+
'vnehm search'
|
48
|
+
end
|
49
|
+
|
50
|
+
def summary
|
51
|
+
'Поиск, вывод и загрузка определенных аудиозаписей по запросу'
|
52
|
+
end
|
53
|
+
|
54
|
+
def usage
|
55
|
+
"#{program_name} ЗАПРОС [ОПЦИИ]"
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def get_tracks
|
61
|
+
UI.term 'Вы должны ввести запрос' if @query.empty?
|
62
|
+
|
63
|
+
@track_manager.search(@query, @limit, @offset)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'vnehm/version'
|
2
|
+
|
3
|
+
module Vnehm
|
4
|
+
class VersionCommand < Command
|
5
|
+
|
6
|
+
def execute
|
7
|
+
UI.say VERSION
|
8
|
+
end
|
9
|
+
|
10
|
+
def program_name
|
11
|
+
'vnehm version'
|
12
|
+
end
|
13
|
+
|
14
|
+
def summary
|
15
|
+
'Вывод версии приложения'
|
16
|
+
end
|
17
|
+
|
18
|
+
def usage
|
19
|
+
program_name
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
data/lib/vnehm/menu.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
module Vnehm
|
2
|
+
module UI
|
3
|
+
class Menu
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@choices = {}
|
7
|
+
@inc_index = 1
|
8
|
+
@items = []
|
9
|
+
|
10
|
+
yield self
|
11
|
+
select
|
12
|
+
end
|
13
|
+
|
14
|
+
def choice(index, desc, &block)
|
15
|
+
# Visual index - index that you see in menu
|
16
|
+
# Select index - index than can be selected
|
17
|
+
# For example, if you use ':added' index
|
18
|
+
# In menu you see 'A', but you can select it by number
|
19
|
+
# You receive a warning though
|
20
|
+
|
21
|
+
visual_index = select_index = index
|
22
|
+
|
23
|
+
if index == :inc
|
24
|
+
visual_index = select_index = @inc_index.to_s
|
25
|
+
@inc_index += 1
|
26
|
+
end
|
27
|
+
|
28
|
+
if index == :added
|
29
|
+
visual_index = 'A'.green
|
30
|
+
select_index = @inc_index.to_s
|
31
|
+
@inc_index += 1
|
32
|
+
end
|
33
|
+
|
34
|
+
@choices[select_index] = block
|
35
|
+
@items << "#{visual_index} #{desc}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def header=(value)
|
39
|
+
@items.unshift(value)
|
40
|
+
end
|
41
|
+
|
42
|
+
def newline
|
43
|
+
@items << "\n"
|
44
|
+
end
|
45
|
+
|
46
|
+
def select
|
47
|
+
# Add exit option
|
48
|
+
newline
|
49
|
+
choice('e', 'Выйти'.red) { UI.term }
|
50
|
+
|
51
|
+
# Output items
|
52
|
+
@items.each do |item|
|
53
|
+
UI.say item
|
54
|
+
end
|
55
|
+
|
56
|
+
UI.newline
|
57
|
+
|
58
|
+
selected = UI.ask('Введите опцию:'.yellow.freeze)
|
59
|
+
call_selected_block(selected)
|
60
|
+
|
61
|
+
UI.newline
|
62
|
+
end
|
63
|
+
|
64
|
+
def call_selected_block(selected)
|
65
|
+
loop do
|
66
|
+
if @choices.keys.include? selected
|
67
|
+
block = @choices[selected]
|
68
|
+
block.call unless block.nil?
|
69
|
+
break
|
70
|
+
else
|
71
|
+
selected = UI.ask "Вы должны выбрать одно из [#{@choices.keys.join(', ')}]"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Vnehm
|
2
|
+
|
3
|
+
##
|
4
|
+
# OptionParser parses options and add hash with options to specified command
|
5
|
+
|
6
|
+
class OptionParser
|
7
|
+
|
8
|
+
def initialize(args, command)
|
9
|
+
@args = args
|
10
|
+
@command = command
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
options = @command.options.keys.map(&:to_s)
|
15
|
+
options.each do |option|
|
16
|
+
if @args.include? option
|
17
|
+
index = @args.index(option)
|
18
|
+
value = @args[index + 1]
|
19
|
+
@args.delete_at(index + 1)
|
20
|
+
@args.delete_at(index)
|
21
|
+
|
22
|
+
@command.options[option.to_sym] = value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
@command.options[:args] = @args
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/vnehm/os.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module Vnehm
|
2
|
+
|
3
|
+
##
|
4
|
+
# Path manager works with download paths
|
5
|
+
|
6
|
+
module PathManager
|
7
|
+
|
8
|
+
def self.default_dl_path
|
9
|
+
Cfg[:dl_path]
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Checks path for validation and returns it if valid
|
14
|
+
|
15
|
+
def self.get_path(path)
|
16
|
+
# Check path for existence
|
17
|
+
UI.term 'Такой папки не существует! Пожалуйста, введите корректный путь' unless Dir.exist?(path)
|
18
|
+
|
19
|
+
File.expand_path(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.set_dl_path
|
23
|
+
loop do
|
24
|
+
ask_sentence = 'Введите путь в желаемую директорию скачиваемых аудиозаписей'
|
25
|
+
default_path = File.join(ENV['HOME'], '/Music')
|
26
|
+
|
27
|
+
if Dir.exist?(default_path)
|
28
|
+
ask_sentence << " (нажмите Enter, чтобы установить #{default_path.magenta} в качестве этой директории)"
|
29
|
+
else
|
30
|
+
default_path = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
path = UI.ask(ask_sentence + ':')
|
34
|
+
|
35
|
+
# If user press enter, set path to default
|
36
|
+
path = default_path if path == '' && default_path
|
37
|
+
|
38
|
+
if Dir.exist?(path)
|
39
|
+
Cfg[:dl_path] = File.expand_path(path)
|
40
|
+
UI.say "#{'Директория загружаемых аудиотреков установлена по пути'.green} #{path.magenta}"
|
41
|
+
break
|
42
|
+
else
|
43
|
+
UI.error 'Такой папки не существует! Пожалуйста, введите корректный путь'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Vnehm
|
2
|
+
|
3
|
+
##
|
4
|
+
# iTunes playlist primitive
|
5
|
+
|
6
|
+
class Playlist
|
7
|
+
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
def initialize(name)
|
11
|
+
@name = name.chomp
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_track(track)
|
15
|
+
UI.say 'Adding to iTunes'
|
16
|
+
AppleScript.add_track_to_playlist(track.file_path, @name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
@name
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'vnehm/applescript'
|
2
|
+
require 'vnehm/playlist'
|
3
|
+
|
4
|
+
module Vnehm
|
5
|
+
|
6
|
+
##
|
7
|
+
# Playlist manager works with iTunes playlists
|
8
|
+
|
9
|
+
module PlaylistManager
|
10
|
+
|
11
|
+
def self.default_playlist
|
12
|
+
default_user_playlist || music_master_library if OS.mac?
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# Checks path for existence and returns it if exists
|
17
|
+
|
18
|
+
def self.get_playlist(playlist_name)
|
19
|
+
if AppleScript.list_of_playlists.include? playlist_name
|
20
|
+
Playlist.new(playlist_name)
|
21
|
+
else
|
22
|
+
UI.term 'Такого плейлиста не существует. Введите корректное название'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.set_playlist
|
27
|
+
loop do
|
28
|
+
playlist = UI.ask('Введите имя плейлиста iTunes, в который вы ' \
|
29
|
+
'хотите добавлять треки (нажмите Enter, чтобы ' \
|
30
|
+
'не добавлять аудиозаписи в плейлист, ' \
|
31
|
+
'а в музыкальную медиатеку iTunes)')
|
32
|
+
|
33
|
+
# If entered nothing, unset iTunes playlist
|
34
|
+
if playlist == ''
|
35
|
+
Cfg[:playlist] = nil
|
36
|
+
UI.success 'Треки будут добавляться в музыкальную медиатеку iTunes'
|
37
|
+
break
|
38
|
+
end
|
39
|
+
|
40
|
+
if AppleScript.list_of_playlists.include? playlist
|
41
|
+
Cfg[:playlist] = playlist
|
42
|
+
UI.say 'Аудиозаписи будут добавляться в плейлист '.green +
|
43
|
+
playlist.magenta
|
44
|
+
break
|
45
|
+
else
|
46
|
+
UI.error 'Такого плейлиста не существует. Введите корректное название'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
module_function
|
53
|
+
|
54
|
+
def default_user_playlist
|
55
|
+
Playlist.new(Cfg[:playlist]) unless Cfg[:playlist].nil?
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Music master library is main iTunes music library
|
60
|
+
|
61
|
+
def music_master_library
|
62
|
+
Playlist.new(AppleScript.music_master_library)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module Vnehm
|
4
|
+
|
5
|
+
module TokenManager
|
6
|
+
|
7
|
+
def self.token
|
8
|
+
Cfg['token'] if Cfg.exist?
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.authorize
|
12
|
+
auth_url = Client.authorization_url
|
13
|
+
UI.say "1. Переходите по этой ссылке с помощью вашего браузера: #{auth_url.magenta}"
|
14
|
+
UI.say "2. Жмите #{'Разрешить'.green}"
|
15
|
+
UI.say '3. Скопируйте ссылку из адресной строки вашего браузера сюда:'
|
16
|
+
uri = UI.ask
|
17
|
+
|
18
|
+
uri = URI(uri)
|
19
|
+
hash = CGI::parse(uri.fragment)
|
20
|
+
|
21
|
+
if hash['access_token']
|
22
|
+
Cfg['token'] = hash['access_token'].first
|
23
|
+
else
|
24
|
+
UI.term 'Вы ввели неверную ссылку! ' \
|
25
|
+
'Пожалуйста, авторизируйтесь ещё раз и перепроверьте введеные данные'
|
26
|
+
end
|
27
|
+
|
28
|
+
UI.success 'Вы успешно авторизованы!'
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/vnehm/track.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module Vnehm
|
2
|
+
|
3
|
+
# Primitive for SoundCloud track
|
4
|
+
|
5
|
+
class Track
|
6
|
+
|
7
|
+
attr_reader :hash
|
8
|
+
|
9
|
+
def initialize(hash)
|
10
|
+
@hash = hash
|
11
|
+
end
|
12
|
+
|
13
|
+
def artist
|
14
|
+
CGI::unescapeHTML(@hash.artist)
|
15
|
+
end
|
16
|
+
|
17
|
+
def duration
|
18
|
+
seconds = @hash['duration']
|
19
|
+
|
20
|
+
time = Time.at(seconds)
|
21
|
+
time -= time.utc_offset
|
22
|
+
|
23
|
+
time.hour > 0 ? time.strftime("%H:%M:%S") : time.strftime("%M:%S")
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_name
|
27
|
+
"#{full_name.tr(',./\\\'$%"', '')}.mp3"
|
28
|
+
end
|
29
|
+
|
30
|
+
def file_path
|
31
|
+
File.join(ENV['dl_path'], file_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def full_name
|
35
|
+
"#{artist} - #{title}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def id
|
39
|
+
@hash.aid
|
40
|
+
end
|
41
|
+
|
42
|
+
def title
|
43
|
+
CGI::unescapeHTML(@hash.title)
|
44
|
+
end
|
45
|
+
|
46
|
+
def url
|
47
|
+
@hash.url
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'taglib'
|
2
|
+
|
3
|
+
require 'vnehm/track'
|
4
|
+
|
5
|
+
module Vnehm
|
6
|
+
|
7
|
+
class TrackManager
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
setup_environment(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def process_tracks(tracks)
|
14
|
+
tracks.reverse_each do |track|
|
15
|
+
UI.newline
|
16
|
+
dl(track)
|
17
|
+
tag(track)
|
18
|
+
@playlist.add_track(track) if @playlist
|
19
|
+
UI.newline
|
20
|
+
end
|
21
|
+
UI.success 'Done!'
|
22
|
+
end
|
23
|
+
|
24
|
+
def tracks(limit, offset)
|
25
|
+
UI.term "Неверное значение опции 'limit'\nОно должно быть больше 0" if limit <= 0
|
26
|
+
UI.term "Неверное значении опции 'offset'\nОно должно быть больше или равно 0" if offset < 0
|
27
|
+
|
28
|
+
tracks = Client.tracks(limit, offset)
|
29
|
+
return nil if tracks.empty?
|
30
|
+
|
31
|
+
tracks.map! { |hash| Track.new(hash) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def search(query, limit, offset)
|
35
|
+
UI.term "Неверное значение опции 'limit'\nОно должно быть больше 0" if limit <= 0
|
36
|
+
UI.term "Неверное значении опции 'offset'\nОно должно быть больше или равно 0" if offset < 0
|
37
|
+
|
38
|
+
found = Client.search(query, limit, offset)
|
39
|
+
return nil if found.empty?
|
40
|
+
|
41
|
+
found.shift # Deleting first item - 'count'
|
42
|
+
|
43
|
+
found.map! { |hash| Track.new(hash) }
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def dl(track)
|
49
|
+
# Downloading track
|
50
|
+
UI.say 'Загрузка ' + track.full_name
|
51
|
+
`curl -# -o \"#{track.file_path}\" -L \"#{track.url}\"`
|
52
|
+
end
|
53
|
+
|
54
|
+
def tag(track)
|
55
|
+
TagLib::MPEG::File.open(track.file_path) do |file|
|
56
|
+
tag = file.id3v2_tag
|
57
|
+
tag.artist = track.artist
|
58
|
+
tag.title = track.title
|
59
|
+
|
60
|
+
file.save
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def setup_environment(options)
|
65
|
+
# Setting up download path
|
66
|
+
temp_path = options[:to]
|
67
|
+
dl_path = temp_path ? PathManager.get_path(temp_path) : PathManager.default_dl_path
|
68
|
+
if dl_path
|
69
|
+
ENV['dl_path'] = dl_path
|
70
|
+
else
|
71
|
+
UI.error "Вы не указали путь, куда должны скачиваться треки!"
|
72
|
+
UI.say "Укажите его через команду #{'vnehm configure'.yellow} " \
|
73
|
+
" или используйте опцию #{'to ПУТЬ'.yellow}"
|
74
|
+
UI.term
|
75
|
+
end
|
76
|
+
|
77
|
+
# Setting up iTunes playlist
|
78
|
+
@playlist = nil
|
79
|
+
if options[:dl] != 'yes' && OS.mac?
|
80
|
+
playlist_name = options[:pl]
|
81
|
+
@playlist = playlist_name ? PlaylistManager.get_playlist(playlist_name) : PlaylistManager.default_playlist
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|