feat: custom options

This commit is contained in:
Kyrch committed 2023-06-22 17:19:05 -03:00
1 parent b5c756a498
commit 20f27a8eea
6 files changed
+67 -17

No files matched your search

+7 -1
View File
@@ -19,7 +19,7 @@ Ideally we are iterating over a combination of filters and settings, picking the
### Usage
python -m beta_batch_encoder [-h] [--generate | -g] [--execute | -e] [--file [FILE]] [--configfile [CONFIGFILE]] --loglevel [{debug,info,error}]
python -m beta_batch_encoder [-h] [--generate | -g] [--execute | -e] [--custom | -c] [--file [FILE]] [--configfile [CONFIGFILE]] --loglevel [{debug,info,error}]
**Mode**
@@ -35,6 +35,10 @@ By default, the program looks for a file named `commands.txt` in the current dir
`None` will give modes options to run.
**Custom**
`--custom` customizes options like Create Preview, Limit Size Enable, CRFs and Encoding Modes for each output file. Default configs are specified in the `--file` argument.
**File**
The file that commands are written to or read from.
@@ -77,6 +81,8 @@ Available bitrate control modes are:
`AlternateSourceEnable` is a flag for alternate command lines between source files. Default is False.
`CreatePreview` is a flag for create a command line to preview seeks. Default is False.
`IncludeUnfiltered` is a flag for including or excluding an encode without video filters for each bitrate control mode and CRF pairing. Default is True.
`VideoFilters` is a configuration item list used for named video filtergraphs for each bitrate control mode and CRF pairing.
+11 -2
View File
@@ -9,6 +9,7 @@ from appdirs import AppDirs
import argparse
import configparser
import copy
import logging
import os
import shutil
@@ -21,8 +22,9 @@ def main():
parser = argparse.ArgumentParser(prog='beta_batch_encoder',
description='Generate/Execute FFmpeg commands for files in acting directory',
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--generate', '-g', action='store_true',help='Generate commands and write to file')
parser.add_argument('--generate', '-g', action='store_true', help='Generate commands and write to file')
parser.add_argument('--execute', '-e', action='store_true', help='Execute commands from file')
parser.add_argument('--custom', '-c', action='store_true', help='Customize some options for each seek')
parser.add_argument('--file', nargs='?', default='commands.txt', type=commandfile_arg_type,
help='1: Name of file commands are written to (default: commands.txt)\n'
'2: Name of file commands are executed from (default: commands.txt)\n'
@@ -59,6 +61,7 @@ def main():
EncodingConfig.config_threads: EncodingConfig.default_threads,
EncodingConfig.config_limit_size_enable: EncodingConfig.default_limit_size_enable,
EncodingConfig.config_alternate_source_files: EncodingConfig.default_alternate_source_files,
EncodingConfig.create_preview: EncodingConfig.default_create_preview,
EncodingConfig.config_include_unfiltered: EncodingConfig.default_include_unfiltered,
EncodingConfig.config_default_video_stream: '',
EncodingConfig.config_default_audio_stream: ''}
@@ -108,10 +111,16 @@ def main():
is_collector_valid = seek_collector.is_valid()
for seek in seek_collector.get_seek_list():
new_encoding_config = copy.copy(encoding_config)
if args.custom:
print(f'\033[92mOutput Name: {seek.output_name}\033[0m')
new_encoding_config = Interface.custom_options(new_encoding_config)
logging.info(f'Generating commands with seek ss: \'{seek.ss}\', to: \'{seek.to}\'')
encode_webm = EncodeWebM(file_value, seek)
load_commands = encode_webm.get_commands(encoding_config)
load_commands = encode_webm.get_commands(new_encoding_config)
commands = commands + load_commands
except KeyboardInterrupt:
logging.info(f'Exiting from inclusion of file \'{file}\' after keyboard interrupt')
+2 -1
View File
@@ -185,7 +185,8 @@ class EncodeWebM:
f'include_unfiltered: \'{encoding_config.include_unfiltered}\', '
f'video_filters: \'{encoding_config.video_filters}\'')
file_commands.append(self.preview_seek(webm_filename=self.get_webm_filename()))
if encoding_config.create_preview:
file_commands.append(self.preview_seek(webm_filename=self.get_webm_filename()))
for encoding_mode in encoding_config.encoding_modes:
if BitrateMode.CBR.name == encoding_mode.upper():
+6 -2
View File
@@ -9,6 +9,7 @@ class EncodingConfig:
config_threads = 'Threads'
config_limit_size_enable = 'LimitSizeEnable'
config_alternate_source_files = 'AlternateSourceFiles'
config_create_preview = 'CreatePreview'
config_include_unfiltered = 'IncludeUnfiltered'
# Default Config keys
@@ -22,13 +23,14 @@ class EncodingConfig:
default_threads = '4'
default_limit_size_enable = True
default_alternate_source_files = False
default_create_preview = False
default_include_unfiltered = True
default_video_filters = {'filtered': 'hqdn3d=0:0:3:3,gradfun,unsharp',
'lightdenoise': 'hqdn3d=0:0:3:3',
'heavydenoise': 'hqdn3d=1.5:1.5:6:6',
'unsharp': 'unsharp'}
def __init__(self, allowed_filetypes, encoding_modes, crfs, threads, limit_size_enable, alternate_source_files, include_unfiltered, video_filters, default_video_stream,
def __init__(self, allowed_filetypes, encoding_modes, crfs, threads, limit_size_enable, alternate_source_files, create_preview, include_unfiltered, video_filters, default_video_stream,
default_audio_stream):
self.allowed_filetypes = allowed_filetypes
self.encoding_modes = encoding_modes
@@ -36,6 +38,7 @@ class EncodingConfig:
self.threads = threads
self.limit_size_enable = limit_size_enable
self.alternate_source_files = alternate_source_files
self.create_preview = create_preview
self.include_unfiltered = include_unfiltered
self.video_filters = video_filters
self.default_video_stream = default_video_stream
@@ -52,6 +55,7 @@ class EncodingConfig:
EncodingConfig.default_threads)
limit_size_enable = config.getboolean('Encoding', EncodingConfig.config_limit_size_enable, fallback=EncodingConfig.default_limit_size_enable)
alternate_source_files = config.getboolean('Encoding', EncodingConfig.config_alternate_source_files, fallback=EncodingConfig.default_alternate_source_files)
create_preview = config.getboolean('Encoding', EncodingConfig.config_create_preview, fallback=EncodingConfig.default_create_preview)
include_unfiltered = config.getboolean('Encoding', EncodingConfig.config_include_unfiltered,
fallback=EncodingConfig.default_include_unfiltered)
video_filters = config.items('VideoFilters', EncodingConfig.default_video_filters)
@@ -59,7 +63,7 @@ class EncodingConfig:
default_video_stream = config['Encoding'].get(EncodingConfig.config_default_video_stream)
default_audio_stream = config['Encoding'].get(EncodingConfig.config_default_audio_stream)
return cls(allowed_filetypes, encoding_modes, crfs, threads, limit_size_enable, alternate_source_files, include_unfiltered, video_filters, default_video_stream,
return cls(allowed_filetypes, encoding_modes, crfs, threads, limit_size_enable, alternate_source_files, create_preview, include_unfiltered, video_filters, default_video_stream,
default_audio_stream)
def get_default_stream(self, stream_type):
+39 -10
View File
@@ -8,22 +8,17 @@ class Interface:
# Prompt the mode options to run to the user
def choose_mode():
modes = {
'Generate commands': 1,
'Execute commands': 2,
'Generate and execute commands': 3
}
question = [inquirer.List('mode', message='Mode (Enter)', choices=list(modes.keys()))]
modes = [('Generate commands', 1), ('Execute commands', 2), ('Generate and execute commands', 3)]
question = [inquirer.List('mode', message='Mode (Enter)', choices=modes)]
answer = inquirer.prompt(question)
logging.debug(f'[Interface.choose_mode] answer["mode"]: \'{answer["mode"]}\'')
return modes[answer['mode']]
return answer['mode']
# Prompt the source files to choose
def choose_source_files(source_files):
question = [inquirer.Checkbox('source_files', message='Source Files (Space)', choices=source_files)]
question = [inquirer.Checkbox('source_files', message='Source Files (Space to select)', choices=source_files)]
answer = inquirer.prompt(question)
logging.debug(f'[Interface.choose_source_files] answer["source_files"]: \'{answer["source_files"]}\'')
@@ -113,4 +108,38 @@ class Interface:
f'audio_filters["Custom"]: \'{audio_filters["Custom"]}\''
)
return ','.join(audio_filters_list)
return ','.join(audio_filters_list)
# Prompt custom options if requested
def custom_options(encoding_config):
create_preview = encoding_config.create_preview
limit_size_enable = encoding_config.limit_size_enable
crfs = encoding_config.crfs
encoding_modes = encoding_config.encoding_modes
validate_crfs = lambda _, x: all(y.strip().isdigit() for y in x.split(','))
validate_encoding_modes = lambda _, x: all(y.strip().upper() in ['VBR', 'CBR', 'CQ'] for y in x.split(','))
questions = [
inquirer.Confirm('create_preview', message=f'Create Preview?', default=create_preview),
inquirer.Confirm('limit_size_enable', message=f'Limit Size Enable?', default=limit_size_enable),
inquirer.Text('crfs', message='CRFs', default=','.join(crfs), validate=validate_crfs),
inquirer.Text('encoding_modes', message='Encoding Modes', default=','.join(encoding_modes), validate=validate_encoding_modes)
]
answer = inquirer.prompt(questions)
encoding_config.create_preview = answer['create_preview']
encoding_config.limit_size_enable = answer['limit_size_enable']
encoding_config.crfs = answer['crfs'].split(',')
encoding_config.encoding_modes = answer['encoding_modes'].split(',')
logging.debug(
f'[Interface.custom_options] '
f'encoding_config.create_preview: \'{encoding_config.create_preview}\', '
f'encoding_config.limit_size_enable: \'{encoding_config.create_preview}\', '
f'encoding_config.crfs: \'{encoding_config.crfs}\', '
f'encoding_config.encoding_modes: \'{encoding_config.encoding_modes}\''
)
return encoding_config
+2 -1
View File
@@ -7,7 +7,7 @@ with open('README.md') as f:
setup(
name='animethemes-beta-batch-encoder',
version='1.1',
version='1.2',
author='AnimeThemes',
author_email='admin@animethemes.moe',
url='https://github.com/AnimeThemes/animethemes-batch-encoder',
@@ -31,5 +31,6 @@ setup(
python_requires='>=3.6',
install_requires=[
'appdirs',
'inquirer'
],
)