class MusicBox::Importer
Public Class Methods
new(catalog:)
click to toggle source
# File lib/musicbox/importer.rb, line 5 def initialize(catalog:) @catalog = catalog @prompt = TTY::Prompt.new end
Public Instance Methods
copy_files()
click to toggle source
# File lib/musicbox/importer.rb, line 113 def copy_files @copy_plan.each do |source_file, dest_file| source_file.cp(dest_file) end @catalog.import_done_dir.mkpath unless @catalog.import_done_dir.exist? @source_dir.rename(@catalog.import_done_dir / @source_dir.basename) end
determine_disc()
click to toggle source
# File lib/musicbox/importer.rb, line 24 def determine_disc @disc = nil if @album raise Error, "Album already exists" if @release.format_quantity.nil? || @release.format_quantity == 1 puts "Release has multiple discs." n = @prompt.ask?('Which disc is this?', required: true, convert: :int) raise Error, "Disc number out of range" unless n >= 1 && n <= @release.format_quantity @disc = n end end
find_release()
click to toggle source
# File lib/musicbox/importer.rb, line 35 def find_release releases = @catalog.find(@source_dir.basename.to_s, group: :releases, prompt: true, multiple: false) @release = releases.first @tracklist_flattened = @release.tracklist_flattened print @release.details_to_s end
find_track_for_title(title)
click to toggle source
# File lib/musicbox/importer.rb, line 81 def find_track_for_title(title) release_track = @tracklist_flattened.find { |t| t.title.downcase == title.downcase } unless release_track puts "Can't find release track with title #{title.inspect}" choices = @tracklist_flattened.map { |t| [t.title, t] }.to_h release_track = @prompt.select('Track?', choices, per_page: 100) end release_track end
import_album()
click to toggle source
# File lib/musicbox/importer.rb, line 91 def import_album raise Error, "No tracks were added to album" if @album.tracks.empty? @album.save copy_files @album.update_tags extract_cover end
import_dir(source_dir)
click to toggle source
# File lib/musicbox/importer.rb, line 10 def import_dir(source_dir) @source_dir = Path.new(source_dir).realpath puts; puts "Importing from #{@source_dir}" find_release determine_disc make_album make_copy_plan if @prompt.yes?('Add?') import_album make_label if @prompt.yes?('Make label?') make_cover if @prompt.yes?('Make cover?') end end
make_album()
click to toggle source
# File lib/musicbox/importer.rb, line 45 def make_album @album = Catalog::Album.new( id: @release.id, title: @release.title, artist: @release.artist, year: @release.original_release_year, discs: @release.format_quantity, dir: @catalog.albums.dir_for_id(@release.id)) @release.album = @album end
make_album_track(file)
click to toggle source
# File lib/musicbox/importer.rb, line 56 def make_album_track(file) tags = Catalog::Tags.load(file) release_track = find_track_for_title(tags[:title]) name = '%s%02d - %s' % [ @disc ? ('%1d-' % @disc) : '', tags[:track], release_track.title.gsub(%r{[/:]}, '_'), ] album_track = Catalog::AlbumTrack.new( title: release_track.title, artist: release_track.artist || @release.artist, track: tags[:track], disc: @disc || tags[:disc], file: Path.new(name).add_extension(file.extname), tags: tags, album: @album) puts "%-50s ==> %6s - %-50s ==> %-50s" % [ file.basename, release_track.position, release_track.title, album_track.file, ] album_track end
make_copy_plan()
click to toggle source
# File lib/musicbox/importer.rb, line 99 def make_copy_plan @copy_plan = @source_dir.children.select(&:file?).sort.map do |source_file| dest_file = case source_file.extname.downcase when '.m4a' album_track = make_album_track(source_file) or next @album.tracks << album_track album_track.file else source_file.basename end [source_file, @album.dir / dest_file] end.to_h end
make_cover()
click to toggle source
# File lib/musicbox/importer.rb, line 127 def make_cover #FIXME end
make_label()
click to toggle source
# File lib/musicbox/importer.rb, line 121 def make_label output_file = '/tmp/labels.pdf' LabelMaker.make_labels(@release.to_label, output_file: output_file) run_command('open', output_file) end