Удаление дубликатов фото с помощью python и Claude. Как я использую вайб-кодинг. cursor.. cursor. Flask.. cursor. Flask. llm.. cursor. Flask. llm. python.. cursor. Flask. llm. python. vibecoding.. cursor. Flask. llm. python. vibecoding. вайбкодинг.. cursor. Flask. llm. python. vibecoding. вайбкодинг. ИИ.. cursor. Flask. llm. python. vibecoding. вайбкодинг. ИИ. искусственный интеллект.. cursor. Flask. llm. python. vibecoding. вайбкодинг. ИИ. искусственный интеллект. Машинное обучение.. cursor. Flask. llm. python. vibecoding. вайбкодинг. ИИ. искусственный интеллект. Машинное обучение. Программирование.. cursor. Flask. llm. python. vibecoding. вайбкодинг. ИИ. искусственный интеллект. Машинное обучение. Программирование. программирование с нуля.

С развитием доступности LLM и повышением их “разумности”, люди всё чаще используют их для своих мини-проектов. Ведь намного проще сформулировать задачу модели в окне чата и получить если не сразу работающий код, то первое-второе приближение к нему.

Термин «вайб‑кодинг» в среде пользователей, хоть немного погруженных в тему ИИ, уже не нужно расшифровывать и пояснять. Кажется, людей, не использующих LLM для программирования становится все меньше и меньше.

Я также не избежал этого увлечения, а небольшой фундамент в виде Basic в школе, Pascal, Delphi в универе и макросов на VBA на работе, лишь подстегивал мой зуд делать мелкие проекты, которые могут облегчить мне жизнь, но которые так и остались бы в задумках и не были реализованы — изучать программирование серьезно просто нет времени, а результат хочется здесь и сейчас.

Началось все просто — с телеграм ботов, которые закрывали мои потребности в отдельных задачках, потом проект побольше — комментатор событий на канале (телеграм канал куда мой Home Assistant отправляет сообщения о показаниях датчиков и событиях в доме).

Ну и «вишенка» на торте — моя большая проблема и боль — архивы с фото, которые вследствие моего безалаберного поведения с копиями, превратили диски моего Nas в гигантский портфель копий, дубликатов и т. д. несколько раз приступал к ручному, полуавтоматизированному, автоматизированному поиску дубликатов, но никогда до конца не доходил — программы, которые работают с дубликатами, не полностью закрывали критерии отбора фото — некоторые дубликаты, несмотря на свою идентичность (по показаниям программы) отличались наличием и полнотой заполнения exif тегов, в некоторых не сохранились геометки, соответственно, при удалении дублей, хотелось бы сохранять более полные и качественные экземпляры.

Основная часть

Захотел я инструмент, который бы удовлетворил мои потребности в работе с дубликатами в полной мере, и единственный способ получить его — написать с помощью LLM.
Начитавшись, что Claude лучший в программировании, я пошел в свой бесплатный аккаунт и сформулировал задачу:

привет. у меня есть проблема — несколько папок с фото, причём есть фото дубликаты, однако, просто найти дублирующиеся файлы и удалить их с помощью каких то утилит или программ в лоб не получится, почему то у некоторых файлов исчезли некоторые теги в exif — самое большое проблемное — геометки, которые в некоторых файлах отсутствуют. что я бы хотел — какую то утилиту, которая анализировала 5 папок с фото, находила дублирующиеся по названию файлы, ставила их рядом и под этими фото выводила информацию — имя, размер, разрешение и всю информацию из exif, выделяя ту, которая отсутствует в этом фото, если она заполнена в других. я бы хотел после просмотра этого списка выбирать, отмечая чекбокс те фото, которые нужно удалить, и после нажатия кнопки удалить‑ удалились бы отмеченные файлы. давай поговорим, какие могут быть способы реализации такой задачи (лучше python) для обработки, а вот интерфейс, с учётом моей задачи — нужно подискутировать с тобой. также, вообще всю архитектуру реализации решения, предложи несколько вариантов, распиши плюсы — минусы каждого, я задам уточняющие вопросы и потом приступим уже к пошаговой реализации.. код пока писать не нужно, начнём с архитектуры. если нужно уточнение, можешь задавать вопросы

После небольшой переписки с Claude, уточнений, типа:

идеально. также, решение должно быть реализовано в виде докер контейнера (dockerfile и docker‑compose.yaml) для разворачивания на сервере. также уточню, что хранение папок на nas, доступ к ним идёт по samba,если это важно, учти (понимаю, что скорость будет меньше, готов обсудить, что для реализации потребуется копировать их на машину, где будет выполняться код, или монтирование их)

и т. д., я поставил точку:

давай прямое монтирование, время и место для копирования, а также синхронизация изменений в базовой папке (при удалении), мне кажется, сложнее в реализации. итак, давай окончательную архитектуру реализации, как если бы мы ставили задачу команде разработчиков ПО.

Сделал для того, чтобы при достижении лимита длины в чате (у Claude с этим печально и порой, напечатав почти весь код, он внезапно все вытирал и писал, что лимит достигнут и нужно начать новый чат) было проще вводить следующий чат в контекст, Claude выдал «ТЗ»:

Архитектура решения: Система анализа фотографий-дубликатов с обработкой EXIF-метаданных

Общее описание

Система предназначена для анализа нескольких архивов фотографий, определения дубликатов по имени файла, сравнения EXIF‑метаданных между дубликатами и выборочного удаления файлов. Система реализуется как веб‑приложение в Docker‑контейнерах с прямым доступом к сетевым хранилищам (NAS) через протокол Samba.

Технический стек

  • Язык программирования: Python 3.9+

  • Фреймворк: Flask

  • База данных: MongoDB

  • Контейнеризация: Docker + Docker Compose

  • Веб‑интерфейс: HTML5, CSS (Bootstrap 5), JavaScript (jQuery)

  • Обработка изображений: Pillow, exifread

  • Доступ к сетевым ресурсам: smbclient, cifs‑utils

Компоненты системы

1. Модуль работы с файловой системой

Назначение: Обеспечивает доступ к файлам на NAS, сканирование директорий, чтение и удаление файлов.

Ключевые функции:

  • Монтирование Samba‑ресурсов

  • Обход директорий и сбор метаданных файлов

  • Выполнение операций удаления файлов

Технические особенности:

  • Монтирование сетевых ресурсов внутри Docker‑контейнера

  • Обработка ошибок доступа к сетевым ресурсам

  • Параллельная обработка файлов с контролем нагрузки

2. Модуль обработки EXIF-метаданных

Назначение: Извлечение, декодирование и анализ EXIF‑метаданных из фотографий.

Ключевые функции:

  • Чтение всех EXIF‑тегов из файлов

  • Корректное декодирование текстовых полей

  • Преобразование специальных тегов (GPS, даты) в читаемый формат

  • Выявление различий в метаданных между дубликатами

Технические особенности:

  • Обработка разных кодировок в EXIF‑тегах

  • Извлечение геоданных и преобразование их в читаемый формат

  • Структурирование метаданных для хранения в MongoDB

3. Модуль хранения данных

Назначение: Организация хранения и поиска информации о файлах и метаданных.

Ключевые функции:

  • Сохранение информации о файлах в MongoDB

  • Сохранение структурированных EXIF‑метаданных

  • Хранение превью изображений для быстрой загрузки в интерфейсе

  • Индексирование данных для эффективного поиска дубликатов

Схема данных:

  • Коллекция файлов: информация о всех обработанных файлах

  • Коллекция групп дубликатов: связи между файлами‑дубликатами

  • Коллекция сессий анализа: информация о выполненных сессиях сканирования

4. API-сервис

Назначение: Обеспечение взаимодействия между веб‑интерфейсом и бэкенд‑системой.

Ключевые эндпоинты:

  • /api/folders — получение списка доступных папок

  • /api/scan — инициирование сканирования выбранных папок

  • /api/duplicates — получение списка найденных дубликатов

  • /api/file/{id} — получение детальной информации о файле

  • /api/delete — удаление выбранных файлов

Технические особенности:

  • REST API с JSON‑форматом данных

  • Асинхронная обработка длительных операций

  • Статусы выполнения операций

5. Веб-интерфейс

Назначение: Обеспечение пользовательского взаимодействия с системой.

Ключевые экраны:

  • Выбор папок для анализа

  • Просмотр процесса сканирования

  • Просмотр найденных дубликатов с превью и EXIF‑данными

  • Выбор файлов для удаления и подтверждение операции

Технические особенности:

  • Адаптивный дизайн с использованием Bootstrap

  • Динамическая загрузка данных через AJAX

  • Интерактивное сравнение EXIF‑метаданных с выделением различий

  • Lightbox для просмотра увеличенных изображений

6. Система контейнеризации

Назначение: Обеспечение развертывания и управления компонентами системы.

Компоненты:

  • Dockerfile для создания образа приложения

  • docker‑compose.yaml для оркестрации контейнеров

  • Скрипты для инициализации и управления

Потоки данных и процессы

Процесс сканирования и анализа:

  1. Пользователь выбирает папки для анализа в веб‑интерфейсе

  2. Система монтирует необходимые сетевые ресурсы (если требуется)

  3. Выполняется сканирование файлов и извлечение метаданных

  4. Данные группируются по имени файла для выявления дубликатов

  5. Для каждой группы дубликатов выполняется анализ различий в EXIF

  6. Генерируются превью для отображения в интерфейсе

  7. Результаты сохраняются в MongoDB для быстрого доступа

Процесс просмотра и удаления:

  1. Пользователь просматривает группы дубликатов

  2. Система отображает превью файлов и различия в EXIF‑метаданных

  3. Пользователь отмечает файлы для удаления

  4. Система запрашивает подтверждение операции

  5. После подтверждения выполняется удаление файлов

  6. Обновляется база данных с учетом выполненных операций

Развертывание и запуск

Требования к системе:

  • Docker Engine 20.10+

  • Docker Compose 2.0+

  • Доступ к сетевым ресурсам через Samba

  • 4 ГБ RAM или более (в зависимости от объема обрабатываемых данных)

Процесс развертывания:

  1. Клонирование репозитория

  2. Настройка переменных окружения для доступа к сетевым ресурсам

  3. Запуск системы через Docker Compose

  4. Доступ к веб‑интерфейсу через браузер на порту 5000

Обработка ошибок и устойчивость

  • Обработка ошибок доступа к сетевым ресурсам

  • Восстановление после прерывания процесса сканирования

  • Логирование всех операций и ошибок

  • Контрольные точки при обработке больших объемов данных

Планы развития системы

  • Добавление дополнительных алгоритмов поиска дубликатов (по содержимому, хешу)

  • Функция объединения метаданных из разных версий одного файла

  • Статистика и аналитика по архивам фотографий

  • Интеграция с системами организации фотоархивов

Я попросил сделать MVP — выбор папок, монтирование, поиск дубликатов и вывод списка дубликатов на странице. С первого раза от Claude я сразу получил «горку» файлов, начиная с dockerfile и заканчивая шаблонами html для вывода, описание структуры проекта. Загрузив на сервер в Proxmox, собрал контейнер и зашел на страницу приложения — все заработало с первого раза, монтирование, поиск и вывод(!). Далее были три недели почти ежевечерних митингов с «командой разработчиков». В общей сложности (сейчас подсчитал) у меня 14 диалогов с Клодом, так как из‑за величины проекта, больше одного запроса сделать не получалось — сразу лимит на длину чата отгребал.

Да, были ошибки (порядка 6–7), где не так отрабатывалась какая‑то функция, но продвижение проекта было налицо, каждый спринт я получал какое то улучшение функционала. Очень помог инструмент Github to plainText, позволяющий запихнуть в один файл весь код проекта, довольно сложной структуры.

Последний спринт сделал с помощью Cursor, решил попробовать, так сказать самую последнюю технологию вайб‑кодинга. Интересно, что мне оказалась доступна модельClaude 3.7 без подписки и ввода каких то ключей ). Указав в качестве контекста основные папки проекта, я попросил добавить функцию удаления файлов — последнюю, которую необходимо было для минимально неоходимого функционала. Чем не понравился Cursor (может я недостаточно акцентировал его «внимание» в запросе, он сразу начал делать рефакторинг, исправлять ненайденные мной, но видимые моделью ошибки и т. д., по итогу, вместо простой добавки простой функции, у меня ушло еще несколько итераций в Cursor, потому что, исправляя одно, он забыл добавить нормальную обработку удаления. В конечном итоге, код заработал, как я ожидал, и финально я попросил сгенерировать readme.md для оформления репозитория на Github, что модель успешно и сделала (правда, для сокращения передаваемого контекста, я не включил в обработку папку docker, поэтому, модель сгенерировала readme с описанием разворачивания через venv).

Итоги и выводы:

Несмотря на то, что до идеала проекта еще далеко, и с первого раза не все получалось идеально, да и не все функции работают, как хотел я (выделение цветом отличий по exif), все равно — использование LLM для реализации своих тайных желаний задумок, лично мне очень зашло.

То, от реализации чего я раньше отмахивался, ибо учить программирование (минимум один язык, технологии фронтенда, бэкенда, развертывания и т. д.) я бы точно не стал,теперь становится доступным и дает возможность буквально в несколько шагов получить результат.

Claude хорош, я такой же начальный запрос отправил в ChatGPT, даже начало ответа показало мне, что будет сложнее.

Да, возможно, для искушенных в программировании специалистов, мои «открытия» покажутся недалекими, но для меня это реальный шанс делать удобные инструменты под мои запросы, пусть кривые‑косые, но если есть результат, так ли это важно?

P. S. да, если интересно, код проекта тут. Спасибо за внимание.

Автор: ktibr0

Источник

Рейтинг@Mail.ru
Rambler's Top100