trifle

技術メモ

Last.fm で不要なアルバムの scrobble を削除する方法

Last.fm では scrobble (楽曲を聴いた記録一つひとつの単位) を操作するための API が公開されておらず、もし登録してほしくない履歴が誤って登録されても、クライアントサイドで削除ボタンをポチポチ押すしか方法がない。
ただ、それでも一応ある程度自動化できるので、それを説明する。

例として、誤って TOEIC の問題集のCDを登録してしまい、これを削除したいものとする。

f:id:HelloRusk:20190905132227p:plain

赤で囲った部分のように、アーティスト名が "Educational Testing Service" となっているものが TOEIC のCDである。
この画面にログイン済みの状態でいるなら、以下のスクリプトデベロッパーツールに打ち込めばよい。

var nodeList = document.querySelectorAll('.chartlist-artist > a')
nodeList.forEach((n, i) => {
    if (n.innerText === "Educational Testing Service") {
        var button = document.querySelectorAll('[data-ajax-form-sets-state="deleted"]')[i]
        if (button) { 
            button.click()
            location.reload()
        }
    }
});

Last.fm の UI はちょくちょく変わるので、将来的には使えないかもしれないことに注意。

さらに、毎回ログインしてこの画面に移動するのも実際面倒なので、puppeteer を使って全てを自動化する。

const puppeteer = require('puppeteer');

(async () => {
  const userId = "XXXXXXX" // ユーザー名
  const password = "YYYYYYYYYY" // パスワード

  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://secure.last.fm/ja/login');

  await page.type('input[name="username"]', userId);
  await page.type('input[name="password"]', password);
  await page.click('button[name="submit"]');

  await page.goto(`https://www.last.fm/ja/user/${userId}`);

  await page.evaluate(() => {
    const nodeList = document.querySelectorAll('.chartlist-artist > a')
    nodeList.forEach((n, i) => {
      if (n.innerText === "Educational Testing Service") {
        const button = document.querySelectorAll('[data-ajax-form-sets-state="deleted"]')[i]
        if (button) {
          button.click()
          location.reload()
        }
      }
    });
  });

  await browser.close();
})();

これを実行すればよい。
puppeteer の API にある jquery 風なセレクタの書き方で書いても良いけど、デベロッパーツールに打ち込む内容が既知なら、全て evaluate の中に書いてしまったほうが早いように見える。puppeteer、一年前くらいに比べて随分日本語の記事が増えましたね。