iTunes持久ID - 音乐库XML版本和iTunes十六进制版本

0 投票
2 回答
1722 浏览
提问于 2025-04-16 21:43

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

可惜的是,ItunesMusicLibrary.xml 中的 PersistentID 字符串似乎和在iTunes中通过各种脚本接口访问到的 PersistentID 不一样。

iTunes的音乐 library.xml 包含一个64位的键,叫做 PersistentID。例如,

<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

这个在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))
1

你把这些数字当作无符号数来理解,但iTunes是用有符号数来处理的。2645110187其实和-1649857109是一样的。你可能需要这样做:

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

...或者一次性获取两个值:

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

...这样你就能得到你需要的元组:

(253104277, -1649857109)

撰写回答