#!ruby

$LOAD_PATH << "2004"

require "rexif"
require "png"
require "GD"
require "rexml/document"

# この値を超えたらサムネイル作成
RESIZE_WIDTH = 400
RESIZE_HEIGHT = 300

# サムネイルサイズ。
MAX_WIDTH = 120
MAX_HEIGHT = 90

p $DEBUG

if ARGV.empty?
	exit 1
end

def thumb(img, basename, ext)
	width = img.width
	height = img.height
	
	rdf = nil
	if width > RESIZE_WIDTH || height > RESIZE_HEIGHT
		case
		when height > MAX_HEIGHT
			rate = MAX_HEIGHT.to_f / height
			height = MAX_HEIGHT
			width *= rate
			
		when width > MAX_WIDTH
			rate  = MAX_WIDTH.to_f / width
			width = MAX_WIDTH
			height *= rate
		end

		out = GD::Image.newTrueColor(width, height)
		img.copyResampled(out, 0, 0, 0, 0, width+1, height+1, img.width, img.height)

		File.open("#{basename}-thumbnail#{ext}", "wb") do |f|
			yield f, out
		end

		doc = REXML::Document.new(File.open("#{basename}-meta.rdf"){|f| f.read})
		t = doc.root.elements.to_a("/rdf:RDF/*[@rdf:about = '']")[0]
		t.elements["dc:title"].text = t.elements["dc:title"].text.to_s + " - サムネイル" if t.elements["dc:title"]
		rdf = doc.to_s
	end
	
	
	rdf
end
Dir.glob("#{ARGV[0]}/*.{png,jpg}") do |filename|
	basename = "#{File.dirname(filename)}/#{File.basename(filename, ".*")}"
	ext = File.extname(filename)
	next unless File.exist?("#{basename}-meta.rdf")
	next if filename =~ /^.+?-thumbnail#{ext}$/
	if $DEBUG || !File.exist?("#{basename}-thumbnail#{ext}") || File.mtime(filename) > File.mtime("#{basename}-thumbnail#{ext}")
		puts "thm, #{filename}"
		case ext
		when ".jpg"
			img = nil

			img = GD::Image.new_from_jpeg(filename)
			
			rdf = thumb(img, basename, ext) {|f, out| out.jpeg(f, 95) }
			
			if File.exist?("#{basename}-thumbnail.jpg")
				j = Jpeg.load("#{basename}-thumbnail.jpg")
				j.delete(Jpeg::Segment::COM) {|seg|}
				s = Jpeg::Segment.new(Jpeg::Segment::COM, rdf)
				j.insert(s)
				File.open("#{basename}-thumbnail.jpg", "wb") {|f| f.print j.dump}
			end
			
		when ".png"
			img = GD::Image.new_from_png(filename)
			rdf = thumb(img, basename, ext) {|f, out| out.png(f) }
			
			if File.exist?("#{basename}-thumbnail.png")
				png = nil
				File.open("#{basename}-thumbnail.png", "rb") do |f|
					png = PNG.new(f)
					png.data.reject! {|c| c[0] == :iTXt && c[2][:keyword] =~ /^Metadata Type|Metadata$/ }
					png.add_iTXt("Metadata Type", "application/rdf+xml", "", "", false)
					png.add_iTXt("Metadata", rdf, "", "", true)
					File.open("#{basename}-thumbnail.png", "wb") {|f| f.print png.dump}
				end
			end
		end
	end
	
	if File.mtime("#{basename}-meta.rdf") > File.mtime(filename) || (File.exist?("#{basename}-thumbnail#{ext}") && File.mtime("#{basename}-thumbnail#{ext}") > File.mtime(filename))
		puts "rdf, #{filename}"
		case ext
		when ".png"
			doc = REXML::Document.new(File.open("#{basename}-meta.rdf"){|f| f.read})
			if File.exist?("#{basename}-thumbnail.png")
				t = doc.root.elements.to_a("/rdf:RDF/*[@rdf:about = '']")[0]
				t.add_element("foaf:thumbnail", {"rdf:resource" => "./#{File.basename(filename, ".*")}-thumbnail.png"})
			end
			
			File.open("#{basename}.png", "rb") do |f|
				
				png = PNG.new(f)
				png.data.reject! {|c| c[0] == :iTXt && c[2][:keyword] =~ /^Metadata Type|Metadata$/ }
				png.add_iTXt("Metadata Type", "application/rdf+xml", "", "", false)
				png.add_iTXt("Metadata", doc.to_s, "", "", true)
			end
			File.open("#{basename}.png", "wb") {|f| f.print png.dump}
		when ".jpg"
			doc = REXML::Document.new(File.open("#{basename}-meta.rdf"){|f| f.read})
			if File.exist?("#{basename}-thumbnail.jpg")
				t = doc.root.elements.to_a("/rdf:RDF/*[@rdf:about = '']")[0]
				t.add_element("foaf:thumbnail", {"rdf:resource" => "./#{File.basename(filename, ".*")}-thumbnail.jpg"})
			end
				
			j = Jpeg.load("#{basename}.jpg")
			j.delete(Jpeg::Segment::COM) {|seg|}
			s = Jpeg::Segment.new(Jpeg::Segment::COM, doc.to_s)
			j.insert(s)
			File.open("#{basename}.jpg", "wb") {|f| f.print j.dump}
		end
	end

end

