#!/usr/bin/env python
# -*- coding: utf-8 -*-
# A Musepack reader/tagger
#
# Copyright 2008 Edgar Luna <edgar.luna@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.

from mutagen.flac import FLAC
from mutagen.easyid3 import EasyID3
from unicodedata import decimal

from os import listdir,path,stat,system
import sys
import getopt

lame = "/usr/bin/lame"
flac = "/usr/bin/flac"

class Usage (Exception):
    def __init__ (self, msg):
        self.msg = msg

def usage ():
    print "Usage: %s [OPTION]... [DIRECTORY]" % path.basename(sys.argv[0])
    print """Converts every file in DIRECTORY from flac to mp3 with the default tags or
the one from the flac files.

  -a, --artist=ARTIST	Artist to set to mp3 files
  -l, --album=ALBUM	Album to set to mp3 files
  -d, --date=DATE	Date to set to mp3 files
  -g, --genre=GENRE	Genre to set to mp3 files
  -h, --help		Print this message

If no DIRECTORY is given the actual directory is used. The name of the mp3
files will be "Number. Track Name.mp3".
"""


def main (argv=None):
    if argv is None:
        argv = sys.argv

    try:
        stat (lame)
        stat (flac)
    except OSError, ex:
        print "Missing dependence: %s." % ex.filename
        return 1

    try:
        try:
            opts, args = getopt.getopt (argv[1:], "ha:l:d:g:", ["help", \
                                                                "album=", \
                                                                "artist=", \
                                                                "date=", \
                                                                "genre="])
        except getopt.error, msg:
            raise Usage (msg)
        gtags = {}
        directory = "."
        # get usual opts
        for opt in opts:
            if opt[0] in ('-h', '--help'):
                usage()
                return 0
            if opt[0] in ('-a', '--artist'):
                gtags["artist"] = [unicode (opt[1])]
            if opt[0] in ('-l', '--album'):
                gtags["album"] = [unicode (opt[1])]
            if opt[0] in ('-d', '--date'):
                gtags["date"] = [unicode (opt[1])]
            if opt[0] in ('-g', '--genre'):
                gtags["genre"] = [unicode (opt[1])]

        if args:
            directory = args[0]
        directory = directory + '/'

        files = listdir(directory)
        files.sort()
        for file in files:
            if file[-5:] == ".flac":
                tags = gtags.copy ()
                filenamemp3 = file[:-5] + ".mp3"
                flacfile = FLAC(directory + file)
                if "title" in flacfile:
                    tags["title"] = flacfile["title"]
                else:
                    tags["title"] = file[:-5]

                if "tracknumber" in flacfile:
                    if len (flacfile["tracknumber"][0]) == 1:
                        number = decimal (flacfile["tracknumber"][0])
                        number = unicode ('0' + str(number))
                        tags["tracknumber"] = [number]
                    else:
                        tags["tracknumber"] = flacfile["tracknumber"]

                for tag in ["artist", "album", "date", "genre"]:
                    if tag not in tags and tag in flacfile.keys():
                        tags[tag] = flacfile[tag]
                if filenamemp3 not in files:
                    # lame has a problem, if no tag is set then it
                    # doesn't pad for id3 header so I add comment =foo
                    command = 'flac -s -dc "%s" | lame  --tc "foo" --quiet -vbr-new -V 2 -b 160 - "%s"' % \
                        (directory + file, directory + filenamemp3)
                    system (command)
                    #print command
                mp3file = EasyID3 (directory + filenamemp3)
                for tag in tags:
                    #print tags[tag]
                    mp3file[tag] = tags[tag]
                mp3file.save()
                print "File %s done." % filenamemp3
        return 0

    except Usage, err:
        print >>sys.stderr, err.msg
        print >>sys.stderr, "for help use --help"
        return 2

if __name__ == "__main__":
    sys.exit (main())
