Конвертируйте HEX iTunes Persistent ID в 32-разрядные формы High и Low - PullRequest
0 голосов
/ 26 января 2011

На Mac я могу извлечь «Persistent ID» для определенной песни из файла «iTunes Music Library.xml», а затем использовать Applescript для воспроизведения этой песни следующим образом:

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 таким же образом. В документации по интерфейсу iTunes COM говорится, что функция «ItemByPersistentId» имеет два параметра: «highID» (старшие 32 бита 64-битного постоянного идентификатора) и «lowID» (младшие 32 бита 64-битного постоянного идентификатора) , но я не могу понять, как преобразовать шестнадцатеричное значение в верхнее и нижнее 32-битные значения, которые хочет функция ItemByPersistentId.

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();  

1 Ответ

1 голос
/ 26 января 2011

Я не знаю, какова ситуация на хосте сценариев Windows, но некоторые клиенты JS имеют 32-битное int, поэтому ваш var n = parseInt(thePersistentId); вдвойне хлопотен. При использовании parseInt вы всегда должны включать базу (например, parseInt(hexValue, 16), parseInt(octValue, 8)).

Чтобы избежать ограничений 32-битного интерпретатора сценариев, вы можете отдельно извлечь младшие 32 бита и верхние 32 бита. Каждая шестнадцатеричная цифра составляет 4 бита, поэтому нижние 32 бита - это последние 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(); 

Edit: Из того, что я прочитал в исходном коде iTuner , похоже, что highID на самом деле являются старшими 4 байтами, а lowID младшими 4 байтами, а не 8 байтами (таким образом отбрасывая средние 8 байтов persistentID ...). Вот измененная попытка:

//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);
...