Source code for searx.result_types.file

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Typification of the *file* results.  Results of this type are rendered in
the :origin:`file.html <searx/templates/simple/result_templates/file.html>`
template.

----

.. autoclass:: File
   :members:
   :show-inheritance:

"""
# pylint: disable=too-few-public-methods


__all__ = ["File"]

import typing as t
import mimetypes

from ._base import MainResult


[docs] @t.final class File(MainResult, kw_only=True): """Class for results of type *file*""" template: str = "file.html" filename: str = "" """Name of the file.""" size: str = "" """Size of bytes in human readable notation (``MB`` for 1024 * 1024 Bytes file size.)""" time: str = "" """Indication of a time, such as the date of the last modification or the date of creation. This is a simple string, the *date* of which can be freely chosen according to the context.""" mimetype: str = "" """Mimetype/Subtype of the file. For ``audio`` and ``video``, a URL can be passed in the :py:obj:`File.embedded` field to embed the referenced media in the result. If no value is specified, the MIME type is determined from ``self.filename`` or, alternatively, from ``self.embedded`` (if either of the two values is set).""" abstract: str = "" """Abstract of the file.""" author: str = "" """Author of the file.""" embedded: str = "" """URL of an embedded media type (audio or video) / is collapsible.""" mtype: str = "" """Used for displaying :py:obj:`File.embedded`. Its value is automatically populated from the base type of :py:obj:`File.mimetype`, and can be explicitly set to enforce e.g. ``audio`` or ``video`` when mimetype is something like "application/ogg" but its know the content is for example a video.""" subtype: str = "" """Used for displaying :py:obj:`File.embedded`. Its value is automatically populated from the subtype type of :py:obj:`File.mimetype`, and can be explicitly set to enforce a subtype for the :py:obj:`File.embedded` element.""" def __post_init__(self): super().__post_init__() if not self.mtype or not self.subtype: fn = self.filename or self.embedded if not self.mimetype and fn: self.mimetype = mimetypes.guess_type(fn, strict=False)[0] or "" mtype, subtype = (self.mimetype.split("/", 1) + [""])[:2] if not self.mtype: # I don't know why, but the ogg video stream is not displayed, # may https://github.com/videojs/video.js can help? if self.embedded.endswith(".ogv"): self.mtype = "video" elif self.embedded.endswith(".oga"): self.mtype = "audio" else: self.mtype = mtype if not self.subtype: self.subtype = subtype