Changeset 523

Show
Ignore:
Timestamp:
12/17/06 22:59:53 (2 years ago)
Author:
nicfit
Message:

CDDB lookups

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/cdrom_control.py

    r522 r523  
    2121from fcntl import ioctl 
    2222import dbus, gobject, gtk, gnomevfs 
    23 import DiscID, CDDB 
    2423 
    2524from mesk import MeskException 
     
    124123 
    125124    def _read_cdinfo(self): 
     125        import DiscID 
    126126        pl = mesk.playlist.Playlist() 
    127127        disc = DiscID.open(self.block_device) 
     
    154154            total += length 
    155155 
     156        # Fetch metadata from CDDB 
     157        self.cddb_fetcher = CDDBThread(disc_info, self._update_metadata_cddb) 
     158        self.cddb_fetcher.start() 
     159 
    156160        return pl 
    157161 
     
    176180        mesk.log.debug("Ejecting %s" % self.block_device) 
    177181        devices.cdrom_eject(self.block_device) 
     182 
     183    def _update_metadata_cddb(self, disc_id, cddb_info): 
     184        num_tracks = disc_id[1] 
     185        artist, album = cddb_info['DTITLE'].split(' / ') 
     186        year = cddb_info['DYEAR'] 
     187        for i in range(num_tracks): 
     188            # FIXME: Turn into unicode, cddb protocol v6 uses utf-8 instead of 
     189            #        iso-8859-1 
     190            src = self._playlist[i] 
     191            src.meta_data.artist = artist 
     192            src.meta_data.album = album 
     193            if year: 
     194                src.meta_data.year = int(year) 
     195            src.meta_data.title = cddb_info['TTITLE%d' % i] 
     196            self._update_source_row(src) 
     197 
     198import threading, CDDB 
     199class CDDBThread(threading.Thread): 
     200    def __init__(self, disc_id, cb): 
     201        threading.Thread.__init__(self) 
     202        self._disc_id = disc_id 
     203        self._cb = cb 
     204 
     205    def run(self): 
     206        (status, info) = CDDB.query(self._disc_id, 
     207                                    client_name=mesk.info.APP_NAME, 
     208                                    client_version=mesk.info.APP_VERSION) 
     209        if status in [200, 210, 211]: 
     210            if status in [210, 211]: 
     211                info = info[0] 
     212        else: 
     213            mesk.log.verbose('Unable to fetch CDDB info, status=%d' % status) 
     214 
     215        (status, info) = CDDB.read(info['category'], info['disc_id']) 
     216        if status != 210: 
     217            mesk.log.verbose('Unable to fetch CDDB info, status=%d' % status) 
     218            return 
     219 
     220        gobject.idle_add(self._cb, self._disc_id, info) 
  • trunk/src/playlist_control.py

    r522 r523  
    600600        if not self._is_active: 
    601601            return 
    602  
     602        self._update_source_row(audio_src) 
     603 
     604    def _update_source_row(self, audio_src): 
    603605        # Update model data with tag update 
    604606        row = self._playlist.index(audio_src)