Wolf Clan Brasil

sexta-feira, 9 de setembro de 2011

Envio automático de Imagens para Otimização via Yahoo Smush.it utilizando Ruby on Rails

Um exemplo de como eu fiz para automatizar o envio de imagens para o otimizador de imagens Yahoo Smush.it utilizando Ruby,RailsPaperclipCrack e RIO.



Infelizmente o Yahoo Smush.it não dispõe de uma API para envio e download das imagens.
Mas é possível eu enviar uma imagem e receber a resposta através de uma arquivo JSON.
 
Para automatizar a otimização das imagens precisamos “ler” sua localização, envia-la para o Smush.it e depois “ler” a localização da imagem otimizada pra tal utilizaremos algumas gems.
Open-uri
Crack, que é o JSON parser, que irá transformar o objeto JSON em objeto Ruby
RIO, utilizo ele para gravar a imagem otimizada sobre a outra, você pode usar o Rmagick ouMinimagick para fazer o mesmo.
Para instalar as gems

sudo gem install rio crack


Como estou utilizando Rails criei o método “otimiza” no model “Imagem” que é invocado após o create.

class Imagem < ActiveRecord::Base

#app/modelos/imagem.rb
class Imagem < ActiveRecord::Base
has_attached_file :photo

after_create :otimiza

def otimiza()
 if self.photo_file_size < 1000000 #limite imposto pelo smush.it

require 'rubygems' #desnecessário caso utilize Ruby 1.9
require 'crack'
require 'open-uri'
require 'rio'

dominio=’’ 
#o open-uri não consegue utilizar o método POST por isso 
#a imagem tem que estar acessível pela internet, impedindo assim de enviá-la direto ao smush.it

imagem= self.photo.url #endereço da imagem 

file = dominio+imagem

 response = open('http://smushit.com/ysmush.it/ws.php?img='+file).read
 #captura o arquivo JSON através de GET.

 path = Crack::JSON.parse(response)['dest']
 #Lê o caminho da imagem otimizada e grava na variável path

  path.to_s #converte a variável path para string
   rio(''+imagem).binmode < rio(path).binmode
 #grava a nova imagem sobre a antiga
  end
end  #fecha otimiza
end

Provavelmente existem formas mais DRY de fazer essa automatização mas foi assim que consegui depois de dois dias ralando XD

Nenhum comentário: