【发布时间】:2019-07-21 16:56:09
【问题描述】:
我正在努力将一小部分音乐从我的 iTunes 库导出到外部驱动器,以便与 Sonos 扬声器一起使用(通过 Sonos 上的媒体库)。一切都很顺利,直到我在曲目、专辑和艺术家姓名中发现了一些 unicode 文本。
我正在从 Mac 上的 iTunes 转移到 Linux (Ubuntu) 上的文件夹结构,文件路径都包含原始的 Unicode 名称,这些文件路径都可以在艺术家/专辑视图中的 Sonos 中正常显示和播放。唯一的问题是播放列表,我是通过一些 Python3 代码生成的。
Sonos 似乎不支持 .m3u / .m3u8 播放列表中的 UTF-8 编码。 Sonos 将字符 ÷ 解释为 ÷,经过一番谷歌搜索后,我发现显然混淆了 UTF-8 和 UTF-16(UTF-8 中的 ÷ 0xC3 0xB7,而 UTF-16 中的 à 是 U+00C3 和· 在 UTF-16 中是 U+00B7)。我尝试了许多不同的编码方式,但无法让它识别名称中包含非标准(非 ASCII?)字符的曲目。
然后我尝试了 .wpl 播放列表,并认为我已经解决了。路径中带有 ÷ 和 • 等字符的曲目现在可以完美运行,只需在播放列表文件本身中使用 unicode / UTF-8 形式的这些字符。
但是,就在我开始整理和完成代码时,我发现了一些其他字符没有被正确处理:ö、å、á 和其他几个字符。我已经尝试将它们用作它们的原始 unicode 字符,也用作它们的编码 XML 标识符,例如́ 使用这种格式并不会影响什么有效或无效 - ÷ (÷) 和 • (•) 很好,而 ö (ö), å (å)而 á (á) 不是。
我以前从未真正使用过 unicode / UTF-8,但在阅读了各种指南和操作方法后,我觉得我已经接近了,但可能只是缺少一些简单的东西。一些 unicode 字符现在可以工作,而另一些则不能,这一事实让我认为这一定很明显!我猜不同之处在于重音修饰了前一个字符,而不是本身就是一个字符,但是尝试删除前一个字母并没有用!
在 Python 本身中,我并没有做任何特别聪明的事情。我使用以下方法从 iTunes 的 XML 文件中读取数据:
with open(settings['itunes_path'], 'rb') as itunes_handle:
itunes_library = plistlib.load(itunes_handle)
对于导出,我尝试了几十种不同的选项,但通常如下所示(有时使用 encoding='utf-8' 和各种其他选项):
with open(dest_path, 'w') as playlist_file:
playlist_file.write(generated_playlist)
generated_playlist 是从 itunes_library 中提取和过滤数据的结果,在任何 iTunes XML 数据上运行 urllib.parse.unquote()。
非常感谢任何关于在哪里寻找的想法或提示!我希望对于更了解 Unicode 的人来说,答案真的很明显!谢谢!
当前版本的代码在这里可用:https://github.com/dwalker-uk/iTunesToSonos
【问题讨论】:
-
文件名编码在可移植性方面是一个有问题的话题。您是否考虑过替换所有非 ASCII 字符,例如。使用
unidecodePython 模块?我通常不建议这种方法,但是对于跨操作系统的可移植文件名,这在我看来是最不痛苦的。 -
所以我做了一个有用的额外发现......对于 é 字符,默认编码(使用
.encode('ascii', 'xmlcharrefreplace'))将其转换为é不起作用。但是,我发现如果我手动将其更改为&#0E9;(作为 é 字符的单个代码),它确实可以工作。因此,我认为关键问题是:如何让 Python 以后一种格式编码 unicode 字符?确实,这种形式甚至叫什么? -
谢谢@lenz,这是我作为备份选项的清单,但我已经玩了三个晚上了,感觉很接近修复......我想看看我能不能解决它。然后我将在 GitHub 上分享整个代码,因为我在 Sonos 论坛上看到很多人都在努力解决这个问题!
-
最后一件事称为 Unicode 规范化。有 NFD(“分解”,即基本字符加上组合变音符号)与 NFC(“组合”,单重音字符),以及旧版本 NFKD/NFKC。使用 Python 的 std-lib
unicodedata.normalize()转换为 NFC 形式,然后使用“xmlcharrefreplace”进行编码。 -
谢谢听起来是正确的事情,我会在明天晚上试一试并报告!
标签: python unicode sonos m3u wpl