/
efr
/
SmartCity
Обзор
Документация
Войти
/
efr
/
SmartCity
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
parser.py
135 строк
5 KB
Sergey
add_project
27 фев 2025, 19:33
27 фев 2025, 19:33
7eeda08
Код
Авторство
О чём код?
import requests import cv2 import os import json import argparse from requests.exceptions import RequestException import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) DEFAULT_START_CAM_ID = 0 DEFAULT_END_CAM_ID = 1500 DEFAULT_PREVIEW_FOLDER = 'static/preview' DEFAULT_MANIFEST_FILE = 'static/manifests.json' DEFAULT_REQUEST_TIMEOUT = 15 DEFAULT_STREAM_CHECK_FRAMES = 10 DEFAULT_MIN_SUCCESS_FRAMES = 5 DEFAULT_PREVIEW_SIZE = (640, 360) DEFAULT_JPEG_QUALITY = 80 def get_camera_data(cam_id): url = f"https://video.cmirit.ru/user/home/cams/?cam_id={cam_id}" headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} try: response = requests.get( url, headers=headers, verify=False, timeout=REQUEST_TIMEOUT ) response.raise_for_status() data = response.json() if data.get('camers'): main_camera = data['camers'][0] return { "id": main_camera['id'], "name": main_camera['name'], "manifest_url": main_camera['cam_list'][0]['path'] } except RequestException as e: print(f"[{cam_id}] HTTP ошибка: {str(e)}") except json.JSONDecodeError: print(f"[{cam_id}] Ошибка декодирования JSON") except KeyError as e: print(f"[{cam_id}] Отсутствует ключ в ответе: {str(e)}") return None def check_stream(manifest_url): cap = cv2.VideoCapture(manifest_url) if not cap.isOpened(): return False success_count = 0 try: for _ in range(STREAM_CHECK_FRAMES): ret, _ = cap.read() if ret: success_count += 1 else: break finally: cap.release() return success_count >= MIN_SUCCESS_FRAMES def save_preview(manifest_url, cam_id): cap = cv2.VideoCapture(manifest_url) if not cap.isOpened(): return False try: ret, frame = cap.read() if ret: frame = cv2.resize(frame, PREVIEW_SIZE) preview_path = os.path.join(PREVIEW_FOLDER, f"{cam_id}.jpg") cv2.imwrite( preview_path, frame, [int(cv2.IMWRITE_JPEG_QUALITY), JPEG_QUALITY] ) return True finally: cap.release() return False def process_cameras(): os.makedirs(PREVIEW_FOLDER, exist_ok=True) valid_cameras = [] for cam_id in range(START_CAM_ID, END_CAM_ID + 1): print(f"Проверка камеры #{cam_id}...") camera = get_camera_data(cam_id) if not camera: continue if not check_stream(camera['manifest_url']): print(f"Камера {cam_id} имеет нерабочий поток") continue if save_preview(camera['manifest_url'], camera['id']): valid_cameras.append(camera) print(f"Камера {cam_id} успешно добавлена") else: print(f"Ошибка сохранения превью для {cam_id}") with open(MANIFEST_FILE, 'w', encoding='utf-8') as f: json.dump(valid_cameras, f, ensure_ascii=False, indent=4) print(f"\nОбработка завершена! Найдено рабочих камер: {len(valid_cameras)}") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Парсер для обработки камер.") parser.add_argument('--start_cam_id', type=int, default=DEFAULT_START_CAM_ID, help="Начальный ID камеры") parser.add_argument('--end_cam_id', type=int, default=DEFAULT_END_CAM_ID, help="Конечный ID камеры") parser.add_argument('--preview_folder', type=str, default=DEFAULT_PREVIEW_FOLDER, help="Папка для сохранения превью") parser.add_argument('--manifest_file', type=str, default=DEFAULT_MANIFEST_FILE, help="Файл для сохранения манифеста") parser.add_argument('--request_timeout', type=int, default=DEFAULT_REQUEST_TIMEOUT, help="Таймаут для HTTP-запросов") parser.add_argument('--stream_check_frames', type=int, default=DEFAULT_STREAM_CHECK_FRAMES, help="Количество кадров для проверки потока") parser.add_argument('--min_success_frames', type=int, default=DEFAULT_MIN_SUCCESS_FRAMES, help="Минимальное количество успешных кадров") parser.add_argument('--preview_size', type=int, nargs=2, default=DEFAULT_PREVIEW_SIZE, help="Размер превью (ширина высота)") parser.add_argument('--jpeg_quality', type=int, default=DEFAULT_JPEG_QUALITY, help="Качество сжатия JPEG") args = parser.parse_args() START_CAM_ID = args.start_cam_id END_CAM_ID = args.end_cam_id PREVIEW_FOLDER = args.preview_folder MANIFEST_FILE = args.manifest_file REQUEST_TIMEOUT = args.request_timeout STREAM_CHECK_FRAMES = args.stream_check_frames MIN_SUCCESS_FRAMES = args.min_success_frames PREVIEW_SIZE = tuple(args.preview_size) JPEG_QUALITY = args.jpeg_quality process_cameras()