Распечатать плейлист из Google Play Music

43

Я хочу напечатать список песен (с исполнителем, альбомом, рейтингом и, если возможно, количеством воспроизведений и продолжительностью) из моей учетной записи Google Play Music .

Нет простого способа сделать это из приложения. Делать печатные экраны, пока я пролистываю длинный список песен, невозможно.

Я был бы рад экспорту данных в стандартный формат (простой текст, CSV, XML и т. Д.), Которым я могу манипулировать самостоятельно.

Какие-либо предложения?

пиво
источник

Ответы:

17

Изменение ответа darkliquid в , я придумал следующее что позволяет несколько списков воспроизведения , которые будут сохранены сразу .

Инструкции:

  1. Перейдите на страницу своих плейлистов .
  2. Вставьте код JavaScript ниже в вашу консоль.
  3. Нажмите на список воспроизведения, который вы хотите сохранить в текст.
  4. Оказавшись на странице списка воспроизведения, прокрутите вниз относительно медленно.
  5. После того, как вы прокрутите страницу до конца, вернитесь на страницу списка воспроизведения (так же, как в шаге 1.), используя меню или кнопку возврата в браузере.
  6. Повторите шаги 3-5 для всех списков воспроизведения, которые вы хотите сохранить в текст.
  7. После того, как вы сделали это для всех списков воспроизведения , которые вы хотите сохранить текст, вы можете ввести JSON.stringify(tracklistObj, null, '\t')(изменить , '\t'чтобы , ' 'если вы хотите , минимальный отступ) или tracklistObjесли вы просто хотите, чтобы объект JavaScript , чтобы управлять его собственным путем. Если вы хотите, чтобы он был отсортирован, выполните команду Object.values(tracklistObj).forEach(a => a.sort()) перед вызовом JSON.stringifyкоманды.

Будьте внимательны, чтобы не обновить страницу до того, как вы выполнили все, что вы хотите сделать, иначе вам придется перезапустить с шага 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;

Вы также можете распечатывать названия треков на консоли, переходя printTracksToConsoleна true(вы должны сделать это до шага 3).

Обратите внимание, что вы, вероятно, можете игнорировать все ошибки GET и POST в консоли (они генерируются самой Play Music, а не этим скриптом).

Также отметим , что в настоящее время это установка только дать Artist - Track name, но вы можете легко изменить строку , которая имеет tracklistObj[currentPlaylist].push(artist + " - " + title);с album, playCount, durationили rating, и / или любой другой форматированием вы хотите (включая формат CSV , если вы так , пожалуйста).

Пример вывода (все плейлисты Google Play, которые у меня есть) с настройками по умолчанию. В общей сложности понадобилось около 5 минут, чтобы перейти к каждому из 32 списков воспроизведения, прокрутить их вниз, а затем преобразовать результат в текст.

PS Вам может быть интересно использовать найденный мной сайт под названием Tune My Music для создания плейлистов YouTube (но YouTube ограничивает создание плейлистов до 10 в день) из вывода, чтобы ваши друзья могли слушать ваши плейлисты Google. Если вы сделаете это, вы, вероятно, захотите использовать что-то вроде TextMechanic для удаления кавычек и .mp3из выведенного списка.

Зак Соусье
источник
1
Если бы только был лучший способ сделать это, чем вставить JavaScript в консоль. (У меня также был небольшой сбой, так как Ublock Origin заблокировал скрипт.) Но это делает то, что мне нужно.
Але
Боюсь, что это уже устарело :( Ошибка типа: Не удается прочитать свойство 'include' из неопределенного в getVisibleTracks (<anonymous>: 20: 43) в <anonymous>: 49: 5 в c ( play-music.gstatic.com/ fe / 6..e / listen__en_gb.js: 1190: 211 )
FloriOn
4
@FloriOn Спасибо за комментарий! Я обновил код, чтобы он снова работал.
Зак Соусье
2
@ale Есть. Вы можете превратить код в букмарклет.
Дэвид Меткалф
Ошибки консоли появляются при запуске этого кода, но, похоже, он не блокирует его выполнение
Otheus
31

(Обновлено 2016-05-09, более надежный, чем текущий топ-ответ)

Если вам просто нужно сохранить несколько плейлистов, вы можете просто использовать мой фрагмент Javascript ниже. Этот фрагмент может сохранить каждый список, как он показан на веб-странице, поэтому он также работает для всех представлений библиотеки песен / альбомов / исполнителей. Я перечислил две другие альтернативы в конце этого ответа.

  1. Перейдите по адресу : https://play.google.com/music/listen#/all (или в свой плейлист).

  2. Откройте консоль разработчика (F12 для Chrome). Вставьте код ниже в консоль.

  3. Все записанные песни сохраняются в allsongsобъекте, а текстовая версия списка копируется в буфер обмена. Я рекомендую бежать songsToText("all",true)позже, чтобы получить полную информацию о CSV. Запустите copy(outText)вручную, если копирование в буфер обмена не сработало с первой попытки.

Код (последняя версия 10 мая 2016 г., редакция 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);

Последний код на Github (Gist) здесь: https://gist.github.com/jmiserez/c9a9a0f41e867e5ebb75

  • Если вы хотите вывод в текстовом формате, можете вызвать функцию songsToText (). Вы можете выбрать стиль, выбрать формат, и если нужно экспортировать только понравившиеся песни. Полученный список будет вставлен в буфер обмена. Стили all, artist, artistalbum, artistsong, artistalbumsong. CSV приведет к созданию файла CSV и может быть пропущен (по умолчанию false). Likedonly может быть пропущен (по умолчанию false) или установлен в true, и будет фильтровать все песни с оценками, большими или равными 5. Например:

    • songsToText("all",true,false) экспортирует все песни в формате CSV.
    • songsToText("all",true,true) будет экспортировать только любимые песни в формате CSV.
    • songsToText("artistsong",false,false) экспортирует все песни в виде текста.
  • Затем вы можете вставить данные в любое удобное для вас место, например, http://www.ivyishere.org/, если хотите добавить песни или альбомы в свою учетную запись Spotify. Чтобы Ivy распознал полноценные альбомы, используйте стиль "Artistalbum". Для песен используйте стиль «Artistong».

О фрагменте: это основано на первоначальном ответе Майкла Смита, но немного более надежно. Я сделал следующие улучшения:

  • Работает как с плейлистами, так и с библиотекой. Все пропущенные столбцы игнорируются, и порядок определяется, поэтому он должен работать практически с любым списком песен в Google Music.

  • Он останавливается, когда достигает дна (определяет положение прокрутки) или по истечении указанного времени ожидания. Тайм-аут существует для предотвращения бесконечного цикла в случае, если код обнаружения прокрутки отключен на несколько пикселей.

  • Это намного быстрее (интервал каждые 1 мс), но ожидает, если данные не готовы (до указанного времени ожидания, в настоящее время 3 с).

  • Делает дедупликацию во время работы и на выходе.

  • Собирает оценки: «undefined» никогда не оценивается, «0» не оценивается (то есть один раз оценивается, но затем удаляется), «1» - это большие пальцы вниз, а «5» - большие пальцы (понравилось).

В дополнение к основным улучшениям, он также хорошо форматирует текст и копирует его в буфер обмена. Вы также можете получить данные в формате CSV, если хотите, запустив songsToTextфункцию во второй раз.

Альтернативы:

  1. Если вам нужен Python API, ознакомьтесь с неофициальным проектом Google Music API .

  2. Если у вас есть тонны плейлистов и вы хотите экспортировать их все за один раз, попробуйте экспортер плейлистов gmusic-scripts, который может это сделать (Python использует неофициальный проект API).

jmiserez
источник
Эй, просто продолжение кода: в результате копируются только последние 30 песен, а когда я выполняю songToText ("artistong"), он выводит длину в минутах: секундах и номер дорожки в списке воспроизведения. детали песен в любом случае есть в песнях, но их всего 30 (у меня есть плейлисты с сотнями)
mkln
не обращайте внимания на количество песен, оно не застряло на 30. Но в другом плейлисте с 130 песнями он экспортирует только первые 117.
mkln
@mkln Я обновил код, теперь он обрабатывает библиотеку, списки воспроизведения, а также любой другой список песен в Google Music. Просто запустите все, и он скопирует плейлист / библиотеку / список в виде текстового списка в буфер обмена. Если вам нужна версия CSV, которая включает в себя все (количество игр, продолжительность, рейтинг), запустите songsToText("all", true)после.
jmiserez
отлично работает, спасибо. Я пытаюсь написать скрипт на Python, который сохраняет все плейлисты. Как бы вы нажимали на различные списки воспроизведения через JavaScript? Будет ли возможно иметь селектор списка воспроизведения в начале функции?
mkln
1
@mkln Ну, этот парень уже сделал это: github.com/soulfx/gmusic-playlist Вероятно, проще всего, если вы просто используете его скрипт на Python! Честно говоря, я не видел этого до сих пор, но это, вероятно, лучший вариант, если вам нужно более одного плейлиста.
Jmiserez
18

Если вы не возражаете против запуска кода javascript в консоли разработчика вашего браузера, вы можете извлечь информацию со страницы следующим образом (проверено только в 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); 
}

Это выведет на консоль список большинства видимых в данный момент песен в окне. Вам нужно будет прокрутить вниз и перезапустить его, чтобы получить больше. На данный момент я еще не нашел приличного способа получить информацию полностью, но этот быстрый 5-минутный хак лучше, чем ничего.

darkliquid
источник
Это выглядит многообещающе. Я попробую.
Эль
2
Большое спасибо за этот ответ. Вы сэкономили мне часы и часы времени. Я снова и снова запускал ваш скрипт в плейлисте, который я хотел скопировать. Вставьте результаты в приложение Mac под названием Text Soap. Превратился в ",". Удалены дубликаты и экспортированы в виде текста. Затем изменил его на CSV, удалил ненужные столбцы и импортировал его в Spotify, используя: ivyishere.org. В общем, у меня ушло около 8 минут, один раз я его
Нет проблем, рад помочь.
Darkliquid
Похоже, что это сработает. Моя самая большая проблема - размер моих плейлистов - 180 на том, который я пытаюсь экспортировать. Я немного обошел это, развернув окно Chrome, а затем уменьшив его настолько, насколько смог. Если бы я мог просто убедить Chrome увеличить до 10%, я бы все это на одном экране ... на 25%, это заняло бы два раунда плюс немного больше. (Есть ли шанс, что вы сможете увеличить масштаб от JS?)
RobertB
1
К вашему сведению, если вы используете только один элемент, используйте querySelector(...)вместоquerySelectorAll(...)[0]
ThiefMaster
3

Используя верхний ответ (в то время) и желая получить полное решение, я создал следующий код, который прокручивает список музыки и добавляет объекты JSON в массив по мере его поступления.

Из-за незнания, какие именно песни видны, код добавляет их все, а затем в конце удаляет дубликаты. (Проверено только в Chrome.)

Для использования: перейдите в свою библиотеку, где вы видите свой полный список песен, и запустите

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

Когда это дойдет до нижней части страницы, запустите это, чтобы остановить прокрутку, дедуплицировать массив и скопировать JSON в буфер обмена.

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

У меня есть немного более короткий JavaScript, который вы можете вставить в консоль. Вместо повторного запуска кода вы можете просто прокрутить вниз и добавить все появившиеся альбомы. Затем вы можете скачать список воспроизведения в виде электронной таблицы.

инструкции

  1. Перейдите по этой ссылке: https://play.google.com/music/listen#/ap/auto-playlist-thumbs-up.

  2. Откройте Developer Tools (F12) и вставьте приведенный ниже код на вкладку Console

  3. Прокрутите, чтобы каждый альбом в плейлисте был виден хотя бы один раз

  4. Дважды щелкните где-нибудь на странице, чтобы загрузить export-google-play.csv

  5. Открыть export-google-play.csvв Excel.

Код

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

Выход

введите описание изображения здесь

GitHub

Чарльз Клейтон
источник
2

Я немного изменил подход верхнего ответа. Для меня это работало лучше с методом копирования / вставки Айви ( http://www.ivyishere.org/ivy ):

Шаг 1 Откройте нужный список воспроизведения из Google Music в Chrome и вставьте его в консоль:

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

Это должно привести к отображению всего вашего плейлиста, а не только его части.

Шаг 2 Вставьте этот скрипт в консоль:

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

Шаг 3 Перейдите к Ivy, а когда перейдете к шагу 2, выберите вкладку «Копировать / Вставить» и вставьте туда вывод консоли.

РЕДАКТИРОВАТЬ

Обновленный скрипт, предложенный Алексом Педерсеном

Итерации по саморазвитию доработки (у меня пока недостаточно репутации, чтобы комментировать его пост). Я думаю, что стилизация в Googleplay обновилась, поэтому приведенный ниже скрипт снова дает хороший результат.

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
источник
-1

Просто сделайте Ctrl+, пока текст не станет очень маленьким, а затем выделите все. Работает как шарм без скриптов и приложений.

Молодая любовница Обамы
источник
-2

Я только сталкивался с этим вопросом, ища что-то подобное.

Я думаю, ваш лучший вариант:

  1. установить приложение типа «Резервное копирование плейлиста»
  2. Экспортируйте Google Music Playlist в текстовый файл с помощью этого приложения.
  3. Переименуйте его в .m3u с помощью приложения FileManager (например, Ghost Commander)
  4. Откройте список воспроизведения с помощью другого приложения, которое имеет больше параметров (например, MusiXMatch).
Оливер Хоффманн
источник
1
Я полагаю, вы имеете в виду это приложение . Не хорошо. Хотя у меня есть устройство Android, я не ищу решение для Android. Кроме того, я попробовал это приложение, и оно не может экспортировать данные на дорожки, которых нет на устройстве, поэтому оно бесполезно для меня.
Эль
1
Оливер, будучи веб-приложением, мы предпочитаем ответы, которые не требуют собственных приложений.
Видар С. Рамдал