Stampa playlist da Google Play Music


43

Voglio stampare un elenco di brani (con artista, album, valutazione e, se possibile, numero di riproduzioni e durata) dal mio account Google Play Music .

Non esiste un modo semplice per farlo dall'app. Fare schermate di stampa mentre sfoglio un lungo elenco di canzoni non è sostenibile.

Sarei felice con un'esportazione di dati in un formato standard (testo semplice, CSV, XML, ecc.) Che posso manipolare.

Eventuali suggerimenti?


Risposte:


17

Modificando la risposta di darkliquid , ho trovato quanto segue che consente di salvare più playlist contemporaneamente .

Istruzioni:

  1. Vai alla pagina Le tue playlist .
  2. Incolla il codice JavaScript sotto nella tua console.
  3. Fai clic su una playlist che desideri salvare nel testo.
  4. Una volta nella pagina della playlist, scorri verso il basso relativamente lentamente.
  5. Dopo aver fatto scorrere verso il basso, torna alla pagina delle playlist (come nel passaggio 1.) utilizzando il menu o il pulsante Indietro del browser.
  6. Ripeti i passaggi 3-5 per tutte le playlist che desideri salvare nel testo.
  7. Una volta fatto questo per tutte le playlist che si desidera salvare in testo, è possibile digitare JSON.stringify(tracklistObj, null, '\t')(cambiare la '\t'per ' 'se si vuole indentazione minima) o tracklistObjse si desidera solo l'oggetto JavaScript per manipolare a modo tuo. Se lo desideri ordinato, esegui il comando Object.values(tracklistObj).forEach(a => a.sort()) prima di chiamare il JSON.stringifycomando.

Fare attenzione a non aggiornare la pagina prima di aver completato tutto ciò che si desidera fare, altrimenti sarà necessario riavviare dal passaggio 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;

Puoi anche stampare i nomi delle tracce sulla console mentre vai, cambiando printTracksToConsolein true(dovresti farlo prima del passaggio 3).

Nota che probabilmente puoi ignorare tutti gli errori GET e POST nella console (questi sono generati dalla stessa Play Music, non da questo script).

Si noti inoltre che attualmente è di configurazione solo per dare Artist - Track name, ma si può facilmente modificare la riga che ha tracklistObj[currentPlaylist].push(artist + " - " + title);con album, playCount, durationo rating, e / o qualsiasi altra cosa formattazione che si desidera (incluso il formato CSV se quindi per favore).

Esempio di output (tutte le playlist di Google Play che ho attualmente) con le impostazioni predefinite. In totale sono stati necessari circa 5 minuti per navigare verso ciascuna delle 32 playlist, scorrere verso il basso e quindi convertire il risultato in testo.

PS Potresti essere interessato a utilizzare un sito che ho trovato chiamato Tune My Music per creare playlist di YouTube (ma YouTube limita la creazione di playlist a 10 al giorno) dall'output in modo che i tuoi amici possano ascoltare le tue playlist di Google. Se lo fai, probabilmente vuoi usare qualcosa come TextMechanic per rimuovere le virgolette e .mp3dall'elenco di output.


1
Se solo ci fosse un modo migliore per farlo che incollare JavaScript nella console. (Ho anche avuto un piccolo singhiozzo da quando Ublock Origin ha bloccato la sceneggiatura.) Ma questo fa quello che mi serve.
Ale

Temo che sia obsoleto ora :( TypeError: impossibile leggere la proprietà 'include' di undefined su getVisibleTracks (<anonimo>: 20: 43) a <anonimo>: 49: 5 a c ( play-music.gstatic.com/ fe / 6..e / hear__en_gb.js: 1190: 211 )
FloriOn

4
@FloriOn Grazie per aver commentato! Ho aggiornato il codice in modo che funzioni di nuovo ora.
Zach Saucier,

2
@ale C'è. Puoi trasformare il codice in un bookmarklet.
David Metcalfe,

Gli errori della console compaiono quando si esegue questo codice, ma non sembra bloccarlo dall'esecuzione
Otheus

31

(Aggiornato il 05/05/2016, più robusto dell'attuale risposta principale)

Se hai solo bisogno di salvare alcune playlist, puoi semplicemente usare il mio frammento Javascript qui sotto. Questo frammento può salvare ogni elenco come mostrato nella pagina Web, quindi funziona anche per tutte le visualizzazioni della libreria di brani / album / artisti. Ho elencato altre due alternative alla fine di questa risposta.

  1. Vai a: https://play.google.com/music/listen#/all (o la tua playlist)

  2. Apri una console per sviluppatori (F12 per Chrome). Incolla il codice qui sotto nella console.

  3. Tutte le canzoni raschiate sono memorizzate allsongsnell'oggetto e una versione di testo dell'elenco viene copiata negli appunti. Raccomando di correre in songsToText("all",true)seguito per ottenere le informazioni CSV complete. Esegui copy(outText)manualmente se la copia degli Appunti non ha funzionato al primo tentativo.

Codice (ultima versione 10 maggio 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);

Codice più recente su Github (Gist) qui: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75

  • Se desideri un output in formato testo, puoi chiamare la funzione songsToText (). Puoi selezionare uno stile, scegliere il formato e, se solo i brani piaciuti / sfogliati, dovrebbero essere esportati. L'elenco risultante verrà quindi incollato negli Appunti. Gli stili sono all, artist, artistalbum, artistsong, artistalbumsong. CSV genererà un file CSV e può essere lasciato fuori (il valore predefinito è false). Likedonly può essere escluso (il valore predefinito è false) o impostato su true e filtrerà tutti i brani con voti maggiori o uguali a 5. Ad esempio:

    • songsToText("all",true,false) esporterà tutte le canzoni in formato CSV.
    • songsToText("all",true,true) esporterà solo le canzoni piaciute in formato CSV.
    • songsToText("artistsong",false,false) esporterà tutti i brani come testo.
  • Puoi quindi incollare i dati ovunque tu voglia, ad esempio http://www.ivyishere.org/ se desideri aggiungere brani o album al tuo account Spotify. Per fare in modo che Ivy riconosca gli album completi, usa lo stile "artistalbum". Per le canzoni, usa lo stile "artistong".

Informazioni sullo snippet: si basa sulla risposta originale di Michael Smith, ma è un po 'più robusto. Ho apportato i seguenti miglioramenti:

  • Funziona su playlist e sulla biblioteca. Eventuali colonne mancanti vengono ignorate e l'ordine viene capito, quindi dovrebbe funzionare su quasi tutti gli elenchi di brani all'interno di Google Music.

  • Si ferma quando raggiunge il fondo (rileva la posizione di scorrimento) o dopo il timeout specificato. Il timeout è lì per impedire un ciclo infinito nel caso in cui il codice di rilevamento scorrimento sia disattivato di alcuni pixel.

  • È molto più veloce (intervallo ogni 1 ms), ma attende se i dati non sono pronti (fino al timeout specificato, attualmente 3 secondi).

  • Esegue la deduplicazione durante il funzionamento e sull'output.

  • Raccoglie le valutazioni: "undefined" non viene mai valutato, "0" non viene valutato (ovvero una volta valutato ma poi rimosso), "1" è il pollice in giù e "5" è il pollice in alto (piaciuto).

Oltre ai miglioramenti di base, formatta anche il testo e lo copia negli Appunti. Se lo desideri, puoi anche ottenere i dati come CSV, eseguendo la songsToTextfunzione una seconda volta.

alternative:

  1. Se hai bisogno di un'API Python, dai un'occhiata al progetto non ufficiale dell'API di Google Music .

  2. Se hai tonnellate di playlist e vuoi esportarle tutte in una volta, prova l' esportatore di playlist gmusic-script che può farlo (Python, usa il progetto API non ufficiale).


Ehi, basta un follow-up per il codice: il risultato è che vengono copiate solo le ultime 30 canzoni e quando eseguo canzoni ToText ("artistong") genera la lunghezza in minuti: secondi e il numero del brano nella playlist. i dettagli delle canzoni sono comunque a tutto campo, ma ce ne sono solo 30 (ho playlist con centinaia)
mkln

non importa il numero di brani, non è bloccato a 30. Ma in un'altra playlist con 130 brani esporta solo i primi 117.
mkln

@mkln Ho aggiornato il codice, ora gestisce la libreria, le playlist e ogni altro elenco di brani in Google Music. Basta eseguire tutto e copierà la playlist / libreria / elenco come un elenco di testo negli Appunti. Se hai bisogno di una versione CSV che includa tutto (conteggio dei giochi, durata, valutazione), esegui songsToText("all", true)successivamente.
jmiserez,

funziona benissimo, grazie. Sto cercando di scrivere uno script Python che salvi tutte le playlist. come clicchi sulle varie playlist tramite javascript? sarebbe possibile avere un selettore di playlist all'inizio della funzione?
mkln,

1
@mkln Beh, questo ragazzo l'ha già fatto: github.com/soulfx/gmusic-playlist Probabilmente il più semplice se usi semplicemente il suo script Python! Onestamente non l'ho visto fino ad ora, ma è probabilmente l'opzione migliore se hai bisogno di più di una playlist.
jmiserez,

18

Se non ti dispiace eseguire un po 'di codice javascript nella console degli sviluppatori del tuo browser, puoi estrarre le informazioni dalla pagina in questo modo (testato solo su 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); 
}

Questo stamperà sulla console un elenco della maggior parte dei brani attualmente visibili nella finestra. Dovrai scorrere verso il basso e rieseguirlo per ottenere di più. Al momento non ho ancora trovato un modo decente per afferrare le informazioni nella sua interezza, ma questo veloce hack di 5 minuti è meglio di niente.


Sembra promettente. Ci proverò.
Ale

2
Grazie mille per questa risposta. Mi hai risparmiato ore e ore di tempo. Quello che ho fatto è stato di eseguire la tua sceneggiatura ancora e ancora nella playlist che volevo copiare. Incolla i risultati in un'app per Mac chiamata Text Soap. Diventato ",". Rimossi duplicati ed esportati come txt. Quindi lo ha cambiato in CSV, ha eliminato le colonne senza segno e lo ha importato in Spotify usando: ivyishere.org Tutto sommato mi ci sono voluti circa 8 minuti uno ho capito, applausi ~

Nessun problema, felice di aiutarti.
darkliquid,

Sembra che farà il trucco. Il mio problema più grande è la dimensione delle mie playlist - 180 su quella che sto cercando di esportare. L'ho aggirato un po 'massimizzando la mia finestra di Chrome e quindi ingrandendo il più possibile. Se solo potessi convincere Chrome a zoomare al 10%, avrei tutto su uno schermo ... al 25%, ci sono voluti due round più un po 'di più. (C'è qualche possibilità che tu possa zoomare da JS?)
RobertB

1
Cordiali saluti, se hai solo un elemento, usa querySelector(...)invece diquerySelectorAll(...)[0]
ThiefMaster il

3

Usando la risposta migliore (al momento) e volendo una soluzione completa, ho creato il seguente codice che scorre l'elenco musicale e aggiunge oggetti JSON a un array mentre procede.

A causa del fatto di non sapere esattamente quali brani sono visibili, il codice li aggiunge tutti, quindi alla fine i duplicati. (Testato solo su Chrome.)

Per usare: vai alla tua libreria, dove vedi l'elenco completo dei brani, ed esegui

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

Quando arriva in fondo alla pagina, eseguirlo per interrompere lo scorrimento, de-duplicare l'array e copiare JSON negli Appunti.

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

Ho un JavaScript molto più breve che puoi incollare nella console. Invece di rieseguire il codice, puoi semplicemente scorrere verso il basso e tutti gli album che vengono visualizzati vengono aggiunti. Quindi puoi scaricare la playlist come foglio di calcolo.

Istruzioni

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

  2. Apri Strumenti per sviluppatori (F12) e incolla il codice seguente nella scheda Console

  3. Scorri in modo che ogni album nella playlist sia visibile almeno una volta

  4. Fai doppio clic da qualche parte sulla pagina per scaricare export-google-play.csv

  5. Apri export-google-play.csvin Excel.

Codice

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

Produzione

inserisci qui la descrizione dell'immagine

GitHub


2

Ho modificato un po 'l'approccio della risposta migliore. Questo ha funzionato meglio per me con il metodo copia / incolla di Ivy ( http://www.ivyishere.org/ivy ):

Passaggio 1 Apri la playlist desiderata da Google Music in Chrome e incollala nella console:

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

Ciò dovrebbe comportare il rendering dell'intera playlist anziché solo una parte.

Passaggio 2 Incollare questo script nella console:

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

Passaggio 3 Andare a Ivy e quando si arriva al passaggio 2, selezionare la scheda Copia / Incolla e incollare l'output della console lì.

MODIFICARE

Script aggiornato suggerito da Alex Pedersen

Iterando sulla raffinatezza di samurauturetskys (non ho ancora abbastanza reputazione per commentare il suo post). Penso che lo stile di Googleplay sia stato aggiornato, quindi lo script di seguito offre un risultato piuttosto interessante.

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


-2

Mi sono appena imbattuto in questa domanda cercando qualcosa di simile.

Immagino che la tua migliore opzione sia:

  1. installa un'app come "Playlist Backup"
  2. Esporta la playlist di Google Music in un file di testo con questa app.
  3. Rinominalo in .m3u con un'app FileManager (come Ghost Commander)
  4. Apri la playlist con un'altra app che ha più opzioni (come MusiXMatch).

1
Suppongo che intendi questa app . Non buono. Mentre mi capita di avere un dispositivo Android non sto cercando una soluzione Android. Inoltre, ho provato questa app e non può esportare dati su tracce che non sono sul dispositivo, quindi per me è inutile.
Ale

1
Oliver, essendo applicazioni Web, preferiamo risposte che non richiedono app native.
Vidar S. Ramdal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.