/* Локальное чтение медиа из целого файла или набора блоков по localAttrs. * readRange/readAll читают доступные данные; assembleAndCleanup собирает файл и удаляет фрагменты. * media_split_to_blocks по умолчанию удаляет исходник после разбиения; сетевую загрузку модуль не выполняет. */ #pragma once #include #include #include #include #include class MediaBlockReader { public: MediaBlockReader(); void initFromAttrs(const QString& mediaDir, const QString& dt, const QString& basename, const QString& suffix, const QString& ext, const QJsonObject& localAttrs, qint64 blockSize, qint64 totalSize, int totalBlocks); static MediaBlockReader fromLegacyFile(const QString& filePath); bool isValid() const { return m_valid; } bool isComplete() const { return m_complete; } bool isSingleFile() const { return m_mode == SINGLE_FILE; } bool isFragmented() const { return m_mode == FRAGMENTED; } qint64 totalSize() const { return m_totalSize; } QByteArray readAll(); QByteArray readRange(qint64 offset, qint64 size); bool seek(qint64 pos); qint64 pos() const { return m_pos; } bool atEnd() const; bool saveToFile(const QString& destPath); QString assembleAndCleanup(); QJsonObject localAttrsAfterAssembly() const; QString debugPath() const; private: enum Mode { NONE, SINGLE_FILE, FRAGMENTED }; Mode m_mode = NONE; bool m_valid = false; bool m_complete = false; qint64 m_pos = 0; QString m_filePath; qint64 m_fileSize = 0; QString m_mediaDir, m_dt, m_basename, m_suffix, m_ext; QList m_blocks; qint64 m_blockSize = 0; qint64 m_totalSize = 0; int m_totalBlocks = 0; qint64 blockSizeForN(int n) const; QString blockFilePath(int n) const; }; struct MediaBlockInfo { QString dt; QString basename; QString suffix; QString ext; int numBlocks = 0; qint64 fileSize = 0; qint64 blockSize = 0; }; qint64 media_calc_block_size(qint64 fileSize); MediaBlockInfo media_split_to_blocks(const QString& srcFile, const QString& mediaDir, bool removeSrc = true);