diff --git a/offline/pgfutils/CMakeLists.txt b/offline/pgfutils/CMakeLists.txt index e7e4a4f..c9d6309 100644 --- a/offline/pgfutils/CMakeLists.txt +++ b/offline/pgfutils/CMakeLists.txt @@ -6,10 +6,11 @@ # For details see the accompanying COPYING-CMAKE-SCRIPTS file. cmake_minimum_required(VERSION 3.1.0) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 11) project(pgfutils) -find_package (Qt5 COMPONENTS Core Gui REQUIRED) +find_library(SQLITE3_LIB NAMES sqlite3 libsqlite3 REQUIRED) +find_package(Qt5 COMPONENTS Core Gui REQUIRED) set(libpgfutils_SRCS pgfutils.cpp @@ -24,3 +25,6 @@ set(libpgfutils_SRCS add_library(pgfutils ${libpgfutils_SRCS}) target_link_libraries(pgfutils Qt5::Core Qt5::Gui) target_include_directories(pgfutils PUBLIC libpgf) + +add_executable(digikam_extract_thumbs digikam_extract_thumbs.cpp) +target_link_libraries(digikam_extract_thumbs pgfutils ${SQLITE3_LIB}) diff --git a/offline/pgfutils/digikam_extract_thumbs.cpp b/offline/pgfutils/digikam_extract_thumbs.cpp new file mode 100644 index 0000000..8042114 --- /dev/null +++ b/offline/pgfutils/digikam_extract_thumbs.cpp @@ -0,0 +1,67 @@ +#include "pgfutils.h" +#include "sqlite3.h" + +#include +#include +#include +#include + +void usage() { + std::cerr << "Usage: digikam_extract_thumbs /path/to/thumbnails-digikam.db /path/to/output/folder\n"; +} + +sqlite3* open_db(std::string path) { + sqlite3 *db; + if(auto retval = sqlite3_open(path.c_str(), &db)) { + std::ostringstream s; + s << "Can't open database " << path << ": " << sqlite3_errmsg(db) << std::endl; + throw std::runtime_error(s.str()); + } + return db; +} + +int main(int argc, char* argv[]) { + if(argc != 3) { + std::cerr << "Incorrect amount of arguments.\n"; + usage(); + exit(1); + } + + std::string sqlite_path(argv[1]); + std::string output_path(argv[2]); + + auto db = open_db(sqlite_path); + + std::string query = "SELECT UniqueHashes.uniqueHash, Thumbnails.data FROM Thumbnails INNER JOIN UniqueHashes ON Thumbnails.id=UniqueHashes.thumbId;"; + + sqlite3_stmt *stmt; + sqlite3_prepare_v2(db, query.c_str(), query.length(), &stmt, 0); + int result = sqlite3_step(stmt); + int i = 0; + while(result == SQLITE_ROW) { + const std::string unique_hash((const char*)sqlite3_column_text(stmt, 0)); + int size = sqlite3_column_bytes(stmt, 1); + const char* data_start = static_cast(sqlite3_column_blob(stmt, 1)); + const char* data_end = data_start + size; + //std::vector data(data_start, data_end); + QByteArray qdata(data_start, size); + QImage thumb; + if(readPGFImageData(qdata, thumb, false)) { + auto filename = output_path + "/" + unique_hash + ".jpg"; + //std::cout << i << ": " << unique_hash << ": " << size << " bytes -> " << filename << std::endl; + thumb.save(QString::fromStdString(filename)); + } else { + throw std::runtime_error("Failed to read PGF image.\n"); + } + + result = sqlite3_step(stmt); + i++; + + if(i % 100 == 0) { + std::cout << i << "\n"; + } + } + + std::cout << "Done (" << i << " total)\n"; + sqlite3_close(db); +} diff --git a/public/home_db/digikam4.db b/public/home_db/digikam4.db new file mode 100644 index 0000000..e34c74a Binary files /dev/null and b/public/home_db/digikam4.db differ diff --git a/src/index.js b/src/index.js index 51f1c91..fc725b5 100644 --- a/src/index.js +++ b/src/index.js @@ -60,7 +60,7 @@ const TestDBFetch = ({ sqlite_file }) => ( {error && } {done && } {done && } - {done && } + {/*done && */} )} @@ -85,7 +85,7 @@ ReactDOM.render(

IndexedDB playground:

Test DB fetching:

- + , document.getElementById('root') );