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
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);
|
|
|