mediafile 0.1.8 → 0.1.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0ac9d9cb6df74d620341c0410167100c8ab9bb9
4
- data.tar.gz: 21b7b5e10a2dbffea4222758f48ce2176e36e117
3
+ metadata.gz: 334aef8d37ba538e00245a02dc3aefafd60b4b3c
4
+ data.tar.gz: 4f8de891ef857224aced4f20d4ff9b7cb329ae7e
5
5
  SHA512:
6
- metadata.gz: fea4af286c2c6ffe85078a0d8064742baf58229c3c179f177eaed5151f5fe3e8eccdda321b081525f3f0ddb7e9453740c2ca9a5676d3a1e292b5ae4c2d48ee63
7
- data.tar.gz: 894d6b89e8b32ebd7e34a7dc336579e7e209fff6381d2ed5b34b5c3acede6b6dbf5baba06600620095990da235de2000113bb10545440f692077d901479a7af0
6
+ metadata.gz: 53186aae0f9fd1b468a9f2b1fdf8dbae02017e4a59fe7897acc3bd438074b4c6bf76fae29ae872936a9fb7d5465e4d1307b6b73e21942b1c80917019e1ed0da3
7
+ data.tar.gz: 169efd96844d7d386f72834407ea8f5e4daee2708fdb939d1d2d873133981fe9eacb9c638211eded3828d5176ac7624349dc7ab30cbd980bb24632391979203a
data/bin/music_cp CHANGED
@@ -4,91 +4,106 @@
4
4
 
5
5
  require 'optparse'
6
6
  require 'mediafile'
7
-
8
- PROGNAME = File.basename($0)
7
+ require 'English'
9
8
 
10
9
  def die(msg)
11
- abort "#{PROGNAME}: #{msg}"
10
+ abort "#{$PROGRAM_NAME}: #{msg}"
12
11
  end
13
12
 
14
- kill = me = now = false
13
+ kill = false
14
+ me = false
15
15
  files = []
16
16
  opt_files = {
17
17
  flat: [],
18
18
  recurse: []
19
19
  }
20
- dest = "."
20
+ dest = '.'
21
21
  verbose = false
22
22
  debug = false
23
23
  progress = true
24
- count = `grep -c '^processor' /proc/cpuinfo`.strip.to_i/2|1
24
+ count = `grep -c '^processor' /proc/cpuinfo`.strip.to_i / 2 | 1
25
25
  transcode = { flac: :mp3, wav: :mp3 }
26
26
  exclude_patterns = []
27
27
  album_artist = nil
28
- file_types = "{flac,mp3,MP3,FLAC,wav,WAV,m4a,M4A}"
28
+ file_types = '{flac,mp3,MP3,FLAC,wav,WAV,m4a,M4A}'
29
29
  yes = nil
30
30
 
31
31
  opts = OptionParser.new do |opt|
32
-
33
- opt.on("-f", "--file FILE|DIR", "File or directory to copy.",
34
- "If given a directory, will grab all files within non-recursively") do |e|
32
+ opt.on('-f', '--file FILE|DIR', 'File or directory to copy.',
33
+ 'If given a directory, will grab all files' \
34
+ 'within non-recursively') do |e|
35
35
  opt_files[:flat].concat e.split(',')
36
36
  end
37
- opt.on("-r", "--recursive DIR", "Directory to recursively scan and copy") do |r|
37
+ opt.on('-r', '--recursive DIR',
38
+ 'Directory to recursively scan and copy') do |r|
38
39
  opt_files[:recurse].concat r.split(',')
39
40
  end
40
- opt.on("-d", "--destination PATH", "Where to copy file to. Default: '#{dest}'",
41
- "Will be created if it doesn't exist.") do |d|
41
+ opt.on('-d', '--destination PATH', 'Where to copy file to. '\
42
+ "Default: '#{dest}'",
43
+ 'Will be created if it doesn\'t exist.') do |d|
42
44
  dest = d
43
45
  end
44
- opt.on("--transcode <from=to[,from1=to1]>", "A comma-seperated series of name=value pairs.",
45
- "Default is #{transcode.to_a.map{|i| i.join("=")}.join(",")}") do |fmt|
46
+ opt.on('--transcode <from=to[,from1=to1]>',
47
+ 'A comma-seperated series of name=value pairs.',
48
+ 'Default is ' \
49
+ "#{transcode.to_a.map { |i| i.join('=') }.join(',')}}") do |fmt|
46
50
  kill = true
47
- transcode = Hash[ *fmt.split(",").map{|e| e.split("=").map{ |t| t.downcase.to_sym } }.flatten ]
51
+ transcode = Hash[*fmt.split(',').map do |e|
52
+ e.split('=').map do |t|
53
+ t.downcase.to_sym
54
+ end
55
+ end.flatten]
48
56
  end
49
- opt.on("-c", "--copy", "Turn off transcoding.") do
57
+ opt.on('-c', '--copy', 'Turn off transcoding.') do
50
58
  transcode = {}
51
59
  me = true
52
60
  end
53
- opt.on("--[no-]progress", "Set show progress true/false. Default is #{progress}") do |t|
61
+ opt.on('--[no-]progress',
62
+ "Set show progress true/false. Default is #{progress}") do |t|
54
63
  progress = t
55
64
  end
56
- opt.on("--exclude PATTERN", "-x PATTERN", String, "Exclude files that match the given pattern.",
57
- "Can specify more than once, file is excluded if any pattern matches") do |p|
65
+ opt.on('--exclude PATTERN', '-x PATTERN', String,
66
+ 'Exclude files that match the given pattern.',
67
+ 'Can specify more than once, file is excluded' \
68
+ 'if any pattern matches') do |p|
58
69
  exclude_patterns.concat p.split(',')
59
70
  end
60
- opt.on("-v", "--[no-]verbose", "Be verbose") do |v|
71
+ opt.on('-v', '--[no-]verbose', 'Be verbose') do |v|
61
72
  verbose = v
62
73
  end
63
- opt.on("--debug", "Show debug output. Also enables verbose.") do
74
+ opt.on('--debug', 'Show debug output. Also enables verbose.') do
64
75
  debug = true
65
76
  verbose = true
66
77
  end
67
- opt.on("-t", "--threads NUM",
68
- "Number of threads to spawn, useful for transcoding. Default: #{count}" ) do |n|
78
+ opt.on('-t', '--threads NUM',
79
+ 'Number of threads to spawn, useful for transcoding.',
80
+ "Default: #{count}") do |n|
69
81
  count = n.to_i
70
82
  end
71
- opt.on("--set-aa ALBUM_ARTIST", String, "Set the album_artist for all tracks") do |a|
83
+ opt.on('--set-aa ALBUM_ARTIST', String,
84
+ 'Set the album_artist for all tracks') do |a|
72
85
  album_artist = a
73
86
  end
74
- opt.on("-V", "--version", "Disply the version and exit") do
87
+ opt.on('-V', '--version', 'Disply the version and exit') do
75
88
  puts MediaFile::VERSION
76
89
  exit 0
77
90
  end
78
- opt.on("-y", "--yes", "Don't ask before running.") do
79
- yes = "yes"
91
+ opt.on('-y', '--yes', 'Don\'t ask before running.') do
92
+ yes = 'yes'
80
93
  end
81
- opt.on_tail("-h", "--help", "Show this message") do
94
+ opt.on_tail('-h', '--help', 'Show this message') do
82
95
  warn opt
83
96
  exit
84
97
  end
85
98
  begin
86
99
  opt.parse!
87
- if kill and me
88
- raise OptionParser::InvalidOption.new("--copy and --transcode are conflicting")
100
+ if kill && me
101
+ raise OptionParser::InvalidOption.new(
102
+ '--copy and --transcode are conflicting'
103
+ ), 'Argument Eror'
89
104
  end
90
105
  rescue OptionParser::InvalidOption
91
- warn "#{PROGNAME}: #{$!}"
106
+ warn "#{PROGNAME}: #{$ERROR_INFO}"
92
107
  die opt
93
108
  end
94
109
  end
@@ -98,7 +113,7 @@ opt_files[:flat].each do |f|
98
113
  if File.file? f
99
114
  files << f
100
115
  elsif File.directory? f
101
- files.concat Dir.glob( f + "/*.#{file_types}")
116
+ files.concat Dir.glob(f + "/*.#{file_types}")
102
117
  else
103
118
  warn "#{f} is not a file or a directory!"
104
119
  end
@@ -106,8 +121,8 @@ end
106
121
 
107
122
  # resolve recurse dirs
108
123
  opt_files[:recurse].each do |r|
109
- if File.directory? r
110
- files.concat Dir.glob( r + "/**/*.#{file_types}")
124
+ if File.directory? r
125
+ files.concat Dir.glob(r + "/**/*.#{file_types}")
111
126
  else
112
127
  warn "#{r} is not a file or a directory!"
113
128
  end
@@ -115,36 +130,33 @@ end
115
130
 
116
131
  files = files.uniq.sort
117
132
  if exclude_patterns.any?
118
- is_a_regexp = /\/?(.+?)(?:\/([imxouesn]*))?$/
133
+ is_a_regexp = %r{\/?(.+?)(?:\/([imxouesn]*))?$}
119
134
  pattern = Regexp.union(
120
- exclude_patterns.map{ |pat|
135
+ exclude_patterns.map do |pat|
121
136
  m = pat.match(is_a_regexp)
122
- if m
123
- Regexp.new(*m.captures)
124
- else
125
- raise "Bag pattern: '#{pat}'"
126
- end
127
- }.compact
137
+ raise "Bag pattern: '#{pat}'" unless m
138
+ Regexp.new(*m.captures)
139
+ end.compact
128
140
  )
129
141
  puts "Using exclude pattern: #{pattern}" if verbose
130
142
  files.delete_if { |el| pattern.match el }
131
143
  end
132
144
 
133
145
  if files.empty?
134
- warn "No file specified, exiting"
146
+ warn 'No file specified, exiting.'
135
147
  warn "Perhaps you excluded too many? '#{pattern}'" if exclude_patterns.any?
136
148
  warn opts
137
149
  exit
138
150
  end
139
151
  puts "Full list of files to transfer to #{dest}:"
140
- files.each { |l| puts "\t"+l }
152
+ files.each { |l| puts "\t" + l }
141
153
  puts "#{files.count} files total"
142
- puts "The following transcode table will be used:"
154
+ puts 'The following transcode table will be used:'
143
155
  puts transcode.any? ? transcode : 'none'
144
- puts "Do you wish to proceed? (Y/n)"
156
+ puts 'Do you wish to proceed? (Y/n)'
145
157
  y = yes || gets
146
- if /n/i.match(y)
147
- puts "User cancel."
158
+ if y =~ /n/i
159
+ puts 'User cancel.'
148
160
  exit
149
161
  end
150
162
  puts "Begin copy to #{dest}"
@@ -160,4 +172,4 @@ copier = MediaFile::BulkMediaCopy.new(
160
172
 
161
173
  copier.run count
162
174
 
163
- puts "Complete."
175
+ puts 'Complete.'
@@ -1,7 +1,8 @@
1
1
  # vim:et sw=2 ts=2
2
2
 
3
3
  require 'mediafile'
4
- module MediaFile; class BulkMediaCopy
4
+ module MediaFile;
5
+ class BulkMediaCopy
5
6
  include ::MediaFile
6
7
  def initialize(source,
7
8
  album_artist: nil,
@@ -9,19 +10,23 @@ module MediaFile; class BulkMediaCopy
9
10
  progress: false,
10
11
  transcode: {},
11
12
  verbose: false,
12
- debug: false)
13
- source = case source
13
+ debug: false
14
+ )
15
+ source =
16
+ case source
14
17
  when String
15
18
  [source]
16
19
  when Array
17
20
  source
18
21
  else
19
- raise "Bad value for required first arg 'source': '#{source.class}'. Should be String or Array."
22
+ raise "Bad value for required first arg 'source': '#{source.class}'. " \
23
+ 'Should be String or Array.'
20
24
  end
21
25
 
22
26
  @copies = Hash.new { |h,k| h[k] = [] }
23
27
  @destination_root = destination_root
24
28
  @verbose = verbose
29
+ @debug = debug
25
30
  @progress = progress
26
31
  @album_artist = album_artist
27
32
  @work = get_work(source)
@@ -33,6 +38,8 @@ module MediaFile; class BulkMediaCopy
33
38
  end
34
39
 
35
40
  def run(max=4)
41
+ start = Time.new
42
+ debug "Call run with max => '#{max}'"
36
43
  puts "%#{@width + 8}s, %#{@width + 8}s,%#{@width + 8}s, %-#{@name_width}s => Destination Path" % [
37
44
  "Remaining",
38
45
  "Workers",
@@ -46,7 +53,11 @@ module MediaFile; class BulkMediaCopy
46
53
  0
47
54
  ]
48
55
  max > 1 ? mcopy(max) : scopy
49
- dupes = @copies.select{ |k,a| a.size > 1 }
56
+ stop = Time.new
57
+ duration = stop - start
58
+ puts "Copied #{@count} files in #{ "%d:%d:%d:%d" % duration.to_duration} " +
59
+ "(~#{(@count/duration).to_i} songs/second))."
60
+ dupes = @copies.select{ |_k,a| a.size > 1 }
50
61
  if dupes.any?
51
62
  puts "dupes"
52
63
  require 'pp'
@@ -106,7 +117,7 @@ module MediaFile; class BulkMediaCopy
106
117
  err = false
107
118
  begin
108
119
  mediafile.copy transcode_table: @transcode
109
- rescue Timeout::Error
120
+ rescue
110
121
  @failed << mediafile
111
122
  err = true
112
123
  end
@@ -121,18 +132,21 @@ module MediaFile; class BulkMediaCopy
121
132
  c = cur_perc == 100
122
133
  finished = @count.to_f / @work.count * 100
123
134
  f = finished == 100.0
124
- puts ("%#{@width}d (%4.1f%%), %#{@width}d (%4.#{c ? 0 : 1}f%%), " +
125
- "%#{@width}d (%4.#{f ? 0 : 1}f%%) %-#{@name_width}s => %-s") % [
135
+ print "%#{@width}d (%4.1f%%), %#{@width}d (%4.#{c ? 0 : 1}f%%), " \
136
+ "%#{@width}d (%4.#{f ? 0 : 1}f%%) :: %-s\n source file => %-s\n " \
137
+ "destination => %-s\n" % [
126
138
  left,
127
139
  left_perc,
128
140
  cur,
129
141
  cur_perc,
130
142
  @count,
131
143
  finished,
132
- (mediafile.name + (err ? " **" : "") ),
144
+ (@transcode[mediafile.type].nil? ? '*copy*' : '*transcode*'),
145
+ (mediafile.source + (err ? " **" : "") ),
133
146
  mediafile.out_path(transcode_table:@transcode)
134
147
  ]
135
148
  end
149
+ debug "#{mediafile.type} == #{@transcode[mediafile.type]}"
136
150
  }
137
151
 
138
152
  end
@@ -144,5 +158,6 @@ module MediaFile; class BulkMediaCopy
144
158
  @copies[md5].count == 1
145
159
  end
146
160
 
147
- end; end
161
+ end
162
+ end
148
163
 
@@ -1,7 +1,9 @@
1
1
  # vim:et sw=2 ts=2
2
2
 
3
3
  require 'mediafile'
4
- module MediaFile; class MediaFile
4
+
5
+ module MediaFile
6
+ class MediaFile
5
7
  include ::MediaFile
6
8
 
7
9
  attr_reader :source, :type, :name, :base_dir
@@ -37,13 +39,14 @@ module MediaFile; class MediaFile
37
39
  destination = out_path base_dir: dest, transcode_table: transcode_table
38
40
  temp_dest = tmp_path base_dir: dest, transcode_table: transcode_table
39
41
  lock{
40
- if File.exists?(destination)
41
- warn "File has already been transfered #{@source} => #{destination}" if @verbose
42
- return
43
- end
44
- if File.exists?(temp_dest)
42
+ if File.exist?(temp_dest)
45
43
  warn "File transfer is already in progress for #{@source} => #{temp_dest} => #{destination}"
46
44
  warn "This shouldn't happen! Check to make sure it was really copied."
45
+ raise
46
+ #return
47
+ end
48
+ if File.exist?(destination)
49
+ warn "File has already been transfered #{@source} => #{destination}" if @verbose
47
50
  return
48
51
  end
49
52
  FileUtils.mkdir_p File.dirname destination
@@ -55,11 +58,11 @@ module MediaFile; class MediaFile
55
58
  really_copy(@source, temp_dest)
56
59
  FileUtils.mv temp_dest, destination
57
60
  rescue => e
58
- FileUtils.rm temp_dest if File.exists? temp_dest
61
+ FileUtils.rm temp_dest if File.exist? temp_dest
59
62
  raise e
60
63
  end
61
64
  ensure
62
- FileUtils.rm temp_dest if File.exists? temp_dest
65
+ FileUtils.rm temp_dest if File.exist? temp_dest
63
66
  end
64
67
 
65
68
  def to_s
@@ -67,6 +70,7 @@ module MediaFile; class MediaFile
67
70
  end
68
71
 
69
72
  def self.tags(*args)
73
+ private
70
74
  args.each do |arg|
71
75
  define_method arg do
72
76
  read_tags
@@ -75,12 +79,12 @@ module MediaFile; class MediaFile
75
79
  end
76
80
  end
77
81
 
82
+ private
83
+
78
84
  tags :album, :artist, :album_artist,
79
85
  :title, :genre, :year, :track,
80
86
  :comment, :disc_number, :disc_total
81
87
 
82
- private
83
-
84
88
  def really_copy(src,dest)
85
89
  FileUtils.cp(src, dest)
86
90
  set_album_artist(dest)
@@ -105,37 +109,39 @@ module MediaFile; class MediaFile
105
109
 
106
110
  def set_encoder(to,destination)
107
111
  comment = "; Transcoded by MediaFile on #{Time.now}"
108
- case to
109
- when :flac
110
- raise "Please don't transcode to flac. It is broken right now"
111
- %W{flac -7 -V -s -o #{destination}} +
112
- (@artist ? ["-T", "artist=#{@artist}"] : [] ) +
113
- (@title ? ["-T", "title=#{@title}"] : [] ) +
114
- (@album ? ["-T", "album=#{@album}"] : [] ) +
115
- (@track > 0 ? ["-T", "tracknumber=#{@track}"] : [] ) +
116
- (@year ? ["-T", "date=#{@year}"] : [] ) +
117
- (@genre ? ["-T", "genre=#{@genre}"] : [] ) +
118
- ["-T", "comment=" + @comment + comment ] +
119
- (@album_artist ? ["-T", "albumartist=#{@album_artist}"] : [] ) +
120
- (@disc_number ? ["-T", "discnumber=#{@disc_number}"] : [] ) +
121
- ["-"]
122
- when :mp3
123
- %W{lame --quiet --preset extreme -h --add-id3v2 --id3v2-only} +
124
- (@title ? ["--tt", @title] : [] ) +
125
- (@artist ? ["--ta", @artist]: [] ) +
126
- (@album ? ["--tl", @album] : [] ) +
127
- (@track > 0 ? ["--tn", @track.to_s]: [] ) +
128
- (@year ? ["--ty", @year.to_s ] : [] ) +
129
- (@genre ? ["--tg", @genre ]: [] ) +
130
- ["--tc", @comment + comment ] +
131
- (@album_artist ? ["--tv", "TPE2=#{@album_artist}"] : [] ) +
132
- (@disc_number ? ["--tv", "TPOS=#{@disc_number}"] : [] ) +
133
- ["-", destination]
134
- when :wav
135
- %W{dd of=#{destination}}
136
- else
137
- raise "Unknown target '#{to}'. Cannot set encoder"
138
- end
112
+ encoder = case to
113
+ when :flac
114
+ %W{flac -7 -V -s -o #{destination}} +
115
+ (@artist ? ["-T", "artist=#{@artist}"] : [] ) +
116
+ (@title ? ["-T", "title=#{@title}"] : [] ) +
117
+ (@album ? ["-T", "album=#{@album}"] : [] ) +
118
+ (@track > 0 ? ["-T", "tracknumber=#{@track}"] : [] ) +
119
+ (@year ? ["-T", "date=#{@year}"] : [] ) +
120
+ (@genre ? ["-T", "genre=#{@genre}"] : [] ) +
121
+ ["-T", "comment=" + @comment + comment ] +
122
+ (@album_artist ? ["-T", "albumartist=#{@album_artist}"] : [] ) +
123
+ (@disc_number ? ["-T", "discnumber=#{@disc_number}"] : [] ) +
124
+ ["-"]
125
+ #raise "Please don't transcode to flac. It is broken right now"
126
+ when :mp3
127
+ %W{lame --quiet --preset extreme -h --add-id3v2 --id3v2-only} +
128
+ (@title ? ["--tt", @title] : [] ) +
129
+ (@artist ? ["--ta", @artist]: [] ) +
130
+ (@album ? ["--tl", @album] : [] ) +
131
+ (@track > 0 ? ["--tn", @track.to_s]: [] ) +
132
+ (@year ? ["--ty", @year.to_s ] : [] ) +
133
+ (@genre ? ["--tg", @genre ]: [] ) +
134
+ ["--tc", @comment + comment ] +
135
+ (@album_artist ? ["--tv", "TPE2=#{@album_artist}"] : [] ) +
136
+ (@disc_number ? ["--tv", "TPOS=#{@disc_number}"] : [] ) +
137
+ ["-", destination]
138
+ when :wav
139
+ %W{dd of=#{destination}}
140
+ else
141
+ raise "Unknown target '#{to}'. Cannot set encoder."
142
+ end
143
+ debug "Encoder set to '#{encoder}'"
144
+ encoder
139
145
  end
140
146
 
141
147
  def transcode(trans , destination)
@@ -149,7 +155,7 @@ module MediaFile; class MediaFile
149
155
 
150
156
  encoder = set_encoder(to, destination)
151
157
 
152
- safe_print "Decoder: '#{decoder.join(' ')}'\nEncoder: '#{encoder.join(' ')}'" if @verbose
158
+ info "Decoder: '#{decoder.join(' ')}'\nEncoder: '#{encoder.join(' ')}'"
153
159
 
154
160
  pipes = Hash[[:encoder,:decoder].zip IO.pipe]
155
161
  #readable, writeable = IO.pipe
@@ -166,7 +172,7 @@ module MediaFile; class MediaFile
166
172
  sleep 0.2
167
173
  tpids.delete_if do |pid|
168
174
  ret = false
169
- p, stat = Process.wait2 pid, Process::WNOHANG
175
+ _p, stat = Process.wait2 pid, Process::WNOHANG
170
176
  if stat
171
177
  pipes[pids[pid]].close unless pipes[pids[pid]].closed?
172
178
  ret = true
@@ -200,9 +206,10 @@ module MediaFile; class MediaFile
200
206
  def relative_path
201
207
  @relpath ||= (
202
208
  read_tags
203
- dest = File.join(
209
+ File.join(
204
210
  [@album_artist, @album].map { |word|
205
- clean_string(word)
211
+ debug word
212
+ clean_string word
206
213
  }
207
214
  )
208
215
  )
@@ -212,44 +219,45 @@ module MediaFile; class MediaFile
212
219
  # this doesn't include the extension.
213
220
  @newname ||= (
214
221
  read_tags
215
- bool = true
216
- file = clean_string(
222
+ #file = clean_string(
217
223
  case
218
224
  when (@disc_number && (@track > 0) && @title) && !(@disc_total && @disc_total == 1)
219
- "%1d_%02d-" % [@disc_number, @track] + @title
225
+ "%1d_%02d-" % [@disc_number, @track] + clean_string(@title)
220
226
  when (@track > 0 && @title)
221
- "%02d-" % @track + @title
227
+ "%02d-" % @track + clean_string(@title)
222
228
  when @title && @title != ""
223
- @title
229
+ clean_string(@title)
224
230
  else
225
- @name
231
+ clean_string(@name)
226
232
  end
227
- )
233
+ #)
228
234
  )
229
235
  end
230
236
 
231
237
  def clean_string(my_string)
232
238
  my_string ||= ""
233
239
  t = my_string.gsub(
234
- /^\.+|\.+$/,""
235
- ).gsub(
236
- /\//,"_"
240
+ /\.+|\.+$/,""
237
241
  ).gsub(
238
- /\s/,"_"
242
+ /\/+|\s+/, '_'
239
243
  ).gsub(
240
244
  /[,:;)\]\[('"@$^*<>?!=]/,""
241
- ).gsub(
242
- /^[.]/,''
243
245
  ).gsub(
244
246
  /_?[&]_?/,"_and_"
245
247
  ).split('_').map{ |c|
246
- puts "DEBUG: capitalize: '#{c}'" if @debug
247
- "_and_" == c ? c : c.capitalize
248
+ c.split('-').map{ |d|
249
+ next if d[/_/]
250
+ debug("capitalize: '#{d}'")
251
+ d.capitalize
252
+ }.join('-')
248
253
  }.join('_').gsub(
249
- /__+/,'_'
250
- ).gsub(/^[.]/, '')
251
- puts "DEBUG: clean_string: '#{my_string} => '#{t}'" if @debug
254
+ /^[.]/, ''
255
+ ).gsub(
256
+ /_+/, '_'
257
+ )
252
258
  t == "" ? "UNKNOWN" : t
259
+ debug("clean_string: '#{my_string} => '#{t}'")
260
+ t
253
261
  end
254
262
 
255
263
  def tmp_file_name
@@ -265,12 +273,12 @@ module MediaFile; class MediaFile
265
273
  end
266
274
 
267
275
  def set_album_artist(file)
268
- type = file[/(\w+)$/].downcase.to_sym
269
276
  return unless @force_album_artist
270
- case type
277
+ case @type
271
278
  when :m4a
272
279
  TagLib::MP4::File.open(file) do |f|
273
- f.tag.item_list_map.insert("aART", TagLib::MP4::Item.from_string_list([@force_album_artist]))
280
+ f.tag.item_list_map.insert("aART",
281
+ TagLib::MP4::Item.from_string_list([@force_album_artist]))
274
282
  f.save
275
283
  end
276
284
  when :flac
@@ -283,7 +291,8 @@ module MediaFile; class MediaFile
283
291
  end
284
292
  when :mp3
285
293
  TagLib::MPEG::File.open(file) do |f|
286
- if tag = f.id3v2_tag
294
+ tag = f.id3v2_tag
295
+ if tag
287
296
  frame = TagLib::ID3v2::TextIdentificationFrame.new("TPE2", TagLib::String::UTF8)
288
297
  frame.text = @force_album_artist
289
298
  tag.add_frame(frame)
@@ -306,7 +315,7 @@ module MediaFile; class MediaFile
306
315
  f.send(method)
307
316
  end
308
317
  tag.comment = "#{@comment}"
309
- tag.title = (@title || @name.gsub('_',' ')) unless tag.title && tag.title != ""
318
+ tag.title = (@title || @name.tr('_',' ')) unless tag.title && tag.title != ""
310
319
  if (@type == :mp3)
311
320
  f.save(TagLib::MPEG::File::ID3v2)
312
321
  else
@@ -349,7 +358,8 @@ module MediaFile; class MediaFile
349
358
  end
350
359
  when :flac
351
360
  TagLib::FLAC::File.open(@source) do |file|
352
- if tag = file.xiph_comment
361
+ tag = file.xiph_comment
362
+ if tag
353
363
  [
354
364
  [:@album_artist, ['ALBUMARTIST', 'ALBUM ARTIST', 'ALBUM_ARTIST'], :to_s ],
355
365
  [:@disc_number, ['DISCNUMBER'], :to_i ],
@@ -377,9 +387,10 @@ module MediaFile; class MediaFile
377
387
  else
378
388
  @album_artist ||= @artist
379
389
  end
380
- puts "DEBUG: album:'#{@album}', artist:'#{@artist}'" +
381
- " @title:'#{@title}' @genre:'#{@genre}' @year:'#{@year}'" if @debug
390
+ debug("album:'#{@album}', artist:'#{@artist}'" +
391
+ " title:'#{@title}' genre:'#{@genre}' year:'#{@year}'")
382
392
  @red = true
383
393
  end
384
- end; end
394
+ end
395
+ end
385
396
 
@@ -1,3 +1,3 @@
1
1
  module MediaFile
2
- VERSION = "0.1.8" unless defined?(::MediaFile::VERSION)
2
+ VERSION = "0.1.9" unless defined?(::MediaFile::VERSION)
3
3
  end
data/lib/mediafile.rb CHANGED
@@ -12,6 +12,14 @@ module MakeMakefile::Logging
12
12
  @logfile = File::NULL
13
13
  end
14
14
 
15
+ class Numeric
16
+ def to_duration
17
+ [60,60,24].reduce([self.to_i]) do |m,o|
18
+ m.unshift(m.shift.divmod(o)).flatten
19
+ end
20
+ end
21
+ end
22
+
15
23
  module MediaFile
16
24
 
17
25
  autoload :MediaFile, 'mediafile/mediafile.rb'
@@ -27,8 +35,8 @@ module MediaFile
27
35
 
28
36
  private
29
37
 
30
- @@thread_count = 1
31
- @@semaphore = nil
38
+ @@thread_count = nil
39
+ @@mutex = nil
32
40
  @@initialized = false
33
41
 
34
42
  def initialize_threads(count = 1)
@@ -37,29 +45,36 @@ module MediaFile
37
45
  @@thread_count = count
38
46
  if @@thread_count > 1
39
47
  require 'thread'
40
- @@semaphore = Mutex.new
48
+ @@mutex = Mutex.new
41
49
  end
42
50
  end
43
51
 
44
52
  def safe_print(message = '')
45
53
  lock {
46
- print block_given? ? yield : message
54
+ print block_given? ? yield : message + "\n"
47
55
  }
48
56
  end
49
57
 
50
58
  def cleanup
51
- @@semaphore = nil
59
+ @@mutex = nil
52
60
  true
53
61
  end
54
62
 
55
63
  def lock
56
- if @@semaphore
57
- @@semaphore.synchronize {
64
+ if @@mutex && !@@mutex.owned?
65
+ @@mutex.synchronize do
58
66
  yield
59
- }
67
+ end
60
68
  else
61
69
  yield
62
70
  end
63
71
  end
64
72
 
65
- end
73
+ def debug(msg = '')
74
+ safe_print("DEBUG: #{caller_locations(1, 2)[0].label} >> #{msg}") if @debug
75
+ end
76
+
77
+ def info(msg = '')
78
+ safe_print("INFO: #{caller_locations(1, 2)[0].label} >> #{msg}") if @verbose
79
+ end
80
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mediafile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Harvey-Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-02 00:00:00.000000000 Z
11
+ date: 2017-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: taglib-ruby