Source code for eyed3.plugins.mimetype

import time
import pprint
import eyed3
import eyed3.utils
from pathlib import Path
from collections import Counter
from eyed3.mimetype import guessMimetype
from eyed3.utils.log import getLogger

log = getLogger(__name__)

# python-magic
try:
    import magic

    class MagicTypes(magic.Magic):
        def __init__(self):
            magic.Magic.__init__(self, mime=True, mime_encoding=False, keep_going=True)

        def guess_type(self, filename, all_types=False):
            try:
                types = self.from_file(filename)
            except UnicodeEncodeError:
                # https://github.com/ahupp/python-magic/pull/144
                types = self.from_file(filename.encode("utf-8", 'surrogateescape'))

            delim = r"\012- "
            if all_types:
                return types.split(delim)
            else:
                return types.split(delim)[0]

    _python_magic = MagicTypes()

except ImportError:
    _python_magic = None


[docs]class MimetypesPlugin(eyed3.plugins.LoaderPlugin): NAMES = ["mimetypes"] def __init__(self, arg_parser): self._num_visited = 0 super().__init__(arg_parser, cache_files=False, track_images=False) g = self.arg_group g.add_argument("--status", action="store_true", help="Print dot status.") g.add_argument("--parse-files", action="store_true", help="Parse each file.") g.add_argument("--hide-notfound", action="store_true") if _python_magic: g.add_argument("-M", "--use-pymagic", action="store_true", help="Use python-magic to determine mimetype.") self.magic = None self.start_t = None self.mime_types = Counter()
[docs] def start(self, args, config): super().start(args, config) self.magic = "pymagic" if self.args.use_pymagic else "filetype" self.start_t = time.time()
[docs] def handleFile(self, f, *args, **kwargs): self._num_visited += 1 if self.args.parse_files: try: super().handleFile(f) except Exception as ex: log.critical(ex, exc_info=ex) else: self._num_loaded += 1 if self.magic == "pymagic": mtype = _python_magic.guess_type(f) else: mtype = guessMimetype(f) self.mime_types[mtype] += 1 if not self.args.hide_notfound: if mtype is None and Path(f).suffix.lower() in (".mp3",): print("None mimetype:", f) if self.args.status: print(".", end="", flush=True)
[docs] def handleDone(self): t = time.time() - self.start_t print(f"\nVisited {self._num_visited} files") print(f"Processed {self._num_loaded} files") print(f"magic: {self.magic}") print(f"time: {eyed3.utils.formatTime(t)} seconds") if self.mime_types: pprint.pprint(self.mime_types)