Class: MusicBox::Importer

Inherits:
Object
  • Object
show all
Defined in:
lib/musicbox/importer.rb

Instance Method Summary collapse

Constructor Details

#initialize(catalog:) ⇒ Importer

Returns a new instance of Importer.



5
6
7
8
# File 'lib/musicbox/importer.rb', line 5

def initialize(catalog:)
  @catalog = catalog
  @prompt = TTY::Prompt.new
end

Instance Method Details

#copy_filesObject



113
114
115
116
117
118
119
# 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_discObject



24
25
26
27
28
29
30
31
32
33
# 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_releaseObject



35
36
37
38
39
40
41
42
43
# 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) ⇒ Object



81
82
83
84
85
86
87
88
89
# 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_albumObject

Raises:



91
92
93
94
95
96
97
# 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) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
# 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_albumObject



45
46
47
48
49
50
51
52
53
54
# 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) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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_planObject



99
100
101
102
103
104
105
106
107
108
109
110
111
# 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_coverObject



127
128
129
# File 'lib/musicbox/importer.rb', line 127

def make_cover
  #FIXME
end

#make_labelObject



121
122
123
124
125
# 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