গুগল প্লে সঙ্গীত থেকে প্লেলিস্ট মুদ্রণ করুন


43

আমি আমার গুগল প্লে মিউজিক অ্যাকাউন্ট থেকে গানের একটি তালিকা (শিল্পী, অ্যালবাম, রেটিং সহ এবং সম্ভব হলে নাটকের সংখ্যা এবং সময়কাল সহ) মুদ্রণ করতে চাই ।

অ্যাপ থেকে এটি করার সহজ কোনও উপায় নেই। গানের দীর্ঘ তালিকার মাধ্যমে আমি পৃষ্ঠা হিসাবে প্রিন্ট-স্ক্রিনগুলি করা টেকসই নয়।

আমি নিজেকে স্ট্যান্ডার্ড করতে পারি এমন একটি স্ট্যান্ডার্ড ফর্ম্যাটে (প্লেইন টেক্সট, সিএসভি, এক্সএমএল, ইত্যাদি) ডেটা রফতানিতে খুশি হব।

কোনও পরামর্শ?


উত্তর:


17

ডার্কলিকুইডের উত্তরটি সংশোধন করে আমি নিম্নলিখিতগুলি নিয়ে এসেছি যা এক সাথে একাধিক প্লেলিস্টগুলি সংরক্ষণ করার অনুমতি দেয় ।

নির্দেশাবলী:

  1. আপনার প্লেলিস্ট পৃষ্ঠাতে যান ।
  2. আপনার কনসোলটিতে নীচে জাভাস্ক্রিপ্ট কোডে আটকান।
  3. আপনি কোনও প্লেলিস্টে ক্লিক করুন যা আপনি পাঠ্যে সংরক্ষণ করতে চান।
  4. প্লেলিস্ট পৃষ্ঠায় একবার, তুলনামূলকভাবে ধীরে ধীরে নীচে স্ক্রোল করুন।
  5. আপনি নীচে স্ক্রোল করার পরে, মেনু বা আপনার ব্রাউজারগুলির পিছনে বোতামটি ব্যবহার করে প্লেলিস্ট পৃষ্ঠায় ফিরে যান (প্রথম ধাপ ১ এর মতো)।
  6. আপনি পাঠ্যে সংরক্ষণ করতে চান এমন সমস্ত প্লেলিস্টের জন্য 3-5 পদক্ষেপ পুনরাবৃত্তি করুন।
  7. আপনি পাঠ্যে সংরক্ষণ করতে চান এমন সমস্ত প্লেলিস্টগুলির জন্য এটি শেষ হয়ে গেলে আপনি হয় টাইপ করতে পারেন JSON.stringify(tracklistObj, null, '\t')( '\t'আপনি ' 'যদি নূন্যতম ইনডেন্টেশন চান তবে এটি পরিবর্তন করুন ) অথবা tracklistObjআপনি যদি জাভাস্ক্রিপ্ট অবজেক্টটি নিজের মতো করে চালিত করতে চান তবে। আপনি যদি এটি বাছাই করতে চান, কমান্ড কল করার Object.values(tracklistObj).forEach(a => a.sort()) আগে কমান্ডটি চালান JSON.stringify

আপনি যা করতে চান তা শেষ করার আগে পৃষ্ঠাটি রিফ্রেশ না করার বিষয়ে সতর্ক হন বা অন্যথায় আপনাকে পদক্ষেপ 1 থেকে পুনরায় চালু করতে হবে।

// Setup
var tracklistObj = {},
    currentPlaylist,
    checkIntervalTime = 100,
    lastTime;

// Process the visible tracks
function getVisibleTracks() {
    var playlist = document.querySelectorAll('.song-table tr.song-row');
    for(var i = 0; i < playlist.length ; i++) { 
        var l = playlist[i];

        var title = l.querySelector('td[data-col="title"] .column-content');
        if(title !== null)
            title = title.textContent;

        var artist = l.querySelector('td[data-col="artist"] .column-content');
        if(artist !== null)
            artist = artist.textContent;

        var duration = l.querySelector('td[data-col="duration"] span');
        if(duration !== null)
            duration = duration.textContent;

        var album = l.querySelector('td[data-col="album"] .column-content');
        if(album !== null)
            album = album.textContent;

        var playCount = l.querySelector('td[data-col="play-count"] span');
        if(playCount !== null)
            playCount = playCount.textContent;

        var rating = l.querySelector('td[data-col="rating"]');
        if(rating !== null)
            rating = rating.textContent;

        // Add it if it doesn't exist already
        if(tracklistObj[currentPlaylist] && !tracklistObj[currentPlaylist].includes(artist + " - " + title)) {
            tracklistObj[currentPlaylist].push(artist + " - " + title);

            if(printTracksToConsole) {
                console.log(artist + ' - ' + title);
            }
        }
    }
}

// Listen for page changes
window.onhashchange = function(e) {
    currentPlaylist = null; 

    var doneLoading = setInterval(function() {
        var playListName = document.querySelector('.gpm-detail-page-header h2[slot="title"]');
        if(playListName != null) {
            currentPlaylist = playListName.innerText;
            if(tracklistObj[currentPlaylist] === undefined) {
                tracklistObj[currentPlaylist] = [];
            }

            console.log("===================================");
            console.log("Adding to playlist " + currentPlaylist);

            getVisibleTracks();

            clearInterval(doneLoading);
        }
    }, 100);

}

// Check for new tracks every so often
setInterval(function() {
    getVisibleTracks();
}, checkIntervalTime);

// Whether or not to print the tracks obtained to the console
var printTracksToConsole = false;

এছাড়াও আপনি হিসাবে আপনি পরিবর্তন করে যেতে কনসোলে ট্র্যাক নাম মুদ্রণ করতে পারেন printTracksToConsoleথেকে true(আপনি পদক্ষেপ 3 আগে এই কি করা উচিত)।

নোট করুন যে আপনি সম্ভবত কনসোলে সমস্ত জিইটি এবং পোষ্ট ত্রুটিগুলি উপেক্ষা করতে পারেন (এগুলি স্ক্রিপ্ট নয়, প্লে মিউজিক নিজেই তৈরি করেছেন)।

এছাড়াও মনে রাখবেন বর্তমানে সেটআপ শুধুমাত্র দিতে Artist - Track name, কিন্তু আপনি খুব সহজেই লাইন আছে যা সম্পাদনা করতে পারেন tracklistObj[currentPlaylist].push(artist + " - " + title);সঙ্গে album, playCount, duration, অথবা rating, এবং / অথবা যাই হোক না কেন বিন্যাস যদি আপনি চান (অনুগ্রহ করে যদি আপনি তা CSV বিন্যাসে সহ)।

ডিফল্ট সেটিংসের সাথে উদাহরণের আউটপুট (বর্তমানে আমার কাছে থাকা সমস্ত গুগল প্লে প্লেলিস্ট)। 32 টি প্লেলিস্টের প্রত্যেকটিতে নেভিগেট করতে, সেগুলি নীচে স্ক্রোল করুন এবং তারপরে ফলাফলটিকে পাঠ্যে রূপান্তর করতে মোটামুটি 5 মিনিট সময় লেগেছে।

পিএস আপনার আউটপুট থেকে ইউটিউব প্লেলিস্টগুলি তৈরি করতে টিউন মাই মিউজিক বলে একটি সাইট ব্যবহার করতে আগ্রহী হতে পারে (তবে ইউটিউব প্লেলিস্ট তৈরি 10 দিনের মধ্যে নিষিদ্ধ করে) আউটপুট থেকে যাতে আপনার বন্ধুরা আপনার গুগল প্লেলিস্ট শুনতে পারে। আপনি যদি এটি করেন, আপনি সম্ভবত টেক্সটমেকানিকের মতো কিছু উদ্ধৃতিগুলি এবং আউটপুট তালিকা থেকে সরাতে ব্যবহার করতে চান .mp3


1
যদি কনসোলে জাভাস্ক্রিপ্ট আটকানোর চেয়ে এটি করার আরও ভাল উপায় ছিল তবেই। (আমারও কিছুটা হিচাপ ছিল যেহেতু উব্লক অরিজিন স্ক্রিপ্টটি ব্লক করেছে।) তবে, এটি আমার যা প্রয়োজন তা করে does
আলে

আমি এখনই এটি পুরানো হয়ে উঠতে ভীত :( টাইপ এরির: getVisibleTracks (<নামবিহীন>: 20: 43) এ <নামবিহীন>: 49: 5 এ সি ( play-music.gstatic.com/ ফে / 6..ই / শুনুন__en_gb.js: 1190: 211 )
ফ্লোরি

4
@ ফ্লোরিও মন্তব্য করার জন্য ধন্যবাদ! আমি কোডটি আপডেট করেছি যাতে এটি এখন আবার কাজ করে।
জ্যাচ সসিয়ের

2
@ এল আছে। আপনি কোডটি বুকমার্কলেটে পরিণত করতে পারেন।
ডেভিড মেটকালফ

এই কোডটি চালনার সময় কনসোল ত্রুটিগুলি উপস্থিত হয়, তবে এটি চলমান থেকে
আটকাচ্ছে

31

(আপডেট হয়েছে 2016-05-09, বর্তমান শীর্ষ উত্তরের চেয়ে বেশি শক্তিশালী)

আপনার যদি কেবল কয়েকটি প্লেলিস্ট সংরক্ষণ করতে চান তবে আপনি নীচে আমার জাভাস্ক্রিপ্ট স্নিপেট ব্যবহার করতে পারেন। এই স্নিপেটটি প্রতিটি তালিকাকে ওয়েবপৃষ্ঠায় প্রদর্শিত হিসাবে সংরক্ষণ করতে পারে তাই এটি সমস্ত গান / অ্যালবাম / শিল্পীদের লাইব্রেরি দর্শনগুলির জন্যও কাজ করে। আমি এই উত্তরের শেষে আরও দুটি বিকল্প তালিকাভুক্ত করেছি।

  1. এখানে যান: https://play.google.com/music/listen#/all (বা আপনার প্লেলিস্ট)

  2. একটি বিকাশকারী কনসোল (Chrome এর জন্য F12) খুলুন। কনসোলের নীচে কোড আটকান।

  3. সমস্ত স্ক্র্যাপযুক্ত গানগুলি 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দ্বিতীয়বার ফাংশনটি চালিয়ে ।

বিকল্প:

  1. আপনার যদি পাইথন এপিআই দরকার হয় তবে আনুষ্ঠানিক গুগল মিউজিক এপিআই প্রকল্পটি দেখুন।

  2. আপনার যদি অজস্র প্লেলিস্ট রয়েছে এবং সেগুলি একবারে রফতানি করতে চান তবে gmusic- স্ক্রিপ্টস প্লেলিস্ট রফতানিকারী চেষ্টা করুন যা এটি করতে পারে (পাইথন, বেসরকারী এপিআই প্রকল্পটি ব্যবহার করে)।


আরে এই কোডটির জন্য কেবল অনুসরণ করুন: এটি কেবলমাত্র সর্বশেষ 30 টি গান অনুলিপি করার ফলাফল দেয় এবং আমি যখন টোকটেক্সট ("আর্টিস্টং") গান করি তখন এটি কয়েক মিনিটের মধ্যে সেকেন্ডে বেরিয়ে যায়: সেকেন্ড এবং প্লেলিস্টে ট্র্যাক নম্বর। গানের বিবরণগুলি যাইহোক যাইহোক, তবে সেগুলির মধ্যে কেবলমাত্র 30 টি রয়েছে (শত শত সহ আমার প্লেলিস্ট রয়েছে)
এম কে এলএন

গানের সংখ্যার উপর লক্ষ্য রাখবেন না, এটি 30 এ আটকে যায় না But তবে ১৩০ টি গানের সাথে অন্য কোনও প্লেলিস্টে এটি কেবল প্রথম ১১7 রফতানি করে
m

@ এমকেএলএন আমি কোডটি আপডেট করেছি, এখন এটি লাইব্রেরি, প্লেলিস্টগুলি পাশাপাশি গুগল সংগীতের প্রতিটি গানের তালিকা পরিচালনা করে। কেবল সবকিছু চালান এবং এটি প্লেলিস্ট / গ্রন্থাগার / তালিকাটি ক্লিপবোর্ডে একটি পাঠ্য তালিকা হিসাবে অনুলিপি করবে। আপনার যদি এমন কোনও সিএসভি সংস্করণ প্রয়োজন হয় যার মধ্যে সবকিছু অন্তর্ভুক্ত থাকে (প্লে গণনা, সময়কাল, রেটিং), songsToText("all", true)পরে চালানো ।
jmiserez

ধন্যবাদ, এটি দুর্দান্ত কাজ করে। আমি একটি পাইথন স্ক্রিপ্ট লেখার চেষ্টা করছি যা সমস্ত প্লেলিস্টগুলিকে সংরক্ষণ করে। আপনি কীভাবে জাভাস্ক্রিপ্টের মাধ্যমে বিভিন্ন প্লেলিস্টে ক্লিক করবেন? ফাংশনের শুরুতে প্লেলিস্ট নির্বাচক থাকা কি সম্ভব হবে?
mkln

1
@ এমকিএলএন ওয়েল এই লোকটি ইতিমধ্যে এটি করেছে: github.com/soulfx/gmusic-playlist আপনি যদি তার পাইথন স্ক্রিপ্টটি ব্যবহার করেন তবে সম্ভবত সবচেয়ে সহজ! আমি এখন পর্যন্ত এটিকে সত্যই দেখিনি, তবে আপনার যদি একাধিক প্লেলিস্টের প্রয়োজন হয় তবে এটি সম্ভবত সেরা বিকল্প।
jmiserez

18

আপনি যদি আপনার ব্রাউজারগুলির বিকাশকারী কনসোলে কিছুটা জাভাস্ক্রিপ্ট কোড চালানোতে আপত্তি না দেখান তবে আপনি পৃষ্ঠা থেকে এই জাতীয় তথ্য বের করতে পারেন (কেবলমাত্র ক্রোমে পরীক্ষিত):

var playlist = document.querySelectorAll('.song-table tr.song-row');
for(var i =0; i<playlist.length ; i++) { 
  var l = playlist[i]; 
  var title = l.querySelector('td[data-col="title"] .column-content').textContent;
  var artist = l.querySelector('td[data-col="artist"] .column-content').textContent;
  var album = l.querySelector('td[data-col="album"] .column-content').textContent;
  console.log(artist + ' --- ' + title + ' --- ' + album); 
}

এটি উইন্ডোতে সর্বাধিক দৃশ্যমান গানের তালিকার কনসোলে মুদ্রণ করবে। আরও পেতে আপনার নীচে স্ক্রোল করতে হবে এবং এটি আবার চালাতে হবে। এই মুহুর্তে আমি এখনও সম্পূর্ণরূপে তথ্য দখল করার একটি শালীন উপায় বের করতে পারি নি, তবে এই দ্রুত 5 মিনিটের হ্যাকটি কোনও কিছুর চেয়ে ভাল।


এটি আশাব্যঞ্জক মনে হচ্ছে। আমি এক বার যেতে হবে।
আলে

2
এই উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। আপনি আমাকে ঘন্টা এবং ঘন্টা সময় বাঁচাতে। আমি যা করেছি তা হ'ল আপনার লিপিটি বার বার চালানো প্লেলিস্টে আমার অনুলিপি চেয়েছিল। পাঠ্য সোপ নামে একটি ম্যাক অ্যাপে ফলাফলগুলি আটকান। পরিণত ",". সদৃশ সরানো এবং txt হিসাবে রফতানি। তারপরে এটি সিএসভিতে পরিবর্তিত হয়েছে, বিনাবিহীন কলামগুলি ছড়িয়ে ফেলে স্পোটাইফায় ব্যবহার করে তা আমদানি করেছে: ivyishere.org সব মিলিয়ে আমাকে প্রায় আট মিনিট সময় নিয়েছিল এটির হ্যাং পেয়েছি, চিয়ার্স ~

সমস্যা নেই, সাহায্য করে খুশি।
অন্ধকার

দেখে মনে হচ্ছে এটি কৌশলটি করতে চলেছে। আমার বৃহত্তম সমস্যাটি হ'ল আমার প্লেলিস্টগুলির আকার - আমি যেটি রফতানির চেষ্টা করছি তার 180 টি। আমি আমার ক্রোম উইন্ডোটি সর্বাধিকীকরণের মাধ্যমে কিছুটা পেরেছি এবং তারপরে যতদূর সম্ভব জুম আউট করেছি। যদি আমি ক্রোমকে কেবলমাত্র 10% জুম করার জন্য বোঝাতে পারি তবে আমার এটি সমস্ত একটি স্ক্রিনে ছিল ... 25% এ, এটি দুটি রাউন্ড এবং আরও কিছুটা বেশি সময় নেয়। (যে কোনও সুযোগ আপনি জেএস থেকে জুম করতে পারেন?)
রবার্টবি

1
এফওয়াইআই, যদি আপনি কেবল একটি উপাদান থাকেন তবে এর querySelector(...)পরিবর্তে ব্যবহার করুনquerySelectorAll(...)[0]
থিফমাস্টার

3

শীর্ষের উত্তরটি (সেই সময়ে) ব্যবহার করে এবং একটি সম্পূর্ণ সমাধানের সন্ধানের জন্য, আমি নিম্নলিখিত কোড তৈরি করেছি যা সংগীত তালিকার নিচে স্ক্রল করে এবং JSON অবজেক্টগুলিকে এটির সাথে যুক্ত করে।

কোন গানগুলি দৃশ্যমান তা সঠিকভাবে না জানার কারণে কোডটি সেগুলি সমস্ত যুক্ত করে, তারপরে শেষে ডুপ্লিকেটগুলি। (কেবলমাত্র ক্রোমে পরীক্ষিত)

ব্যবহারের জন্য: আপনার লাইব্রেরিতে যান, যেখানে আপনি আপনার পুরো গানের তালিকা দেখেন এবং চালান

var total = [];
var interval = setInterval(function(){
    var songs = document.querySelectorAll("table.song-table tbody tr.song-row");
    for (var i = 0; i < songs.length; i++) {
        total.push({name: songs[i].childNodes[0].textContent,
        length: songs[i].childNodes[1].textContent,
        artist: songs[i].childNodes[2].textContent,
        album: songs[i].childNodes[3].textContent,
        plays: songs[i].childNodes[4].textContent
        });
        songs[i].scrollIntoView(true);
    }
}, 800);

এটি যখন পৃষ্ঠার নীচে পৌঁছে যায়, স্ক্রোলিং বন্ধ করতে এটি চালান, ডি-সদৃশ অ্যারেটি, এবং ক্লিপবোর্ডে জেএসএন অনুলিপি করুন।

clearInterval(interval);
for (var i = 0; i < total.length; i++) {
    for (var j = i + 1; j < total.length; j++) {
        if (total.hasOwnProperty(i) && total.hasOwnProperty(j) && total[i].name == total[j].name && total[j].artist == total[i].artist) {
            total.splice(j,1);
        }
    }
}
copy(total);

3

আমার কাছে কিছুটা খাটো জাভাস্ক্রিপ্ট রয়েছে যা আপনি কনসোলে আটকে দিতে পারেন। কোডটি পুনরায় চালনার পরিবর্তে আপনি কেবল নীচে স্ক্রোল করতে পারেন এবং সমস্ত অ্যালবাম যা দেখা যায় তা যুক্ত করা হয়। তারপরে আপনি প্লেলিস্টটি স্প্রেডশিট হিসাবে ডাউনলোড করতে পারেন।

নির্দেশনা

  1. এখানে যান: https://play.google.com/music/listen#/ap/auto-playlist-thumbs-up

  2. বিকাশকারী সরঞ্জাম (F12) খুলুন এবং নীচের কোডটি কনসোল ট্যাবে আটকান

  3. চারদিকে স্ক্রোল করুন যাতে প্লেলিস্টের প্রতিটি অ্যালবাম কমপক্ষে একবারে দৃশ্যমান হয়

  4. ডাউনলোড করতে পৃষ্ঠায় কোথাও ডাবল ক্লিক করুন export-google-play.csv

  5. export-google-play.csvএক্সেলে খুলুন ।

কোড

alert("Please scroll through the playlist so that each album is visible once.\n" + 
      "Then double-click the page to export a spreadsheet.");
var albums = ["Artist,Album,Purchased"];

var addVisibleAlbums = function(){
    [].forEach.call(document.querySelectorAll(".song-row"), function(e){ 
        var albumNodes = [e.querySelector("td[data-col='artist']"), 
              e.querySelector("td[data-col='album']"),
              e.querySelector("td[data-col='title'] .title-right-items")];

        var albumString = albumNodes.map(function(s){ 
            return s.innerText.trim().replace(/,/g,""); 
        }).join(",");

        if(albums.indexOf(albumString) === -1){
            albums.push(albumString); console.log("Added: " + albumString)
        }
    });
}

var createCsv = function(){
    var csv = "data:text/csv;charset=utf-8,";
    albums.forEach(function(row){ csv += row + "\n"; }); 

    var uri = encodeURI(csv);
    var link = document.createElement("a");
    link.setAttribute("href", uri);
    link.setAttribute("download", "export-google-play.csv");
    document.body.appendChild(link);
    link.click(); 
    alert("Download beginning!")
}

document.body.addEventListener("DOMNodeInserted", addVisibleAlbums, false);
document.body.addEventListener("dblclick", createCsv, false);

আউটপুট

এখানে চিত্র বর্ণনা লিখুন

GitHub


2

আমি উপরের উত্তরের পদ্ধতির কিছুটা পরিবর্তন করেছি। আইভির অনুলিপি / পেস্ট পদ্ধতি ( http://www.ivyishere.org/ivy ) দিয়ে এটি আমার পক্ষে আরও ভাল কাজ করেছে :

ধাপ 1 খুলুন প্লেলিস্ট আপনাকে Chrome এ Google সঙ্গীত থেকে চান এবং কনসোল লেপন করুন:

document.querySelector('body.material').style.height = (document.querySelector('table.song-table tbody').getAttribute('data-count') * 100) + 'px';

এটির ফলে আপনার পুরো প্লেলিস্টটি কেবলমাত্র একটি অংশের পরিবর্তে রেন্ডার করা উচিত।

পদক্ষেপ 2 এই স্ক্রিপ্টটি কনসোলে আটকান:

var i, j, playlistString = '', playlist = document.querySelectorAll('.song-table tr.song-row');
for (i = 0, j = playlist.length; i < j; i++) {
    var track = playlist[i]; 
    var artist = track.querySelector('[href][aria-label]').textContent;
    var title = track.querySelector('td[data-col="title"]').textContent;
    playlistString += ('"' + artist + '", "' + title + '"\n');
}
console.log(playlistString);

পদক্ষেপ 3 আইভীতে যান এবং যখন আপনি সেখানে দ্বিতীয় ধাপে পৌঁছান, অনুলিপি করুন / আটকান ট্যাবটি নির্বাচন করুন এবং সেখানে কনসোল আউটপুট আটকে দিন।

সম্পাদনা

অ্যালেক্স পেডারসেন প্রস্তাবিত আপডেট স্ক্রিপ্ট

সামুরিউনটেস্কিস রিফাইনমেন্টে আইট্রেট করা (তাঁর পোস্টে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার এখনও নেই)। আমি মনে করি গুগলপ্লে স্টাইলিং আপডেট হয়েছে তাই নীচের স্ক্রিপ্টটি আবার একটি সুন্দর আউটপুট দেয়।

var i, j, playlistString = '', playlist = document.querySelectorAll('.song-table tr.song-row');
for (i = 0, j = playlist.length; i < j; i++) {
    var track = playlist[i]; 
    var artist = track.querySelector('[href][aria-label]').textContent;
    var title = track.querySelector('span[class="column-content fade-out tooltip"]').textContent;
    playlistString += ('"' + artist + '", "' + title + '"\n');
}
console.log(playlistString);

-1

পাঠ্যটি অত্যন্ত ক্ষুদ্রতর হওয়া অবধি কেবল করুন Ctrl+ এবং এরপরে এটি নির্বাচন করুন। এটি স্ক্রিপ্ট এবং অ্যাপ্লিকেশন ব্যতীত কবজির মতো কাজ করে।


-2

আমি সবেমাত্র অনুরূপ কিছু সন্ধানে এই প্রশ্নটি জুড়ে এসেছি।

আমার ধারণা, আপনার সেরা বিকল্পটি হ'ল:

  1. "প্লেলিস্ট ব্যাকআপ" এর মতো একটি অ্যাপ্লিকেশন ইনস্টল করুন
  2. গুগল মিউজিক প্লেলিস্টটি এই অ্যাপ্লিকেশনটির মাধ্যমে একটি পাঠ্যফাইলে রফতানি করুন।
  3. ফাইলম্যানেজার অ্যাপ্লিকেশন (ভুত কমান্ডারের মতো) দিয়ে এটি .m3u নামকরণ করুন
  4. আরও অপশন রয়েছে (যেমন MusiXMatch) প্লেলিস্ট খুলুন।

1
আমি ধরে নিচ্ছি আপনি এই অ্যাপ্লিকেশনটি বোঝাচ্ছেন । ভাল না. আমার কাছে অ্যান্ড্রয়েড ডিভাইস থাকার সময় আমি কোনও অ্যান্ড্রয়েড সমাধান খুঁজছি না। আরও, আমি এই অ্যাপ্লিকেশনটি চেষ্টা করেছি এবং এটি ডিভাইসে থাকা ট্র্যাকগুলিতে ডেটা রফতানি করতে পারে না, সুতরাং এটি আমার পক্ষে অকেজো।
আলে

1
অলিভার, ওয়েব অ্যাপ্লিকেশন হওয়ায় আমরা এমন উত্তরগুলি পছন্দ করি যেগুলির জন্য দেশীয় অ্যাপ্লিকেশন প্রয়োজন হয় না।
ভিদার এস রামদাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.