home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.4)
-
- from xml.dom import minidom
- import re
- import locale
- import urllib
- import rhythmdb
- from Loader import Loader
- LICENSE_KEY = '18C3VZN9HCECM5G3HQG2'
- DEFAULT_LOCALE = 'en_US'
- ASSOCIATE = 'webservices-20'
-
- class Bag:
- pass
-
-
- class AmazonCoverArtSearch(object):
-
- def __init__(self, loader):
- self.searching = False
- self.cancel = False
- self.loader = loader
- self._supportedLocales = {
- 'en_US': ('us', 'xml.amazon.com'),
- 'en_GB': ('uk', 'xml-eu.amazon.com'),
- 'de': ('de', 'xml-eu.amazon.com'),
- 'ja': ('jp', 'xml.amazon.co.jp') }
- self.db = None
- self.entry = None
-
-
- def __get_locale(self):
- default = locale.getdefaultlocale()
- lc_id = DEFAULT_LOCALE
- if default[0] is not None:
- if self._supportedLocales.has_key(default[0]):
- lc_id = default[0]
-
-
- lc_host = self._supportedLocales[lc_id][1]
- lc_name = self._supportedLocales[lc_id][0]
- return (lc_host, lc_name)
-
-
- def search(self, db, entry, on_search_completed_callback, *args):
- self.searching = True
- self.cancel = False
- self.db = db
- self.entry = entry
- self.on_search_completed_callback = on_search_completed_callback
- self.args = args
- self.keywords = []
- st_artist = db.entry_get(entry, rhythmdb.PROP_ARTIST)
- st_album = db.entry_get(entry, rhythmdb.PROP_ALBUM)
- for char in [
- '"']:
- st_artist = st_artist.replace(char, '')
- st_album = st_album.replace(char, '')
-
- self.st_album = st_album
- self.st_artist = st_artist
- for exp in [
- '\\([Dd]isc *[1-9]+\\)',
- '\\([Cc][Dd] *[1-9]+\\)']:
- p = re.compile(exp)
- st_album = p.sub('', st_album)
-
- st_album_no_vol = st_album
- for exp in [
- '\\(*[Vv]ol.*[1-9]+\\)*']:
- p = re.compile(exp)
- st_album_no_vol = p.sub('', st_album_no_vol)
-
- self.st_album_no_vol = st_album_no_vol
- self.search_album = st_album
- self.search_artist = st_artist
- self.search_album_no_vol = st_album_no_vol
- if st_album == 'Unknown':
- self.keywords.append('%s Best of' % st_artist)
- self.keywords.append('%s Greatest Hits' % st_artist)
- self.keywords.append('%s Essential' % st_artist)
- self.keywords.append('%s Collection' % st_artist)
- self.keywords.append('%s' % st_artist)
- elif st_artist == 'Unknown':
- self.keywords.append('%s' % st_album)
- if st_album_no_vol != st_artist:
- self.keywords.append('%s' % st_album_no_vol)
-
- self.keywords.append('Various %s' % st_album)
- elif st_album != st_artist:
- self.keywords.append('%s %s' % (st_artist, st_album))
- if st_album_no_vol != st_album:
- self.keywords.append('%s %s' % (st_artist, st_album_no_vol))
-
- if st_album != 'Unknown':
- self.keywords.append('Various %s' % st_album)
-
-
- self.keywords.append('%s' % st_artist)
- self.search_next()
-
-
- def __build_url(self, keyword):
- (lc_host, lc_name) = self._AmazonCoverArtSearch__get_locale()
- url = 'http://' + lc_host + '/onca/xml3?f=xml'
- url += '&t=%s' % ASSOCIATE
- url += '&dev-t=%s' % LICENSE_KEY
- url += '&type=%s' % 'lite'
- url += '&locale=%s' % lc_name
- url += '&mode=%s' % 'music'
- url += '&%s=%s' % ('KeywordSearch', urllib.quote(keyword))
- return url
-
-
- def search_next(self):
- self.searching = True
- if len(self.keywords) == 0:
- keyword = None
- else:
- keyword = self.keywords.pop(0)
- if keyword is None:
- self.on_search_completed(None)
- ret = False
- else:
- url = self._AmazonCoverArtSearch__build_url(keyword.strip())
- self.loader.get_url(url, self.on_search_response)
- ret = True
- return ret
-
-
- def __unmarshal(self, element):
- rc = Bag()
- if isinstance(element, minidom.Element) and element.tagName == 'Details':
- rc.URL = element.attributes['url'].value
-
- childElements = _[1]
- return rc
-
-
- def on_search_response(self, result_data):
- if result_data is None:
- self.search_next()
- return None
-
-
- try:
- xmldoc = minidom.parseString(result_data)
- except:
- self.search_next()
- return None
-
- data = self._AmazonCoverArtSearch__unmarshal(xmldoc).ProductInfo
- if hasattr(data, 'ErrorMsg'):
- self.search_next()
- else:
- self.on_search_results(data.Details)
-
-
- def on_search_results(self, results):
- self.on_search_completed(results)
-
-
- def on_search_completed(self, result):
- self.on_search_completed_callback(self, self.entry, result, *self.args)
- self.searching = False
-
-
- def __tidy_up_string(self, s):
- s = s.lower()
- s = s.strip()
- s = s.replace(' - ', ' ')
- s = s.replace(': ', ' ')
- s = s.replace(' & ', ' and ')
- return s
-
-
- def get_best_match(self, search_results):
- best_match = None
-
- try:
- if self.search_album != 'Unknown':
- album_check = self._AmazonCoverArtSearch__tidy_up_string(self.search_album)
- for item in search_results:
- product_name = self._AmazonCoverArtSearch__tidy_up_string(item.ProductName)
- if product_name == album_check:
- best_match = item
- break
- continue
- if best_match is None and product_name.find(album_check) != -1:
- best_match = item
- continue
-
-
- if self.search_album == 'Unknown' and self.search_artist != 'Unknown':
- artist_check = self._AmazonCoverArtSearch__tidy_up_string(self.search_artist)
- if best_match is None:
- hit = False
- for item in search_results:
- if type(item.Artists.Artist) != type([]):
- artists = [
- item.Artists.Artist]
- else:
- artists = item.Artists.Artist
- for artist in artists:
- artist = self._AmazonCoverArtSearch__tidy_up_string(artist)
- if artist.find(artist_check) != -1:
- best_match = item
- hit = True
- break
- continue
-
- if hit:
- break
- continue
-
-
-
- return best_match
- except TypeError:
- return None
-
-
-
-