見出し画像

[BMS] リコメンドの譜面一覧を難易度表形式で取得できるWebアプリをGASで作りデプロイしました [難易度表]

背景

以下のようにリコメンドのページでは、推定実力値的に狙い目の譜面を一覧にしてくれます。

BeMusicSeekerにはこの譜面の一覧を難易度表として取り込む機能があります。しかし、ribbit.xyzが鯖落ちしてから使えなくなっていました。

そこで、ほぼ同様の機能を提供するWebアプリをGAS(Google Apps Script)で作りデプロイしました。
{あなたのLR2ID}の所は書き換えてください

https://script.google.com/macros/s/AKfycbyRtBjD1bpT_DzfZHUAKhmTxvY6xvAirYBKeemtYSzmnsX239fI14X-UldTfwvCJ8wQvw/exec?lr2id={あなたのLR2ID}&contents=header.json

サンプルリンク

https://script.google.com/macros/s/AKfycbyRtBjD1bpT_DzfZHUAKhmTxvY6xvAirYBKeemtYSzmnsX239fI14X-UldTfwvCJ8wQvw/exec?lr2id=119698&contents=header.json

難易度表のページなしで、header.jsonしかありませんが、BeMusicSeekerでもbeatorajaでも読み込めます。BeMusicSeeker + LR2なら、リコメン度が高い順にソートされたフォルダから選曲できます。

GASのコード

function getRecommendedAsObj(lr2id) {
  const url = "http://walkure.net/hakkyou/recommended_json.cgi?id=" + lr2id;
  const fetch = UrlFetchApp.fetch(url);
  const response = fetch.getContentText();
  const json = JSON.parse(response);
  const rows = json.recommended
    .filter((obj) => obj.bms.type == 'bms')
    .map((obj) => {
      let row = {}
      row["level"] = String(obj.new_lamp).toUpperCase();
      row["org_level"] = parseFloat(obj.p);
      row["title"] = String(obj.bms.name);
      row["md5"] = String(obj.bms.md5hash);
      return row;
    });
  return rows
}

function getHeaderJson(lr2id, url) {
  const headerJson = `{
  "name": "リコメンド(${lr2id})",
  "data_url": "${url}?lr2id=${lr2id}&contents=data.json",
  "symbol": "R★",
  "level_order": ["EASY","NORMAL","HARD","FC"],
  "folder_sort_key": "level",
  "folder_sort_ascending": false
}`
  return headerJson
}

function doGet(e) {
  // このデプロイ自体のURLを指定する
  const url = 'https://script.google.com/macros/s/AKfycbyRtBjD1bpT_DzfZHUAKhmTxvY6xvAirYBKeemtYSzmnsX239fI14X-UldTfwvCJ8wQvw/exec'
  
  // GETパラメータを取得
  const lr2id = e.parameter.lr2id;
  const contents = e.parameter.contents;

  // header.jsonかdata.jsonか分岐させる
  switch (contents) {
    case 'header.json':
      return ContentService.createTextOutput(getHeaderJson(lr2id, url)).setMimeType(ContentService.MimeType.JSON);
    case 'data.json':
      const obj = getRecommendedAsObj(lr2id)
      return ContentService.createTextOutput(JSON.stringify(obj, null, 2)).setMimeType(ContentService.MimeType.JSON);
    default:
      return ContentService.createTextOutput("URLの末尾は「?lr2id=119698&contents=header.json」のようにLR2IDなどを正しく指定してください。");
  }
}





この記事が気に入ったらサポートをしてみませんか?