def _save(self): try: audio = _Mp4(self.uri) except IOError: return False try: for tag in self._deleted_tags: try: del audio[tag] except KeyError: try: del audio["----:%s" % tag] except KeyError: pass self._deleted_tags.clear() except AttributeError: pass for identifier in self.keys_tags(): try: values = self.get(identifier) if not values: raise KeyError except KeyError: continue # If a key is not from our specifically defined mapping dict it's a # freeform key so treat it accordingly. try: tag = self.__literal_to_tag[identifier] except KeyError: tag = "----:%s" % identifier values = [v.encode("utf-8") for v in values] # Track and disc numbers are stored as a list of tuples so handle # them separately. if identifier in (TRACK, DISC): values = values.split("/") try: v1 = int(values[0]) except (IndexError, ValueError): continue try: v2 = int(values[1]) except (IndexError, ValueError): v2 = 0 audio[tag] = [(v1, v2)] else: audio[tag] = values audio.save() return True
def _read_tags(self): try: audio = _Mp4(self.uri) except Mp4Error: raise TagParseError for key, values in (audio.tags or {}).iteritems(): if key in ("disk", "trkn"): value = ["%d/%d" % values[0]] elif key.startswith("----:"): key = key[5:] value = values elif self.__tag_to_literal.has_key(key): value = map(unicode, values) else: continue try: self[self.__tag_to_literal[key]] = value except KeyError: self[key] = value self._parse_info(audio.info) self[FORMAT] = "MPEG-4 AAC" self[ENCODING] = "lossy" if self[BITRATE] else "lossless"