module Kagu
class Playlists
include Enumerable
attr_reader :library
def initialize(library)
raise ArgumentError.new("#{self.class}#library must be a library, #{library.inspect} given") unless library.is_a?(Library)
@library = library
end
def build(attributes = {})
Playlist.new(attributes)
end
def create(attributes = {})
build(attributes).tap(&:save)
end
def each(&block)
return unless block_given?
tracks = {}.tap do |tracks|
library.tracks.each { |track| tracks[track.id] = track }
end
Kagu.logger.debug('Kagu') { "Reading library playlists from #{library.path.inspect}" }
File.open(library.path, 'r') do |file|
begin
line = file.readline.strip
end while !line.starts_with?('Playlists')
playlist_name = nil
playlist_tracks = []
skip_next = false
while !file.eof? && (line = file.readline.strip)
if line == 'Master'
playlist_name = nil
skip_next = true
next
end
if line == ''
yield(Playlist.new(tracks: playlist_tracks, xml_name: playlist_name)) if playlist_name.present? && playlist_tracks.any?
playlist_name = nil
playlist_tracks = []
next
end
match = line.match(/(.+)<\/key><(\w+)>(.*)<\/\2>/)
next unless match
name = match[1]
value = match[3]
if name == 'Name'
if skip_next
skip_next = false
else
playlist_name = value
end
elsif name == 'Track ID'
playlist_tracks << tracks[value.to_i]
end
end
end
end
end
end