nightly combinator tests rc1

click-textual
Maveno 11 months ago
parent 22f4b00e76
commit 207472283b

@ -1,27 +0,0 @@
import os, sys, importlib, glob, inspect
class DispositionCombination2():
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return self._combinationIdentifier
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[26:-3]
for p
in glob.glob(f"{ basePath }/disposition_combination_2_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.disposition_combination_2_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.disposition_combination_2_{ identifier }"]):
#HINT: Excluding DispositionCombination as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'DispositionCombination2' and name.startswith('DispositionCombination2'):
return obj

@ -1,24 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_2 import DispositionCombination2
class DispositionCombination20(DispositionCombination2):
COMBINATION_IDENTIFIER = 'D00'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination20.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set(), # 0
set()) # 1
def evaluateTrackDescriptors(self, trackDescriptors):
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
def shouldFail(self):
return False

@ -1,28 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_2 import DispositionCombination2
class DispositionCombination21(DispositionCombination2):
COMBINATION_IDENTIFIER = 'D10'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination21.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set([TrackDisposition.DEFAULT]), # 0
set()) # 1
def evaluateTrackDescriptors(self, trackDescriptors):
if self._context['use_jellyfin']:
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition"
else:
assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has not set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
def shouldFail(self):
return False

@ -1,24 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_2 import DispositionCombination2
class DispositionCombination22(DispositionCombination2):
COMBINATION_IDENTIFIER = 'D01'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination22.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set(), # 0
set([TrackDisposition.DEFAULT])) # 1
def evaluateTrackDescriptors(self, trackDescriptors):
assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition"
def shouldFail(self):
return False

@ -1,23 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_2 import DispositionCombination2
class DispositionCombination23(DispositionCombination2):
COMBINATION_IDENTIFIER = 'D11'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination23.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set([TrackDisposition.DEFAULT]), # 0
set([TrackDisposition.DEFAULT])) # 1
def evaluateTrackDescriptors(self, trackDescriptors):
pass
def shouldFail(self):
return True

@ -1,27 +0,0 @@
import os, sys, importlib, glob, inspect
class DispositionCombination3():
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return self._combinationIdentifier
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[26:-3]
for p
in glob.glob(f"{ basePath }/disposition_combination_3_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.disposition_combination_3_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.disposition_combination_3_{ identifier }"]):
#HINT: Excluding DispositionCombination as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'DispositionCombination3' and name.startswith('DispositionCombination3'):
return obj

@ -1,26 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_3 import DispositionCombination3
class DispositionCombination30(DispositionCombination3):
COMBINATION_IDENTIFIER = 'D000'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination30.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set(), # 0
set(), # 1
set()) # 2
def evaluateTrackDescriptors(self, trackDescriptors):
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
assert not trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has set default disposition"
def shouldFail(self):
return False

@ -1,31 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_3 import DispositionCombination3
class DispositionCombination31(DispositionCombination3):
COMBINATION_IDENTIFIER = 'D100'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination31.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set([TrackDisposition.DEFAULT]), # 0
set(), # 1
set()) # 2
def evaluateTrackDescriptors(self, trackDescriptors):
if self._context['use_jellyfin']:
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
assert trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has not set default disposition"
else:
assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has not set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
assert not trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has set default disposition"
def shouldFail(self):
return False

@ -1,31 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_3 import DispositionCombination3
class DispositionCombination32(DispositionCombination3):
COMBINATION_IDENTIFIER = 'D010'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination32.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set(), # 0
set([TrackDisposition.DEFAULT]), # 1
set()) # 2
def evaluateTrackDescriptors(self, trackDescriptors):
if self._context['use_jellyfin']:
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
assert trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has not set default disposition"
else:
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition"
assert not trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has set default disposition"
def shouldFail(self):
return False

@ -1,27 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_3 import DispositionCombination3
class DispositionCombination33(DispositionCombination3):
COMBINATION_IDENTIFIER = 'D001'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination33.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set(), # 0
set(), # 1
set([TrackDisposition.DEFAULT])) # 2
def evaluateTrackDescriptors(self, trackDescriptors):
if self._context['use_jellyfin']:
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
assert trackDescriptors[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #2 has not set default disposition"
def shouldFail(self):
return False

@ -1,24 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .disposition_combination_3 import DispositionCombination3
class DispositionCombination34(DispositionCombination3):
COMBINATION_IDENTIFIER = 'D101'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = DispositionCombination34.COMBINATION_IDENTIFIER
def getDispositionTuple(self):
return (set([TrackDisposition.DEFAULT]), # 0
set(), # 1
set([TrackDisposition.DEFAULT])) # 2
def evaluateTrackDescriptors(self, trackDescriptors):
pass
def shouldFail(self):
return True

@ -18,8 +18,8 @@ class DispositionCombinator22(DispositionCombinator2):
set([TrackDisposition.DEFAULT])) # 1
def assertFunc(self, trackDescriptors):
assert trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 has set default disposition"
assert not trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition"
assert not trackDescriptors[0].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #0 index={trackDescriptors[0].getIndex()} [{trackDescriptors[0].getType().label()}:{trackDescriptors[0].getSubIndex()}] has set default disposition"
assert trackDescriptors[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 index={trackDescriptors[1].getIndex()} [{trackDescriptors[1].getType().label()}:{trackDescriptors[1].getSubIndex()}] has not set default disposition"
def shouldFail(self):
return False

@ -44,7 +44,7 @@ def getTimeString(hours: float = 0.0,
return f"{hours:02d}:{minutes:02d}:{seconds:02d}.{millis:03d}"
def createAssFile(entries: dict):
def createAssFile(entries: dict, directory = None):
# [Script Info]
# ; Script generated by FFmpeg/Lavc61.3.100
@ -63,7 +63,7 @@ def createAssFile(entries: dict):
# Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,yolo
# Dialogue: 0,0:00:03.00,0:00:04.00,Default,,0,0,0,,zolo
# Dialogue: 0,0:00:05.00,0:00:06.00,Default,,0,0,0,,golo
tmpFileName = tempfile.mktemp(suffix=".ass")
tmpFileName = tempfile.mktemp(suffix=".ass", dir = directory)
with open(tmpFileName, 'w') as tmpFile:
@ -87,7 +87,7 @@ def createAssFile(entries: dict):
return tmpFileName
def createSrtFile(entries: dict):
def createSrtFile(entries: dict, directory = None):
# 1
# 00:00:00,000 --> 00:00:02,500
# Welcome to the Example Subtitle File!
@ -100,7 +100,7 @@ def createSrtFile(entries: dict):
# 00:00:07,000 --> 00:00:10,500
# You can use SRT files to add subtitles to your videos.
tmpFileName = tempfile.mktemp(suffix=".srt")
tmpFileName = tempfile.mktemp(suffix=".srt", dir = directory)
with open(tmpFileName, 'w') as tmpFile:
@ -113,13 +113,13 @@ def createSrtFile(entries: dict):
return tmpFileName
def createVttFile(entries: dict):
def createVttFile(entries: dict, directory = None):
# WEBVTT
#
# 01:20:33.050 --> 01:20:35.050
# Yolo
tmpFileName = tempfile.mktemp(suffix=".vtt")
tmpFileName = tempfile.mktemp(suffix=".vtt", dir = directory)
with open(tmpFileName, 'w') as tmpFile:
@ -143,7 +143,8 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor,
sizeX: int = 1280,
sizeY: int = 720,
rate: int = 25,
length: int = 10):
length: int = 10,
logger = None):
# subtitleFilePath = createVttFile(SHORT_SUBTITLE_SEQUENCE)
@ -217,7 +218,7 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor,
# click.echo(f"createMediaTestFile() cache index={cacheIndex} size={len(generatorCache)}")
if cacheIndex == -1:
importTokens = ['-i', createVttFile(SHORT_SUBTITLE_SEQUENCE)]
importTokens = ['-i', createVttFile(SHORT_SUBTITLE_SEQUENCE, directory=directory if directory else None)]
sourceIndex = len(generatorCache) - 1 if cacheIndex == -1 else cacheIndex
mappingTokens += ['-map', f"{sourceIndex}:s:0"]
@ -254,10 +255,18 @@ def createMediaTestFile(mediaDescriptor: MediaDescriptor,
commandTokens += [outputPath]
# click.echo(f"command sequence: {commandTokens}")
if not logger is None:
logger.debug(f"createMediaTestFile(): Command sequence: {commandTokens}")
out, err, rc = executeProcess(commandTokens)
#if rc:
# click.echo(f"Creating testfile failed with {rc}: {err}")
if not logger is None:
if out:
logger.debug(f"createMediaTestFile(): Process output: {out}")
if rc:
logger.debug(f"createMediaTestFile(): Process returned ERROR {rc} ({err})")
return outputPath

@ -0,0 +1,33 @@
import os, sys, importlib, glob, inspect, itertools
class JellyfinCombinator():
IDENTIFIER = 'jellyfin'
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return JellyfinCombinator.IDENTIFIER
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[20:-3]
for p
in glob.glob(f"{ basePath }/jellyfin_combinator_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.jellyfin_combinator_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.jellyfin_combinator_{ identifier }"]):
#HINT: Excluding MediaCombinator as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'JellyfinCombinator' and name.startswith('JellyfinCombinator'):
return obj
@staticmethod
def getAllClassReferences():
return [JellyfinCombinator.getClassReference(i) for i in JellyfinCombinator.list()]

@ -0,0 +1,34 @@
import os, sys, importlib, glob, inspect, itertools
from ffx.track_type import TrackType
from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .jellyfin_combinator import JellyfinCombinator
class JellyfinCombinator0(JellyfinCombinator):
VARIANT = 'j'
# def __init__(self, SubCombinators: dict = {}, context = None):
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
# self._SubCombinators = SubCombinators
def getVariant(self):
return JellyfinCombinator0.VARIANT
def getPayload(self):
return False
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
return False

@ -0,0 +1,34 @@
import os, sys, importlib, glob, inspect, itertools
from ffx.track_type import TrackType
from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .jellyfin_combinator import JellyfinCombinator
class JellyfinCombinator1(JellyfinCombinator):
VARIANT = 'J'
# def __init__(self, SubCombinators: dict = {}, context = None):
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
# self._SubCombinators = SubCombinations
def getVariant(self):
return JellyfinCombinator1.VARIANT
def getPayload(self):
return True
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
return False

@ -10,9 +10,7 @@ class MediaCombinator():
self._reportLogger = context['report_logger']
def getIdentifier(self):
return self._identifier
def getVariant(self):
return self._variant
return MediaCombinator.IDENTIFIER
@staticmethod
def list():

@ -6,6 +6,8 @@ from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator0(MediaCombinator):
@ -20,8 +22,9 @@ class MediaCombinator0(MediaCombinator):
# self._SubCombinators = SubCombinators
self._identifier = MediaCombinator0.IDENTIFIER
self._variant = MediaCombinator0.VARIANT
def getVariant(self):
return MediaCombinator0.VARIANT
def getPayload(self):
@ -45,7 +48,7 @@ class MediaCombinator0(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -53,13 +56,21 @@ class MediaCombinator0(MediaCombinator):
def getYield(self):
yieldObj = {}
for MTC in MediaTagCombinator.getAllClassReferences():
mtc = MTC(self._context)
yieldObj = {}
yieldObj['identifier'] = MediaCombinator0.IDENTIFIER
yieldObj['variants'] = [MediaCombinator0.VARIANT]
yieldObj['payload'] = self.getPayload()
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
mtc.getVariant()]
yieldObj['payload'] = self.getPayload()
yieldObj['assertFuncs'] = [self.assertFunc]
yieldObj['shouldFail'] = self.shouldFail()
yieldObj['assertSelectors'] = ['M', 'MT']
yieldObj['assertFuncs'] = [self.assertFunc,
mtc.assertFunc]
yieldObj['shouldFail'] = (self.shouldFail()
| mtc.shouldFail())
yield yieldObj
yield yieldObj

@ -6,6 +6,9 @@ from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator1(MediaCombinator):
@ -20,8 +23,9 @@ class MediaCombinator1(MediaCombinator):
# self._SubCombinators = SubCombinations
self._identifier = MediaCombinator1.IDENTIFIER
self._variant = MediaCombinator1.VARIANT
def getVariant(self):
return MediaCombinator1.VARIANT
def getPayload(self):
@ -51,7 +55,7 @@ class MediaCombinator1(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -59,13 +63,23 @@ class MediaCombinator1(MediaCombinator):
def getYield(self):
yieldObj = {}
for MTC in MediaTagCombinator.getAllClassReferences():
mtc = MTC(self._context)
yieldObj = {}
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
mtc.getVariant()]
yieldObj['payload'] = self.getPayload()
yieldObj['identifier'] = MediaCombinator1.IDENTIFIER
yieldObj['variants'] = [MediaCombinator1.VARIANT]
yieldObj['assertSelectors'] = ['M', 'MT']
yieldObj['assertFuncs'] = [self.assertFunc,
mtc.assertFunc]
yieldObj['payload'] = self.getPayload()
yieldObj['assertFuncs'] = [self.assertFunc]
yieldObj['shouldFail'] = self.shouldFail()
yieldObj['shouldFail'] = (self.shouldFail()
| mtc.shouldFail())
yield yieldObj
yield yieldObj

@ -1,4 +1,4 @@
import os, sys, importlib, glob, inspect, itertools
import os, sys, importlib, glob, inspect, itertools, click
from ffx.track_type import TrackType
@ -8,6 +8,10 @@ from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .disposition_combinator_2 import DispositionCombinator2
from .track_tag_combinator_2 import TrackTagCombinator2
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator2(MediaCombinator):
@ -22,10 +26,11 @@ class MediaCombinator2(MediaCombinator):
# self._SubCombinators = SubCombinators
self._identifier = MediaCombinator2.IDENTIFIER
self._variant = MediaCombinator2.VARIANT
def getVariant(self):
return MediaCombinator2.VARIANT
def getPayload(self, subtitleDispositionTuple = (set(), set())):
def getPayload(self, subtitleDispositionTuple = (set(), set()), subtitleTagTuple = ({}, {})):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
@ -41,12 +46,14 @@ class MediaCombinator2(MediaCombinator):
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[0]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[0]
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[1]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[1]
trackDescriptor3 = TrackDescriptor(**kwargs)
kwargs = {}
@ -61,7 +68,7 @@ class MediaCombinator2(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -69,17 +76,40 @@ class MediaCombinator2(MediaCombinator):
def getYield(self):
for DC2 in DispositionCombinator2.getAllClassReferences():
for MTC in MediaTagCombinator.getAllClassReferences():
for DC2 in DispositionCombinator2.getAllClassReferences():
for TC2 in TrackTagCombinator2.getAllClassReferences():
for J in JellyfinCombinator.getAllClassReferences():
j = J(self._context)
self._context['use_jellyfin'] = j.getPayload()
dc2 = DC2(self._context)
tc2 = TC2(self._context)
mtc = MTC(self._context)
yieldObj = {}
dc2 = DC2(self._context)
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
f"S:{dc2.getVariant()}",
f"S:{tc2.getVariant()}",
mtc.getVariant(),
j.getVariant()]
yieldObj = {}
yieldObj['payload'] = self.getPayload(dc2.getPayload(), tc2.getPayload())
yieldObj['identifier'] = MediaCombinator2.IDENTIFIER
yieldObj['variants'] = [MediaCombinator2.VARIANT, f"S:{dc2.getVariant()}"]
yieldObj['assertSelectors'] = ['M', 'SD', 'ST', 'MT', 'J']
yieldObj['assertFuncs'] = [self.assertFunc,
dc2.assertFunc,
tc2.assertFunc,
mtc.assertFunc,
j.assertFunc]
yieldObj['payload'] = self.getPayload(dc2.getPayload())
yieldObj['assertFuncs'] = [self.assertFunc, dc2.assertFunc]
yieldObj['shouldFail'] = self.shouldFail() | dc2.shouldFail()
yieldObj['shouldFail'] = (self.shouldFail()
| dc2.shouldFail()
| tc2.shouldFail()
| mtc.shouldFail()
| j.shouldFail())
yield yieldObj
yield yieldObj

@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .disposition_combinator_3 import DispositionCombinator3
from .track_tag_combinator_3 import TrackTagCombinator3
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator3(MediaCombinator):
@ -23,11 +26,11 @@ class MediaCombinator3(MediaCombinator):
# self._SubCombinators = SubCombinations
self._identifier = MediaCombinator3.IDENTIFIER
self._variant = MediaCombinator3.VARIANT
def getVariant(self):
return MediaCombinator3.VARIANT
def getPayload(self, subtitleDispositionTuple = (set(), set(), set())):
def getPayload(self, subtitleDispositionTuple = (set(), set(), set()), subtitleTagTuple = ({}, {}, {})):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
@ -43,18 +46,21 @@ class MediaCombinator3(MediaCombinator):
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[0]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[0]
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[1]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[1]
trackDescriptor3 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[2]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[2]
trackDescriptor4 = TrackDescriptor(**kwargs)
kwargs = {}
@ -71,7 +77,7 @@ class MediaCombinator3(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -79,17 +85,40 @@ class MediaCombinator3(MediaCombinator):
def getYield(self):
for DC3 in DispositionCombinator3.getAllClassReferences():
for MTC in MediaTagCombinator.getAllClassReferences():
for DC3 in DispositionCombinator3.getAllClassReferences():
for TC3 in TrackTagCombinator3.getAllClassReferences():
for J in JellyfinCombinator.getAllClassReferences():
dc3 = DC3(self._context)
j = J(self._context)
self._context['use_jellyfin'] = j.getPayload()
yieldObj = {}
dc3 = DC3(self._context)
tc3 = TC3(self._context)
mtc = MTC(self._context)
yieldObj['identifier'] = MediaCombinator3.IDENTIFIER
yieldObj['variants'] = [MediaCombinator3.VARIANT, f"S:{dc3.getVariant()}"]
yieldObj = {}
yieldObj['payload'] = self.getPayload(dc3.getPayload())
yieldObj['assertFuncs'] = [self.assertFunc, dc3.assertFunc]
yieldObj['shouldFail'] = self.shouldFail() | dc3.shouldFail()
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
f"S:{dc3.getVariant()}",
f"S:{tc3.getVariant()}",
mtc.getVariant(),
j.getVariant()]
yield yieldObj
yieldObj['payload'] = self.getPayload(dc3.getPayload(), tc3.getPayload())
yieldObj['assertSelectors'] = ['M', 'SD', 'ST', 'MT', 'J']
yieldObj['assertFuncs'] = [self.assertFunc,
dc3.assertFunc,
tc3.assertFunc,
mtc.assertFunc,
j.assertFunc]
yieldObj['shouldFail'] = (self.shouldFail()
| dc3.shouldFail()
| tc3.shouldFail()
| mtc.shouldFail()
| j.shouldFail())
yield yieldObj

@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .disposition_combinator_2 import DispositionCombinator2
from .track_tag_combinator_2 import TrackTagCombinator2
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator4(MediaCombinator):
@ -23,10 +26,11 @@ class MediaCombinator4(MediaCombinator):
# self._SubCombinators = SubCombinations
self._identifier = MediaCombinator4.IDENTIFIER
self._variant = MediaCombinator4.VARIANT
def getVariant(self):
return MediaCombinator4.VARIANT
def getPayload(self, audioDispositionTuple = (set(), set())):
def getPayload(self, audioDispositionTuple = (set(), set()), audioTagTuple = ({}, {})):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
@ -37,12 +41,14 @@ class MediaCombinator4(MediaCombinator):
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[0]
kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[0]
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[1]
kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[1]
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
@ -57,7 +63,7 @@ class MediaCombinator4(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -65,17 +71,40 @@ class MediaCombinator4(MediaCombinator):
def getYield(self):
for DC2 in DispositionCombinator2.getAllClassReferences():
for MTC in MediaTagCombinator.getAllClassReferences():
for DC2 in DispositionCombinator2.getAllClassReferences():
for TC2 in TrackTagCombinator2.getAllClassReferences():
for J in JellyfinCombinator.getAllClassReferences():
j = J(self._context)
self._context['use_jellyfin'] = j.getPayload()
dc2 = DC2(self._context)
tc2 = TC2(self._context)
mtc = MTC(self._context)
yieldObj = {}
dc2 = DC2(self._context)
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
f"A:{dc2.getVariant()}",
f"A:{tc2.getVariant()}",
mtc.getVariant(),
j.getVariant()]
yieldObj = {}
yieldObj['payload'] = self.getPayload(dc2.getPayload(), tc2.getPayload())
yieldObj['identifier'] = MediaCombinator4.IDENTIFIER
yieldObj['variants'] = [MediaCombinator4.VARIANT, f"A:{dc2.getVariant()}"]
yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'MT', 'J']
yieldObj['assertFuncs'] = [self.assertFunc,
dc2.assertFunc,
tc2.assertFunc,
mtc.assertFunc,
j.assertFunc]
yieldObj['payload'] = self.getPayload(dc2.getPayload())
yieldObj['assertFuncs'] = [self.assertFunc, dc2.assertFunc]
yieldObj['shouldFail'] = self.shouldFail() | dc2.shouldFail()
yieldObj['shouldFail'] = (self.shouldFail()
| dc2.shouldFail()
| tc2.shouldFail()
| mtc.shouldFail()
| j.shouldFail())
yield yieldObj
yield yieldObj

@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .disposition_combinator_2 import DispositionCombinator2
from .track_tag_combinator_2 import TrackTagCombinator2
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator5(MediaCombinator):
@ -23,10 +26,11 @@ class MediaCombinator5(MediaCombinator):
# self._SubCombinators = SubCombinations
self._identifier = MediaCombinator5.IDENTIFIER
self._variant = MediaCombinator5.VARIANT
def getVariant(self):
return MediaCombinator5.VARIANT
def getPayload(self, audioDispositionTuple = (set(), set())):
def getPayload(self, audioDispositionTuple = (set(), set()), audioTagTuple = ({}, {})):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
@ -37,12 +41,14 @@ class MediaCombinator5(MediaCombinator):
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[0]
kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[0]
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[1]
kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[1]
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
@ -64,7 +70,7 @@ class MediaCombinator5(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -72,17 +78,40 @@ class MediaCombinator5(MediaCombinator):
def getYield(self):
for DC2 in DispositionCombinator2.getAllClassReferences():
for MTC in MediaTagCombinator.getAllClassReferences():
for DC2 in DispositionCombinator2.getAllClassReferences():
for TC2 in TrackTagCombinator2.getAllClassReferences():
for J in JellyfinCombinator.getAllClassReferences():
j = J(self._context)
self._context['use_jellyfin'] = j.getPayload()
dc2 = DC2(self._context)
tc2 = TC2(self._context)
mtc = MTC(self._context)
yieldObj = {}
dc2 = DC2(self._context)
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
f"A:{dc2.getVariant()}",
f"A:{tc2.getVariant()}",
mtc.getVariant(),
j.getVariant()]
yieldObj = {}
yieldObj['payload'] = self.getPayload(dc2.getPayload(), tc2.getPayload())
yieldObj['identifier'] = MediaCombinator5.IDENTIFIER
yieldObj['variants'] = [MediaCombinator5.VARIANT, f"A:{dc2.getVariant()}"]
yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'MT', 'J']
yieldObj['assertFuncs'] = [self.assertFunc,
dc2.assertFunc,
tc2.assertFunc,
mtc.assertFunc,
j.assertFunc]
yieldObj['payload'] = self.getPayload(dc2.getPayload())
yieldObj['assertFuncs'] = [self.assertFunc, dc2.assertFunc]
yieldObj['shouldFail'] = self.shouldFail() | dc2.shouldFail()
yieldObj['shouldFail'] = (self.shouldFail()
| dc2.shouldFail()
| tc2.shouldFail()
| mtc.shouldFail()
| j.shouldFail())
yield yieldObj
yield yieldObj

@ -8,6 +8,9 @@ from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .disposition_combinator_2 import DispositionCombinator2
from .track_tag_combinator_2 import TrackTagCombinator2
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator6(MediaCombinator):
@ -23,10 +26,11 @@ class MediaCombinator6(MediaCombinator):
# self._SubCombinators = SubCombinations
self._identifier = MediaCombinator6.IDENTIFIER
self._variant = MediaCombinator6.VARIANT
def getVariant(self):
return MediaCombinator6.VARIANT
def getPayload(self, audioDispositionTuple = (set(), set()), subtitleDispositionTuple = (set(), set())):
def getPayload(self, audioDispositionTuple = (set(), set()), audioTagTuple = ({}, {}), subtitleDispositionTuple = (set(), set()), subtitleTagTuple = ({}, {})):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
@ -37,24 +41,28 @@ class MediaCombinator6(MediaCombinator):
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[0]
kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[0]
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioDispositionTuple[1]
kwargs[TrackDescriptor.TAGS_KEY] = audioTagTuple[1]
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[0]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[0]
trackDescriptor3 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleDispositionTuple[1]
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTagTuple[1]
trackDescriptor4 = TrackDescriptor(**kwargs)
kwargs = {}
@ -71,7 +79,7 @@ class MediaCombinator6(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -79,19 +87,50 @@ class MediaCombinator6(MediaCombinator):
def getYield(self):
for DC2_A in DispositionCombinator2.getAllClassReferences():
for DC2_S in DispositionCombinator2.getAllClassReferences():
dc2a = DC2_A(self._context)
dc2s = DC2_S(self._context)
yieldObj = {}
yieldObj['identifier'] = MediaCombinator6.IDENTIFIER
yieldObj['variants'] = [MediaCombinator6.VARIANT, f"A:{dc2a.getVariant()}", f"S:{dc2s.getVariant()}"]
yieldObj['payload'] = self.getPayload(dc2a.getPayload(), dc2s.getPayload())
yieldObj['assertFuncs'] = [self.assertFunc, dc2a.assertFunc, dc2s.assertFunc]
yieldObj['shouldFail'] = self.shouldFail() | dc2a.shouldFail() | dc2s.shouldFail()
yield yieldObj
for MTC in MediaTagCombinator.getAllClassReferences():
for DC2_A in DispositionCombinator2.getAllClassReferences():
for TC2_A in TrackTagCombinator2.getAllClassReferences():
for DC2_S in DispositionCombinator2.getAllClassReferences():
for TC2_S in TrackTagCombinator2.getAllClassReferences():
for J in JellyfinCombinator.getAllClassReferences():
j = J(self._context)
self._context['use_jellyfin'] = j.getPayload()
dc2a = DC2_A(self._context)
tc2a = TC2_A(self._context)
dc2s = DC2_S(self._context)
tc2s = TC2_S(self._context)
mtc = MTC(self._context)
yieldObj = {}
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
f"A:{dc2a.getVariant()}",
f"A:{tc2a.getVariant()}",
f"S:{dc2s.getVariant()}",
f"S:{tc2s.getVariant()}",
mtc.getVariant(),
j.getVariant()]
yieldObj['payload'] = self.getPayload(dc2a.getPayload(), tc2a.getPayload(), dc2s.getPayload(), tc2s.getPayload())
yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'SD', 'ST', 'MT', 'J']
yieldObj['assertFuncs'] = [self.assertFunc,
dc2a.assertFunc,
tc2a.assertFunc,
dc2s.assertFunc,
tc2s.assertFunc,
mtc.assertFunc,
j.assertFunc]
yieldObj['shouldFail'] = (self.shouldFail()
| dc2a.shouldFail()
| tc2a.shouldFail()
| dc2s.shouldFail()
| tc2s.shouldFail()
| mtc.shouldFail()
| j.shouldFail())
yield yieldObj

@ -8,8 +8,9 @@ from ffx.media_descriptor import MediaDescriptor
from .media_combinator import MediaCombinator
from .disposition_combinator_2 import DispositionCombinator2
from .disposition_combinator_3 import DispositionCombinator3
from .track_tag_combinator_3 import TrackTagCombinator3
from .jellyfin_combinator import JellyfinCombinator
from .media_tag_combinator import MediaTagCombinator
class MediaCombinator7(MediaCombinator):
@ -24,8 +25,9 @@ class MediaCombinator7(MediaCombinator):
# self._SubCombinators = SubCombinations
self._identifier = MediaCombinator7.IDENTIFIER
self._variant = MediaCombinator7.VARIANT
def getVariant(self):
return MediaCombinator7.VARIANT
def getPayload(self, audioDispositionTuple = (set(), set()), subtitleDispositionTuple = (set(), set(), set())):
@ -79,7 +81,7 @@ class MediaCombinator7(MediaCombinator):
return mediaDescriptor
def assertFunc(self, testObj):
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
@ -87,21 +89,51 @@ class MediaCombinator7(MediaCombinator):
def getYield(self):
for DC2_A in DispositionCombinator2.getAllClassReferences():
for DC3_S in DispositionCombinator3.getAllClassReferences():
dc2a = DC2_A(self._context)
dc3s = DC3_S(self._context)
yieldObj = {}
yieldObj['identifier'] = MediaCombinator7.IDENTIFIER
yieldObj['variants'] = [MediaCombinator7.VARIANT, f"A:{dc2a.getVariant()}", f"S:{dc3s.getVariant()}"]
yieldObj['payload'] = self.getPayload(dc2a.getPayload(), dc3s.getPayload())
yieldObj['assertFuncs'] = [self.assertFunc, dc2a.assertFunc, dc3s.assertFunc]
yieldObj['shouldFail'] = self.shouldFail() | dc2a.shouldFail() | dc3s.shouldFail()
yield yieldObj
for MTC in MediaTagCombinator.getAllClassReferences():
for DC2_A in DispositionCombinator2.getAllClassReferences():
for TC3_A in TrackTagCombinator3.getAllClassReferences():
for DC2_S in DispositionCombinator2.getAllClassReferences():
for TC3_S in TrackTagCombinator3.getAllClassReferences():
for J in JellyfinCombinator.getAllClassReferences():
j = J(self._context)
self._context['use_jellyfin'] = j.getPayload()
dc2a = DC2_A(self._context)
tc3a = TC3_A(self._context)
dc2s = DC2_S(self._context)
tc3s = TC3_S(self._context)
mtc = MTC(self._context)
yieldObj = {}
yieldObj['identifier'] = self.getIdentifier()
yieldObj['variants'] = [self.getVariant(),
f"A:{dc2a.getVariant()}",
f"A:{tc3a.getVariant()}",
f"S:{dc2s.getVariant()}",
f"S:{tc3s.getVariant()}",
mtc.getVariant(),
j.getVariant()]
yieldObj['payload'] = self.getPayload(dc2a.getPayload(), tc3a.getPayload(), dc2s.getPayload(), tc3s.getPayload())
yieldObj['assertSelectors'] = ['M', 'AD', 'AT', 'SD', 'ST', 'MT', 'J']
yieldObj['assertFuncs'] = [self.assertFunc,
dc2a.assertFunc,
tc3a.assertFunc,
dc2s.assertFunc,
tc3s.assertFunc,
mtc.assertFunc,
j.assertFunc]
yieldObj['shouldFail'] = (self.shouldFail()
| dc2a.shouldFail()
| tc3a.shouldFail()
| dc2s.shouldFail()
| tc3s.shouldFail()
| mtc.shouldFail()
| j.shouldFail())
yield yieldObj

@ -0,0 +1,33 @@
import os, sys, importlib, glob, inspect, itertools
class MediaTagCombinator():
IDENTIFIER = 'mediaTag'
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return MediaTagCombinator.IDENTIFIER
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[21:-3]
for p
in glob.glob(f"{ basePath }/media_tag_combinator_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.media_tag_combinator_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.media_tag_combinator_{ identifier }"]):
#HINT: Excluding MediaCombinator as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'MediaTagCombinator' and name.startswith('MediaTagCombinator'):
return obj
@staticmethod
def getAllClassReferences():
return [MediaTagCombinator.getClassReference(i) for i in MediaTagCombinator.list()]

@ -0,0 +1,31 @@
import os, sys, importlib, glob, inspect, itertools
from ffx.track_type import TrackType
from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .media_tag_combinator import MediaTagCombinator
class MediaTagCombinator0(MediaTagCombinator):
VARIANT = 'MT0'
# def __init__(self, SubCombinators: dict = {}, context = None):
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getVariant(self):
return MediaTagCombinator0.VARIANT
def getPayload(self):
return {}
def assertFunc(self, testObj = {}):
pass
def shouldFail(self):
return False

@ -0,0 +1,36 @@
import os, sys, importlib, glob, inspect, itertools
from ffx.track_type import TrackType
from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .media_tag_combinator import MediaTagCombinator
class MediaTagCombinator1(MediaTagCombinator):
VARIANT = 'MT1'
# def __init__(self, SubCombinators: dict = {}, context = None):
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
# self._SubCombinators = SubCombinations
def getVariant(self):
return MediaTagCombinator1.VARIANT
def getPayload(self):
return {'From': 'Encoders'}
def assertFunc(self, mediaDescriptor: MediaDescriptor):
mediaTags = mediaDescriptor.getTags()
assert 'From' in mediaTags.keys(), "'From' not in media tag keys"
assert mediaTags.keys()['From'] == 'Encoders', "Media tag value not 'Encoders' for key 'To'"
def shouldFail(self):
return False

@ -0,0 +1,39 @@
import os, sys, importlib, glob, inspect, itertools
from ffx.track_type import TrackType
from ffx.track_descriptor import TrackDescriptor
from ffx.media_descriptor import MediaDescriptor
from .media_tag_combinator import MediaTagCombinator
class MediaTagCombinator2(MediaTagCombinator):
VARIANT = 'MT2'
# def __init__(self, SubCombinators: dict = {}, context = None):
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
# self._SubCombinators = SubCombinations
def getVariant(self):
return MediaTagCombinator2.VARIANT
def getPayload(self):
return {'To': 'Fanz',
'Yolo': 'Holo'}
def assertFunc(self, mediaDescriptor: MediaDescriptor):
mediaTags = mediaDescriptor.getTags()
assert 'To' in mediaTags.keys(), "'To' not in media tag keys"
assert mediaTags.keys()['To'] == 'Fanz', "Media tag value not 'Fanz' for key 'To'"
assert 'Yolo' in mediaTags.keys(), "'Yolo' not in media tag keys"
assert mediaTags.keys()['Yolo'] == 'Holo', "Media tag value not 'Holo' for key 'Yolo'"
def shouldFail(self):
return False

@ -1,4 +1,4 @@
import os, sys, importlib, glob, inspect
import os, glob, sys, importlib, glob, inspect
from ffx.test.helper import createEmptyDirectory
@ -96,6 +96,13 @@ class Scenario():
self._logger = context['logger']
self._reportLogger = context['report_logger']
def clearTestDirectory(self):
testFiles = glob.glob("f{self._testDirectory}/*")
for f in testFiles:
os.remove(f)
@staticmethod
def list():
basePath = os.path.dirname(__file__)

@ -22,80 +22,123 @@ class Scenario1(Scenario):
No tmdb, default parameters"""
def __init__(self, context):
context['use_jellyfin'] = True
context['use_tmdb'] = False
context['use_pattern'] = False
#context['no_prompt'] = False
super().__init__(context)
def job(self, yieldObj: dict):
testContext = self._context.copy()
identifier = yieldObj['identifier']
variantList = yieldObj['variants']
variantIdentifier = '-'.join(variantList)
mediaDescriptor = yieldObj['payload']
variantLabel = f"{self.__class__.__name__} Variant {variantIdentifier}"
sourceMediaDescriptor = yieldObj['payload']
assertSelectorList: list = yieldObj['assertSelectors']
assertFuncList = yieldObj['assertFuncs']
shouldFail = yieldObj['shouldFail']
self._logger.info(f"Running Scenario 1 Job {variantIdentifier}")
try:
jellyfinSelectorIndex = assertSelectorList.index('J')
jellyfinVariant = variantList[jellyfinSelectorIndex]
testContext['use_jellyfin'] = jellyfinVariant == 'J'
except ValueError:
jellyfinSelectorIndex = -1
# if variantIdentifier != 'VAASS-A:D01-S:D00':
# return
self._logger.debug(f"Running Job: {variantLabel}")
# Phase 1: Setup source files
self.clearTestDirectory()
mediaFilePath = createMediaTestFile(mediaDescriptor=sourceMediaDescriptor, directory=self._testDirectory, logger=self._logger)
# # Phase 1: Setup source files
# mediaFilePath = createMediaTestFile(mediaDescriptor=sourceMediaDescriptor, directory=self._testDirectory)
#
# # Phase 2: Prepare database
#
# # Phase 3: Run ffx
# commandSequence = [sys.executable,
# self._ffxExecutablePath,
# 'convert',
# mediaFilePath]
#
# self._logger.debug(f"Scenario1.run(): test sequence: {commandSequence}")
#
# out, err, rc = executeProcess(commandSequence, directory = self._testDirectory)
#
# if out:
# self._logger.debug(f"Scenario1.run(): process output: {out}")
# if rc:
# self._logger.error(f"Scenario1.run(): process resultet in error {rc}: {err}")
#
# # Phase 4: Evaluate results
#
# try:
#
# resultFile = os.path.join(self._testDirectory, 'media.webm')
#
# assert os.path.isfile(resultFile), f"Result file 'media.webm' in path '{self._testDirectory}' wasn't created"
#
# resultFileProperties = FileProperties(self._context, resultFile)
# resultMediaDescriptor = resultFileProperties.getMediaDescriptor()
#
# resultMediaTracks = resultMediaDescriptor.getAllTrackDescriptors()
#
# assert len(resultMediaTracks) == 3, f"Result file contains unexpected number of streams"
#
# assert resultMediaTracks[0].getType() == TrackType.VIDEO, f"Stream #0 is not of type video"
#
# assert resultMediaTracks[1].getType() == TrackType.AUDIO, f"Stream #1 is not of type audio"
# assert not resultMediaTracks[1].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has set default disposition"
#
# assert resultMediaTracks[2].getType() == TrackType.AUDIO, f"Stream #2 is not of type audio"
# assert resultMediaTracks[2].getDispositionFlag(TrackDisposition.DEFAULT), f"Stream #1 has not set default disposition"
#
# self._reportLogger.info('Scenario 1 test passed')
#
# except AssertionError as ae:
#
# self._reportLogger.error(f"Scenario 1 test failed ({ae})")
# Phase 3: Run ffx
commandSequence = [sys.executable,
self._ffxExecutablePath,
'convert',
mediaFilePath,
'--no-prompt']
if not testContext['use_jellyfin']:
commandSequence += ['--no-jellyfin']
def run(self):
self._logger.debug(f"{variantLabel}: Test sequence: {commandSequence}")
MC_list = MediaCombinator.getAllClassReferences()
out, err, rc = executeProcess(commandSequence, directory = self._testDirectory)
for MC in MC_list:
if out:
self._logger.debug(f"{variantLabel}: Process output: {out}")
if rc:
self._logger.debug(f"{variantLabel}: Process returned ERROR {rc} ({err})")
self._logger.debug(f"MC={MC.__name__}")
# Phase 4: Evaluate results
mc = MC(context = self._context)
try:
jobFailed = bool(rc)
self._logger.debug(f"{variantLabel}: Should fail: {shouldFail} / actually failed: {jobFailed}")
assert jobFailed == shouldFail, f"Process {'failed' if jobFailed else 'did not fail'}"
if not jobFailed:
resultFile = os.path.join(self._testDirectory, 'media.webm')
assert os.path.isfile(resultFile), f"Result file 'media.webm' in path '{self._testDirectory}' wasn't created"
resultFileProperties = FileProperties(testContext, resultFile)
resultMediaDescriptor = resultFileProperties.getMediaDescriptor()
resultMediaTracks = resultMediaDescriptor.getAllTrackDescriptors()
for assertIndex in range(len(assertSelectorList)):
assertSelector = assertSelectorList[assertIndex]
assertFunc = assertFuncList[assertIndex]
assertVariant = variantList[assertIndex]
if assertSelector == 'M':
assertFunc()
for variantIndex in range(len(assertVariant)):
assert assertVariant[variantIndex].lower() == resultMediaTracks[variantIndex].getType().indicator(), f"Stream #{variantIndex} is not of type {resultMediaTracks[variantIndex].getType().label()}"
elif assertSelector == 'AD' or assertSelector == 'AT':
assertFunc(resultMediaDescriptor.getAudioTracks())
elif assertSelector == 'SD' or assertSelector == 'ST':
assertFunc(resultMediaDescriptor.getSubtitleTracks())
elif type(assertSelector) is str:
if assertSelector == 'J':
assertFunc()
self._reportLogger.info(f"{variantLabel}: Test passed")
except AssertionError as ae:
self._reportLogger.error(f"{variantLabel}: Test FAILED ({ae})")
def run(self):
MC_list = MediaCombinator.getAllClassReferences()
for MC in MC_list:
self._logger.debug(f"MC={MC.__name__}")
mc = MC(context = self._context)
for y in mc.getYield():
self.job(y)

@ -1,27 +0,0 @@
import os, sys, importlib, glob, inspect
class TrackCombination():
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return self._combinationIdentifier
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[18:-3]
for p
in glob.glob(f"{ basePath }/track_combination_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.track_combination_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.track_combination_{ identifier }"]):
#HINT: Excluding DispositionCombination as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'TrackCombination' and name.startswith('TrackCombination'):
return obj

@ -1,36 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination0(TrackCombination):
COMBINATION_IDENTIFIER = 'VA'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination0.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1]
def getSubcombinations(self):
return

@ -1,42 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination1(TrackCombination):
COMBINATION_IDENTIFIER = 'VAS'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination1.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor2 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2]
def getSubcombinations(self):
return

@ -1,48 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination1(TrackCombination):
COMBINATION_IDENTIFIER = 'VASS'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination1.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor3 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2,
trackDescriptor3]
def getSubcombinations(self):
return

@ -1,65 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
from .disposition_combination_3 import DispositionCombination3
class TrackCombination3(TrackCombination):
COMBINATION_IDENTIFIER = 'VASSS'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination3.COMBINATION_IDENTIFIER
def getTrackDescriptors(self, dispositionTuple):
self._logger.debug(f"getTrackDescriptors(): dispositionTuple={dispositionTuple}")
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = dispositionTuple[0]
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = dispositionTuple[1]
trackDescriptor3 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = dispositionTuple[2]
trackDescriptor4 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2,
trackDescriptor3,
trackDescriptor4]
def getSubcombinations(self):
for dci in DispositionCombination3.list():
dispositionCombination = DispositionCombination3.getClassReference(dci)(self._context)
dispositionTuple = dispositionCombination.getDispositionTuple() # tuple of set of dispositions
trackDescriptors = self.getTrackDescriptors(dispositionTuple)
evaluateFunc = dispositionCombination.evaluateTrackDescriptors # assert function
shouldFail = dispositionCombination.shouldFail() # true if this combination should fail
dispositionIdentifier = dispositionCombination.getIdentifier()
yield (trackDescriptors, evaluateFunc, shouldFail, dispositionIdentifier)

@ -1,42 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination4(TrackCombination):
COMBINATION_IDENTIFIER = 'VAA'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination4.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
trackDescriptor2 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2]
def getSubcombinations(self):
return

@ -1,48 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination5(TrackCombination):
COMBINATION_IDENTIFIER = 'VAAS'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination5.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor3 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2,
trackDescriptor3]
def getSubcombinations(self):
return

@ -1,54 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination6(TrackCombination):
COMBINATION_IDENTIFIER = 'VAASS'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination6.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor3 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor4 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2,
trackDescriptor3,
trackDescriptor4]
def getSubcombinations(self):
return

@ -1,62 +0,0 @@
import os, sys, importlib, glob, inspect
from ffx.track_descriptor import TrackDescriptor
from ffx.track_disposition import TrackDisposition
from ffx.track_type import TrackType
from .track_combination import TrackCombination
class TrackCombination7(TrackCombination):
"""VAASSS"""
COMBINATION_IDENTIFIER = 'VAASSS'
def __init__(self, context):
super().__init__(context)
self._combinationIdentifier = TrackCombination7.COMBINATION_IDENTIFIER
def getTrackVector(self):
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.VIDEO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor0 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor1 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
# kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = set([TrackDisposition.DEFAULT])
trackDescriptor2 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor3 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor4 = TrackDescriptor(**kwargs)
kwargs = {}
kwargs[TrackDescriptor.CONTEXT_KEY] = self._context
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
trackDescriptor5 = TrackDescriptor(**kwargs)
return [trackDescriptor0,
trackDescriptor1,
trackDescriptor2,
trackDescriptor3,
trackDescriptor4,
trackDescriptor5]
def getSubcombinations(self):
return

@ -0,0 +1,33 @@
import os, sys, importlib, glob, inspect, itertools
class TrackTagCombinator2():
IDENTIFIER = 'trackTag2'
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return TrackTagCombinator2.IDENTIFIER
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[23:-3]
for p
in glob.glob(f"{ basePath }/track_tag_combinator_2_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.track_tag_combinator_2_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.track_tag_combinator_2_{ identifier }"]):
#HINT: Excluding DispositionCombination as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'TrackTagCombinator2' and name.startswith('TrackTagCombinator2'):
return obj
@staticmethod
def getAllClassReferences():
return [TrackTagCombinator2.getClassReference(i) for i in TrackTagCombinator2.list()]

@ -0,0 +1,32 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_2 import TrackTagCombinator2
class TrackTagCombinator20(TrackTagCombinator2):
VARIANT = 'T00'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator20.VARIANT
def getPayload(self):
return ({}, # 0
{}) # 1
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
def shouldFail(self):
return False

@ -0,0 +1,34 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_2 import TrackTagCombinator2
class TrackTagCombinator21(TrackTagCombinator2):
VARIANT = 'T10'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator21.VARIANT
def getPayload(self):
return ({'language': 'fra', 'title': 'Französisch'}, # 0
{}) # 1
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[0].getTags()['language'] == 'fra', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'fra'"
assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[0].getTags()['title'] == 'Französisch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Französisch'"
assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
def shouldFail(self):
return False

@ -0,0 +1,35 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_2 import TrackTagCombinator2
class TrackTagCombinator21(TrackTagCombinator2):
VARIANT = 'T01'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator21.VARIANT
def getPayload(self):
return ({}, # 0
{'language': 'bas', 'title': 'Baskisch'}) # 1
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[1].getTags()['language'] == 'bas', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'bas'"
assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[1].getTags()['title'] == 'Baskisch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Baskisch'"
def shouldFail(self):
return False

@ -0,0 +1,37 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_2 import TrackTagCombinator2
class TrackTagCombinator23(TrackTagCombinator2):
VARIANT = 'T11'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator23.VARIANT
def getPayload(self):
return ({'language': 'deu', 'title': 'Deutsch'}, # 0
{'language': 'jpn', 'title': 'Japanisch'}) # 1
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[0].getTags()['language'] == 'deu', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'deu'"
assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[0].getTags()['title'] == 'Deutsch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Deutsch'"
assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[1].getTags()['language'] == 'jpn', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'jpn'"
assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[1].getTags()['title'] == 'Japanisch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Japanisch'"
def shouldFail(self):
return True

@ -0,0 +1,33 @@
import os, sys, importlib, glob, inspect, itertools
class TrackTagCombinator3():
IDENTIFIER = 'trackTag3'
def __init__(self, context = None):
self._context = context
self._logger = context['logger']
self._reportLogger = context['report_logger']
def getIdentifier(self):
return TrackTagCombinator3.IDENTIFIER
@staticmethod
def list():
basePath = os.path.dirname(__file__)
return [os.path.basename(p)[23:-3]
for p
in glob.glob(f"{ basePath }/track_tag_combinator_3_*.py", recursive = True)
if p != __file__]
@staticmethod
def getClassReference(identifier):
importlib.import_module(f"ffx.test.track_tag_combinator_3_{ identifier }")
for name, obj in inspect.getmembers(sys.modules[f"ffx.test.track_tag_combinator_3_{ identifier }"]):
#HINT: Excluding DispositionCombination as it seems to be included by import (?)
if inspect.isclass(obj) and name != 'TrackTagCombinator3' and name.startswith('TrackTagCombinator3'):
return obj
@staticmethod
def getAllClassReferences():
return [TrackTagCombinator3.getClassReference(i) for i in TrackTagCombinator3.list()]

@ -0,0 +1,36 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_3 import TrackTagCombinator3
class TrackTagCombinator30(TrackTagCombinator3):
VARIANT = 'T000'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator30.VARIANT
def getPayload(self):
return ({}, # 0
{}, # 1
{}) # 2
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set title tag"
assert not 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set title tag"
def shouldFail(self):
return False

@ -0,0 +1,38 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_3 import TrackTagCombinator3
class TrackTagCombinator31(TrackTagCombinator3):
VARIANT = 'T100'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator31.VARIANT
def getPayload(self):
return ({'language': 'fra', 'title': 'Französisch'}, # 0
{}, # 1
{}) # 2
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[0].getTags()['language'] == 'fra', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'fra'"
assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[0].getTags()['title'] == 'Französisch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Französisch'"
assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set title tag"
assert not 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set title tag"
def shouldFail(self):
return False

@ -0,0 +1,39 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_3 import TrackTagCombinator3
class TrackTagCombinator32(TrackTagCombinator3):
VARIANT = 'T010'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator32.VARIANT
def getPayload(self):
return ({}, # 0
{'language': 'bas', 'title': 'Baskisch'}, # 1
{}) # 2
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[1].getTags()['language'] == 'bas', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'bas'"
assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[1].getTags()['title'] == 'Baskisch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Baskisch'"
assert not 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[2].getSubIndex()}] has set title tag"
def shouldFail(self):
return False

@ -0,0 +1,38 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_3 import TrackTagCombinator3
class TrackTagCombinator33(TrackTagCombinator3):
VARIANT = 'T001'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator33.VARIANT
def getPayload(self):
return ({}, # 0
{}, # 1
{'language': 'eng', 'title': 'English'}) # 2
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert not 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has set title tag"
assert not 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set language tag"
assert not 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[1].getSubIndex()}] has set title tag"
assert 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[2].getTags()['language'] == 'eng', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'eng'"
assert 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[2].getTags()['title'] == 'English', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'English'"
def shouldFail(self):
return False

@ -0,0 +1,42 @@
import os, sys, importlib, glob, inspect
from ffx.track_disposition import TrackDisposition
from .track_tag_combinator_3 import TrackTagCombinator3
class TrackTagCombinator34(TrackTagCombinator3):
VARIANT = 'T111'
def __init__(self, context):
super().__init__(context)
def getVariant(self):
return TrackTagCombinator34.VARIANT
def getPayload(self):
return ({'language': 'jpn', 'title': 'Japanisch'}, # 0
{'language': 'deu', 'title': 'Deutsch'}, # 1
{'language': 'eng', 'title': 'English'}) # 2
def assertFunc(self, trackDescriptors):
resortedTrackDescriptors = sorted(trackDescriptors, key=lambda d: d.getSourceIndex())
assert 'language' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[0].getTags()['language'] == 'jpn', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'jpn'"
assert 'title' in resortedTrackDescriptors[0].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[0].getTags()['title'] == 'Japanisch', f"Stream src_index={resortedTrackDescriptors[0].getSourceIndex()} index={resortedTrackDescriptors[0].getIndex()} [{resortedTrackDescriptors[0].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Japanisch'"
assert 'language' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[1].getTags()['language'] == 'deu', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'deu'"
assert 'title' in resortedTrackDescriptors[1].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[1].getTags()['title'] == 'Deutsch', f"Stream src_index={resortedTrackDescriptors[1].getSourceIndex()} index={resortedTrackDescriptors[1].getIndex()} [{resortedTrackDescriptors[1].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'Deutsch'"
assert 'language' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag"
assert resortedTrackDescriptors[2].getTags()['language'] == 'eng', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set language tag 'eng'"
assert 'title' in resortedTrackDescriptors[2].getTags().keys(), f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title tag"
assert resortedTrackDescriptors[2].getTags()['title'] == 'English', f"Stream src_index={resortedTrackDescriptors[2].getSourceIndex()} index={resortedTrackDescriptors[2].getIndex()} [{resortedTrackDescriptors[2].getType().label()}:{resortedTrackDescriptors[0].getSubIndex()}] has not set title 'English'"
def shouldFail(self):
return True

@ -83,7 +83,7 @@ def run(ctx):
scenario = Scenario.getClassReference(scenarioIdentifier)(ctx.obj)
ctx.obj['logger'].info(f"Running scenario {scenarioIdentifier}")
ctx.obj['logger'].debug(f"Running scenario {scenarioIdentifier}")
scenario.run()

Loading…
Cancel
Save