Cetak Daftar Putar dari Google Play Music

43

Saya ingin mencetak daftar lagu (dengan artis, album, peringkat dan, jika mungkin, jumlah pemutaran dan durasi) dari akun Google Play Music saya .

Tidak ada cara mudah untuk melakukan ini dari aplikasi. Melakukan print-screen saat saya halaman melalui daftar panjang lagu tidak dapat dipertahankan.

Saya akan senang dengan ekspor data ke format standar (teks biasa, CSV, XML, dll.) Yang dapat saya manipulasi sendiri.

Ada saran?

bir
sumber

Jawaban:

17

Memodifikasi jawaban darkliquid , saya datang dengan yang berikut yang memungkinkan untuk beberapa playlist disimpan sekaligus .

Instruksi:

  1. Buka halaman Daftar Putar Anda .
  2. Rekatkan kode JavaScript di bawah ini ke konsol Anda.
  3. Klik daftar putar yang ingin Anda simpan ke teks.
  4. Setelah di halaman daftar putar, gulir ke bawah dengan relatif lambat.
  5. Setelah menggulir ke bawah, navigasikan kembali ke halaman daftar putar (sama seperti pada langkah 1.) menggunakan menu atau tombol kembali browser Anda.
  6. Ulangi langkah 3-5 untuk semua daftar putar yang ingin Anda simpan ke teks.
  7. Setelah Anda melakukan ini untuk semua daftar putar yang ingin Anda simpan ke teks, Anda dapat mengetik JSON.stringify(tracklistObj, null, '\t')(ubah '\t'ke ' 'jika Anda ingin lekukan minimal) atau tracklistObjjika Anda hanya ingin objek JavaScript memanipulasi dengan cara Anda sendiri. Jika Anda ingin diurutkan, jalankan perintah Object.values(tracklistObj).forEach(a => a.sort()) sebelum memanggil JSON.stringifyperintah.

Berhati-hatilah untuk tidak me-refresh halaman sebelum Anda menyelesaikan semua yang ingin Anda lakukan atau Anda harus me-restart dari langkah 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;

Anda juga dapat mencetak nama trek ke konsol sambil beralih printTracksToConsoleke true(Anda harus melakukan ini sebelum Langkah 3).

Perhatikan bahwa Anda mungkin dapat mengabaikan semua kesalahan GET dan POST di konsol (ini dihasilkan oleh Play Music sendiri, bukan skrip ini).

Juga mencatat bahwa saat ini pengaturan itu hanya untuk memberikan Artist - Track name, tetapi Anda dapat dengan mudah mengedit garis yang memiliki tracklistObj[currentPlaylist].push(artist + " - " + title);dengan album, playCount, duration, atau rating, dan / atau apa pun format yang Anda inginkan (termasuk format CSV jika Anda jadi silakan).

Contoh output (semua daftar putar Google Play yang saya miliki saat ini) dengan pengaturan default. Total sekitar 5 menit untuk menavigasi ke masing-masing 32 daftar putar, gulir ke bawah, dan kemudian hasil konversi ke teks.

PS Anda mungkin tertarik menggunakan situs yang saya temukan bernama Tune My Music untuk membuat daftar putar YouTube (tetapi YouTube membatasi pembuatan daftar putar menjadi 10 hari) dari output sehingga teman Anda dapat mendengarkan Google Playlist Anda. Jika Anda melakukan ini, Anda mungkin ingin menggunakan sesuatu seperti TextMechanic untuk menghapus tanda kutip dan .mp3dari daftar yang dihasilkan.

Zach Saucier
sumber
1
Andai saja ada cara yang lebih baik untuk melakukan ini daripada menempelkan JavaScript di konsol. (Saya juga mengalami sedikit cegukan sejak Ublock Origin memblokir skrip.) Tapi, ini yang saya butuhkan.
ale
Saya khawatir itu sudah usang sekarang :( TypeError: Tidak dapat membaca properti 'termasuk' yang tidak terdefinisi di getVisibleTracks (<anonymous>: 20: 43) di <anonymous>: 49: 5 di c ( play-music.gstatic.com/ fe / 6..e / listen__en_gb.js: 1190: 211 )
FloriOn
4
@ FloriOn Terima kasih telah berkomentar! Saya memperbarui kode sehingga berfungsi lagi sekarang.
Zach Saucier
2
@ ada Ada. Anda dapat mengubah kode menjadi bookmarklet.
David Metcalfe
Kesalahan konsol muncul saat menjalankan kode ini, tetapi tampaknya tidak memblokirnya untuk menjalankan
Otheus
31

(Diperbarui 2016-05-09, lebih kuat dari jawaban teratas saat ini)

Jika Anda hanya perlu menyimpan beberapa daftar putar, Anda dapat menggunakan cuplikan Javascript di bawah ini. Cuplikan ini dapat menyimpan setiap daftar seperti yang ditunjukkan pada halaman web, sehingga juga berfungsi untuk semua lagu / album / tampilan pustaka artis. Saya telah mendaftarkan dua alternatif lain di akhir jawaban ini.

  1. Buka: https://play.google.com/music/listen#/all (atau daftar putar Anda)

  2. Buka konsol pengembang (F12 untuk Chrome). Tempel kode di bawah ini ke konsol.

  3. Semua lagu yang tergores disimpan di allsongsobjek dan versi teks dari daftar disalin ke clipboard. Saya sarankan menjalankan songsToText("all",true)setelah itu untuk mendapatkan informasi CSV lengkap. Jalankan copy(outText)secara manual jika penyalinan clipboard tidak berfungsi pada percobaan pertama.

Kode (versi terbaru 10 Mei 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);

Kode terbaru tentang Github (Gist) di sini: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75

  • Jika Anda ingin output dalam format teks, dapat memanggil fungsi songsToText (). Anda dapat memilih gaya, memilih format, dan jika hanya lagu yang disukai / diacungi jempol yang akan diekspor. Daftar yang dihasilkan kemudian akan ditempelkan ke clipboard. Gaya yang all, artist, artistalbum, artistsong, artistalbumsong. CSV akan menghasilkan file CSV dan dapat ditinggalkan (default ke false). Likedonly dapat ditinggalkan (default ke false) atau disetel ke true, dan akan memfilter semua lagu dengan peringkat lebih besar atau sama dengan 5. Misalnya:

    • songsToText("all",true,false) akan mengekspor semua lagu dalam format csv.
    • songsToText("all",true,true) hanya akan mengekspor lagu yang disukai dalam format csv.
    • songsToText("artistsong",false,false) akan mengekspor semua lagu sebagai teks.
  • Anda kemudian dapat menempelkan data di mana saja Anda suka, misalnya http://www.ivyishere.org/ jika Anda ingin menambahkan lagu atau album ke akun Spotify Anda. Untuk membuat Ivy mengenali album lengkap, gunakan gaya "artistalbum". Untuk lagu, gunakan gaya "seniman".

Tentang cuplikan: Ini didasarkan pada jawaban asli Michael Smith, tetapi sedikit lebih kuat. Saya telah melakukan peningkatan berikut:

  • Bekerja pada daftar putar maupun perpustakaan. Setiap kolom yang hilang diabaikan dan urutannya sudah ditentukan, jadi itu akan berfungsi pada hampir semua daftar lagu di dalam Google Music.

  • Ia berhenti ketika mencapai bagian bawah (mendeteksi posisi gulir), atau setelah batas waktu yang ditentukan. Batas waktu ada untuk mencegah loop tanpa henti seandainya kode deteksi gulir dimatikan beberapa piksel.

  • Ini jauh lebih cepat (interval setiap 1 ms), tetapi menunggu jika data tidak siap (hingga batas waktu yang ditentukan, saat ini 3 detik).

  • Apakah deduplikasi selama operasi dan pada output.

  • Mengumpulkan peringkat: "tidak terdefinisi" tidak pernah diberi peringkat, "0" tidak diberi peringkat (yaitu sekali dinilai tetapi kemudian dihapus), "1" adalah jempol ke bawah, dan "5" adalah jempol ke atas (disukai).

Selain perbaikan dasar, itu juga memformat teks dengan baik dan menyalinnya ke clipboard. Anda juga bisa mendapatkan data sebagai CSV jika diinginkan, dengan menjalankan songsToTextfungsi ini untuk kedua kalinya.

Alternatif:

  1. Jika Anda memerlukan API Python, periksa proyek Google Music API tidak resmi .

  2. Jika Anda memiliki banyak daftar putar dan ingin mengekspor semuanya dalam sekali jalan, coba eksportir daftar putar gmusic-scripts yang dapat melakukannya (Python, menggunakan proyek API tidak resmi).

jmiserez
sumber
Hai hanya tindak lanjut untuk kode: itu hanya menghasilkan 30 lagu terakhir yang disalin, dan ketika saya melakukan laguToText ("artis") itu menghasilkan panjang dalam hitungan menit: detik dan nomor trek dalam daftar putar. Lagipula detail lagunya ada di allsongs, tapi hanya ada 30 (saya punya daftar putar dengan ratusan)
mkln
Nevermind pada jumlah lagu, itu tidak terjebak di 30. Tetapi pada playlist lain dengan 130 lagu itu hanya mengekspor 117.
mkln
@ mkln Saya telah memperbarui kode, sekarang menangani perpustakaan, daftar putar dan setiap daftar lagu lainnya di Google Music. Jalankan saja semuanya dan itu akan menyalin daftar putar / perpustakaan / daftar sebagai daftar teks ke clipboard. Jika Anda membutuhkan versi CSV yang mencakup semuanya (hitungan bermain, durasi, peringkat), jalankan songsToText("all", true)sesudahnya.
jmiserez
ini bekerja dengan baik, terima kasih. Saya mencoba menulis skrip python yang menyimpan semua daftar putar. bagaimana Anda mengklik berbagai daftar putar melalui javascript? apakah mungkin untuk memiliki pemilih daftar putar di awal fungsi?
mkln
1
@mkln Nah orang ini sudah melakukan itu: github.com/soulfx/gmusic-playlist Mungkin paling mudah jika Anda hanya menggunakan skrip Python-nya! Jujur saya tidak melihat ini sampai sekarang, tapi itu mungkin pilihan yang lebih baik jika Anda memerlukan lebih dari satu daftar putar.
jmiserez
18

Jika Anda tidak keberatan menjalankan sedikit kode javascript di konsol pengembang browser Anda, Anda dapat mengekstrak informasi dari halaman seperti itu (hanya diuji di Chrome):

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

Ini akan mencetak ke konsol daftar sebagian besar lagu yang saat ini terlihat di jendela. Anda harus menggulir ke bawah dan menjalankannya kembali untuk mendapatkan lebih banyak. Saat ini saya belum menemukan cara yang layak untuk mengambil info secara keseluruhan, tetapi peretasan 5 menit cepat ini lebih baik daripada tidak sama sekali.

darkliquid
sumber
Ini terlihat menjanjikan. Saya akan mencobanya.
ale
2
Terima kasih banyak atas jawaban ini. Anda menyelamatkan saya berjam-jam. Yang saya lakukan adalah menjalankan skrip Anda berulang-ulang di daftar putar yang ingin saya salin. Rekatkan hasilnya ke aplikasi Mac yang disebut Text Soap. Berubah menjadi ",". Duplikat dihapus dan diekspor sebagai txt. Kemudian mengubahnya menjadi CSV, menghapus kolom yang tidak dilekukan dan mengimpornya ke Spotify menggunakan: ivyishere.org Semua secara keseluruhan membutuhkan waktu sekitar 8 menit ketika saya mengerti, cheers ~
Tidak masalah, senang membantu.
darkliquid
Ini sepertinya akan melakukan trik. Masalah terbesar saya adalah ukuran daftar putar saya - 180 pada yang saya coba ekspor. Saya menyiasatinya dengan memaksimalkan jendela Chrome saya dan kemudian memperkecil sejauh yang saya bisa. Jika saya bisa meyakinkan Chrome untuk memperbesar hingga 10% saya akan memiliki semuanya pada satu layar ... pada 25%, butuh dua putaran ditambah sedikit lagi. (Kesempatan Anda dapat memperbesar dari JS?)
RobertB
1
FYI, jika Anda hanya satu elemen, gunakan querySelector(...)bukanquerySelectorAll(...)[0]
ThiefMaster
3

Menggunakan jawaban teratas (pada saat itu) dan menginginkan solusi lengkap, saya telah membuat kode berikut yang menggulung daftar musik dan menambahkan objek JSON ke array saat berjalan.

Karena tidak tahu persis lagu apa yang terlihat, kode menambahkan semuanya, lalu menduplikat di akhir. (Hanya diuji di Chrome.)

Untuk menggunakan: pergi ke perpustakaan Anda, di mana Anda melihat daftar lagu lengkap Anda, dan jalankan

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

Ketika itu sampai ke bagian bawah halaman, jalankan ini untuk menghentikan scrolling, de-duplikat array, dan salin JSON ke clipboard.

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);
Michael Smith
sumber
3

Saya memiliki beberapa JavaScript yang lebih pendek yang dapat Anda tempel ke konsol. Alih-alih menjalankan kembali kode Anda bisa menggulir ke bawah dan semua album yang muncul ditambahkan. Kemudian Anda dapat mengunduh daftar putar sebagai spreadsheet.

Instruksi

  1. Buka di sini: https://play.google.com/music/listen#/ap/auto-playlist-thumbs-up

  2. Buka Alat Pengembang (F12) dan rekatkan kode di bawah ini ke tab Konsol

  3. Gulir ke sekeliling sehingga setiap album dalam daftar putar terlihat setidaknya satu kali

  4. Klik dua kali di suatu tempat pada halaman untuk mengunduh export-google-play.csv

  5. Buka export-google-play.csvdi Excel.

Kode

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

Keluaran

masukkan deskripsi gambar di sini

GitHub

Charles Clayton
sumber
2

Saya memodifikasi pendekatan jawaban atas sedikit. Ini bekerja lebih baik untuk saya dengan metode salin / tempel Ivy ( http://www.ivyishere.org/ivy ):

Langkah 1 Buka daftar putar yang Anda inginkan dari Google Music di Chrome dan rekatkan ini ke konsol:

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

Ini akan menyebabkan seluruh daftar putar Anda menampilkan bukan hanya sebagian.

Langkah 2 Tempel skrip ini ke konsol:

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

Langkah 3 Pergi ke Ivy dan ketika Anda sampai ke langkah 2 di sana, pilih tab Salin / Tempel dan tempel output konsol di sana.

EDIT

Skrip yang diperbarui disarankan oleh Alex Pedersen

Iterasi pada penyempurnaan samurauturetskys (saya belum memiliki reputasi yang cukup untuk mengomentari jabatannya). Saya pikir styling Googleplay telah diperbarui sehingga script di bawah ini kembali memberikan output yang cantik.

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);
samuraituretsky
sumber
-1

Cukup Ctrl+ sampai teksnya sangat kecil dan kemudian pilih semuanya. Ini berfungsi seperti pesona tanpa skrip dan aplikasi.

Nyonya remaja Obama
sumber
-2

Saya baru saja menemukan pertanyaan ini mencari sesuatu yang serupa.

Saya kira, pilihan terbaik Anda adalah:

  1. instal aplikasi seperti "Cadangan Playlist"
  2. Ekspor Google Playlist Musik ke file teks dengan aplikasi ini.
  3. Ganti nama menjadi .m3u dengan aplikasi FileManager (seperti Ghost Commander)
  4. Buka daftar putar dengan aplikasi lain yang memiliki lebih banyak opsi (seperti MusiXMatch).
Oliver Hoffmann
sumber
1
Saya menganggap Anda maksud aplikasi ini . Tidak baik. Sementara saya kebetulan memiliki perangkat Android, saya tidak mencari solusi Android. Lebih lanjut, saya sudah mencoba aplikasi ini dan tidak bisa mengekspor data di trek yang tidak ada di perangkat, jadi tidak ada gunanya bagi saya.
ale
1
Oliver, sebagai Aplikasi Web, kami lebih suka jawaban yang tidak memerlukan aplikasi asli.
Vidar S. Ramdal