@ -61,15 +61,6 @@ class MediaDescriptor:
else :
self . __trackDescriptors = [ ]
if MediaDescriptor . CLEAR_TAGS_FLAG_KEY in kwargs . keys ( ) :
if type ( kwargs [ MediaDescriptor . CLEAR_TAGS_FLAG_KEY ] ) is not bool :
raise TypeError (
f " MediaDescriptor.__init__(): Argument { MediaDescriptor . CLEAR_TAGS_FLAG_KEY } is required to be of type bool "
)
self . __clearTags = kwargs [ MediaDescriptor . CLEAR_TAGS_FLAG_KEY ]
else :
self . __clearTags = False
if MediaDescriptor . JELLYFIN_ORDER_FLAG_KEY in kwargs . keys ( ) :
if type ( kwargs [ MediaDescriptor . JELLYFIN_ORDER_FLAG_KEY ] ) is not bool :
raise TypeError (
@ -79,77 +70,6 @@ class MediaDescriptor:
else :
self . __jellyfinOrder = False
def getDefaultVideoTrack ( self ) :
videoDefaultTracks = [
v
for v in self . getVideoTracks ( )
if TrackDisposition . DEFAULT in v . getDispositionSet ( )
]
if len ( videoDefaultTracks ) > 1 :
raise ValueError (
" MediaDescriptor.getDefaultVideoTrack(): More than one default video track is not supported "
)
return videoDefaultTracks [ 0 ] if videoDefaultTracks else None
def getForcedVideoTrack ( self ) :
videoForcedTracks = [
v
for v in self . getVideoTracks ( )
if TrackDisposition . FORCED in v . getDispositionSet ( )
]
if len ( videoForcedTracks ) > 1 :
raise ValueError (
" MediaDescriptor.getForcedVideoTrack(): More than one forced video track is not supported "
)
return videoForcedTracks [ 0 ] if videoForcedTracks else None
def getDefaultAudioTrack ( self ) :
audioDefaultTracks = [
a
for a in self . getAudioTracks ( )
if TrackDisposition . DEFAULT in a . getDispositionSet ( )
]
if len ( audioDefaultTracks ) > 1 :
raise ValueError (
" MediaDescriptor.getDefaultAudioTrack(): More than one default audio track is not supported "
)
return audioDefaultTracks [ 0 ] if audioDefaultTracks else None
def getForcedAudioTrack ( self ) :
audioForcedTracks = [
a
for a in self . getAudioTracks ( )
if TrackDisposition . FORCED in a . getDispositionSet ( )
]
if len ( audioForcedTracks ) > 1 :
raise ValueError (
" MediaDescriptor.getForcedAudioTrack(): More than one forced audio track is not supported "
)
return audioForcedTracks [ 0 ] if audioForcedTracks else None
def getDefaultSubtitleTrack ( self ) :
subtitleDefaultTracks = [
s
for s in self . getSubtitleTracks ( )
if TrackDisposition . DEFAULT in s . getDispositionSet ( )
]
if len ( subtitleDefaultTracks ) > 1 :
raise ValueError (
" MediaDescriptor.getDefaultSubtitleTrack(): More than one default subtitle track is not supported "
)
return subtitleDefaultTracks [ 0 ] if subtitleDefaultTracks else None
def getForcedSubtitleTrack ( self ) :
subtitleForcedTracks = [
s
for s in self . getSubtitleTracks ( )
if TrackDisposition . FORCED in s . getDispositionSet ( )
]
if len ( subtitleForcedTracks ) > 1 :
raise ValueError (
" MediaDescriptor.getForcedSubtitleTrack(): More than one forced subtitle track is not supported "
)
return subtitleForcedTracks [ 0 ] if subtitleForcedTracks else None
def setDefaultSubTrack ( self , trackType : TrackType , subIndex : int ) :
for t in self . getAllTrackDescriptors ( ) :
@ -166,7 +86,7 @@ class MediaDescriptor:
)
def check DefaultAndForcedDispositions ( self ) :
def check Configuration ( self ) :
videoTracks = self . getVideoTracks ( )
audioTracks = self . getAudioTracks ( )
@ -193,42 +113,37 @@ class MediaDescriptor:
if len ( set ( sourceIndices ) ) < len ( trackDescriptors ) :
raise ValueError ( ' Multiple streams originating from the same source stream ' )
def getReorderedTrackDescriptors ( self ) :
reorderedTrackDescriptors = videoTracks + audioTracks + subtitleTracks
orderedSourceTrackSequence = [
t . getSourceIndex ( ) for t in reorderedTrackDescriptors
]
if len ( set ( orderedSourceTrackSequence ) ) < len ( orderedSourceTrackSequence ) :
raise ValueError (
f " Multiple streams originating from the same source stream not supported "
)
return reorderedTrackDescriptors
def applyJellyfinOrder ( self ) :
""" Reorder subtracks in types with default the last, then make subindices flat again """
# videoTracks = self.sortSubIndices(self.getVideoTracks())
# audioTracks = self.sortSubIndices(self.getAudioTracks())
# subtitleTracks = self.sortSubIndices(self.getSubtitleTracks())
self . checkConfiguration ( )
# from self.__trackDescriptors
videoTracks = self . getVideoTracks ( )
audioTracks = self . getAudioTracks ( )
subtitleTracks = self . getSubtitleTracks ( )
if len ( [ v for v in videoTracks if v . getDispositionFlag ( TrackDisposition . DEFAULT ) ] ) > 1 :
pass
if len ( [ a for a in audioTracks if a . getDispositionFlag ( TrackDisposition . DEFAULT ) ] ) > 1 :
pass
if len ( [ s for s in subtitleTracks if s . getDispositionFlag ( TrackDisposition . DEFAULT ) ] ) :
pass
defaultVideoTracks = [ v for v in videoTracks if v . getDispositionFlag ( TrackDisposition . DEFAULT ) ]
defaultAudioTracks = [ a for a in audioTracks if a . getDispositionFlag ( TrackDisposition . DEFAULT ) ]
defaultSubtitleTracks = [ s for s in subtitleTracks if s . getDispositionFlag ( TrackDisposition . DEFAULT ) ]
if defaultVideoTracks :
videoTracks . append ( videoTracks . pop ( videoTracks . index ( defaultVideoTracks [ 0 ] ) ) )
self . sortSubIndices ( videoTracks )
if defaultAudioTracks :
audioTracks . append ( audioTracks . pop ( audioTracks . index ( defaultAudioTracks [ 0 ] ) ) )
self . sortSubIndices ( audioTracks )
if defaultSubtitleTracks :
subtitleTracks . append ( subtitleTracks . pop ( subtitleTracks . index ( defaultSubtitleTracks [ 0 ] ) ) )
self . sortSubIndices ( subtitleTracks )
videoTracks . append ( videoTracks . pop ( videoTracks . index ( videoTracks ) ) )
audioTracks . append ( audioTracks . pop ( audioTracks . index ( audioTracks ) ) )
subtitleTracks . append ( subtitleTracks . pop ( subtitleTracks . index ( subtitleTracks ) ) )
self . __trackDescriptors = videoTracks + audioTracks + subtitleTracks
self . sortIndices ( self . __trackDescriptors )
@classmethod
@ -268,43 +183,46 @@ class MediaDescriptor:
def getTags ( self ) :
return self . __mediaTags
def sortSubIndices (
self , descriptors : List [ TrackDescriptor ]
) - > List [ TrackDescriptor ] :
subIndex = 0
for t in descriptors :
t . setSubIndex ( subIndex )
for d in descriptors :
d . setSubIndex ( subIndex )
subIndex + = 1
return descriptors
def sortIndices (
self , descriptors : List [ TrackDescriptor ]
) - > List [ TrackDescriptor ] :
index = 0
for d in descriptors :
d . setIndex ( index )
index + = 1
return descriptors
def getAllTrackDescriptors ( self ) - > List [ TrackDescriptor ] :
return self . getVideoTracks ( ) + self . getAudioTracks ( ) + self . getSubtitleTracks ( )
def getVideoTracks ( self ) - > List [ TrackDescriptor ] :
return [
v for v in self . __trackDescriptors . copy ( ) if v . getType ( ) == TrackType . VIDEO
v for v in self . __trackDescriptors if v . getType ( ) == TrackType . VIDEO
]
def getAudioTracks ( self ) - > List [ TrackDescriptor ] :
return [
a for a in self . __trackDescriptors . copy ( ) if a . getType ( ) == TrackType . AUDIO
a for a in self . __trackDescriptors if a . getType ( ) == TrackType . AUDIO
]
def getSubtitleTracks ( self ) - > List [ TrackDescriptor ] :
return [
s
for s in self . __trackDescriptors . copy ( )
for s in self . __trackDescriptors
if s . getType ( ) == TrackType . SUBTITLE
]
# def getJellyfin(self):
# return self.__jellyfinOrder
#
# def setJellyfinOrder(self, state):
# self.__jellyfinOrder = state
def getClearTags ( self ) :
return self . __clearTags
def compare ( self , vsMediaDescriptor : Self ) :
@ -316,6 +234,10 @@ class MediaDescriptor:
vsTags = vsMediaDescriptor . getTags ( )
tags = self . getTags ( )
# tags ist leer
# click.echo(f"tags={tags} vsTags={vsTags}")
# raise click.Abort
# HINT: Some tags differ per file, for example creation_time, so these are removed before diff
for emt in MediaDescriptor . EXCLUDED_MEDIA_TAGS :
if emt in tags . keys ( ) :
@ -332,7 +254,7 @@ class MediaDescriptor:
# Target track configuration (from DB)
# tracks = self.getAllTrackDescriptors()
tracks = self . get ReorderedTrackDescriptors( )
tracks = self . get AllTrackDescriptors( ) # filtern
numTracks = len ( tracks )
# Current track configuration (of file)
@ -386,12 +308,13 @@ class MediaDescriptor:
def getImportFileTokens ( self , use_sub_index : bool = True ) :
reorderedTrackDescriptors = self . getReorderedTrackDescriptors ( )
# reorderedTrackDescriptors = self.getReorderedTrackDescriptors( )
importFileTokens = [ ]
for rtd in reorderedTrackDescriptors :
#for rtd in reorderedTrackDescriptors:
for td in self . __trackDescriptors :
importedFilePath = r td. getExternalSourceFilePath ( )
importedFilePath = td. getExternalSourceFilePath ( )
if importedFilePath :
importFileTokens + = [
@ -403,17 +326,18 @@ class MediaDescriptor:
def getInputMappingTokens ( self , use_sub_index : bool = True , only_video : bool = False ) :
reorderedTrackDescriptors = self . getReorderedTrackDescriptors ( )
# reorderedTrackDescriptors = self.getReorderedTrackDescriptors( )
inputMappingTokens = [ ]
filePointer = 1
for rtd in reorderedTrackDescriptors :
#for rtd in reorderedTrackDescriptors:
for td in self . __trackDescriptors :
trackType = r td. getType ( )
trackType = td. getType ( )
if ( trackType == TrackType . VIDEO or not only_video ) :
importedFilePath = r td. getExternalSourceFilePath ( )
importedFilePath = td. getExternalSourceFilePath ( )
if use_sub_index :
@ -427,15 +351,15 @@ class MediaDescriptor:
else :
if r td. getCodec ( ) != TrackDescriptor . CODEC_PGS :
if td. getCodec ( ) != TrackDescriptor . CODEC_PGS :
inputMappingTokens + = [
" -map " ,
f " 0: { trackType . indicator ( ) } : { r td. getSubIndex ( ) } " ,
f " 0: { trackType . indicator ( ) } : { td. getSubIndex ( ) } " ,
]
else :
if r td. getCodec ( ) != TrackDescriptor . CODEC_PGS :
inputMappingTokens + = [ " -map " , f " 0: { r td. getIndex ( ) } " ]
if td. getCodec ( ) != TrackDescriptor . CODEC_PGS :
inputMappingTokens + = [ " -map " , f " 0: { td. getIndex ( ) } " ]
return inputMappingTokens