iTunes持久ID - 音乐库XML版本和iTunes十六进制版本
我想从 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)