Google Play Müzik'ten Çalma Listesini Yazdır


43

Google Play Müzik hesabımdan bir şarkı listesi (sanatçı, albüm, derecelendirme ve mümkünse, oyun ve süre ile birlikte) yazdırmak istiyorum .

Bunu uygulamadan yapmanın kolay bir yolu yoktur. Baskı ekranlarını uzun bir şarkı listesinde sayfa yaptığım sürece yapmak normal değildir.

Verileri kendim değiştirebileceğim standart bir formata (düz metin, CSV, XML vb.) Vermekten memnuniyet duyarım.

Baska öneri?


Yanıtlar:


17

Darkliquid'in cevabını değiştirerek , birden fazla çalma listesinin bir kerede kaydedilmesini sağlayan aşağıdakileri gördüm .

Talimatlar:

  1. Git Kişisel Çalma listeleri sayfası .
  2. Aşağıdaki JavaScript kodunu konsolunuza yapıştırın.
  3. Metne kaydetmek istediğiniz bir çalma listesine tıklayın.
  4. Çalma listesi sayfasında bir kez, yavaşça aşağı doğru kaydırın.
  5. Aşağıya doğru kaydırdıktan sonra, menüyü veya tarayıcılarınızı geri düğmesini kullanarak çalma listeleri sayfasına geri gidin (1. adımdaki gibi).
  6. Metne kaydetmek istediğiniz tüm oynatma listeleri için 3-5. Adımları tekrarlayın.
  7. Eğer herkes için metne kaydetmek istediğiniz çalma listelerini Bunu yaptıktan sonra, ya yazabilirsiniz JSON.stringify(tracklistObj, null, '\t')(değiştirmek '\t'için ' 'size az girinti istiyorsanız) ya da tracklistObjeğer sadece JavaScript nesnesi kendi yolunuzu işlemek için. Sıralanmasını istiyorsanız, komutu çağırmadan Object.values(tracklistObj).forEach(a => a.sort()) önce komutu çalıştırın JSON.stringify.

Yapmak istediğiniz her şeyi tamamlamadan önce sayfayı yenilememeye dikkat edin, aksi takdirde 1. adımdan baştan başlamanız gerekir.

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

Eğer değiştirerek giderken Ayrıca konsola parça adları yazdırabilirsiniz printTracksToConsoleiçin true(Adım 3 önce yapmalıdır).

Konsoldaki tüm GET ve POST hatalarını görmezden gelebileceğinizi unutmayın (bunlar, bu betiği değil Play Music'in kendisi tarafından oluşturulur).

Ayrıca şu anda 's kurulum sadece vermek unutmayın Artist - Track name, ancak kolayca sahip çizgiyi düzenleyebilirsiniz tracklistObj[currentPlaylist].push(artist + " - " + title);ile album, playCount, duration, veya rating, ve / ya da her ne (eğer bunu CSV biçimini lütfen dahil) istediğiniz formatı.

Varsayılan ayarlarla örnek çıktı (şu anda sahip olduğum tüm Google Play çalma listeleri). 32 çalma listesinin her birine gitmek, aşağı kaydırmak ve sonucu metne dönüştürmek yaklaşık 5 dakika sürdü.

PS YouTube çalma listeleri yapmak için Tune My Music adlı bir siteyi kullanmakla ilgilenebilirsiniz (ancak YouTube çalma listesi oluşturmayı günde 10 ile sınırlandırır) böylece arkadaşlarınız Google Çalma Listelerinizi dinleyebilir. Bunu yaparsanız, muhtemelen alıntıları ve çıkarılan listeden kaldırmak için TextMechanic gibi bir şey kullanmak istersiniz .mp3.


1
Bunu yapmak için konsolda JavaScript yapıştırmaktan daha iyi bir yol olsaydı. (Ayrıca Ublock Origin senaryoyu engellediğinden beri biraz hıçkırık yaşadım.) Ama bu ihtiyacım olanı yapıyor.
ale

Korkarım artık modası geçmiş :( TypeError: unVinibleTracks (<anonymous>: 20: 43) 'un' undefined özelliği '<' özelliğini <anonymous>: 49: 5 'te ( play-music.gstatic.com/) okuyamıyor fe / 6..e / listen__en_gb.js: 1190: 211 )
FloriOn

4
@FloriOn Yorumunuz için teşekkürler! Kodu şimdi yeniden çalışacak şekilde güncelledim.
Zach Saucier

2
@ale Var. Kodu bir yer imine dönüştürebilirsiniz.
David Metcalfe

Konsol kodu bu kodu çalıştırırken ortaya çıkıyor, ancak çalıştırılmasını engelliyor gibi görünmüyor
Otheus

31

(2016-05-09 güncellendi, en güncel yanıtlardan daha sağlam)

Birkaç şarkı listesini kaydetmeniz gerekiyorsa, aşağıdaki Javascript snippet'imi kullanabilirsiniz. Bu pasaj, her listeyi web sayfasında gösterildiği gibi kaydedebilir, böylece tüm şarkılar / albümler / sanatçılar kitaplık görünümleri için de çalışır. Bu cevabın sonunda iki alternatif daha listeledik.

  1. Git: https://play.google.com/music/listen#/all (veya çalma listeniz)

  2. Bir geliştirici konsolu açın (Chrome için F12). Aşağıdaki kodu konsola yapıştırın.

  3. Alınan tüm şarkılar allsongsnesnede saklanır ve listenin bir metin sürümü panoya kopyalanır. songsToText("all",true)CSV'nin tam bilgilerini almak için daha sonra çalıştırmanızı öneririm . copy(outText)Pano kopyalama ilk denemede işe yaramadıysa el ile çalıştırın .

Kod (en son sürüm 10 Mayıs 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);

Buradaki Github (Gist) hakkındaki en son kod: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75

  • Çıktının bir metin biçiminde olmasını istiyorsanız, songsToText () işlevini çağırabilirsiniz. Bir stil seçebilir, formatı seçebilir ve yalnızca sevilen / küçük şarkılar dışa aktarılmalıdır. Sonuçta ortaya çıkan liste panoya yapıştırılır. Stiller vardır all, artist, artistalbum, artistsong, artistalbumsong. CSV, CSV dosyasıyla sonuçlanır ve bırakılabilir (varsayılan olarak yanlış). Benzer şekilde, bırakılabilir (varsayılan olarak false olur) veya true olarak ayarlanabilir ve tüm şarkıları 5'ten büyük veya 5'e eşit derecelendirir.

    • songsToText("all",true,false) tüm şarkıları csv biçiminde dışa aktaracaktır.
    • songsToText("all",true,true) csv formatında sadece sevilen şarkıları vereceğiz.
    • songsToText("artistsong",false,false) tüm şarkıları metin olarak dışa aktaracaktır.
  • Daha sonra verileri istediğiniz yere yapıştırabilirsiniz, örneğin şarkıları veya albümleri Spotify hesabınıza eklemek istiyorsanız, http://www.ivyishere.org/ . Ivy'nin tüm albümleri tanımasını sağlamak için "artistalbum" tarzını kullanın. Şarkılar için "artistsong" tarzını kullanın.

Snippet hakkında: Bu, Michael Smith'in orijinal cevabına dayanıyor, ancak biraz daha sağlam. Aşağıdaki iyileştirmeleri yaptım:

  • Kütüphanede olduğu gibi çalma listelerinde de çalışır. Eksik sütunlar yoksayılır ve sipariş çözülür, bu nedenle Google Müzik içindeki neredeyse tüm şarkı listelerinde çalışması gerekir.

  • Dibe ulaştığında (kaydırma konumunu algılar) veya belirtilen zaman aşımından sonra durur. Zaman aşımı, kaydırma algılama kodunun birkaç piksel kapalı olması durumunda sonsuz bir döngüyü önlemek için oradadır.

  • Çok daha hızlı (her 1ms aralıklarla), ancak verilerin hazır olmaması durumunda bekler (belirtilen zaman aşımına kadar, şu anda 3s).

  • İşlem sırasında ve çıktıda tekilleştirme yapar.

  • Toplar derecelendirmeleri: "tanımsız" hiçbir zaman derecelendirilmez, "0" derecelendirilmez (yani bir kez derecelendirilir ancak sonra kaldırılır), "1" yaşasın düşer ve "5" yaşlanır (beğenilir).

Temel gelişmelere ek olarak, metni güzel bir şekilde biçimlendirir ve panoya kopyalar. İsterseniz, songsToTextişlevi ikinci kez çalıştırarak da verileri CSV olarak alabilirsiniz .

Alternatifler:

  1. Bir Python API'sine ihtiyacınız varsa, resmi olmayan Google Music API projesini inceleyin.

  2. Tonlarca çalma listeniz varsa ve tümünü bir kerede dışa aktarmak istiyorsanız , bunu yapabilecek gmusic-script çalma listesi ihracatçısı deneyin (Python, resmi olmayan API projesini kullanır).


Hey kod için sadece bir takip: sadece kopyalanan son 30 şarkı ile sonuçlanır ve songsToText yaptığımda ("artistsong") dakika cinsinden uzunluğu verir: saniye ve çalma listesindeki parça numarası. şarkı detayları zaten herşeyin içinde, ama onlardan sadece 30 tanesi var (yüzlerce çalma listesine
sahibim

boşver şarkıların sayısı, bu 30 ° C'de Ama sadece ilk 117. ihraç 130 şarkılarla başka çalma listesi sıkışmış değil
mkln

@mkln Kodu güncelledim, şimdi kitaplığı, çalma listelerini ve Google Müzik'teki diğer tüm şarkı listelerini ele alıyor. Sadece her şeyi çalıştırın ve çalma listesi / kütüphane / listeyi bir metin listesi olarak panoya kopyalayacaktır. Her şeyi içeren bir CSV sürümüne ihtiyacınız varsa (oyun sayısı, süre, puanlama), songsToText("all", true)daha sonra çalıştırın .
Şubat'ta jmiserez

harika çalışıyor, teşekkürler. Tüm çalma listelerini kaydeden bir python betiği yazmaya çalışıyorum. javascript ile çeşitli çalma listelerine nasıl tıklarsınız? İşlevin başında bir çalma listesi seçicisinin olması mümkün mü?
mkln

1
@mkln Bu adam zaten bunu yaptı: github.com/soulfx/gmusic-playlist Python betiğini kullanırsanız muhtemelen çok kolay! Bunu şimdiye kadar görmedim, ama birden fazla çalma listesine ihtiyacınız varsa, muhtemelen daha iyi bir seçenek.
jmiserez

18

Tarayıcınızın geliştirici konsolunda bir miktar javascript kodu çalıştırmanın sakıncası yoksa, aşağıdaki gibi bilgileri sayfadan çıkarabilirsiniz (yalnızca Chrome'da test edilmiştir):

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

Bu, konsola pencerede görüntülenmekte olan şarkıların çoğunun bir listesini yazdıracaktır. Daha fazla bilgi almak için aşağı kaydırmanız ve yeniden çalıştırmanız gerekir. Şu anda henüz bilgiyi tam olarak almanın doğru bir yolunu bulamadım, ancak bu 5 dakikalık hızlı saldırı hiç yoktan iyidir.


Bu umut verici görünüyor. Bi şans tanıcam.
ale,

2
Bu cevap için çok teşekkür ederim. Beni saatlerce ve saatlerce kurtardın. Yaptığım, betiğini tekrar tekrar çalıştırmak istedim. Sonuçları Text Soap adlı bir Mac uygulamasına yapıştırın. Dönüştü ",". Kaldırılan kopyalar ve txt olarak dışa aktarıldı. Sonra onu CSV olarak değiştirdi, başlıksız sütunları çıkardı ve kullanarak Spotify'a aktardı : ivyishere.org Sonuçta beni 8 dakika sürdü, bir tane

Hiç sorun değil, yardımcı olmaktan mutlu.
darkliquid

Hile yapacak gibi görünüyor. En büyük sorunum, çalma listelerimin büyüklüğü - 180'i dışa aktarmaya çalışıyorum. Chrome penceremi büyüterek ve elimden geldiğince uzaklaştırarak bu işin biraz üstesinden geldim. Chrome'u sadece% 10 yakınlaştırmaya ikna edebilseydim, hepsini bir ekrandan alırdım ...% 25, ​​iki tur artı biraz daha fazla. (
JS’den

1
Bilginize, sadece bir element, querySelector(...)yerine , kullanınquerySelectorAll(...)[0]
ThiefMaster

3

En iyi cevabı (o sırada) kullanarak ve eksiksiz bir çözüm bulmak için, müzik listesini aşağı kaydırıp aşağıdaki gibi bir diziye JSON nesneleri ekleyen aşağıdaki kodu oluşturdum.

Hangi şarkıların tam olarak göründüğünü bilmediği için, kod hepsini ekler, ardından sonunda kopyaları kaldırır. (Yalnızca Chrome'da test edilmiştir.)

Kullanmak için: tam şarkı listenizi gördüğünüz kitaplığa gidin ve

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

Bu, sayfanın sonuna geldiğinde, kaydırmayı durdurmak, diziyi kaldırmak ve diziyi kopyalamak için JSON'u panoya kopyalamak için bunu çalıştırın.

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

Konsola yapıştırabileceğiniz daha kısa bir JavaScript'im var. Kodu yeniden çalıştırmak yerine sadece aşağı doğru ilerleyebilirsiniz ve görüntülenen tüm albümler eklenir. Ardından çalma listesini elektronik tablo olarak indirebilirsiniz.

Talimatlar

  1. Buraya gidin: https://play.google.com/music/listen#/ap/auto-playlist-thumbs-up

  2. Açık Geliştirici Araçları (F12) ve içine aşağıdaki kodu yapıştırın Konsol sekmesi

  3. Çalma listesindeki her albüm en az bir kez görünecek şekilde kaydırın

  4. İndirmek için sayfada bir yere çift tıklayın. export-google-play.csv

  5. export-google-play.csvExcel'de açın .

kod

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

Çıktı

görüntü tanımını buraya girin

GitHub


2

Üst cevabın yaklaşımını biraz değiştirdim. Bu benim için Ivy'nin kopyala / yapıştır yöntemiyle daha iyi çalıştı ( http://www.ivyishere.org/ivy ):

1. Adım Chrome'daki Google Müzik'ten istediğiniz çalma listesini açın ve bunu konsola yapıştırın:

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

Bu, tüm oynatma listenizin yalnızca bir bölümden ziyade oluşturmasına neden olmalıdır.

Adım 2 Bu betiği konsola yapıştırın:

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

Adım 3 Ivy'ye gidin ve orada 2. adıma geldiğinizde, Kopyala / Yapıştır sekmesini seçin ve konsol çıktısını buraya yapıştırın.

DÜZENLE

Alex Pedersen tarafından önerilen güncellenmiş senaryo

Samurauturetskys rafine üzerinde yineleme (Onun yazı üzerine yorum yapmak için henüz yeterli bir üne sahip değilim). Googleplay stilinin güncellendiğinden, aşağıdaki betiğin tekrar oldukça güzel çıktı verdiğini düşünüyorum.

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

Metin çok küçük olana kadar basitçe Ctrl+ tuşunu kullanın ve ardından hepsini seçin. Script ve uygulamalar olmadan bir cazibe gibi çalışır.


-2

Benzer bir şey ararken bu soruya rastladım.

Sanırım, en iyi seçenek şudur:

  1. "Playlist Backup" gibi bir uygulama yükleyin
  2. Google Müzik Çalma Listesini bu uygulamayla bir metin dosyasına aktarın.
  3. Bir FileManager uygulamasıyla (Ghost Commander gibi) .m3u olarak yeniden adlandırın
  4. Çalma listesini daha fazla seçeneğe sahip başka bir uygulamayla açın (MusiXMatch gibi).

1
Sanırım bu uygulamayı kastediyorsun . İyi değil. Bir Android cihazım varken Android çözümü aramıyorum. Ayrıca, bu uygulamayı denedim ve cihazda olmayan parçalara veri aktaramaz, bu yüzden benim için işe yaramaz.
ale

1
Oliver, Web Uygulamaları olarak, yerel uygulamalar gerektirmeyen cevapları tercih ediyoruz.
Vidar S. Ramdal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.