Basename Combinator Tests passed
parent
696b2b56d3
commit
89129ae5c4
@ -0,0 +1,147 @@
|
|||||||
|
import os, sys, click
|
||||||
|
|
||||||
|
from .scenario import Scenario
|
||||||
|
|
||||||
|
from ffx.test.helper import createMediaTestFile
|
||||||
|
from ffx.process import executeProcess
|
||||||
|
|
||||||
|
from ffx.file_properties import FileProperties
|
||||||
|
|
||||||
|
from ffx.media_descriptor import MediaDescriptor
|
||||||
|
from ffx.track_descriptor import TrackDescriptor
|
||||||
|
|
||||||
|
from ffx.track_type import TrackType
|
||||||
|
from ffx.track_disposition import TrackDisposition
|
||||||
|
|
||||||
|
from ffx.test.media_combinator import MediaCombinator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Scenario4(Scenario):
|
||||||
|
|
||||||
|
def __init__(self, context):
|
||||||
|
super().__init__(context)
|
||||||
|
|
||||||
|
def getScenario(self):
|
||||||
|
return self.__class__.__name__[8:]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def job(self, yieldObj: dict):
|
||||||
|
|
||||||
|
testContext = self._context.copy()
|
||||||
|
|
||||||
|
identifier = yieldObj['identifier']
|
||||||
|
variantList = yieldObj['variants']
|
||||||
|
|
||||||
|
variantIdentifier = '-'.join(variantList)
|
||||||
|
variantLabel = f"{self.__class__.__name__} Variant {variantIdentifier}"
|
||||||
|
|
||||||
|
sourceMediaDescriptor: MediaDescriptor = yieldObj['payload']
|
||||||
|
assertSelectorList: list = yieldObj['assertSelectors']
|
||||||
|
assertFuncList = yieldObj['assertFuncs']
|
||||||
|
shouldFail = yieldObj['shouldFail']
|
||||||
|
|
||||||
|
try:
|
||||||
|
jellyfinSelectorIndex = assertSelectorList.index('J')
|
||||||
|
jellyfinVariant = variantList[jellyfinSelectorIndex]
|
||||||
|
testContext['use_jellyfin'] = jellyfinVariant == 'J1'
|
||||||
|
except ValueError:
|
||||||
|
jellyfinSelectorIndex = -1
|
||||||
|
|
||||||
|
|
||||||
|
if self._context['test_variant'] and variantIdentifier != self._context['test_variant']:
|
||||||
|
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, length = 2)
|
||||||
|
|
||||||
|
# # Phase 2: Prepare database
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Phase 3: Run ffx
|
||||||
|
commandSequence = [sys.executable,
|
||||||
|
self._ffxExecutablePath,
|
||||||
|
'convert',
|
||||||
|
mediaFilePath,
|
||||||
|
'--no-prompt']
|
||||||
|
|
||||||
|
if not testContext['use_jellyfin']:
|
||||||
|
commandSequence += ['--no-jellyfin']
|
||||||
|
|
||||||
|
self._logger.debug(f"{variantLabel}: Test sequence: {commandSequence}")
|
||||||
|
|
||||||
|
out, err, rc = executeProcess(commandSequence, directory = self._testDirectory)
|
||||||
|
|
||||||
|
if out:
|
||||||
|
self._logger.debug(f"{variantLabel}: Process output: {out}")
|
||||||
|
if rc:
|
||||||
|
self._logger.debug(f"{variantLabel}: Process returned ERROR {rc} ({err})")
|
||||||
|
|
||||||
|
# Phase 4: Evaluate results
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
if testContext['use_jellyfin']:
|
||||||
|
sourceMediaDescriptor.applyJellyfinOrder()
|
||||||
|
resultMediaDescriptor.applySourceIndices(sourceMediaDescriptor)
|
||||||
|
|
||||||
|
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)
|
@ -0,0 +1,37 @@
|
|||||||
|
class ReleaseCombinator():
|
||||||
|
|
||||||
|
IDENTIFIER = 'release'
|
||||||
|
|
||||||
|
RELEASE_LIST = [
|
||||||
|
".GerEngSub.AAC.1080pINDICATOR.WebDL.x264-Tanuki",
|
||||||
|
".German.AC3.DL.1080pINDICATOR.BluRay.x264-AST4u",
|
||||||
|
"-720pINDICATOR"
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, context = None, indicator = ''):
|
||||||
|
self._context = context
|
||||||
|
self._logger = context['logger']
|
||||||
|
self._reportLogger = context['report_logger']
|
||||||
|
|
||||||
|
self.__indicator = indicator
|
||||||
|
|
||||||
|
def getIdentifier(self):
|
||||||
|
return ReleaseCombinator.IDENTIFIER
|
||||||
|
|
||||||
|
def getPayload(self, releaseIndex):
|
||||||
|
releaseStr: str = ReleaseCombinator.RELEASE_LIST[releaseIndex]
|
||||||
|
return {
|
||||||
|
'variant': f"R{releaseIndex}",
|
||||||
|
'release': releaseStr.replace('INDICATOR', f".{self.__indicator}")
|
||||||
|
if self.__indicator else releaseStr.replace('INDICATOR', '')
|
||||||
|
}
|
||||||
|
|
||||||
|
def assertFunc(self, testObj = {}):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def shouldFail(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def getYield(self):
|
||||||
|
for releaseIndex in range(len(ReleaseCombinator.RELEASE_LIST)):
|
||||||
|
yield self.getPayload(releaseIndex)
|
@ -1,15 +0,0 @@
|
|||||||
from .scenario import Scenario
|
|
||||||
|
|
||||||
class Scenario3(Scenario):
|
|
||||||
|
|
||||||
def __init__(self, context):
|
|
||||||
super().__init__(context)
|
|
||||||
|
|
||||||
def getScenario(self):
|
|
||||||
return self.__class__.__name__[8:]
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
pass
|
|
||||||
# self._testDirectory
|
|
||||||
|
|
||||||
#createMediaTestFile()
|
|
@ -0,0 +1,33 @@
|
|||||||
|
class ShowCombinator():
|
||||||
|
|
||||||
|
IDENTIFIER = 'show'
|
||||||
|
|
||||||
|
SHOW_LIST = [
|
||||||
|
'Boruto; Naruto Next Generations (2017)',
|
||||||
|
'The Rising of the Shield Hero (2019)',
|
||||||
|
'Scrubs - Die Anfänger (2001)'
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, context = None):
|
||||||
|
self._context = context
|
||||||
|
self._logger = context['logger']
|
||||||
|
self._reportLogger = context['report_logger']
|
||||||
|
|
||||||
|
def getIdentifier(self):
|
||||||
|
return ShowCombinator.IDENTIFIER
|
||||||
|
|
||||||
|
def getPayload(self, showIndex):
|
||||||
|
return {
|
||||||
|
'variant': f"S{showIndex}",
|
||||||
|
'show': ShowCombinator.SHOW_LIST[showIndex]
|
||||||
|
}
|
||||||
|
|
||||||
|
def assertFunc(self, testObj = {}):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def shouldFail(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def getYield(self):
|
||||||
|
for showIndex in range(len(ShowCombinator.SHOW_LIST)):
|
||||||
|
yield self.getPayload(showIndex)
|
@ -1,34 +0,0 @@
|
|||||||
class SiteCombinator():
|
|
||||||
|
|
||||||
IDENTIFIER = 'site'
|
|
||||||
|
|
||||||
SITE_LIST = [
|
|
||||||
".GerEngSub.AAC.1080pINDICATOR.WebDL.x264-Tanuki",
|
|
||||||
".German.AC3.DL.1080pINDICATOR.BluRay.x264-AST4u",
|
|
||||||
"-720pINDICATOR"
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, context = None, indicator = ''):
|
|
||||||
self._context = context
|
|
||||||
self._logger = context['logger']
|
|
||||||
self._reportLogger = context['report_logger']
|
|
||||||
|
|
||||||
self.__indicator = indicator
|
|
||||||
|
|
||||||
def getIdentifier(self):
|
|
||||||
return SiteCombinator.IDENTIFIER
|
|
||||||
|
|
||||||
def getPayload(self, index):
|
|
||||||
site = SiteCombinator.SITE_LIST[index]
|
|
||||||
return site.replace('INDICATOR', f".{self.__indicator}") if self.__indicator else site.replace('INDICATOR', '')
|
|
||||||
|
|
||||||
def assertFunc(self, testObj = {}):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def shouldFail(self):
|
|
||||||
return False
|
|
||||||
|
|
||||||
def getYield(self):
|
|
||||||
|
|
||||||
for titleIndex in len(SiteCombinator.SITE_LIST):
|
|
||||||
yield self.getPayload(titleIndex)
|
|
Loading…
Reference in New Issue