got_mp3 0.1.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/got_mp3.rb +235 -16
- data.tar.gz.sig +0 -0
- metadata +4 -4
- metadata.gz.sig +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44c046df30aa09ee8f417c5151a511c16a55758cb324b64c9b8bb376f68b14ac
|
4
|
+
data.tar.gz: d6b18ee2753e965126a74218816625f48c36bdb09ca3b0b91b822236934f4158
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b8136cf7e4e913de207514afbe0c24295e95a18131c64aa49c57a5ce8c554cb9411ac638626c840aa3a0653f01391fd7e43f5d1aabafc0c090521a7dd58cffa
|
7
|
+
data.tar.gz: db25f65976be5cccda5a2ef7a56a194ae08577c56e916fdcd368de15cc8a5b70e563e6e5792ce7179a4f70a0df1fdc5074e6bb334636257b9f6590500c15aa79
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/got_mp3.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
# file: got_mp3.rb
|
4
4
|
|
5
|
+
require 'ostruct'
|
5
6
|
require "mp3info"
|
6
7
|
|
7
8
|
|
@@ -21,6 +22,8 @@ class GotMP3
|
|
21
22
|
def add_jpg()
|
22
23
|
|
23
24
|
find_by_ext('.jpg').each do |directory, img_filename|
|
25
|
+
|
26
|
+
puts 'add_jpg to directory: ' + directory.inspect if @debug
|
24
27
|
add_image directory, img_filename
|
25
28
|
end
|
26
29
|
|
@@ -40,8 +43,160 @@ class GotMP3
|
|
40
43
|
|
41
44
|
end
|
42
45
|
|
43
|
-
#
|
44
|
-
#
|
46
|
+
# copy all MP3 directories through the category file-directory stucture
|
47
|
+
#
|
48
|
+
def compile(source_directory: '', target_directory: '')
|
49
|
+
|
50
|
+
raise 'target_directory cannot be empty' if target_directory.empty?
|
51
|
+
|
52
|
+
find_by_ext('.txt').each do |directory, _ |
|
53
|
+
|
54
|
+
Dir[File.join(directory, '*.txt')].each do |txt_filename|
|
55
|
+
|
56
|
+
album = File.join(source_directory,
|
57
|
+
File.basename(txt_filename).sub(/\.txt$/,''))
|
58
|
+
library_dir = File.join(target_directory, File.basename(directory))
|
59
|
+
FileUtils.mkdir_p library_dir
|
60
|
+
|
61
|
+
if @debug then
|
62
|
+
puts 'copying from:' + album.inspect
|
63
|
+
puts 'copying to: ' + library_dir.inspect
|
64
|
+
end
|
65
|
+
|
66
|
+
puts 'copying ' + album + ' ...'
|
67
|
+
FileUtils.cp_r album, library_dir, remove_destination: true
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def consolidate_txt(target_directory: '')
|
75
|
+
|
76
|
+
raise 'target_directory cannot be empty' if target_directory.empty?
|
77
|
+
|
78
|
+
find_by_ext('.mp3').each do |directory, _ |
|
79
|
+
|
80
|
+
puts 'write_titles() - directory: ' + directory.inspect if @debug
|
81
|
+
txt_filename = Dir[File.join(directory, '*.txt')].first
|
82
|
+
|
83
|
+
next unless txt_filename
|
84
|
+
|
85
|
+
target_file = File.basename(directory)
|
86
|
+
|
87
|
+
FileUtils.cp txt_filename, File.join(target_directory,
|
88
|
+
target_file + '.txt')
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def each_mp3_file(directory='.', &blk)
|
95
|
+
|
96
|
+
puts 'each_mp3 - directory: ' + directory.inspect if @debug
|
97
|
+
found = Dir[File.join(directory, "*.mp3")].sort_by { |x| File.mtime(x) }
|
98
|
+
puts 'each_mp3 - found: ' + found.inspect if @debug
|
99
|
+
|
100
|
+
found.reverse.each.with_index do |mp3_filepath, i|
|
101
|
+
|
102
|
+
puts 'each_mp3 - mp3_filepath: ' + mp3_filepath.inspect if @debug
|
103
|
+
|
104
|
+
next unless File.exists? mp3_filepath
|
105
|
+
|
106
|
+
blk.call(mp3_filepath, i )
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
# Adds the album art, track title, renames the MP3 file, and adds a playlist
|
113
|
+
#
|
114
|
+
def go()
|
115
|
+
|
116
|
+
find_by_ext('.mp3').each do |directory, _ |
|
117
|
+
|
118
|
+
# find the image file
|
119
|
+
img_filename = Dir[File.join(directory, '*.jpg')].first
|
120
|
+
puts 'img_filename: ' + img_filename.inspect if @debug
|
121
|
+
|
122
|
+
# find the text file
|
123
|
+
txt_filename = Dir[File.join(directory, '*.txt')].first
|
124
|
+
next unless txt_filename
|
125
|
+
|
126
|
+
add_image_and_titles(directory, img_filename, txt_filename)
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
# rename 1 or more mp3 files within 1 or more file directories
|
133
|
+
#
|
134
|
+
# example usage:
|
135
|
+
# rename() {|mp3file| mp3files.sub(/Disc \d - /,'')}
|
136
|
+
# rename() {|mp3file| mp3file.sub(/Disc \d - (\d+) - /,'\1. ')}
|
137
|
+
#
|
138
|
+
def rename()
|
139
|
+
|
140
|
+
each_mp3_file do |mp3_filepath|
|
141
|
+
|
142
|
+
mp3_directory = File.dirname(mp3_filepath)
|
143
|
+
mp3_filename = File.basename(mp3_filepath)
|
144
|
+
|
145
|
+
newname = yield(mp3_filename)
|
146
|
+
File.rename(mp3_filepath, File.join(mp3_directory, newname))
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
def write_titles()
|
153
|
+
|
154
|
+
puts 'inside write_titles()' if @debug
|
155
|
+
|
156
|
+
find_by_ext('.mp3').each do |directory, _ |
|
157
|
+
|
158
|
+
puts 'write_titles() - directory: ' + directory.inspect if @debug
|
159
|
+
txt_filename = Dir[File.join(directory, '*.txt')].first
|
160
|
+
|
161
|
+
next if txt_filename
|
162
|
+
|
163
|
+
tracks = []
|
164
|
+
|
165
|
+
each_mp3_track(directory) do |mp3, trackno, mp3_filepath|
|
166
|
+
|
167
|
+
tracks << OpenStruct.new({
|
168
|
+
title: mp3.tag.title,
|
169
|
+
artist: mp3.tag.artist,
|
170
|
+
album: mp3.tag.album,
|
171
|
+
album_artist: mp3.tag2['TPE2'],
|
172
|
+
disc: mp3.tag2['TPOS'],
|
173
|
+
tracknum: mp3.tag.tracknum,
|
174
|
+
filename: File.basename(mp3_filepath)
|
175
|
+
})
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
heading = tracks[0].album_artist + ' - ' + tracks[0].album
|
180
|
+
s = "# %s\n\n" % [heading]
|
181
|
+
h = tracks.group_by(&:disc)
|
182
|
+
|
183
|
+
body = if h.length == 1 then
|
184
|
+
|
185
|
+
list(tracks)
|
186
|
+
|
187
|
+
else
|
188
|
+
|
189
|
+
"\n" + h.map do |disc, tracks2|
|
190
|
+
("## Disc %d\n\n" % disc) + list(tracks2) + "\n\n"
|
191
|
+
end.join("\n")
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
File.write File.join(directory, heading + '.txt'), s + body
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
45
200
|
|
46
201
|
private
|
47
202
|
|
@@ -49,10 +204,12 @@ class GotMP3
|
|
49
204
|
#
|
50
205
|
def add_image(directory, img_filename)
|
51
206
|
|
207
|
+
puts 'inside add_image - directory: ' + directory.inspect if @debug
|
208
|
+
puts 'img_filename: ' + img_filename.inspect if @debug
|
52
209
|
image_file = File.new(File.join(directory, img_filename),'rb')
|
53
210
|
img = image_file.read
|
54
211
|
|
55
|
-
|
212
|
+
each_mp3_track(directory) do |mp3, _, _|
|
56
213
|
|
57
214
|
mp3.tag2.remove_pictures
|
58
215
|
mp3.tag2.add_picture img
|
@@ -66,40 +223,49 @@ class GotMP3
|
|
66
223
|
txt_file = File.join(directory, txt_filename)
|
67
224
|
track_titles = File.read(txt_file).lines[1..-1].map(&:strip)
|
68
225
|
|
69
|
-
|
226
|
+
each_mp3_track(directory) do |mp3, trackno, _|
|
70
227
|
|
71
228
|
mp3.tag.title = track_titles[trackno-1]
|
72
229
|
|
73
230
|
end
|
74
231
|
end
|
75
232
|
|
76
|
-
def add_image_and_titles(directory,
|
233
|
+
def add_image_and_titles(directory, img_file, txt_file)
|
77
234
|
|
78
|
-
|
79
|
-
|
235
|
+
if img_file then
|
236
|
+
img = File.new(img_file,'rb').read
|
237
|
+
end
|
80
238
|
|
81
|
-
txt_file = File.join(directory, txt_filename)
|
82
239
|
track_titles = File.read(txt_file).lines[1..-1].map(&:strip)
|
83
240
|
|
241
|
+
titles_mp3 = track_titles.map do |title|
|
242
|
+
title[/^[^\/]+/].gsub(/:/,'_').rstrip + '.mp3'
|
243
|
+
end
|
244
|
+
|
84
245
|
found = Dir[File.join(directory, "*.mp3")].sort_by { |x| File.mtime(x) }
|
85
246
|
found.each.with_index do |mp3_filepath, i|
|
86
247
|
|
87
248
|
Mp3Info.open(mp3_filepath) do |mp3|
|
88
|
-
|
89
|
-
|
90
|
-
|
249
|
+
|
250
|
+
if img_file then
|
251
|
+
mp3.tag2.remove_pictures
|
252
|
+
mp3.tag2.add_picture img
|
253
|
+
end
|
254
|
+
|
255
|
+
mp3.tag.title = track_titles[i]
|
91
256
|
end
|
92
257
|
|
93
|
-
File.rename(mp3_filepath, File.join(directory,
|
94
|
-
|
258
|
+
File.rename(mp3_filepath, File.join(directory, titles_mp3[i]))
|
259
|
+
|
95
260
|
end
|
96
261
|
|
262
|
+
File.write File.join(directory, 'playlist.m3u'), titles_mp3.join("\n")
|
263
|
+
|
97
264
|
end
|
98
265
|
|
99
|
-
def
|
266
|
+
def each_mp3_track(directory, &blk)
|
100
267
|
|
101
|
-
|
102
|
-
found.each.with_index do |mp3_filepath, i|
|
268
|
+
each_mp3_file(directory) do |mp3_filepath, i|
|
103
269
|
|
104
270
|
Mp3Info.open(mp3_filepath) {|mp3| blk.call(mp3, i+1, mp3_filepath) }
|
105
271
|
|
@@ -109,6 +275,7 @@ class GotMP3
|
|
109
275
|
|
110
276
|
def find_by_ext(extension)
|
111
277
|
|
278
|
+
puts 'find_by_ext() - @dir' + @dir.inspect if @debug
|
112
279
|
a = Dir[File.join(@dir, "**", "*" + extension)]
|
113
280
|
puts 'a: ' + a.inspect if @debug
|
114
281
|
|
@@ -120,4 +287,56 @@ class GotMP3
|
|
120
287
|
end
|
121
288
|
end
|
122
289
|
|
290
|
+
def list(tracks)
|
291
|
+
|
292
|
+
a = if tracks.map(&:artist).uniq.length < 2 then
|
293
|
+
tracks.map {|x| "%02d. %s" % [x.tracknum, x.title] }
|
294
|
+
else
|
295
|
+
tracks.map {|x| "%02d. %s - %s" % [x.tracknum, x.title, x.artist] }
|
296
|
+
end
|
297
|
+
|
298
|
+
a.join("\n")
|
299
|
+
|
300
|
+
end
|
301
|
+
|
302
|
+
end
|
303
|
+
|
304
|
+
class Titles
|
305
|
+
|
306
|
+
def initialize(filename, target_directory: 'titles')
|
307
|
+
@titles = File.read filename
|
308
|
+
@target_directory = target_directory
|
309
|
+
end
|
310
|
+
|
311
|
+
def titleize()
|
312
|
+
@titles.gsub(/[\w']+/) {|x| x[0].upcase + x[1..-1]}
|
313
|
+
end
|
314
|
+
|
315
|
+
def titleize!()
|
316
|
+
@titles.gsub!(/[\w']+/) {|x| x[0].upcase + x[1..-1]}
|
317
|
+
end
|
318
|
+
|
319
|
+
def split(target_directory: @target_directory)
|
320
|
+
|
321
|
+
FileUtils.mkdir_p @target_directory
|
322
|
+
a = @titles.strip.split(/(?=^#)/)
|
323
|
+
|
324
|
+
a.each do |x|
|
325
|
+
|
326
|
+
filename = x.lines.first.chomp[/(?<=# cd ).*/i].strip + '.txt'
|
327
|
+
puts 'processing file ' + filename.inspect
|
328
|
+
heading = x.lstrip.lines.first
|
329
|
+
|
330
|
+
tracks = x.strip.lines[1..-1].map.with_index do |line, i|
|
331
|
+
"%02d. %s" % [i+1, line]
|
332
|
+
end
|
333
|
+
|
334
|
+
File.write File.join(target_directory, filename), heading + tracks.join
|
335
|
+
|
336
|
+
end
|
337
|
+
|
338
|
+
puts 'split done'
|
339
|
+
|
340
|
+
end
|
341
|
+
|
123
342
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: got_mp3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
RFrZsrDO1Cwk4v03qCUvuZ8H/nCojYYJGMrJE1JhBBJNJXCAULivh/zlOYcDhG69
|
36
36
|
uPtZOD7YKrG45OftX8aNxlNv
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2021-11-
|
38
|
+
date: 2021-11-26 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: ruby-mp3info
|
@@ -87,6 +87,6 @@ rubyforge_project:
|
|
87
87
|
rubygems_version: 2.7.10
|
88
88
|
signing_key:
|
89
89
|
specification_version: 4
|
90
|
-
summary: A ruby-mp3info wrapper to make it convenient to update the
|
91
|
-
MP3 files
|
90
|
+
summary: A ruby-mp3info wrapper to make it convenient to update the album art and
|
91
|
+
track titles of multiple MP3 files in a batch process.
|
92
92
|
test_files: []
|
metadata.gz.sig
CHANGED
@@ -1 +1,4 @@
|
|
1
|
-
|
1
|
+
|?:��/�����uư;����N*f�%Z��.�8=��5V�ȥ̸1����#d�h�6��3@��h��<�F����&I?���S�6��Y{O�y~����J1pT-�`
|
2
|
+
������gk���!���(^;V8�[k��2��5V~W�+G�>mFO��38�)w�}�Pyb���\�R�#��biR۫��.G6?>���"���
|
3
|
+
! SfP�xўd$�$T�d
|
4
|
+
֗\�A��R?%�{���]q7٨���h�ݲA�|*p�8�7IM�$M�uҮ̧.�.�M�t�;7i��"-��[�����
|