大まかな処理内容
ショートカット側
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したからのように)フォーマットして、スクリプトを終了して出力。おしまい!
ショートカット
スクリプト
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();
};
半年間ずっとこいつと格闘した証です。とりあえず足跡が残せてよかった…