Skip to content

Instantly share code, notes, and snippets.

@Ghost---Shadow
Last active April 6, 2024 09:25
Show Gist options
  • Save Ghost---Shadow/e11a4a0c00b7ac26f1c88418b3359c4b to your computer and use it in GitHub Desktop.
Save Ghost---Shadow/e11a4a0c00b7ac26f1c88418b3359c4b to your computer and use it in GitHub Desktop.
Calculate the total length of a youtube playlist. Just open javascript console, paste and press enter.
/**
USAGE
1. Open the playlist you want
2. Right click > Inspect element > Console
3. Copy this and paste. Hit enter.
4. For watch later make sure to click the Edit button
Make sure &disable_polymer=true flag is set
e.g.
https://www.youtube.com/playlist?list=WL&disable_polymer=true
*/
const table = document.getElementById("pl-video-table")
const rows = Array.from(table.rows)
const toSeconds = s => s ? s.split(':').map(v => parseInt(v)).reverse().reduce((acc,e,i) => acc + e * Math.pow(60,i)) : 0
const getTimestamp = row => toSeconds(row.children[6].children[0].children[0].innerText)
let seconds = rows.reduce((acc,e) => acc + getTimestamp(e),0)
let mins = parseInt(seconds / 60)
seconds %= 60
let hours = parseInt(mins / 60)
mins %= 60
console.log(hours+":"+mins+":"+seconds)
@wongcyrus
Copy link

The scripts is useful but my use case is to have the individual video length and I modified the script a bit.
You can get download the CSV file.

var ytp = document.querySelectorAll("ytd-playlist-video-list-renderer > #contents > ytd-playlist-video-renderer");
var time = 0;

function convertS(sec) {
    var hrs = Math.floor(sec / 3600);
    var min = Math.floor((sec - (hrs * 3600)) / 60);
    var seconds = sec - (hrs * 3600) - (min * 60);
    seconds = Math.round(seconds * 100) / 100

    var result = (hrs < 10 ? "0" + hrs : hrs) + ':';
    result += (min < 10 ? "0" + min : min) + ":";
    result += (seconds < 10 ? "0" + seconds : seconds);
    return result;
}
var videos = [];
for (var i = 0; i < ytp.length; i++) {
    var a = ytp[i].getElementsByTagName('ytd-thumbnail-overlay-time-status-renderer')[0].innerText;
    var tx = a.split(':');
    var title = ytp[i].getElementsByTagName("a")[1].title;
    if (tx.length < 3) {
        videoLength = Number(tx[0]) * 60 + Number(tx[1]);
        time = time + Number(tx[0]) * 60 + Number(tx[1]);
    } else if (tx.length = 3) {
        time = time + Number(tx[0]) * 60 * 60 + Number(tx[1]) * 60 + Number(tx[2]);
        videoLength = Number(tx[0]) * 60 * 60 + Number(tx[1]) * 60 + Number(tx[2]);
    }

    videos.push({ title, videoLength: convertS(videoLength), Seconds: videoLength });
}

function download_csv_file() {

    //define the heading for each row of the data  
    var csv = 'Video,Length,Seconds\n';

    //merge the data with CSV  
    videos.forEach(function (row) {
        csv += row.title + "," + row.videoLength + "," + row.Seconds;
        csv += "\n";
    });

    //display the created CSV data on the web browser   
    document.write(csv);


    var hiddenElement = document.createElement('a');
    hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);
    hiddenElement.target = '_blank';

    //provide the name for the CSV file to be downloaded  
    hiddenElement.download = 'YoutubePlayList.csv';
    hiddenElement.click();
}

var ytpT = convertS(time)
var show = 'YouTube Playlist \n --------------- \n Total Videos : ' + ytp.length + '\n Total Duration : ' + ytpT + '\n Avg. Duration  : ' + convertS(time / ytp.length);
// alert(show);
// console.log(videos);
download_csv_file();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment