• 0

Convert Video Duration Number to Time with PHP or jQuery


Question

I'm loading the YouTube API by jQuery + JSON to get the video info of it's views and duration.

The duration number for example is 210 sample, but in actually time, it's 3:30. :)

The problem is, I'm not sure how to come by to converting the numbers to actually time, not even with PHP's strtotime since I believe jQuery would load too late for that. (Or I don't know at all.) :p

<div id="sidebar">
<h3>Related Videos</h3>
	<ul id="related-videos">
<?php $the_query = new WP_Query( array( 'posts_per_page' => '5', 'post_format' => 'post-format-video','category_name' => 'hip-hop') );
			while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
			 <li>
<a href="<?php the_permalink();?>">
<div class="side-thumb"><?php the_post_thumbnail('small'); ?></div>
				 <?php the_title(); ?><br />
						<script type="text/javascript">
$(document).ready(function () {
$.getJSON('http://gdata.youtube.com/feeds/api/videos/<?php echo getYouTubeIdFromURL(get_post_meta($post-&gt;ID,'video',true)); ?&gt; ?v=2&amp;alt=jsonc',function(data,status,xhr){
$("#yt_time-&lt;?php echo get_the_ID(); ?&gt;").html(data.data.duration);
$("#yt_views-&lt;?php echo get_the_ID(); ?&gt;").html(data.data.viewCount);
});
});
&lt;/script&gt;
&lt;span&gt;&lt;div class="yt"&gt;Duration: &lt;/div&gt;&lt;div id="yt_time-&lt;?php echo get_the_ID(); ?&gt;" class="yt"&gt;&lt;/div&gt;&lt;div class="yt"&gt; | &lt;/div&gt;&lt;div class="yt"&gt;Views: &lt;/div&gt;&lt;div id="yt_views-&lt;?php echo get_the_ID(); ?&gt;"class="yt"&gt;&lt;/div&gt;&lt;/span&gt;
&lt;/a&gt;
				&lt;/li&gt;
			&lt;?php endwhile;wp_reset_postdata();?&gt;
	&lt;/ul&gt;&lt;!-- #related-videos --&gt;
&lt;/div&gt;&lt;!-- #sidebar --&gt;

I think this is the solution, but I don't exactly know how to use it. This code is from Stack Overflow.

&lt;?php date('Y-m-d H:i:s', strtotime(sprintf('- %d second', round($speed * 60)))); ?&gt;

Here's a screenshot of what I'm working on. Check out the "Related Videos" on the bottom right.

post-388684-0-44370700-1349869128_thumb.

19 answers to this question

Recommended Posts

  • 0

Something along these lines...

var seconds = 0,
    multiplier = 1,
    time = '3:30';

time = time.split(':');
while (time.length)
{
  seconds += multiplier * parseInt( time.pop() );
  multiplier *= 60;
}

Or a slight variation to cut out a line

var seconds = 0,
    multiplier = 1/60,
    time = '3:30';

time = time.split(':');
while (time.length)
{
  seconds += (multiplier *= 60) * parseInt( time.pop() );
}

  • 0

Sweet! But how do I implement it with this since it appends into a DIV? This is actually in a loop on WordPress, so it won't be a specific time.

$("#yt_views-&lt;?php echo get_the_ID(); ?&gt;").html(data.data.viewCount);

  • 0

Put this somewhere in the document, along with the rest of your script:

function TimeFormatter (time) {
  this.base_time = time;
}

TimeFormatter.prototype = {

  in_seconds: function () {
	var seconds = 0,
		multiplier = 1/60;

	time = this.base_time.split(':');
	while (time.length)
	{
	  seconds += (multiplier *= 60) * parseInt( time.pop() );
	}

	return seconds;
  }

};

Then you can either use this to just print out the seconds directly

$("#yt_views-&lt;?php echo get_the_ID(); ?&gt;").html( new TimeFormatter( data.data.viewCount ).in_seconds() );

or create an instance of the object for use elsewhere:

var video_duration = new TimeFormatter( data.data.viewCount );
$("#yt_views-&lt;?php echo get_the_ID(); ?&gt;").html( video_duration.in_seconds() );

  • 0

The Console says

Uncaught TypeError: Object 1372224 has no method 'split' illigion.js:18

Uncaught TypeError: Object 19194 has no method 'split' illigion.js:18

Uncaught TypeError: Object 5789858 has no method 'split' illigion.js:18

It voids both duration & view no matter which I use or where I put it, as is.

  • 0

In that case, `data.data.viewCount` isn't a string - can you post what the contents of that are? Drop this into the script:

console.log('dataa ' + typeof data); data.data &amp;&amp; console.log('data.dataa ' + typeof data.data); data.data.viewCount &amp;&amp; console.log('data.data.viewCounta ' + typeof data.data.viewCount + ', and its value is: ' + data.data.viewCount);

  • 0

"data is a object"

"data data is a object"

"data data viewCount is a number, and its value is: 137224"

Oh, wait! I don't think viewCount was what I was thinking about. Back to duration, the error is being caused from that!

.html( new TimeFormatter( data.data.viewCount ).in_seconds() );

  • 0

Ahaha, I'm not sure why I latched on to `.viewCount` there - that's my bad. Change it to `.duration` (ie. put it on the line above, which has duration) and that should work.

$("#yt_time-&lt;?php echo get_the_ID(); ?&gt;").html( new TimeFormatter( data.data.duration ).in_seconds() );

or

var video_duration = new TimeFormatter( data.data.duration );
$("#yt_time-&lt;?php echo get_the_ID(); ?&gt;").html( video_duration.in_seconds() );

  • 0

Haha, still no bueno. :p

Here, try it without PHP and using a direct url on YouTube! :D

$(document).ready(function () {
function TimeFormatter (time) {
this.base_time = time;
}

TimeFormatter.prototype = {

in_seconds: function () {
var seconds = 0,
multiplier = 1/60;

time = this.base_time.split(':');
while (time.length)
{
seconds += (multiplier *= 60) * parseInt( time.pop() );
}

return seconds;
}

};

$.getJSON('http://gdata.youtube.com/feeds/api/videos/bCQKlK7WhTM?v=2&alt=jsonc',function(data,status,xhr/ new code
var video_duration = new TimeFormatter( data.data.duration );
$("#yt_time").html( video_duration.in_seconds() );
// end new code
$("#yt_views").html(data.data.viewCount);
});
});

var seconds = 210,
multiplier = 1/60,
time = '3:30';

time = time.split(':');
while (time.length)
{
seconds += (multiplier *= 60) * parseInt( time.pop() );
}




&lt;div id="yt_time"&gt;&lt;/div&gt;
&lt;div id="yt_views"&gt;&lt;/div&gt;

  • 0
  On 10/10/2012 at 15:22, Heartripper said:

Sorry but you want to convert 210 to 3:30 or the other way around?

210 to 3:30

Check out the API data and find "duration"

http://gdata.youtube.com/feeds/api/videos/bCQKlK7WhTM?v=2&alt=jsonc

  • 0
  On 10/10/2012 at 15:24, MrXXIV said:

210 to 3:30

Check out the API data and find "duration"

http://gdata.youtube.com/feeds/api/videos/bCQKlK7WhTM?v=2&alt=jsonc

Ok i van write you the code but atm i'm on my Phone :-(

  • 0
  On 10/10/2012 at 15:28, Heartripper said:

Ok i van write you the code but atm i'm on my Phone :-(

Take your time broski. :)

For the both of you. Here's where you can see and work it out! :D Everything's locked out but that page since I have it all in re-development.

http://illingspree.c...es-music-video/

  • 0
  On 10/10/2012 at 15:49, JoeC said:

O_o Apparently I read it totally wrong, my code converts the other way - 3:30 to 210. If this is still waiting for an answer when I get home, I'll sit down and write it.

Haha it's okay. Yea, I'm still in a confusion on it here. I'm definitely going to need some help on that and maybe writing commas on the view count to make it a little more readable.

  • 0
  On 10/10/2012 at 15:54, MrXXIV said:

Haha it's okay. Yea, I'm still in a confusion on it here. I'm definitely going to need some help on that and maybe writing commas on the view count to make it a little more readable.

here it is:

function formatDuration(duration){
    //We only accept numbers
    if(typeof duration != "number"){
        return;
    }

    var pad = function(n){return n &lt; 10 ? "0" + n : "" + n},
        timeComponents = [], multiplier = 3600;

    //Compute the value of each component (hours, minute, seconds)
    for(; multiplier != 0; multiplier = parseInt(multiplier / 60)){
        var component = parseInt(duration / multiplier);
        duration %= multiplier;

        //If hours equal to 0, do not add them.
        if(multiplier == 3600 &amp;&amp; component == 0){
            continue;
        }

        timeComponents.push(component);
    }

    //Pad each component (2 -&gt; 02)
    for(var i = 0; i &lt; timeComponents.length; i++){
        var padded = pad(timeComponents[i]);
        timeComponents[i] = padded;
    }

    return timeComponents.join(":");
}

tell me if you want some tweaks. It converts seconds to hours:minutes:seconds format, e.g. 51823 -> 14:23:43

  • 0

PHP version

&lt;?php

function formatDuration($duration){
	$duration = intval($duration);
	if(!$duration) return;

	$result = array();
	if($duration &gt;= 3600) {
		// Hours
		$result[] = str_pad(floor($duration / 3600),2,"0",STR_PAD_LEFT);
		$duration = $duration % 3600;
	}
	$result[] = str_pad(floor($duration / 60),2,"0",STR_PAD_LEFT);
	$result[] = str_pad($duration % 60,2,"0",STR_PAD_LEFT);

	return implode($result, ':');
}

  • 0
  On 11/10/2012 at 21:13, Tjcool007 said:

PHP version

&lt;?php

function formatDuration($duration){
	$duration = intval($duration);
	if(!$duration) return;

	$result = array();
	if($duration &gt;= 3600) {
		// Hours
		$result[] = str_pad(floor($duration / 3600),2,"0",STR_PAD_LEFT);
		$duration = $duration % 3600;
	}
	$result[] = str_pad(floor($duration / 60),2,"0",STR_PAD_LEFT);
	$result[] = str_pad($duration % 60,2,"0",STR_PAD_LEFT);

	return implode($result, ':');
}

Won't that only work if I had a PHP version of the jQuery JSON function?

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • His true motives are clear: to make more money by taking advantage of his position and fame, and to feel big and important as he has always wanted. He's turning the US President position into his own personal brand to sell smoke and ###### products and services. The goal remains: money.
    • Crazy Taxi, Sonic CD, and other classic Sega games are now free on mobile devices by Taras Buria SEGA is discontinuing some of its classic games available on mobile devices in the App Store and Google Play Store. Users noticed that upon launch, some of the classic games that were previously ported to mobile devices via the SEGA Forever program (discontinued in 2023) now display a discontinuation message. However, the good news is that all those games are now available for free, so grab them while you can. SEGA has not made any official announcement yet, minus the in-game message, of course, so exact details remain unknown. There is no information on whether the publisher plans to remove those games from mobile stores. Still, it says that you can continue playing them offline: "Support for this game will be discontinued, but you can continue playing offline! If you’d like to learn more about great SEGA games to play, please click the link below." Should SEGA remove the games from stores, installed games will continue working without issues. With that said, SEGA is no stranger to delisting its games, so chances are that now-unsupported games will meet the same fate. Here are the games that previously cost $2 (or required in-app purchases) and are now available for free, presumably for a limited time. Grab them using the links below: Crazy Taxi Classic - App Store | Google Play Store Golden Axe Classics - App Store | Google Play Store Shining Force Classics - App Store | Google Play Store Sonic CD Classic - App Store | Google Play Store Sonic the Hedgehog 4 Ep.II - App Store | Google Play Store Streets of Rage 2 Classic - App Store | Google Play Store Super Monkey Ball: Sakura Ed. - App Store | Google Play Store Virtual Tennis Challenge - App Store | Google Play Store Source: Android Authority
    • Pick your administration and they all have their share of nonsense. If you look much at all, you can find crap and problems with all of them going back to the beginning. I think there are a lot people in Washington, D.C. right now or have been over the years that have been "domestic terrorists" and should have been in prison. Too many examples to even start naming here. I personally don't know what to think of Trump at this point as far his true motives, but I know he makes himself look bad and one of the best examples is this waffling around regarding TikTok.
    • Sayan’s trying to be creative and find ways to link previous articles together, it’s just word spaghetti…
    • I am waiting for it to hit Fedora in a day or two here.
  • Recent Achievements

    • Reacting Well
      JLP earned a badge
      Reacting Well
    • Week One Done
      Rhydderch earned a badge
      Week One Done
    • Experienced
      dismuter went up a rank
      Experienced
    • One Month Later
      mevinyavin earned a badge
      One Month Later
    • Week One Done
      rozermack875 earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      694
    2. 2
      ATLien_0
      274
    3. 3
      Michael Scrip
      215
    4. 4
      +FloatingFatMan
      189
    5. 5
      Steven P.
      145
  • Tell a friend

    Love Neowin? Tell a friend!