Example #1
0
def imagemagick_supported_mimes() -> typing.List[str]:
    all_supported = wand_supported_format("*")
    valid_mime = []  # type: typing.List[str]
    all_imagemagick_mime_supported = []  # type: typing.List[str]

    for supported in all_supported:
        fake_url = "./FILE.{0}".format(supported)  # Fake a url
        mime, enc = mimetypes_storage.guess_type(fake_url)
        if mime and mime not in all_imagemagick_mime_supported:
            all_imagemagick_mime_supported.append(mime)

    for mime in all_imagemagick_mime_supported:
        # INFO - G.M - 2019-11-15 - we drop text file format support (no working correctly)
        if mime.startswith("text/"):
            continue
        # INFO - G.M - 2019-11-15 - we drop video file format support (no working correctly either)
        if mime.startswith("video/"):
            continue
        # HACK - G.M - 2019-11-15 - check if some "chemical" file can be processed as image,
        # now considered them as not supported.
        if mime.startswith("chemical/"):
            continue
        if mime in BLACKLISTED_IMAGEMAGICK_MIME:
            continue
        valid_mime.append(mime)
    return valid_mime
Example #2
0
    def get_file_mimetype(self, file_path: str, file_ext: str = "") -> str:
        """
        return the mimetype of the file. see python module mimetype
        """

        assert file_ext == "" or file_ext.startswith(
            "."), 'File extension must starts with ".""'
        # INFO - B.L - 2018/10/11 - If user force the file extension we do.
        first_path = file_path + file_ext if file_ext else file_path
        str_, encoding = mimetypes_storage.guess_type(first_path, strict=False)

        if not str_ or str_ == "application/octet-stream":
            mime = magic.Magic(mime=True)
            str_ = mime.from_file(file_path)

        if str_ and (str_ in AMBIGUOUS_MIMES):
            raw_mime = Popen(
                ["mimetype", "--output-format", "%m", file_path],
                stdin=PIPE,
                stdout=PIPE,
                stderr=PIPE,
            ).communicate()[0]
            str_ = raw_mime.decode("utf-8").replace("\n", "")

        if not str_:
            # Should never happen.
            raise ValueError("Cannot determine the type of " + file_path)

        return str_
Example #3
0
    def build_jpeg_preview(
        self,
        file_path: str,
        preview_name: str,
        cache_path: str,
        page_id: int,
        extension: str = ".jpg",
        size: ImgDims = None,
        mimetype: str = "",
    ) -> None:
        if not size:
            size = self.default_size

        colors = vtkNamedColors()

        if not mimetype:
            guessed_mimetype, _ = mimetypes_storage.guess_type(file_path,
                                                               strict=False)
            # INFO - G.M - 2019-11-22 - guessed_mimetype can be None
            mimetype = guessed_mimetype or ""
        reader = self._get_vtk_reader(mimetype)
        reader.SetFileName(file_path)

        mapper = vtkPolyDataMapper()
        mapper.SetInputConnection(reader.GetOutputPort())

        actor = vtkActor()
        actor.SetMapper(mapper)

        rotation = (-70, 0, 45)
        R_x, R_y, R_z = rotation  # TODO set a good looking default orientation
        actor.RotateX(R_x)
        actor.RotateY(R_y)
        actor.RotateZ(R_z)

        # Create a rendering window and renderer
        ren = vtkRenderer()
        renWin = vtkRenderWindow()
        renWin.OffScreenRenderingOn()
        renWin.AddRenderer(ren)
        renWin.SetSize(size.width, size.height)
        ren.SetBackground(colors.GetColor3d("white"))

        # Assign actor to the renderer
        ren.AddActor(actor)

        renWin.Render()

        # Write image
        windowto_image_filter = vtkWindowToImageFilter()
        windowto_image_filter.SetInput(renWin)
        # windowto_image_filter.SetScale(scale)  # image scale
        windowto_image_filter.SetInputBufferTypeToRGBA()

        with tempfile.NamedTemporaryFile("w+b",
                                         prefix="preview-generator-",
                                         suffix=".png") as tmp_png:
            writer = vtkPNGWriter()
            writer.SetFileName(tmp_png.name)
            writer.SetInputConnection(windowto_image_filter.GetOutputPort())
            writer.Write()

            return ImagePreviewBuilderPillow().build_jpeg_preview(
                tmp_png.name, preview_name, cache_path, page_id, extension,
                size, mimetype)