LoginSignup
2
0

More than 3 years have passed since last update.

iTunesAPIを使ってiTunesメディアからリンクを見つけ出す

Posted at

大まかな処理内容

ショートカット側

1.テキストもしくはURLが渡される
→StoreIDが含んでいるかチェック、含んでいたらScriptableに渡す

{
   "how2": "lookup",
   "id": "< StoreID >"
}

2.iTunesメディアが渡される
→タイトル名、アルバム名、アーティスト名、メディアタイプを取得してScriptableに渡す

{
   "how2": "search",
   "title": "< タイトル >",
   "album": "< アルバム >",
   "artist": "< アーティスト >",
   "mediatype": "< メディアタイプ >"
}

3.何も渡されない
→エラー通知

Scriptable側

how2 == lookup

https://itunes.apple.com/lookup?id=<StoreID>&country=jp&lang=ja_jp
にGETリクエスト。
json貰ったらスクリプトを終了して出力。終わり!

how2 == search

https://iTunes.apple.com/search?term=<タイトル> <アルバム> <アーティスト>&media=<メディアタイプ>&country=jp&lang=ja_jp
にGETリクエスト。
jsonを貰ったら、findメゾットでtrackName,collectoonName,artistName<タイトル>,<アルバム>,<アーティスト>と一致する要素を見つける。
見つかった要素を(さぞlookupしたからのように)フォーマットして、スクリプトを終了して出力。おしまい!

ショートカット

6E17D475-EC1C-45E3-B41C-E391136437F2.jpeg

スクリプト

Musica.js
const INPUT = JSON.parse(args.plainTexts[0]);
const HOWTO= INPUT.how2;
const LIMIT = String(30);
const COUNTRY = 'jp';
const LANG = 'ja_jp';
const BASEURL = 'https://itunes.apple.com/' + HOWTO;

if (HOWTO == 'lookup') {
  let id = INPUT.id;
  let url = BASEURL +
           '?id=' + id +
           '&country=' + COUNTRY +
           '&lang=' + LANG;
  Pasteboard.copy(url) // debug
  let req = new Request(url);
  let response = await req.loadJSON();
  Script.setShortcutOutput(response);
  Script.complete();

} else if (HOWTO == 'search') {
  let title = INPUT.title;
  let album = INPUT.album;
  let artist = INPUT.artist;
  let mediatype = INPUT.mediatype;
  let term = [
               title,
               album,
               artist
             ].join(' ')
  let query = '?term=' +
              encodeURIComponent(term) +
              '&media=' + mediatype +
              '&country=' + COUNTRY +
              '&lang=' + LANG +
              '&limit=' + LIMIT;
  let url = BASEURL + query;
  Pasteboard.copy(url) // debug
  let req = new Request(url);
  let response = await req.loadJSON();
  let rslts = response.results
  let found = rslts.find(function(rslts) {
    return rslts.artistName == artist && rslts.trackCensoredName
  });

  if (found != null) {
    let formatted = {
                      "resultCount": 1,
                      "results": [
                        found
                      ]
                    };
// await QuickLook.present(found)
    Script.setShortcutOutput(formatted);
    Script.complete();

  } else {
    Script.setShortcutOutput('formatted is null')
    Script.complete();
  };

} else {
  console.error('HOWTO isn’t lookup or search');
  Script.complete();

};

半年間ずっとこいつと格闘した証です。とりあえず足跡が残せてよかった…

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0