« [Link Annotation]リンク注釈(同一ドキュメント内の他のページビューの移動) | トップページ | [Link Annotation]特定の条件の場合のみ値を変更する »

[musicbrainz]アーティスト名+曲名から、アルバム名を取得する(JSON)

1:アーティストIDを取得
2:曲名とアーティストIDをクエリーに収録アルバムを取得する

【スクリプトエディタで開く】|

#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
#com.cocolog-nifty.quicktimer.icefloe
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions

property refMe : a reference to current application

########################################
### 再生中の曲
tell application "Music"
  set objNowTrack to current track
  tell objNowTrack
    set strSongTitle to name as text
    set strArtistName to artist as text
  end tell
end tell
########################################
###まずはアーティストIDを取得
###URL初期化
set strURL to "http://musicbrainz.org/ws/2/artist/" as text
set ocidURLStr to refMe's NSString's stringWithString:(strURL)
set ocidURL to refMe's NSURL's URLWithString:(ocidURLStr)
####コンポーネント
set ocidComponents to refMe's NSURLComponents's alloc()'s initWithURL:(ocidURL) resolvingAgainstBaseURL:false
set ocidComponentArray to refMe's NSMutableArray's alloc()'s initWithCapacity:0
##JSON指定
set ocidQueryItem to refMe's NSURLQueryItem's alloc()'s initWithName:("fmt") value:("json")
ocidComponentArray's addObject:(ocidQueryItem)
#####アーティスト名から artist idを取得する
set ocidArtistStr to (refMe's NSString's stringWithString:(strArtistName))
set ocidQueryItem to (refMe's NSURLQueryItem's alloc()'s initWithName:("query") value:(ocidArtistStr))
(ocidComponentArray's addObject:(ocidQueryItem))
###検索クエリーとして追加
(ocidComponents's setQueryItems:(ocidComponentArray))
####コンポーネントをURLに展開
set ocidJsonURL to ocidComponents's |URL|()
log ocidJsonURL's absoluteString() as text
##################################################
##### JSON取得
set ocidOption to refMe's NSDataReadingMappedIfSafe
set listReadData to (refMe's NSData's dataWithContentsOfURL:(ocidJsonURL) options:(ocidOption) |error|:(reference))
set ocidJsonData to (item 1 of listReadData)
###JSON初期化 してレコードに格納
set listJSONSerialization to (refMe's NSJSONSerialization's JSONObjectWithData:(ocidJsonData) options:0 |error|:(reference))
set ocidJsonData to item 1 of listJSONSerialization
##rootのレコード
set ocidHolidayDict to (refMe's NSDictionary's alloc()'s initWithDictionary:(ocidJsonData))
##レコードのartistsはArrayなのでfirstObjectが検索結果の最上位
set ocidArtistsDict to (ocidHolidayDict's valueForKey:"artists")'s firstObject()
###アーティストID
set ocidArtistsID to (ocidArtistsDict's valueForKey:"id")
###コメント用にテキストに整形して
set strArtistsID to ocidArtistsID as text

##################################################
#####続いて 曲名と アーティストIDから アルバム名を検索
##URL初期化
set strURL to "http://musicbrainz.org/ws/2/recording" as text
set ocidURLStr to refMe's NSString's stringWithString:(strURL)
set ocidURL to refMe's NSURL's URLWithString:(ocidURLStr)
###コンポーネント初期化
set ocidComponents to refMe's NSURLComponents's alloc()'s initWithURL:(ocidURL) resolvingAgainstBaseURL:false
set ocidComponentArray to refMe's NSMutableArray's alloc()'s initWithCapacity:0
###JSON
set ocidQueryItem to refMe's NSURLQueryItem's alloc()'s initWithName:("fmt") value:("json")
ocidComponentArray's addObject:(ocidQueryItem)
###検索用文字列生成 AND検索
set strQuery to ("\"" & strSongTitle & "\" AND arid:" & strArtistsID & "") as text
set ocidQuery to refMe's NSString's stringWithString:(strQuery)
set ocidQueryItem to refMe's NSURLQueryItem's alloc()'s initWithName:("query") value:(ocidQuery)
ocidComponentArray's addObject:(ocidQueryItem)

###検索クエリーとして追加
(ocidComponents's setQueryItems:(ocidComponentArray))
####コンポーネントをURLに展開
set ocidJsonURL to ocidComponents's |URL|()
log ocidJsonURL's absoluteString() as text

##################################################
##### JSON取得
set ocidOption to refMe's NSDataReadingMappedIfSafe
set listReadData to (refMe's NSData's dataWithContentsOfURL:(ocidJsonURL) options:(ocidOption) |error|:(reference))
set ocidJsonData to (item 1 of listReadData)
###JSON初期化 してレコードに格納
set listJSONSerialization to (refMe's NSJSONSerialization's JSONObjectWithData:(ocidJsonData) options:0 |error|:(reference))
set ocidJsonData to item 1 of listJSONSerialization
##rootのレコード
set ocidHolidayDict to (refMe's NSDictionary's alloc()'s initWithDictionary:(ocidJsonData))
###recordingsのリストの最初の項目
set ocidRecordingsArray to (ocidHolidayDict's valueForKey:"recordings")'s firstObject()
###リリースのリスト(同名曲が複数アルバムに収録されている場合、ベストとか)
set ocidReleaseArray to ocidRecordingsArray's valueForKey:"releases"
###アルバム名選択用のリストを初期化
set listTitle to {} as list
###ダイアログ用に収録アルバム数数える
set numCntList to (count of ocidReleaseArray) as integer
repeat with itemReleaseDict in ocidReleaseArray
  ###アルバムのタイトル取得して
  set ocidTitle to (itemReleaseDict's valueForKey:"title")
  ###リストに -->このリストから選ぶ
  copy (ocidTitle as text) to end of listTitle
end repeat
########################################
###
#####ダイアログを前面に
tell current application
  set strName to name as text
end tell
####スクリプトメニューから実行したら
if strName is "osascript" then
  tell application "Finder" to activate
else
  tell current application to activate
end if
set strPrompt to "収録アルバムが" & numCntList & "点見つかりました\r選んでください"
try
  set listResponse to (choose from list listTitle with title "選んでください" with prompt strPrompt default items (item 1 of listTitle) OK button name "OK" cancel button name "キャンセル" without multiple selections allowed and empty selection allowed)
on error
  log "エラーしました"
return "エラーしました"
end try
if listResponse is false then
return "キャンセルしました"
end if
###アルバム名
set strTitle to (item 1 of listResponse) as text

###ファイルのメタにアーティストIDを入れる
tell application "Music"
  ###アーティストIDをコメントに入れる
  set objNowTrack to current track
  ###アルバム名を設定
  set album of objNowTrack to strTitle
  ###コメントにアーティストID入れておく
  set comment of objNowTrack to strArtistsID
end tell



|

« [Link Annotation]リンク注釈(同一ドキュメント内の他のページビューの移動) | トップページ | [Link Annotation]特定の条件の場合のみ値を変更する »

AppleScript Json」カテゴリの記事

AppleScript Music」カテゴリの記事