You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

75 lines
2.4 KiB

/* Локальное чтение медиа из целого файла или набора блоков по localAttrs.
* readRange/readAll читают доступные данные; assembleAndCleanup собирает файл и удаляет фрагменты.
* media_split_to_blocks по умолчанию удаляет исходник после разбиения; сетевую загрузку модуль не выполняет. */
#pragma once
#include <QString>
#include <QList>
#include <QFile>
#include <QJsonObject>
#include <cstdint>
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<int> 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);