#!/usr/bin/env ruby

require "ogg/vorbis/tagger"
require "musicbrainz"

def lookup_metadata(track_id, album_id)
	mb = MusicBrainz::Client.new

	res = mb.query(MusicBrainz::Query::QuickTrackInfoFromTrackId,
	               track_id, album_id)
	unless res
		STDERR.puts mb.error
		exit 1
	end

	ret = Ogg::Vorbis::Comments.new

	ret["title"] = mb.result(MusicBrainz::Query::QuickGetTrackName)
	ret["artist"] = mb.result(MusicBrainz::Query::QuickGetArtistName)
	ret["album"] = mb.result(MusicBrainz::Query::QuickGetAlbumName)
	ret["tracknumber"] = mb.result(MusicBrainz::Query::QuickGetTrackNum)

	# Two. Release date.
	mb = MusicBrainz::Client.new

	res = mb.query(MusicBrainz::Query::GetAlbumById, album_id)
	unless res
		STDERR.puts mb.error
		exit 1
	end

	mb.select(MusicBrainz::Query::Rewind)
	mb.select(MusicBrainz::Query::SelectAlbum, 1)

	num_releases = mb.result(MusicBrainz::Query::AlbumGetNumReleaseDates).to_i
	years = []

	1.upto(num_releases) do |i|
		mb.select(MusicBrainz::Query::SelectReleaseDate, i)
		tmp = mb.result(MusicBrainz::Query::ReleaseGetDate)

		years << tmp.match(/^(\d{4})/).captures.first.to_i
	end

	ret["date"] = years.sort.first.to_s

	ret
end

ARGV.each do |file|
	Ogg::Vorbis::Tagger.open(file) do |t|
		h = lookup_metadata(t.comments["musicbrainz_trackid"],
		                    t.comments["musicbrainz_albumid"])
		t.comments.merge!(h)
		t.write
	end
end
