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