For the sake of interest I want to convert video durations from YouTubes ISO 8601
to seconds. To future proof my solution, I picked a really long video to test it a
Isn't the video 1 week, 2 days, 6 hours 21 minutes 32 seconds long?
Youtube shows it as 222 hours 21 minutes 17 seconds; 1 * 7 * 24 + 2 * 24 + 6 = 222. I don't know where 17 seconds vs 32 seconds discrepancy comes from, though; can as well be a rounding error.
To my mind, writing a parser for that is not that hard. Unfortunately dateutil
does not seem to parse intervals, only datetime points.
Update:
I see that there's a package for this, but just as an example of regexp power, brevity, and incomprehensible syntax, here's a parser for you:
import re
# see http://en.wikipedia.org/wiki/ISO_8601#Durations
ISO_8601_period_rx = re.compile(
'P' # designates a period
'(?:(?P\d+)Y)?' # years
'(?:(?P\d+)M)?' # months
'(?:(?P\d+)W)?' # weeks
'(?:(?P\d+)D)?' # days
'(?:T' # time part must begin with a T
'(?:(?P\d+)H)?' # hourss
'(?:(?P\d+)M)?' # minutes
'(?:(?P\d+)S)?' # seconds
')?' # end of time part
)
from pprint import pprint
pprint(ISO_8601_period_rx.match('P1W2DT6H21M32S').groupdict())
# {'days': '2',
# 'hours': '6',
# 'minutes': '21',
# 'months': None,
# 'seconds': '32',
# 'weeks': '1',
# 'years': None}
I deliberately am not calculating the exact number of seconds from these data here. It looks trivial (see above), but really isn't. For instance, distance of 2 months from January 1st is 58 days (30+28) or 59 (30+29), depending on year, while from March 1st it's always 61 days. A proper calendar implementation should take all this into account; for a Youtube clip length calculation, it must be excessive.