@ -1,3 +1,5 @@
from typing import List
from ffx . track_type import TrackType
from ffx . track_descriptor import TrackDescriptor
@ -5,39 +7,75 @@ 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 = { }
trackD escriptors = { }
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 [ ]