How to convert YouTube API duration to seconds?

前端 未结 7 1508
星月不相逢
星月不相逢 2021-02-07 04:52

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

7条回答
  •  迷失自我
    2021-02-07 05:51

    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.

提交回复
热议问题