Imprimir lista de reprodução do Google Play Music

43

Quero imprimir uma lista de músicas (com artista, álbum, classificação e, se possível, número de execuções e duração) da minha conta do Google Play Music .

Não há uma maneira fácil de fazer isso no aplicativo. Não é possível fazer telas de impressão enquanto folheio uma longa lista de músicas.

Eu ficaria feliz com a exportação de dados para um formato padrão (texto sem formatação, CSV, XML etc.) que eu possa me manipular.

Alguma sugestão?

cerveja
fonte

Respostas:

17

Modificando a resposta do darkliquid, criei o seguinte, que permite que várias playlists sejam salvas de uma só vez .

Instruções:

  1. Vá para a página Suas listas de reprodução .
  2. Cole o código JavaScript abaixo no seu console.
  3. Clique na lista de reprodução que você deseja salvar em texto.
  4. Uma vez na página da lista de reprodução, role para a parte inferior de forma relativamente lenta.
  5. Depois de rolar para a parte inferior, volte para a página das listas de reprodução (igual à etapa 1.) usando o menu ou o botão Voltar do navegador.
  6. Repita as etapas 3 a 5 para todas as listas de reprodução que você deseja salvar em texto.
  7. Depois de fazer isso para todas as listas de reprodução que você deseja salvar em texto, você pode digitar JSON.stringify(tracklistObj, null, '\t')(altere '\t'para ' 'se desejar um recuo mínimo) ou tracklistObjse desejar que o objeto JavaScript o manipule à sua maneira. Se você deseja classificá-lo, execute o comando Object.values(tracklistObj).forEach(a => a.sort()) antes de chamá-lo JSON.stringify.

Cuidado para não atualizar a página antes de concluir tudo o que você deseja fazer, caso contrário você precisará reiniciar a partir da etapa 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;

Você também pode imprimir os nomes das faixas no console conforme muda printTracksToConsolepara true(você deve fazer isso antes da Etapa 3).

Observe que você provavelmente pode ignorar todos os erros GET e POST no console (eles são gerados pelo próprio Play Music, não por este script).

Observe também que, atualmente, de configuração apenas para dar Artist - Track name, mas você pode facilmente editar a linha que tem tracklistObj[currentPlaylist].push(artist + " - " + title);com album, playCount, durationou rating, e / ou qualquer formatação desejada (incluindo o formato CSV se você por favor).

Exemplo de saída (todas as listas de reprodução do Google Play que tenho atualmente) com as configurações padrão. Foram necessários cerca de 5 minutos no total para navegar para cada uma das 32 listas de reprodução, role para baixo e depois converter o resultado em texto.

PS Você pode estar interessado em usar um site que encontrei chamado Tune My Music para criar listas de reprodução do YouTube (mas o YouTube restringe a criação de listas de reprodução para 10 por dia) a partir da saída para que seus amigos possam ouvir suas listas de reprodução do Google. Se você fizer isso, provavelmente desejará usar algo como TextMechanic para remover as aspas e .mp3a lista gerada.

Zach Saucier
fonte
1
Se ao menos houvesse uma maneira melhor de fazer isso do que colar o JavaScript no console. (Eu também tive um pequeno problema desde que o Ublock Origin bloqueou o script.) Mas, isso faz o que eu preciso.
ale
Receio que esteja desatualizado agora :( TypeError: Não é possível ler a propriedade 'includes' de undefined em getVisibleTracks (<anonymous>: 20: 43) em <anonymous>: 49: 5 em c ( play-music.gstatic.com/ fe / 6..e / listen__en_gb.js: 1190: 211 )
FloriOn
4
@FloriOn Obrigado por comentar! Atualizei o código para que funcione novamente agora.
Zach Saucier
2
@ale Existe. Você pode transformar o código em um bookmarklet.
David Metcalfe
Os erros do console aparecem ao executar esse código, mas ele não parece impedi-lo de executar
Otheus
31

(Atualizado em 2016-05-09, mais robusto do que a principal resposta atual)

Se você só precisa salvar algumas listas de reprodução, basta usar meu snippet Javascript abaixo. Esse snippet pode salvar todas as listas conforme mostrado na página da web, e também funciona para todas as visualizações de biblioteca de músicas / álbuns / artistas. Eu listei duas outras alternativas no final desta resposta.

  1. Acesse: https://play.google.com/music/listen#/all (ou sua playlist)

  2. Abra um console do desenvolvedor (F12 para Chrome). Cole o código abaixo no console.

  3. Todas as músicas allsongscopiadas são armazenadas no objeto e uma versão em texto da lista é copiada para a área de transferência. Eu recomendo executar songsToText("all",true)depois para obter as informações completas sobre CSV. Execute copy(outText)manualmente se a cópia da área de transferência não funcionou na primeira tentativa.

Código (versão mais recente em 10 de maio de 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);

Código mais recente no Github (Gist) aqui: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75

  • Se você deseja obter a saída em formato de texto, pode chamar a função songsToText (). Você pode selecionar um estilo, escolher o formato e se apenas as músicas curtidas / curtidas devem ser exportadas. A lista resultante será colada na área de transferência. Os estilos são all, artist, artistalbum, artistsong, artistalbumsong. O CSV resultará em um arquivo CSV e pode ser deixado de fora (o padrão é falso). O Likedonly pode ser deixado de fora (o padrão é false) ou definido como true, e filtrará todas as músicas com classificações maiores ou iguais a 5. Por exemplo:

    • songsToText("all",true,false) exportará todas as músicas no formato csv.
    • songsToText("all",true,true) exportará apenas músicas curtidas no formato csv.
    • songsToText("artistsong",false,false) exportará todas as músicas como texto.
  • Você pode colar os dados em qualquer lugar que desejar, por exemplo, http://www.ivyishere.org/, se desejar adicionar as músicas ou álbuns à sua conta do Spotify. Para fazer Ivy reconhecer álbuns completos, use o estilo "album de artista". Para músicas, use o estilo "artistsong".

Sobre o trecho: é baseado na resposta original de Michael Smith, mas é um pouco mais robusto. Fiz as seguintes melhorias:

  • Funciona em listas de reprodução e na biblioteca. Todas as colunas ausentes são ignoradas e a ordem é calculada, por isso deve funcionar em quase todas as listas de músicas do Google Music.

  • Ele para quando atinge o fundo (detecta a posição de rolagem) ou após o tempo limite especificado. O tempo limite está aí para evitar um loop sem fim, caso o código de detecção de rolagem esteja desativado em alguns pixels.

  • É muito mais rápido (intervalo a cada 1 ms), mas aguarda se os dados não estiverem prontos (até o tempo limite especificado, atualmente 3s).

  • Deduplicação durante a operação e na saída.

  • Reúne classificações: "indefinido" nunca é classificado, "0" não é classificado (ou seja, uma vez classificado, mas removido), "1" apresenta o polegar para baixo e "5" é o polegar para cima (curtido).

Além das melhorias básicas, ele também formata bem o texto e o copia para a área de transferência. Você também pode obter os dados como CSV, se desejar, executando a songsToTextfunção uma segunda vez.

Alternativas:

  1. Se você precisar de uma API Python, confira o projeto não oficial da API do Google Music .

  2. Se você possui várias listas de reprodução e deseja exportar todas de uma só vez, experimente o exportador de listas de músicas gmusic-scripts que pode fazer isso (Python, usa o projeto não oficial da API).

jmiserez
fonte
Ei, apenas um acompanhamento para o código: ele resulta em apenas as últimas 30 músicas sendo copiadas e, quando eu faço o songsToText ("artistsong"), gera a duração em minutos: segundos e o número da faixa na lista de reprodução. os detalhes canções estão em allsongs de qualquer maneira, mas há apenas 30 deles (eu tenho listas de reprodução com centenas)
mkln
Nevermind sobre o número de canções, ele não está preso em 30. Mas em outra lista com 130 canções só exporta o primeiro 117.
mkln
@mkln Atualizei o código, agora ele lida com a biblioteca, playlists e todas as outras listas de músicas no Google Music. Basta executar tudo e ele copiará a lista de reprodução / biblioteca / lista como uma lista de texto para a área de transferência. Se você precisar de uma versão CSV que inclua tudo (contagem de jogos, duração, classificação), execute songsToText("all", true)depois.
jmiserez
funciona muito bem, obrigado. Estou tentando escrever um script python que salva todas as listas de reprodução. como você clicaria nas várias listas de reprodução através de javascript? seria possível ter um seletor de lista de reprodução no início da função?
Mkln
1
@mkln Bem, esse cara já fez isso: github.com/soulfx/gmusic-playlist Provavelmente, é mais fácil se você usar o script Python! Sinceramente, não vi isso até agora, mas provavelmente é a melhor opção se você precisar de mais de uma lista de reprodução.
jmiserez
18

Se você não se importa de executar um pouco de código javascript no console do desenvolvedor de navegadores, pode extrair informações da página assim (testadas apenas no 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); 
}

Isso imprimirá no console uma lista da maioria das músicas atualmente visíveis na janela. Você precisará rolar para baixo e executá-lo novamente para obter mais. No momento, eu ainda não descobri uma maneira decente de pegar as informações em sua totalidade, mas esse truque rápido de 5 minutos é melhor do que nada.

líquido escuro
fonte
Isso parece promissor. Vou tentar.
ale
2
Muito obrigado por esta resposta. Você me salvou horas e horas de tempo. O que eu fiz foi executar seu script repetidamente na lista de reprodução que eu queria copiar. Cole os resultados em um aplicativo para Mac chamado Text Soap. Se tornou ",". Removidas duplicatas e exportadas como um txt. Em seguida, mudou-o para CSV, retirados das colunas unneded e importados para Spotify usando: ivyishere.org Tudo em tudo me levou cerca de 8 minutos que eu tenho o jeito dele, aplausos ~
Sem problemas, feliz em ajudar.
darkliquid
Parece que vai dar certo. Meu maior problema é o tamanho das minhas listas de reprodução - 180 na que estou tentando exportar. Cheguei a um pouco disso, maximizando minha janela do Chrome e diminuindo o zoom o máximo que pude. Se eu pudesse convencer o Chrome a aumentar o zoom para 10%, eu teria tudo em uma tela ... com 25%, foram necessárias duas rodadas e um pouco mais. (Alguma chance de você aumentar o zoom a partir de JS?)
RobertB
1
FYI, se você apenas um elemento, use em querySelector(...)vez dequerySelectorAll(...)[0]
ThiefMaster 2/14/14
3

Usando a resposta principal (na época) e desejando uma solução completa, criei o código a seguir, que rola a lista de músicas e adiciona objetos JSON a uma matriz conforme ela segue.

Devido a não saber exatamente quais músicas são visíveis, o código adiciona todas elas e, em seguida, elimina a duplicação no final. (Apenas testado no Chrome.)

Para usar: vá para sua biblioteca, onde você vê sua lista completa de músicas, e execute

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 chegar ao final da página, execute-o para interromper a rolagem, desduplicar a matriz e copiar o JSON para a área de transferência.

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
fonte
3

Eu tenho um JavaScript muito mais curto que você pode colar no console. Em vez de executar novamente o código, você pode simplesmente rolar para baixo e todos os álbuns que são exibidos são adicionados. Em seguida, você pode baixar a lista de reprodução como uma planilha.

Instruções

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

  2. Abra as Ferramentas do desenvolvedor (F12) e cole o código abaixo na guia Console

  3. Role para que cada álbum da lista de reprodução fique visível pelo menos uma vez

  4. Clique duas vezes em algum lugar da página para fazer o download export-google-play.csv

  5. Abra export-google-play.csvno Excel.

Código

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

Saída

insira a descrição da imagem aqui

GitHub

Charles Clayton
fonte
2

Modifiquei um pouco a abordagem da resposta principal. Isso funcionou melhor para mim com o método copy / paste de Ivy ( http://www.ivyishere.org/ivy ):

Etapa 1 Abra a lista de reprodução desejada do Google Music no Chrome e cole-a no console:

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

Isso deve fazer com que toda a sua lista de reprodução seja renderizada, em vez de apenas uma parte.

Etapa 2 Cole este script no 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);

Etapa 3 Vá para Ivy e, quando chegar à etapa 2, selecione a guia Copiar / Colar e cole a saída do console.

EDITAR

Script atualizado sugerido por Alex Pedersen

Iterando o refinamento de samurauturetskys (ainda não tenho reputação o suficiente para comentar sobre seu post). Eu acho que o estilo do Googleplay foi atualizado, então o script abaixo novamente fornece uma saída bonita.

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
fonte
-1

Simplesmente faça Ctrl+ até que o texto seja muito pequeno e selecione tudo. Funciona como um encanto sem scripts e aplicativos.

Amante adolescente de Obama
fonte
-2

Acabei de me deparar com essa pergunta procurando algo semelhante.

Eu acho que sua melhor opção é:

  1. instale um aplicativo como "Backup da lista de reprodução"
  2. Exporte a lista de reprodução do Google Music para um arquivo de texto com este aplicativo.
  3. Renomeie-o para .m3u com um aplicativo FileManager (como o Ghost Commander)
  4. Abra a lista de reprodução com outro aplicativo que tenha mais opções (como MusiXMatch).
Oliver Hoffmann
fonte
1
Eu suponho que você quis dizer este aplicativo . Nada de bom. Enquanto eu tiver um dispositivo Android, não estou procurando uma solução para Android. Além disso, eu tentei este aplicativo e ele não pode exportar dados em faixas que não estão no dispositivo, por isso é inútil para mim.
ale
1
Oliver, sendo aplicativos da Web, preferimos respostas que não exigem aplicativos nativos.
Vidar S. Ramdal