Class: Muzak::Playlist

Inherits:
Object
  • Object
show all
Defined in:
lib/muzak/playlist.rb

Overview

Represents a sequential list of songs for muzak.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pname) ⇒ Playlist

Create a new Muzak::Playlist with the given name, or load one by that name if it already exists.

Parameters:

  • pname (String)

    the playlist's name


55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/muzak/playlist.rb', line 55

def initialize(pname)
  @filename = self.class.path_for pname

  if File.exist?(@filename)
    phash = YAML.load_file(@filename)
    @songs = phash["songs"]
  else
    @songs = []
  end

  sync!
end

Instance Attribute Details

#filenameString

Returns the absolute path to the playlist on disk.

Returns:

  • (String)

    the absolute path to the playlist on disk


7
8
9
# File 'lib/muzak/playlist.rb', line 7

def filename
  @filename
end

#songsArray<Song>

Returns the playlist's songs.

Returns:

  • (Array<Song>)

    the playlist's songs


10
11
12
# File 'lib/muzak/playlist.rb', line 10

def songs
  @songs
end

Class Method Details

.delete!(pname) ⇒ void

Note:

If already instantiated, the playlist may still be present in memory (and may reappear on disk if modified in memory)

This method returns an undefined value.

Deletes the given playlist from disk.

Parameters:

  • pname (String)

    the playlist's name


29
30
31
# File 'lib/muzak/playlist.rb', line 29

def self.delete!(pname)
  File.delete(path_for(pname)) if exist? pname
end

.exist?(pname) ⇒ Boolean

Returns whether or not the given playlist name already exists.

Parameters:

  • pname (String)

    the playlist's name

Returns:

  • (Boolean)

    whether or not the given playlist name already exists


20
21
22
# File 'lib/muzak/playlist.rb', line 20

def self.exist?(pname)
  File.exist?(path_for(pname))
end

.load_playlists!Hash{String => Playlist}

Instantiates all playlists by loading them from disk.

Returns:


41
42
43
44
45
46
47
48
49
50
# File 'lib/muzak/playlist.rb', line 41

def self.load_playlists!
  playlists = {}
  playlists.default_proc = proc { |h, k| h[k] = Playlist.new(k) }

  playlist_names.each do |pname|
    playlists[pname] = Playlist.new(pname)
  end

  playlists
end

.path_for(pname) ⇒ String

Returns the absolute path to the given playlist name.

Parameters:

  • pname (String)

    the playlist's name

Returns:

  • (String)

    the absolute path to the given playlist name


14
15
16
# File 'lib/muzak/playlist.rb', line 14

def self.path_for(pname)
  File.join(Config::PLAYLIST_DIR, pname) + ".yml"
end

.playlist_namesArray<String>

Returns the names of all currently available playlists.

Returns:

  • (Array<String>)

    the names of all currently available playlists


34
35
36
# File 'lib/muzak/playlist.rb', line 34

def self.playlist_names
  Dir[Config::PLAYLIST_GLOB].map { |p| File.basename(p, File.extname(p)) }
end

Instance Method Details

#add(songs) ⇒ void

This method returns an undefined value.

Parameters:

  • songs (Song, Array<Song>)

    one or more songs to add to the playlist


75
76
77
78
79
80
81
82
83
# File 'lib/muzak/playlist.rb', line 75

def add(songs)
  # coerce a single song into an array
  [*songs].each do |song|
    next if @songs.include?(song)
    @songs << song
  end

  sync!
end

#delete(songs) ⇒ void

This method returns an undefined value.

Parameters:

  • songs (Song, Array<Song>)

    one or more songs to delete from the playlist


88
89
90
91
92
# File 'lib/muzak/playlist.rb', line 88

def delete(songs)
  [*songs].each { |song| @songs.delete(song) }

  sync!
end

#nameString

Returns the playlist's name.

Returns:

  • (String)

    the playlist's name


69
70
71
# File 'lib/muzak/playlist.rb', line 69

def name
  File.basename(@filename, File.extname(@filename))
end

#shuffle!void

This method returns an undefined value.

Shuffles the internal order of the playlist's songs.


96
97
98
# File 'lib/muzak/playlist.rb', line 96

def shuffle!
  @songs.shuffle!
end

#sync!void

Note:

You shouldn't need to call this.

This method returns an undefined value.

Synchronizes the current instance with its disk representation.


103
104
105
# File 'lib/muzak/playlist.rb', line 103

def sync!
  File.open(@filename, "w") { |io| io.write to_hash.to_yaml }
end

#to_hashHash{String => Array<Song>}

Provides a hash representation of the current instance.

Returns:

  • (Hash{String => Array<Song>})

    the instance's state


109
110
111
# File 'lib/muzak/playlist.rb', line 109

def to_hash
  { "songs" => @songs }
end