#!/usr/bin/env python
#coding=utf-8
"""
Author:         Xia Kai <xiaket@corp.netease.com/xiaket@gmail.com>
Filename:       convert-cd.py
Type:           Utility
Last modified:  2011-10-11 18:53

Description:
这个脚本将能够把CD转成Apple Lossless格式的音乐.
"""
import os
import sys

from time import sleep
from win32com.client import Dispatch


def exit(message):
    confirm = raw_input(message)
    sys.exit(1)

def main():
    itunes = Dispatch("iTunes.Application")
    for source in itunes.Sources:
        if source.Kind == 3:
            break
    else:
        exit("audio CD not found. Enter to exit.")
    if itunes.CurrentEncoder.Name.lower() != "lossless encoder":
        exit("Bad encoder, switch to ALAC please. Enter to exit.")
    playlist = source.Playlists[0]
    # 转换全部的track.
    status = itunes.ConvertTracks(playlist.Tracks)
    while status.InProgress:
        sleep(1)

    all_tracks = itunes.LibraryPlaylist.Tracks
    album_name = playlist.Name
    for cd_track in playlist.Tracks:
        for track in reversed(all_tracks):
            if track.Name == cd_track.Name and track.Album == album_name:
                print track.Duration == cd_track.Duration, track.Name, track.Duration, cd_track.Duration
                if track.Duration != cd_track.Duration:
                    # Convert again. 
                    retry = 0
                    while track.Duration != cd_track.Duration and retry < 10:
                        # delete bad converted track.
                        print "retrying %s, count=%s" % (track.Name, retry)
                        retry += 1
                        os.remove(track.Location)
                        track.Delete()
                        # Convert again.
                        status = itunes.ConvertTrack(cd_track)
                        while status.InProgress:
                            sleep(0.5)
                        for t in reversed(all_tracks):
                            if t.Name == cd_track.Name and t.Album == album_name:
                                track = t
                                break
                        else:
                            print "track '%s' not found." % track.Name
                    if retry >= 10:
                        confirm = raw_input("'%s' not converted." % track.Name)
                break
        else:
            print "track '%s' not found." % track.Name

    raw_input("all done.")


if __name__ == "__main__":
    main()

