about summary refs log tree commit diff
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2022-01-27 02:51:25 +0000
committerdirkf <fieldhouse@gmx.net>2022-01-27 05:38:14 +0000
commit51d3d0c9f61f373c0fd6130f9fc481051d36ef99 (patch)
treed114ebc3307d33e0a56b577c22cc0adfe491154f
parentb8344046138083152d9b0d9a5cc8a11e28faf621 (diff)
downloadyoutube-dl-df-test-orf.tar.gz
youtube-dl-df-test-orf.tar.xz
youtube-dl-df-test-orf.zip
Handle ss:xxx in parse_duration(), based on yt-dlp 8bd1c00bf399ba7002fc21cd399c931e9d301bd8 df-test-orf
-rw-r--r--test/test_utils.py2
-rw-r--r--youtube_dl/utils.py15
2 files changed, 11 insertions, 6 deletions
diff --git a/test/test_utils.py b/test/test_utils.py
index 88d2da0c3..df53a57fb 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -617,6 +617,8 @@ class TestUtil(unittest.TestCase):
         self.assertEqual(parse_duration('PT1H0.040S'), 3600.04)
         self.assertEqual(parse_duration('PT00H03M30SZ'), 210)
         self.assertEqual(parse_duration('P0Y0M0DT0H4M20.880S'), 260.88)
+        self.assertEqual(parse_duration('01:02:03:050'), 3723.05)
+        self.assertEqual(parse_duration('103:050'), 103.05)
 
     def test_fix_xml_ampersands(self):
         self.assertEqual(
diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py
index a85a70b86..cf4f7a75d 100644
--- a/youtube_dl/utils.py
+++ b/youtube_dl/utils.py
@@ -3754,12 +3754,14 @@ def parse_duration(s):
     if not isinstance(s, compat_basestring):
         return None
 
-    s = s.strip()
-
-    days, hours, mins, secs, ms = [None] * 5
-    m = re.match(r'(?:(?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?(?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?Z?$', s)
+    m = re.match(r'''(?x)\s*
+            (?P<before_secs>
+                (?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?
+            (?P<secs>(?(before_secs)[0-9]{1,2}|[0-9]+))
+            (?P<ms>[.:][0-9]+)?Z?\s*$
+        ''', s)
     if m:
-        days, hours, mins, secs, ms = m.groups()
+        days, hours, mins, secs, ms = m.group('days', 'hours', 'mins', 'secs', 'ms')
     else:
         m = re.match(
             r'''(?ix)(?:P?
@@ -3791,6 +3793,7 @@ def parse_duration(s):
             m = re.match(r'(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$', s)
             if m:
                 hours, mins = m.groups()
+                days = secs = ms = None
             else:
                 return None
 
@@ -3804,7 +3807,7 @@ def parse_duration(s):
     if days:
         duration += float(days) * 24 * 60 * 60
     if ms:
-        duration += float(ms)
+        duration += float(ms.replace(':', '.'))
     return duration