diff --git a/YACReaderLibrary/initial_comic_info_extractor.cpp b/YACReaderLibrary/initial_comic_info_extractor.cpp new file mode 100644 index 00000000..d275f8a6 --- /dev/null +++ b/YACReaderLibrary/initial_comic_info_extractor.cpp @@ -0,0 +1,174 @@ +#include "initial_comic_info_extractor.h" + +#include +#include "pdf_comic.h" +#include "comic.h" +#include "compressed_archive.h" +#include "qnaturalsorting.h" + +using namespace YACReader; + +bool InitialComicInfoExtractor::crash = false; + +InitialComicInfoExtractor::InitialComicInfoExtractor(QString fileSource, QString target, int coverPage) + : _fileSource(fileSource), _target(target), _numPages(0), _coverPage(coverPage), _xmlInfoData() +{ +} + +void InitialComicInfoExtractor::extract() +{ + QFileInfo fi(_fileSource); + if (!fi.exists()) //TODO: error file not found. + { + _cover.load(":/images/notCover.png"); + QLOG_WARN() << "Extracting cover: file not found " << _fileSource; + return; + } +#ifndef NO_PDF + if (fi.suffix().compare("pdf", Qt::CaseInsensitive) == 0) { +#if defined Q_OS_MAC && defined USE_PDFKIT + MacOSXPDFComic *pdfComic = new MacOSXPDFComic(); + if (!pdfComic->openComic(_fileSource)) { + delete pdfComic; + //QImage p; + //p.load(":/images/notCover.png"); + //p.save(_target); + return; + } +#elif defined USE_PDFIUM + auto pdfComic = new PdfiumComic(); + if (!pdfComic->openComic(_fileSource)) { + delete pdfComic; + return; + } +#else + Poppler::Document *pdfComic = Poppler::Document::load(_fileSource); +#endif + + if (!pdfComic) { + QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; + //delete pdfComic; //TODO check if the delete is needed + pdfComic = 0; + //QImage p; + //p.load(":/images/notCover.png"); + //p.save(_target); + return; + } +#if !defined USE_PDFKIT && !defined USE_PDFIUM + //poppler only, not mac + if (pdfComic->isLocked()) { + QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; + delete pdfComic; + return; + } +#endif + _numPages = pdfComic->numPages(); + if (_numPages >= _coverPage) { +#if defined Q_OS_MAC || defined USE_PDFIUM + QImage p = pdfComic->getPage(_coverPage - 1); //TODO check if the page is valid +#else + QImage p = pdfComic->page(_coverPage - 1)->renderToImage(72, 72); +#endif // + _cover = p; + _coverSize = QPair(p.width(), p.height()); + if (_target != "") { + QImage scaled; + if (p.width() > p.height()) //landscape?? + { + scaled = p.scaledToWidth(640, Qt::SmoothTransformation); + } else { + scaled = p.scaledToWidth(480, Qt::SmoothTransformation); + } + scaled.save(_target, 0, 75); + } else if (_target != "") { + QLOG_WARN() << "Extracting cover: requested cover index greater than numPages " << _fileSource; + //QImage p; + //p.load(":/images/notCover.png"); + //p.save(_target); + } + delete pdfComic; + } + return; + } +#endif //NO_PDF + + if (crash) { + return; + } + + CompressedArchive archive(_fileSource); + if (!archive.toolsLoaded()) { + QLOG_WARN() << "Extracting cover: 7z lib not loaded"; + crash = true; + return; + } + if (!archive.isValid()) { + QLOG_WARN() << "Extracting cover: file format not supported " << _fileSource; + } + + QList order = archive.getFileNames(); + + //Try to find embeded XML info (ComicRack or ComicTagger) + + auto infoIndex = 0; + for (auto &fileName : order) { + if (fileName.endsWith(".xml", Qt::CaseInsensitive)) { + _xmlInfoData = archive.getRawDataAtIndex(infoIndex); + break; + } + + infoIndex++; + } + + //-------------------------- + + if (_target == "None") { + return; + } + + //se filtran para obtener sólo los formatos soportados + QList fileNames = FileComic::filter(order); + _numPages = fileNames.size(); + if (_numPages == 0) { + QLOG_WARN() << "Extracting cover: empty comic " << _fileSource; + _cover.load(":/images/notCover.png"); + if (_target != "") { + _cover.save(_target); + } + } else { + if (_coverPage > _numPages) { + _coverPage = 1; + } + std::sort(fileNames.begin(), fileNames.end(), naturalSortLessThanCI); + int index = order.indexOf(fileNames.at(_coverPage - 1)); + + if (_target == "") { + if (!_cover.loadFromData(archive.getRawDataAtIndex(index))) { + QLOG_WARN() << "Extracting cover: unable to load image from extracted cover " << _fileSource; + _cover.load(":/images/notCover.png"); + } + } else { + QImage p; + if (p.loadFromData(archive.getRawDataAtIndex(index))) { + _coverSize = QPair(p.width(), p.height()); + QImage scaled; + if (p.width() > p.height()) //landscape?? + { + scaled = p.scaledToWidth(640, Qt::SmoothTransformation); + } else { + scaled = p.scaledToWidth(480, Qt::SmoothTransformation); + } + scaled.save(_target, 0, 75); + } else { + QLOG_WARN() << "Extracting cover: unable to load image from extracted cover " << _fileSource; + //p.load(":/images/notCover.png"); + //p.save(_target); + } + } + } +} + +QByteArray InitialComicInfoExtractor::getXMLInfoRawData() +{ + return _xmlInfoData; +} diff --git a/YACReaderLibrary/initial_comic_info_extractor.h b/YACReaderLibrary/initial_comic_info_extractor.h new file mode 100644 index 00000000..34879da3 --- /dev/null +++ b/YACReaderLibrary/initial_comic_info_extractor.h @@ -0,0 +1,36 @@ +#ifndef INITIALCOMICINFOEXTRACTOR_H +#define INITIALCOMICINFOEXTRACTOR_H + +#include + +namespace YACReader { +class InitialComicInfoExtractor : public QObject +{ + Q_OBJECT + +public: + InitialComicInfoExtractor(QString fileSource, QString target = "", int coverPage = 1); + +private: + QString _fileSource; + QString _target; + QString _currentName; + int _numPages; + QPair _coverSize; + QImage _cover; + int _coverPage; + static bool crash; + QByteArray _xmlInfoData; + +public slots: + void extract(); + int getNumPages() { return _numPages; } + QPixmap getCover() { return QPixmap::fromImage(_cover); } + QPair getOriginalCoverSize() { return _coverSize; } + QByteArray getXMLInfoRawData(); +signals: + void openingError(QProcess::ProcessError error); +}; +} + +#endif // INITIALCOMICINFOEXTRACTOR_H diff --git a/YACReaderLibrary/library_creator.h b/YACReaderLibrary/library_creator.h index ccb27f24..d2d7a435 100644 --- a/YACReaderLibrary/library_creator.h +++ b/YACReaderLibrary/library_creator.h @@ -67,30 +67,4 @@ signals: void updatedCurrentFolder(QModelIndex); }; -class ThumbnailCreator : public QObject -{ - Q_OBJECT - -public: - ThumbnailCreator(QString fileSource, QString target = "", int coverPage = 1); - -private: - QString _fileSource; - QString _target; - QString _currentName; - int _numPages; - QPair _coverSize; - QImage _cover; - int _coverPage; - static bool crash; - -public slots: - void create(); - int getNumPages() { return _numPages; } - QPixmap getCover() { return QPixmap::fromImage(_cover); } - QPair getOriginalCoverSize() { return _coverSize; } -signals: - void openingError(QProcess::ProcessError error); -}; - #endif