You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ffx/bin/ffx/media_descriptor.py

92 lines
4.2 KiB
Python

from typing import List
from ffx.track_type import TrackType
from ffx.track_descriptor import TrackDescriptor
class MediaDescriptor():
"""This class represents the structural content of a media file including streams and metadata"""
TAGS_KEY = 'tags'
TRACK_DESCRIPTOR_LIST_KEY = 'track_descriptors'
CLEAR_TAGS_KEY = 'clear_tags'
FFPROBE_DISPOSITION_KEY = 'disposition'
FFPROBE_TAGS_KEY = 'tags'
FFPROBE_CODEC_TYPE_KEY = 'codec_type'
def __init__(self, **kwargs):
if MediaDescriptor.TAGS_KEY in kwargs.keys():
if type(kwargs[MediaDescriptor.TAGS_KEY]) is not dict:
raise TypeError(f"MediaDescriptor.__init__(): Argument {MediaDescriptor.TAGS_KEY} is required to be of type dict")
self.__mediaTags = kwargs[MediaDescriptor.TAGS_KEY]
else:
self.__mediaTags = {}
if MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY in kwargs.keys():
# if type(kwargs[MediaDescriptor.TRACK_DESCRIPTORS_KEY]) is not List[TrackDescriptor]: # Use List typehint for TrackDescriptor as well if it works
# raise TypeError(f"MediaDescriptor.__init__(): Argument {MediaDescriptor.TRACK_DESCRIPTORS_KEY} is required to be of type list containing only elements of type TrackDescriptor")
if type(kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY]) is not list: # Use List typehint for TrackDescriptor as well if it works
raise TypeError(f"MediaDescriptor.__init__(): Argument {MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY} is required to be of type list")
for d in kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY]:
if type(d) is not TrackDescriptor:
raise TypeError(f"TrackDesciptor.__init__(): All elements of argument list {MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY} are required to be of type TrackDescriptor")
self.__trackDescriptors = kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY]
else:
self.__trackDescriptors = []
if MediaDescriptor.CLEAR_TAGS_KEY in kwargs.keys():
if type(kwargs[MediaDescriptor.CLEAR_TAGS_KEY]) is not bool:
raise TypeError(f"MediaDescriptor.__init__(): Argument {MediaDescriptor.CLEAR_TAGS_KEY} is required to be of type bool")
self.__clearTags = kwargs[MediaDescriptor.CLEAR_TAGS_KEY]
else:
self.__clearTags = False
@classmethod
def fromFfprobe(cls, formatData, streamData):
#trackDescriptors = {}
kwargs = {}
if MediaDescriptor.FFPROBE_TAGS_KEY in formatData.keys():
kwargs[MediaDescriptor.TAGS_KEY] = formatData[MediaDescriptor.FFPROBE_TAGS_KEY]
kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY] = []
for streamObj in streamData:
#trackType = TrackType.fromLabel(streamObj[MediaDescriptor.FFPROBE_CODEC_TYPE_KEY])
# if trackType != TrackType.UNKNOWN:
#
# if trackType.label() not in trackDescriptors.keys():
# trackDescriptors[trackType.label()] = []
#
# trackDescriptors[trackType.label()].append(TrackDescriptor.fromFfprobe(streamObj))
if TrackType.fromLabel(streamObj[MediaDescriptor.FFPROBE_CODEC_TYPE_KEY]) != TrackType.UNKNOWN:
kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY].append(TrackDescriptor.fromFfprobe(streamObj))
# kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY] = trackDescriptors
return cls(**kwargs)
def getTags(self):
return self.__mediaTags
def getAudioTracks(self) -> List[TrackDescriptor]:
#return self.__trackDescriptors[TrackType.AUDIO.label()] if TrackType.AUDIO.label() in self.__trackDescriptors.keys() else []
return [d for d in self.__trackDescriptors if d.getType() == TrackType.AUDIO]
def getSubtitleTracks(self) -> List[TrackDescriptor]:
#return self.__trackDescriptors[TrackType.SUBTITLE.label()] if TrackType.SUBTITLE.label() in self.__trackDescriptors.keys() else []
return [d for d in self.__trackDescriptors if d.getType() == TrackType.SUBTITLE]