-
-
Save Ghost---Shadow/e11a4a0c00b7ac26f1c88418b3359c4b to your computer and use it in GitHub Desktop.
/** | |
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) |
Make sure to add a &disable_polymer=true
in the URL
e.g. https://www.youtube.com/playlist?list=PLhixgUqwRTjwufDsT1ntgOY9yjZgg5H_t&disable_polymer=true
Thanks @Ghost--Shadow it is working now.
How about that:
function main(){
const durationContainers = Array.from(document.getElementById("items").getElementsByClassName("style-scope ytd-thumbnail-overlay-time-status-renderer"));
var durations = durationContainers.map(__span => __span.innerText).map(duration => {
if (duration) {
return duration.split(":").map(duration => parseInt(duration)).reverse().reduce((acc, e, i) => {
return acc + e * Math.pow(60, i);
});
}
else {
return 0;
}
});
durations = durations.filter(element => 0 !== element);
console.log(durations);
const totalSeconds = durations.reduce((acc, e, _) => {
return acc + e;
});
const seconds = totalSeconds % 60;
const minutes = Math.floor(totalSeconds / 60) % 60;
const hours = Math.floor(totalSeconds / 3600)
console.log(totalSeconds);
console.log(hours + ":" + minutes + ":" + seconds);
};
main();
LGTM
var ytp = document.querySelectorAll("ytd-playlist-video-list-renderer > #contents > ytd-playlist-video-renderer");
var time = 0;
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(':');
if (tx.length < 3) {
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]);
}
}
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);
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) + ' Hours ';
result += (min < 10 ? "0" + min : min) + " Min ";
result += (seconds < 10 ? "0" + seconds : seconds) + ' Sec ';
return result;
}
Why is this so popular?
Because the response is simple, doesn't require an app or too many weird permissions, and works via copy and paste. Also, playlists with durations are really needed
Fully working, thx
Get YouTube playlist length visit:- YouTube playlist length
@abhishekgoyal-a11y Pretty good. Doesnt work on Watch Later though.
@abhishekgoyal-a11y Pretty good. Doesnt work on Watch Later though.
Meaning?
@abhishekgoyal-a11y Pretty good. Doesnt work on Watch Later though.
Meaning?
Bookmarkable version of @abonzer proposal:
(use this as the URL for a bookmark, click on the bookmark when u're on a youtube playlist page)
javascript: 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) + ' Hours '; result += (min < 10 ? "0" + min : min) + " Min "; result += (seconds < 10 ? "0" + seconds : seconds) + ' Sec '; return result; }; var ytp = document.querySelectorAll("ytd-playlist-video-list-renderer > #contents > ytd-playlist-video-renderer");var time = 0; 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(':'); if (tx.length < 3) {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]);}}; var ytpT = convertS(time); var show = 'YouTube Playlist \n --------------- \n Total Videos : ' + ytp.length + '\nTotal Duration : ' + ytpT + '\n Avg. Duration : ' + convertS(time / ytp.length);alert(show);
var ytp = document.querySelectorAll("ytd-playlist-video-list-renderer > #contents > ytd-playlist-video-renderer"); var time = 0; 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(':'); if (tx.length < 3) { 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]); } } 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); 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) + ' Hours '; result += (min < 10 ? "0" + min : min) + " Min "; result += (seconds < 10 ? "0" + seconds : seconds) + ' Sec '; return result; }
This is amazing, thank you ♥♥♥♥
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();
It is not working . can you provide any other solution.