iTunes Library Updater: Atualizando a biblioteca do iTunes com Ruby

20/11/07

O Mac OS X não tem tem tantas opções de players para música. O mais usado, sem dúvida, é o iTunes. Eu nunca fui muito fã mas na falta de algo melhor, estou tentando me acostumar com ele.

Pensando nisso, fiz um script que atualiza o iTunes, adicionando novos diretórios à biblioteca. Para utilizá-lo, você precisará instalar o RubyOSA, que faz interface com os aplicativos instalados. Basta executar o comando gem install ruby-osa.

Depois, copie o script abaixo — o meu está no diretório "~/Library/Scripts/itunes_updater.rb" — e execute-o uma primeira vez. Isso irá gerar um arquivo em "~/.itunes_updater.yml".

require "rubygems"
require "rbosa"
require "yaml"
 
class ItunesUpdater
  attr_accessor :config_file
  attr_accessor :filters
 
  def initialize
    @itunes = OSA.app('iTunes')
    @pending = []
    @config_file = File.expand_path("~/.itunes_updater.yml")
    @filters = []
 
    parse_config_file
  end
 
  def pending
    libraries.each do |lib|
      lib_folder = File.expand_path(lib)
 
      Dir.entries(lib_folder).each do |artist|
        artist_folder = File.join(lib_folder, artist)
 
        next if skip_folder?(artist_folder)
 
        Dir.entries(artist_folder).each do |album|
          album_folder = File.join(artist_folder, album)
 
          next if skip_folder?(album_folder)
 
          @pending << album_folder
        end
      end
    end
 
    @pending.sort
  end
 
  def update!
    pending.each do |album|
      @itunes.add(album)
    end
 
    @config["updated_at"] = Time.now.to_s
 
    if !save_config_file
      puts "-- unable to save configuration file on #{@config_file.inspect}"
    end
 
    @pending = []
  end
 
  def updated_at
    @config["updated_at"] ? Time.parse(@config["updated_at"].to_s) : (Time.now - (60 * 60 * 24 * 30 * 365))
  end
 
  def libraries
    @config["libraries"] || []
  end
 
  def libraries=(paths)
    @config["libraries"] = paths
  end
 
  def filters
    (@config["filters"] || []).map do |filter|
      filter = File.expand_path(filter)
      filter.downcase
    end
  end
 
  def notify(message)
    title = "iTunes Library Updater"
    image = "/Applications/iTunes.app/Contents/Resources/iTunes.icns"
    system("growlnotify -n itunes_library_updater --image #{image} -p 2 -m \"#{message}\" -t \"#{title}\"")
  end
 
  def create_template
    template = <<YML
updated_at:
libraries: 
  - ~/Music/iTunes/iTunes Music
filters:
  - <ADD THE FOLDER YOU WANT TO SKIP>
YML
    File.open(@config_file, "w+") << template
  end
 
  private
    def skip_folder?(folder)
      # check if folder is represented by . or ..
      return true if folder =~ /\/\.{1,2}/
      # check if is directory
      return true unless File.directory?(folder)
      # check if folder is in the filter list
      return true if filters.include?(folder.downcase)
      # check the modification timestamp
      return true if File.mtime(folder) < updated_at
      # the folder is ok to go
      return false
    end
 
    def parse_config_file
      @config = YAML.load_file(@config_file)
    rescue
      @config = {
        "updated_at" => nil,
        "libraries" => [],
        "filters" => []
      }
    end
 
    def save_config_file
      File.open(@config_file, "w+") do |file|
        YAML.dump(@config, file)
      end
 
      return true
    rescue
      return false
    end
end
 
if $0 == __FILE__
  itunes = ItunesUpdater.new
 
  if File.exists?(itunes.config_file)
    pending_items = itunes.pending.size
 
    if pending_items > 0
      itunes.notify("#{pending_items} pending folder(s)")
      itunes.update!
      itunes.notify("Library updated!")
    else
      itunes.notify("No pending items found")
    end
  else
    itunes.create_template
    itunes.notify("The configuration file has been created.\n\nIf you need to customize it, edit the file #{itunes.config_file}")
  end
end

Por padrão, o script verifica o diretório "~/Music/iTunes/iTunes Music", local onde são salvas todas as músicas. Eu deixo o iTunes configurado para não copiar as músicas (minhas músicas ficam em um outro diretório, onde os mp3s são colocados após passar pelo MusicBrainz ~ sim, sou um fanático). Se você deixa seus arquivos em outro local, não se esqueça de alterar o arquivo "~/.itunes_updater.yml".

updated_at:
libraries: 
  - ~/Music/MP3
filters: 
  - ~/Music/MP3/_Temporary
  - ~/Music/MP3/tagged
  - ~/Music/MP3/UNTAGGED

Para atualizar sua biblioteca, basta executar o comando ruby itunes_updater.rb. Lembre-se de executar o arquivo do lugar onde você o salvou. Após atualizar sua biblioteca, uma notificação será exibida.

iTunes Library Updater

Este script também está no meu repositório: svn.simplesideias.com.br/general/ruby/itunes_updater.rb

Notas rápidas

07/11/07

NOTA 1: Esta é a segunda semana que estou com meu Macbook, comprado na Ariane. Estou muuuito feliz com esta minha aquisição, mas não chega a ser uma novidade, pois eu já usava o Mac OS X no meu dia-a-dia. Ainda não estou com o Leopard, mas já enviei minha solicitação e deve chegar na segunda quinzena de novembro. Agora, só resta esperar! Windows & Linux já não uso mais!

NOTA 2: E por falar em Linux, sinto informar que os plugins que eu desenvolvia para o Gedit não serão mais lançados, nem atualizados, por razões óbvias. Junto com o Macbook, comprei o Textmate; ele é muito legal e, provavelmente, irei criar bundles que me ajudem, com o passar do tempo.

NOTA 3: Dia 09/11, próxima sexta-feira, irei falar na SECCOMP 2007, organizada pela UNESP de Rio Claro, sobre Ruby on Rails, incluindo um "live coding" de uma pequena aplicação. Se você estiver por perto, apareça por lá!

NOTA 4: Dia 10/11, sábado, acontece o StartupCamp Brazil, no Espaço Gafanhoto. A desconferência irá abordar temas como empreendedorismo & investidores, e será um ótimo lugar para se relacionar. Minha presença está mais que confirmada!

Safari agora tem versão para Windows

11/06/07

Acabei de ver que a Apple lançou a versão do Safari para Windows. Esta é uma notícia muito interessante, principalmente se você precisa deixar tudo funcionando para aquela agência de publicidade que você está fazendo freela, mas não tem nenhum Mac por perto para testar!

Ainda está em fase beta, mas já é um preview da versão 3. Lá, também existe uma versão beta para Mac. Faça o download agora mesmo!