@ -1,4 +1,4 @@
import os , sys , click
import os , sys , click , glob
from . scenario import Scenario
from . scenario import Scenario
@ -13,7 +13,9 @@ from ffx.track_descriptor import TrackDescriptor
from ffx . track_type import TrackType
from ffx . track_type import TrackType
from ffx . track_disposition import TrackDisposition
from ffx . track_disposition import TrackDisposition
from ffx . test . media_combinator import MediaCombinator
from ffx . test . media_combinator_0 import MediaCombinator0
from ffx . test . basename_combinator import BasenameCombinator
class Scenario1 ( Scenario ) :
class Scenario1 ( Scenario ) :
@ -21,6 +23,9 @@ class Scenario1(Scenario):
Converting to VaA , vp9 / opus / opus
Converting to VaA , vp9 / opus / opus
No tmdb , default parameters """
No tmdb , default parameters """
TESTFILE_EXTENSION = ' mkv '
EXPECTED_EXTENSION = ' webm '
def __init__ ( self , context ) :
def __init__ ( self , context ) :
context [ ' use_jellyfin ' ] = True
context [ ' use_jellyfin ' ] = True
@ -30,6 +35,9 @@ class Scenario1(Scenario):
super ( ) . __init__ ( context )
super ( ) . __init__ ( context )
def getScenario ( self ) :
return self . __class__ . __name__ [ 8 : ]
def job ( self , yieldObj : dict ) :
def job ( self , yieldObj : dict ) :
@ -42,17 +50,20 @@ class Scenario1(Scenario):
variantIdentifier = ' - ' . join ( variantList )
variantIdentifier = ' - ' . join ( variantList )
variantLabel = f " { self . __class__ . __name__ } Variant { variantIdentifier } "
variantLabel = f " { self . __class__ . __name__ } Variant { variantIdentifier } "
sourceMediaDescriptor : MediaDescriptor = yieldObj [ ' payload ' ]
mc0 = MediaCombinator0 ( context = testContext )
sourceMediaDescriptor : MediaDescriptor = mc0 . getPayload ( )
assertSelectorList : list = yieldObj [ ' assertSelectors ' ]
assertSelectorList : list = yieldObj [ ' assertSelectors ' ]
assertFuncList = yieldObj [ ' assertFuncs ' ]
assertFuncList = yieldObj [ ' assertFuncs ' ]
shouldFail = yieldObj [ ' shouldFail ' ]
shouldFail = yieldObj [ ' shouldFail ' ]
try :
variantPayload = yieldObj [ ' payload ' ]
jellyfinSelectorIndex = assertSelectorList . index ( ' J ' )
variantBasename = variantPayload [ ' basename ' ]
jellyfinVariant = variantList [ jellyfinSelectorIndex ]
variantFilenameLabel = variantPayload [ ' label ' ]
testContext [ ' use_jellyfin ' ] = jellyfinVariant == ' J1 '
expectedBasename = variantPayload [ ' expectedBasename ' ]
except ValueError :
jellyfinSelectorIndex = - 1
variantFilename = f " { variantBasename } . { Scenario1 . TESTFILE_EXTENSION } "
expectedFilename = f " { expectedBasename } . { Scenario1 . EXPECTED_EXTENSION } "
if self . _context [ ' test_variant ' ] and variantIdentifier != self . _context [ ' test_variant ' ] :
if self . _context [ ' test_variant ' ] and variantIdentifier != self . _context [ ' test_variant ' ] :
@ -61,22 +72,48 @@ class Scenario1(Scenario):
self . _logger . debug ( f " Running Job: { variantLabel } " )
self . _logger . debug ( f " Running Job: { variantLabel } " )
# Phase 1: Setup source files
# Phase 1: Setup source files
if not variantBasename :
raise ValueError ( f " { variantLabel } : Testfile basename is falsy " )
self . clearTestDirectory ( )
self . clearTestDirectory ( )
mediaFilePath = createMediaTestFile ( mediaDescriptor = sourceMediaDescriptor , directory = self . _testDirectory , logger = self . _logger , length = 2 )
self . _logger . debug ( f " Creating test file: { variantFilename } " )
mediaFilePath = createMediaTestFile ( mediaDescriptor = sourceMediaDescriptor ,
baseName = variantBasename ,
directory = self . _testDirectory ,
logger = self . _logger ,
length = 2 )
# # Phase 2: Prepare database
# # Phase 2: Prepare database
#
#
# Phase 3: Run ffx
# Phase 3: Run ffx
commandSequence = [ sys . executable ,
commandSequence = [ sys . executable ,
self . _ffxExecutablePath ,
self . _ffxExecutablePath ]
' convert ' ,
# if self._context['verbosity']:
# commandSequence += ['--verbose',
# str(self._context['verbosity'])]
commandSequence + = [ ' convert ' ,
mediaFilePath ,
mediaFilePath ,
' --no-prompt ' ]
' --no-prompt ' ]
if variantFilenameLabel :
commandSequence + = [ ' --label ' , variantFilenameLabel ]
if not testContext [ ' use_jellyfin ' ] :
if not testContext [ ' use_jellyfin ' ] :
commandSequence + = [ ' --no-jellyfin ' ]
commandSequence + = [ ' --no-jellyfin ' ]
commandSequence + = [ ' --no-pattern ' ]
commandSequence + = [ ' --no-tmdb ' ]
self . _logger . debug ( f " { variantLabel } : Test sequence: { commandSequence } " )
self . _logger . debug ( f " { variantLabel } : Test sequence: { commandSequence } " )
out , err , rc = executeProcess ( commandSequence , directory = self . _testDirectory )
out , err , rc = executeProcess ( commandSequence , directory = self . _testDirectory )
@ -86,8 +123,14 @@ class Scenario1(Scenario):
if rc :
if rc :
self . _logger . debug ( f " { variantLabel } : Process returned ERROR { rc } ( { err } ) " )
self . _logger . debug ( f " { variantLabel } : Process returned ERROR { rc } ( { err } ) " )
# Phase 4: Evaluate results
# Phase 4: Find result files
resultFilenames = [ rf for rf in self . getFilenamesInTestDirectory ( ) if rf != ' ffmpeg2pass-0.log ' and rf != variantFilename ]
self . _logger . debug ( f " { variantLabel } : Result filenames: { resultFilenames } " )
# Phase 5: Evaluate results
try :
try :
jobFailed = bool ( rc )
jobFailed = bool ( rc )
@ -98,18 +141,18 @@ class Scenario1(Scenario):
if not jobFailed :
if not jobFailed :
resultFile = os . path . join ( self . _testDirectory , ' media.webm ' )
expectedResultFilePath = os . path . join ( self . _testDirectory , f " { expectedFilename } " )
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 ' ] :
assert os . path . isfile ( expectedResultFilePath ) , f " Result file { expectedFilename } in path ' { self . _testDirectory } ' wasn ' t created "
sourceMediaDescriptor . applyJellyfinOrder ( )
resultMediaDescriptor . applySourceIndices ( sourceMediaDescriptor )
resultMediaTracks = resultMediaDescriptor . getAllTrackDescriptors ( )
# 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 ) ) :
for assertIndex in range ( len ( assertSelectorList ) ) :
@ -117,21 +160,14 @@ class Scenario1(Scenario):
assertFunc = assertFuncList [ assertIndex ]
assertFunc = assertFuncList [ assertIndex ]
assertVariant = variantList [ assertIndex ]
assertVariant = variantList [ assertIndex ]
if assertSelector == ' M ' :
if assertSelector == ' B ' :
#TODO: per file find
testObj = { ' filenames ' : resultFilenames }
assertFunc ( testObj = testObj )
if assertSelector == ' L ' :
assertFunc ( )
if assertSelector == ' I ' :
assertFunc ( )
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 " )
self . _reportLogger . info ( f " { variantLabel } : Test passed " )
@ -141,9 +177,8 @@ class Scenario1(Scenario):
def run ( self ) :
def run ( self ) :
MC_list = MediaCombinator . getAllClassReferences ( )
for BC in BasenameCombinator . getAllClassReferences ( ) :
for MC in MC_list :
self . _logger . debug ( f " BC= { BC . __name__ } " )
self . _logger . debug ( f " MC= { MC . __name__ } " )
bc = BC ( context = self . _context )
mc = MC ( context = self . _context )
for y in bc . getYield ( ) :
for y in mc . getYield ( ) :
self . job ( y )
self . job ( y )