2011-01-26 1 views
0

Mac에서는 "iTunes Music Library.xml"파일에서 특정 노래의 "영구 ID"를 추출한 다음 AppleScript를 사용하여 해당 노래를 재생할 수 있습니다 like :HEX iTunes 영구 ID를 높거나 낮은 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 

PC에서 필자는 같은 방식으로 XML 파일에서 "Persistent ID"를 추출 할 수 있습니다. iTunes COM 인터페이스에 대한 문서에서는 "ItemByPersistentId"함수는 "highID"(64 비트 영구 ID의 상위 32 비트)와 "lowID"(64 비트 영구 ID의 하위 32 비트)라는 두 개의 매개 변수를 가지고 있다고 말합니다. . 그러나 16 진수 기반 값을 ItemByPersistentId 함수가 원하는 높은 32 비트 값과 낮은 32 비트 값으로 변환하는 방법을 알 수는 없습니다.

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

나는 상황이 윈도우 스크립트 호스트가 뭔지 모르겠지만, 당신의 var n = parseInt(thePersistentId);는 이중으로 귀찮은 그래서 일부 JS 클라이언트는 32 비트 INT 있습니다. 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 바이트이며, 하위 ID는 최하위 4 바이트 인 것처럼 보입니다. 위의 수정을 시도하고 어떻게되는지 알려주세요. – jball

+0

고가 및 저급을 문자열로 변환하는 방법에 대해 어떻게 생각하십니까? –