解码iTunes智能播放列表规则。将iTunes智能播放列表转换为Kodi XSP智能播放列表。

itunessmart的Python项目详细描述


iTunes智能播放列表分析器

itunessmart on PyPIPython VersionsCoverage StatusCodacy BadgeBuild Status

将智能播放列表信息转换为可读形式。

这个模块是一个python 3实现,基于banshee-itunes-import-pluginbyScott Peterson

它在windows 10、itunes 12.9.0(64位)和python 3.6上进行了测试。

它不适用于python 2.x。

KODI智能播放列表

您可以使用此交互式脚本将所有iTunes智能播放列表转换为Kodi智能播放列表:

python3 utils/export_xsp.pypython3 -m itunessmart

然后将out/中生成的.xsp文件放在userdata文件夹中。

大多数常见的功能和规则都有两种格式,而且iTunes播放列表通常可以完全转换为Kodi格式。
最大的区别是itunes中的嵌套规则,而kodi中没有这些规则。 但是,嵌套规则可以用子播放列表模拟。这些“helper”播放列表是以前缀“zzzsub”命名的,其规则是md5散列。 运行utils/export_xsp.py时,可以禁用生成子playlists。

有关Kodie Smart播放列表的详细信息:
http://kodi.wiki/view/smart_playlists#Format_of_a_smart_playlist_file

文本导出

要将所有播放列表导出到文本文件,请使用python3 utils/export.py

格式

iTunes中的智能播放列表数据保存在itunes music library.xml文件中。

XML文件中播放列表项中的数据是base64编码的二进制数据:

<dict><key>Name</key><string>Example</string><key>Playlist ID</key><integer>123456</integer><key>Playlist Persistent ID</key><string>49C97D85843B04CC</string><key>Parent Persistent ID</key><string>4DA0F774D3F70473</string><key>All Items</key><true/><key>Smart Info</key><data>
	AQEAAwAAAAIAAAAZAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAA==
	</data><key>Smart Criteria</key><data>
	U0xzdAABAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAABAAAA
	AAAAAA8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/FNMc3QAAQABAAAAAw
	AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAWAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAARAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAAAAAAAA
	AAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAEA
	AAAAAAAAEQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAQAAAAA
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAABIAAA
	AAAAAAAAAAAAAAAAABAAAAAAAAABIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA
	AAAAAAAAZAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
	AAAARAAAAAAAAABZAAAAAAAAAAAAAAAAAAAAAQAAAAAAAABZAAAAAAAAAAAAAAAAAAAAAQAAA
	AAAAAAAAAAAAAAAAAAAAAAA
	</data><key>Playlist Items</key><array><dict><key>Track ID</key><integer>123</integer></dict><dict><key>Track ID</key><integer>124</integer></dict><dict>
		...
		<dict></array></dict>

它可以转换为三种不同的输出格式:

importitunessmartinfo="AQEAAwAAAAIAAAAZ..."criteria="U0xzdAABAAEAAAAD..."parser=itunessmart.Parser(info,criteria)result=parser.resultprint(result.output)print(result.query)print(json.dumps(result.queryTree,indent=2))

文本格式:

Playsisgreaterthan15and[Playsisgreaterthan16orPlaysisgreaterthan17orPlaysisgreaterthan18]andRatingisgreaterthan4

类似sql的格式:

(Plays>15)AND((Plays>16)OR(Plays>17)OR(Plays>18))AND(Rating>4)

以及两个树结构

{"tree":{"and":[["Plays","(Plays > 15)"],{"or":[["Plays","(Plays > 16)"],["Plays","(Plays > 17)"],["Plays","(Plays > 18)"]]},["Rating","(Rating > 4)"]]},"liveupdate":true,"onlychecked":false}
{"fulltree":{"and":[{"field":"Plays","type":"int","operator":"greater than","value":15},{"or":[{"field":"Plays","type":"int","operator":"greater than","value":16},{"field":"Plays","type":"int","operator":"greater than","value":17},{"field":"Plays","type":"int","operator":"greater than","value":18}]},{"field":"Rating","type":"int","operator":"greater than","value":4}]}}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Android上已连接音频输入设备的java列表   java是创建类的新对象还是使用静态方法?   Java:Shift/Rotate对象数组   Java Casting ArrayIterator<Object>   在java中返回布尔值时出错   无法确定文本文件读入程序(java)中的各种元素   Java Swing JToolBar   JAVAlang.IllegalStateException执行Ghost4J(Linux 32对64位)   jvm如何增加ubuntu系统的java堆化?   java CORS策略“AccessControlAllowOrigin”(Anguar 8和Servlet)   使用dagger 2的java视图依赖项注入   单元测试中RxJava的java模拟活动生命周期   arraylist中的Java打印字符串   java返回值显示为0.0。为什么会这样?   java是clientserver应用程序所必需的MVC吗?   ByteToMessageDecoder类中的java内存泄漏   java将大量文档写入firestore   GWT项目中的java TomcatMaven插件。两者之间的区别是什么:org。科德豪斯。魔咒和组织。阿帕奇。公猫maven插件   java swing:向JTree项添加自定义图形按钮