From 2b19ebd64d4489dc3c555f8a5c42e45749a738a9 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sun, 11 Jul 2021 20:28:58 +0200
Subject: [PATCH] ASS: The Syl get its duration from the passed string

---
 src/Lib/Ass/Syl.cc | 17 ++++++++++++++++-
 src/Lib/Ass/Syl.hh |  5 ++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/Lib/Ass/Syl.cc b/src/Lib/Ass/Syl.cc
index dae50d1e..0d411f20 100644
--- a/src/Lib/Ass/Syl.cc
+++ b/src/Lib/Ass/Syl.cc
@@ -6,10 +6,25 @@ using namespace Vivy::Ass;
 Syl::Syl(Line *const line, const QString &lineString, ConstructMode mode) noexcept
     : content(lineString)
     , styleProperties(line->getStyleProperties())
-    , dur(line->getDuration())
+    , duration(line->getDuration())
     , parentLine(line)
 {
     // Will override the `content`, but will be heavy anyway
     if (mode == ConstructMode::ReadAssTags) {
+        const int textBegin = lineString.lastIndexOf('}') + 1;
+        content             = (textBegin >= lineString.size()) ? "" : lineString.mid(textBegin);
+        duration            = getDurationFromString(lineString);
     }
 }
+
+quint64
+Syl::getDurationFromString(const QString &line) noexcept
+{
+    QRegExp re("\\\\(?:k|K|ko|kf)(\\d+)");
+    int pos          = 0;
+    quint64 duration = 0;
+    while ((pos = re.indexIn(line, pos)) != -1) {
+        duration += re.cap(1).toUInt();
+    }
+    return duration;
+}
diff --git a/src/Lib/Ass/Syl.hh b/src/Lib/Ass/Syl.hh
index f6fd0169..101de152 100644
--- a/src/Lib/Ass/Syl.hh
+++ b/src/Lib/Ass/Syl.hh
@@ -14,7 +14,7 @@ class Syl final {
 private:
     QString content;
     StyleProperties styleProperties;
-    quint64 dur{ 0 };
+    quint64 duration{ 0 };
 
 public:
     Line *const parentLine;
@@ -31,6 +31,9 @@ public:
 
     Syl &operator=(const Syl &) = delete;
     ~Syl() noexcept             = default;
+
+private:
+    static quint64 getDurationFromString(const QString &) noexcept;
 };
 
 }
-- 
GitLab