itunes persistent id - версия xml музыкальной библиотеки и шестнадцатеричная версия iTunes - PullRequest
0 голосов
/ 18 июля 2011

Я хотел бы прочитать шестнадцатеричную строку PersistentID из ItunesMusicLibrary.xml, получить два целых числа, представляющих верхний и нижний 32-битный код, а затем использовать эти два целых числа в скрипте iTunes.Строка в ItunesMusicLibrary.xml не похожа на тот же Persistent ID, который есть в itunes, так как он доступен через различные интерфейсы сценариев

itunes music library.xml включает в себя 64-битный ключ, Persistent ID.Например,

<key>Persistent ID</key><string>0F1610959DA92DAB</string>.

Вы также можете получить PersistentID через скрипт, используя интерфейс Windows COM.Например,

iTunes.ITObjectPersistentIDHigh(track) -> 253104277

iTunes.ITObjectPersistentIDLow(track) -> -1649857109

Если я верну эти два числа обратно в iTunes, я получу правильный трек

iTunes.LibraryPlaylist.Tracks.ItemByPersistentID(253104277,-1649857109).Name

Моя проблема заключается в переводе шестнадцатеричной строки из библиотеки xml в высокое имладшие целые числа

Например, в python

int('0F1610959DA92DAB'[:8], 16) -> 253104277
int('0F1610959DA92DAB'[8:], 16) -> 2645110187

Первое верно, второе нет.Если я верну эти два значения обратно в iTunes, это не сработает.Используя другие треки, иногда оба числа неверны.

Есть идеи, что происходит и как это исправить?

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Вы интерпретируете числа как неподписанные, но iTunes использует подписанные.2645110187 совпадает с -1649857109.Вы можете захотеть что-то вроде этого:

struct.unpack('!i', binascii.a2b_hex('0F1610959DA92DAB'[8:]))[0]

... или получить оба значения за один раз:

struct.unpack('!ii', binascii.a2b_hex('0F1610959DA92DAB'))

..., что даст вам нужный кортеж:

(253104277, -1649857109)
0 голосов
/ 18 июля 2011

Это работает в 3.2, но должен быть более простой способ

pID = '0F1610959DA92DAB'
b = bytes(pID, 'utf-8')
blo = b[8:]
b2a = binascii.a2b_hex(blo)
print(int.from_bytes(b2a, byteorder='big', signed=True))
bhi = b[:8]
b2a = binascii.a2b_hex(bhi)
print(int.from_bytes(b2a, byteorder='big', signed=True))
...