Sha256: 202ac818cc97282005ff9de4eedd334e5c2935e74e54bece5d255a8a8dfb5ac6

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

module Kagu

  class Playlist

    MANDATORY_ATTRIBUTES = %w(name)

    include AttributesInitializer
    include Enumerable

    attr_reader :name, :tracks

    delegate :each, to: :tracks

    def save
      create
      clear
      add_tracks
    end

    def to_s
      name
    end

    private

    def add_tracks
      ids = tracks.map(&:id)
      AppleScript.execute(%Q{
        tell application "iTunes"
          set playlistToPush to user playlist #{name.inspect}
          set idsToAdd to {#{ids.join(',')}}
          repeat with idToAdd in idsToAdd
            duplicate (tracks of library playlist 1 whose database ID is idToAdd) to playlistToPush
          end repeat
        end tell
      })
      nil
    rescue => e
      raise Error.new(e)
    end

    def clear
      AppleScript.execute(%Q{
        tell application "iTunes"
          delete tracks of playlist #{name.inspect}
        end tell
      })
      nil
    rescue => e
      raise Error.new(e)
    end

    def create
      AppleScript.execute(%Q{
        tell application "iTunes"
          if not (exists user playlist #{name.inspect}) then
            make new user playlist with properties { name: #{name.inspect} }
          end if
        end tell
      })
      nil
    rescue => e
      raise Error.new(e)
    end

    def itunes_name=(value)
      @@html_entities ||= HTMLEntities.new
      self.name = @@html_entities.decode(value)
    end

    def name=(value)
      @name = value.to_s.squish.presence
    end

    def tracks=(values)
      @tracks = [values].flatten.select { |value| value.is_a?(Track) }
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kagu-0.2.0 lib/kagu/playlist.rb