Detect modified files and update them

The old file is delete, the modified file is inserted and the existing metadata is copied over. The added date is updated to avoid new matches during the update process.
This commit is contained in:
Luis Ángel San Martín 2023-06-05 23:28:12 +02:00
parent 68ece533e1
commit 8520a29a05
2 changed files with 59 additions and 22 deletions

View File

@ -285,18 +285,23 @@ bool LibraryCreator::checkCover(const QString &hash)
return QFile::exists(_target + "/covers/" + hash + ".jpg");
}
void LibraryCreator::insertComic(const QString &relativePath, const QFileInfo &fileInfo)
QString pseudoHash(const QFileInfo &fileInfo)
{
auto _database = QSqlDatabase::database(_databaseConnection);
// Se calcula el hash del cómic
QCryptographicHash crypto(QCryptographicHash::Sha1);
QFile file(fileInfo.absoluteFilePath());
file.open(QFile::ReadOnly);
crypto.addData(file.read(524288));
file.close();
// hash Sha1 del primer 0.5MB + filesize
QString hash = QString(crypto.result().toHex().constData()) + QString::number(fileInfo.size());
return QString(crypto.result().toHex().constData()) + QString::number(fileInfo.size());
}
void LibraryCreator::insertComic(const QString &relativePath, const QFileInfo &fileInfo)
{
auto _database = QSqlDatabase::database(_databaseConnection);
QString hash = pseudoHash(fileInfo);
ComicDB comic = DBHelper::loadComic(fileInfo.fileName(), relativePath, hash, _database);
int numPages = 0;
QPair<int, int> originalCoverSize = { 0, 0 };
@ -333,6 +338,37 @@ void LibraryCreator::insertComic(const QString &relativePath, const QFileInfo &f
}
}
void LibraryCreator::replaceComic(const QString &relativePath, const QFileInfo &fileInfo, ComicDB *comic)
{
QLOG_INFO() << "Replacing comic" << relativePath;
auto _database = QSqlDatabase::database(_databaseConnection);
DBHelper::removeFromDB(comic, _database);
insertComic(relativePath, fileInfo);
QString hash = pseudoHash(fileInfo);
ComicDB insertedComic = DBHelper::loadComic(fileInfo.fileName(), relativePath, hash, _database);
auto numPages = insertedComic.info.numPages;
auto coverSize = insertedComic.info.originalCoverSize;
auto coverRatio = insertedComic.info.coverSizeRatio;
auto id = insertedComic.info.id;
auto added = insertedComic.info.added;
insertedComic.info = comic->info;
insertedComic.info.numPages = numPages;
insertedComic.info.originalCoverSize = coverSize;
insertedComic.info.coverSizeRatio = coverRatio;
insertedComic.info.id = id;
insertedComic.info.coverPage = 0;
insertedComic.info.added = QDateTime::currentSecsSinceEpoch(); // when replacing a comic, added needs to be later than modified to avoid tagging this file as modified
DBHelper::update(&(insertedComic.info), _database);
}
void LibraryCreator::update(QDir dirS)
{
auto _database = QSqlDatabase::database(_databaseConnection);
@ -541,24 +577,24 @@ void LibraryCreator::update(QDir dirS)
} else // same file
{
if (fileInfoS.isFile() && !fileInfoD->isDir()) {
// TODO_METADATA use added,
// if added < modified, do something
auto comicDB = static_cast<ComicDB *>(fileInfoD);
auto lastModified = fileInfoS.lastModified().toSecsSinceEpoch();
auto added = comicDB->info.added.toULongLong();
// copy metadata to avoid loosing it if the imported comics doesn't have it.
// DBHelper::removeFromDB(fileInfoD, _database);
// #ifdef Q_OS_MACOS
// QStringList src = _source.split("/");
// QString filePath = fileInfoS.absoluteFilePath();
// QStringList fp = filePath.split("/");
// for (int i = 0; i < src.count(); i++) {
// fp.removeFirst();
// }
// QString path = "/" + fp.join("/");
// #else
// QString path = QDir::cleanPath(fileInfoS.absoluteFilePath()).remove(_source);
// #endif
// insertComic(path, fileInfoS);
if (added > 0 && added < lastModified) {
#ifdef Q_OS_MACOS
QStringList src = _source.split("/");
QString filePath = fileInfoS.absoluteFilePath();
QStringList fp = filePath.split("/");
for (int i = 0; i < src.count(); i++) {
fp.removeFirst();
}
QString path = "/" + fp.join("/");
#else
QString path = QDir::cleanPath(fileInfoS.absoluteFilePath()).remove(_source);
#endif
replaceComic(path, fileInfoS, comicDB);
}
}
i++;
j++;

View File

@ -47,6 +47,7 @@ private:
qulonglong insertFolders(); // devuelve el id del último folder añadido (último en la ruta)
bool checkCover(const QString &hash);
void insertComic(const QString &relativePath, const QFileInfo &fileInfo);
void replaceComic(const QString &relativePath, const QFileInfo &fileInfo, ComicDB *comic);
// qulonglong insertFolder(qulonglong parentId,const Folder & folder);
// qulonglong insertComic(const Comic & comic);
bool stopRunning;