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)
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
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()
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)
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
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))
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)
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)
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)
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
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
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
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
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()
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
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)
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()
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)
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
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)
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()
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
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
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
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))
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()
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()
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)
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
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
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
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
# -*- 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)
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)
# 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']),
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)
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
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
def get_id(self): cdrom = DiscID.open('/dev/cdrom') self.id,self.num_tracks = DiscID.disc_id(cdrom)[:2] return self
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
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):