Google Play संगीत से प्लेलिस्ट चलाएँ


43

मैं अपने Google Play संगीत खाते से गीतों की सूची (कलाकार, एल्बम, रेटिंग और, यदि संभव हो तो, नाटकों की संख्या और अवधि) मुद्रित करना चाहता हूं ।

ऐप से ऐसा करने का कोई आसान तरीका नहीं है। गीतों की एक लंबी सूची के माध्यम से आई-पेज के रूप में प्रिंट-स्क्रीन करना टेनबल नहीं है।

मैं एक मानक प्रारूप (सादे पाठ, सीएसवी, एक्सएमएल, आदि) के लिए डेटा के निर्यात से खुश हूं कि मैं खुद को हेरफेर कर सकता हूं।

कोई सुझाव?


जवाबों:


17

डार्कक्लाइड के उत्तर को संशोधित करते हुए , मैं निम्नलिखित के साथ आया जो कई प्लेलिस्ट को एक बार में सहेजने की अनुमति देता है ।

निर्देश:

  1. अपने प्लेलिस्ट पेज पर जाएं ।
  2. अपने कंसोल में नीचे दिए गए जावास्क्रिप्ट कोड में पेस्ट करें।
  3. उस प्लेलिस्ट पर क्लिक करें जिसे आप टेक्स्ट में सहेजना चाहते हैं।
  4. एक बार प्‍लेलिस्‍ट पेज पर, नीचे की ओर धीरे-धीरे स्क्रॉल करें।
  5. नीचे की ओर स्क्रॉल करने के बाद, मेनू या अपने ब्राउज़र बैक बटन का उपयोग करके प्लेलिस्ट पेज (जैसे चरण 1 में) पर वापस जाएं।
  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 से पहले ऐसा करना चाहिए)।

ध्यान दें कि आप संभवतः कंसोल में सभी GET और POST त्रुटियों को अनदेखा कर सकते हैं (ये Play Music द्वारा ही बनाए गए हैं, इस लिपि में नहीं)।

यह भी ध्यान रखें कि वर्तमान में यह सेटअप केवल देने के लिए Artist - Track name, लेकिन आप आसानी लाइन है कि संपादित कर सकते हैं tracklistObj[currentPlaylist].push(artist + " - " + title);के साथ album, playCount, duration, या rating, और / या जो कुछ भी आप चाहते हैं स्वरूपण (कृपया अगर आप ऐसा सीएसवी प्रारूप सहित)।

उदाहरण आउटपुट (सभी Google Play प्लेलिस्ट मैं वर्तमान में है) डिफ़ॉल्ट सेटिंग्स के साथ। 32 प्लेलिस्ट में से प्रत्येक पर नेविगेट करने, उन्हें नीचे स्क्रॉल करने और फिर परिणाम को टेक्स्ट में बदलने में कुल 5 मिनट का समय लगा।

PS आपको YouTube प्लेलिस्ट बनाने के लिए मेरे द्वारा ट्यून माय म्यूज़िक नामक एक साइट का उपयोग करने में रुचि हो सकती है (लेकिन YouTube आउटपुट से प्लेलिस्ट प्रतिदिन 10 तक प्रतिबंधित करता है) ताकि आपके मित्र आपके Google Playlists को सुन सकें। यदि आप ऐसा करते हैं, तो आप शायद उद्धरण और आउटपुट सूची से निकालने के लिए TextMechanic जैसी किसी चीज़ का उपयोग करना चाहते हैं .mp3


1
यदि केवल कंसोल में जावास्क्रिप्ट को पेस्ट करने की तुलना में ऐसा करने का एक बेहतर तरीका था। (मुझे भी थोड़ी हिचकी आई थी क्योंकि उब्लॉक ओरिजिन ने स्क्रिप्ट को ब्लॉक कर दिया था।) लेकिन, यह वही है जो मुझे चाहिए।
इल

मुझे डर है कि यह अब पुराना हो गया है :( TypeError: पढ़ी जा सकने वाली प्रॉपर्टी 'में getVoubleTracks में अपरिभाषित' शामिल नहीं है (<अनाम>: 20: 43) <अनाम>: 49: 5 at c ( play-music.gstatic.com/ fe / 6..e / Listen__en_gb.js: 1190: 211 )
फ्लोरियन

4
@FloriOn टिप्पणी करने के लिए धन्यवाद! मैंने कोड को अपडेट किया ताकि यह अब फिर से काम करे।
Zach Saucier

2
@ यल है। आप कोड को बुकमार्कलेट में बदल सकते हैं।
डेविड मेटकाफ

कंसोल
कोड्स

31

(अपडेट किया गया 2016-05-09, वर्तमान शीर्ष उत्तर से अधिक मजबूत)

यदि आपको बस कुछ प्लेलिस्ट को सहेजने की आवश्यकता है, तो आप नीचे दिए गए मेरे जावास्क्रिप्ट स्निपेट का उपयोग कर सकते हैं। यह स्निपेट हर सूची को सहेज सकता है क्योंकि यह वेबपृष्ठ पर दिखाया गया है, इसलिए यह सभी गीतों / एल्बमों / कलाकारों के पुस्तकालय दृश्यों के लिए भी काम करता है। मैंने इस उत्तर के अंत में दो अन्य विकल्प सूचीबद्ध किए हैं।

  1. यहां जाएं: https://play.google.com/music/listen#/all (या आपकी प्लेलिस्ट)

  2. डेवलपर कंसोल खोलें (क्रोम के लिए F12)। कोड को नीचे कंसोल में पेस्ट करें।

  3. सभी स्क्रैप किए गए गाने 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फ़ंक्शन को दूसरी बार चलाने पर आप डेटा को सीएसवी के रूप में भी प्राप्त कर सकते हैं ।

विकल्प:

  1. यदि आपको Python API की आवश्यकता है, तो अनधिकृत Google Music API प्रोजेक्ट देखें।

  2. यदि आपके पास प्लेलिस्ट के टन हैं और उन सभी को एक बार में निर्यात करना चाहते हैं, तो gmusic-script प्लेलिस्ट निर्यातक को आज़माएं जो ऐसा कर सकता है (पायथन, अनौपचारिक एपीआई परियोजना का उपयोग करता है)।


अरे कोड के लिए बस एक अनुवर्ती: यह केवल पिछले 30 गाने कॉपी किए जाने के परिणामस्वरूप होता है, और जब मैं गाने करता हूँTTText ("आर्टिस्टॉन्ग") यह मिनटों में लंबाई: सेकंड और ट्रैक नंबर प्लेलिस्ट में आउटपुट करता है। गीतों के विवरण वैसे भी सभी में हैं, लेकिन उनमें से केवल 30 हैं (मेरे पास सैकड़ों के साथ प्लेलिस्ट हैं)
mkln

गाने की संख्या पर कोई बात नहीं, यह 30 पर अटक नहीं है। लेकिन 130 गाने के साथ एक और प्लेलिस्ट पर यह केवल 117 का निर्यात करता है।
mkln

@mkln मैंने कोड को अपडेट कर दिया है, अब यह लाइब्रेरी, प्लेलिस्ट और साथ ही Google संगीत में गीतों की हर दूसरी सूची को संभालता है। बस सब कुछ चलाएं और यह क्लिपबोर्ड पर एक पाठ सूची के रूप में प्लेलिस्ट / लाइब्रेरी / सूची की नकल करेगा। यदि आपको एक सीएसवी संस्करण की आवश्यकता है जिसमें सब कुछ शामिल है (प्ले काउंट, अवधि, रेटिंग), songsToText("all", true)बाद में चलाएं ।
jmiserez

यह बहुत अच्छा काम करता है, धन्यवाद। मैं एक अजगर स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो सभी प्लेलिस्ट को बचाता है। आप जावास्क्रिप्ट के माध्यम से विभिन्न प्लेलिस्ट पर कैसे क्लिक करेंगे? क्या फंक्शन की शुरुआत में प्लेलिस्ट चयनकर्ता होना संभव होगा?
mkln

1
@mkln इस आदमी ने पहले ही ऐसा कर लिया है: 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 के रूप में निर्यात किया गया। फिर इसे CSV में बदल दिया, अनएडेड कॉलम को छीन लिया और इसे Spotify का उपयोग करके आयात कर लिया: ivyishere.org सभी ने मुझे लगभग 8 मिनट में एक ले लिया, जिससे मैं इसे लटका पाया, चीयर्स ~

कोई समस्या नहीं, मदद करने के लिए खुश।
डार्कक्लाइड

ऐसा लग रहा है कि यह ट्रिक करने जा रहा है। मेरी सबसे बड़ी समस्या मेरे प्लेलिस्ट का आकार है - 180 जिस पर मैं निर्यात करने की कोशिश कर रहा हूं। मुझे अपनी Chrome विंडो को अधिकतम करने और फिर जितना हो सके उतना अधिक ज़ूम आउट करने के साथ थोड़ा सा मिल गया। अगर मैं क्रोम को 10% तक ज़ूम करने के लिए मना सकता था, तो मुझे यह सब एक स्क्रीन पर करना होगा ... 25% पर, इसे दो राउंड से अधिक और थोड़ा अधिक लेना चाहिए। (कोई भी मौका आप जेएस से ज़ूम कर सकते हैं?)
रॉबर्टबैंक

1
FYI करें, यदि आप सिर्फ एक तत्व हैं, तो querySelector(...)इसके बजाय का उपयोग करेंquerySelectorAll(...)[0]
ThiefMaster

3

शीर्ष उत्तर का उपयोग करते हुए (उस समय) और पूर्ण समाधान चाहते हैं, मैंने निम्न कोड बनाया है जो संगीत सूची को नीचे स्क्रॉल करता है और JSON ऑब्जेक्ट्स को एक सरणी में जोड़ता है।

ठीक से पता नहीं होने के कारण कि गाने क्या दिखाई देते हैं, कोड उन सभी को जोड़ता है, फिर अंत में डी-डुप्लिकेट करता है। (केवल Chrome में परीक्षण किया गया है)

उपयोग करने के लिए: अपनी लाइब्रेरी में जाएं, जहां आप अपनी पूरी गीत सूची देखते हैं, और दौड़ते हैं

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);

जब वह पृष्ठ के निचले हिस्से में पहुंच जाता है, तो स्क्रॉलिंग, डी-डुप्लिकेट सरणी को रोकने के लिए इसे चलाएँ, और JSON को क्लिपबोर्ड पर कॉपी करें।

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 क्रोम में 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 आइवी पर जाएं और जब आपको वहां चरण 2 मिलेगा, तो कॉपी / पेस्ट टैब चुनें और वहां कंसोल आउटपुट पेस्ट करें।

संपादित करें

एलेक्स पेडरसन द्वारा सुझाई गई अद्यतन स्क्रिप्ट

Samurauturetskys परिशोधन पर फेरबदल (मैं अपनी पोस्ट पर टिप्पणी करने के लिए अभी तक प्रतिष्ठा नहीं है)। मुझे लगता है कि Googleplay स्टाइलिंग ने अपडेट किया है, इसलिए नीचे दी गई स्क्रिप्ट फिर से एक सुंदर आउटपुट देती है।

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. इस ऐप के साथ Google संगीत प्लेलिस्ट को टेक्स्टफ़ाइल में निर्यात करें।
  3. एक फ़ाइल प्रबंधक ऐप (जैसे भूत कमांडर) के साथ इसका नाम .m3u पर बदलें
  4. एक और ऐप के साथ प्लेलिस्ट खोलें जिसमें अधिक विकल्प (जैसे MusiXMatch) हैं।

1
मेरा मानना ​​है कि आप इस एप्लिकेशन का मतलब है । अच्छा नहीं। जबकि मेरे पास एक Android डिवाइस है, मैं Android समाधान नहीं ढूंढ रहा हूं। इसके अलावा, मैंने इस ऐप की कोशिश की है और यह उन डिवाइसों पर डेटा निर्यात नहीं कर सकता है जो डिवाइस पर नहीं हैं, इसलिए यह मेरे लिए बेकार है।
एले

1
ओलिवर, वेब एप्लिकेशन होने के नाते, हम उन उत्तरों को प्राथमिकता देते हैं जिनमें देशी ऐप्स की आवश्यकता नहीं होती है।
विदर्भ एस। रामदल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.