(আপডেট হয়েছে 2016-05-09, বর্তমান শীর্ষ উত্তরের চেয়ে বেশি শক্তিশালী)
আপনার যদি কেবল কয়েকটি প্লেলিস্ট সংরক্ষণ করতে চান তবে আপনি নীচে আমার জাভাস্ক্রিপ্ট স্নিপেট ব্যবহার করতে পারেন। এই স্নিপেটটি প্রতিটি তালিকাকে ওয়েবপৃষ্ঠায় প্রদর্শিত হিসাবে সংরক্ষণ করতে পারে তাই এটি সমস্ত গান / অ্যালবাম / শিল্পীদের লাইব্রেরি দর্শনগুলির জন্যও কাজ করে। আমি এই উত্তরের শেষে আরও দুটি বিকল্প তালিকাভুক্ত করেছি।
এখানে যান: https://play.google.com/music/listen#/all (বা আপনার প্লেলিস্ট)
একটি বিকাশকারী কনসোল (Chrome এর জন্য F12) খুলুন। কনসোলের নীচে কোড আটকান।
সমস্ত স্ক্র্যাপযুক্ত গানগুলি allsongs
অবজেক্টে সংরক্ষণ করা হয় এবং তালিকার একটি পাঠ্য সংস্করণ ক্লিপবোর্ডে অনুলিপি করা হয়। আমি songsToText("all",true)
সম্পূর্ণ সিএসভি তথ্য পেতে পরে চালানোর পরামর্শ দিচ্ছি
। copy(outText)
যদি ক্লিপবোর্ড অনুলিপিটি প্রথম চেষ্টাটিতে কাজ না করে তবে ম্যানুয়ালি চালান ।
কোড (সর্বশেষ সংস্করণ 10 মে, 2016, রেভ 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);
গিথুব (গিস্ট) -এর সর্বশেষ কোডটি এখানে: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75
আপনি যদি কোনও পাঠ্য বিন্যাসে আউটপুট চান, গানস টোেক্সট () ফাংশনটিতে কল করতে পারেন। আপনি একটি শৈলী নির্বাচন করতে পারেন, ফর্ম্যাটটি চয়ন করতে পারেন এবং যদি পছন্দ / থাম্বড আপ করা গানগুলি রফতানি করা উচিত। ফলস্বরূপ তালিকাটি ক্লিপবোর্ডে আটকানো হবে। শৈলী হয় all
, artist
, artistalbum
, artistsong
,
artistalbumsong
। CSV এর ফলে একটি CSV ফাইল তৈরি হবে এবং এটিকে ছেড়ে দেওয়া যেতে পারে (ডিফল্টকে ভুয়াতে)। লাইকডোনালি বাদ দেওয়া যেতে পারে (মিথ্যাতে ডিফল্ট) বা সত্যে সেট করা যায় এবং 5 টিরও বেশি বা সমান রেটিং সহ সমস্ত গান ফিল্টার করবে Eg যেমন:
songsToText("all",true,false)
সমস্ত গান সিএসভি ফর্ম্যাটে রফতানি করবে।
songsToText("all",true,true)
কেবল সিএসভি ফর্ম্যাটে পছন্দ করা গান রফতানি করবে।
songsToText("artistsong",false,false)
সমস্ত গান পাঠ্য হিসাবে রফতানি করবে।
তারপরে আপনি নিজের পছন্দ মতো ডেটা পেস্ট করতে পারেন, উদাহরণস্বরূপ http://www.ivyishere.org/ আপনি যদি আপনার স্পটিফাই অ্যাকাউন্টে গান বা অ্যালবামগুলি যুক্ত করতে চান তবে। আইভিকে পূর্ণ অ্যালবামগুলি সনাক্ত করতে, "আর্টিস্টালবাম" স্টাইলটি ব্যবহার করুন। গানের জন্য, "আর্টিস্টং" স্টাইলটি ব্যবহার করুন।
স্নিপেট সম্পর্কে:
এটি মাইকেল স্মিথের মূল উত্তরের উপর ভিত্তি করে তৈরি, তবে এটি আরও কিছুটা দৃ is়। আমি নিম্নলিখিত উন্নতি করেছি:
প্লেলিস্টের পাশাপাশি লাইব্রেরিতে কাজ করে। অনুপস্থিত যে কোনও কলামগুলি উপেক্ষা করা হবে এবং অর্ডারটি বের করে আনা হয়েছে, সুতরাং এটি গুগল মিউজিকের মধ্যে প্রায় কোনও গানের তালিকায় কাজ করা উচিত।
এটি নীচে পৌঁছে গেলে (স্ক্রোলের অবস্থান সনাক্ত করে) বা নির্দিষ্ট সময়সীমা শেষ হওয়ার পরে এটি বন্ধ হয়ে যায়। স্ক্রোল শনাক্তকরণ কোডটি কয়েক পিক্সেল বন্ধ করে দিলে একটি অন্তহীন লুপ প্রতিরোধের সময়সীমাটি রয়েছে।
এটি অনেক দ্রুত (প্রতি 1 মিনিট অন্তর), তবে ডেটা প্রস্তুত না হলে অপেক্ষা করে (নির্দিষ্ট সময়সীমা অবধি, বর্তমানে 3s)।
অপারেশন চলাকালীন এবং আউটপুট উপর নকল করে Does
সংগ্রহের রেটিং: "অপরিবর্তিত" কখনই রেট হয় না, "0" রেট দেওয়া হয় না (যেমন একবার রেট দেওয়া হয় তবে সরানো হয়), "1" থাম্বস ডাউন হয় এবং "5" থাম্বস আপ হয় (পছন্দ করে)।
মৌলিক উন্নতির পাশাপাশি এটি পাঠ্যটিকে সুন্দরভাবে ফর্ম্যাট করে এবং ক্লিপবোর্ডে অনুলিপি করে। আপনি চাইলে সিএসভি হিসাবে ডেটা পেতে পারেন, songsToText
দ্বিতীয়বার ফাংশনটি চালিয়ে ।
বিকল্প:
আপনার যদি পাইথন এপিআই দরকার হয় তবে আনুষ্ঠানিক গুগল মিউজিক এপিআই প্রকল্পটি দেখুন।
আপনার যদি অজস্র প্লেলিস্ট রয়েছে এবং সেগুলি একবারে রফতানি করতে চান তবে gmusic- স্ক্রিপ্টস প্লেলিস্ট রফতানিকারী চেষ্টা করুন যা এটি করতে পারে (পাইথন, বেসরকারী এপিআই প্রকল্পটি ব্যবহার করে)।