inc
parent
6b99091a55
commit
a280248f6a
@ -1,43 +1,81 @@
|
||||
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_DESCRIPTORS_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):
|
||||
|
||||
self.__mediaTags = kwargs['tags'] if 'tags' in kwargs.keys() else {}
|
||||
self.__trackDescriptors = kwargs['trackDescriptors'] if 'trackDescriptors' in kwargs.keys() else {}
|
||||
self.__clearTags = kwargs['clearTags'] if 'clearTags' in kwargs.keys() else False
|
||||
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_DESCRIPTORS_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_DESCRIPTORS_KEY]) is not dict: # 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 dict")
|
||||
# for d in kwargs[MediaDescriptor.TRACK_DESCRIPTORS_KEY]:
|
||||
# if type(d) is not TrackDescriptor:
|
||||
# raise TypeError(f"TrackDesciptor.__init__(): All elements of argument set {MediaDescriptor.TRACK_DESCRIPTORS_KEY} is required to be of type TrackDescriptor")
|
||||
self.__trackDescriptors = kwargs[MediaDescriptor.TRACK_DESCRIPTORS_KEY]
|
||||
else:
|
||||
self.__trackDescriptors = set()
|
||||
|
||||
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):
|
||||
|
||||
descriptors = {}
|
||||
trackDescriptors = {}
|
||||
|
||||
for streamObj in streamData:
|
||||
|
||||
trackType = TrackType.fromLabel(streamObj['codec_type'])
|
||||
trackType = TrackType.fromLabel(streamObj[MediaDescriptor.FFPROBE_CODEC_TYPE_KEY])
|
||||
|
||||
if trackType != TrackType.UNKNOWN:
|
||||
|
||||
if trackType.label() not in descriptors.keys():
|
||||
descriptors[trackType.label()] = []
|
||||
if trackType.label() not in trackDescriptors.keys():
|
||||
trackDescriptors[trackType.label()] = []
|
||||
|
||||
trackDescriptors[trackType.label()].append(TrackDescriptor.fromFfprobe(streamObj))
|
||||
|
||||
descriptors[trackType.label()].append(TrackDescriptor.fromFfprobe(streamObj))
|
||||
kwargs = {}
|
||||
if MediaDescriptor.FFPROBE_TAGS_KEY in formatData.keys():
|
||||
kwargs[MediaDescriptor.TAGS_KEY] = formatData[MediaDescriptor.FFPROBE_TAGS_KEY]
|
||||
kwargs[MediaDescriptor.TRACK_DESCRIPTORS_KEY] = trackDescriptors
|
||||
|
||||
return cls(tags=formatData['tags'] if 'tags' in formatData.keys() else {},
|
||||
trackDescriptors = descriptors)
|
||||
return cls(**kwargs)
|
||||
|
||||
|
||||
def getTags(self):
|
||||
return self.__mediaTags
|
||||
|
||||
|
||||
def getAudioTracks(self):
|
||||
def getAudioTracks(self) -> List[TrackDescriptor]:
|
||||
return self.__trackDescriptors[TrackType.AUDIO.label()] if TrackType.AUDIO.label() in self.__trackDescriptors.keys() else []
|
||||
|
||||
def getSubtitleTracks(self):
|
||||
def getSubtitleTracks(self) -> List[TrackDescriptor]:
|
||||
return self.__trackDescriptors[TrackType.SUBTITLE.label()] if TrackType.SUBTITLE.label() in self.__trackDescriptors.keys() else []
|
||||
|
Loading…
Reference in New Issue