Плейлисты Unicode для Sonos от Python - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю над экспортом небольшого подмножества музыки из моей библиотеки iTunes на внешний диск для использования с динамиком Sonos (через Media Library на Sonos).Все шло нормально, пока я не наткнулся на какой-то текст в Unicode в названиях треков, альбомов и исполнителей.

Я перехожу из iTunes на Mac в структуру папок в Linux (Ubuntu), и все пути к файлам содержаторигинальные имена Unicode, и они отображаются и воспроизводятся из Sonos в представлении Исполнитель / Альбом.Единственная проблема - это списки воспроизведения, которые я генерирую с помощью небольшого количества кода Python3.

Sonos не поддерживает кодировку UTF-8 в списках воспроизведения .m3u / .m3u8.Характер ÷ был интерпретирован Соносом как Ã ·, который после небольшого поиска в Google, я обнаружил, явно смешивал UTF-8 и UTF-16 (÷ 0xC3 0xB7 в UTF-8, в то время как Ã - U + 00C3 в UTF-16 и· Это U + 00B7 в UTF-16).Я пробовал много разных способов его кодирования, и просто не могу заставить его распознавать треки с нестандартными (не ASCII?) Символами в их именах.

Затем я попробовал плейлисты .wpl, идумал, что я решил это.Треки с такими символами, как ÷ и • в их пути, теперь работают отлично, просто используя эти символы в форме Unicode / UTF-8 в самом файле списка воспроизведения.

Однако, как только я начинал убирать иЗакончив код, я нашел некоторые другие символы, которые не обрабатывались правильно: ö, å, á и несколько других.Я пытался использовать их как исходные символы Юникода, но также и как их закодированный идентификатор XML, например ́ Использование этого формата не влияет на то, что работает или не работает - ÷ (÷) и • (•) все в порядке, в то время как ö (ö), å (å) и á (á) - нет.

Я никогда раньше не работал с Unicode / UTF-8, но, прочитав различные руководства и инструкции, я чувствую, что подхожу ближе, но, возможно, просто упускаю что-то простое.Тот факт, что некоторые символы Юникода работают сейчас, а другие нет, заставляет меня думать, что это должно быть что-то очевидное!Полагаю, разница в том, что акценты изменяют предыдущий символ, а не сам по себе символ, но пытались удалить предыдущую букву, и это не сработало!

В самом Python я ничего не делаюособенно умныйЯ прочитал данные из XML-файла iTunes, используя:

    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, после запуска urllib.parse.unquote() для любых данных iTunes XML.

Любые мысли или советы погде искать будет очень ценится!Я надеюсь, что для тех, кто лучше понимает Unicode, ответ будет действительно очевидным!Спасибо!

Текущая версия кода доступна здесь: https://github.com/dwalker-uk/iTunesToSonos

1 Ответ

0 голосов
/ 28 февраля 2019

Благодаря @lenz за предложения, приведенные выше, у меня теперь есть плейлисты Юникода, полностью работающие с Sonos.

Пара критических точек, которые должны спасти кого-то еще много времени:

  • Кажется, работают только плейлисты .wpl.Unicode не будет работать с плейлистами .m3u или .m3u8 на Sonos.
  • Sonos нуждается в любом тексте Unicode для нормализации в NFC-форму - я никогда не слышал об этом раньше, но по сути это означает, что любые акцентированные символы должныбыть представленным одним символом, а не обычным символом с отдельным акцентом.
  • В списке воспроизведения .pls, который является форматом XML, должны быть символы Юникода, закодированные в формате XML, то есть éпредставлен в файле .pls как é.
  • . Файл .pls также нуждается в зарезервированных символах XML (& <> '") в их экранированной форме, т.е. & равен &amp;.

В Python 3 для преобразования пути из формата iTunes XML в нечто подходящее для плейлиста .pls в Sonos требуются следующие ключевые шаги:

left = len(itunes_library['Music Folder'])
path_relative = 'Media/' + itunes_library['Tracks'][track_id]['Location'][left:]
path_unquoted = urllib.parse.unquote(path_relative)
path_norm = unicodedata.normalize('NFC', path_unquoted)
path = path_norm.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;')

playlist_wpl += '<media src="%s"/>\n' % path

with open(pl_path, 'wb') as pl_file:
    pl_file.write(playlist_wpl.encode('ascii', 'xmlcharrefreplace'))

Полная рабочая демонстрация для экспортаиз iTunes для использования в Sonos (или что-нибудь еще) в качестве .pls доступно здесь: https://github.com/dwalker-uk/iTunesToSonos

Надеюсь, что кому-то поможет!

...