在 Python 里使用 Scripting Bridge 与 iTunes 交互

最近拿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])输出这个对象的相关信息。

Leave a Reply

Your email address will not be published. Required fields are marked *

two × three =