Imprimir lista de reproducción desde Google Play Music

43

Quiero imprimir una lista de canciones (con artista, álbum, calificación y, si es posible, número de reproducciones y duración) desde mi cuenta de Google Play Music .

No hay una manera fácil de hacer esto desde la aplicación. Hacer pantallas de impresión mientras hojeo una larga lista de canciones no es sostenible.

Me encantaría exportar datos a un formato estándar (texto plano, CSV, XML, etc.) que pueda manipular yo mismo.

¿Alguna sugerencia?

cerveza inglesa
fuente

Respuestas:

17

Modificando la respuesta de darkliquid , se me ocurrió lo siguiente que permite guardar varias listas de reproducción a la vez .

Instrucciones:

  1. Ve a la página Tus listas de reproducción .
  2. Pegue el código JavaScript a continuación en su consola.
  3. Haga clic en la lista de reproducción que desea guardar en el texto.
  4. Una vez en la página de la lista de reproducción, desplácese hasta la parte inferior con relativa lentitud.
  5. Después de desplazarse hasta la parte inferior, vuelva a la página de listas de reproducción (igual que en el paso 1) usando el menú o el botón de retroceso de su navegador.
  6. Repita los pasos 3-5 para todas las listas de reproducción que desea guardar en el texto.
  7. Una vez que haya hecho esto para todas las listas de reproducción que desea guardar en el texto, puede escribir JSON.stringify(tracklistObj, null, '\t')(cambiar '\t'a ' 'si desea una sangría mínima) o tracklistObjsi solo desea que el objeto JavaScript lo manipule a su manera. Si desea ordenarlo, ejecute el comando Object.values(tracklistObj).forEach(a => a.sort()) antes de llamarlo JSON.stringify.

Tenga cuidado de no actualizar la página antes de haber completado todo lo que desea hacer o de lo contrario tendrá que reiniciar desde el paso 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;

También puede imprimir los nombres de las pistas en la consola a medida que avanza cambiando printTracksToConsolea true(debe hacerlo antes del Paso 3).

Tenga en cuenta que probablemente pueda ignorar todos los errores GET y POST en la consola (estos son generados por Play Music en sí, no por este script).

También tenga en cuenta que en la actualidad es de configuración única para dar Artist - Track name, pero se puede editar fácilmente la línea que tiene tracklistObj[currentPlaylist].push(artist + " - " + title);con album, playCount, duration, o rating, y / o cualquier formato que desee (incluyendo el formato CSV si así lo deseas).

Ejemplo de salida (todas las listas de reproducción de Google Play que tengo actualmente) con la configuración predeterminada. Le llevó aproximadamente 5 minutos en total navegar a cada una de las 32 listas de reproducción, desplazarse hacia abajo y luego convertir el resultado en texto.

PD: Puede que le interese usar un sitio que encontré llamado Tune My Music para crear listas de reproducción de YouTube (pero YouTube restringe la creación de listas de reproducción a 10 por día) desde la salida para que sus amigos puedan escuchar sus listas de reproducción de Google. Si hace esto, probablemente quiera usar algo como TextMechanic para eliminar las comillas y .mp3de la lista de salida.

Zach Saucier
fuente
1
Si solo hubiera una mejor manera de hacerlo que pegar JavaScript en la consola. (También tuve un pequeño inconveniente ya que Ublock Origin bloqueó el script). Pero, esto es lo que necesito.
cerveza
Me temo que está desactualizado ahora :( TypeError: No se puede leer la propiedad 'incluye' de undefined en getVisibleTracks (<anónimo>: 20: 43) en <anónimo>: 49: 5 en c ( play-music.gstatic.com/ fe / 6..e / listen__en_gb.js: 1190: 211 )
FloriO
44
@FloriOn Gracias por comentar! Actualicé el código para que vuelva a funcionar ahora.
Zach Saucier
2
@ale Hay. Puede convertir el código en un bookmarklet.
David Metcalfe
Los errores de la consola aparecen cuando se ejecuta este código, pero no parece impedir que se ejecute
Otheus
31

(Actualizado 2016-05-09, más robusto que la respuesta principal actual)

Si solo necesita guardar algunas listas de reproducción, puede usar mi fragmento de Javascript a continuación. Este fragmento puede guardar cada lista tal como se muestra en la página web, por lo que también funciona para todas las vistas de la biblioteca de canciones / álbumes / artistas. He enumerado otras dos alternativas al final de esta respuesta.

  1. Vaya a: https://play.google.com/music/listen#/all (o su lista de reproducción)

  2. Abra una consola de desarrollador (F12 para Chrome). Pegue el código a continuación en la consola.

  3. Todas las canciones raspadas se almacenan en el allsongsobjeto y una versión de texto de la lista se copia en el portapapeles. Recomiendo correr songsToText("all",true)después para obtener la información CSV completa. Ejecútelo copy(outText)manualmente si la copia del portapapeles no funcionó en el primer intento.

Código (última versión 10 de mayo 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);

Último código en Github (Gist) aquí: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75

  • Si desea la salida en formato de texto, puede llamar a la función songsToText (). Puede seleccionar un estilo, elegir el formato y, si solo se deben exportar las canciones con me gusta / pulgar hacia arriba. La lista resultante se pegará en el portapapeles. Los estilos son all, artist, artistalbum, artistsong, artistalbumsong. CSV generará un archivo CSV y puede omitirse (el valor predeterminado es falso). Likedonly puede omitirse (por defecto es falso) o establecerse en verdadero, y filtrará todas las canciones con calificaciones mayores o iguales a 5. Por ejemplo:

    • songsToText("all",true,false) exportará todas las canciones en formato csv.
    • songsToText("all",true,true) exportará solo las canciones que le gustaron en formato csv.
    • songsToText("artistsong",false,false) exportará todas las canciones como texto.
  • Luego puede pegar los datos en cualquier lugar que desee, por ejemplo http://www.ivyishere.org/ si desea agregar las canciones o álbumes a su cuenta de Spotify. Para que Ivy reconozca álbumes completos, use el estilo "artistalbum". Para las canciones, use el estilo "artistas".

Acerca del fragmento: se basa en la respuesta original de Michael Smith, pero es un poco más robusto. He realizado las siguientes mejoras:

  • Funciona en listas de reproducción y en la biblioteca. Se ignoran las columnas que faltan y se determina el orden, por lo que debería funcionar en casi cualquier lista de canciones dentro de Google Music.

  • Se detiene cuando llega al final (detecta la posición de desplazamiento) o después del tiempo de espera especificado. El tiempo de espera está ahí para evitar un bucle sin fin en caso de que el código de detección de desplazamiento esté desactivado por unos pocos píxeles.

  • Es mucho más rápido (intervalo cada 1 ms), pero espera si los datos no están listos (hasta el tiempo de espera especificado, actualmente 3 segundos).

  • Hace deduplicación durante la operación y en la salida.

  • Reúne las calificaciones: "indefinido" nunca se califica, "0" no se califica (es decir, una vez calificado pero luego eliminado), "1" se rechaza y "5" se aprueba (me gusta).

Además de las mejoras básicas, también formatea bien el texto y lo copia al portapapeles. También puede obtener los datos como CSV si lo desea, ejecutando la songsToTextfunción por segunda vez.

Alternativas:

  1. Si necesita una API de Python, consulte el proyecto no oficial de la API de Google Music .

  2. Si tiene toneladas de listas de reproducción y desea exportarlas todas de una vez, pruebe el exportador de listas de reproducción gmusic-scripts que puede hacerlo (Python, utiliza el proyecto API no oficial).

jmiserez
fuente
Hola, solo un seguimiento del código: da como resultado que solo se copien las últimas 30 canciones, y cuando hago songsToText ("artistsong") genera la duración en minutos: segundos y el número de pista en la lista de reproducción. los detalles de las canciones están en todas las canciones de todos modos, pero solo hay 30 de ellos (tengo listas de reproducción con cientos)
mkln
no importa la cantidad de canciones, no está atascado en 30. Pero en otra lista de reproducción con 130 canciones solo exporta las primeras 117.
mkln
@mkln He actualizado el código, ahora maneja la biblioteca, las listas de reproducción y todas las demás listas de canciones en Google Music. Simplemente ejecute todo y copiará la lista de reproducción / biblioteca / lista como una lista de texto en el portapapeles. Si necesita una versión CSV que incluya todo (recuento de juegos, duración, calificación), ejecute songsToText("all", true)después.
jmiserez
Funciona muy bien, gracias. Estoy tratando de escribir un script de Python que guarde todas las listas de reproducción. ¿Cómo harías clic en las diferentes listas de reproducción a través de JavaScript? ¿Sería posible tener un selector de lista de reproducción al comienzo de la función?
mkln
1
@mkln Bueno, este tipo ya lo ha hecho: github.com/soulfx/gmusic-playlist ¡ Probablemente sea más fácil si solo usas su script Python! Honestamente, no vi esto hasta ahora, pero probablemente sea la mejor opción si necesita más de una lista de reproducción.
jmiserez
18

Si no le importa ejecutar un poco de código javascript en la consola de desarrollador de su navegador, puede extraer información de la página de la siguiente manera (solo probado en 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); 
}

Esto imprimirá en la consola una lista de la mayoría de las canciones actualmente visibles en la ventana. Tendrá que desplazarse hacia abajo y volver a ejecutarlo para obtener más. Por el momento aún no he descubierto una forma decente de obtener la información en su totalidad, pero este rápido truco de 5 minutos es mejor que nada.

darkliquid
fuente
Esto parece prometedor. Voy a darle una oportunidad.
cerveza el
2
Muchas gracias por esta respuesta. Me salvaste horas y horas de tiempo. Lo que hice fue ejecutar su script una y otra vez en la lista de reproducción que quería copiar. Pegue los resultados en una aplicación para Mac llamada Text Soap. Convertido en ",". Se eliminaron los duplicados y se exportaron como txt. Luego lo cambió a CSV, despojado a cabo las columnas unneded e importado a Spotify usando: ivyishere.org Con todo me tomó alrededor de 8 minutos que me dieron la caída de ella, aplausos ~
No hay problema, es un gusto ayudar.
darkliquid
Parece que va a hacer el truco. Mi mayor problema es el tamaño de mis listas de reproducción: 180 en el que intento exportar. Lo solucioné un poco maximizando mi ventana de Chrome y luego alejándome lo más que pude. Si pudiera convencer a Chrome de hacer un zoom al 10%, lo tendría todo en una pantalla ... al 25%, tomaría dos rondas y un poco más. (¿Alguna posibilidad de que puedas hacer zoom desde JS?)
RobertB
1
FYI, si solo tienes un elemento, querySelector(...)querySelectorAll(...)[0]
úsalo en
3

Utilizando la respuesta principal (en ese momento) y queriendo una solución completa, he creado el siguiente código que se desplaza hacia abajo en la lista de música y agrega objetos JSON a una matriz a medida que avanza.

Debido a que no se sabe exactamente qué canciones son visibles, el código las agrega todas y luego las deduplica al final. (Solo probado en Chrome).

Para usar: vaya a su biblioteca, donde verá su lista de canciones completa, y ejecute

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

Cuando llegue al final de la página, ejecútelo para detener el desplazamiento, desduplicar la matriz y copie JSON en el portapapeles.

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

Tengo un JavaScript mucho más corto que puedes pegar en la consola. En lugar de volver a ejecutar el código, puede desplazarse hacia abajo y agregar todos los álbumes que aparecen. Luego puede descargar la lista de reproducción como una hoja de cálculo.

Instrucciones

  1. Vaya aquí: https://play.google.com/music/listen#/ap/auto-playlist-thumbs-up

  2. Abra las Herramientas para desarrolladores (F12) y pegue el siguiente código en la pestaña Consola

  3. Desplácese para ver cada álbum de la lista de reproducción visible al menos una vez

  4. Haga doble clic en algún lugar de la página para descargar export-google-play.csv

  5. Abrir export-google-play.csven 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);

Salida

ingrese la descripción de la imagen aquí

GitHub

Charles Clayton
fuente
2

Modifiqué un poco el enfoque de la respuesta superior. Esto funcionó mejor para mí con el método de copiar / pegar de Ivy ( http://www.ivyishere.org/ivy ):

Paso 1 Abra la lista de reproducción que desea de Google Music en Chrome y péguela en la consola:

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

Esto debería hacer que toda tu lista de reproducción se procese en lugar de solo una parte.

Paso 2 Pegue este script en la consola:

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

Paso 3 Vaya a Ivy y cuando llegue al paso 2 allí, seleccione la pestaña Copiar / Pegar y pegue la salida de la consola allí.

EDITAR

Guión actualizado sugerido por Alex Pedersen

Iterando el refinamiento de samurauturetskys (todavía no tengo la reputación suficiente para comentar sobre su publicación). Creo que el estilo de Googleplay se ha actualizado, por lo que la secuencia de comandos a continuación nuevamente da un resultado bastante bueno.

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

Simplemente haz Ctrl+ hasta que el texto sea muy pequeño y luego selecciónalo todo. Funciona de maravilla sin scripts y aplicaciones.

Amante adolescente de Obama
fuente
-2

Acabo de encontrar esta pregunta en busca de algo similar.

Supongo que tu mejor opción es:

  1. instalar una aplicación como "Copia de seguridad de lista de reproducción"
  2. Exporte la lista de reproducción de Google Music a un archivo de texto con esta aplicación.
  3. Cámbiele el nombre a .m3u con una aplicación FileManager (como Ghost Commander)
  4. Abra la lista de reproducción con otra aplicación que tenga más opciones (como MusiXMatch).
Oliver Hoffmann
fuente
1
Supongo que te refieres a esta aplicación . No es bueno. Si bien tengo un dispositivo Android, no estoy buscando una solución para Android. Además, probé esta aplicación y no puede exportar datos en pistas que no están en el dispositivo, por lo que es inútil para mí.
ale
1
Oliver, al ser aplicaciones web, preferimos respuestas que no requieren aplicaciones nativas.
Vidar S. Ramdal