Apple MusicからAmazon Musicに移行したあと、マイミュージック一括ダウンロードを目指して

あらすじ

この間まで、Apple Musicを利用していました。
Macだけじゃなくて、Windowsからも聴き放題を利用しやすくしたいと思いました。
聴ける曲も考慮した結果、Amazon Musicに移行することに決めました。

プレイリストの移行

Amazon.co.jp: プレイリストをAmazonMusicにインポートする: デジタルミュージック

まず、上記の転送サービスを利用してプレイリストを移行しました。
移行後、違う曲・存在しない曲を取り込んでいるものがあったのでそれらを整理しました。
その後、Amazon Musicではマイミュージックを一括ダウンロードできないのが不便に感じました。
なので、全ての曲をプレイリストに追加してダウンロードしたいと思いました。

一括ダウンロードのためのプレイリスト作成

music.amazon.co.jp

  1. Amazon Musicをブラウザで開き、プレイリスト「ALL」を作成
  2. マイミュージックで開発者ツールを開く (プレイリストからも可能)
  3. addPlaylist.jsを実行して「ALL」に追加する
  4. 「ALL」プレイリストでダウンロードする
// 待機
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))

// プレイリストに追加する処理
const addAllPlaylist = async (musicRow) => {
  const moreBtn = musicRow.querySelector("music-button[icon-name='more']")
  moreBtn.click()
  await sleep(1000)
  const menu = document.querySelector('div[role="menu"]')
  const addMenuBtn = menu.querySelector(
    'music-list-item[primary-text="プレイリストに追加"]'
  )
  addMenuBtn.click()
  await sleep(1000)
  // メニュー内、1番目のプレイリストに追加
  const addBtn = document.querySelector("music-button[icon-name='add']")
  addBtn.click()
  await sleep(2000)
  try {
    const dialogHeaderText = document.getElementById("dialogHeader").textContent
    if (dialogHeaderText === "重複曲") {
      document.getElementById("dialogButton2").click()
      await sleep(1000)
    }
  } catch (error) {
    await sleep(2000)
  }
}

// スクロール時の重複曲を排除しながらプレイリストに追加する
const musicDictArray = []
let musicRows, musicRows2, number, nextNumber
musicRows = document.querySelectorAll("music-container music-image-row")
while (true) {
  for (let musicRow of musicRows) {
    nextNumber = Number(musicRow.querySelector(".index").textContent)
    const title = musicRow.querySelector(".col1 music-link").textContent
    const album = musicRow.querySelector(".col3 music-link").textContent
    const musicDict = {
      number: nextNumber,
      title: title,
      album: album,
    }

    await addAllPlaylist(musicRow)
  }
  if (number - nextNumber > 5) {
    break
  }
  number = nextNumber
  window.scrollTo(0, window.scrollY + 840)
  await sleep(1000)

  // スクロール時の重複曲排除
  convertedMusicRows = [].map.call(musicRows, (element) => {
    return element
  })
  musicRows2 = document.querySelectorAll("music-container music-image-row")
  convertedMusicRows2 = [].map.call(musicRows2, (element) => {
    return element
  })
  musicRows = convertedMusicRows2.filter(
    (i) => convertedMusicRows.indexOf(i) == -1
  )
}

感想

ブラウザでAmazon Musicを読み込んだときにすべては表示されず、スクロールするたびに曲情報が読み込まれるところに少し引っかかりました。  
なんとか無事一括ダウンロードできるようになってよかったです。