Class: Muzak::Index
Overview
Represents muzak's music index.
Instance Attribute Summary collapse
-
#deep ⇒ Boolean
Whether the index is "deep" (includes metadata) or not.
-
#hash ⇒ Hash
The index hash.
-
#tree ⇒ String
The path of the root of the music tree.
Class Method Summary collapse
Instance Method Summary collapse
-
#album_names ⇒ Array<String>
A list of all albums in the index.
-
#albums ⇒ Hash{String => Album}
A hash of all album names with their Album objects.
-
#albums_by(artist) ⇒ Array<Album>
All albums by the given artist.
-
#artists ⇒ Array<String>
A list of all artists in the index.
-
#deep? ⇒ Boolean
Whether or not the current index is deep.
-
#initialize(file: INDEX_FILE) ⇒ Index
constructor
A new instance of Index.
-
#jukebox(count = 50) ⇒ Array<Song>
Produces a 'jukebox' of random songs.
-
#songs_by(artist) ⇒ Array<Song>
An array of all the artist's songs.
-
#timestamp ⇒ Integer
The UNIX timestamp from when the index was built.
Methods included from Utils
album_art?, #build_response, #debug, #debug?, #error, #error!, music?, #output, #pretty, resolve_command, resolve_method, #verbose, #verbose?, #warn
Constructor Details
#initialize(file: INDEX_FILE) ⇒ Index
Returns a new instance of Index.
24 25 26 27 |
# File 'lib/muzak/index.rb', line 24 def initialize(file: INDEX_FILE) @hash = Marshal.load(File.read file) @deep = @hash["deep"] end |
Instance Attribute Details
#deep ⇒ Boolean
Returns whether the index is "deep" (includes metadata) or not.
18 19 20 |
# File 'lib/muzak/index.rb', line 18 def deep @deep end |
#hash ⇒ Hash
Returns the index hash.
21 22 23 |
# File 'lib/muzak/index.rb', line 21 def hash @hash end |
#tree ⇒ String
Returns the path of the root of the music tree.
15 16 17 |
# File 'lib/muzak/index.rb', line 15 def tree @tree end |
Class Method Details
.load_index! ⇒ Object
6 7 8 9 10 11 12 |
# File 'lib/muzak/index.rb', line 6 def self.load_index! if File.exist?(INDEX_FILE) Index.new else error! "#{INDEX_FILE} missing, did you forget to run muzak-index?" end end |
Instance Method Details
#album_names ⇒ Array<String>
albums with the same name will appear, but can't be disambiguated from here
Returns a list of all albums in the index.
63 64 65 |
# File 'lib/muzak/index.rb', line 63 def album_names artists.map { |a| @hash["artists"][a]["albums"].keys }.flatten end |
#albums ⇒ Hash{String => Album}
Returns a hash of all album names with their Album objects.
46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/muzak/index.rb', line 46 def albums @albums_hash ||= begin albums_hash = {} artists.each do |a| @hash["artists"][a]["albums"].each do |title, album_hash| albums_hash[title] = Album.new(title, album_hash) end end albums_hash end end |
#albums_by(artist) ⇒ Array<Album>
Returns all albums by the given artist.
69 70 71 72 73 74 75 76 |
# File 'lib/muzak/index.rb', line 69 def albums_by(artist) if artists.include?(artist) @hash["artists"][artist]["albums"].map { |title, album| Album.new(title, album) } else error "no such artist: '#{artist}'" unless @hash["artists"].key?(artist) [] end end |
#artists ⇒ Array<String>
Returns a list of all artists in the index.
40 41 42 |
# File 'lib/muzak/index.rb', line 40 def artists @artists ||= @hash["artists"].keys end |
#deep? ⇒ Boolean
Returns whether or not the current index is deep.
30 31 32 |
# File 'lib/muzak/index.rb', line 30 def deep? deep end |
#jukebox(count = 50) ⇒ Array<Song>
Produces a 'jukebox' of random songs.
81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/muzak/index.rb', line 81 def jukebox(count = 50) @all_albums ||= @hash["artists"].map { |_, a| a["albums"] }.flatten if deep? @all_deep_songs ||= @all_albums.map { |aa| aa.map { |_, a| a["deep-songs"] } }.flatten @all_deep_songs.sample(count) else @all_songs ||= @all_albums.map { |aa| aa.map { |_, a| a["songs"] } }.flatten @all_songs.sample(count).map { |s| Song.new(s) } end end |
#songs_by(artist) ⇒ Array<Song>
no inter-album order is guaranteed. songs within an album are generally sorted by track number.
Returns an array of all the artist's songs.
97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/muzak/index.rb', line 97 def songs_by(artist) error "no such artist: '#{artist}'" unless @hash["artists"].key?(artist) begin albums_by(artist).map do |album| album.songs end.flatten rescue Exception => e [] end end |
#timestamp ⇒ Integer
Returns the UNIX timestamp from when the index was built.
35 36 37 |
# File 'lib/muzak/index.rb', line 35 def @hash["timestamp"] end |