Указать актуальные пути в docker-compose.yml
Это каталог, в котором находится медиа-библиотека. Например, ваши фото и видео расположены в папках
- /home/user/Documents/video
- /home/user/Documents/images-new
- /home/user/Documents/foto2023 Тогда в docker-compose.yml нужно указать путь /home/user/Documents
Это каталог для служебных файлов:
- метаинформация о всех медиа-файлах
- кэш Можно его не указывать, тогда все эти файлы будут внутри докер-контейнера. При перезапуске контейнера они будут удалены. Это никак не затрагивает ваши фото и видео. Однако при следующем запуске сканирование медиа-библиотеки может занять много времени, так как программа анализирует все файлы.
Каталог для сохранения файлов, которые будут удалены. Аналог корзины. Обязательный параметр. Рекомендуется некоторое время хранить эти файлы, чтобы в случае ошибки можно было восстановить удаленные файлы.
TODO: нужно актуализировать весь контент ниже. Он был актуален, когда нужно было запускать скрипты вручную. Сейчас реализуется подход управления галереей через веб-интерфейс.
Набор скриптов для обработки большого количества медиафайлов.
Фичи
- возможность избавиться от дубликатов и похожих файлов,
- низкие риски удаления важных файлов (возможность работать с диском для чтения, проверки потенциально опасных операций)
- возможность автоматически скорректировать метки времени для файлов (mtime, время модификации)
- индексация для ускорения повторной обработки
- Подготовка файлов (необязательно)
- Индексация (необязательно)
- Реорганизация (формирование команд переноса файлов)
- Проверка (необязательно)
- Перенос файлов
Сначала желательно убедиться, что у файлов стоят корректные метки времени. Это важно, потому что приложения просмотра фото, типа облака mail файлы в ленте упорядочены по дате. Метки времени могут быть некорректными, если файлы были отредактированы или были скачаны из google takeout.
docker run --rm -it --name media_tools \
-v /home/user/media/files:/vt/media \
-v /home/user/media/cache:/vt/cache \
-e LOG_LEVEL=Logger::DEBUG \
-u=$UID:$UID \
vovan/media_tools ./cache_meta.sh
/home/user/media/files
содержит видео и изображения./home/user/media/cache
- в этой папке будут созданы файлы с метаданными для каждого файла.
docker run --rm -it --name media_tools \
-v /home/user/media/existing:/vt/existing \
-v /home/user/media/new:/vt/new \
-v /home/user/media/dups:/vt/dups \
-v /home/user/media/new_broken:/vt/new_broken \
-u=$UID:$UID \
vovan/media_tools ./reorganize.sh
/home/user/media/existing
- папка с файлами, которые уже есть в коллекции./home/user/media/new
- папка с новыми файлами./home/user/media/dups
- папка, куда будут перемещены дубликаты./home/user/media/new_broken
- папка, куда планируется перемещать файлы, которые не удалось обработать./home/user/media/cache
- в этой папке будут созданы файлы с метаданными для каждого файла, либо будут использованы существующие файлы.
Нужно просмотреть сгенерированный командный файл и убедиться, что он корректный.
Программа не удаляет дубликаты, а только подготавливает командный файл, в котором записаны команды перемещения дубликатов в отдельную папку папку. Это сделано для того, чтобы при наличии сомнений можно было вручную проверить, что файлы действительно дубликаты.
perceptual hash
Для сравнения файлов используется perceptual hash. Это позволяет находить дубликаты, даже если у медиа-файлов отличаются разрешения (ширина и высота), форматы (jpg, png, mp4, mov, avi, mkv, ...), битрейт, кодеки, и т.д.
ложноположительные срабатывания
В некоторых редких случаях программа может ошибаться и считать разные файлы одинаковыми. Например, оригинальное видео и сделанный из него таймлэпс программа может посчитать одинаковыми. Это связано с особенностью алгоритма сравнения видео. Или если видео-файлы имеют одинаковый размер и одинаковые первые 16 КБ данных, то программа может посчитать их одинаковыми.
Вместо генерации командного файла будет достаточно генерировать файл actions.json, и на последующих шагах читать его и выполнять действия. Можно предусмотреть ручной и автоматический перенос.
Структурирование файлов
- foto - основные фото
- fotoother - малоценные фото, например фото, уже похожие на те, что лежат в foto
- nofoto
- здоровье
- документы
- screenshots
- alien - другие люди
- deleted - удаленные файлы. При следующей синхронизации снова могут появиться файлы, которые уже были обработаны и удалены.
docker run --rm -it --name media_tools \
-v /home/user/media/existing:/vt/existing \
-v /home/user/media/new:/vt/new \
-v /home/user/media/dups:/vt/dups \
-u=$UID:$UID \
vovan/media_tools ./removedups.sh
Команда removedups.sh будет сравнивать файлы в папке existing с файлами в папке new. Если файлы совпадают по размеру и CRC, то файл из папки new будет отмечен для перемещения в папку dups (будет создан bash-файл с командами переноса, что позволяет перед переносом проинспектировать).
Ключи removedups.sh --force - сразу переносить файлы, а не создавать bash-файл.
Кажется, что нужно разделить программу на части:
- Сканирование каталогов и извлечение метаданных из файлов. Результат будет
записан в файлы data/phash/...
Если будет включен режим кеша, то также будут созданы new_files.json и existing_files.json
docker run --rm -it --name media_tools \ -v /home/user/media/existing:/vt/existing \ -v /home/user/media/new:/vt/new \ -v /home/user/media/dups:/vt/dups \ -u=$UID:$UID \ vovan/media_tools ruby ./read_meta.rb
- Сравнение файлов и формирование файла actions.json.
- Формирование командного файла для переноса файлов
- или сразу перенос файлов