最近拿python脚本与iTunes交互的次数越来越多,这里就当是自己的一个笔记吧。
Apple的Scripting Bridge真的是个很不错的东西,只要某个App支持这个技术,并且开放了对应的接口之后,不需要使用DYLD注入也可以在其他程序中实现进程间通信与控制。当然,要想实现更高级的功能,还是得靠逆向与ObjC运行时。
要在python中使用Scripting Bridge,应当先把它们import进脚本中
#!/usr/bin/python # -*- coding: utf-8 -*- from Foundation import * from ScriptingBridge import *
然后就可以通过Scripting Bridge获取到iTunes的一个实例。
iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
获取到实例之后可以干什么呢?比如我现在想导出所有专辑的封面,并以TIFF保存它们。
# 所有的封面
for track in iTunes.sources()[0].playlists()[0].tracks() :
current = track.artworks()
i = 1
for artwork in current:
data = artwork.data()
if isinstance(data, NSImage):
data.TIFFRepresentation().writeToFile_atomically_(str(i)+".tiff",True)
i+=1
又或者,我们可以输出所有还没有封面的所有专辑。
# 还没有封面的专辑名
artworks = []
for track in iTunes.sources()[0].playlists()[0].tracks() :
current = track.artworks()
if (len(current) == 0 and len(track.album()) > 0) :
if (artworks.count(track.album()) == 0) :
artworks.append(track.album())
print(track.album())
这些对象的属性以及可调用的方法都和它们在ObjC中的一样,如果不想去查ObjC的文档的话,也可以直接print dir([object])输出这个对象的相关信息。