mbrew 0.1.0.pre.dev.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 +2 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +26 -0
- data/Makefile +4 -0
- data/Makefile.common +50 -0
- data/README.md +25 -0
- data/bin/mbrew +370 -0
- data/lib/mbrew.rb +2 -0
- data/lib/mbrew/version.rb +7 -0
- data/mbrew.gemspec +34 -0
- data/mbrew.sublime-project +10 -0
- metadata +127 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d45f7c902432ff4773ad0948623b47ca2a97ffa1
|
4
|
+
data.tar.gz: bfad59bbb9d52702783c6e9c3bb2223d2487429a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d0d8d527d34a34f648ba669339311fd98e004477c3b4d931854a392ebe843028506f81c5789ec55988800b4b387589a6e6c5718b499416182b402a89bf68c0a8
|
7
|
+
data.tar.gz: 9ee8375a483366532a53da418489b18407c92939301ace0fa2e040683f5314d40a71f808de437baa3b2db92e626d9973768bcc4b63e09bfd9d8af7444d3787fb
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
mbrew (0.1.0.pre.dev.1)
|
5
|
+
git (~> 1.2)
|
6
|
+
id3lib-ruby (~> 0.6)
|
7
|
+
rainbow (~> 2.0)
|
8
|
+
thefox-ext (~> 1.0)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
git (1.2.9.1)
|
14
|
+
id3lib-ruby (0.6.0)
|
15
|
+
rainbow (2.0.0)
|
16
|
+
thefox-ext (1.1.0)
|
17
|
+
|
18
|
+
PLATFORMS
|
19
|
+
ruby
|
20
|
+
|
21
|
+
DEPENDENCIES
|
22
|
+
bundler (~> 1.10)
|
23
|
+
mbrew!
|
24
|
+
|
25
|
+
BUNDLED WITH
|
26
|
+
1.10.2
|
data/Makefile
ADDED
data/Makefile.common
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
# Ruby Common Big
|
3
|
+
# 2015-12-07
|
4
|
+
|
5
|
+
MV = mv -nv
|
6
|
+
RM = rm -rf
|
7
|
+
MKDIR = mkdir -p
|
8
|
+
BUNDLER = bundle
|
9
|
+
GEMSPEC_FILE = $(GEM_NAME).gemspec
|
10
|
+
|
11
|
+
.PHONY: all
|
12
|
+
all: setup
|
13
|
+
|
14
|
+
.PHONY: setup
|
15
|
+
setup: .setup
|
16
|
+
|
17
|
+
.setup:
|
18
|
+
$(BUNDLER) install
|
19
|
+
touch $@
|
20
|
+
|
21
|
+
.PHONY: install
|
22
|
+
install:
|
23
|
+
gem_file=$$(gem build $(GEMSPEC_FILE) | grep 'File:' | tail -1 | awk '{ print $$2 }'); \
|
24
|
+
sudo gem install $$gem_file; \
|
25
|
+
$(RM) $$gem_file
|
26
|
+
|
27
|
+
.PHONY: uninstall
|
28
|
+
uninstall:
|
29
|
+
sudo gem uninstall $(GEM_NAME)
|
30
|
+
|
31
|
+
.PHONY: update
|
32
|
+
update:
|
33
|
+
$(BUNDLER) update
|
34
|
+
|
35
|
+
.PHONY: clean
|
36
|
+
clean:
|
37
|
+
$(RM) .setup
|
38
|
+
|
39
|
+
.PHONY: release
|
40
|
+
release: | releases
|
41
|
+
set -e; \
|
42
|
+
gem_file=$$(gem build $(GEMSPEC_FILE) | grep 'File:' | tail -1 | awk '{ print $$2 }'); \
|
43
|
+
dst="releases/$$gem_file"; \
|
44
|
+
[ ! -f $$dst ]; \
|
45
|
+
$(MV) $$gem_file releases; \
|
46
|
+
gem push $$dst; \
|
47
|
+
echo 'done'
|
48
|
+
|
49
|
+
releases:
|
50
|
+
$(MKDIR) $@
|
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# MusicBrew
|
2
|
+
|
3
|
+
A combination of Spotify and [Homebrew](http://brew.sh/). Like a [package manager](https://en.wikipedia.org/wiki/Package_manager) for software but for music. It's made to use it on the [comand-line](https://en.wikipedia.org/wiki/Command-line_interface). You can install all songs by a specified band, for example from ABBA via `music install ABBA`. The mp3 files will be downloaded from a central server to your local music collection. The search acts like on a traditional package managers, for example via `music search AC/DC`. Like on Homebrew, each song file or band gets a *formula* file. The formula files will be searched locally when the search command is used. On `music update` all formula files will be updated through Git. The `music upgrade` command is used to upgrade all existing bands. New songs will be downloaded.
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
The preferred method of installation is via RubyGems.org:
|
8
|
+
<https://rubygems.org/gems/mbrew>
|
9
|
+
|
10
|
+
gem install mbrew
|
11
|
+
|
12
|
+
or via `Gemfile`:
|
13
|
+
|
14
|
+
gem 'mbrew', '~>0.1.0'
|
15
|
+
|
16
|
+
Use it in your sources:
|
17
|
+
|
18
|
+
require 'mbrew'
|
19
|
+
|
20
|
+
## License
|
21
|
+
Copyright (C) 2015 Christian Mayer <http://fox21.at>
|
22
|
+
|
23
|
+
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
24
|
+
|
25
|
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
|
data/bin/mbrew
ADDED
@@ -0,0 +1,370 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: UTF-8
|
3
|
+
|
4
|
+
raise 'Ruby >=2.2 required' unless RUBY_VERSION.to_f >= 2.2
|
5
|
+
|
6
|
+
require 'optparse'
|
7
|
+
require 'fileutils'
|
8
|
+
require 'uri'
|
9
|
+
require 'git'
|
10
|
+
require 'yaml'
|
11
|
+
require 'yaml/store'
|
12
|
+
require 'digest/sha1'
|
13
|
+
require 'rainbow'
|
14
|
+
require 'id3lib'
|
15
|
+
require 'thefox-ext'
|
16
|
+
|
17
|
+
|
18
|
+
lib = '/Users/thefox/work/dev/homemusic/lib'
|
19
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
20
|
+
require 'mbrew'
|
21
|
+
|
22
|
+
|
23
|
+
if ARGV.count == 0
|
24
|
+
puts "Usage: mbrew <command>"
|
25
|
+
puts "Version: #{TheFox::MBrew::VERSION}"
|
26
|
+
puts
|
27
|
+
puts 'Commands:'
|
28
|
+
puts "\t clone"
|
29
|
+
puts "\t init"
|
30
|
+
puts "\t add"
|
31
|
+
puts "\t commit"
|
32
|
+
puts "\t status"
|
33
|
+
puts "\t list"
|
34
|
+
puts
|
35
|
+
exit 3
|
36
|
+
end
|
37
|
+
|
38
|
+
command1 = ARGV.shift
|
39
|
+
case command1
|
40
|
+
when 'clone'
|
41
|
+
opts = OptionParser.new do |opts|
|
42
|
+
opts.banner = "Usage: mbrew #{command1} <url> [<dir>]"
|
43
|
+
opts.separator('')
|
44
|
+
|
45
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
46
|
+
puts opts
|
47
|
+
puts
|
48
|
+
exit 3
|
49
|
+
end
|
50
|
+
end
|
51
|
+
ARGV << '-h' if ARGV.count == 0
|
52
|
+
opts.parse(ARGV)
|
53
|
+
|
54
|
+
url = URI(ARGV.shift)
|
55
|
+
dir = ARGV.shift ||
|
56
|
+
"#{url.host} #{url.path}"
|
57
|
+
.gsub('.', '-')
|
58
|
+
.gsub('/', ' ')
|
59
|
+
.strip
|
60
|
+
.gsub(/ +/, '-')
|
61
|
+
|
62
|
+
puts "url: '#{url}'"
|
63
|
+
puts "dir: '#{dir}'"
|
64
|
+
|
65
|
+
if !Dir.exist?(dir)
|
66
|
+
puts "Cloning into library '#{dir}'..."
|
67
|
+
|
68
|
+
Dir.mkdir(dir)
|
69
|
+
Dir.chdir(dir) do
|
70
|
+
Dir.mkdir('.mbrew')
|
71
|
+
Dir.chdir('.mbrew') do
|
72
|
+
grepo = Git.clone(URI, NAME, :path => 'index')
|
73
|
+
grepo.config('user.name', 'Mr. Robot')
|
74
|
+
grepo.config('user.email', 'robot@example.com')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
else
|
78
|
+
raise "Directory '#{dir}' already exist."
|
79
|
+
end
|
80
|
+
when 'init'
|
81
|
+
opts = OptionParser.new do |opts|
|
82
|
+
opts.banner = "Usage: mbrew #{command1} <dir>"
|
83
|
+
opts.separator('')
|
84
|
+
|
85
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
86
|
+
puts opts
|
87
|
+
puts
|
88
|
+
exit 3
|
89
|
+
end
|
90
|
+
end
|
91
|
+
opts.parse(ARGV)
|
92
|
+
|
93
|
+
dir = ARGV.shift || '.'
|
94
|
+
Dir.chdir(dir) do
|
95
|
+
puts Dir.pwd
|
96
|
+
if !Dir.exist?('.mbrew')
|
97
|
+
Dir.mkdir('.mbrew')
|
98
|
+
Dir.chdir('.mbrew') do
|
99
|
+
Dir.mkdir('data')
|
100
|
+
Dir.mkdir('bin')
|
101
|
+
Dir.mkdir('index')
|
102
|
+
|
103
|
+
Dir.chdir('bin') do
|
104
|
+
File.open('push', 'w') do |file|
|
105
|
+
file.chmod(0755)
|
106
|
+
|
107
|
+
file.puts('#!/usr/bin/env bash')
|
108
|
+
file.puts
|
109
|
+
file.puts('SCRIPT_BASEDIR=$(dirname $0)')
|
110
|
+
file.puts('RSYNC_BIN="rsync"')
|
111
|
+
file.puts('RSYNC_OPTIONS="-vucr --delete --delete-excluded -h --progress --exclude=.DS_Store"')
|
112
|
+
file.puts('RSYNC_REMOTE="user@remote:/path/to/public"')
|
113
|
+
file.puts
|
114
|
+
file.puts
|
115
|
+
file.puts('cd $SCRIPT_BASEDIR/..')
|
116
|
+
file.puts
|
117
|
+
file.puts('# $RSYNC_BIN $RSYNC_OPTIONS index data $RSYNC_REMOTE')
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
Dir.chdir('index') do
|
122
|
+
grepo = Git.init('.')
|
123
|
+
grepo.config('user.name', 'Mr. Robot')
|
124
|
+
grepo.config('user.email', 'robot@example.com')
|
125
|
+
|
126
|
+
File.write('.gitkeep', 'keep')
|
127
|
+
grepo.add('.gitkeep')
|
128
|
+
|
129
|
+
grepo.commit('Initial commit.')
|
130
|
+
end
|
131
|
+
|
132
|
+
staged_yaml = YAML::Store.new('staged.yml')
|
133
|
+
staged_yaml.transaction do
|
134
|
+
staged_yaml['files'] = []
|
135
|
+
end
|
136
|
+
end
|
137
|
+
else
|
138
|
+
raise "Directory '#{dir}' is already a mbrew library."
|
139
|
+
end
|
140
|
+
end
|
141
|
+
when 'add'
|
142
|
+
raise 'FATAL ERROR: not a mbrew library.' if !Dir.exist?('.mbrew')
|
143
|
+
|
144
|
+
options = {
|
145
|
+
:recursive => false,
|
146
|
+
}
|
147
|
+
opts = OptionParser.new do |opts|
|
148
|
+
opts.banner = "Usage: mbrew #{command1} [<options>] <path...>"
|
149
|
+
opts.separator('')
|
150
|
+
|
151
|
+
opts.on('-R', '--recursive', 'Remove all tags.') do |v|
|
152
|
+
options[:recursive] = true
|
153
|
+
end
|
154
|
+
|
155
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
156
|
+
puts opts
|
157
|
+
puts
|
158
|
+
exit 3
|
159
|
+
end
|
160
|
+
end
|
161
|
+
ARGV << '-h' if ARGV.count == 0
|
162
|
+
paths = opts.parse(ARGV)
|
163
|
+
|
164
|
+
file_pattern = '*.mp3'
|
165
|
+
file_pattern = File.join('**', '*.mp3') if options[:recursive]
|
166
|
+
|
167
|
+
files_staged = []
|
168
|
+
Dir.chdir('.mbrew') do
|
169
|
+
files_staged = YAML.load_file('staged.yml')['files']
|
170
|
+
end
|
171
|
+
|
172
|
+
paths.each do |path|
|
173
|
+
if File.exist?(path)
|
174
|
+
if File.directory?(path)
|
175
|
+
Dir.chdir(path) do
|
176
|
+
Dir.glob(file_pattern).sort.each do |file_path|
|
177
|
+
full_path = File.join(path, file_path)
|
178
|
+
puts "Adding file '#{full_path}'"
|
179
|
+
files_staged << full_path
|
180
|
+
end
|
181
|
+
end
|
182
|
+
else
|
183
|
+
puts "Adding file '#{path}'"
|
184
|
+
files_staged << path
|
185
|
+
end
|
186
|
+
else
|
187
|
+
$stderr.puts "WARNING: '#{path}' no such file or directory."
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
files_staged.sort!.uniq!
|
192
|
+
|
193
|
+
Dir.chdir('.mbrew') do
|
194
|
+
staged_yaml = YAML::Store.new('staged.yml')
|
195
|
+
staged_yaml.transaction do
|
196
|
+
staged_yaml['files'] = files_staged
|
197
|
+
end
|
198
|
+
end
|
199
|
+
when 'commit'
|
200
|
+
raise 'FATAL ERROR: not a mbrew library.' if !Dir.exist?('.mbrew')
|
201
|
+
|
202
|
+
opts = OptionParser.new do |opts|
|
203
|
+
opts.banner = "Usage: mbrew #{command1}"
|
204
|
+
opts.separator('')
|
205
|
+
|
206
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
207
|
+
puts opts
|
208
|
+
puts
|
209
|
+
exit 3
|
210
|
+
end
|
211
|
+
end
|
212
|
+
opts.parse(ARGV)
|
213
|
+
|
214
|
+
files_staged = []
|
215
|
+
Dir.chdir('.mbrew') do
|
216
|
+
files_staged = YAML.load_file('staged.yml')['files']
|
217
|
+
end
|
218
|
+
|
219
|
+
if files_staged.count >= 0
|
220
|
+
files_staged.each do |src_file_path|
|
221
|
+
if File.exist?(src_file_path)
|
222
|
+
|
223
|
+
|
224
|
+
src_file_basename = File.basename(src_file_path)
|
225
|
+
src_file_basename_hex = Digest::SHA256.hexdigest(src_file_basename)
|
226
|
+
clone_file_basename = "#{src_file_basename_hex}.mp3"
|
227
|
+
clone_file_path = ".mbrew/data/#{clone_file_basename}"
|
228
|
+
|
229
|
+
FileUtils.cp(src_file_path, clone_file_path)
|
230
|
+
|
231
|
+
src_file_hex = Digest::SHA256.file(clone_file_path).hexdigest
|
232
|
+
|
233
|
+
dst_dir_path = "#{src_file_hex[0,2]}/#{src_file_hex[2,2]}/#{src_file_hex[4,2]}"
|
234
|
+
dst_file_name = src_file_hex[6,58]
|
235
|
+
gpg_file_name = "#{dst_file_name}.gpg"
|
236
|
+
gpg_file_path = "#{dst_dir_path}/#{gpg_file_name}"
|
237
|
+
yml_file_name = "#{dst_file_name}.yml"
|
238
|
+
yml_file_path = "#{dst_dir_path}/#{yml_file_name}"
|
239
|
+
gpg_exec = "gpg --no-tty --batch --passphrase supersecret2015 --cipher-algo AES256 -c -o '#{gpg_file_name}' '#{clone_file_basename}'"
|
240
|
+
|
241
|
+
puts "src_file_basename: '#{src_file_basename}'"
|
242
|
+
puts "src_file_basename_hex: '#{src_file_basename_hex}'"
|
243
|
+
puts "clone_file_basename: '#{clone_file_basename}'"
|
244
|
+
puts "clone_file_path: '#{clone_file_path}'"
|
245
|
+
puts
|
246
|
+
puts "src_file_hex: '#{src_file_hex}'"
|
247
|
+
puts "dst_dir_path: '#{dst_dir_path}'"
|
248
|
+
puts "dst_file_name: '#{dst_file_name}'"
|
249
|
+
puts "gpg_file_name: '#{gpg_file_name}'"
|
250
|
+
puts "gpg_file_path: '#{gpg_file_path}'"
|
251
|
+
puts "yml_file_name: '#{yml_file_name}'"
|
252
|
+
puts "yml_file_path: '#{yml_file_path}'"
|
253
|
+
puts
|
254
|
+
puts "gpg_exec: '#{gpg_exec}'"
|
255
|
+
puts
|
256
|
+
|
257
|
+
Dir.chdir('.mbrew') do
|
258
|
+
mp3_tag = nil
|
259
|
+
|
260
|
+
Dir.chdir('data') do
|
261
|
+
FileUtils.mkdir_p(dst_dir_path) if !Dir.exist?(dst_dir_path)
|
262
|
+
FileUtils.rm(gpg_file_path) if File.exist?(gpg_file_path)
|
263
|
+
|
264
|
+
if !File.exist?(gpg_file_path)
|
265
|
+
FileUtils.mv(clone_file_basename, dst_dir_path)
|
266
|
+
Dir.chdir(dst_dir_path) do
|
267
|
+
if !system(gpg_exec).nil?
|
268
|
+
mp3_tag = ID3Lib::Tag.new(clone_file_basename)
|
269
|
+
FileUtils.rm(clone_file_basename)
|
270
|
+
else
|
271
|
+
FileUtils.rm(clone_file_basename)
|
272
|
+
raise 'FATAL ERROR: gpg failed.'
|
273
|
+
end
|
274
|
+
end
|
275
|
+
else
|
276
|
+
FileUtils.rm(clone_file_basename)
|
277
|
+
raise "FATAL ERROR: '#{gpg_file_path}' file already exist."
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
if !mp3_tag.nil?
|
282
|
+
Dir.chdir('index') do
|
283
|
+
FileUtils.mkdir_p(dst_dir_path) if !Dir.exist?(dst_dir_path)
|
284
|
+
|
285
|
+
mp3_tag_artist = mp3_tag.artist.to_s.to_utf8
|
286
|
+
mp3_tag_band = mp3_tag.band.to_s.to_utf8
|
287
|
+
mp3_tag_composer = mp3_tag.composer.to_s.to_utf8
|
288
|
+
mp3_tag_album = mp3_tag.album.to_s.to_utf8
|
289
|
+
|
290
|
+
mp3_tag_title = mp3_tag.title
|
291
|
+
mp3_tag_year = mp3_tag.year.to_i
|
292
|
+
|
293
|
+
grepo = Git.open('.')
|
294
|
+
grepo.config('user.name', 'Mr. Robot')
|
295
|
+
grepo.config('user.email', 'robot@example.com')
|
296
|
+
|
297
|
+
yaml_store = YAML::Store.new(yml_file_path)
|
298
|
+
yaml_store.transaction do
|
299
|
+
yaml_store['src'] = {
|
300
|
+
'file_path' => src_file_path,
|
301
|
+
'file_name' => src_file_basename,
|
302
|
+
'hash' => src_file_hex,
|
303
|
+
}
|
304
|
+
yaml_store['id3'] = {
|
305
|
+
'artist' => "#{mp3_tag_artist}",
|
306
|
+
'band' => "#{mp3_tag_band}",
|
307
|
+
'composer' => "#{mp3_tag_composer}",
|
308
|
+
'album' => "#{mp3_tag_album}",
|
309
|
+
'title' => "#{mp3_tag_title}",
|
310
|
+
'year' => mp3_tag_year,
|
311
|
+
}
|
312
|
+
end
|
313
|
+
|
314
|
+
puts "composer: '#{mp3_tag_composer}'"
|
315
|
+
puts "album: '#{mp3_tag_album}'"
|
316
|
+
|
317
|
+
puts "Committing file '#{src_file_path}' ('#{mp3_tag_artist}' - '#{mp3_tag_title}')."
|
318
|
+
|
319
|
+
begin
|
320
|
+
grepo.add(yml_file_path)
|
321
|
+
grepo.commit("New file: '#{yml_file_path}' ('#{mp3_tag_artist}' - '#{mp3_tag_title}')")
|
322
|
+
rescue Exception => e
|
323
|
+
end
|
324
|
+
|
325
|
+
begin
|
326
|
+
grepo.add('.')
|
327
|
+
grepo.commit('Misc changes.')
|
328
|
+
rescue Exception => e
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
else
|
334
|
+
$stderr.puts "WARNING: '#{file_path}' no such file."
|
335
|
+
end
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
Dir.chdir('.mbrew') do
|
340
|
+
staged_yaml = YAML::Store.new('staged.yml')
|
341
|
+
staged_yaml.transaction do
|
342
|
+
staged_yaml['files'] = []
|
343
|
+
end
|
344
|
+
end
|
345
|
+
when 'status'
|
346
|
+
raise 'FATAL ERROR: not a mbrew library.' if !Dir.exist?('.mbrew')
|
347
|
+
|
348
|
+
opts = OptionParser.new do |opts|
|
349
|
+
opts.banner = "Usage: mbrew #{command1}"
|
350
|
+
opts.separator('')
|
351
|
+
|
352
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
353
|
+
puts opts
|
354
|
+
puts
|
355
|
+
exit 3
|
356
|
+
end
|
357
|
+
end
|
358
|
+
opts.parse(ARGV)
|
359
|
+
|
360
|
+
Dir.chdir('.mbrew') do
|
361
|
+
files_staged = YAML.load_file('staged.yml')['files']
|
362
|
+
if files_staged.count > 0
|
363
|
+
puts "Files staged for commit: #{files_staged.count}"
|
364
|
+
puts
|
365
|
+
puts Rainbow("\t" + (files_staged.join("\n\t"))).red
|
366
|
+
puts
|
367
|
+
end
|
368
|
+
end
|
369
|
+
when 'list'
|
370
|
+
end
|
data/lib/mbrew.rb
ADDED
data/mbrew.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'mbrew/version'
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.name = 'mbrew'
|
10
|
+
spec.version = TheFox::MBrew::VERSION
|
11
|
+
spec.date = TheFox::MBrew::DATE
|
12
|
+
spec.author = 'Christian Mayer'
|
13
|
+
spec.email = 'christian@fox21.at'
|
14
|
+
|
15
|
+
spec.summary = %q{MusicBrew}
|
16
|
+
spec.description = %q{A combination of Spotify and Homebrew.}
|
17
|
+
spec.homepage = 'https://github.com/TheFox/homemusic'
|
18
|
+
spec.license = 'GPL-3.0'
|
19
|
+
|
20
|
+
spec.files = `git ls-files -z`.split("\x0").reject{ |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
spec.bindir = 'bin'
|
22
|
+
spec.executables = ['mbrew']
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
spec.required_ruby_version = '>=2.2.0'
|
25
|
+
|
26
|
+
spec.requirements << 'GPG'
|
27
|
+
|
28
|
+
spec.add_development_dependency 'bundler', '~>1.10'
|
29
|
+
|
30
|
+
spec.add_dependency 'rainbow', '~>2.0'
|
31
|
+
spec.add_dependency 'git', '~>1.2'
|
32
|
+
spec.add_dependency 'id3lib-ruby', '~>0.6'
|
33
|
+
spec.add_dependency 'thefox-ext', '~>1.0'
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mbrew
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.pre.dev.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Christian Mayer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rainbow
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: git
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: id3lib-ruby
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.6'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thefox-ext
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
description: A combination of Spotify and Homebrew.
|
84
|
+
email: christian@fox21.at
|
85
|
+
executables:
|
86
|
+
- mbrew
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- Makefile
|
94
|
+
- Makefile.common
|
95
|
+
- README.md
|
96
|
+
- bin/mbrew
|
97
|
+
- lib/mbrew.rb
|
98
|
+
- lib/mbrew/version.rb
|
99
|
+
- mbrew.gemspec
|
100
|
+
- mbrew.sublime-project
|
101
|
+
homepage: https://github.com/TheFox/homemusic
|
102
|
+
licenses:
|
103
|
+
- GPL-3.0
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 2.2.0
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.3.1
|
119
|
+
requirements:
|
120
|
+
- GPG
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 2.4.7
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: MusicBrew
|
126
|
+
test_files: []
|
127
|
+
has_rdoc:
|