2011-01-26 17 views
0

Macでは、「iTunes Music Library.xml」ファイルから特定の曲の「永続ID」を抽出し、AppleScriptを使用してその曲を再生できますそうのような:PC上でHEX iTunesの永続IDを上位32ビットおよび下位32ビットのフォームに変換する

tell application "iTunes" 
    set thePersistentId to "F040658A7687B12D" 
    set theSong to (some track of playlist "Music" whose persistent ID is thePersistentId) 
    play theSong with once 
end tell 

、私は同じようにXMLファイルから「永続ID」を抽出することができます。 iTunes COMインターフェイスのドキュメントでは、 "ItemByPersistentId"関数に "highID"(64ビットの永続IDの上位32ビット)と "lowID"(64ビットの永続IDの下位32ビット)という2つのパラメータがあり、 。 ItemByPersistentId関数が必要とする32ビットの値に16進値をどのように変換するのか分かりません。

var thePersistentId = "F040658A7687B12D"; 
var iTunes = WScript.CreateObject("iTunes.Application"); 
var n = parseInt(thePersistentId); 
var high = (do something with n?); 
var low = (do something else with n?); 
iTunes.LibraryPlaylist.tracks.ItemByPersistentId(high,low).play(); 
+0

コードを試してテストできる特定のIDがありますか? – Hemlock

+0

例iTunesの永続ID:F040658A7687B12D、9CA9C40E86124232、1489F2F36DA31F95(すべて16文字) – cloudbrain

答えて

1

私は状況がWindowsスクリプトホスト上にあるのか分からないが、いくつかのJSクライアントは、32ビットのintを持っているので、あなたのvar n = parseInt(thePersistentId);が二重に面倒です。 parseIntを使用する場合は必ずベースを含める必要があります(例:、parseInt(octValue, 8))。

32ビットスクリプトインタープリタの制限を回避するために、下位32ビットと上位32ビットを別々に抽出することができます。各16進数は4ビットなので、下位32ビットは永続IDの最後の8文字で、上位32ビットは残りの8ビットです(接頭語が0xでない場合は、次に8文字のチャンクです)。

var hexId = "XXXXX"; 
var iTunes = WScript.CreateObject("iTunes.Application"); 

//the following two statements assume you have a valid 64 bit hex, 
//you may want to verify the length of the string 

//grab and parse the last 8 characters of your string 
var low = parseInt(hexId.substr(hexId.length - 8), 16); 
//grab and parse the next last 8 characters of your string 
var high = parseInt(hexId.substr(hexId.length - 16, 8), 16); 
iTunes.LibraryPlaylist.tracks.ItemByPersistentId(high,low).play(); 

編集:私はiTuner source codeに何を読んでから、それはhighIDのように見え、実際に上位4バイトであり、かつlowID下位4バイト、8バイトではないが、(これpersistentIDの真ん中8つのバイトを破棄...)。

//assumes hex strings with no "0x" prefix 
//grab and parse the last 4 characters of your string 
var low = parseInt(hexId.substr(hexId.length - 4), 16); 
//grab, pad and parse the first 4 characters of your string 
var high = parseInt(hexId.substr(0, 4) + "0000", 16); 
+0

ありがとうございました。良い考え。残念なことに、ItemByPersistentIdは、このように計算された高/低の "オーバーフロー"エラーを返します。私はhexId = "F040658A7687B12D"をテストケースとして使用しています。他の考え? – cloudbrain

+0

@cloudbrain、私は周りを掘って、それはhighIDが8バイト整数の上位ビットとして上位4バイトであり、lowIDが最低4バイトであるように見えます。上記の私の変更を試して、それがどうなるか教えてください。 – jball

+0

ハイとローを文字列に変換するにはどうしたらいいですか? –

関連する問題