dvr
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
dvr [11.05.2024 08:34] – [Заголовок] augin | dvr [08.07.2024 11:51] (текущий) – внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | {{ : | ||
- | |||
[[https:// | [[https:// | ||
Строка 525: | Строка 523: | ||
</ | </ | ||
- | ===== python | + | ===== python3 |
- | + | < | |
- | < | + | |
import argparse | import argparse | ||
import time | import time | ||
Строка 535: | Строка 532: | ||
import subprocess | import subprocess | ||
import schedule | import schedule | ||
+ | from pathlib import Path | ||
+ | |||
# Настройка парсера аргументов командной строки | # Настройка парсера аргументов командной строки | ||
parser = argparse.ArgumentParser(description=' | parser = argparse.ArgumentParser(description=' | ||
parser.add_argument(' | parser.add_argument(' | ||
- | parser.add_argument(' | ||
- | parser.add_argument(' | ||
- | |||
# Чтение аргументов командной строки | # Чтение аргументов командной строки | ||
args = parser.parse_args() | args = parser.parse_args() | ||
+ | dvr_config_file = args.config_file | ||
+ | |||
+ | def read_dvr_config(config_file): | ||
+ | with open(dvr_config_file, | ||
+ | return yaml.safe_load(file) | ||
+ | |||
+ | config = read_dvr_config(dvr_config_file) | ||
+ | base_dir = config[' | ||
+ | stream_server = config[' | ||
+ | target_size_gb = config[' | ||
+ | go2rtc_config_path = config[' | ||
+ | |||
+ | |||
+ | # Функция очистки папок | ||
+ | def clean_camera_folders(base_dir, | ||
+ | """ | ||
+ | Очищает папки камер, удаляя самые старые файлы, пока размер папки не уменьшится до целевого размера. | ||
+ | |||
+ | :param base_dir: Путь к каталогу, | ||
+ | :param target_size_gb: | ||
+ | """ | ||
+ | base_dir = Path(base_dir) | ||
+ | # Удалить пустые папки | ||
+ | for folder in base_dir.iterdir(): | ||
+ | if folder.is_dir() and not any(folder.iterdir()): | ||
+ | folder.rmdir() | ||
+ | # Перебор папок камер | ||
+ | for camera_dir in base_dir.iterdir(): | ||
+ | if camera_dir.is_dir(): | ||
+ | # Получить текущий размер папки камеры в ГБ без десятичной части | ||
+ | size_gb = sum(f.stat().st_size for f in camera_dir.glob(' | ||
+ | |||
+ | # Рассчитать, | ||
+ | space_to_free_gb = size_gb - target_size_gb | ||
+ | |||
+ | # Проверить, | ||
+ | if size_gb > target_size_gb: | ||
+ | print(f" | ||
+ | # Удалить самые старые файлы, пока размер папки не уменьшится до целевого размера | ||
+ | while space_to_free_gb > 0: | ||
+ | # Найти самый старый файл в папке | ||
+ | oldest_file = min(camera_dir.glob(' | ||
+ | # Удалить самый старый файл | ||
+ | oldest_file_size = oldest_file.stat().st_size / (1024 ** 3) | ||
+ | try: | ||
+ | oldest_file.unlink() | ||
+ | print(f" | ||
+ | # Обновить текущий размер | ||
+ | space_to_free_gb -= oldest_file_size | ||
+ | except Exception as e: | ||
+ | print(f" | ||
# Функция для записи потоков | # Функция для записи потоков | ||
def record_streams(duration, | def record_streams(duration, | ||
- | with open(args.config_file, ' | + | with open(go2rtc_config_path, ' |
config_data = yaml.safe_load(file) | config_data = yaml.safe_load(file) | ||
streams = config_data[' | streams = config_data[' | ||
Строка 569: | Строка 616: | ||
' | ' | ||
] | ] | ||
- | log_file = os.path.join(base_dir, | + | |
# Запуск субпроцесса без ожидания его завершения | # Запуск субпроцесса без ожидания его завершения | ||
process = subprocess.Popen(command, | process = subprocess.Popen(command, | ||
Строка 576: | Строка 623: | ||
# Возвращаем список запущенных процессов, | # Возвращаем список запущенных процессов, | ||
return processes | return processes | ||
+ | # Очистка папок до размера 90 Гб | ||
+ | clean_camera_folders(base_dir, | ||
- | # Запуск | + | ## Запуск |
now = datetime.now() | now = datetime.now() | ||
- | if now.minute % 10 != 0: | + | #if now.minute % 10 != 0: |
- | next_interval = (now.minute // 10 + 1) * 10 | + | next_interval = (now.minute // 10 + 1) * 10 |
- | remaining_time = (next_interval - now.minute) * 60 - now.second | + | remaining_time = (next_interval - now.minute) * 60 - now.second |
- | record_streams(remaining_time, | + | record_streams(remaining_time, |
- | remaining_time | + | duration |
- | # Планируем задачу на каждую минуту | + | # Планируем задачу на каждые 10 минут |
- | schedule.every().hour.at(": | + | schedule.every().hour.at(": |
- | schedule.every().hour.at(": | + | schedule.every().hour.at(": |
- | schedule.every().hour.at(": | + | schedule.every().hour.at(": |
- | schedule.every().hour.at(": | + | schedule.every().hour.at(": |
- | schedule.every().hour.at(": | + | schedule.every().hour.at(": |
- | schedule.every().hour.at(": | + | schedule.every().hour.at(": |
# Основной цикл | # Основной цикл | ||
Строка 598: | Строка 647: | ||
time.sleep(1) | time.sleep(1) | ||
</ | </ | ||
- | ===== Заголовок | + | ===== dvr.yaml |
- | < | + | < |
- | from pathlib import Path | + | base_dir: '/ |
+ | stream_server: | ||
+ | target_size_gb: | ||
+ | go2rtc_config_path: | ||
- | def clean_camera_folders(base_dir, | + | </ |
- | """ | + | |
- | Очищает папки камер, удаляя самые старые файлы, пока размер папки не уменьшится до целевого размера. | + | |
- | :param base_dir: Путь к каталогу, | + | ===== Docker ===== |
- | :param target_size_gb: | + | docker container rm simple_nvr |
- | """ | + | docker build -t augin/nvr:v1 . |
- | base_dir = Path(base_dir) | + | |
+ | |||
- | # Перебор папок камер | ||
- | for camera_dir in base_dir.iterdir(): | ||
- | if camera_dir.is_dir(): | ||
- | # Получить текущий размер папки камеры в ГБ без десятичной части | ||
- | size_gb = sum(f.stat().st_size for f in camera_dir.glob(' | ||
- | |||
- | # Рассчитать, | ||
- | space_to_free_gb = size_gb - target_size_gb | ||
- | |||
- | # Проверить, | ||
- | if size_gb > target_size_gb: | ||
- | print(f" | ||
- | # Удалить самые старые файлы, пока размер папки не уменьшится до целевого размера | ||
- | while space_to_free_gb > 0: | ||
- | # Найти самый старый файл в папке | ||
- | oldest_file = min(camera_dir.glob(' | ||
- | # Удалить самый старый файл | ||
- | oldest_file_size = oldest_file.stat().st_size / (1024 ** 3) | ||
- | try: | ||
- | oldest_file.unlink() | ||
- | print(f" | ||
- | # Обновить текущий размер | ||
- | space_to_free_gb -= oldest_file_size | ||
- | except Exception as e: | ||
- | print(f" | ||
- | |||
- | # Пример использования функции | ||
- | clean_camera_folders("/ | ||
- | print(f" | ||
- | </ |
dvr.1715416482.txt.gz · Последнее изменение: 08.07.2024 11:48 (внешнее изменение)