PLUGIN_NAME = 'iTunes Cover Art'
PLUGIN_AUTHOR = '1337 h4xx0r'
PLUGIN_DESCRIPTION = 'Downloads cover art from iTunes Store.'
PLUGIN_VERSION = '0.1'
PLUGIN_API_VERSIONS = ['0.9.0']


from picard.metadata import register_album_metadata_processor
from picard.util import partial
from PyQt4.QtCore import QUrl
import re


def get_from_itunes(xmlws, host, path, handler, xml):
    header = xmlws._prepare('GET', host, 80, path)
    header.setValue('User-Agent', 'iTunes/7.1 (Macintosh; N; Intel)')
    header.removeValue('Connection')
    requestid = xmlws.request(header)
    xmlws._request_handlers[requestid] = (handler, xml)
    return True


_disc_re = re.compile(r'\(disc .*?\)')
_coverart_re = re.compile(r'http://(a1\.phobos\.apple\.com)(/.+?/Music/.+?/.+?/.+?/.+?)\.\d+x\d+-\d+\.jpg')


def _coverart_downloaded(album, metadata, release, try_list, data, http, error):
    try:
        if not error and len(data) > 1000:
            metadata.add_image("image/jpeg", data)
            for track in album._new_tracks:
                track.metadata.add_image("image/jpeg", data)
        elif try_list:
            next = partial(_coverart_downloaded, album, metadata, release, try_list[1:])
            func = partial(get_from_itunes, album.tagger.xmlws, try_list[0][0],
                           try_list[0][1], next, False)
            album._requests += 1
            album.tagger.xmlws.add_task(func, position=1)
    finally:
        album._requests -= 1
        album._finalize_loading(None)


def _searchpage_downloaded(album, metadata, release, data, http, error):
    try:
        if not error and len(data) > 1000:
            match = _coverart_re.search(data)
            if match:
                host = match.group(1)
                try_list = [
                    (host, match.group(2) + '.jpg'),
                    (host, match.group(2) + '.170x170-75.jpg'),
                ]
                next = partial(_coverart_downloaded, album, metadata, release, try_list[1:])
                func = partial(get_from_itunes, album.tagger.xmlws, try_list[0][0],
                               try_list[0][1], next, False)
                album._requests += 1
                album.tagger.xmlws.add_task(func, position=1)
    finally:
        album._requests -= 1
        album._finalize_loading(None)


def itunes_coverart(album, metadata, release, try_list=None):
    albumterm = _disc_re.sub(metadata['album'], '')
    path = '/WebObjects/MZSearch.woa/wa/advancedSearchResults'
    path += '?artistTerm=%s' % QUrl.toPercentEncoding(metadata['artist'])
    path += '&albumTerm=%s' % QUrl.toPercentEncoding(albumterm)
    next = partial(_searchpage_downloaded, album, metadata, release)
    func = partial(get_from_itunes, album.tagger.xmlws, 'phobos.apple.com',
                   path, next, False)
    album._requests += 1
    album.tagger.xmlws.add_task(func, position=1)



register_album_metadata_processor(itunes_coverart)
