Как вы могли заметить, в AIMP v5.03 для Windows и в AIMP v3.30 для Android формат XSPF стал форматом плейлистов по умолчанию. Что это за формат и зачем это было сделано?
О формате
XSPF (XML Shareable Playlist Format) это стандарт формата данных для плейлистов, основанный на XML. Формат был разработан Xiph.Org Foundation и выпущен в 2005 году. Главными особенностями формата являются: открытость, бесплатность, портативность и расширяемость.
В AIMP поддержка XSPF появилась v2.60 в 2009 году. Однако плеер научился только импортировать плейлисты этого формата — возможности экспорта не было. Поддержка экспорта появилась лишь сейчас, в v5.03, когда XSPF стал форматом плейлистов по умолчанию.
Формат по умолчанию
Экспериментируя с синхронизацией между устройствами, мы решили начать с малого — обеспечить преемственность форматов между мобильной и настольной версиями плеера.
До недавнего времени, мобильная версия использовала по умолчанию бинарный формат плейлистов (AIMPBPL), а настольная — текстовый (AIMPPL4). Обусловлено это было тем, что разбор текстового плейлиста на андроид занимал на порядок больше времени, чем бинарного. Единственным вариантом перенести плейлист с ПК на телефон было экспортировать его в формат M3U8. Однако M3U8 не поддерживал и половины возможностей, что есть в AIMP. Например, разбиение файлов с использованием CUЕ — ссылки на такие файлы просто становились некорректными.
По началу, мы рассматривали вариант научить мобильную версию работать с форматом AIMPPL4, но после первого прототипа стало понятно, что имеющихся возможностей для кросс-платформенного взаимодействия недостаточно и формат нужно расширять. Но стоит ли делать AIMPPL5, который будет поддерживать только AIMP последних версий?
Выбор пал на XSPF:
- Открытый и бесплатный
- Четкая спецификация
Спецификация четко регламентирует, как заполнять стандартные поля.
Никаких разночтений. - Кросс-платформенный
Пути к файлам записываются определенным образом, c учетом особенностей и Linux, и Windows. Поддерживаются относительные пути. - Расширяемый
В файл можно будет записать настройки форматирования, группировки и прообраза смарт-плейлиста. - Поддерживается многими плеерами
Экспортируемый плейлист можно будет открыть не только в AIMP, но и в любом другом плеере с поддержкой XSPF.
Кросс-платформенность
Плейлисты стали легкопереносимыми между мобильной и ПК версией AIMP. Не важно, сохраняли в их с абсолютными путями или относительными — главное, чтобы они переносились вместе с папкой с музыкой.
Помимо этого, теперь так же переносятся:
- Аудио-сеты, разделенные на треки с помощью файла разметки (CUE)
- Смарт-плейлисты на основе папок и плейлистов
Стоит заметить, что мобильная версия пока еще поддерживает не все настройки выборки данных, что доступны в ПК версии для смарт-плейлистов указанных типов.
Таким образом, переход на XSPF стал первым шагом к синхронизации между мобильной и ПК версией AIMP.
Производительность
В ходе полевых испытаний нашелся главный минус нового формата: разметка XML занимает много места, что негативно влияет как на размер файла, так и на скорость его чтения.
В качестве тестового образца был взят плейлист на 50 000 файлов с полностью заполненными тегами (те, что поддерживаются AIMP и пишутся в файл плейлиста):
Формат | Размер (МБ) | Время загрузки (сек) |
XSPF | 37.2 | 1.6 |
M3U8 | 6.8 | 0.4 |
AIMPPL4 | 20.7 | 0.9 |
Большая ли это плата за кросс-платформенность?
Список всех расширений AIMP для XSPF и их описание можно найти в документе AIMP Extensions for XSPF в составе SDK.
Мне кажется, что плата за кроссплатформенность небольшая. Учитывая, что сейчас редко кто задумывается об объемах пространства, занимаемых приложениями, и их аппетиты постоянно растут.
А почему не захотели расширять бинарный формат и обучить ему настольный aimp? Он, наверное, вообще молниеносно загрузился бы?
Во-первых, бинарный формат плох тем, что случись чего — вы не сможете просто открыть плейлисте в блокноте и подправить его.
Во-вторых, свой формат — это снова замыкание на себе.
Оно и xml не каждый сумеет поправить, но всё же сбои это крайне редкий случай.
С «замыканием на себе» по-моему нет ничего плохого, если это обеспечивает высокую производительность. Тем более, что экспорт в популярные форматы же никуда не пропадёт.
Не рассматривали protobuf или bson как альтернативу бинарному формату?
Пути к файлам — сможет, и этим довольно часто занимаются, на самом деле.
На их основе есть стандарты плейлистов?
Есть xspf основанный на json: https://xspf.org/jspf Ну а json же лёгким движением руки превращается в bson.
Протестируйте, возможно этот вариант окажется оптимальным?
Да, это я видел, но там именование полей остается тем же (длинные названия по сути и являются главным раздувающим фактором).
По размеру файла может там всё плюс-минус останется таким же, но вот скорость парсинга bson должна быть выше.
Согласно моим замерам, тормозит больше сравнение строк, нежели сам разбор файла. Плюс, не забывайте, что в статье я использовал довольно большой плейлист с полным объемом данных.
«Большая ли это плата за кросс-платформенность?»
По сравнению с собственным форматом разница в полтора раза должна быть ощутимой на больших объёмах. Другое дело, что нужно сравнивать заметна и неприятна ли эта разница при реальном использовании плеера, при открытии и импорте нескольких плейлистов.
Сравнивать с M3U(8) не вижу особой пользы. Стандарт файла позволяет хранить меньше данных, а использование альтернативной структуры может поломать совместимость с другими программами. При этом нужно учитывать чтение данных (тегов) из самих треков на основе плейлиста.
«XSPF стал форматом плейлистов по умолчанию»
Есть сомнения, что проверка была выполнена достаточно объективно. AIMP для Windows в своей папке продолжает хранить, а значит и использовать, плейлисты в собственном формате. Можно протестировать работу плеера с использованием другого формата внутри себя. Это позволит исключить влияние парсинга для преобразования плейлиста при открытии, что в перспективе может увеличить отзывчивость плеера.
Если будет заметная польза от такого изменения, то можно будет рассматривать иные аспекты оптимизации работы с таким форматом. В зависимости, насколько они (аспекты-алгоритмы) могут влиять на производительность с разными форматами.
Что вызывает сомнение? В своей папке плеер хранит в старом формате по двум причинам: обратная совместимость и производительность. К тому же, пользователь туда не лазит, поэтому там мы можем хранить плейлисты хоть в базе данных или в бинарном формате (как фубар делает).
Good one
Hello. AIMP is great and I use it all the time. I wanted to report some feedback on the new XSPF playlist export.
In the past when I exported to AIMPBPL, I never had any issues. Today I went to export by playlists and saw the option to export to AIMPBPL was missing, so I chose XSPF. The first playlist exported fine (I could see my music directory and chose to save it there). But when I attempted to export the second one, I could not see the music directory and the application froze. When I closed the app and reopened it, it said «Now loading {song title}» (the song I was listening to 20 minutes ago) and got stuck there. After restarting the phone I was able to export that second playlist and the other 17.
I have a Samsung Galaxy S21 running Android 13.
What app build you using now?
v3.30.1241 (21.12.2022)
Refer to the «About» dialog of the app, and check the «enable logging» option. Restart the app. Now, reproduce an issue and send the log file to me. Please, report to me a approximate time when issue was happened.
I enabled logging and restarted the app. The issue did not occur when exporting the playlists. I will leave logging on and if the issue happens again, I will send you the log file with the time that the issue happened. Thank you.
Ok, thanks