diff options
| -rw-r--r-- | test/test_utils.py | 1 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 74 | 
2 files changed, 39 insertions, 36 deletions
| diff --git a/test/test_utils.py b/test/test_utils.py index 0f36bb9f0..e16a6761b 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -413,6 +413,7 @@ class TestUtil(unittest.TestCase):          self.assertEqual(parse_duration('01:02:03:04'), 93784)          self.assertEqual(parse_duration('1 hour 3 minutes'), 3780)          self.assertEqual(parse_duration('87 Min.'), 5220) +        self.assertEqual(parse_duration('PT1H0.040S'), 3600.04)      def test_fix_xml_ampersands(self):          self.assertEqual( diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 999dfabb5..f333e4712 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -1540,44 +1540,46 @@ def parse_duration(s):      s = s.strip() -    m = re.match( -        r'''(?ix)(?:P?T)? -        (?: -            (?P<only_mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*| -            (?P<only_hours>[0-9.]+)\s*(?:hours?)| - -            \s*(?P<hours_reversed>[0-9]+)\s*(?:[:h]|hours?)\s*(?P<mins_reversed>[0-9]+)\s*(?:[:m]|mins?\.?|minutes?)\s*| -            (?: +    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]+)?$', s) +    if m: +        days, hours, mins, secs, ms = m.groups() +    else: +        m = re.match( +            r'''(?ix)(?:P?T)?                  (?: -                    (?:(?P<days>[0-9]+)\s*(?:[:d]|days?)\s*)? -                    (?P<hours>[0-9]+)\s*(?:[:h]|hours?)\s* +                    (?P<days>[0-9]+)\s*d(?:ays?)?\s*                  )? -                (?P<mins>[0-9]+)\s*(?:[:m]|mins?|minutes?)\s* -            )? -            (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*(?:s|secs?|seconds?)? -        )$''', s) -    if not m: -        return None -    res = 0 -    if m.group('only_mins'): -        return float_or_none(m.group('only_mins'), invscale=60) -    if m.group('only_hours'): -        return float_or_none(m.group('only_hours'), invscale=60 * 60) -    if m.group('secs'): -        res += int(m.group('secs')) -    if m.group('mins_reversed'): -        res += int(m.group('mins_reversed')) * 60 -    if m.group('mins'): -        res += int(m.group('mins')) * 60 -    if m.group('hours'): -        res += int(m.group('hours')) * 60 * 60 -    if m.group('hours_reversed'): -        res += int(m.group('hours_reversed')) * 60 * 60 -    if m.group('days'): -        res += int(m.group('days')) * 24 * 60 * 60 -    if m.group('ms'): -        res += float(m.group('ms')) -    return res +                (?: +                    (?P<hours>[0-9]+)\s*h(?:ours?)?\s* +                )? +                (?: +                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?\s* +                )? +                (?: +                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s* +                )?$''', s) +        if m: +            days, hours, mins, secs, ms = m.groups() +        else: +            m = re.match(r'(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)$', s) +            if m: +                hours, mins = m.groups() +            else: +                return None + +    duration = 0 +    if secs: +        duration += float(secs) +    if mins: +        duration += float(mins) * 60 +    if hours: +        duration += float(hours) * 60 * 60 +    if days: +        duration += float(days) * 24 * 60 * 60 +    if ms: +        duration += float(ms) +    return duration  def prepend_extension(filename, ext, expected_real_ext=None): | 
