def __init__(self, path): """Constructs a new MediaFile reflecting the file at path. May throw UnreadableFileError. """ self.path = path unreadable_exc = ( mutagen.mp3.HeaderNotFoundError, mutagen.flac.FLACNoHeaderError, mutagen.monkeysaudio.MonkeysAudioHeaderError, mutagen.mp4.MP4StreamInfoError, mutagen.oggvorbis.OggVorbisHeaderError, ) try: self.mgfile = mutagen.File(path) except unreadable_exc as exc: log.debug(u'header parsing failed: {0}'.format(unicode(exc))) raise UnreadableFileError('Mutagen could not read file') except IOError: raise UnreadableFileError('could not read file') except Exception as exc: # Hide bugs in Mutagen. log.debug(traceback.format_exc()) log.error('uncaught Mutagen exception: {0}'.format(exc)) raise UnreadableFileError('Mutagen raised an exception') if self.mgfile is None: # Mutagen couldn't guess the type raise FileTypeError('file type unsupported by Mutagen') elif type(self.mgfile).__name__ == 'M4A' or \ type(self.mgfile).__name__ == 'MP4': self.type = 'mp4' elif type(self.mgfile).__name__ == 'ID3' or \ type(self.mgfile).__name__ == 'MP3': self.type = 'mp3' elif type(self.mgfile).__name__ == 'FLAC': self.type = 'flac' elif type(self.mgfile).__name__ == 'OggVorbis': self.type = 'ogg' elif type(self.mgfile).__name__ == 'MonkeysAudio': self.type = 'ape' elif type(self.mgfile).__name__ == 'WavPack': self.type = 'wv' elif type(self.mgfile).__name__ == 'Musepack': self.type = 'mpc' else: raise FileTypeError('file type %s unsupported by MediaFile' % type(self.mgfile).__name__) # add a set of tags if it's missing if self.mgfile.tags is None: self.mgfile.add_tags()
def _fetchdata(self, obj, style): """Get the value associated with this descriptor's field stored with the given StorageStyle. Unwraps from a list if necessary. """ # fetch the value, which may be a scalar or a list if obj.type == 'mp3': if style.id3_desc is not None: # also match on 'desc' field frames = obj.mgfile.tags.getall(style.key) entry = None for frame in frames: if frame.desc.lower() == style.id3_desc.lower(): entry = getattr(frame, style.id3_frame_field) break if entry is None: # no desc match return None else: # Get the metadata frame object. try: frame = obj.mgfile[style.key] except KeyError: return None entry = getattr(frame, style.id3_frame_field) else: # Not MP3. try: entry = obj.mgfile[style.key] except KeyError: return None # Possibly index the list. if style.list_elem: if entry: # List must have at least one value. # Handle Mutagen bugs when reading values (#356). try: return entry[0] except: log.error('Mutagen exception when reading field: %s' % traceback.format_exc) return None else: return None else: return entry
def cleanup(signum=None, frame=None): global log, importThread, app if type(signum) == type(None): pass else: log.info(u'Signal %i caught, saving and exiting...' % int(signum)) log.info(u'Stopping worker threads') if importThread != None: importThread.stop() importThread.join(5) if importThread.isAlive(): log.error(u'Failed to clean up importThread') log.info(u'Stopping CherryPy Engine') app.stop() log.info(u'Clean up complete') sys.exit(0)