diff --git a/src/module/module_repo.c b/src/module/module_repo.c index ad0a0277503b39be654eb95780f457502d6519b8..f6ec21bac660c530a10d8b8665f8e550236ddaa5 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -42,6 +42,7 @@ struct kara { int update_count; volatile sqlite3 *db; struct module_repo_internal *repo; + size_t kara_dir_len; long id; long unix_timestamp; struct kara_metadata mdt; @@ -68,9 +69,8 @@ struct module_repo_internal { /* Craft a filename for newly downloaded karas. Arguments: * - str: the destination string, the prefix, i.e. the kara_dir, is already here - * - len: the length of the string, not its size (which is PATH_MAX) * - kara: the kara structure, which contains all the data to create the filename */ - void (*craft_filename)(char str[PATH_MAX], size_t, struct kara *); + void (*craft_filename)(char str[PATH_MAX], struct kara *); /* Worker threads */ // *INDENT-OFF* @@ -129,19 +129,19 @@ __mkdir(const char *dir, unsigned int umask) } static inline void -__craft_filename_obfuscate(char str[PATH_MAX], size_t len, struct kara *kara) +__craft_filename_obfuscate(char str[PATH_MAX], struct kara *kara) { /* Obfuscate filename */ - safe_snprintf(str + len, PATH_MAX - len, "%ld.mkv", kara->id); + safe_snprintf(str, PATH_MAX, "%s%ld.mkv", kara->database_filepath, kara->id); } static inline void -__craft_filename_non_obfuscate(char str[PATH_MAX], size_t len, struct kara *kara) +__craft_filename_non_obfuscate(char str[PATH_MAX], struct kara *kara) { /* Not obfuscate filename, need to create directories, won't fail if not * possible. The program will fail later, when write will be attempted. */ - len += safe_snprintf(str + len, PATH_MAX - len, "%s/%s/%s/", kara->mdt.category, - kara->mdt.language, kara->mdt.author_name); + size_t len = safe_snprintf(str, PATH_MAX, "%s%s/%s/%s/", kara->database_filepath, + kara->mdt.category, kara->mdt.language, kara->mdt.author_name); __mkdir(str, 0); if (access(str, R_OK | W_OK)) LOG_ERROR("REPO", "No access in read / write for folder %s", str); @@ -311,7 +311,7 @@ __handle_got_json_dl(struct kara *kara, int current_id) safe_snprintf(kara->url, LKT_LINE_MAX, kara->repo->get_id_file, kara->id); - LOG_INFO("REPO", "Start downloading kara %ld to %s", kara->id, kara->filename); + LOG_INFO("REPO", "Start downloading kara %ld to: %s", kara->id, kara->filename); if (__download_kara(kara->url, kara->filename, true)) { LOG_WARN("REPO", "Could not download kara %ld at path '%s'", kara->id, kara->filename); @@ -383,13 +383,19 @@ __handle_got_json_internal_callback(const char *key, const char *val, int comp, int current_id = 0; /* Timestamp and presence verification */ - if (!database_get_kara_path(kara->db, kara->id, kara->database_filepath)) + kara->repo->craft_filename(kara->filename, kara); + LOG_DEBUG("REPO", "Generated filepath for kara %ld is: %s", kara->id, kara->filename); + if (!database_get_kara_path(kara->db, kara->id, kara->filename)) { + kara->repo->craft_filename(kara->filename, kara); goto do_it; + } /* Override calculated filename if it exists */ size_t db_fp_size = (strlen(kara->database_filepath) + 1) * sizeof(char); memcpy(kara->filename, kara->database_filepath, db_fp_size); + /* Set filepath for kara */ + filestamp = get_mtime(kara->filename); if (!(filestamp > kara->unix_timestamp)) goto do_it; @@ -426,16 +432,19 @@ __handle_got_json(volatile sqlite3 *db, struct module_repo_internal *repo, const "Can't get the mkvpropedit executable path", NOTHING); /* Craft a folder path here, it will be used later */ - size_t kara_dir_len = strlen(repo->kara_dir); - kara_dir_len = sizeof(char) * (kara_dir_len + 1); - memcpy(kara.database_filepath, repo->kara_dir, kara_dir_len); - if (kara.database_filepath[kara_dir_len - 1] != '/') { + kara.kara_dir_len = strlen(repo->kara_dir); + kara.kara_dir_len = sizeof(char) * (kara.kara_dir_len + 1); + + memcpy(kara.database_filepath, repo->kara_dir, kara.kara_dir_len); + memcpy(kara.filename, repo->kara_dir, kara.kara_dir_len); + + if (kara.database_filepath[kara.kara_dir_len - 1] != '/') { strncat(kara.database_filepath, "/", PATH_MAX - 1); - kara.database_filepath[++kara_dir_len] = 0; + kara.database_filepath[++kara.kara_dir_len] = 0; } /* Handle the json */ - LOG_INFO("REPO", "Starting to process json for repo %s", repo->name); + LOG_INFO("REPO", "Starting to process json for repo %s, total of %ld karas", repo->name, len); json_parse(json, 2, __handle_got_json_internal_callback, (void *) &kara); LOG_INFO("REPO", "Updated %ld karas and ignored %ld karas, total is %ld", kara.update_count, kara.ignored_count, len);