Skip to content

Commit

Permalink
Improve profile definitions/handling #2
Browse files Browse the repository at this point in the history
 + improved default config
  • Loading branch information
Jens N committed Feb 11, 2022
1 parent c9c8a12 commit a94d05d
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 24 deletions.
67 changes: 48 additions & 19 deletions ffmpeg-transcode
Expand Up @@ -55,62 +55,89 @@ def parse_arguments():
arguments[argSection][argName] = parse_argument_value(argValue)
return arguments

def profile_condition_arg(condition, arguments, currentProfile, currentPriority):
def profile_add(profilesByGroup, profile, profileGroup, priority):
profilesByGroup[profileGroup] = profile;
profilesByGroup[profileGroup]["priority"] = priority;
return profilesByGroup

def profile_condition_arg(condition, arguments, config, profilesByGroup):
# Get target profile settings
profileTargetName = condition["profile"]
profileTarget = config["profiles"][profileTargetName]
profileGroup = "general"
if "group" in profileTarget:
profileGroup = profileTarget["group"]
# Get current profile
currentProfile = None
currentPriority = 0
if profileGroup in profilesByGroup:
currentProfile = profilesByGroup[profileGroup]
if "priority" in currentProfile:
currentPriority = currentProfile["priority"]
# Check priority
conditionPriority = 0
if "priority" in condition:
conditionPriority = condition["priority"]
if conditionPriority <= currentPriority:
return currentProfile, currentPriority
return profilesByGroup
# Get argument value
if not condition["argName"] in arguments[condition["argSection"]]:
if condition["type"] == "missing":
# Matches if argument is missing
return condition["profile"], conditionPriority
return profile_add(profilesByGroup, profileTarget, profileGroup, conditionPriority)
else:
# Condition type requires argument to be present
return currentProfile, currentPriority
return profilesByGroup
value = arguments[condition["argSection"]][condition["argName"]]
# Check condition
if condition["type"] == "present":
# Matches as soon as the argument is present
return condition["profile"], conditionPriority
return profile_add(profilesByGroup, profileTarget, profileGroup, conditionPriority)
elif condition["type"] == "exact":
# Exact value match
if condition["value"] == value:
return condition["profile"], conditionPriority
return profile_add(profilesByGroup, profileTarget, profileGroup, conditionPriority)
elif condition["type"] == "regex":
# Regular expression match
regexFlags = 0
if ("ignorecase" in condition) and condition["ignorecase"]:
regexFlags += re.IGNORECASE
regexPattern = re.compile(condition["value"], regexFlags)
if regexPattern.match(value):
return condition["profile"], conditionPriority
return currentProfile, currentPriority
return profile_add(profilesByGroup, profileTarget, profileGroup, conditionPriority)
return profilesByGroup

def profile_select(config, arguments):
#print("Evaluating target profile...")
profileName = None
profilePriority = -1
profilesByGroup = {}
if not "profile_select" in config:
return None
# Apply default profile
if "default" in config["profile_select"]:
profileName = config["profile_select"]["default"]
profileTarget = config["profiles"][ config["profile_select"]["default"] ]
profileGroup = "general"
if "group" in profileTarget:
profileGroup = profileTarget["group"]
profile_add(profilesByGroup, profileTarget, profileGroup, 0)
# Process profile conditions
if "by_argument" in config["profile_select"]:
for condition in config["profile_select"]["by_argument"]:
profileName, profilePriority = profile_condition_arg(condition, arguments, profileName, profilePriority)
if profileName in config["profiles"]:
return config["profiles"][profileName]
else:
return None
profilesByGroup = profile_condition_arg(condition, arguments, config, profilesByGroup)
# List and sort all selected profiles
profileList = []
for profileGroup in profilesByGroup:
profileList.append(profilesByGroup[profileGroup])
def profileSort(profile):
return profile["priority"]
profileList.sort(key=profileSort)
return profileList

def profile_parameters(profile):
argumentRepl = {
"input": {},
"output": {}
}
if profile is not None:
for profile in profiles:
# Apply profile overrides
if profile["input"] is not None:
for argName in profile["input"]:
Expand Down Expand Up @@ -165,8 +192,10 @@ if config is None:
print("Failed to load configuration! Exiting.")
sys.exit(1)
arguments = parse_arguments()
profile = profile_select(config, arguments)
parameters = profile_parameters(profile)
profiles = profile_select(config, arguments)
print(profiles)
sys.exit(0)
parameters = profile_parameters(profiles)
executable = config["executable"]
parameters.insert(0, executable)

Expand Down
31 changes: 26 additions & 5 deletions ffmpeg-transcode-example.yaml
@@ -1,15 +1,24 @@
'executable': '/home/pi/raspi-plex-transcode/plex-media-server-ffmpeg/ffmpeg'
'log': '/var/lib/plexmediaserver/plex-transcoder.log'
'profiles':
'h264':
'group': 'codec'
'input':
'output':
'-codec:0': 'h264_v4l2m2m'
'-b:v': '5M'
'-crf:0': '10'
'-maxrate:0': '50M'
'-bufsize:0': '10M'
'-segment_format': '**REMOVE**'
'-crf:0': '**REMOVE**'
'-maxrate:0': '**REMOVE**'
'-x264opts:0': '**REMOVE**'
'mkv2mpegts_stream':
'group': 'format'
'input':
'output':
'-segment_format': 'mpegts'
'mkv2mpegts_download':
'group': 'format'
'input':
'output':
'-f': 'mpegts'
'profile_select':
'by_argument':
-
Expand All @@ -18,3 +27,15 @@
'type': 'exact'
'value': 'libx264'
'profile': 'h264'
-
'argSection': 'output'
'argName': '-segment_format'
'type': 'exact'
'value': 'matroska'
'profile': 'mkv2mpegts_stream'
-
'argSection': 'output'
'argName': '-f'
'type': 'exact'
'value': 'matroska'
'profile': 'mkv2mpegts_download'

0 comments on commit a94d05d

Please sign in to comment.