diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
index 468f1de0b1f425a80c35adaa113893a1092aa75e..f5a3209085b35d737e6533afefe815e883b2b4bd 100644
--- a/inc/lektor/macro.h
+++ b/inc/lektor/macro.h
@@ -64,3 +64,11 @@
 #define GOTO_UNLESS(cond, msg, label)   GOTO_IF(!(cond), msg, ret)
 #define RETURN_UNLESS(cond, msg, ret)   RETURN_IF(!(cond), msg, ret)
 #define NOTHING                         /* Usefull to return nothing. */
+
+#define STRTOL(ret, str, endptr, err_flag)                              \
+{                                                                       \
+    err_flag = 0;                                                       \
+    errno    = 0;                                                       \
+    ret      = str == NULL ? 0 : strtol(str, &(endptr), 0);             \
+    err_flag = errno != 0 || endptr == str;                             \
+}
diff --git a/src/mkv/write.c b/src/mkv/write.c
index 08d2764f35d3cdb983140dbdda555f93d90a343b..4ebd6b9cc5f84903e83db2c6acb2fab6c366a534 100644
--- a/src/mkv/write.c
+++ b/src/mkv/write.c
@@ -147,6 +147,7 @@ metadata_from_path(char *const mkvfile, struct kara_metadata *meta)
     regmatch_t pmatch[nmatch];
     int reti, sta = false;
     char msgbuf[LEKTOR_TAG_MAX];
+    char *endptr;
 
     static const char *rgx =
         "^/(.+)/(vo|va|amv|cdg|autres|vocaloid)/"
@@ -178,10 +179,8 @@ metadata_from_path(char *const mkvfile, struct kara_metadata *meta)
         goto error;
     }
 
-    if (msgbuf[0] != '\0') {
-        meta->song_number = atoi(msgbuf);   /* TODO: Use strtol */
-        meta->song_number = MAX(1, meta->song_number);
-    } else
+    STRTOL(meta->song_number, msgbuf, endptr, reti);
+    if (reti || meta->song_number <= 0)
         meta->song_number = 1;
 
     sta = true;