Apple MusicのプレイリストをSpotifyに「変換」するJSスクリプト


困ったこと

  • 普段、サブスクリプション&ストリーミングの音楽サービスはSpotifyをプレミアム会員として使っている
  • が、SNSなどで他人からプレイリストが共有されるのはSpotifyとは限らない(個人的にはApple Musicであることが多い)
  • プレビューで数十秒間聴くことはできるが、Spotifyであれば広告もなくフル尺で聴けるし、できればプレイリストを移植したい
  • プレイリスト移植ができなくてもせめて「一曲ごとSpotifyでキーボードを叩いて検索して」再生・プレイリストに追加する手間をなくしたい
  • Soundiizというサービスは、異なるストリーミングプラットフォーム間のプレイリストを変換してくれる
    • が、そのためにはApple Musicの方でも有料会員になっていて、Soundiizに接続する必要がある
    • さらに一括変換などの便益を受けたければSoundiizにも課金しなければならない
    • 現状そこまでしなくてもいいかな、感

解決の方向

  • 前提として

    • Apple MusicもSpotifyもPC版ネイティブアプリが使いやすいが、ともにWebでも使うことができる
    • Spotifyの楽曲・アルバム・アーティスト等検索はhttps://open.spotify.com/search/[検索語句]のURLで可能
  • これを利用して、Web(PC版)で開いたApple Musicプレイリストの楽曲タイトルを「Spotifyでその楽曲名で検索するリンク」に一括で置き換える

  • 検索した後はSpotify側で再生したり、プレイリストに追加したりすればOK。これによって「一曲ごとにSpotifyでキーボードを叩いて検索」する手間は省ける

  • JavaScriptのreplaceChildメソッドを使う

    • parentNode.replaceChild(newChild, oldChild)で親要素のうち指定した要素を新しい要素で置換できる
    • Node.replaceChild - Web API

デモ&スクリプト

  • すぐに試したい場合は、Apple Musicの適当なプレイリスト(たとえばはじめてのBillie Eilishとか)を開いて、次のスクリプトをコンソールで実行 or アドレスバーに貼り付けて(先頭のjavascript:が消えたら付け足して)Enterキー押下すれば実現可能(ブックマークレットにすればコンソールを開くことなく毎回実行できるのでおすすめ)
javascript:(()=>{  const songNameWrapperDivElms = [...document.getElementsByClassName('song-name-wrapper')];  songNameWrapperDivElms.forEach(wrapperElm => {    const songNameRawElm = wrapperElm.children[0];    const songName = songNameRawElm.innerText;    const songNameLinkedElm = document.createElement('a');    songNameLinkedElm.setAttribute('href', `https://open.spotify.com/search/${songName}`);    songNameLinkedElm.setAttribute('target', '_blank');    songNameLinkedElm.style.color = 'rgb(28, 185, 92)';    songNameLinkedElm.innerText = songName;    wrapperElm.replaceChild(songNameLinkedElm, songNameRawElm);  });})();
  • 解説付き(コメント以外は同じ)
javascript:(()=>{
  // 曲名などが子要素に含まれる要素(配列の長さはプレイリストの曲数に一致)
  const songNameWrapperDivElms = [...document.getElementsByClassName('song-name-wrapper')];
  songNameWrapperDivElms.forEach(wrapperElm => {
    // 曲名テキストだけの要素
    const songNameRawElm = wrapperElm.children[0];
    const songName = songNameRawElm.innerText;
    // Spotify検索へのリンクつきの曲名の要素
    const songNameLinkedElm = document.createElement('a');
    songNameLinkedElm.setAttribute('href', `https://open.spotify.com/search/${songName}`);
    songNameLinkedElm.setAttribute('target', '_blank');
    songNameLinkedElm.style.color = 'rgb(28, 185, 92)';
    songNameLinkedElm.innerText = songName;
    // 「曲名テキストだけの要素」を「Spotify検索へのリンクつきの曲名の要素」で置換
    wrapperElm.replaceChild(songNameLinkedElm, songNameRawElm);
  });
})();

注意など

  • 楽曲名が汎用的すぎると(「I love you」など)狙い通りの楽曲が出てこないかもしれない
    • アーティスト名も含めた検索にしてもいいかも
  • Apple Musicのプレイリストに入っている曲数が多い場合は、いったん下までスクロールし切ってから実行する
  • SpotifyのAPIはかなり強力なので、活用すればさらにパワーアップしてプレイリストの一括置換までいけるはず
  • 拡張機能にするのもいいかもしれない…

今回はここまで。Enjoy your Spotify Life!