2

I can't parse Youtube duration to date or date time, I search and visit many web site but I can't parse youtube string duration

Youtube duration sample is : PT15M33S

Please click for youtube api documentation

secret
  • 742
  • 1
  • 7
  • 24
  • Looks like Dart doesn't have built in support for parsing a duration (see [this issue](https://github.com/dart-lang/sdk/issues/16059)). You may be able to adapt [this answer](https://stackoverflow.com/questions/14934089/convert-iso-8601-duration-with-javascript) for your purposes. – Jake Holzinger Apr 30 '19 at 23:27

3 Answers3

2

It's ISO 8601 durations are given in the format P[n]Y[n]M[n]DT[n]H[n]M[n]S

Examples:

20 seconds:

PT20.0S

One year, 3 month, 3 days, 4 hours, 5 minutes, 10 seconds:

P1Y3M3DT4H5M10S

Unfortunately, dart does not give parser api Duration class So you have to parser your own and feed into Duration and convert to Datatime

You can try Match-class

String durationString = "P2Y5M3W4DT5H4M2S";
String regxPattern= "^P(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?\$";

  print(regxPattern);

RegExp re = new RegExp(regxPattern);

if (re.hasMatch(durationString)) {

   for (var m in re.allMatches(durationString)) {


     print("total:"+m.group(0));
     print("Y:"+m.group(1));
     print("M:"+m.group(2));
     print("W:"+m.group(3));
     print("D:"+m.group(4));
     print("Time:"+m.group(5));
     print("H:"+m.group(6));
     print("M:"+m.group(7));
     print("S:"+m.group(8));
     Duration fastestMarathon = new Duration(hours:m.group(6), 
                                             minutes:m.group(7), 
                                             second,m.group(8));

   }

}



howie
  • 2,587
  • 3
  • 27
  • 43
0

Add proper Youtube URL & key

parse_str(parse_url($video_url, PHP_URL_QUERY), $get_parameters);
$video_id = $get_parameters['v'];

$json_result = file_get_contents("https://www.googleapis.com/youtube/v3/videos? 
part=contentDetails&id=$video_id&key=$api_key");
$result = json_decode($json_result, true);

if (!count($result['items'])) {
return null;
}
$duration_encoded = $result['items'][0]['contentDetails']['duration'];

$interval = new DateInterval($duration_encoded);
$seconds = $interval->days * 86400 + $interval->h * 3600 + $interval->i * 60 + 
$interval->s;
-1

Wrapped up a small package to facilitate this:

import { parse, serialize } from 'tinyduration';
 
// Basic parsing
const durationObj = parse('P1Y2M3DT4H5M6S');
assert(durationObj, {
    years: 1,
    months: 2,
    days: 3,
    hours: 4,
    minutes: 5,
    seconds: 6
});
 
// Serialization
assert(serialize(durationObj), 'P1Y2M3DT4H5M6S');

Install using npm install --save tinyduration or yarn add tinyduration

See: https://www.npmjs.com/package/tinyduration

Melle
  • 7,639
  • 1
  • 30
  • 31