def load(self, filename): self.filename = filename fileobj = open(filename, "rb") try: atoms = Atoms(fileobj) # ftyp is always the first atom in a valid MP4 file if not atoms.atoms or atoms.atoms[0].name != b"ftyp": raise error("Not a MP4 file") try: self.info = MP4Info(atoms, fileobj) except error: raise except Exception as err: reraise(MP4StreamInfoError, err, sys.exc_info()[2]) if not MP4Tags._can_load(atoms): self.tags = None else: try: self.tags = self.MP4Tags(atoms, fileobj) except error: raise except Exception as err: reraise(MP4MetadataError, err, sys.exc_info()[2]) finally: fileobj.close()
def save(self, filename): """Save the metadata to the given filename.""" values = [] items = sorted(self.items(), key=MP4Tags.__get_sort_stats) for key, value in items: info = self.__atoms.get(key[:4], (None, type(self).__render_text)) try: values.append(info[1](self, key, value, *info[2:])) except (TypeError, ValueError) as s: reraise(MP4MetadataValueError, s, sys.exc_info()[2]) data = Atom.render(b"ilst", b"".join(values)) # Find the old atoms. fileobj = open(filename, "rb+") try: atoms = Atoms(fileobj) try: path = atoms.path(b"moov", b"udta", b"meta", b"ilst") except KeyError: self.__save_new(fileobj, atoms, data) else: self.__save_existing(fileobj, atoms, path, data) finally: fileobj.close()
def save(self, filename): """Save the metadata to the given filename.""" values = [] items = sorted(self.items(), key=MP4Tags.__get_sort_stats ) for key, value in items: info = self.__atoms.get(key[:4], (None, type(self).__render_text)) try: values.append(info[1](self, key, value, *info[2:])) except (TypeError, ValueError) as s: reraise(MP4MetadataValueError, s, sys.exc_info()[2]) data = Atom.render(b"ilst", b"".join(values)) # Find the old atoms. fileobj = open(filename, "rb+") try: atoms = Atoms(fileobj) try: path = atoms.path(b"moov", b"udta", b"meta", b"ilst") except KeyError: self.__save_new(fileobj, atoms, data) else: self.__save_existing(fileobj, atoms, path, data) finally: fileobj.close()
def load(self, file, known_frames=None, translate=True, v2_version=4): """Load tags from a filename. Keyword arguments: * filename -- filename to load tag data from * known_frames -- dict mapping frame IDs to Frame objects * translate -- Update all tags to ID3v2.3/4 internally. If you intend to save, this must be true or you have to call update_to_v23() / update_to_v24() manually. * v2_version -- if update_to_v23 or update_to_v24 get called (3 or 4) Example of loading a custom frame:: my_frames = dict(mutagenx.id3.Frames) class XMYF(Frame): ... my_frames["XMYF"] = XMYF mutagenx.id3.ID3(filename, known_frames=my_frames) """ if not v2_version in (3, 4): raise ValueError("Only 3 and 4 possible for v2_version") from os.path import getsize filename = file[0] self.filename = filename self.__known_frames = known_frames self.__fileobj = filename #self.__filesize = getsize(filename) self.__filesize = file[1] try: try: self.__load_header() except (ID3NoHeaderError, ID3UnsupportedVersionError) as err: self.size = 0 import sys stack = sys.exc_info()[2] try: self.__fileobj.seek(-128, 2) except EnvironmentError: reraise(err, None, stack) else: frames = ParseID3v1(self.__fileobj.read(128)) if frames is not None: self.version = self._V11 for v in frames.values(): self.add(v) else: reraise(err, None, stack) else: frames = self.__known_frames if frames is None: if self._V23 <= self.version: frames = Frames elif self._V22 <= self.version: frames = Frames_2_2 data = self.__fullread(self.size - 10) for frame in self.__read_frames(data, frames=frames): if isinstance(frame, Frame): self.add(frame) else: self.unknown_frames.append(frame) self.__unknown_version = self.version finally: self.__fileobj.close() del self.__fileobj del self.__filesize if translate: if v2_version == 3: self.update_to_v23() else: self.update_to_v24()