(अपडेट किया गया 2016-05-09, वर्तमान शीर्ष उत्तर से अधिक मजबूत)
यदि आपको बस कुछ प्लेलिस्ट को सहेजने की आवश्यकता है, तो आप नीचे दिए गए मेरे जावास्क्रिप्ट स्निपेट का उपयोग कर सकते हैं। यह स्निपेट हर सूची को सहेज सकता है क्योंकि यह वेबपृष्ठ पर दिखाया गया है, इसलिए यह सभी गीतों / एल्बमों / कलाकारों के पुस्तकालय दृश्यों के लिए भी काम करता है। मैंने इस उत्तर के अंत में दो अन्य विकल्प सूचीबद्ध किए हैं।
यहां जाएं: https://play.google.com/music/listen#/all (या आपकी प्लेलिस्ट)
डेवलपर कंसोल खोलें (क्रोम के लिए F12)। कोड को नीचे कंसोल में पेस्ट करें।
सभी स्क्रैप किए गए गाने allsongs
ऑब्जेक्ट में संग्रहीत किए जाते हैं और सूची के एक पाठ संस्करण को क्लिपबोर्ड पर कॉपी किया जाता है। मैं songsToText("all",true)
पूरी CSV जानकारी प्राप्त करने के लिए बाद में चलने की सलाह देता हूं
। copy(outText)
यदि मैन्युअल रूप से क्लिपबोर्ड की नकल पहली कोशिश पर काम नहीं करती है तो मैन्युअल रूप से चलाएं ।
कोड (नवीनतम संस्करण 10 मई 2016, Rev 30):
var allsongs = []
var outText = "";
var songsToText = function(style, csv, likedonly){
if (style === undefined){
console.log("style is undefined.");
return;
}
var csv = csv || false; // defaults to false
var likedonly = likedonly || false; // defaults to false
if (likedonly) {
console.log("Only selecting liked songs");
}
if (style == "all" && !csv){
console.log("Duration, ratings, and playcount will only be exported with the CSV flag");
}
outText = "";
if (csv) {
if (style == "all") {
//extra line
outText = "artist,album,title,duration,playcount,rating,rating_interpretation" + "\n";
} else if (style == "artist") {
} else if (style == "artistsong") {
} else if (style == "artistalbum") {
} else if (style == "artistalbumsong") {
} else {
console.log("style not defined");
}
}
var numEntries = 0;
var seen = {};
for (var i = 0; i < allsongs.length; i++) {
var curr = "";
var properTitle = allsongs[i].title.replace(/[\n\r!]/g, '').trim();
if (!likedonly || (likedonly && allsongs[i].rating >= 5)){
if (csv) {
if (style == "all") {
//extra line
curr += '"' + allsongs[i].artist.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].album.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + properTitle.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].duration.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].playcount.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].rating.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].rating_interpretation.replace(/"/g, '""').trim() + '"';
} else if (style == "artist") {
curr += '"' + allsongs[i].artist.replace(/"/g, '""').trim() + '"';
} else if (style == "artistsong") {
curr += '"' + allsongs[i].artist.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + properTitle.replace(/"/g, '""').trim() + '"';
} else if (style == "artistalbum") {
curr += '"' + allsongs[i].artist.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].album.replace(/"/g, '""').trim() + '"';
} else if (style == "artistalbumsong") {
curr += '"' + allsongs[i].artist.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + allsongs[i].album.replace(/"/g, '""').trim() + '"' + ",";
curr += '"' + properTitle.replace(/"/g, '""').trim() + '"';
} else {
console.log("style not defined");
}
} else {
if (style == "all"){
curr = allsongs[i].artist + " - " + allsongs[i].album + " - " + properTitle + " [[playcount: " + allsongs[i].playcount + ", rating: " + allsongs[i].rating_interpretation + "]]" ;
} else if (style == "artist"){
curr = allsongs[i].artist;
} else if (style == "artistalbum"){
curr = allsongs[i].artist + " - " + allsongs[i].album;
} else if (style == "artistsong"){
curr = allsongs[i].artist + " - " + properTitle;
} else if (style == "artistalbumsong"){
curr = allsongs[i].artist + " - " + allsongs[i].album + " - " + properTitle;
} else {
console.log("style not defined");
}
}
if (!seen.hasOwnProperty(curr)){ // hashset
outText = outText + curr + "\n";
numEntries++;
seen[curr] = true;
} else {
//console.log("Skipping (duplicate) " + curr);
}
}
}
console.log("=============================================================");
console.log(outText);
console.log("=============================================================");
try {
copy(outText);
console.log("copy(outText) to clipboard succeeded.");
} catch (e) {
console.log(e);
console.log("copy(outText) to clipboard failed, please type copy(outText) on the console or copy the log output above.");
}
console.log("Done! " + numEntries + " lines in output. Used " + numEntries + " unique entries out of " + allsongs.length + ".");
};
var scrapeSongs = function(){
var intervalms = 1; //in ms
var timeoutms = 3000; //in ms
var retries = timeoutms / intervalms;
var total = [];
var seen = {};
var topId = "";
document.querySelector("#mainContainer").scrollTop = 0; //scroll to top
var interval = setInterval(function(){
var songs = document.querySelectorAll("table.song-table tbody tr.song-row");
if (songs.length > 0) {
// detect order
var colNames = {
index: -1,
title: -1,
duration: -1,
artist: -1,
album: -1,
playcount: -1,
rating: -1
};
for (var i = 0; i < songs[0].childNodes.length; i++) {
colNames.index = songs[0].childNodes[i].getAttribute("data-col") == "index" ? i : colNames.index;
colNames.title = songs[0].childNodes[i].getAttribute("data-col") == "title" ? i : colNames.title;
colNames.duration = songs[0].childNodes[i].getAttribute("data-col") == "duration" ? i : colNames.duration;
colNames.artist = songs[0].childNodes[i].getAttribute("data-col") == "artist" ? i : colNames.artist;
colNames.album = songs[0].childNodes[i].getAttribute("data-col") == "album" ? i : colNames.album;
colNames.playcount = songs[0].childNodes[i].getAttribute("data-col") == "play-count" ? i : colNames.playcount;
colNames.rating = songs[0].childNodes[i].getAttribute("data-col") == "rating" ? i : colNames.rating;
}
// check if page has updated/scrolled
var currId = songs[0].getAttribute("data-id");
if (currId == topId){ // page has not yet changed
retries--;
scrollDiv = document.querySelector("#mainContainer");
isAtBottom = scrollDiv.scrollTop == (scrollDiv.scrollHeight - scrollDiv.offsetHeight)
if (isAtBottom || retries <= 0) {
clearInterval(interval); //done
allsongs = total;
console.log("Got " + total.length + " songs and stored them in the allsongs variable.");
console.log("Calling songsToText with style all, csv flag true, likedonly false: songsToText(\"all\", false).");
songsToText("artistalbumsong", false, false);
}
} else {
retries = timeoutms / intervalms;
topId = currId;
// read page
for (var i = 0; i < songs.length; i++) {
var curr = {
dataid: songs[i].getAttribute("data-id"),
index: (colNames.index != -1 ? songs[i].childNodes[colNames.index].textContent : ""),
title: (colNames.title != -1 ? songs[i].childNodes[colNames.title].textContent : ""),
duration: (colNames.duration != -1 ? songs[i].childNodes[colNames.duration].textContent : ""),
artist: (colNames.artist != -1 ? songs[i].childNodes[colNames.artist].textContent : ""),
album: (colNames.album != -1 ? songs[i].childNodes[colNames.album].textContent : ""),
playcount: (colNames.playcount != -1 ? songs[i].childNodes[colNames.playcount].textContent : ""),
rating: (colNames.rating != -1 ? songs[i].childNodes[colNames.rating].getAttribute("data-rating") : ""),
rating_interpretation: "",
}
if(curr.rating == "undefined") {
curr.rating_interpretation = "never-rated"
}
if(curr.rating == "0") {
curr.rating_interpretation = "not-rated"
}
if(curr.rating == "1") {
curr.rating_interpretation = "thumbs-down"
}
if(curr.rating == "5") {
curr.rating_interpretation = "thumbs-up"
}
if (!seen.hasOwnProperty(curr.dataid)){ // hashset
total.push(curr);
seen[curr.dataid] = true;
}
}
songs[songs.length-1].scrollIntoView(true); // go to next page
}
}
}, intervalms);
};
scrapeSongs();
// for the full CSV version you can now call songsToText("all", true);
Github (Gist) पर नवीनतम कोड यहां: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75
यदि आप किसी टेक्स्ट फॉर्मेट में आउटपुट चाहते हैं, तो गानेटॉक्स्ट () फ़ंक्शन को कॉल कर सकते हैं। आप एक शैली का चयन कर सकते हैं, प्रारूप का चयन कर सकते हैं, और यदि केवल पसंद किए गए / थंब किए गए गाने निर्यात किए जाने चाहिए। परिणामी सूची को तब क्लिपबोर्ड में चिपकाया जाएगा। शैलियाँ हैं all
, artist
, artistalbum
, artistsong
,
artistalbumsong
। CSV का परिणाम CSV फ़ाइल के रूप में होगा और इसे छोड़ा जा सकता है (असत्य के लिए डिफ़ॉल्ट)। इसी तरह बाहर छोड़ दिया जा सकता है (झूठ के लिए चूक) या सच करने के लिए सेट किया गया है, और 5. या अधिक के बराबर रेटिंग वाले सभी गीतों को फ़िल्टर करेगा:
songsToText("all",true,false)
सीएसवी प्रारूप में सभी गाने निर्यात करेगा।
songsToText("all",true,true)
सीएसवी प्रारूप में केवल पसंद किए गए गाने निर्यात करेंगे।
songsToText("artistsong",false,false)
पाठ के रूप में सभी गीतों का निर्यात करेगा।
इसके बाद आप कहीं भी डेटा पेस्ट कर सकते हैं, उदाहरण के लिए http://www.ivyishere.org/ यदि आप अपने Spotify खाते में गाने या एल्बम जोड़ना चाहते हैं। आइवी को पूर्ण एल्बम पहचानने के लिए, "कलाकारलैबम" शैली का उपयोग करें। गीतों के लिए, "कलाकारोंग" शैली का उपयोग करें।
स्निपेट के बारे में:
यह माइकल स्मिथ के मूल उत्तर पर आधारित है, लेकिन थोड़ा अधिक मजबूत है। मैंने निम्नलिखित सुधार किए हैं:
लाइब्रेरी के साथ ही प्लेलिस्ट पर काम करता है। किसी भी लापता कॉलम को नजरअंदाज कर दिया जाता है और आदेश का पता लगा लिया जाता है, इसलिए इसे Google संगीत के अंदर लगभग किसी भी गीत सूची पर काम करना चाहिए।
जब यह नीचे पहुंचता है (या स्क्रॉल स्थिति का पता लगाता है), या निर्दिष्ट समय समाप्त होने के बाद यह या तो रुक जाता है। कुछ पिक्सेल द्वारा स्क्रॉल डिटेक्शन कोड बंद होने की स्थिति में एक अंतहीन लूप को रोकने के लिए समयबाह्य है।
यह बहुत तेज़ है (प्रत्येक 1ms अंतराल), लेकिन प्रतीक्षा करता है कि क्या डेटा तैयार नहीं है (निर्दिष्ट टाइमआउट तक, वर्तमान में 3% तक)।
ऑपरेशन के दौरान और आउटपुट पर कटौती करता है।
गैथर्स रेटिंग्स: "अपरिभाषित" को कभी भी रेट नहीं किया गया है, "0" रेट नहीं किया गया है (यानी एक बार रेटेड लेकिन फिर हटा दिया गया), "1" अंगूठे नीचे है, और "5" अंगूठे (ऊपर) है।
बुनियादी सुधारों के अलावा, यह पाठ को अच्छी तरह से प्रारूपित करता है और इसे क्लिपबोर्ड पर कॉपी करता है। songsToText
फ़ंक्शन को दूसरी बार चलाने पर आप डेटा को सीएसवी के रूप में भी प्राप्त कर सकते हैं ।
विकल्प:
यदि आपको Python API की आवश्यकता है, तो अनधिकृत Google Music API प्रोजेक्ट देखें।
यदि आपके पास प्लेलिस्ट के टन हैं और उन सभी को एक बार में निर्यात करना चाहते हैं, तो gmusic-script प्लेलिस्ट निर्यातक को आज़माएं जो ऐसा कर सकता है (पायथन, अनौपचारिक एपीआई परियोजना का उपयोग करता है)।