home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / rhythmbox / plugins / artdisplay / AmazonCoverArtSearch.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-30  |  7.0 KB  |  225 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. from xml.dom import minidom
  5. import re
  6. import locale
  7. import urllib
  8. import rhythmdb
  9. from Loader import Loader
  10. LICENSE_KEY = '18C3VZN9HCECM5G3HQG2'
  11. DEFAULT_LOCALE = 'en_US'
  12. ASSOCIATE = 'webservices-20'
  13.  
  14. class Bag:
  15.     pass
  16.  
  17.  
  18. class AmazonCoverArtSearch(object):
  19.     
  20.     def __init__(self, loader):
  21.         self.searching = False
  22.         self.cancel = False
  23.         self.loader = loader
  24.         self._supportedLocales = {
  25.             'en_US': ('us', 'xml.amazon.com'),
  26.             'en_GB': ('uk', 'xml-eu.amazon.com'),
  27.             'de': ('de', 'xml-eu.amazon.com'),
  28.             'ja': ('jp', 'xml.amazon.co.jp') }
  29.         self.db = None
  30.         self.entry = None
  31.  
  32.     
  33.     def __get_locale(self):
  34.         default = locale.getdefaultlocale()
  35.         lc_id = DEFAULT_LOCALE
  36.         if default[0] is not None:
  37.             if self._supportedLocales.has_key(default[0]):
  38.                 lc_id = default[0]
  39.             
  40.         
  41.         lc_host = self._supportedLocales[lc_id][1]
  42.         lc_name = self._supportedLocales[lc_id][0]
  43.         return (lc_host, lc_name)
  44.  
  45.     
  46.     def search(self, db, entry, on_search_completed_callback, *args):
  47.         self.searching = True
  48.         self.cancel = False
  49.         self.db = db
  50.         self.entry = entry
  51.         self.on_search_completed_callback = on_search_completed_callback
  52.         self.args = args
  53.         self.keywords = []
  54.         st_artist = db.entry_get(entry, rhythmdb.PROP_ARTIST)
  55.         st_album = db.entry_get(entry, rhythmdb.PROP_ALBUM)
  56.         for char in [
  57.             '"']:
  58.             st_artist = st_artist.replace(char, '')
  59.             st_album = st_album.replace(char, '')
  60.         
  61.         self.st_album = st_album
  62.         self.st_artist = st_artist
  63.         for exp in [
  64.             '\\([Dd]isc *[1-9]+\\)',
  65.             '\\([Cc][Dd] *[1-9]+\\)']:
  66.             p = re.compile(exp)
  67.             st_album = p.sub('', st_album)
  68.         
  69.         st_album_no_vol = st_album
  70.         for exp in [
  71.             '\\(*[Vv]ol.*[1-9]+\\)*']:
  72.             p = re.compile(exp)
  73.             st_album_no_vol = p.sub('', st_album_no_vol)
  74.         
  75.         self.st_album_no_vol = st_album_no_vol
  76.         self.search_album = st_album
  77.         self.search_artist = st_artist
  78.         self.search_album_no_vol = st_album_no_vol
  79.         if st_album == 'Unknown':
  80.             self.keywords.append('%s Best of' % st_artist)
  81.             self.keywords.append('%s Greatest Hits' % st_artist)
  82.             self.keywords.append('%s Essential' % st_artist)
  83.             self.keywords.append('%s Collection' % st_artist)
  84.             self.keywords.append('%s' % st_artist)
  85.         elif st_artist == 'Unknown':
  86.             self.keywords.append('%s' % st_album)
  87.             if st_album_no_vol != st_artist:
  88.                 self.keywords.append('%s' % st_album_no_vol)
  89.             
  90.             self.keywords.append('Various %s' % st_album)
  91.         elif st_album != st_artist:
  92.             self.keywords.append('%s %s' % (st_artist, st_album))
  93.             if st_album_no_vol != st_album:
  94.                 self.keywords.append('%s %s' % (st_artist, st_album_no_vol))
  95.             
  96.             if st_album != 'Unknown':
  97.                 self.keywords.append('Various %s' % st_album)
  98.             
  99.         
  100.         self.keywords.append('%s' % st_artist)
  101.         self.search_next()
  102.  
  103.     
  104.     def __build_url(self, keyword):
  105.         (lc_host, lc_name) = self._AmazonCoverArtSearch__get_locale()
  106.         url = 'http://' + lc_host + '/onca/xml3?f=xml'
  107.         url += '&t=%s' % ASSOCIATE
  108.         url += '&dev-t=%s' % LICENSE_KEY
  109.         url += '&type=%s' % 'lite'
  110.         url += '&locale=%s' % lc_name
  111.         url += '&mode=%s' % 'music'
  112.         url += '&%s=%s' % ('KeywordSearch', urllib.quote(keyword))
  113.         return url
  114.  
  115.     
  116.     def search_next(self):
  117.         self.searching = True
  118.         if len(self.keywords) == 0:
  119.             keyword = None
  120.         else:
  121.             keyword = self.keywords.pop(0)
  122.         if keyword is None:
  123.             self.on_search_completed(None)
  124.             ret = False
  125.         else:
  126.             url = self._AmazonCoverArtSearch__build_url(keyword.strip())
  127.             self.loader.get_url(url, self.on_search_response)
  128.             ret = True
  129.         return ret
  130.  
  131.     
  132.     def __unmarshal(self, element):
  133.         rc = Bag()
  134.         if isinstance(element, minidom.Element) and element.tagName == 'Details':
  135.             rc.URL = element.attributes['url'].value
  136.         
  137.         childElements = _[1]
  138.         return rc
  139.  
  140.     
  141.     def on_search_response(self, result_data):
  142.         if result_data is None:
  143.             self.search_next()
  144.             return None
  145.         
  146.         
  147.         try:
  148.             xmldoc = minidom.parseString(result_data)
  149.         except:
  150.             self.search_next()
  151.             return None
  152.  
  153.         data = self._AmazonCoverArtSearch__unmarshal(xmldoc).ProductInfo
  154.         if hasattr(data, 'ErrorMsg'):
  155.             self.search_next()
  156.         else:
  157.             self.on_search_results(data.Details)
  158.  
  159.     
  160.     def on_search_results(self, results):
  161.         self.on_search_completed(results)
  162.  
  163.     
  164.     def on_search_completed(self, result):
  165.         self.on_search_completed_callback(self, self.entry, result, *self.args)
  166.         self.searching = False
  167.  
  168.     
  169.     def __tidy_up_string(self, s):
  170.         s = s.lower()
  171.         s = s.strip()
  172.         s = s.replace(' - ', ' ')
  173.         s = s.replace(': ', ' ')
  174.         s = s.replace(' & ', ' and ')
  175.         return s
  176.  
  177.     
  178.     def get_best_match(self, search_results):
  179.         best_match = None
  180.         
  181.         try:
  182.             if self.search_album != 'Unknown':
  183.                 album_check = self._AmazonCoverArtSearch__tidy_up_string(self.search_album)
  184.                 for item in search_results:
  185.                     product_name = self._AmazonCoverArtSearch__tidy_up_string(item.ProductName)
  186.                     if product_name == album_check:
  187.                         best_match = item
  188.                         break
  189.                         continue
  190.                     if best_match is None and product_name.find(album_check) != -1:
  191.                         best_match = item
  192.                         continue
  193.                 
  194.             
  195.             if self.search_album == 'Unknown' and self.search_artist != 'Unknown':
  196.                 artist_check = self._AmazonCoverArtSearch__tidy_up_string(self.search_artist)
  197.                 if best_match is None:
  198.                     hit = False
  199.                     for item in search_results:
  200.                         if type(item.Artists.Artist) != type([]):
  201.                             artists = [
  202.                                 item.Artists.Artist]
  203.                         else:
  204.                             artists = item.Artists.Artist
  205.                         for artist in artists:
  206.                             artist = self._AmazonCoverArtSearch__tidy_up_string(artist)
  207.                             if artist.find(artist_check) != -1:
  208.                                 best_match = item
  209.                                 hit = True
  210.                                 break
  211.                                 continue
  212.                         
  213.                         if hit:
  214.                             break
  215.                             continue
  216.                     
  217.                 
  218.             
  219.             return best_match
  220.         except TypeError:
  221.             return None
  222.  
  223.  
  224.  
  225.