Sha256: 0c9716f67197a058040e5772e13d2701e6e01c7b848d85a6f253b56aaac46bb3

Contents?: true

Size: 1.78 KB

Versions: 10

Compression:

Stored size: 1.78 KB

Contents

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 iTunes library playlists from #{library.path.inspect}" }
      File.open(library.path, 'r') do |file|
        begin
          line = file.readline.strip
        end while !line.starts_with?('<key>Playlists</key>')
        playlist_name = nil
        playlist_tracks = []
        skip_next = false
        while !file.eof? && (line = file.readline.strip)
          if line == '<key>Master</key><true/>'
            playlist_name = nil
            skip_next = true
            next
          end
          if line == '</array>'
            yield(Playlist.new(itunes_name: playlist_name, tracks: playlist_tracks)) if playlist_name.present? && playlist_tracks.any?
            playlist_name = nil
            playlist_tracks = []
            next
          end
          match = line.match(/<key>(.+)<\/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

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
kagu-2.0.1 lib/kagu/playlists.rb
kagu-2.0.0 lib/kagu/playlists.rb
kagu-1.2.3 lib/kagu/playlists.rb
kagu-1.2.2 lib/kagu/playlists.rb
kagu-1.2.1 lib/kagu/playlists.rb
kagu-1.2.0 lib/kagu/playlists.rb
kagu-1.1.2 lib/kagu/playlists.rb
kagu-1.1.1 lib/kagu/playlists.rb
kagu-1.1.0 lib/kagu/playlists.rb
kagu-1.0.0 lib/kagu/playlists.rb