예제 #1
0
    def get_cddb(self):
        try:
            import CDDB, DiscID
        except ImportError:
            fatal('You need python-cddb (http://cddb-py.sf.net) to convert cds. Please install it.')

        disc_id    = DiscID.disc_id(DiscID.open(self.dev))
        query_info = CDDB.query(disc_id)[1]
        if not query_info:
            fatal('The disk is not listed in FreeDB, dir2ogg only supports disk listed in MusicBrainz or FreeDB')
        if isinstance(query_info, list):
            query_info = query_info[0]
        read_info = CDDB.read(query_info['category'], query_info['disc_id'])[1]

        for track in range(disc_id[1]):
            title           = {}
            title['discid'] = query_info['disc_id']
            title['artist'], title['album'] = (track.strip() for track in query_info['title'].split("/"))
            title['genre']  = read_info['DGENRE']
            title['date']   = read_info['DYEAR']
            title['title']  = read_info['TTITLE' + str(track)]
            title['tracktotal'] = str(len(range(disc_id[1])) + 1)
            title['ntracknumber'] = '0' * (len(title['tracktotal'] ) - len(str(track+1)) ) + str(track+1)
            title['tracknumber'] = str(track+1)
            for key, val in title.items():
                title[key] =  unicode(str(val), "ISO-8859-1")
            ConvertTrack(self.dev, self.conf, track+1, title)
예제 #2
0
    def __init__(self):
    
        cdaudio = DiscID.open()
        print "CD: ", cdaudio

        try:
            self.disc_id = DiscID.disc_id(cdaudio)
            print "disc_id: ", self.disc_id
            self.is_audio_cd = True
        except:
            print "No CD"
            disc_id = None
            self.is_audio_cd = False
            self.song_list = []
            cdaudio.close()
            raise
        
        if self.is_audio_cd:
            try:
                self.query_status, self.query_info = CDDB.query(self.disc_id)
                print "query_status: ", self.query_status
                print "query_info: ", self.query_info
            except:
                print 'IOError'
                self.song_list = []
                cdaudio.close()
                self.query_status = 409
                self.query_info = {"disc_id": "", "category": "", "title":""}
                pass
예제 #3
0
    def read_cdinfo(self, device_path):
        import DiscID
        disc = DiscID.open(device_path)
        try:
            disc_info = DiscID.disc_id(disc)
        except:
            disc.close()
        disc.close()
        disc_id = disc_info[0]
        num_tracks = disc_info[1]

        # Create playlist from CD tracks
        minus = 0
        total = 0
        for i in range(num_tracks):
            length = (disc_info[i + 3] / 75) - minus
            if i + 1 == disc_info[1]:
                length = disc_info[i + 3] - total

            minus = disc_info[i + 3] / 75
            total += length

        # Fetch metadata from CDDB
        self.cddb_fetcher = CDDBThread(disc_info, self.__update_metadata_cddb)
        self.cddb_fetcher.start()
예제 #4
0
파일: __init__.py 프로젝트: dangmai/exaile
    def get_cddb_info(self):
        try:
            disc = DiscID.open(self.device)
            self.info = DiscID.disc_id(disc)
            status, info = CDDB.query(self.info)
        except IOError:
            return

        if status in (210, 211):
            info = info[0]
            status = 200
        if status != 200:
            return

        (status, info) = CDDB.read(info["category"], info["disc_id"])

        title = info["DTITLE"].split(" / ")
        for i in range(self.info[1]):
            tr = self[i]
            tr.set_tag_raw("title", info["TTITLE" + str(i)].decode("iso-8859-15", "replace"))
            tr.set_tag_raw("album", title[1].decode("iso-8859-15", "replace"))
            tr.set_tag_raw("artist", title[0].decode("iso-8859-15", "replace"))
            tr.set_tag_raw("year", info["EXTD"].replace("YEAR: ", ""))
            tr.set_tag_raw("genre", info["DGENRE"])

        self.name = title[1].decode("iso-8859-15", "replace")
        event.log_event("cddb_info_retrieved", self, True)
예제 #5
0
    def _lookup_cddb(self):
        """
        returns a cdinfo() instance containing the information we found in
        cddb, or None if that doesn't work.  This method doesn't intentionally
        throw any exceptions (unlike _lookup_mb) although I'm sure it's
        possible.
        """
        import DiscID, CDDB
        if self.cddevice: dev = DiscID.open(self.cddevice)
        else: dev = DiscID.open()
        cdid = DiscID.disc_id(dev)
        tracks = cdid[1]
        (status, info) = CDDB.query(cdid)
        if status == 200:
            (status, info) = CDDB.read(info['category'], \
                                       info['disc_id'])
        elif status == 210 or status == 211:
            (status, info) = CDDB.read(info[0]['category'], \
                                       info[0]['disc_id'])
        else:
            return None

        ret = cdinfo()
        for key in info.keys():
            if key.startswith('TTITLE'):
                n = int(re.findall("TTITLE([0-9]+)", key)[0])
                ret.titles[n] = info[key].encode('ascii', errors='replace')
            elif key == 'DTITLE':
                (artist, album) = info[key].split('/')
                ret.artist = artist.strip()
                ret.album = album.strip()
            elif key == 'DYEAR':
                ret.releasedate = info[key]
        wx.LogMessage("cddb succeeded")
        return ret
예제 #6
0
파일: dir2ogg.py 프로젝트: pat1/autoradio
    def get_cddb(self):
        try:
            import CDDB, DiscID
        except ImportError:
            fatal('You need python-cddb (http://cddb-py.sf.net) to convert cds. Please install it.')

        disc_id    = DiscID.disc_id(DiscID.open(self.dev))
        query_info = CDDB.query(disc_id)[1]
        if not query_info:
            fatal('The disk is not listed in FreeDB, dir2ogg only supports disk listed in MusicBrainz or FreeDB')
        if isinstance(query_info, list):
            query_info = query_info[0]
        read_info = CDDB.read(query_info['category'], query_info['disc_id'])[1]

        for track in range(disc_id[1]):
            title           = {}
            title['discid'] = query_info['disc_id']
            title['artist'], title['album'] = (track.strip() for track in query_info['title'].split("/"))
            title['genre']  = read_info['DGENRE']
            title['date']   = read_info['DYEAR']
            title['title']  = read_info['TTITLE' + str(track)]
            title['tracktotal'] = str(len(range(disc_id[1])) + 1)
            title['ntracknumber'] = '0' * (len(title['tracktotal'] ) - len(str(track+1)) ) + str(track+1)
            title['tracknumber'] = str(track+1)
            for key, val in title.items():
                title[key] =  unicode(str(val), "ISO-8859-1")
            ConvertTrack(self.dev, self.conf, track+1, title)
예제 #7
0
파일: Cdrom.py 프로젝트: handsomegui/Gereqi
 def get_info(self):
     cd_drive = DiscID.open()
     try:
         disc_id = DiscID.disc_id(cd_drive)
     except cdrom.error, err:
         msg = err[1]
         raise StandardError(str(msg))
예제 #8
0
    def get_cddb_info(self):
        try:
            disc = DiscID.open(self.device)
            self.info = DiscID.disc_id(disc)
            status, info = CDDB.query(self.info)
        except IOError:
            return

        if status in (210, 211):
            info = info[0]
            status = 200
        if status != 200:
            return

        (status, info) = CDDB.read(info['category'], info['disc_id'])

        title = info['DTITLE'].split(" / ")
        for i in range(self.info[1]):
            tr = self[i]
            tr.set_tag_raw('title',
                    info['TTITLE' + `i`].decode('iso-8859-15', 'replace'))
            tr.set_tag_raw('album',
                    title[1].decode('iso-8859-15', 'replace'))
            tr.set_tag_raw('artist',
                    title[0].decode('iso-8859-15', 'replace'))
            tr.set_tag_raw('year',
                    info['EXTD'].replace("YEAR: ", ""))
            tr.set_tag_raw('genre',
                    info['DGENRE'])

        self.name = title[1].decode('iso-8859-15', 'replace')
        event.log_event('cddb_info_retrieved', self, True)
예제 #9
0
    def cd_rip(self, device):
        self.log.debug(device.device_node)
        self.log.debug(device.device_path)

        if self.is_cd_ready():
            try:
                # cddb
                cd_title = None
                cdrom = DiscID.open()
                disc_id = DiscID.disc_id(cdrom)
                (query_status, query_info) = CDDB.query(disc_id)
                if query_status == 200:
                    cd_title = query_info['title'][:20]

                self.log.info("Starting CD ripping for %s" % cd_title)
                rip_workdir = get_config(self.args.conf, 'Ripping', 'workdir')
                ripper = Worker(rip_workdir)
                cd2cloud_cfg = get_config(self.args.conf, 'Ripping',
                                          'abcde_conf')
                cmd = '/usr/bin/abcde -c %s -j 5 -N' % cd2cloud_cfg

                #ripper.thread(cmd)
                ripper.run_cmd(cmd)
                self.log.info("Complete CD ripping for %s" % cd_title)
                self.notify(cd_title)
            except:
                msg = 'FAILED %s' % cd_title
                self.notify(msg)
예제 #10
0
    def get_cddb_info(self):
        try:
            disc = DiscID.open(self.device)
            self.info = DiscID.disc_id(disc)
            status, info = CDDB.query(self.info)
        except IOError:
            return

        if status in (210, 211):
            info = info[0]
            status = 200
        if status != 200:
            return

        (status, info) = CDDB.read(info['category'], info['disc_id'])

        title = info['DTITLE'].split(" / ")
        for i in range(self.info[1]):
            tr = self[i]
            tr.set_tag_raw(
                'title', info['TTITLE' + ` i `].decode('iso-8859-15',
                                                       'replace'))
            tr.set_tag_raw('album', title[1].decode('iso-8859-15', 'replace'))
            tr.set_tag_raw('artist', title[0].decode('iso-8859-15', 'replace'))
            tr.set_tag_raw('year', info['EXTD'].replace("YEAR: ", ""))
            tr.set_tag_raw('genre', info['DGENRE'])

        self.name = title[1].decode('iso-8859-15', 'replace')
        event.log_event('cddb_info_retrieved', self, True)
예제 #11
0
    def __init__(self):

        cdaudio = DiscID.open()
        print "CD: ", cdaudio

        try:
            self.disc_id = DiscID.disc_id(cdaudio)
            print "disc_id: ", self.disc_id
            self.is_audio_cd = True
        except:
            print "No CD"
            disc_id = None
            self.is_audio_cd = False
            self.song_list = []
            cdaudio.close()
            raise

        if self.is_audio_cd:
            try:
                self.query_status, self.query_info = CDDB.query(self.disc_id)
                print "query_status: ", self.query_status
                print "query_info: ", self.query_info
            except:
                print 'IOError'
                self.song_list = []
                cdaudio.close()
                self.query_status = 409
                self.query_info = {"disc_id": "", "category": "", "title": ""}
                pass
예제 #12
0
파일: model.py 프로젝트: agoodno/python
	def read(self):
		try:
			device = DiscID.open()
			disc_info = DiscID.disc_id(device)
			(query_status, self.query_info) = CDDB.query(disc_info)
		except cdrom.error, e:
			raise cdrom.error, e
예제 #13
0
def is_cd_ready():
    try:
        cdrom = DiscID.open()
        disc_id = DiscID.disc_id(cdrom)
        return True
    except Exception as ex:
        print 'disc not inserted %s' % ex
        return False
예제 #14
0
 def is_cd_ready(self=None):
     """Check if CD (drive) is accessible and if there an not empty
     CDROM (media) inserted and ready"""
     try:
         cdrom = DiscID.open()
         disc_id = DiscID.disc_id(cdrom)
         return True
     except:
         self.log.warn('no disc in CD drive')
         return False
예제 #15
0
 def __init__(self, device_path):
     self.device_path = device_path
     try:
         disc_fp = DiscID.open(device_path)
     except:
         self.disc_info = None
     else:
         self.disc_info = DiscID.disc_id(disc_fp)
     finally:
         disc_fp.close()
예제 #16
0
 def __init__(self, device_path):
     self.device_path = device_path
     try:
         disc_fp = DiscID.open(device_path)
     except:
         self.disc_info = None
     else:
         self.disc_info = DiscID.disc_id(disc_fp)
     finally:
         disc_fp.close()
예제 #17
0
    def loadDisc(self):
        """ Read disc information and create the explorer tree accordingly """
        import DiscID

        try:
            discInfo = DiscID.disc_id(DiscID.open(prefs.get(__name__, 'device', PREFS_DFT_DEVICE)))
        except Exception, err:
            if err[0] == 123:
                self.tree.replaceContent([(consts.icoCdrom, _('No disc found'), None)])
                modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': self.expName, 'newExpName': MOD_L10N})
                self.expName = MOD_L10N
            else:
                logger.error('[%s] Unable to read device\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc()))
            return
예제 #18
0
 def  checkIfAudioCdStillPresent(self):
     try:
         disc_id = DiscID.disc_id(self.cdrom)
         reactor.callLater(2, self.checkIfAudioCdStillPresent)
     except:
         self.warning('audio CD %s ejected: closing UPnP server!', self.disc_title)
         self.server.coherence.remove_plugin(self.server)
예제 #19
0
    def extractAudioCdInfo(self):
        """ extract the CD info (album art + artist + tracks), and construct the UPnP items"""
        self.cdrom = DiscID.open(self.device_name)
        disc_id = DiscID.disc_id(self.cdrom)

        (query_status, query_info) = CDDB.query(disc_id)
        if query_status in (210, 211):
            query_info = query_info[0]
        (read_status, read_info) = CDDB.read(query_info['category'],
                                             query_info['disc_id'])

        #        print query_info['title']
        #        print disc_id[1]
        #        for i in range(disc_id[1]):
        #            print "Track %.02d: %s" % (i, read_info['TTITLE' + `i`])

        track_count = disc_id[1]
        disc_id = query_info['disc_id']
        self.disc_title = query_info['title'].encode('utf-8')
        tracks = {}
        for i in range(track_count):
            tracks[i +
                   1] = read_info['TTITLE' +
                                  ` i `].decode('ISO-8859-1').encode('utf-8')

        self.name = self.disc_title

        root_item = Container(None, self.disc_title)

        # we will sort the item by "track_number"
        def childs_sort(x, y):
            return cmp(x.track_number, y.track_number)

        root_item.sorting_method = childs_sort

        self.set_root_item(root_item)

        for number, title in tracks.items():
            item = TrackItem(self.device_name, number, "Unknown", title)
            external_id = "%s_%d" % (disc_id, number)
            root_item.add_child(item, external_id=external_id)

        self.info('Sharing audio CD %s' % self.disc_title)

        reactor.callLater(2, self.checkIfAudioCdStillPresent)
        self.init_completed()
예제 #20
0
def CDDB_info(CDINFO, DISCID):
  # Get some information
  cdrom = DiscID.open(CDINFO,)
  disc_id = DiscID.disc_id(cdrom)

  # Query CDDB
  print "Querying CDDB ... "
  (query_status, query_info) = CDDB.query(disc_id)

  info = False

  # Check for status messages
  if (query_status == 200):
  # 200: success
    print " success."
    info = True

  elif (query_status == 210):
  # 210: Multiple exact matches
    if (DISCID is not None):
      query_info = query_info[DISCID]
      info = True
    else:
      multiple_matches("Multiple exact matches found:", query_info)

  elif (query_status == 211):
  # 211: Multiple inexact matches
    if (DISCID > -1):
      query_info = query_info[DISCID]
      info = True
    else:
      multiple_matches("Multiple inexact matches found:", query_info)

  elif (query_status == 202):
  # 202: No match found
    print " failed. No match found."

  else:
  # Something else went horribly wrong
    print " failed with status "+str(query_status)+":\n"
  
  print "Using: "
  print query_info

  return (info, query_info, disc_id)
예제 #21
0
def main():
    dev = None
    cdrom = None

    if len(sys.argv) >= 2:
        dev = sys.argv[1]

    if dev:
        cdrom = DiscID.open(dev)
    else:
        cdrom = DiscID.open()

    print "Getting disc id in CDDB format...",

    disc_id = DiscID.disc_id(cdrom)

    print "Disc ID: %08lx Num tracks: %d" % (disc_id[0], disc_id[1])
    print "Querying CDDB for info on disc...",

    (query_stat, query_info) = CDDB.query(disc_id)

    if query_stat == 200:
        print("success!\nQuerying CDDB for track info of `%s'... " %
              query_info['title']),

        (read_stat, read_info) = CDDB.read(query_info['category'],
                                           query_info['disc_id'])
        if read_stat == 210:
            print "success!"
            # Start from 0, not 1
            # thanks to bgp for the fix!
            for i in range(0, disc_id[1]):
                print "Track %.02d: %s" % (i + 1,
                                           read_info['TTITLE' + repr(i)])
        else:
            print "failure getting track info, status: %i" % read_stat

    elif query_stat == 210 or query_stat == 211:
        print "multiple matches found! Matches are:"
        for i in query_info:
            print "ID: %s Category: %s Title: %s" % \
                  (i['disc_id'], i['category'], i['title'])

    else:
        print "failure getting disc info, status %i" % query_stat
예제 #22
0
def CDDB_info(CDINFO, DISCID):
    # Get some information
    cdrom = DiscID.open(CDINFO, )
    disc_id = DiscID.disc_id(cdrom)

    # Query CDDB
    print "Querying CDDB ... "
    (query_status, query_info) = CDDB.query(disc_id)

    info = False

    # Check for status messages
    if (query_status == 200):
        # 200: success
        print " success."
        info = True

    elif (query_status == 210):
        # 210: Multiple exact matches
        if (DISCID is not None):
            query_info = query_info[DISCID]
            info = True
        else:
            multiple_matches("Multiple exact matches found:", query_info)

    elif (query_status == 211):
        # 211: Multiple inexact matches
        if (DISCID > -1):
            query_info = query_info[DISCID]
            info = True
        else:
            multiple_matches("Multiple inexact matches found:", query_info)

    elif (query_status == 202):
        # 202: No match found
        print " failed. No match found."

    else:
        # Something else went horribly wrong
        print " failed with status " + str(query_status) + ":\n"

    print "Using: "
    print query_info

    return (info, query_info, disc_id)
예제 #23
0
	def __init__(self, dev=None, discid=None, category=None, cache=os.path.expanduser('~/.cache/cddb')):
		self.dev = dev or '/dev/cdrom'
		self.cache_dir = cache
		self.discid = discid or DiscID.disc_id(open(self.dev,'rb'))
		if category:
			self.set_category(category)
		else:
			self.categories = cddb_query(self.discid)
			self._clear_md()
예제 #24
0
def getCddbDiscInfo():
    
    cdrom = DiscID.open(rip_device)
    disc_id = None
    print "Waiting for disc ..."
    while not disc_id: 
        try:
            disc_id = DiscID.disc_id(cdrom)
        except:
            time.sleep(2)

    if debug:
        print "Disc ID: %08lx Num tracks: %d" % (disc_id[0], disc_id[1])

    info_local  = getCddbDiscInfoLocal(disc_id)
    info_remote = getCddbDiscInfoRemote(disc_id)

    return info_remote
예제 #25
0
    def loadDisc(self):
        """ Read disc information and create the explorer tree accordingly """
        import DiscID

        try:
            discInfo = DiscID.disc_id(DiscID.open(prefs.get(__name__, "device", PREFS_DFT_DEVICE)))
        except Exception, err:
            if err[0] == 123:
                self.tree.replaceContent([(icons.cdromMenuIcon(), None, _("No disc found"), None)])
                modules.postMsg(
                    consts.MSG_CMD_EXPLORER_RENAME,
                    {"modName": MOD_L10N, "expName": self.expName, "newExpName": MOD_L10N},
                )
                self.expName = MOD_L10N
            else:
                logger.error(
                    "[%s] Unable to read device\n\n%s" % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())
                )
            return
예제 #26
0
    def _read_cd(self):
        inserted = True

        # Open drive
        try:
            cdrom = DiscID.open()
            disc_id = DiscID.disc_id(cdrom)
            self.logger.debug("Loaded new cd, id: %s" % disc_id)
        except Exception as e:
            inserted = False
            self.logger.error(e)
            disc_id = {}

        if disc_id:
            disc_info = self._query_cddb(disc_id)
            cdinfo = self._parse_disc(disc_id, disc_info)
        else:
            cdinfo = {}

        return inserted, cdinfo
예제 #27
0
 def refresh(self):
     self.tracks = []
     try:
         self.disc = discid.read()
     except:
         logger.debug("Cdrom: Unable to read cd")
         return
     logger.debug("Cdrom: reading cd")
     self.n = len(self.disc.tracks)
     logger.debug('Cdrom: %d tracks found', self.n)
     read_info = {}
     try:
         self.disc_id = DiscID.disc_id(DiscID.open())
         (query_status, query_info) = CDDB.query(self.disc_id)
         (read_status, read_info) = CDDB.read(query_info['category'],
                                              query_info['disc_id'])
     except:
         pass
     if 'DYEAR' in read_info:
         self.year = read_info['DYEAR']
     else:
         self.year = ''
     if 'DGENRE' in read_info:
         self.genre = read_info['DGENRE']
     else:
         self.genre = 'unknown'
     if 'DTITLE' in read_info:
         self.albumtitle = self.sanitizeString(read_info['DTITLE'])
     else:
         self.albumtitle = 'CD'
     for track in self.disc.tracks:
         number = track.number
         duration = track.seconds
         key = 'TTITLE' + repr((track.number - 1))
         if key in read_info:
             name = self.sanitizeString(read_info[key])
         else:
             name = 'Cdrom Track %s (%s)' % (
                 number, time.strftime('%H:%M:%S', time.gmtime(duration)))
         self.tracks.append((number, name, duration, self.albumtitle,
                             self.genre, self.year))
예제 #28
0
    def extractAudioCdInfo(self):
        '''
        extract the CD info (album art + artist + tracks),
        and construct the UPnP items
        '''
        self.cdrom = DiscID.open(self.device_name)
        disc_id = DiscID.disc_id(self.cdrom)

        (query_status, query_info) = CDDB.query(disc_id)
        if query_status in (210, 211):
            query_info = query_info[0]
        (read_status, read_info) = CDDB.read(query_info['category'],
                                             query_info['disc_id'])
        # print(query_info['title'])
        # print(disc_id[1])
        # for i in range(disc_id[1]):
        #    print(f'Track {i:.02d}: {read_info["TTITLE" + repr(i)]}')

        track_count = disc_id[1]
        disc_id = query_info['disc_id']
        self.disc_title = query_info['title'].encode('utf-8')
        tracks = {}
        for i in range(track_count):
            tracks[i + 1] = (read_info[f'TTITLE{repr(i)}'].decode(
                'ISO-8859-1').encode('utf-8'))

        self.name = self.disc_title

        root_item = Container(None, self.disc_title)
        root_item.sorting_method = 'track_number'
        self.set_root_item(root_item)

        for number, title in list(tracks.items()):
            item = TrackItem(self.device_name, number, 'Unknown', title)
            external_id = f'{disc_id}_{number:d}'
            root_item.add_child(item, external_id=external_id)

        self.info('Sharing audio CD %s', self.disc_title)

        reactor.callLater(2, self.checkIfAudioCdStillPresent)
        self.init_completed()
예제 #29
0
    def extractAudioCdInfo (self):
        """ extract the CD info (album art + artist + tracks), and construct the UPnP items"""
        self.cdrom = DiscID.open(self.device_name)
        disc_id = DiscID.disc_id(self.cdrom)

        (query_status, query_info) = CDDB.query(disc_id)
        if query_status in (210, 211):
            query_info = query_info[0]
        (read_status, read_info) = CDDB.read(query_info['category'], query_info['disc_id'])
#        print query_info['title']
#        print disc_id[1]
#        for i in range(disc_id[1]):
#            print "Track %.02d: %s" % (i, read_info['TTITLE' + `i`])

        track_count = disc_id[1]
        disc_id = query_info['disc_id']
        self.disc_title = query_info['title'].encode('utf-8')
        tracks = {}
        for i in range(track_count):
            tracks[i + 1] = read_info['TTITLE' + `i`].decode('ISO-8859-1').encode('utf-8')

        self.name = self.disc_title

        root_item = Container(None, self.disc_title)

        # we will sort the item by "track_number"
        def childs_sort(x, y):
            return cmp(x.track_number, y.track_number)
        root_item.sorting_method = childs_sort

        self.set_root_item(root_item)

        for number, title in tracks.items():
            item = TrackItem(self.device_name, number, "Unknown", title)
            external_id = "%s_%d" % (disc_id, number)
            root_item.add_child(item, external_id=external_id)

        self.info('Sharing audio CD %s', self.disc_title)

        reactor.callLater(2, self.checkIfAudioCdStillPresent)
        self.init_completed()
예제 #30
0
 def __init__(self):
     self.good = True
     cdrom = DiscID.open("/dev/sr0")
     self.disc_id = DiscID.disc_id(cdrom)
     self.disc_info = []
     (status,info) = CDDB.query(self.disc_id)
     if status == 200:
         info = [info]
     elif status != 211 and status != 210:
         lnp("CDDB: No matches found")
         self.good = False
         return
     for i in info:
         (status, read_info) = (None,None)
         for j in range(3):
             (status,read_info) = CDDB.read(i['category'],i['disc_id'])
             if status != 210:
                 continue
             else:
                 break
         if status == 210:
             read_info['DISCID'] = i['disc_id']
             self.disc_info.append(read_info)
예제 #31
0
def cdrom_disc_id(device, handle_mix=0):
    """
    return the disc id of the device or None if no disc is there
    """
    global id_cache
    try:
        if id_cache[device][0] + 0.9 > time.time():
            return id_cache[device][1:]
    except:
        pass

    disc_type = cdrom_disc_status(device, handle_mix=handle_mix)
    if disc_type == 0 or disc_type == 3:
        return 0, None
        
    elif disc_type == 1 or disc_type == 4:
        disc_id = DiscID.disc_id(device)
        id = '%08lx_%d' % (disc_id[0], disc_id[1])
    else:
        f = open(device,'rb')

        if os.uname()[0] == 'FreeBSD':
            # FreeBSD can only seek to 2048 multiple boundaries.
            # Below works on Linux and FreeBSD:
            f.seek(32768)
            id = f.read(829)
            label = id[40:72]
            id = id[813:829]
        else:
            f.seek(0x0000832d)
            id = f.read(16)
            f.seek(32808, 0)
            label = f.read(32)

        if CREATE_MD5_ID:
            id_md5 = md5.new()
            id_md5.update(f.read(51200))
            id = id_md5.hexdigest()

        f.close()
            
        m = re.match("^(.*[^ ]) *$", label)
        if m:
            id = '%s%s' % (id, m.group(1))
        id = re.compile('[^a-zA-Z0-9()_-]').sub('_', id)
            
        
    id_cache[device] = time.time(), disc_type, id
    id = id.replace('/','_')
    return disc_type, id
예제 #32
0
def cdrom_disc_id(device, handle_mix=0):
    """
    return the disc id of the device or None if no disc is there
    """
    global id_cache
    try:
        if id_cache[device][0] + 0.9 > time.time():
            return id_cache[device][1:]
    except:
        pass

    disc_type = cdrom_disc_status(device, handle_mix=handle_mix)
    if disc_type == 0 or disc_type == 3:
        return 0, None

    elif disc_type == 1 or disc_type == 4:
        disc_id = DiscID.disc_id(device)
        id = '%08lx_%d' % (disc_id[0], disc_id[1])
    else:
        f = open(device, 'rb')

        if os.uname()[0] == 'FreeBSD':
            # FreeBSD can only seek to 2048 multiple boundaries.
            # Below works on Linux and FreeBSD:
            f.seek(32768)
            id = f.read(829)
            label = id[40:72]
            id = id[813:829]
        else:
            f.seek(0x0000832d)
            id = f.read(16)
            f.seek(32808, 0)
            label = f.read(32)

        if CREATE_MD5_ID:
            id_md5 = md5.new()
            id_md5.update(f.read(51200))
            id = id_md5.hexdigest()

        f.close()

        m = re.match("^(.*[^ ]) *$", label)
        if m:
            id = '%s%s' % (id, m.group(1))
        id = re.compile('[^a-zA-Z0-9()_-]').sub('_', id)

    id_cache[device] = time.time(), disc_type, id
    id = id.replace('/', '_')
    return disc_type, id
예제 #33
0
파일: cd2ogg.py 프로젝트: saisai/tokland
def get_cd_info():
    def check_status(status, success_values): 
        cddb_status_msg = {
          200: "Success",
          211: "Multiple inexact matches were found",
          210: "Multiple exact matches were found",
          202: "No match found",
          403: "Error: database entry is corrupt",
          409: "Error: no handshake. (client-side error?)"
        }
        debug("CDDB status: %d (%s)"%(status, cddb_status_msg[status]))
        if status not in success_values:
            s = ", ".join(success_values)
            debug("CDDB status error: %d (success: %s)" % (status, s))
            return False
        return True
    cdrom = DiscID.open()
    disc_id = DiscID.disc_id(cdrom)
    debug("CDDB: Tracks in CD: %d"%disc_id[1])
    qstatus, qinfo = CDDB.query(disc_id)
    if not check_status(qstatus, (200, 210)):
        tracks = ["track%02d"%n for n in xrange(1, disc_id[1]+1)]
        return "Unknown - Unknown", tracks    
    if isinstance(qinfo, list):
        qinfo = qinfo[0]
    debug("CDDB: CD-ID: %s" % qinfo["disc_id"])
    status, info = CDDB.read(qinfo['category'], qinfo['disc_id'])
    check_status(status, (200, 210))
    year = info.get("DYEAR")
    disc_title = year and "%s (%s)"%(qinfo["title"], year) or qinfo["title"]
    debug("CDDB: Disc title: %s"%disc_title)
    recode = lambda s: s.decode("iso8859-1").encode("utf-8")
    get = lambda num: recode(info['TTITLE%d'%num]).title()
    title = recode(disc_title).title()
    tracks = map(get, range(disc_id[1]))
    return title, tracks
예제 #34
0
    def _lookup_cddb(self):
        """
        returns a cdinfo() instance containing the information we found in
        cddb, or None if that doesn't work.  This method doesn't intentionally
        throw any exceptions (unlike _lookup_mb) although I'm sure it's
        possible.
        """
        import DiscID, CDDB

        if self.cddevice:
            dev = DiscID.open(self.cddevice)
        else:
            dev = DiscID.open()
        cdid = DiscID.disc_id(dev)
        tracks = cdid[1]
        (status, info) = CDDB.query(cdid)
        if status == 200:
            (status, info) = CDDB.read(info["category"], info["disc_id"])
        elif status == 210 or status == 211:
            (status, info) = CDDB.read(info[0]["category"], info[0]["disc_id"])
        else:
            return None

        ret = cdinfo()
        for key in info.keys():
            if key.startswith("TTITLE"):
                n = int(re.findall("TTITLE([0-9]+)", key)[0])
                ret.titles[n] = info[key].encode("ascii", errors="replace")
            elif key == "DTITLE":
                (artist, album) = info[key].split("/")
                ret.artist = artist.strip()
                ret.album = album.strip()
            elif key == "DYEAR":
                ret.releasedate = info[key]
        wx.LogMessage("cddb succeeded")
        return ret
예제 #35
0
파일: cdrip.py 프로젝트: maluta/junk
# -*- coding: utf-8 -*-

# Convert CDROM content to WAV

import subprocess
import CDDB, DiscID

cdrom = DiscID.open()
disc_id = DiscID.disc_id(cdrom)

(query_status, query_info) = CDDB.query(disc_id)
(read_status, read_info) = CDDB.read(query_info["category"], query_info["disc_id"])

for i in range(disc_id[1]):
    name = "%s.wav" % (read_info["TTITLE" + ` i `])
    name = name.replace("\xba", ".")
    name = name.replace('"', "'")
    name = name.replace(",", "")
    name = name.replace(":", "")
    if i < 9:
        mplayer_cmd = 'mplayer cdda://%d -ao pcm:file="0%d - %s" ' % (i + 1, i + 1, name)
    else:
        mplayer_cmd = 'mplayer cdda://%d -ao pcm:file="%d - %s" ' % (i + 1, i + 1, name)

    print mplayer_cmd
# 	subprocess.call(mplayer_cmd,shell=True)
예제 #36
0
파일: getalbum.py 프로젝트: agoodno/python
				num = int(k[len("TTITLE"):]) + 1
				tracks[num] = v
		
		tracks.items().sort()
		for (k,v) in tracks.items():
		     track = Track(num=k,name=v,album=album)
		     
		print "***Saved in catalogue***"
	else:
		print "***Already catalogued***"
	
	printDisc(disc_info)


if __name__ == "__main__":
	device = DiscID.open()
	discid = DiscID.disc_id(device)
	(query_status, query_info) = CDDB.query(discid)
	
	if type(query_info) is not ListType:
		saveDisc(query_info)
	else:
		cmd = ""
		choice = 0
		print "There is more than one entry."
		while cmd != "save" and cmd != "quit":
			print "Choose one:"
			choices = []
			count = 1
			for info in query_info:
				choices.append(count)
예제 #37
0
# Written 17 Nov 1999 by Ben Gertzfield <[email protected]
# This work is released under the GNU GPL, version 2 or later.

# Release version 1.4

import DiscID, CDDB, sys, os

dev = None
cdrom = None

if len(sys.argv) >= 2:
    dev = sys.argv[1]

if dev:
    cdrom = DiscID.open(dev)
else:
    cdrom = DiscID.open()

print "Getting disc id in CDDB format...",

disc_id = DiscID.disc_id(cdrom)

print "Disc ID: %08lx Num tracks: %d" % (disc_id[0], disc_id[1])
print "Querying CDDB for info on disc...",

(query_stat, query_info) = CDDB.query(disc_id)

if query_stat == 200:
    print ("success!\nQuerying CDDB for track info of `%s'... " % 
	   query_info['title']),
예제 #38
0
 def get_compact_disc_information(self):
     '''Get the CompactDisc object of the current disc in drive by querying
     CD information from an Internet database (CDDB).'''
     cdrom = DiscID.open()
     disc_id = DiscID.disc_id(cdrom)
     return CompactDisc(disc_id)
예제 #39
0
    def isDisc(self, device):
        if discinfo.DiscInfo.isDisc(self, device) != 1:
            return 0
        
        disc_id = DiscID.disc_id(device)
        if mmpython.USE_NETWORK:
            try:
                (query_stat, query_info) = CDDB.query(disc_id)
            except:
                # Oops no connection
                query_stat = 404
        else:
            query_stat = 404


        if query_stat == 210 or query_stat == 211:
            # set this to success
            query_stat = 200

            for i in query_info:
                if i['title'] != i['title'].upper():
                    query_info = i
                    break
            else:
                query_info = query_info[0]

        elif query_stat != 200:
            _debug("failure getting disc info, status %i" % query_stat)

        if query_stat == 200:
            qi = query_info['title'].split('/')
            self.artist = qi[0].strip()
            self.title = qi[1].strip()
            for type in ('title', 'artist'):
                if getattr(self, type) and getattr(self, type)[0] in ('"', '\'') \
                       and getattr(self, type)[-1] in ('"', '\''):
                    setattr(self, type, getattr(self, type)[1:-1])
            (read_stat, read_info) = CDDB.read(query_info['category'], 
                                               query_info['disc_id'])
            # id = disc_id + number of tracks
            #self.id = '%s_%s' % (query_info['disc_id'], disc_id[1])

            if read_stat == 210:
                for i in range(0, disc_id[1]):
                    mi = mediainfo.MusicInfo()
                    mi.title = read_info['TTITLE' + `i`]
                    mi.album = self.title
                    mi.artist = self.artist
                    mi.genre = query_info['category']
                    mi.codec = 'PCM'
                    mi.samplerate = 44.1
                    mi.trackno = i+1
                    mi.trackof = disc_id[1]
                    self.tracks.append(mi)
                    for type in ('title', 'album', 'artist', 'genre'):
                        if getattr(mi, type) and getattr(mi, type)[0] in ('"', '\'') \
                           and getattr(mi, type)[-1] in ('"', '\''):
                            setattr(mi, type, getattr(mi, type)[1:-1])
            else:
                _debug("failure getting track info, status: %i" % read_stat)
                # set query_stat to somthing != 200
                query_stat = 400
            

        if query_stat != 200:
            _debug("failure getting disc info, status %i" % query_stat)
            self.no_caching = 1
            for i in range(0, disc_id[1]):
                mi = mediainfo.MusicInfo()
                mi.title = 'Track %s' % (i+1)
                mi.codec = 'PCM'
                mi.samplerate = 44.1
                mi.trackno = i+1
                mi.trackof = disc_id[1]
                self.tracks.append(mi)
                
                
        # read the tracks to generate the title list
        device = open(device)
        (first, last) = cdrom.toc_header(device)

        lmin = 0
        lsec = 0

        num = 0
        for i in range(first, last + 2):
            if i == last + 1:
                min, sec, frames = cdrom.leadout(device)
            else:
                min, sec, frames = cdrom.toc_entry(device, i)
            if num:
                self.tracks[num-1].length = (min-lmin)*60 + (sec-lsec)
            num += 1
            lmin, lsec = min, sec
        device.close()

        # correct bad titles for the tracks, containing also the artist
        for t in self.tracks:
            if not self.artist or not t.title.startswith(self.artist):
                break
        else:
            for t in self.tracks:
                t.title = t.title[len(self.artist):].lstrip('/ \t-_')

        # correct bad titles for the tracks, containing also the title
        for t in self.tracks:
            if not self.title or not t.title.startswith(self.title):
                break
        else:
            for t in self.tracks:
                t.title = t.title[len(self.title):].lstrip('/ \t-_')
        return 1
예제 #40
0
파일: dir2ogg.py 프로젝트: pat1/autoradio
            print "Disc is not yet in the MusicBrainz database."
            print "Consider adding it via", mbdisc.getSubmissionUrl(disc)
            raise self.MBError
        try:
            inc = mbws.ReleaseIncludes(artist=True, tracks=True, releaseEvents=True)
            release = query.getReleaseById(results[0].release.getId(), inc)
        except mbws.WebServiceError, err:
            warn(err)
            raise self.MBError

        isSingleArtist = release.isSingleArtistRelease()

        try:
            # try to get the CDDB ID
            import DiscID
            cddb_id = '%08lx' % long(DiscID.disc_id(DiscID.open(self.dev))[0])
        except:
            cddb_id = False

        trackn = 1
        for track in release.tracks:
            title           = {}
            title['artist'] = isSingleArtist and release.artist.name or track.artist
            if cddb_id:
                title['discid'] = cddb_id
            title['album']  = release.title
            title['date']   = release.getEarliestReleaseDate()
            title['musicbrainz_albumartistid'] = release.artist.id.split("/")[-1]
            title['musicbrainz_albumid'] = release.id.split("/")[-1]
            title['musicbrainz_discid'] = discId
            title['musicbrainz_sortname'] = release.artist.sortName
예제 #41
0
 def get_id(self):
     cdrom = DiscID.open('/dev/cdrom')
     self.id,self.num_tracks = DiscID.disc_id(cdrom)[:2]
     return self
예제 #42
0
    def get_mb(self):
        try:
            import musicbrainz2.disc as mbdisc
            import musicbrainz2.webservice as mbws
        except ImportError as err:
            warn(
                'You need python-musicbrainz2 (or python-cddb) to convert cds. Please install it. Trying cddb.'
            )
            raise self.MBError(err)

        service = mbws.WebService()
        query = mbws.Query(service)

        # Read the disc in the drive
        try:
            disc = mbdisc.readDisc(self.dev)
        except mbdisc.DiscError as err:
            warn(err)
            raise self.MBError

        discId = disc.getId()
        try:
            myfilter = mbws.ReleaseFilter(discId=discId)
            results = query.getReleases(myfilter)
        except mbws.WebServiceError as err:
            warn(err)
            raise self.MBError

        if len(results) == 0:
            print("Disc is not yet in the MusicBrainz database.")
            print("Consider adding it via", mbdisc.getSubmissionUrl(disc))
            raise self.MBError
        try:
            inc = mbws.ReleaseIncludes(artist=True,
                                       tracks=True,
                                       releaseEvents=True)
            release = query.getReleaseById(results[0].release.getId(), inc)
        except mbws.WebServiceError as err:
            warn(err)
            raise self.MBError

        isSingleArtist = release.isSingleArtistRelease()

        try:
            # try to get the CDDB ID
            import DiscID
            cddb_id = '%08lx' % int(DiscID.disc_id(DiscID.open(self.dev))[0])
        except:
            cddb_id = False

        trackn = 1
        for track in release.tracks:
            title = {}
            title[
                'artist'] = isSingleArtist and release.artist.name or track.artist
            if cddb_id:
                title['discid'] = cddb_id
            title['album'] = release.title
            title['date'] = release.getEarliestReleaseDate()
            title['musicbrainz_albumartistid'] = release.artist.id.split(
                "/")[-1]
            title['musicbrainz_albumid'] = release.id.split("/")[-1]
            title['musicbrainz_discid'] = discId
            title['musicbrainz_sortname'] = release.artist.sortName
            title['musicbrainz_trackid'] = track.id.split("/")[-1]
            title['title'] = track.title
            title['tracktotal'] = str(len(release.tracks))
            title['ntracknumber'] = "%02d" % trackn
            title['tracknumber'] = str(trackn)
            ConvertTrack(self.dev, self.conf, trackn, title)
            trackn += 1
예제 #43
0
            print "Disc is not yet in the MusicBrainz database."
            print "Consider adding it via", mbdisc.getSubmissionUrl(disc)
            raise self.MBError
        try:
            inc = mbws.ReleaseIncludes(artist=True, tracks=True, releaseEvents=True)
            release = query.getReleaseById(results[0].release.getId(), inc)
        except mbws.WebServiceError, err:
            warn(err)
            raise self.MBError

        isSingleArtist = release.isSingleArtistRelease()

        try:
            # try to get the CDDB ID
            import DiscID
            cddb_id = '%08lx' % long(DiscID.disc_id(DiscID.open(self.dev))[0])
        except:
            cddb_id = False

        trackn = 1
        for track in release.tracks:
            title           = {}
            title['artist'] = isSingleArtist and release.artist.name or track.artist
            if cddb_id:
                title['discid'] = cddb_id
            title['album']  = release.title
            title['date']   = release.getEarliestReleaseDate()
            title['musicbrainz_albumartistid'] = release.artist.id.split("/")[-1]
            title['musicbrainz_albumid'] = release.id.split("/")[-1]
            title['musicbrainz_discid'] = discId
            title['musicbrainz_sortname'] = release.artist.sortName
예제 #44
0
disk_title = []

for i in range(num_tracks):
    (min, sec, frame) = cdrom.toc_entry(device, i + 1)
    track_limits.append(60 * min + sec + frame / 75.)

(min, sec, frame) = cdrom.leadout(device)
track_limits.append(60 * min + sec + frame / 75.)

for i in range(num_tracks):
    track_length.append(track_limits[i + 1] - track_limits[i])
    track_prefix.append("%02d. " % (i + 1))
    track_title.append(track_prefix[i] + default_track_name)

status2 = 0
disc_id = DiscID.disc_id(device)
cddb_id = hex(disc_id[0])[2:]  # magic id string

# looks for cd in local database
cddb_fullpath = cddb_path + cddb_id
cddb_local = False
if os.path.exists(cddb_fullpath):
    cddb_local = True
    # check for the insidious last line "."
    # to preserve file timestamp if all correct
    insidious_last_line = False
    for line in fileinput.input(cddb_fullpath):
        if line == '.\n': insidious_last_line = True
    # filters the insidious last line ".", if any
    if insidious_last_line:
        for line in fileinput.input(cddb_fullpath, inplace=1):