diff --git a/bin/ffx/file_properties.py b/bin/ffx/file_properties.py index b44fe9b..d0106b9 100644 --- a/bin/ffx/file_properties.py +++ b/bin/ffx/file_properties.py @@ -211,13 +211,8 @@ class FileProperties(): def getMediaDescriptor(self): - return MediaDescriptor.fromFfprobe(self.getFormatData(), self.getStreamData()) - # formatData = self.getFormatData() - # streamData = self.getStreamData() - - def getShowId(self) -> int: return self.__pattern.getShowId() if self.__pattern is not None else -1 diff --git a/bin/ffx/media_descriptor.py b/bin/ffx/media_descriptor.py index e1d1a61..cab7054 100644 --- a/bin/ffx/media_descriptor.py +++ b/bin/ffx/media_descriptor.py @@ -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 [] diff --git a/bin/ffx/pattern_controller.py b/bin/ffx/pattern_controller.py index 3dc74ba..b3935de 100644 --- a/bin/ffx/pattern_controller.py +++ b/bin/ffx/pattern_controller.py @@ -134,8 +134,6 @@ class PatternController(): finally: s.close() - return result - def getMediaDescriptor(self, patternId):