class MusicBox::Exporter
Public Class Methods
new(catalog:, dir:, compress: false, force: false, parallel: false)
click to toggle source
# File lib/musicbox/exporter.rb, line 5 def initialize(catalog:, dir:, compress: false, force: false, parallel: false) @catalog = catalog @dir = Path.new(dir).expand_path @compress = compress @force = force @parallel = parallel end
Public Instance Methods
compress_track(src_file, dst_file)
click to toggle source
# File lib/musicbox/exporter.rb, line 45 def compress_track(src_file, dst_file) begin tags = Catalog::Tags.load(src_file) caf_file = dst_file.replace_extension('.caf') run_command('afconvert', src_file, caf_file, '--data', 0, '--file', 'caff', '--soundcheck-generate') run_command('afconvert', caf_file, '--data', 'aac', '--file', 'm4af', '--soundcheck-read', '--bitrate', 256000, '--quality', 127, '--strategy', 2, dst_file) tags.save(dst_file, force: true) dst_file.utime(src_file.atime, src_file.mtime) rescue => e dst_file.unlink if dst_file.exist? raise e ensure caf_file.unlink if caf_file.exist? end end
export_album(album)
click to toggle source
# File lib/musicbox/exporter.rb, line 13 def export_album(album) raise Error, "Must specify destination directory" unless @dir name = '%s - %s (%s)' % [album.artist, album.title, album.year] export_dir = @dir / name export_dir.mkpath unless export_dir.exist? threads = [] album.tracks.each do |track| src_file = track.path dst_file = export_dir / src_file.basename if @force || !dst_file.exist? || dst_file.mtime != src_file.mtime if @parallel threads << Thread.new do export_track(src_file, dst_file) end else export_track(src_file, dst_file) end end end threads.map(&:join) end
export_track(src_file, dst_file)
click to toggle source
# File lib/musicbox/exporter.rb, line 35 def export_track(src_file, dst_file) if @compress warn "compressing #{src_file}" compress_track(src_file, dst_file) else warn "copying #{src_file}" src_file.cp(dst_file) end end