Реализация конфигурации TOML для проекта по созданию контента. Этот проект направлен на взаимодействие с Reddit, преобразуя комментарии из веток в видеоконтент и аудиоконтент. Вот как это все получилось.
Зачем?
Представьте себе систему, которая просматривает Reddit, загружает интересные комментарии из различных веток, а затем генерирует на основе этих комментариев видеоконтент и аудиоконтент. Для реализации этой идеи нужна надежная система конфигурации, и TOML (Tom’s Obvious, Minimal Language) идеальный выбор благодаря своей ясности и простоте.
Как?
Начнем с создания скрипта, способного считывать конфигурационные файлы TOML. Функция read_config является отправной точкой. Она обеспечивает существование конфигурационного файла и его корректный парсинг. Если файл отсутствует, она вызывает ошибку, защищая проект от неожиданных сбоев.
def read_config(file_path):
if not os.path.exists(file_path):
raise FileNotFoundError(f"Configuration file '{file_path}' not found.")
with open(file_path, 'r') as file:
config = toml.load(file)
return config
Интерактивная Конфигурация
Далее нам нужно было убедиться, что все критически важные параметры конфигурации были предоставлены. Это привело к разработке функции query_input. Эта функция взаимодействует с пользователем, предлагая ему ввести недостающие значения и динамически обновляет конфигурацию. Она также использовала вспомогательные функции, такие как get_version и get_tts_library, для получения специфических значений при необходимости.
def query_input(block, section, config_folder_path):
if block.get('enabled', True):
for key, value in block.items():
if 'version' in block and block['version'] == "":
block['version'] = get_version(os.path.join(config_folder_path, 'src/html/templates'))
if 'tts_library' in block and block['tts_library'] == "":
block['tts_library'] = get_tts_library()
if (value == "" or value is None) and (
section == 'data_source' and 'url' in block and not block.get('samples')):
new_value = input(f"Please enter a value for '{key}': ")
block[key] = new_value
return block
Сердце Системы
В центре моей системы функция get_configuration. Эта функция считывает начальную конфигурацию, обрабатывала каждый раздел, предлагая пользователю ввести недостающие значения, и затем сохраняет обновленную конфигурацию в новый файл, если был указан выходной каталог.
def get_configuration(config_file_path, output_folder=None):
config_folder_path = os.path.dirname(config_file_path)
try:
config = read_config(config_file_path)
print("Initial configuration:")
print(config)
# Iterate through the configuration sections and update as needed for section, block in config.items():
print(f"\nProcessing section: {section}")
if block.get('enabled', True):
updated_block = query_input(block, section, config_folder_path)
config[section] = updated_block
print("\nUpdated configuration:")
print(config)
if output_folder:
if not os.path.exists(output_folder):
os.makedirs(output_folder)
output_file_path = os.path.join(output_folder, 'updated_config.toml')
with open(output_file_path, 'w') as output_file:
toml.dump(config, output_file)
print(f"\nUpdated configuration saved to: {output_file_path}")
return config
except Exception as e:
print(f"Error: {e}")
Объединение Всего
Последний кусочек головоломки был в блоке __main__. Этот раздел скрипта задает корневую папку, путь к конфигурационному файлу и путь к выходной папке. Затем он вызывает функцию get_configuration для обработки конфигурационного файла.
if __name__ == "__main__":
root_folder = os.path.join(os.path.dirname(__file__), '.')
config_path = os.path.join(root_folder, 'config.toml')
output_folder_path = os.path.join(root_folder, f'output_{time.strftime("%Y%m%d-%H%M%S")}')
get_configuration(config_path, output_folder_path)
Этот проект не просто о написании кода; он о создании плавного и интерактивного опыта для создания контента.