#!/usr/bin/env python

import sys
import re
import urllib
import urllib2
import webbrowser
from xml.etree import ElementTree
from PyQt4 import QtCore, QtGui

class ItunesImportDialog(QtGui.QMainWindow):

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setWindowTitle("iTunes Import")
        self.resize(QtCore.QSize(500, 300).expandedTo(self.minimumSizeHint()))
        self.cw = QtGui.QWidget()
        self.setCentralWidget(self.cw)
        vbox = QtGui.QVBoxLayout(self.cw)
        hbox = QtGui.QHBoxLayout()
        self.url = QtGui.QLineEdit(self.cw)
        importbtn = QtGui.QPushButton("Import", self.cw)
        self.connect(importbtn, QtCore.SIGNAL("clicked()"), self.importAlbum)
        hbox.addWidget(self.url)
        hbox.addWidget(importbtn)
        self.doc = QtGui.QTextDocument(self)
        browser = QtGui.QTextBrowser(self.cw)
        browser.setDocument(self.doc)
        browser.setOpenExternalLinks(True)
        btnbox = QtGui.QDialogButtonBox(self.cw)
        closebtn = btnbox.addButton(QtGui.QDialogButtonBox.Close)
        self.connect(closebtn, QtCore.SIGNAL("clicked()"), self.close)
        vbox.addLayout(hbox)
        vbox.addWidget(browser)
        vbox.addWidget(btnbox)

    def importAlbum(self):
        url = unicode(self.url.text())
        m = re.search("\?id=(\d+)", url.lower())
        if m:
            url = self.loadFromItunes(m.group(1))
            self.doc.setHtml('<a href="%s">%s</a>' % (url, url))
        else:
            self.doc.setHtml("Incorrect URL - %s" % url)

    def loadFromItunes(self, albumid):
        def format_time(ms):
            return "%d:%02d" % (ms / 60000, (ms / 1000) % 60)

        url = 'http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum'
        headers = {'User-Agent': 'iTunes/7.3 (Macintosh; N; PPC)'}
        values = {'playlistId': albumid}
        data = urllib.urlencode(values)
        req = urllib2.Request(url, data, headers)
        response = urllib2.urlopen(req)
        the_page = response.read()

        tree = ElementTree.fromstring(the_page)
        artists = {}
        data = []
        for e in tree.find("{http://www.apple.com/itms/}TrackList/{http://www.apple.com/itms/}plist/{http://www.apple.com/itms/}dict/{http://www.apple.com/itms/}array"):
            d = {}
            for e2 in e:
                if e2.tag == '{http://www.apple.com/itms/}key':
                    key = e2.text
                else:
                    d[key] = e2.text
            artists[d['artistName']] = 1
            data.append(d)

        values = {}
        if len(artists) > 1:
            values['hasmultipletrackartists'] = '1'
            values['artistid'] = '1'
            values['artistname'] = 'Various Artists'
        else:
            values['hasmultipletrackartists'] = '0'
            values['artistid'] = '2'
            values['artistname'] = data[0]['artistName'].encode('utf-8')
        values['artistedit'] = '1'
        values['releasename'] = data[0]['playlistName'].encode('utf-8')
        tracks = 0
        for i, d in enumerate(data):
            try:
                i = int(d['trackNumber']) - 1
            except:
                pass
            tracks = max(tracks, i + 1)
            values['track%d' % i] = d['itemName'].encode('utf-8')
            values['tracklength%d' % i] = format_time(int(d['duration']))
            if len(artists) > 1:
                values['tr%d_artistedit' % i] = '1'
            values['tr%d_artistname' % i] = d['artistName'].encode('utf-8')
        values['tracks'] = str(tracks)

        return 'http://musicbrainz.org/cdi/enter.html?' + urllib.urlencode(values)


app = QtGui.QApplication(sys.argv)
dlg = ItunesImportDialog()
dlg.show()
app.exec_()
