mirror of
https://github.com/AnimeThemes/animethemes-batch-encoder.git
synced 2026-07-11 01:24:29 +02:00
73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
from enum import Enum
|
|
import logging
|
|
|
|
|
|
# The Colorspace Enumerated List
|
|
# Parse color data from file to provide arguments for the encoded file
|
|
class Colorspace(Enum):
|
|
def __new__(cls, colorspace, color_primaries, color_trc):
|
|
value = len(cls.__members__) + 1
|
|
obj = object.__new__(cls)
|
|
obj._value_ = value
|
|
obj.colorspace = colorspace
|
|
obj.color_primaries = color_primaries
|
|
obj.color_trc = color_trc
|
|
return obj
|
|
|
|
HD = ("bt709", "bt709", "bt709")
|
|
NTSC = ("smpte170m", "smpte170m", "smpte170m")
|
|
PAL = ("bt470bg", "bt470bg", "gamma28")
|
|
|
|
# The color data arguments for our encode
|
|
def get_args(self):
|
|
return f"-colorspace {self.colorspace} -color_primaries {self.color_primaries} -color_trc {self.color_trc}"
|
|
|
|
@staticmethod
|
|
def value_of(source_file):
|
|
# Method 1: Carry over color data from source if specified
|
|
source_colorspace = source_file.video_format["streams"][0].get(
|
|
"color_space", ""
|
|
)
|
|
source_color_primaries = source_file.video_format["streams"][0].get(
|
|
"color_primaries", ""
|
|
)
|
|
source_color_trc = source_file.video_format["streams"][0].get(
|
|
"color_transfer", ""
|
|
)
|
|
|
|
logging.debug(
|
|
f"[Colorspace.value_of] source_colorspace: {source_colorspace}, "
|
|
f"source_color_primaries: {source_color_primaries}, "
|
|
f"source_color_trc: {source_color_trc}"
|
|
)
|
|
|
|
for colorspace_candidate in Colorspace:
|
|
if (
|
|
source_colorspace == colorspace_candidate.colorspace
|
|
or source_color_primaries == colorspace_candidate.color_primaries
|
|
or source_color_trc == colorspace_candidate.color_trc
|
|
):
|
|
logging.debug(
|
|
f"[Colorspace.value_of] carryover colorspace '{colorspace_candidate.name}' from source"
|
|
)
|
|
return colorspace_candidate
|
|
|
|
# Method 2: Infer color date from source file resolution
|
|
resolution = int(source_file.video_format["streams"][0]["height"])
|
|
|
|
if resolution >= 720:
|
|
logging.debug(
|
|
f"[Colorspace.value_of] colorspace: '{Colorspace.HD.name}', resolution: '{resolution}'"
|
|
)
|
|
return Colorspace.HD
|
|
elif resolution >= 576:
|
|
logging.debug(
|
|
f"[Colorspace.value_of] colorspace: '{Colorspace.PAL.name}', resolution: '{resolution}'"
|
|
)
|
|
return Colorspace.PAL
|
|
else:
|
|
logging.debug(
|
|
f"[Colorspace.value_of] colorspace: '{Colorspace.NTSC.name}', resolution: '{resolution}'"
|
|
)
|
|
return Colorspace.NTSC
|