/
Ded_fed
/
AutoConverter
Обзор
Документация
Войти
/
Ded_fed
/
AutoConverter
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
120 строк
6 KB
Ded_fed
Дописал проверку изменения файлов
08 май 2026, 13:14
08 май 2026, 13:14
c8baace
Код
Авторство
О чём код?
import os import shutil import time import logging from func import get_file_list input_dir='/project/Converter' output_dir='/project/Converter/Готово' orig_dir='/project/Converter/Исходники' lockfile = '/tmp/converter.lock' log_file="/project/converter.log" logging.basicConfig(level=logging.WARNING,format='%(asctime)s | %(levelname)s | %(message)s',handlers=[logging.FileHandler(log_file, encoding='utf-8'),logging.StreamHandler()]) # Время через которое будет произведено автоматическое удаления файлов из папки ГОТОВЫХ 6 минут. time_for_delete=360 # ВРЕМЯ ОЖИДАНИЯ ДЛЯ ЗУПУСКА Конвектора. time_sleep_interval=10 # Время хранения для папки Исходники — 1 сутки (в секундах) time_for_orig_delete = 86400 # 24 часа ## Необходимо для работы # apt install weasyprint # apt install imagemagick # apt install poppler-utils # apt install libreoffice # apt install djvulibre-bin # apt install unoconv # Список запускаемых программ для проверки наличия prog_name = ("pdftocairo", "convert", "libreoffice", "ddjvu", "identify", "weasyprint", "unoconv") # Функция создания файла блокировки и проверка на наличие процесса конвертации def lock(lockfile): if os.path.exists(lockfile) : try : with open(lockfile, 'r') as f : pid = int(f.read().strip()) os.kill(pid, 0) logging.error('Конвертер уже запущен.') exit(1) except (ValueError, OSError): logging.warning('Обнаружен "битый" lock-файл. Удаляем и продолжаем.') os.remove(lockfile) with open(lockfile, 'w') as f: f.write(str(os.getpid())) logging.info(f'Lock-файл создан: {lockfile}') # Функции поиска необходимы программ def check_converter_process(program_name) : for prog in program_name: prog_name_path = shutil.which(prog) if prog_name_path: logging.info(f'Программа найдена: {prog}') else: logging.error(f'Программа не найдена: {prog}') return False return True # Основной код try : # Проверить процесс конвектора и создать файл блока lock(lockfile) # Проверим установленные утилиты check_converter_process(prog_name) # Цикл проверки времени. logging.info('Конвертер запущен. Начинаем основной цикл.') while True : # Вычисление время выполнения программы и очистки от старых папок. time_delete = time.time() - time_for_delete time_delete_orig = time.time() - time_for_orig_delete # Создание новой пустой папки для сохранения новых документов. if not os.path.exists(output_dir) : logging.debug(f'Папка не существует, создаём: {output_dir}') os.makedirs(output_dir, exist_ok=True) if not os.path.exists(orig_dir) : logging.debug(f'Папка не существует, создаём: {orig_dir}') os.makedirs(orig_dir, exist_ok=True) # Удаляем папку если она есть с учётом времени создания. for dir_for_del in os.listdir(output_dir) : item_path = (os.path.join(output_dir, dir_for_del)) try : if (os.path.getmtime(item_path)) < time_delete : # Если это каталог тогда удаляем все файлы внутри него и потом самого себя. if os.path.isdir(item_path): shutil.rmtree(item_path) logging.info(f'Удалён каталог: {item_path}') # Если это обычный файл просто удалим его elif os.path.isfile(item_path): os.remove(item_path) logging.info(f'Удалён файл: {item_path}') except (OSError, FileNotFoundError) as e : logging.warning(f'Не удалось удалить {item_path}: {e}') for old_dir in os.listdir(orig_dir): item_path = os.path.join(orig_dir, old_dir) try : if os.path.getmtime(item_path) < time_delete_orig: if os.path.isdir(item_path): shutil.rmtree(item_path) logging.info(f'Удалён каталог в Исходниках: {item_path}') elif os.path.isfile(item_path): os.remove(item_path) logging.info(f'Удалён файл в Исходниках: {item_path}') except (OSError, FileNotFoundError) as e: logging.warning(f'Не удалось удалить {item_path}: {e}') # Передаем директорию для поиска файлов и директории куда складывать обработанные документы. try: get_file_list(input_dir, output_dir, orig_dir) # Пауза перед запуском. time.sleep(time_sleep_interval) except KeyboardInterrupt: logging.info('Получен сигнал остановки (Ctrl+C). Завершение работы.') break except Exception as e: logging.exception(f'Неожиданная ошибка в основном цикле: {e}') break finally : if os.path.exists(lockfile): os.remove(lockfile) logging.info(f'Lock-файл удалён: {lockfile}')