Class: MusicBox

Inherits:
Object
  • Object
show all
Defined in:
lib/musicbox.rb,
lib/musicbox/error.rb,
lib/musicbox/group.rb,
lib/musicbox/player.rb,
lib/musicbox/catalog.rb,
lib/musicbox/discogs.rb,
lib/musicbox/version.rb,
lib/musicbox/exporter.rb,
lib/musicbox/importer.rb,
lib/musicbox/equalizer.rb,
lib/musicbox/extractor.rb,
lib/musicbox/info_to_s.rb,
lib/musicbox/cover_maker.rb,
lib/musicbox/label_maker.rb,
lib/musicbox/catalog/tags.rb,
lib/musicbox/catalog/album.rb,
lib/musicbox/catalog/track.rb,
lib/musicbox/catalog/albums.rb,
lib/musicbox/catalog/artist.rb,
lib/musicbox/catalog/format.rb,
lib/musicbox/catalog/artists.rb,
lib/musicbox/catalog/release.rb,
lib/musicbox/catalog/releases.rb,
lib/musicbox/catalog/collection.rb,
lib/musicbox/catalog/album_track.rb,
lib/musicbox/catalog/release_artist.rb,
lib/musicbox/catalog/collection_item.rb

Defined Under Namespace

Classes: Catalog, CoverMaker, Discogs, Equalizer, Error, Exporter, Extractor, Group, Importer, LabelMaker, Player

Constant Summary collapse

VERSION =
'0.1'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root:) ⇒ MusicBox

Returns a new instance of MusicBox.



53
54
55
56
# File 'lib/musicbox.rb', line 53

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

Instance Attribute Details

#catalogObject

Returns the value of attribute catalog.



51
52
53
# File 'lib/musicbox.rb', line 51

def catalog
  @catalog
end

Class Method Details

.info_to_s(info, indent: 0) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/musicbox/info_to_s.rb', line 3

def self.info_to_s(info, indent: 0)
  io = StringIO.new
  width = info.map { |i| i.first.length }.max
  info.each do |label, value, sub_info|
    io.puts '%s%*s: %s' % [
      ' ' * indent,
      width,
      label,
      value,
    ]
    io.print info_to_s(sub_info, indent: indent + width + 2) if sub_info
  end
  io.string
end

Instance Method Details

#artist_keys(args) ⇒ Object



225
226
227
228
229
230
# File 'lib/musicbox.rb', line 225

def artist_keys(args)
  if args.empty?
    args = @catalog.releases.items.map { |r| r.artists.map(&:name) }.flatten
  end
  ;;pp @catalog.artist_keys(args)
end

#cover(args, prompt: false, output_file: '/tmp/cover.pdf') ⇒ Object



124
125
126
127
128
129
130
131
132
# File 'lib/musicbox.rb', line 124

def cover(args, prompt: false, output_file: '/tmp/cover.pdf')
  releases = []
  @catalog.find(args, group: :releases, prompt: prompt).select(&:album).each do |release|
    release.select_cover unless release.album.has_cover?
    releases << release if release.album.has_cover?
  end
  CoverMaker.make_covers(*releases, output_file: output_file)
  run_command('open', output_file)
end

#csv(args) ⇒ Object



206
207
208
209
210
211
# File 'lib/musicbox.rb', line 206

def csv(args)
  print Catalog::Release.csv_header
  @catalog.find(args, group: :releases).each do |release|
    print release.to_csv
  end
end

#dir(args, group: nil) ⇒ Object



160
161
162
163
164
# File 'lib/musicbox.rb', line 160

def dir(args, group: nil)
  @catalog.find(args, group: group).each do |release|
    puts "%-10s %s" % [release.id, release.dir]
  end
end

#download_images(args) ⇒ Object



118
119
120
121
122
# File 'lib/musicbox.rb', line 118

def download_images(args)
  @catalog.find(args, group: :releases).select(&:cd?).each do |release|
    release.download_images
  end
end

#dups(args) ⇒ Object



213
214
215
216
217
218
219
220
221
222
223
# File 'lib/musicbox.rb', line 213

def dups(args)
  dups = @catalog.find_dups(@catalog.find(args, group: :releases))
  dups.each do |id, formats|
    formats.each do |format, releases|
      if releases.length > 1
        puts
        releases.each { |r| puts r }
      end
    end
  end
end

#export(args, **params) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/musicbox.rb', line 58

def export(args, **params)
  exporter = Exporter.new(catalog: @catalog, **params)
  @catalog.find(args, group: :releases).each do |release|
    album = release.album or raise Error, "Album does not exist for release #{release.id}"
    exporter.export_album(album)
  end
end

#extract(args) ⇒ Object



66
67
68
69
70
71
# File 'lib/musicbox.rb', line 66

def extract(args)
  extractor = Extractor.new(catalog: @catalog)
  @catalog.dirs_for_args(@catalog.extract_dir, args).each do |dir|
    extractor.extract_dir(dir)
  end
end

#extract_cover(args) ⇒ Object



112
113
114
115
116
# File 'lib/musicbox.rb', line 112

def extract_cover(args)
  @catalog.find(args, group: :releases).select(&:album).each do |release|
    release.album.extract_cover
  end
end

#fix(args) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/musicbox.rb', line 73

def fix(args)
  # key_map = {
  #   :title => :title,
  #   :artist => :artist,
  #   :original_release_year => :year,
  #   :format_quantity => :discs,
  # }
  # find(args, group: :releases).select(&:cd?).each do |release|
  #   diffs = {}
  #   key_map.each do |release_key, album_key|
  #     release_value = release.send(release_key)
  #     album_value = release.album.send(album_key)
  #     if album_value && release_value != album_value
  #       diffs[release_key] = [release_value, album_value]
  #     end
  #   end
  #   unless diffs.empty?
  #     puts release
  #     diffs.each do |key, values|
  #       puts "\t" + '%s: %p => %p' % [key, *values]
  #     end
  #     puts
  #   end
  # end
end

#formats(args) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/musicbox.rb', line 99

def formats(args)
  formats = {}
  @catalog.find(args, group: :releases).each do |release|
    release.formats.each do |format|
      formats[format.name] ||= 0
      formats[format.name] += 1
    end
  end
  formats.each do |name, count|
    puts '%5d %s' % [count, name]
  end
end

#import(args) ⇒ Object



140
141
142
143
144
145
146
147
148
149
# File 'lib/musicbox.rb', line 140

def import(args)
  importer = Importer.new(catalog: @catalog)
  @catalog.dirs_for_args(@catalog.import_dir, args).each do |dir|
    begin
      importer.import_dir(dir)
    rescue Error => e
      warn "Error: #{e}"
    end
  end
end

#label(args) ⇒ Object



151
152
153
154
155
156
157
158
# File 'lib/musicbox.rb', line 151

def label(args)
  labels = @catalog.find(args, group: :releases, prompt: true).map(&:to_label)
  output_file = '/tmp/labels.pdf'
  label_maker = LabelMaker.new
  label_maker.make_labels(labels)
  label_maker.write(output_file)
  run_command('open', output_file)
end

#open(args, group: nil) ⇒ Object



166
167
168
169
170
# File 'lib/musicbox.rb', line 166

def open(args, group: nil)
  @catalog.find(args, group: group).each do |release|
    run_command('open', release.dir)
  end
end

#orphanedObject



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/musicbox.rb', line 172

def orphaned
  @catalog.orphaned.each do |group, items|
    unless items.empty?
      puts "#{group}:"
      items.sort.each do |item|
        puts item
      end
      puts
    end
  end
  images = @catalog.orphaned_images
  unless images.empty?
    puts "Images:"
    images.sort.each do |image|
      puts "\t" + image.to_s
    end
    puts
  end
end

#play(args, prompt: false, equalizer_name: nil, **params) ⇒ Object



232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/musicbox.rb', line 232

def play(args, prompt: false, equalizer_name: nil, **params)
  albums = @catalog.find(args, prompt: prompt).map(&:album).compact
  if equalizer_name
    equalizers = Equalizer.load_equalizers(
      dir: Path.new(@catalog.config['equalizers_dir']),
      name: equalizer_name)
  else
    equalizers = nil
  end
  player = MusicBox::Player.new(
    albums: albums,
    equalizers: equalizers,
    **params)
  player.play
end

#select(args) ⇒ Object



248
249
250
251
252
253
254
255
# File 'lib/musicbox.rb', line 248

def select(args)
  ids = []
  loop do
    releases = @catalog.find(args, group: :releases, prompt: true) or break
    ids += releases.map(&:id)
    puts ids.join(' ')
  end
end

#select_cover(args, prompt: false) ⇒ Object



134
135
136
137
138
# File 'lib/musicbox.rb', line 134

def select_cover(args, prompt: false)
  @catalog.find(args, group: :releases, prompt: prompt).select(&:album).each do |release|
    release.select_cover
  end
end

#show(args, group: nil, mode: :summary, prompt: false) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/musicbox.rb', line 192

def show(args, group: nil, mode: :summary, prompt: false)
  @catalog.find(args, group: group, prompt: prompt).each do |release|
    case mode
    when :cover
      release.album.show_cover if release.album&.has_cover?
    when :details
      puts release.details_to_s
      puts
    when :summary
      puts release
    end
  end
end

#updateObject



257
258
259
# File 'lib/musicbox.rb', line 257

def update
  Discogs.new(catalog: @catalog).update
end

#update_tags(args, force: false) ⇒ Object



261
262
263
264
265
266
# File 'lib/musicbox.rb', line 261

def update_tags(args, force: false)
  @catalog.find(args, group: :releases).select(&:album).each do |release|
    puts release
    release.album.update_tags(force: force)
  end
end