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", &timestamp))
             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;