#!/usr/bin/ruby -w

require 'ftools'

$SANITIZE_FILENAMES = true

# change to false when you think you wanna trust this sucker
$DRY_RUN = true

def usage
	"ogg_rename_from_tags mask file.ogg"
end

def read_tags(file)
	ret = {}

	`vorbiscomment -l \"#{file}\"`.split("\n").each do |item|
		k, v = item.split("=")
		ret[k.downcase.strip] = v.strip
	end

	ret
end

def rename(source, mask)
	unless File.exist?(source)
		puts "file not found: #{source}"
		return
	end

	tags = read_tags(source)
	file = mask.dup

	map = {"%A" => tags["artist"],
	       "%T" => tags["title"],
	       "%L" => tags["album"],
	       "%Y" => tags["date"],
	       "%G" => tags["genre"],
	       "%N" => tags["tracknumber"]}

	map.each do |k, v|
		next unless v

		file.gsub!(/#{k}/, v)
		file.gsub!(/#{k.downcase}/, v.downcase)
	end

	if $SANITIZE_FILENAMES
		file.gsub!(/\s+/, "_")
		file.tr!("'\"", "")
		file.tr!("äöü", "aou")
		file.tr!("ÄÖÜ", "AOU")
	end

	file = File.join(File.dirname(source), file)

	if $DRY_RUN
		puts "i'd rename '#{source}' to '#{file}'"
	else
		File.mv(source, file)
	end
end

if ARGV.length < 2
	puts usage
	exit(1)
end

mask = ARGV.shift

ARGV.each do |arg|
	rename(arg, mask)
end
