musicfix 0.1.3 → 0.1.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 +4 -4
- data/CHANGELOG +11 -0
- data/README +2 -2
- data/bin/musicfix +77 -45
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a17bc779557199bbf5d0a2a0fb73e8f2eba7111e
|
4
|
+
data.tar.gz: 718671ebe4f9ec0b17f1b9b041cec160dfb194af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58271c448ab3602583c315ac1aef9439613c82ea64edc5c974d442dd4d161c63bef2693de599948b086a77e5b4011881b28c138d370d0029a0d0b1ef862d0b89
|
7
|
+
data.tar.gz: 39018cb6b5fc1092952b1ced6bb27cd1103a639fedc2382635c2b6021c524c6e1be5dad317bece6b4e0a0a494b8a3d3836198cee7edb1ef3ce4eca01b425c08d
|
data/CHANGELOG
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
## 0.1.4
|
2
|
+
* Remove the discogs-wrapper gem dependency and directly call the
|
3
|
+
Discogs API with JSON output format.
|
4
|
+
* Most of the common release format abbreviations are in place.
|
5
|
+
* Always start numbering of track lists from 1 ("A" becomes "A1").
|
6
|
+
* Numbering in artist name can also appear before the article, strip it.
|
7
|
+
|
8
|
+
## 0.1.3
|
9
|
+
* Release format string is now abbreviated for file naming.
|
10
|
+
* Add the fake command prefix to avoid writing to disk.
|
11
|
+
* Start to keep a change log.
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: README,v 1.
|
1
|
+
# $Id: README,v 1.14 2013/11/08 19:06:13 lostd Exp $
|
2
2
|
|
3
3
|
# Description
|
4
4
|
|
@@ -13,7 +13,7 @@ to the program. Enjoy!
|
|
13
13
|
# Dependencies
|
14
14
|
|
15
15
|
* System packages: taglib
|
16
|
-
* Ruby gems:
|
16
|
+
* Ruby gems: stringex taglib-ruby
|
17
17
|
|
18
18
|
|
19
19
|
# Usage
|
data/bin/musicfix
CHANGED
@@ -1,27 +1,33 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
# $Id: musicfix,v 1.
|
4
|
+
# $Id: musicfix,v 1.52 2013/11/11 11:15:10 lostd Exp $
|
5
5
|
|
6
6
|
require 'rubygems'
|
7
7
|
require 'fileutils'
|
8
8
|
require 'open-uri'
|
9
|
-
require 'discogs'
|
10
9
|
require 'stringex'
|
11
10
|
require 'taglib'
|
12
11
|
require 'yaml'
|
13
12
|
|
13
|
+
# Headers
|
14
|
+
Ver = '0.1.4'
|
15
|
+
Homepage = 'http://www.2f30.org/~lostd/musicfix/'
|
16
|
+
Headers = {'User-Agent' => "musicfix/#{Ver} +#{Homepage}"}
|
17
|
+
|
14
18
|
# Concatenate artist list using '&'
|
15
19
|
# Convert "Sound, The (2)" to "The Sound"
|
20
|
+
# Convert "Unknown (21), The" to "The Unknown"
|
16
21
|
def mkartist al
|
17
|
-
nl = al.collect {|a| a
|
22
|
+
nl = al.collect {|a| a['name']}
|
18
23
|
nl.each {|n| n.gsub! /\s\(\d+\)$/, ''}
|
19
24
|
nl.each {|n| n.gsub! /(.*), The$/, 'The \1'}
|
25
|
+
nl.each {|n| n.gsub! /\s\(\d+\)$/, ''}
|
20
26
|
nl.join ' & '
|
21
27
|
end
|
22
28
|
|
23
29
|
# Convert "3" to (nil, "03")
|
24
|
-
# Convert "A" to (nil, "
|
30
|
+
# Convert "A" to (nil, "A1")
|
25
31
|
# Convert "A3" to (nil, "A3")
|
26
32
|
# Convert "2.3" to ("2", "03")
|
27
33
|
# Convert "2.03" to ("2", "03")
|
@@ -36,7 +42,7 @@ def mkdiscnum pos
|
|
36
42
|
d = d.gsub /\D/, ''
|
37
43
|
end
|
38
44
|
if n.match /[A-Z]/
|
39
|
-
n = n.ljust(2, '
|
45
|
+
n = n.ljust(2, '1')
|
40
46
|
else
|
41
47
|
n = n.rjust(2, '0')
|
42
48
|
end
|
@@ -64,10 +70,10 @@ end
|
|
64
70
|
|
65
71
|
# Get cover artwork
|
66
72
|
def getimgurl rel
|
67
|
-
return nil unless rel
|
68
|
-
img = rel
|
69
|
-
rel
|
70
|
-
img
|
73
|
+
return nil unless rel['images']
|
74
|
+
img = rel['images'].select {|i| i['type'] == 'primary'}.first ||
|
75
|
+
rel['images'].first
|
76
|
+
img['uri']
|
71
77
|
end
|
72
78
|
|
73
79
|
# Construct position list from tracks filter
|
@@ -92,27 +98,50 @@ end
|
|
92
98
|
|
93
99
|
# Make a sane format string also using format description
|
94
100
|
def mkformat format
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
101
|
+
f = []
|
102
|
+
# Ignore in favor of LP/EP/7"/12" descriptions
|
103
|
+
unless format['name'] == "Vinyl"
|
104
|
+
f << format['name']
|
99
105
|
end
|
106
|
+
if format['descriptions']
|
107
|
+
# Too general
|
108
|
+
format['descriptions'].delete "Album"
|
109
|
+
unless format['descriptions'].empty?
|
110
|
+
f << format['descriptions'].first
|
111
|
+
end
|
112
|
+
end
|
113
|
+
f.join ' '
|
100
114
|
end
|
101
115
|
|
102
116
|
# Shorten certain common words that appear in format strings
|
103
117
|
def mkshort n
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
118
|
+
ft = {
|
119
|
+
'Cassette' => 'Cass',
|
120
|
+
'12"' => '12inch',
|
121
|
+
'7"' => '7inch',
|
122
|
+
'Mini-Album' => 'MiniAlbum',
|
123
|
+
'Maxi-Single' => 'Maxi',
|
124
|
+
'Picture Disc' => 'Pic',
|
125
|
+
'Flexi-disc' => 'Flexi',
|
126
|
+
'Reissue' => 'RE',
|
127
|
+
'Remaster' => 'RM',
|
128
|
+
'Repress' => 'RP',
|
129
|
+
'Mispress' => 'MP',
|
130
|
+
'Test Pressing' => 'TP',
|
131
|
+
'Enhanced' => 'Enh',
|
132
|
+
'Digipak ' => 'Dig',
|
133
|
+
'Box Set' => 'Box',
|
134
|
+
'Limited Edition' => 'Ltd',
|
135
|
+
'Club Edition' => 'Club',
|
136
|
+
'Compilation' => 'Comp',
|
137
|
+
'Sampler' => 'Smplr',
|
138
|
+
'Numbered' => 'Num',
|
139
|
+
'Unofficial Release' => 'Unofficial',
|
140
|
+
'Single Sided' => 'S/Sided',
|
141
|
+
}
|
142
|
+
# Note that prefix substitution is broken
|
143
|
+
ftre = /(#{ft.keys.join('|')})/
|
144
|
+
n.gsub(ftre, ft)
|
116
145
|
end
|
117
146
|
|
118
147
|
# Parse command line
|
@@ -182,38 +211,41 @@ if cmd == 'load' then
|
|
182
211
|
else
|
183
212
|
# Get release data from Discogs
|
184
213
|
puts "Geting release data..."
|
185
|
-
|
186
|
-
|
187
|
-
mr = if r
|
214
|
+
r = YAML.load(open("http://api.discogs.com/release/#{relid}?f=json",
|
215
|
+
Headers))['resp']['release']
|
216
|
+
mr = if r['master_id'] then
|
217
|
+
YAML.load(open("http://api.discogs.com/master/#{r['master_id']}?f=json",
|
218
|
+
Headers))['resp']['master']
|
219
|
+
end
|
188
220
|
# Tracklist can contain dummy header tracks, strip them
|
189
|
-
tl = r
|
221
|
+
tl = r['tracklist'].select {|t| t['position']}
|
190
222
|
# Apply tracks filter if given
|
191
223
|
if tracks then
|
192
224
|
pl = mkposlist tracks
|
193
225
|
puts "Invalid tracks filter: #{tracks}" unless pl
|
194
|
-
tl = tl.select {|t| pl.include? t
|
226
|
+
tl = tl.select {|t| pl.include? t['position']}
|
195
227
|
end
|
196
228
|
# Gather release-wide data
|
197
229
|
rel = {}
|
198
|
-
rel['artist'] = mkartist r
|
199
|
-
rel['album'] = r
|
200
|
-
rel['year'] = r
|
201
|
-
rel['masteryear'] = if mr then mr
|
230
|
+
rel['artist'] = mkartist r['artists']
|
231
|
+
rel['album'] = r['title']
|
232
|
+
rel['year'] = r['released']
|
233
|
+
rel['masteryear'] = if mr then mr['year'] end || r['released']
|
202
234
|
# Year can be full-date so keep only the year part
|
203
|
-
rel['year'] = rel['year'].slice(0..3)
|
204
|
-
rel['masteryear'] = rel['masteryear'].slice(0..3)
|
205
|
-
rel['genre'] = if r
|
206
|
-
if r
|
207
|
-
rel['format'] = mkformat r
|
208
|
-
rel['comment'] = "Discogs: #{r
|
235
|
+
rel['year'] = rel['year'].to_s.slice(0..3).to_i
|
236
|
+
rel['masteryear'] = rel['masteryear'].to_s.slice(0..3).to_i
|
237
|
+
rel['genre'] = if r['styles'] then r['styles'].first end ||
|
238
|
+
if r['genres'] then r['genres'].first end
|
239
|
+
rel['format'] = mkformat r['formats'].first
|
240
|
+
rel['comment'] = "Discogs: #{r['id']}"
|
209
241
|
rel['imgurl'] = getimgurl r
|
210
242
|
rel['tracklist'] = []
|
211
243
|
# Populate tracklist
|
212
244
|
tl.each do |s|
|
213
245
|
trk = {}
|
214
|
-
trk['pos'] = s
|
215
|
-
trk['artist'] = mkartist s
|
216
|
-
trk['title'] = s
|
246
|
+
trk['pos'] = s['position']
|
247
|
+
trk['artist'] = mkartist s['artists'] if s['artists']
|
248
|
+
trk['title'] = s['title']
|
217
249
|
rel['tracklist'] << trk
|
218
250
|
end
|
219
251
|
end
|
@@ -285,7 +317,7 @@ fl.each do |ofname|
|
|
285
317
|
f.tag.album = b
|
286
318
|
f.tag.title = t
|
287
319
|
f.tag.track = tn
|
288
|
-
f.tag.year = y
|
320
|
+
f.tag.year = y
|
289
321
|
f.tag.genre = g
|
290
322
|
f.tag.comment = c
|
291
323
|
f.save
|
@@ -299,7 +331,7 @@ imgname = eval cfg['image']
|
|
299
331
|
if rel['imgurl'] then
|
300
332
|
puts "Save cover to #{imgname}"
|
301
333
|
unless fake
|
302
|
-
img = open(rel['imgurl'],
|
334
|
+
img = open(rel['imgurl'], Headers).read
|
303
335
|
File.open(imgname, 'wb').write img
|
304
336
|
end
|
305
337
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: musicfix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lazaros Koromilas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: discogs-wrapper
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: stringex
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -63,7 +49,8 @@ files:
|
|
63
49
|
- bin/musicfix
|
64
50
|
- README
|
65
51
|
- LICENSE
|
66
|
-
|
52
|
+
- CHANGELOG
|
53
|
+
homepage: http://www.2f30.org/~lostd/musicfix/
|
67
54
|
licenses:
|
68
55
|
- BSD
|
69
56
|
metadata: {}
|