<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=449489&amp;view=findpost&amp;p=3908770</guid>
        <pubDate>Mon, 19 Aug 2024 00:55:44 +0000</pubDate>
        <title>Скрипт на Python при работе выводит сообщения о ошибках</title>
        <link>https://forum.sources.ru/index.php?showtopic=449489&amp;view=findpost&amp;p=3908770</link>
        <description><![CDATA[rownong@yandex.ru: Здравствуйте.<br>
Есть скрипт на питоне, который делает:<br>
- Оформление конспекта в разметку (формат) Notion.<br>
- Добавление в конспект изображений / скриншотов видео рядом с временными метками тезисов.<br>
Скрипт работает. Но при работе выводит сообщения о обшибках. На результат не влияет, но хотел бы убрать. Подскажите как сделать (или отредактируйте код)?<br>
<br>
<a class='tag-url' href='https://postimg.cc/0zmPZ6bh' target='_blank'><img class='tag-img' src='https://i.postimg.cc/0zmPZ6bh/2024-08-19-03-51-43.jpg' alt='user posted image'></a><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import cv2</div><div class="code_line">import requests</div><div class="code_line">import os</div><div class="code_line">import re</div><div class="code_line">&nbsp;</div><div class="code_line"># Функция для извлечения кадра из видео</div><div class="code_line">def extract_frame(video_path, timestamp, output_image_path):</div><div class="code_line">&nbsp;&nbsp; &nbsp;cap = cv2.VideoCapture(video_path)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not cap.isOpened():</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;raise Exception(&quot;Не удалось открыть видеофайл.&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fps = cap.get(cv2.CAP_PROP_FPS)</div><div class="code_line">&nbsp;&nbsp; &nbsp;frame_number = int(fps * timestamp)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret, frame = cap.read()</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ret:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.imwrite(output_image_path, frame)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;print(f&quot;Изображение сохранено в {output_image_path}&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;else:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;raise Exception(&quot;Не удалось извлечь кадр из видео.&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;cap.release()</div><div class="code_line">&nbsp;</div><div class="code_line"># Функция для добавления временной метки на изображение (в правый нижний угол)</div><div class="code_line">def add_timestamp_to_image(image_path, timestamp):</div><div class="code_line">&nbsp;&nbsp; &nbsp;image = cv2.imread(image_path)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if image is None:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;raise Exception(f&quot;Не удалось загрузить изображение по пути: {image_path}&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;# Форматирование временной метки (без миллисекунд)</div><div class="code_line">&nbsp;&nbsp; &nbsp;formatted_timestamp = &quot;{:02}:{:02}:{:02}&quot;.format(int(timestamp // 3600),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int((timestamp % 3600) // 60),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int(timestamp % 60))</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;# Параметры текста</div><div class="code_line">&nbsp;&nbsp; &nbsp;font = cv2.FONT_HERSHEY_SIMPLEX</div><div class="code_line">&nbsp;&nbsp; &nbsp;font_scale = 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;font_color = (0, 0, 0) &nbsp;# Черный цвет текста</div><div class="code_line">&nbsp;&nbsp; &nbsp;thickness = 2</div><div class="code_line">&nbsp;&nbsp; &nbsp;line_type = cv2.LINE_AA</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;# Позиция текста в правом нижнем углу</div><div class="code_line">&nbsp;&nbsp; &nbsp;(text_width, text_height), baseline = cv2.getTextSize(formatted_timestamp, font, font_scale, thickness)</div><div class="code_line">&nbsp;&nbsp; &nbsp;position = (image.shape[1] - text_width - 10, image.shape[0] - text_height - 10)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;# Нанесение текста на изображение</div><div class="code_line">&nbsp;&nbsp; &nbsp;cv2.putText(image, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;formatted_timestamp, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;font, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;font_scale, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;font_color, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thickness, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;line_type)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;# Сохранение изображения с временной меткой</div><div class="code_line">&nbsp;&nbsp; &nbsp;output_image_with_timestamp = image_path.replace(&quot;.jpg&quot;, &quot;_with_timestamp.jpg&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;cv2.imwrite(output_image_with_timestamp, image)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return output_image_with_timestamp</div><div class="code_line">&nbsp;</div><div class="code_line"># Функция для загрузки изображения на Imageban</div><div class="code_line">def upload_to_imageban(image_path, secret_key):</div><div class="code_line">&nbsp;&nbsp; &nbsp;url = &quot;https://api.imageban.ru/v1&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;headers = {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Authorization&#39;: f&#39;Bearer {secret_key}&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;with open(image_path, &#39;rb&#39;) as image_file:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;files = {&#39;image&#39;: image_file}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;response = requests.post(url, headers=headers, files=files)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if response.status_code == 200:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data = response.json()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if data.get(&#39;success&#39;):</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return data[&#39;data&#39;][&#39;link&#39;]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise Exception(&quot;Не удалось получить ссылку на изображение.&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise Exception(f&quot;Ошибка при загрузке изображения: {response.status_code} - {response.text}&quot;)</div><div class="code_line">&nbsp;</div><div class="code_line"># Функция для преобразования временной метки в секунды</div><div class="code_line">def time_to_seconds(time_str):</div><div class="code_line">&nbsp;&nbsp; &nbsp;hours, minutes, seconds_milliseconds = time_str.split(&#39;:&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;minutes, seconds_milliseconds = minutes, seconds_milliseconds.replace(&#39;,&#39;, &#39;.&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;seconds, milliseconds = seconds_milliseconds.split(&#39;.&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;total_seconds = int(hours) * 3600 + int(minutes) * 60 + float(seconds) + float(milliseconds) / 1000</div><div class="code_line">&nbsp;&nbsp; &nbsp;return total_seconds</div><div class="code_line">&nbsp;</div><div class="code_line"># Текст конспекта</div><div class="code_line">text = &quot;&quot;&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;details&#62;&#60;summary&#62;&#60;strong&#62;1. Введение&#60;/strong&#62;&#60;/summary&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">- **Запуск проекта**: Проект официально запущен, инициирующий документ составлен, подписан и опубликован. [00:00:00,000 --&#62; 00:00:08,099]</div><div class="code_line">- **Назначение руководителя проекта**: Если вас назначили руководителем проекта, вам нужно принять эту роль и ответственность. [00:00:08,099 --&#62; 00:00:13,140]</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;/details&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;details&#62;&#60;summary&#62;&#60;strong&#62;2. Принятие ответственности&#60;/strong&#62;&#60;/summary&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">- **Роль руководителя проекта**: Теперь вы несете ответственность за весь проект. Важно осознать это и начать предпринимать конкретные действия по управлению проектом. [00:00:14,119 --&#62; 00:00:20,980]</div><div class="code_line">&nbsp;</div><div class="code_line">- **Действия руководителя**:</div><div class="code_line">&nbsp;&nbsp;- Определение круга заинтересованных лиц проекта. [00:00:20,980 --&#62; 00:00:29,199]</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;/details&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;details&#62;&#60;summary&#62;&#60;strong&#62;3. Определение заинтересованных лиц&#60;/strong&#62;&#60;/summary&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">- **Кто такие заинтересованные лица?**:</div><div class="code_line">&nbsp;&nbsp;1. **Люди или организации, которые могут повлиять на результаты проекта или на проект в целом**.</div><div class="code_line">&nbsp;&nbsp;2. **Люди или организации, на кого результаты проекта или сам проект могут повлиять**.</div><div class="code_line">&nbsp;&nbsp;3. **Те, кто считает, что проект или его результаты могут на них повлиять**. [00:00:29,199 --&#62; 00:01:09,599]</div><div class="code_line">&nbsp;</div><div class="code_line">- **Пример: Проект &quot;Свадьба&quot;**:</div><div class="code_line">&nbsp;&nbsp;- Заинтересованные лица: жених, невеста, родители жениха и невесты. [00:01:18,459 --&#62; 00:01:32,459]</div><div class="code_line">&nbsp;</div><div class="code_line">- **Задачи руководителя проекта**:</div><div class="code_line">&nbsp;&nbsp;1. Встретиться с заинтересованными лицами и выяснить возможный круг всех заинтересованных сторон проекта. [00:01:38,900 --&#62; 00:01:48,359]</div><div class="code_line">&nbsp;&nbsp;2. В результате встречи можно выявить дополнительные заинтересованные стороны:</div><div class="code_line">&nbsp;&nbsp; &nbsp; - Начальники жениха и невесты.</div><div class="code_line">&nbsp;&nbsp; &nbsp; - Про бабушка жениха.</div><div class="code_line">&nbsp;&nbsp; &nbsp; - Компания по прокату свадебных лимузинов.</div><div class="code_line">&nbsp;&nbsp; &nbsp; - ЗАГС. [00:01:48,359 --&#62; 00:02:39,520]</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;/details&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;details&#62;&#60;summary&#62;&#60;strong&#62;4. Ключевые заинтересованные стороны в компании&#60;/strong&#62;&#60;/summary&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">- **Основные заинтересованные стороны проекта в организации**:</div><div class="code_line">&nbsp;&nbsp;1. Руководитель проекта.</div><div class="code_line">&nbsp;&nbsp;2. Куратор проекта.</div><div class="code_line">&nbsp;&nbsp;3. Заказчик проекта.</div><div class="code_line">&nbsp;&nbsp;4. Проектный офис.</div><div class="code_line">&nbsp;&nbsp;5. Команда проекта.</div><div class="code_line">&nbsp;&nbsp;6. Команда управления проектом. [00:02:39,520 --&#62; 00:03:07,960]</div><div class="code_line">&nbsp;</div><div class="code_line">- **Значение влияния**:</div><div class="code_line">&nbsp;&nbsp;- Влияние заинтересованных сторон на достижение результатов проекта.</div><div class="code_line">&nbsp;&nbsp;- Определение требований заинтересованных сторон для нивелирования их негативного влияния на успешность проекта. [00:03:07,960 --&#62; 00:03:34,200]</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;/details&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;details&#62;&#60;summary&#62;&#60;strong&#62;5. Широкий круг заинтересованных сторон&#60;/strong&#62;&#60;/summary&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">- **Дополнительные заинтересованные стороны**:</div><div class="code_line">&nbsp;&nbsp;- Пользователи продукта.</div><div class="code_line">&nbsp;&nbsp;- Конкуренты.</div><div class="code_line">&nbsp;&nbsp;- Управляющий комитет проекта. [00:04:00,259 --&#62; 00:04:26,519]</div><div class="code_line">&nbsp;</div><div class="code_line">- **Итог**: Список заинтересованных сторон можно увидеть на соответствующем слайде. [00:04:23,899 --&#62; 00:04:26,519]</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;/details&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&quot;&quot;&quot;</div><div class="code_line">&nbsp;</div><div class="code_line"># Регулярное выражение для извлечения временных меток</div><div class="code_line">pattern = r&#39;\[(\d{2}:\d{2}:\d{2},\d{3}) --&#62; (\d{2}:\d{2}:\d{2},\d{3})\]&#39;</div><div class="code_line">matches = re.findall(pattern, text)</div><div class="code_line">&nbsp;</div><div class="code_line"># Создаем словарь временных меток и файлов изображений</div><div class="code_line">timestamps = {}</div><div class="code_line">image_counter = 1</div><div class="code_line">for start, end in matches:</div><div class="code_line">&nbsp;&nbsp; &nbsp;timestamp = f&quot;{start} --&#62; {end}&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;image_filename = f&quot;image{image_counter}.jpg&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;timestamps[timestamp] = image_filename</div><div class="code_line">&nbsp;&nbsp; &nbsp;image_counter += 1</div><div class="code_line">&nbsp;</div><div class="code_line"># Путь к папке для сохранения изображений</div><div class="code_line">image_folder = &#39;/content/images/&#39;</div><div class="code_line">os.makedirs(image_folder, exist_ok=True)</div><div class="code_line">&nbsp;</div><div class="code_line"># Задаем параметры</div><div class="code_line">video_path = &#39;/content/drive/My Drive/Google Colaboratory/Файлы для Whisper AI/1.4.1.1 Инициация проекта. Модуль Определение заинтересованных сторон проекта.mp4&#39;</div><div class="code_line">secret_key = &#39;2tNBojRYkW4Nbj588bZr8ZPGmY9dM7vUvY0&#39;</div><div class="code_line">&nbsp;</div><div class="code_line"># Извлечение кадров, добавление меток и загрузка на Imageban</div><div class="code_line">image_links = {}</div><div class="code_line">for timestamp, image_filename in timestamps.items():</div><div class="code_line">&nbsp;&nbsp; &nbsp;try:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;start_time_str = timestamp.split(&#39; --&#62; &#39;)[0]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;total_seconds = time_to_seconds(start_time_str)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;image_path = os.path.join(image_folder, image_filename)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;extract_frame(video_path, total_seconds, image_path)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;image_with_timestamp = add_timestamp_to_image(image_path, total_seconds)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;image_link = upload_to_imageban(image_with_timestamp, secret_key)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;image_links[timestamp] = image_link</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;# Отображение изображения с временной меткой</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;img = cv2.imread(image_with_timestamp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.imshow(f&quot;Image with Timestamp: {timestamp}&quot;, img)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.waitKey(0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.destroyAllWindows()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;except Exception as e:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;print(f&quot;Ошибка для временной метки {timestamp}: {e}&quot;)</div><div class="code_line">&nbsp;</div><div class="code_line"># Замена временных меток на ссылки в тексте</div><div class="code_line">for timestamp, link in image_links.items():</div><div class="code_line">&nbsp;&nbsp; &nbsp;formatted_link = f&quot;[{timestamp}] ![{timestamp}]({link})&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;text = text.replace(f&quot;[{timestamp}]&quot;, formatted_link)</div><div class="code_line">&nbsp;</div><div class="code_line">print(&quot;Обновленный текст с ссылками на изображения:&quot;)</div><div class="code_line">print(text)</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>rownong@yandex.ru</author>
        <category>Python</category>
      </item>
	
      </channel>
      </rss>
	