Rework Descriptor Diff
parent
86cc7dfc6f
commit
2d8622506e
@ -0,0 +1,266 @@
|
||||
import click
|
||||
|
||||
from ffx.media_descriptor import MediaDescriptor
|
||||
from ffx.track_descriptor import TrackDescriptor
|
||||
|
||||
from ffx.helper import dictDiff, setDiff, DIFF_ADDED_KEY, DIFF_CHANGED_KEY, DIFF_REMOVED_KEY, DIFF_UNCHANGED_KEY
|
||||
|
||||
from ffx.track_codec import TrackCodec
|
||||
from ffx.track_disposition import TrackDisposition
|
||||
|
||||
|
||||
class MediaDescriptorChangeSet():
|
||||
|
||||
TAGS_KEY = "tags"
|
||||
TRACKS_KEY = "tracks"
|
||||
DISPOSITION_SET_KEY = "disposition_set"
|
||||
|
||||
TRACK_DESCRIPTOR_KEY = "track_descriptor"
|
||||
|
||||
|
||||
def __init__(self, context,
|
||||
targetMediaDescriptor: MediaDescriptor = None,
|
||||
sourceMediaDescriptor: MediaDescriptor = None):
|
||||
|
||||
self.__context = context
|
||||
self.__logger = context['logger']
|
||||
|
||||
self.__configurationData = self.__context['config'].getData()
|
||||
|
||||
metadataConfiguration = self.__configurationData['metadata'] if 'metadata' in self.__configurationData.keys() else {}
|
||||
|
||||
self.__signatureTags = metadataConfiguration['signature'] if 'signature' in metadataConfiguration.keys() else {}
|
||||
self.__removeGlobalKeys = metadataConfiguration['remove'] if 'remove' in metadataConfiguration.keys() else []
|
||||
self.__ignoreGlobalKeys = metadataConfiguration['ignore'] if 'ignore' in metadataConfiguration.keys() else []
|
||||
self.__removeTrackKeys = (metadataConfiguration['streams']['remove']
|
||||
if 'streams' in metadataConfiguration.keys()
|
||||
and 'remove' in metadataConfiguration['streams'].keys() else [])
|
||||
self.__ignoreTrackKeys = (metadataConfiguration['streams']['ignore']
|
||||
if 'streams' in metadataConfiguration.keys()
|
||||
and 'ignore' in metadataConfiguration['streams'].keys() else [])
|
||||
|
||||
|
||||
self.__changeSetObj = {}
|
||||
|
||||
if targetMediaDescriptor is not None:
|
||||
|
||||
sourceMediaTags = sourceMediaDescriptor.getTags() if sourceMediaDescriptor is not None else {}
|
||||
targetMediaTags = targetMediaDescriptor.getTags()
|
||||
|
||||
#!!#
|
||||
tagsDiff = dictDiff(sourceMediaTags,
|
||||
targetMediaTags,
|
||||
ignoreKeys=self.__ignoreGlobalKeys,
|
||||
removeKeys=self.__removeGlobalKeys)
|
||||
|
||||
if tagsDiff:
|
||||
self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY] = tagsDiff
|
||||
|
||||
|
||||
self.__targetTrackDescriptors = targetMediaDescriptor.getTrackDescriptors()
|
||||
self.__numTargetTracks = len(self.__targetTrackDescriptors)
|
||||
|
||||
# Current track configuration (of file)
|
||||
self.__sourceTrackDescriptors = sourceMediaDescriptor.getTrackDescriptors() if sourceMediaDescriptor is not None else []
|
||||
self.__numSourceTracks = len(self.__sourceTrackDescriptors)
|
||||
|
||||
maxNumOfTracks = max(self.__numSourceTracks, self.__numTargetTracks)
|
||||
|
||||
trackCompareResult = {}
|
||||
|
||||
|
||||
for trackIndex in range(maxNumOfTracks):
|
||||
|
||||
correspondingSourceTrackDescriptors = [st for st in self.__sourceTrackDescriptors if st.getIndex() == trackIndex]
|
||||
correspondingTargetTrackDescriptors = [tt for tt in self.__targetTrackDescriptors if tt.getIndex() == trackIndex]
|
||||
|
||||
# Track present in target but not in source
|
||||
if (not correspondingSourceTrackDescriptors
|
||||
and correspondingTargetTrackDescriptors):
|
||||
|
||||
if DIFF_ADDED_KEY not in trackCompareResult.keys():
|
||||
trackCompareResult[DIFF_ADDED_KEY] = {}
|
||||
|
||||
trackCompareResult[DIFF_ADDED_KEY][trackIndex] = correspondingTargetTrackDescriptors[0]
|
||||
continue
|
||||
|
||||
# Track present in target but not in source
|
||||
if (correspondingSourceTrackDescriptors
|
||||
and not correspondingTargetTrackDescriptors):
|
||||
|
||||
if DIFF_REMOVED_KEY not in trackCompareResult.keys():
|
||||
trackCompareResult[DIFF_REMOVED_KEY] = {}
|
||||
|
||||
trackCompareResult[DIFF_REMOVED_KEY][trackIndex] = correspondingSourceTrackDescriptors[0]
|
||||
continue
|
||||
|
||||
if (correspondingSourceTrackDescriptors
|
||||
and correspondingTargetTrackDescriptors):
|
||||
|
||||
trackDiff = self.compareTracks(correspondingSourceTrackDescriptors[0], correspondingTargetTrackDescriptors[0])
|
||||
|
||||
if trackDiff:
|
||||
if DIFF_CHANGED_KEY not in trackCompareResult.keys():
|
||||
trackCompareResult[DIFF_CHANGED_KEY] = {}
|
||||
|
||||
trackCompareResult[DIFF_CHANGED_KEY][trackIndex] = trackDiff
|
||||
|
||||
|
||||
if trackCompareResult:
|
||||
self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY] = trackCompareResult
|
||||
|
||||
|
||||
def compareTracks(self,
|
||||
targetTrackDescriptor: TrackDescriptor,
|
||||
sourceTrackDescriptor: TrackDescriptor = None):
|
||||
|
||||
if not isinstance(targetTrackDescriptor, TrackDescriptor):
|
||||
self.__logger.error(f"MediaDescriptorChangeSet.compareTracks(): Argument targetTrackDescriptor is required to be of type TrackDescriptor")
|
||||
raise click.Abort()
|
||||
|
||||
sourceTrackTags = sourceTrackDescriptor.getTags() if sourceTrackDescriptor is not None else {}
|
||||
targetTrackTags = targetTrackDescriptor.getTags()
|
||||
|
||||
trackCompareResult = {}
|
||||
|
||||
tagsDiffResult = dictDiff(sourceTrackTags,
|
||||
targetTrackTags,
|
||||
ignoreKeys=self.__ignoreTrackKeys,
|
||||
removeKeys=self.__removeTrackKeys)
|
||||
|
||||
if tagsDiffResult:
|
||||
trackCompareResult[MediaDescriptorChangeSet.TAGS_KEY] = tagsDiffResult
|
||||
|
||||
sourceDispositions = sourceTrackDescriptor.getDispositionSet()
|
||||
targetDispositions = targetTrackDescriptor.getDispositionSet()
|
||||
|
||||
dispositionDiffResult = setDiff(sourceDispositions, targetDispositions)
|
||||
|
||||
if dispositionDiffResult:
|
||||
trackCompareResult[MediaDescriptorChangeSet.DISPOSITION_SET_KEY] = dispositionDiffResult
|
||||
|
||||
if trackCompareResult:
|
||||
trackCompareResult[MediaDescriptorChangeSet.TRACK_DESCRIPTOR_KEY] = targetTrackDescriptor
|
||||
|
||||
return trackCompareResult
|
||||
|
||||
|
||||
def generateDispositionTokens(self):
|
||||
"""
|
||||
#Example: -disposition:s:0 default -disposition:s:1 0
|
||||
"""
|
||||
dispositionTokens = []
|
||||
|
||||
if MediaDescriptorChangeSet.TRACKS_KEY in self.__changeSetObj.keys():
|
||||
|
||||
if DIFF_ADDED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY].keys():
|
||||
addedTracks: dict = self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY][DIFF_ADDED_KEY]
|
||||
trackDescriptor: TrackDescriptor
|
||||
for trackDescriptor in addedTracks.values():
|
||||
|
||||
dispositionSet = trackDescriptor.getDispositionSet()
|
||||
|
||||
if dispositionSet:
|
||||
dispositionTokens += [f"-disposition:{trackDescriptor.getType().indicator()}:{trackDescriptor.getSubIndex()}",
|
||||
'+'.join([d.label() for d in dispositionSet])]
|
||||
|
||||
if DIFF_CHANGED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY].keys():
|
||||
changedTracks: dict = self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY][DIFF_CHANGED_KEY]
|
||||
trackDiffObj: dict
|
||||
for trackDiffObj in changedTracks.values():
|
||||
|
||||
addedDispositions = trackDiffObj[DIFF_ADDED_KEY] if DIFF_ADDED_KEY in trackDiffObj.keys() else set()
|
||||
removedDispositions = trackDiffObj[DIFF_REMOVED_KEY] if DIFF_REMOVED_KEY in trackDiffObj.keys() else set()
|
||||
unchangedDispositions = trackDiffObj[DIFF_UNCHANGED_KEY] if DIFF_UNCHANGED_KEY in trackDiffObj.keys() else set()
|
||||
|
||||
targetDispositions = addedDispositions | unchangedDispositions
|
||||
|
||||
streamIndicator = trackDescriptor.getType().indicator()
|
||||
subIndex = trackDescriptor.getSubIndex()
|
||||
|
||||
if targetDispositions:
|
||||
dispositionTokens += [f"-disposition:{streamIndicator}:{subIndex}", '+'.join([d.label() for d in targetDispositions])]
|
||||
if not targetDispositions and removedDispositions:
|
||||
dispositionTokens += [f"-disposition:{streamIndicator}:{subIndex}", '0']
|
||||
|
||||
return dispositionTokens
|
||||
|
||||
|
||||
def generateMetadataTokens(self):
|
||||
|
||||
metadataTokens = []
|
||||
|
||||
if MediaDescriptorChangeSet.TAGS_KEY in self.__changeSetObj.keys():
|
||||
|
||||
addedMediaTags = (self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY][DIFF_ADDED_KEY]
|
||||
if DIFF_ADDED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY].keys() else {})
|
||||
removedMediaTags = (self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY][DIFF_REMOVED_KEY]
|
||||
if DIFF_REMOVED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY].keys() else {})
|
||||
changedMediaTags = (self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY][DIFF_CHANGED_KEY]
|
||||
if DIFF_CHANGED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TAGS_KEY].keys() else {})
|
||||
|
||||
outputMediaTags = addedMediaTags | changedMediaTags
|
||||
|
||||
if (not 'no_signature' in self.__context.keys()
|
||||
or not self.__context['no_signature']):
|
||||
outputMediaTags = outputMediaTags | self.__signatureTags
|
||||
|
||||
# outputMediaTags = {k:v for k,v in outputMediaTags.items() if k not in self.__removeGlobalKeys}
|
||||
|
||||
for tagKey, tagValue in outputMediaTags.items():
|
||||
metadataTokens += [f"-metadata:g",
|
||||
f"{tagKey}={tagValue}"]
|
||||
|
||||
for tagKey, tagValue in changedMediaTags.items():
|
||||
metadataTokens += [f"-metadata:g",
|
||||
f"{tagKey}={tagValue}"]
|
||||
|
||||
for removeKey in removedMediaTags.keys():
|
||||
metadataTokens += [f"-metadata:g",
|
||||
f"{removeKey}="]
|
||||
|
||||
|
||||
if MediaDescriptorChangeSet.TRACKS_KEY in self.__changeSetObj.keys():
|
||||
|
||||
if DIFF_ADDED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY].keys():
|
||||
addedTracks: dict = self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY][DIFF_ADDED_KEY]
|
||||
trackDescriptor: TrackDescriptor
|
||||
for trackDescriptor in addedTracks.values():
|
||||
for tagKey, tagValue in trackDescriptor.getTags().items():
|
||||
if not tagKey in self.__removeTrackKeys:
|
||||
metadataTokens += [f"-metadata:s:{trackDescriptor.getType().indicator()}"
|
||||
+ f":{trackDescriptor.getSubIndex()}",
|
||||
f"{tagKey}={tagValue}"]
|
||||
|
||||
if DIFF_CHANGED_KEY in self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY].keys():
|
||||
changedTracks: dict = self.__changeSetObj[MediaDescriptorChangeSet.TRACKS_KEY][DIFF_CHANGED_KEY]
|
||||
trackDiffObj: dict
|
||||
for trackDiffObj in changedTracks.values():
|
||||
|
||||
addedTrackTags = trackDiffObj[DIFF_ADDED_KEY] if DIFF_ADDED_KEY in trackDiffObj.keys() else {}
|
||||
changedTrackTags = trackDiffObj[DIFF_CHANGED_KEY] if DIFF_CHANGED_KEY in trackDiffObj.keys() else {}
|
||||
removedTrackTags = trackDiffObj[DIFF_REMOVED_KEY] if DIFF_REMOVED_KEY in trackDiffObj.keys() else {}
|
||||
|
||||
# outputTrackTags = {k:v for k,v in (addedTrackTags | changedTrackTags).items() if k not in self.__removeTrackKeys}
|
||||
outputTrackTags = addedTrackTags | changedTrackTags
|
||||
|
||||
for tagKey, tagValue in outputTrackTags.items():
|
||||
metadataTokens += [f"-metadata:s:{trackDescriptor.getType().indicator()}"
|
||||
+ f":{trackDescriptor.getSubIndex()}",
|
||||
f"{tagKey}={tagValue}"]
|
||||
|
||||
for tagKey, tagValue in changedTrackTags.items():
|
||||
metadataTokens += [f"-metadata:s:{trackDescriptor.getType().indicator()}"
|
||||
+ f":{trackDescriptor.getSubIndex()}",
|
||||
f"{tagKey}={tagValue}"]
|
||||
|
||||
for removeKey in removedTrackTags.keys():
|
||||
metadataTokens += [f"-metadata:s:{trackDescriptor.getType().indicator()}"
|
||||
+ f":{trackDescriptor.getSubIndex()}",
|
||||
f"{removeKey}="]
|
||||
|
||||
return metadataTokens
|
||||
|
||||
|
||||
def getChangeSetObj(self):
|
||||
return self.__changeSetObj
|
Loading…
Reference in New Issue