diff --git a/inc/lektor/mkv.h b/inc/lektor/mkv.h index 1d6d9d1a753b8f1420bac0cae01d477dfdacab75..e4479001a9e14d8f768074f7087bd483919ab623 100644 --- a/inc/lektor/mkv.h +++ b/inc/lektor/mkv.h @@ -47,9 +47,14 @@ struct kara { Returns 0 on success and -1 on error. */ int kara_metadata_read(struct kara_metadata *dst, const char *filename); -/* Write metadata to a mkv file */ +/* Write metadata to a mkv file. Returns 0 on success and -1 on error */ int kara_metadata_write(struct kara_metadata *mdt, const char *filename, const char *mkvpropedit); +/* Check if the mdt of the kara `filename` is the same as the `mdt`. + Returns 0 on success and -1 on error or if the metadata are + not equals. */ +int kara_metadata_equals(struct kara_metadata *mdt, const char *filename); + /* Set the metadata for the file according to its path. */ int metadata_set_file(char *karapath, const char *mkvpropedit); diff --git a/src/mkv/mkv.c b/src/mkv/mkv.c index b7ff49c0fb408b2caa574381781bc1559318fa41..6b0623bbd9d833a9e9c89e674b8539a7cd18feb5 100644 --- a/src/mkv/mkv.c +++ b/src/mkv/mkv.c @@ -537,3 +537,19 @@ error: close(file.fd); return status_code; } + +int +kara_metadata_equals(struct kara_metadata *mdt, const char *filename) +{ + struct kara_metadata kara_mdt; /* FIXME: Less dirty bomb */ + if (kara_metadata_read(&kara_mdt, filename)) + return -1; + return ! (STR_MATCH(kara_mdt.song_name, mdt->song_name) && + STR_MATCH(kara_mdt.source_name, mdt->source_name) && + STR_MATCH(kara_mdt.category, mdt->category) && + STR_MATCH(kara_mdt.language, mdt->language) && + STR_MATCH(kara_mdt.author_name, mdt->author_name) && + STR_MATCH(kara_mdt.song_type, mdt->song_type) && + kara_mdt.song_number == mdt->song_number); +} + diff --git a/src/net/downloader.c b/src/net/downloader.c index 753e20925d272b087f6709c6d64186bc8070ad03..a076deef22967bc8079f39795a66b0689b4b90b8 100644 --- a/src/net/downloader.c +++ b/src/net/downloader.c @@ -349,26 +349,29 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, struct json_objec } safe_snprintf(kara.filename + kara_dir_len, PATH_MAX - kara_dir_len, "%d.mkv", integer); + /* Reads the json */ + err |= safe_json_get_string(kara_json, "song_name", kara.mdt.song_name, LEKTOR_TAG_MAX); + err |= safe_json_get_string(kara_json, "source_name", kara.mdt.source_name, LEKTOR_TAG_MAX); + err |= safe_json_get_string(kara_json, "category", kara.mdt.category, LEKTOR_TAG_MAX); + err |= safe_json_get_string(kara_json, "language", kara.mdt.language, LEKTOR_TAG_MAX); + err |= safe_json_get_string(kara_json, "author_name", kara.mdt.author_name, LEKTOR_TAG_MAX); + err |= safe_json_get_string(kara_json, "song_type", kara.mdt.song_type, LEKTOR_TAG_MAX); + if (err || safe_json_get_int32(kara_json, "song_number", &kara.mdt.song_number)) { + LOG_WARN_SCT("REPO", "Json is invalid for kara '%ld', skip it", kara.id); + continue; + } + /* Timestamp verification */ if (safe_json_get_long(kara_json, "unix_timestamp", ×tamp)) continue; filestamp = get_mtime(kara.filename); if (database_get_timestamp(db) >= filestamp && filestamp > timestamp && - ! kara_metadata_read(&kara.mdt, kara.filename)) { + ! kara_metadata_equals(&kara.mdt, kara.filename)) { LOG_INFO_SCT("REPO", "Ignore kara '%ld' with path '%s'", kara.id, kara.filename); continue; } LOG_WARN_SCT("REPO", "Download kara '%ld' with path '%s'", kara.id, kara.filename); - err |= safe_json_get_string(kara_json, "song_name", kara.mdt.song_name, LEKTOR_TAG_MAX); - err |= safe_json_get_string(kara_json, "source_name", kara.mdt.source_name, LEKTOR_TAG_MAX); - err |= safe_json_get_string(kara_json, "category", kara.mdt.category, LEKTOR_TAG_MAX); - err |= safe_json_get_string(kara_json, "language", kara.mdt.language, LEKTOR_TAG_MAX); - err |= safe_json_get_string(kara_json, "author_name", kara.mdt.author_name, LEKTOR_TAG_MAX); - err |= safe_json_get_string(kara_json, "song_type", kara.mdt.song_type, LEKTOR_TAG_MAX); - RETURN_IF(err || safe_json_get_int32(kara_json, "song_number", &kara.mdt.song_number), - "Invalid json", NOTHING); - if (!database_update_add((sqlite3 *) db, kara.filename, &kara.mdt, kara.id, false)) { LOG_ERROR_SCT("REPO", "Could not add unavailable kara %ld to db", kara.id); continue;