pattulus
4/28/2013 - 3:44 PM

Retrieve a 512 x 512px icon for an iOS app

Retrieve a 512 x 512px icon for an iOS app

#!/usr/bin/ruby
# encoding: utf-8
#
# Updated 2017-10-25:
# - Defaults to large size (512)
# - If ImageMagick is installed:
#     - rounds the corners (copped from @bradjasper, https://github.com/bradjasper/Download-iTunes-Icon/blob/master/itunesicon.rb)
#     - replace original with rounded version, converting to png if necessary
# 
# Retrieve an iOS app icon at the highest available resolution
# All arguments are combined to create an iTunes search
# The icon for the first result, if found, is written to a filename
# based on search terms
#
# If ImageMagick is installed (available through Homebrew), rounded
# corners will be added and a transparent PNG will be output.
#
# example:
# $ itunesicon super monsters ate my condo
# 
# http://brettterpstra.com/2013/04/28/instantly-grab-a-high-res-icon-for-any-ios-app/
# http://brettterpstra.com/2013/12/18/icon-grabber-updated-to-search-any-platform/

%w[net/http open-uri cgi fileutils].each do |filename|
  require filename
end

def find_icon(terms, entity, size)
  url = URI.parse("http://itunes.apple.com/search?term=#{CGI.escape(terms)}&entity=#{entity}")
  res = Net::HTTP.get_response(url).body
  match = res.match(/"#{size}":"(.*?)",/)
  unless match.nil?
    return match[1]
  else
    return false
  end
end

terms = ARGV.join(" ")
entity = "iPadSoftware"
type = "_ipad"
if terms =~ /[\#@](ipad|iphone|mac)/i
  if terms =~ /[\#@]iphone/i
    entity = "software"
    type = "_iphone"
  elsif terms =~ /[\#@]mac/i
    entity = "macSoftware"
    type = "_mac"
  end
  terms.gsub!(/[\#@](ipad|iphone|mac)/i, "").gsub!(/\s+/," ")
end

format = "artworkUrl512"
size = "l"
if terms =~ /~(s(mall)?|m(edium)?|l(arge)?)/i
  size = $1[0]
  format = case size
    when /s(mall)?/ then "artworkUrl60"
    when /m(edium)?/ then "artworkUrl100"
    else "artworkUrl512"
  end
  terms.gsub!(/~(s(mall)?|m(edium)?|l(arge)?)/i, "").gsub!(/\s+/," ")
end

def magick(filename, size)
  begin
    i = case size
      when /s/ then 60
      when /m/ then 100
      else 512
    end
    rect = "#{i.to_s}x#{i.to_s}"
    round = (i * 0.15625 + 3).round.to_s
    target = filename.sub(/\.\w+$/,'_round.png')
    %x{convert -size #{rect} xc:none -fill white -draw 'roundRectangle 0,0 #{i},#{i} #{round},#{round}' #{filename} -compose SrcIn -composite #{target} &> /dev/null}
    if File.exists? target
      FileUtils.rm(filename)
      filename.sub!(/\.\w+$/,'.png')
      FileUtils.mv(target,filename)
    end
    return filename
  rescue
    return filename
  end
end


terms.strip!

icon_url = find_icon(terms, entity, format)
unless icon_url
  puts "Error: failed to locate iTunes url. You may need to adjust your search terms."
  exit
end
url = URI.parse(icon_url)
target = File.expand_path("~/Desktop/"+terms.gsub(/[^a-z0-9]+/i,'_')+"_"+size+"."+icon_url.match(/\.(jpg|png)$/)[1])
begin
  open(url) do |f|
    File.open(target,'w+') do |file|
      file.puts f.read
    end
    target = magick(target,size)
    print target
  end
rescue Exception => e
  # puts e.backtrace
  # p e
  puts "Error: failed to save icon."
end