itunes持久性id - 音乐库xml版本和iTunes十六进制版本

时间:2011-07-17 21:55:26

标签: python hex itunes itunes-sdk

我想从ItunesMusicLibrary.xml读取一个十六进制PersistentID字符串,得到两个代表高和低32位的整数,然后在iTunes脚本中使用这两个整数。

不幸的是,ItunesMusicLibrary.xml中的Persistent ID字符串似乎与itunes中的Persistent ID不同,可以通过各种脚本接口访问

itunes music library.xml包含64位密钥Persistent ID。例如,

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

您还可以使用Windows COM界面通过脚本获取PersistentID。例如,

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 个答案:

答案 0 :(得分:1)

您将数字解释为未签名但iTunes正在使用签名。 2645110187与-1649857109相同。你可能想要这样的东西:

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

...或者同时获取两个值:

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

...它为您提供了所需的元组:

(253104277, -1649857109)

答案 1 :(得分:0)

这适用于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))