SMM-агентства и продакшн-команды ежедневно работают с сотнями медиаматериалов: фото для ленты, видео для Reels и YouTube, backstage-контент и сторис.
Файлы поступают с разных устройств — смартфонов, камер, дронов — и в итоге смешиваются в одну папку с хаотичными именами вроде IMG_0231.MOV, DCIM_100MEDIA, WhatsApp Images.
Разобраться в этом вручную невозможно: на сортировку уходит 5–6 часов в неделю у каждого контент-менеджера. Именно с этой болью в нашу компанию Coders Club After-AI обратился заказчик — SMM-агентство, работающее с несколькими десятками брендов.
Проблема
Две основные боли медиа-отделов:
- Смешение вертикальных и горизонтальных материалов. Вертикальные видео нужны для Reels и TikTok, горизонтальные — для YouTube, но без сортировки всё попадает в одну папку.
- Свалка файлов с разных устройств. Фотоаппараты, смартфоны и видеокамеры сохраняют разный формат метаданных, а иногда не указывают время или локацию вовсе.
Задача
Создать настольное приложение для macOS и Windows, которое:
- автоматически сортирует фото и видео по ориентации (вертикальные / горизонтальные),
- группирует по локации и времени съёмки,
- различает устройства (iPhone, Canon, Sony и т.д.),
- разбивает по папкам, создавая удобную структуру.
Решение
Наш тим-лид и ко-фаундер студии Coders Club After-AI Александр Шаман расскажет про реализацию проекта.
Мы начали проект с создания MVP, который сразу был полезен заказчику. Затем был выбран простейший стек Python + PyInstaller + Tkinter (GUI) для кроссплатформенности и скорости разработки.
С помощью AI-оркестра — Grok, Codex и ChatGPT — мы собрали рабочий прототип за 2 часа. Этот MVP сразу передали заказчику для проверки сценариев и составления листа корректировок.
За следующие 20 часов мы полностью завершили приложение: добавили GUI, автоматическую сортировку по EXIF и видео-метаданным, поддержку macOS и Windows.
Оставшиеся часы ушли на тестирование и лёгкую доработку интерфейса.
Метаданные извлекались через:
- Pillow (PIL) — для фото (EXIF: ширина, высота, GPS, камера);
- FFmpeg / ffprobe — для видео;
- geopy — для обратного геокодирования (определение города по GPS).
Время и стоимость
- ⏱ Общее время разработки: 30 часов
5 ч — исследование и прототип
15 ч — разработка ядра и GUI
5 ч — тестирование
5 ч — сборка и документация - 💶 Стоимость: €1800
Результаты
- Время сортировки контента сократилось с 4–6 часов до 10–15 минут.
- Ошибки ручной классификации практически исчезли.
- Фото и видео теперь структурированы по дате, городу, устройству и ориентации.
- Приложение стало обязательным инструментом для контент-отдела.
Как работает программа
- Пользователь перетаскивает папку в окно.
- Программа считывает все файлы, извлекая EXIF-данные.
- Определяет:
ориентацию кадра (portrait / landscape);
время съёмки;
координаты и город;
устройство съёмки. - Создаёт папки по схеме:
Архитектура
Пример кода: определение ориентации и локации
from PIL import Image, ExifTags
import os, piexif
from geopy.geocoders import Nominatim
def get_location(exif):
gps = exif.get("GPSInfo")
if not gps: return "unknown"
lat = gps[2][0][0] / gps[2][0][1] + gps[2][1][0] / gps[2][1][1] / 60
lon = gps[4][0][0] / gps[4][0][1] + gps[4][1][0] / gps[4][1][1] / 60
locator = Nominatim(user_agent="mediasorter")
loc = locator.reverse(f"{lat}, {lon}", language="en")
return loc.raw["address"].get("city", "unknown")
def analyze_image(file):
img = Image.open(file)
width, height = img.size
orientation = "vertical" if height > width else "horizontal"
exif_data = {ExifTags.TAGS.get(k, k): v for k, v in img._getexif().items()} if img._getexif() else {}
device = exif_data.get("Model", "unknown")
location = get_location(exif_data)
return orientation, device, location
Формирование структуры каталогов
import os, shutil
from datetime import datetime
def sort_file(file, orientation, device, location, date):
base = "sorted"
folder = f"{date.strftime('%Y-%m-%d')}_{location}"
dest = os.path.join(base, folder, orientation, device.replace(' ', '_'))
os.makedirs(dest, exist_ok=True)
shutil.copy(file, dest)
print(f"✅ {file} → {dest}")
GUI (Tkinter)
Простой drag-and-drop интерфейс:
import tkinter as tk
from tkinter import filedialog
from sorter import sort_folder
def open_folder():
path = filedialog.askdirectory()
sort_folder(path)
root = tk.Tk()
root.title("Media Sorter")
tk.Button(root, text="Выбрать папку", command=open_folder).pack(padx=40, pady=40)
root.mainloop()
Сборка под macOS и Windows
- Использован PyInstaller:
pyinstaller --onefile --windowed app.py - Созданы .dmg и .exe версии.
- Приложение работает полностью оффлайн.
Пример результата
sorted/
2025-11-10_Paris/
vertical/
iPhone_15/
IMG_3301.JPG
IMG_3302.MOV
horizontal/
Canon_EOS/
DSC_1243.JPG
2025-11-12_Amsterdam/
horizontal/
Sony_A7III/
Технический результат
- Python отлично подошёл для прототипа и продакшн-версии благодаря кроссплатформенности.
- Pillow + FFmpeg покрыли 95% форматов фото и видео.
- Tkinter оказался достаточным для MVP-интерфейса.
- Приложение полностью автономное, не требует облака или базы данных.
- Код легко масштабируется под AI-тегирование или синхронизацию с Google Drive.