-
-
Save Kiryous/709ab1a33971072232c1e1471c240c8c to your computer and use it in GitHub Desktop.
Retrieve a 512 x 512px icon for an iOS app
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 | |
# | |
# Use size param as following ~s/~small/~m/~medium/~l/~large to specify size, example: | |
# $ itunesicon super monsters ate my condo ~small | |
# | |
# 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment