Files
utun2/tools/chatgui/src/media_preview_cache.h
T

41 lines
3.2 KiB
C++

/* Локальные превью вложений: первый кадр видео и уменьшенные JPEG/PNG.
* Cache::load/prune выполняют I/O и декодирование: вызывать только в worker. Один Cache безопасен для двух workers.
* Запись <SHA-256>.preview: UTNPREV1 (8 байт), время создания UTC мс (int64 little endian), затем JPEG/PNG.
* Чтение не продлевает срок. Очистка удаляет только собственные записи старше семи суток, оригиналы не меняются.
* RAM ограничена 32 MiB; публикация через QSaveFile, очистка и чтение/запись сериализованы mutex. */
#pragma once
#include <QCache>
#include <QImage>
#include <QMutex>
#include <QString>
namespace MediaPreviewCache {
constexpr int MaxSide = 600;
constexpr qint64 LifetimeMs = 7LL * 24 * 60 * 60 * 1000;
enum class Kind { Image, Video };
enum class Origin { Generated, Memory, Disk };
struct Result {
QImage image; // Готовые пиксели <=600 по длинной стороне; пусто при ошибке исходника.
QString file, error; // Путь записи кеша и причина ошибки; ошибка записи кеша не мешает вернуть image.
qint64 created = 0; // Неизменное время создания, UTC мс.
Origin origin = Origin::Generated; // Откуда получен результат; полезно для диагностики и проверок.
bool retryable = false; // Исходник изменился во время подготовки: можно повторить с новым fingerprint.
};
struct Pruned {
int removed = 0, errors = 0; // Удалённые записи и ошибки чтения/удаления.
qint64 bytes = 0; // Освобождённые байты на диске.
};
class Cache {
public:
explicit Cache(const QString& directory); // Только сохраняет directory; каталог создаётся в worker.
// Проверяет path/size/mtime/kind; читает RAM/диск либо создаёт превью. now=0 — текущее UTC; другое значение удобно для теста TTL.
Result load(const QString& path, Kind kind, qint64 now = 0);
Pruned prune(qint64 now = 0); // Чистит записи строго старше LifetimeMs, включая просроченные элементы RAM.
private:
struct Entry { QImage image; qint64 created; }; // Shared QImage и дата создания, не дата обращения.
QString m_directory; // Отдельный каталог профиля; файлы вне него не затрагиваются.
QMutex m_mutex; // Защищает RAM, публикацию и удаление; декодирование исходников идёт вне lock.
QCache<QString, Entry> m_memory{32 * 1024 * 1024}; // Ключ — fingerprint исходника, стоимость — размер decoded pixels.
};
}