@ -37,6 +37,11 @@ class FfxController():
INPUT_FILE_EXTENSIONS = [ ' mkv ' , ' mp4 ' , ' avi ' , ' flv ' , ' webm ' ]
INPUT_FILE_EXTENSIONS = [ ' mkv ' , ' mp4 ' , ' avi ' , ' flv ' , ' webm ' ]
def __init__ ( self , sourceMediaDescriptor : MediaDescriptor , targetMediaDescriptor : MediaDescriptor ) :
self . __sourceMediaDescriptor = sourceMediaDescriptor
self . __targetMediaDescriptor = targetMediaDescriptor
# def getReorderedSubstreams(subDescriptor, last):
# def getReorderedSubstreams(subDescriptor, last):
# numSubStreams = len(subDescriptor)
# numSubStreams = len(subDescriptor)
@ -139,120 +144,181 @@ class FfxController():
return clearTokens
return clearTokens
def getDispositionFlags ( self , subStreamDescriptor ) :
return { k for ( k , v ) in subStreamDescriptor [ ' disposition ' ] . items ( ) if v == 1 } if ' disposition ' in subStreamDescriptor . keys ( ) else set ( )
def generateDispositionTokens ( self ) :
""" -disposition:s:X default+forced """
sourceTrackDescriptors = self . __sourceMediaDescriptor . getAllTrackDescriptors ( )
targetTrackDescriptors = self . __targetMediaDescriptor . getReorderedTrackDescriptors ( )
# def generateDispositionTokens(subDescriptor):
def generateDispositionTokens ( self , subDescriptor , modifyOrder = [ ] ) :
""" -disposition:s:X default+forced """
dispositionTokens = [ ]
dispositionTokens = [ ]
for subStreamIndex in range ( len ( subDescriptor ) ) :
# for subStreamIndex in range(len(subDescriptor)):
for trackDescriptor in targetTrackDescriptors :
sourceSubStreamIndex = modifyOrder [ subStreamIndex ] if modifyOrder else subStreamIndex
subStream = subDescriptor [ sourceSubStreamIndex ]
# Calculate source sub index
changedTargetTrackDescriptor : TrackDescriptor = targetTrackDescriptors [ trackDescriptor . getIndex ( ) ]
changedTargetTrackSourceIndex = changedTargetTrackDescriptor . getSourceIndex ( )
sourceSubIndex = sourceTrackDescriptors [ changedTargetTrackSourceIndex ] . getSubIndex ( )
streamType = subStream [ ' codec_type ' ] [ 0 ] # v|a|s
stream Indicator = trackDescriptor . getType ( ) . indicator ( )
dispositionFlags = self . getDispositionFlags ( subStream )
disposition Set = trackDescriptor . getDispositionSet ( )
if disposition Flags :
if disposition Set :
dispositionTokens + = [ f " -disposition: { stream Type} : { subStream Index} " , ' + ' . join ( dispositionFlags ) ]
dispositionTokens + = [ f " -disposition: { stream Indicator} : { sourceSub Index} " , ' + ' . join ( [ d . label ( ) for d in dispositionSet ] ) ]
else :
else :
dispositionTokens + = [ f " -disposition: { stream Type} : { subStream Index} " , ' 0 ' ]
dispositionTokens + = [ f " -disposition: { stream Indicator} : { sourceSub Index} " , ' 0 ' ]
return dispositionTokens
return dispositionTokens
def generateM appingTokensFromDescriptors( self , sourceMediaDescriptor : MediaDescriptor , targetMediaDescriptor : MediaDescriptor ) :
def generateM etadataTokens( self ) :
mappingTokens = [ ]
mappingTokens = [ ]
mediaDifferences = targetMediaDescriptor . compare ( sourceMediaDescriptor )
# click.echo(f"source media descriptor: track indices={[d.getIndex() for d in sourceMediaDescriptor.getAllTrackDescriptors()]}")
# click.echo(f"target media descriptor: track indices={[d.getIndex() for d in targetMediaDescriptor.getAllTrackDescriptors()]}")
# +jellyfin -jellyfin
mediaDifferences = self . __targetMediaDescriptor . compare ( self . __sourceMediaDescriptor )
# media diff {'tracks': {'changed': {4: {'tags': {'added': {'Yolo'}}}}}}
click . echo ( f " media diff { mediaDifferences } " )
click . echo ( f " media diff { mediaDifferences } " )
if MediaDescriptor . TAGS_KEY in mediaDifferences . keys ( ) :
if MediaDescriptor . TAGS_KEY in mediaDifferences . keys ( ) :
sourceTags = sourceMediaDescriptor . getTags ( )
sourceTags = self . __sourceMediaDescriptor . getTags ( )
targetTags = targetMediaDescriptor . getTags ( )
targetTags = self . __targetMediaDescriptor . getTags ( )
if DIFF_REMOVED_KEY in mediaDifferences [ MediaDescriptor . TAGS_KEY ] . keys ( ) :
# for removedTagKey in mediaDifferences[MediaDescriptor.TAGS_KEY][DIFF_REMOVED_KEY]:
# row = (f"removed media tag: key='{removedTagKey}' value='{sourceTags[removedTagKey]}'",)
# self.differencesTable.add_row(*map(str, row))
mappingTokens + = [ f " -map_metadata:g " , " -1 " ]
for targetMediaTagKey in targetTags :
mappingTokens + = [ f " -metadata:g " , f " { targetMediaTagKey } = { targetTags [ targetMediaTagKey ] } " ]
else :
if DIFF_ADDED_KEY in mediaDifferences [ MediaDescriptor . TAGS_KEY ] . keys ( ) :
if DIFF_ADDED_KEY in mediaDifferences [ MediaDescriptor . TAGS_KEY ] . keys ( ) :
for addedTagKey in mediaDifferences [ MediaDescriptor . TAGS_KEY ] [ DIFF_ADDED_KEY ] :
for addedTagKey in mediaDifferences [ MediaDescriptor . TAGS_KEY ] [ DIFF_ADDED_KEY ] :
# row = (f"added media tag: key='{addedTagKey}' value='{targetTags[addedTagKey]}'",)
# row = (f"added media tag: key='{addedTagKey}' value='{targetTags[addedTagKey]}'",)
click . echo ( f " added metadata key= ' { addedTagKey } ' value= ' { targetTags [ addedTagKey ] } ' -> ' { targetTags [ addedTagKey ] } ' " )
# self.differencesTable.add_row(*map(str, row))
# self.differencesTable.add_row(*map(str, row))
pass
#pass
mappingTokens + = [ f " -metadata:g " , f " { addedTagKey } = { targetTags [ addedTagKey ] } " ]
if DIFF_REMOVED_KEY in mediaDifferences [ MediaDescriptor . TAGS_KEY ] . keys ( ) :
for removedTagKey in mediaDifferences [ MediaDescriptor . TAGS_KEY ] [ DIFF_REMOVED_KEY ] :
# row = (f"removed media tag: key='{removedTagKey}' value='{sourceTags[removedTagKey]}'",)
# self.differencesTable.add_row(*map(str, row))
pass
if DIFF_CHANGED_KEY in mediaDifferences [ MediaDescriptor . TAGS_KEY ] . keys ( ) :
if DIFF_CHANGED_KEY in mediaDifferences [ MediaDescriptor . TAGS_KEY ] . keys ( ) :
for changedTagKey in mediaDifferences [ MediaDescriptor . TAGS_KEY ] [ DIFF_CHANGED_KEY ] :
for changedTagKey in mediaDifferences [ MediaDescriptor . TAGS_KEY ] [ DIFF_CHANGED_KEY ] :
#row = (f"changed media tag: key='{changedTagKey}' value='{sourceTags[changedTagKey]}'->'{targetTags[changedTagKey]}'",)
#row = (f"changed media tag: key='{changedTagKey}' value='{sourceTags[changedTagKey]}'->'{targetTags[changedTagKey]}'",)
click . echo ( f " changed metadata key= ' { changedTagKey } ' value= ' { sourceTags [ changedTagKey ] } ' -> ' { targetTags [ changedTagKey ] } ' " )
# self.differencesTable.add_row(*map(str, row))
# self.differencesTable.add_row(*map(str, row))
pass
#pass
mappingTokens + = [ f " -metadata:g " , f " { changedTagKey } = { targetTags [ changedTagKey ] } " ]
if MediaDescriptor . TRACKS_KEY in mediaDifferences . keys ( ) :
if MediaDescriptor . TRACKS_KEY in mediaDifferences . keys ( ) :
sourceTrack s = sourceMediaDescriptor. getAllTrack s( ) # 0,1,2,3
sourceTrack Descriptor s = self . __ sourceMediaDescriptor. getAllTrack Descriptor s( )
targetTrack s = targetMediaDescriptor . getAllTracks ( ) # 0 <- from DB
targetTrack Descriptors = self . __targetMediaDescriptor . getReorderedTrackDescriptors ( )
if DIFF_ADDED_KEY in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] . keys ( ) :
if DIFF_ADDED_KEY in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] . keys ( ) :
addedTracksIndices = mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_ADDED_KEY ]
addedTracksIndices = mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_ADDED_KEY ]
raise click . ClickException ( f " FfxController.generateM appingTokensFromDescriptor s(): Adding tracks is not supported. Track indices { addedTracksIndices } " )
raise click . ClickException ( f " FfxController.generateM etadataToken s(): Adding tracks is not supported. Track indices { addedTracksIndices } " )
#raise click.ClickException(f"add track {mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_ADDED_KEY]}")
#raise click.ClickException(f"add track {mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_ADDED_KEY]}")
#for addedTrackIndex in mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_ADDED_KEY]:
#for addedTrackIndex in mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_ADDED_KEY]:
#addedTrack : Track = targetTrack s[addedTrackIndex]
#addedTrack : Track = targetTrack Descriptor s[addedTrackIndex]
# row = (f"added {addedTrack.getType().label()} track: index={addedTrackIndex} lang={addedTrack.getLanguage().threeLetter()}",)
# row = (f"added {addedTrack.getType().label()} track: index={addedTrackIndex} lang={addedTrack.getLanguage().threeLetter()}",)
# self.differencesTable.add_row(*map(str, row))
# self.differencesTable.add_row(*map(str, row))
if DIFF_REMOVED_KEY in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] . keys ( ) :
if DIFF_REMOVED_KEY in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] . keys ( ) :
removedTracksIndices = mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_ADDED_KEY ] . keys ( )
removedTracksIndices = mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_ADDED_KEY ] . keys ( )
raise click . ClickException ( f " FfxController.generateM appingTokensFromDescriptor s(): Removing tracks is not supported. Track indices { removedTracksIndices } " )
raise click . ClickException ( f " FfxController.generateM etadataToken s(): Removing tracks is not supported. Track indices { removedTracksIndices } " )
#for removedTrackIndex in mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_REMOVED_KEY]:
#for removedTrackIndex in mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_REMOVED_KEY]:
# row = (f"removed track: index={removedTrackIndex}",)
# row = (f"removed track: index={removedTrackIndex}",)
# self.differencesTable.add_row(*map(str, row))
# self.differencesTable.add_row(*map(str, row))
# media diff {'tracks': {'changed': {4: {'tags': {'added': {'Yolo'}}}}}}
if DIFF_CHANGED_KEY in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] . keys ( ) :
if DIFF_CHANGED_KEY in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] . keys ( ) :
for changedTrackIndex in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_CHANGED_KEY ] . keys ( ) :
for changedTrackIndex in mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_CHANGED_KEY ] . keys ( ) :
changedTrack : Track = targetTracks [ changedTrackIndex ]
changedTargetTrackDescriptor : TrackDescriptor = targetTrackDescriptors [ changedTrackIndex ]
changedTargetTrackSourceIndex = changedTargetTrackDescriptor . getSourceIndex ( )
changedTargetSourceSubIndex = sourceTrackDescriptors [ changedTargetTrackSourceIndex ] . getSubIndex ( )
# changedSourceTrackDescriptor : TrackDescriptor = sourceTrackDescriptors[changedTargetTrackSourceIndex]
# changedSourceTrackSubIndex = changedSourceTrackDescriptor.getSubIndex()
changedTrackDiff : dict = mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_CHANGED_KEY ] [ changedTrackIndex ]
changedTrackDiff : dict = mediaDifferences [ MediaDescriptor . TRACKS_KEY ] [ DIFF_CHANGED_KEY ] [ changedTrackIndex ]
if MediaDescriptor . TAGS_KEY in changedTrackDiff . keys ( ) :
if MediaDescriptor . TAGS_KEY in changedTrackDiff . keys ( ) :
if DIFF_ADDED_KEY in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] :
for addedTagKey in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] [ DIFF_ADDED_KEY ] :
addedTagValue = changedTrack . getTags ( ) [ addedTagKey ]
# row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} added key={addedTagKey} value={addedTagValue}",)
# self.differencesTable.add_row(*map(str, row))
pass
if DIFF_REMOVED_KEY in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] :
if DIFF_REMOVED_KEY in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] :
for removedTagKey in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] [ DIFF_REMOVED_KEY ] :
#for removedTagKey in changedTrackDiff[MediaDescriptor.TAGS_KEY][DIFF_REMOVED_KEY]:
# row = (f"changed {changedT rack.getType().label()} track index={changedTrackIndex} removed key={removedTagKey}",)
# row = (f"changed {changedTargetTrackDescriptor.getType().label()} track index={changedTrackIndex} removed key={removedTagKey}",)
# self.differencesTable.add_row(*map(str, row))
# self.differencesTable.add_row(*map(str, row))
pass
if TrackDescriptor . DISPOSITION_SET_KEY in changedTrackDiff . keys ( ) :
#addedTagValue = targetTrackDescriptors[changedTargetTrackSourceIndex].getTags()[addedTagKey]
if DIFF_ADDED_KEY in changedTrackDiff [ TrackDescriptor . DISPOSITION_SET_KEY ] :
mappingTokens + = [ f " -map_metadata:s: { changedTargetTrackDescriptor . getType ( ) . indicator ( ) } : { changedTargetSourceSubIndex } " , " -1 " ]
for addedDisposition in changedTrackDiff [ TrackDescriptor . DISPOSITION_SET_KEY ] [ DIFF_ADDED_KEY ] :
# row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} added disposition={addedDisposition.label()}",)
# self.differencesTable.add_row(*map(str, row))
pass
if DIFF_REMOVED_KEY in changedTrackDiff [ TrackDescriptor . DISPOSITION_SET_KEY ] :
for targetTrackTagKey , targetTrackTagValue in changedTargetTrackDescriptor . getTags ( ) :
for removedDisposition in changedTrackDiff [ TrackDescriptor . DISPOSITION_SET_KEY ] [ DIFF_REMOVED_KEY ] :
mappingTokens + = [ f " -metadata:s: { changedTargetTrackDescriptor . getType ( ) . indicator ( ) } : { changedTargetSourceSubIndex } " ,
# row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} removed disposition={removedDisposition.label()}",)
f " { targetTrackTagKey } = { targetTrackTagValue } " ]
# self.differencesTable.add_row(*map(str, row))
pass
else :
# media diff {'tracks': {'changed': {4: {'tags': {'added': {'Yolo'}}}}}}
if DIFF_ADDED_KEY in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] :
for addedTagKey in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] [ DIFF_ADDED_KEY ] :
addedTagValue = targetTrackDescriptors [ changedTargetTrackSourceIndex ] . getTags ( ) [ addedTagKey ]
# addedTagValue = changedTrackDiff[MediaDescriptor.TAGS_KEY][DIFF_ADDED_KEY][addedTagKey]
# click.echo(f"addedTagValue={addedTagValue}")
# click.echo(f"sourceTrackDescriptors: subindex={[s.getSubIndex() for s in sourceTrackDescriptors]} sourceindex={[s.getSourceIndex() for s in sourceTrackDescriptors]} tags={[s.getTags() for s in sourceTrackDescriptors]}")
# click.echo(f"targetTrackDescriptors: subindex={[t.getSubIndex() for t in targetTrackDescriptors]} sourceindex={[t.getSourceIndex() for t in targetTrackDescriptors]} tags={[t.getTags() for t in targetTrackDescriptors]}")
# click.echo(f"changed track_index={changedTrackIndex} indicator={changedTargetTrackDescriptor.getType().indicator()} key={addedTagKey} value={addedTagValue} source_index={changedSourceTrackIndex}")
mappingTokens + = [ f " -metadata:s: { changedTargetTrackDescriptor . getType ( ) . indicator ( ) } : { changedTargetSourceSubIndex } " ,
f " { addedTagKey } = { addedTagValue } " ]
# media diff {'tracks': {'changed': {4: {'tags': {'added': {'Yolo'}}}}}}
if DIFF_CHANGED_KEY in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] :
for changedTagKey in changedTrackDiff [ MediaDescriptor . TAGS_KEY ] [ DIFF_CHANGED_KEY ] :
changedTagValue = targetTrackDescriptors [ changedTargetTrackSourceIndex ] . getTags ( ) [ changedTagKey ]
# sourceSubIndex = sourceTrackDescriptors[changedTargetTrackSourceIndex].getSubIndex()
# addedTagValue = changedTrackDiff[MediaDescriptor.TAGS_KEY][DIFF_ADDED_KEY][addedTagKey]
# click.echo(f"addedTagValue={addedTagValue}")
# click.echo(f"sourceTrackDescriptors: subindex={[s.getSubIndex() for s in sourceTrackDescriptors]} sourceindex={[s.getSourceIndex() for s in sourceTrackDescriptors]} tags={[s.getTags() for s in sourceTrackDescriptors]}")
# click.echo(f"targetTrackDescriptors: subindex={[t.getSubIndex() for t in targetTrackDescriptors]} sourceindex={[t.getSourceIndex() for t in targetTrackDescriptors]} tags={[t.getTags() for t in targetTrackDescriptors]}")
# click.echo(f"changed track_index={changedTrackIndex} indicator={changedTargetTrackDescriptor.getType().indicator()} key={addedTagKey} value={addedTagValue} source_index={changedSourceTrackIndex}")
mappingTokens + = [ f " -metadata:s: { changedTargetTrackDescriptor . getType ( ) . indicator ( ) } : { changedTargetSourceSubIndex } " ,
f " { changedTagKey } = { changedTagValue } " ]
# if TrackDescriptor.DISPOSITION_SET_KEY in changedTrackDiff.keys():
#
# if DIFF_ADDED_KEY in changedTrackDiff[TrackDescriptor.DISPOSITION_SET_KEY]:
# for addedDisposition in changedTrackDiff[TrackDescriptor.DISPOSITION_SET_KEY][DIFF_ADDED_KEY]:
# # row = (f"changed {changedTargetTrackDescriptor.getType().label()} track index={changedTrackIndex} added disposition={addedDisposition.label()}",)
# # self.differencesTable.add_row(*map(str, row))
# pass
#
# if DIFF_REMOVED_KEY in changedTrackDiff[TrackDescriptor.DISPOSITION_SET_KEY]:
# for removedDisposition in changedTrackDiff[TrackDescriptor.DISPOSITION_SET_KEY][DIFF_REMOVED_KEY]:
# # row = (f"changed {changedTargetTrackDescriptor.getType().label()} track index={changedTrackIndex} removed disposition={removedDisposition.label()}",)
# # self.differencesTable.add_row(*map(str, row))
# pass
return mappingTokens