mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 12:54:40 +01:00
implemented 'get_media_mime_type'
This commit is contained in:
parent
facf2425ec
commit
3268240c6b
2 changed files with 89 additions and 0 deletions
|
|
@ -109,6 +109,7 @@ from .transcoding import (
|
|||
convert_ffprobe_fps_value,
|
||||
convert_ffprobe_fps_to_float,
|
||||
get_rescaled_command_arguments,
|
||||
get_media_mime_type,
|
||||
)
|
||||
|
||||
from .plugin_tools import (
|
||||
|
|
@ -209,6 +210,7 @@ __all__ = [
|
|||
"convert_ffprobe_fps_value",
|
||||
"convert_ffprobe_fps_to_float",
|
||||
"get_rescaled_command_arguments",
|
||||
"get_media_mime_type",
|
||||
|
||||
"compile_list_of_regexes",
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import collections
|
|||
import tempfile
|
||||
import subprocess
|
||||
import platform
|
||||
from typing import Optional
|
||||
|
||||
import xml.etree.ElementTree
|
||||
|
||||
|
|
@ -1455,3 +1456,89 @@ def get_oiio_input_and_channel_args(oiio_input_info, alpha_default=None):
|
|||
input_arg += ":ch={}".format(input_channels_str)
|
||||
|
||||
return input_arg, channels_arg
|
||||
|
||||
|
||||
def _get_media_mime_type_from_ftyp(content):
|
||||
if content[8:10] == b"qt":
|
||||
return "video/quicktime"
|
||||
|
||||
if content[8:12] == b"isom":
|
||||
return "video/mp4"
|
||||
if content[8:12] in (b"M4V\x20", b"mp42"):
|
||||
return "video/mp4v"
|
||||
if content[8:13] in (b"3gpis"):
|
||||
return "video/3gpp"
|
||||
# (
|
||||
# b"avc1", b"iso2", b"isom", b"mmp4", b"mp41", b"mp71",
|
||||
# b"msnv", b"ndas", b"ndsc", b"ndsh", b"ndsm", b"ndsp", b"ndss",
|
||||
# b"ndxc", b"ndxh", b"ndxm", b"ndxp", b"ndxs"
|
||||
# )
|
||||
return None
|
||||
|
||||
|
||||
def get_media_mime_type(filepath: str) -> Optional[str]:
|
||||
"""Determine Mime-Type of a file.
|
||||
|
||||
Args:
|
||||
filepath (str): Path to file.
|
||||
|
||||
Returns:
|
||||
Optional[str]: Mime type or None if is unknown mime type.
|
||||
|
||||
"""
|
||||
if not filepath or not os.path.exists(filepath):
|
||||
return None
|
||||
|
||||
with open(filepath, "rb") as stream:
|
||||
content = stream.read()
|
||||
|
||||
content_len = len(content)
|
||||
# Pre-validation (largest definition check)
|
||||
# - hopefully there cannot be media defined in less than 12 bytes
|
||||
if content_len < 12:
|
||||
return None
|
||||
|
||||
# FTYP
|
||||
if content[4:8] == b"ftyp":
|
||||
return _get_media_mime_type_from_ftyp(content)
|
||||
|
||||
# BMP
|
||||
if content[0:2] == b"BM":
|
||||
return "image/bmp"
|
||||
|
||||
# Tiff
|
||||
if content[0:2] in (b"MM", b"II"):
|
||||
return "tiff"
|
||||
|
||||
# PNG
|
||||
if content[0:4] == b"\211PNG":
|
||||
return "image/png"
|
||||
|
||||
# SVG
|
||||
if b'xmlns="http://www.w3.org/2000/svg"' in content:
|
||||
return "image/svg+xml"
|
||||
|
||||
# JPEG, JFIF or Exif
|
||||
if (
|
||||
content[0:4] == b"\xff\xd8\xff\xdb"
|
||||
or content[6:10] in (b"JFIF", b"Exif")
|
||||
):
|
||||
return "image/jpeg"
|
||||
|
||||
# Webp
|
||||
if content[0:4] == b"RIFF" and content[8:12] == b"WEBP":
|
||||
return "image/webp"
|
||||
|
||||
# Gif
|
||||
if content[0:6] in (b"GIF87a", b"GIF89a"):
|
||||
return "gif"
|
||||
|
||||
# Adobe PhotoShop file (8B > Adobe, PS > PhotoShop)
|
||||
if content[0:4] == b"8BPS":
|
||||
return "image/vnd.adobe.photoshop"
|
||||
|
||||
# Windows ICO > this might be wild guess as multiple files can start
|
||||
# with this header
|
||||
if content[0:4] == b"\x00\x00\x01\x00":
|
||||
return "image/x-icon"
|
||||
return None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue