From 75b66b5982020535eaf759c7c8d22c58443b2d27 Mon Sep 17 00:00:00 2001 From: simon987 Date: Sat, 15 Apr 2023 13:06:13 -0400 Subject: [PATCH] Fix #351 --- src/database/database.h | 4 +- src/main.c | 5 +++ third-party/libscan/libscan/mobi/scan_mobi.c | 39 ++++++++++++++++++++ third-party/libscan/libscan/mobi/scan_mobi.h | 5 +++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/database/database.h b/src/database/database.h index 3c61661..7afe383 100644 --- a/src/database/database.h +++ b/src/database/database.h @@ -104,14 +104,14 @@ database_iterator_t *database_create_document_iterator(database_t *db); cJSON *database_document_iter(database_iterator_t *); #define database_document_iter_foreach(element, iter) \ - for (cJSON *element = database_document_iter(iter); element != NULL; element = database_document_iter(iter)) + for (cJSON *(element) = database_document_iter(iter); (element) != NULL; (element) = database_document_iter(iter)) database_iterator_t *database_create_delete_list_iterator(database_t *db); char * database_delete_list_iter(database_iterator_t *iter); #define database_delete_list_iter_foreach(element, iter) \ - for (char *element = database_delete_list_iter(iter); element != NULL; element = database_delete_list_iter(iter)) + for (char *(element) = database_delete_list_iter(iter); (element) != NULL; (element) = database_delete_list_iter(iter)) cJSON *database_incremental_scan_begin(database_t *db); diff --git a/src/main.c b/src/main.c index ad44e72..0d15d11 100644 --- a/src/main.c +++ b/src/main.c @@ -195,6 +195,10 @@ void initialize_scan_context(scan_args_t *args) { ScanCtx.mobi_ctx.content_size = args->content_size; ScanCtx.mobi_ctx.log = log_callback; ScanCtx.mobi_ctx.logf = logf_callback; + ScanCtx.mobi_ctx.store = write_thumbnail_callback; + ScanCtx.mobi_ctx.enable_tn = args->tn_count > 0; + ScanCtx.mobi_ctx.tn_size = args->tn_size; + ScanCtx.mobi_ctx.tn_qscale = args->tn_quality; // TEXT ScanCtx.text_ctx.content_size = args->content_size; @@ -322,6 +326,7 @@ void sist2_index(index_args_t *args) { index_json(json, doc_id); cnt += 1; } + cJSON_Delete(json); } free(iterator); diff --git a/third-party/libscan/libscan/mobi/scan_mobi.c b/third-party/libscan/libscan/mobi/scan_mobi.c index 9d2c5d9..bffbae6 100644 --- a/third-party/libscan/libscan/mobi/scan_mobi.c +++ b/third-party/libscan/libscan/mobi/scan_mobi.c @@ -1,9 +1,44 @@ #include "scan_mobi.h" #include "../../third-party/libmobi/src/mobi.h" +#include "../media/media.h" #include #include "stdlib.h" +int store_cover(scan_mobi_ctx_t *ctx, document_t *doc, MOBIData *m) { + MOBIExthHeader *exth = mobi_get_exthrecord_by_tag(m, EXTH_COVEROFFSET); + + if (exth == NULL) { + return FALSE; + } + + uint32_t offset = mobi_decode_exthvalue(exth->data, exth->size); + size_t first_resource = mobi_get_first_resource_record(m); + size_t uid = first_resource + offset; + MOBIPdbRecord *record = mobi_get_record_by_seqnumber(m, uid); + + if (record == NULL || record->size < 4) { + return FALSE; + } + + scan_media_ctx_t media_ctx = { + .tn_count = TRUE, + .tn_size = ctx->tn_size, + .tn_qscale = ctx->tn_qscale, + .tesseract_lang = NULL, + .tesseract_path = NULL, + .read_subtitles = FALSE, + .max_media_buffer = 0, + .log = ctx->log, + .logf = ctx->logf, + .store = ctx->store, + }; + + store_image_thumbnail(&media_ctx, record->data, record->size, doc, "img.jpg"); + + return TRUE; +} + void parse_mobi(scan_mobi_ctx_t *ctx, vfile_t *f, document_t *doc) { MOBIData *m = mobi_init(); @@ -72,6 +107,10 @@ void parse_mobi(scan_mobi_ctx_t *ctx, vfile_t *f, document_t *doc) { APPEND_STR_META(doc, MetaContent, tex.dyn_buffer.buf); + if (ctx->enable_tn) { + store_cover(ctx, doc, m); + } + free(content_str); free(buf); text_buffer_destroy(&tex); diff --git a/third-party/libscan/libscan/mobi/scan_mobi.h b/third-party/libscan/libscan/mobi/scan_mobi.h index dd286f1..d6cc715 100644 --- a/third-party/libscan/libscan/mobi/scan_mobi.h +++ b/third-party/libscan/libscan/mobi/scan_mobi.h @@ -7,6 +7,11 @@ typedef struct { long content_size; log_callback_t log; logf_callback_t logf; + store_callback_t store; + + int tn_qscale; + int tn_size; + int enable_tn; } scan_mobi_ctx_t; void parse_mobi(scan_mobi_ctx_t *ctx, vfile_t *f, document_t *doc);