0

Apple music для Windows 10

Программное обеспечение Apple в течение многих лет было доступно на платформе Windows, включая iTunes, поддержка которого на Mac была прекращена, но он по-прежнему является основным клиентом музыкального сервиса Apple Music для операционной системы Microsoft. Тем не менее стало известно, что в текущем году Apple выпустит новое приложение для Windows 10.

Согласно информации, опубликованной итальянским сайтом Aggiornamenti Lumia, компания готовит к запуску приложение в магазине Microsoft Store. Пока неясно, о каком приложении идёт речь, но нетрудно представить, что это может быть Windows-клиент для стримингового сервиса, например, Apple Music или Apple TV+. В прошлом году Apple нанимала разработчиков для «создания мультимедийных приложений следующего поколения для платформы Windows». Компания прямо указала, что вакансии требует опыта работы с универсальной платформой Windows (UWP), которая является базовой для приложений Windows 10.

iTunes доступен в Microsoft Store с 2018 года, но это всё же классическая программа для компьютеров, а не UWP-приложение. Поскольку на Mac теперь есть отдельное приложение для Apple Music, то же самое скоро может появиться и для Windows 10. Apple TV+ на текущий момент доступен на Smart TV и многих ТВ-приставках, так что наверняка следующей платформой станет Windows.

Приложения UWP могут работать как на ПК с Windows, так и на консоли Xbox One, которая многими пользователями используется как мультимедийный центр. Поэтому появление приложений Apple Music и Apple TV+ будет иметь решающее значение в расширении этих сервисов.

Пожалуй, самым популярным медиаплеером для OS X, по-прежнему остается iTunes, но в силу различных причин, многие пользователи все же ищут альтернативы. Спрос, как известно, порождает предложение и мы видим большое количество приложений, позиционирующихся как замену или альтернативу родному плееру от Apple. Как разобраться в этом пестром многообразии и выбрать тот проигрыватель, который лучше подойдет под ваши нужды – я расскажу вам в этой статье.

* * *

Ecoute

Ecoute является полноценным приложением, но по сути работает как плагин для iTunes. Однако же, запуск iTunes не требуется, поскольку Ecoute использует только медиатеку, делая при этом управление воспроизведением музыки и другие взаимодействия с файлами, на порядок проще. Ecoute поддерживает все типы медиафайлов и кроме музыки, умеет воспроизводить видео и подкасты. Также Ecoute хорош тем, что подхватывает из медиатеки iTunes метаданные и поддерживает Last.fm, а также соцсети Twitter и Facebook (для шэринга прослушанных треков). Отдельно стоит отметить, очень чистый и минималистичный дизайн приложения – ценителям простоты это должно понравиться.

Загрузить Ecoute

Decibel

Decibel имеет очень схожий с iTunes интерфейс, но отличается поддержкой большего количества форматов, в том числе и lossless (FLAC, Wavpack, Ogg Vorbis и другие). Для любителей «покрутить ручки» Decibel предоставляет множество настроек и регулировок: частоту дискретизации, устройства вывода и другие фишки, которые помогут вам свести к минимуму любые ухудшения качества звука. Decibel имеет простой интерфейс, обеспечивающий удобную навигацию по всем элементам управления и понятный даже новичкам.

Загрузить Decibel

Play

Play относится к приложениям ориентированным на пользователей, которые не любят копаться в настройках и которых мало интересует внешний вид и дизайн — для них важно, чтобы приложение просто выполняло свои функции. Play выглядит очень простовато и неказисто, но это одновременно является и плюсом — просто добавляем наши файлы и слушаем музыку. Ничего лишнего. Play разработан той же компанией, что и Decibel, отсюда и визуальное сходство и широкая поддержка аудиоформатов.

Приложение поддерживает функцию выранивания громкости, которая позволит вам не беспокоиться о уровне громкости при проигрывании «разношерстных» плейлистов. Также Play умеет редактировать метаданные файлов, причем делает это сразу для нескольких файлов (используя базу MusicBrainz). Не забыли разработчики и о интеграции с Last.fm — она здесь присутствует, кроме того можно вступить в специальное сообщество Play на Last.fm и получать рекомендации от других пользователей.

Загрузить Play

Vox (обзор)

Как и Decibel, Vox поддерживает кучу аудиоформатов, включая lossless. Приложение имеет приятный чистый интерфейс в темных тонах, с удобным расположением элементов управления, как в оконном режиме, так и в режиме мини-плеера. Встроенный эквалайзер позволяет качественно настроить звук на выходе и даже конвертировать ваши треки в форматы 5.1 и 7.1. Кроме того, Vox умеет работать с Last.fm и поддерживает AirPlay для беспроводного воспроизведения музыки. Если в вашей медиатеке есть пробелы, с Vox легко будет их заполнить, используя базу MusicBrainz.

Если вы предпочитаете современный дизайн и функциональность, неказистой простоте Vox — это ваш выбор.

Загрузить QR-Code Разработчик: Coppertino Inc. Цена: Бесплатно

Tomahawk

Это приложение, в отличие от остальных отличается кроссплатформенностью и кроме OS X, работает также на WIndows и Linux. После установки приложение просканирует и импортирует всю вашу музыку, что позволяет вам сразу же начать прослушивание. Добавление новых треков выполняется простым перетаскиванием в медиатеку Tomahawk или сканированием дисков по расписанию.

Одной из ключевых функций Tomahawk является поддержка множества потоковых сервисов вещания, вроде Last.fm, Grooveshark, Spotify или Rdio. Еще одной отличительной чертой Tomahawk являются, так называемые, рекомендации, которые будут основываться на ваших поисковых запросах и проигрываемых плейлистах.

Если вы хотите собрать все свои музыкальные сервисы и потоки в одном удобном приложении — попробуйте Tomahawk.

Загрузить Tomahawk

Winamp

Ну и под занавес, я не конечно не мог не упомянуть о Winamp — этом народном PC-проигрывателе, который можно сравнить разве что с iTunes на Mac (если не принимать во внимание различие в «весовых категориях»). Относительно недавно, появилась версия Winamp’а для OS X, которая может быть очень полезная свитчерам, не желающим мириться с iTunes. Приложение поддерживает практически все популярные форматы аудиофайлов и умеет воспрозводить вашу музыку с CD (а также импортировать ее). После установки Winamp просканирует ваш диск и рассортирует все найденные файлы (отдельно видео и музыка). Также, к плюсам Winamp можно отнести невероятное количество различных плагинов и скинов, которые могут изменить функциональность и внешний вид приложения до неузнаваемости.

Имея большое сообщество пользователей и постоянные обновления, Winamp остается достаточно популярным медиаплеером, который является хорошей альтернативой iTunes.

Загрузить Winamp

* * *

Популярный потоковый сервис Apple Music работает не только на iPhone и iPad. Слушать музыку можно и на часах Apple Watch, приставке Apple TV, а также компьютерах под управлением macOS и Windows. В этом материале мы расскажем о двух официальных способах, позволяющих пользоваться подпиской Apple Music на компьютере.

ПО ТЕМЕ: Как слушать Apple Music с вечной скидкой: 2 способа, о которых вы могли не знать.

Как слушать Apple Music на компьютере Windows или Mac в браузере

Начиная с осени 2019 года Apple предлагает полноценную веб-версию своего музыкального сервиса Music. Для того чтобы воспользоваться сервисом:

1. Откройте любой браузер на компьютере и перейдите по адресу beta.music.apple.com (альтернативным проигрывателем Apple Music в браузере может стать сторонний сервис musi.sh)

2. Нажмите кнопку «Войти» в правом верхнем углу и введите данные от своего Apple ID. Или нажмите кнопку Пробная подписка, если вы не пользовались сервисом ранее.

3. После этого в течение нескольких секунд пользователь получает доступ к своей музыкальной медиатеке iCloud, в том числе к плейлистам Apple Music, рекомендациям и т.д.

По сути, веб-интерфейс практически идентичен десктопной версии приложения Музыка в macOS (iTunes в Windows). В веб-интерфейсе также доступна история прослушивания музыки, отображаются недавно добавленные песни. Есть возможность добавить трек в Воспроизвести далее, искать музыку по исполнителям, альбомам, песням и плейлистам.

Веб-версия Apple Music в Safari на Mac поддерживает темную тему на уровне системы.

ПО ТЕМЕ: 7 бесплатных плееров Apple Music и программ для Mac (macOS), которые могут сделать прослушивание музыки более удобным.

Как слушать Apple Music на компьютере Windows или Mac, используя программу iTunes

Единственным официальным способом прослушивания  Music на компьютерах под управлением Windows и macOS, предусмотренным Apple, является использование программы iTunes.

1. Скачайте и установите последнюю версию программы iTunes для Windows на этой странице.

iTunes для Mac предустановлен по умолчанию.

2. Запустите iTunes.

3. На Windows нажмите на значок «Учетная запись» и введите данные Apple ID, на который оформлена подписка Apple Music. На Mac перейдите в меню «Учетная запись».

4. Нажмите «Войти».

5. Для загрузки собственных плейлистов, созданных, например, на iPhone, перейдите в Настройки iTunes → раздел «Основные» и установите галочку напротив пункта «Медиатека iCloud».

Включить Медиатеку iCloud можно также из вкладки «Для Вас» в iTunes.

После этого в течение нескольких секунд в приложение будут загружены данные медиатеки iCloud, в том числе к плейлисты Apple Music, рекомендации и т.д.

Видео по теме:

Хотите слушать свою музыку через популярный стриминговый сервис Apple Music с ещё большим комфортом? Присмотритесь к этим небольшим, но очень полезным программам из нашей подборки!

ПО ТЕМЕ: Как создать собственные «горячие» клавиши для любой программы в macOS.

SpotMenu – мини-плеер в строке меню macOS

SpotMenu создает в строке меню мини-плеер. Нажмите на соответствующую иконку – и получите быстрый доступ к командам вроде паузы, воспроизведения и перехода к следующему треку в iTunes (Apple Music).

Кроме того, SpotMenu выводит обложку альбома и миниатюрный прогресс-бар (для моментальной навигации по треку).

Интерфейс приложения настраивается – вы легко можете отключать отдельные элементы, например, название трека в строке меню и т.п.

ПО ТЕМЕ: Mac для чайников: 30 полезных советов по macOS для новичков.

Silicio – продвинутый мини-плеер в строке меню macOS

Еще один мини-плеер для удобного управления вашей фонотекой Apple Music. Правда, реализован он чуть иначе – вместо значка в строке меню разработчики Silicio выбрали всплывающее окно с минималистичным дизайном в духе все того же SpotMenu.

Кроме стандартных функций для управления музыкой (пауза, воспроизведение, следующая песня) Silicio выводит на экран название композиции, исполнителя и обложку альбома. Есть и множество настроек для персонализации.

Размер всплывающего окна можно менять; также предлагается работать с ним при помощи шорткатов (к слову, при желании настраиваемых и «под себя»).

Наконец, у Silicio есть и интеграция с Last.fm. Она пригодится, если вы создаете личную фонотеку на основе уже прослушанных треков.

ПО ТЕМЕ: Как открывать видео на Mac (macOS) в стороннем плеере (например, VLC) по умолчанию.

Mac Media Key Forwarder – правильная работа медиа клавиш на клавиатуре macOS

Медиа-клавиши на компьютерах Mac имеют дурную славу – они вечно отказываются работать! Да так, что приходится перезапускать музыкальный плеер, а то и весь Mac.

Есть и другой популярный пример из жизни: вы слушаете музыку в iTunes и в это время просматриваете бразуер в котором, скажем, размещен интересный ролик из YouTube. Вы запускаете ролик, и интуитивно нажимаете кнопку Пауза на медиа клавишах клавиатуры чтобы отключить музыку, которая играет из iTunes (она мешает смотреть ролик). Но не тут-то было. Медиа кнопки теперь работают с YouTube! Паника!

Дело в том, что начиная с macOS High Sierra Apple внедрила механизм, при котором медиа клавиши клавиатуры работают только с активным источником (в данном случае медиа клавиши переключатся на ролик, находящийся на странице браузера и не будут работать с iTunes).

К счастью, у этой проблемы есть решение – утилита Mac Media Key Forwarder, являющаяся по своей сути аналогом приложения BeardedSpice, о котором мы рассказывали .

Что делает приложение Mac Media Key Forwarder? Просто «заставляет» медиа-клавиши всегда работать именно с Apple Music (iTunes).

После установки Mac Media Key Forwarder располагается в строке меню.

ПО ТЕМЕ: Как автоматически переключать язык (раскладку) на клавиатуре в macOS или Windows.

Denied – создание удобных правил воспроизведения музыки

А эта программка умеет интересную штуку – она создает и реализовывает запрещающие «правила» для Apple Music!

Как это работает? Например, вы не любите творчество Ace of Base. Создаете соответствующее правило – и Denied не дает Apple Music воспроизводить соответствующий контент. Такие же правила можно создавать для альбомов и отдельных треков.

Но это еще не всё! Denied умеет отключать треки, которые вы уже слушали в течение последних нескольких часов. Также есть возможность выставить полный запрет на воспроизведение музыки с нецензурной лексикой.

ПО ТЕМЕ: Как изменить иконку приложения, папки или файла на Mac (macOS).

Musixmatch – караоке на Mac

Каждый из нас хотя бы раз в жизни искал в Google или Яндексе слова вот этой классной песни, которая звучала только что. Musixmatch избавит вас от таких «заморочек» – это бесплатное приложение автоматически подгружает из Сети слова песни из Apple Music.

И всё это – как в караоке, т.е. строчки с текстом сменяются синхронно со звуком!

Разумеется, при желании можно сразу же посмотреть и все слова вашего трека.

ПО ТЕМЕ: Как конвертировать фото в форматы jpg, png, gif, tiff, bmp на Mac.

БОНУС 1 – Muzie

Muzie предлагает вам собрать все аккаунты в популярных музыкальных сервисах (за исключением Apple Music, к сожалению) в одном месте. Как им это удается? Ничего сверхъестественного – здесь используется веб-оболочка. Также стоит отметить ряд небольших, но полезных опций – например, возможность быстро приглушить звук и адаптивный дизайн.

ПО ТЕМЕ: Как удалять файлы на macOS мимо корзины.

БОНУС 1 – Alfred Workflows

Spotlight, системный поисковик macOS, по-прежнему не умеет использовать информацию из сторонних приложений. Для нас это означает, что при поиске песен или плейлистов придется воспользоваться услугами самой программы, а не Spotlight.

Но у этой проблемы есть решение – приложение Alfred (обзор)! Это своеобразный «Spotlight на стероидах»: у него есть и эффективность «яблочного» системного поиска, и возможность добавлять рабочие процессы от сторонних сервисов. В частности, а «Альфреда» есть расширения и для Apple Music, так что искать песни и плейлисты напрямую через него не составит труда.

Через поисковую строку Alfred также можно выполнять и команды вроде play / pause.

У Alfred есть пробная версия, но за премиальный пакет Powerpack придется заплатить $31.

Вводные слова

Как бы ни ругали Apple за закрытость платформы и самой экосистемы, некоторые их решения являются исключением. На рынке много стриминговых сервисов, но предоставляющих полноценный SDK для стриминга в сторонних продуктах крайне мало, для российского рынка список официально доступных SDK ограничивается Deezer и Apple Music. Конечно, когда на наш рынок придёт Spotify, на один доступный SDK станет больше, но пока есть два игрока и только один из них имеет широкую пользовательскую базу.

Так получилось, что я имел опыт работы с Deezer SDK под Android и прямо сейчас активно работаю с SDK Apple Music (MusicKit) под iOS. И главное отличие от опыта с Deezer состоит в том, что MusicKit — это верхушка айсберга, она же публично доступный API. В отличие от Deezer, где повторить большую часть функциональности официального приложения — это просто длительный процесс, повторить функциональность даже веб-страницы Apple Music, используя только публичный API, невозможно. Даже если Apple использует MusicKit в своих решениях, то кроме него она использует ещё массу недокументированных API запросов и приватных API, которые простым смертным использовать запрещено.

В статье я расскажу про работу с MusicKit с точки зрения разработчика в контексте реализации достаточно «простых задач»: поискать в каталоге, показать картинки в результатах поиска, получить песни, рекомендации и даже проиграть какую-то музыку. Забегая вперёд скажу, что многое из рассказанного будет справедливо и для работы с Apple Music в Android и Javascript.

Если понадобится, готов дать детальные ответы с кодом на вопросы в комментариях.

Отделим мух от котлет

При работе с MusicKit под iOS придётся взаимодействовать со следующими сущностями:

  • StoreKit для авторизации в Apple Music и предложения подписки на сервис (реферальной, если получится подписаться на Affiliate программу)
  • HTTP API для поиска и получения различной информации из каталога
  • iTunes Search API для поиска в каталоге iTunes (очень полезная альтернатива HTTP API). Apple обозначает лимит на максимум 20 запросов в минуту, этого чаще всего достаточно при осуществлении запросов с устройств пользователей
  • Media Player для проигрывания и управления очередью

Так же при подключении к Affiliate программе можно запросить доступ к дампу метаданных Enterprise Partner Feed, который Apple советует использовать вместо частых запросов к iTunes Search API.

И, на всякий случай, Music.app — это приложение «Музыка» на iOS устройствах, которое является официальным плеером Apple Music.

Источники сведений, в порядке убывания их полезности:

  • Официальная документация
  • Поиск по всей документации Apple
  • Метод научного эксперимента 1 с HTTP API
  • Developer Console в любимом браузере, натравленная на веб-страницу интересующей сущности в Apple Music
  • Форумы разработчиков на сайте Apple
  • StackOverflow

Поиск. Картинки

Самым очевидным способом проверить можно ли что-то сделать в своём приложении является факт того, что что-то подобное имеется в официальном приложении. Вот возьмём, например, поиск. Ищем группу «The Police» и имеем в выдаче Music.app фотографию группы с улыбающимся Стингом:

Прекрасно, воспользуемся API поиска. В выдаче имеем ключ artwork с вложенной ссылкой url для всего, кроме артистов. Странно. Проверяем ещё раз, в Music.app всё есть. Более того, в веб-интерфейсе фотография тоже есть, а ссылка на веб-страницу имеется в json-выдаче API поиска.

iTunes Search API картинку так же не отдаёт, но так же включает в выдачу адрес веб-странице по ключу artistLinkUrl.

Ну что поделать, придётся скачивать web-страницу и доставать из неё адрес картинки, благо разработчики позаботились и прописали адрес картинки в мета-информацию:

<meta property=»og:image» content=»https://is5-ssl.mzstatic.com/image/thumb/Features113/v4/bb/a2/66/bba266dd-570b-bff7-d7c6-777982582964/mzl.tdrwskof.jpg/1200x630cw.png» id=»ember52310559″ class=»ember-view»>

Формально говоря, мы уже нарушили правила Apple, которые запрещают «scraping» их веб-страниц. Фактически, так делают все сторонние приложения за исключением тех, что ищут картинки с использованием сторонних сервисов.

Есть и ещё один минус: мы запрашиваем страницу размером в несколько сотен килобайт. Для приложения и без того гоняющего большие объёмы данных (проигрывающего музыку), терпимо (особенно при учёте, что данные передаются в сжатом виде), но в общем случае не очень.

Размеры картинок можно подгонять под свои нужды: в url имеются шаблоны для замены ({w}, {h}), а на веб-странице ссылка на картинку имеет тот же формат, так что сложностей получить картинку нужного размера нет. Если хочется получить закруглённую картинку, то нужно добавить cw перед расширением.

Бонус про картинки для отображения в плеере

Во время проигрывания плеер из Media Player оперирует конструкцией MPMediaItem, которая, в частности, предоставляет объект Artwork. Очень удобно для отображения картинки трека в плеере. Проблема лишь в том, что на практике данный объект, как его ни крути, не даёт картинки для «стримящейся» музыки (а это любая музыка из Apple Music), поэтому приходится «матчить» проигрываемый MPMediaItem c песнями, которые добавлялись в очередь и скачивать изображение аналогично альбомам.

Поиск по жанрам

В iTunes и приложении Apple Music имеются списки жанров и топы песен в оных. Найти жанр не должно составить труда, ведь мы можем искать по всему чему угодно?

Это далеко не так. API не даёт искать по жанрам и не даёт списка жанров. Есть возможность запросить информацию (из полезного — название) жанра по его идентификатору,
но большая часть сведений в API содержит как раз имя жанра, а не идентификатор.

Благо для iTunes предоставляется выгрузка всех жанров (совсем всех, включая «жанры» мобильных приложений). Идентификаторы жанров (как и прочие идентификаторы из iTunes) полностью соответствуют идентификаторам в Apple Music. Выгрузка доступна для всех регионов (регион указывается в ключе cc, а не storefront как в Apple Music API), но фактически отличаются лишь названия (они переведены). Структура жанров иерархична и имеются повторения названий жанров.

В общем, поиск по жанрам необходимо делать локально, причём учитывать, что «фанк джаз», «джаз-фанк» и «jazz funk» — это одно и тоже. Не сложно, но и не так просто, как попросить API поиска искать по жанрам.

Найдя жанр, можно запросить чарт (список самых популярных песен) для данного жанра. Для редких жанров вполне можно получить в выдаче всего 3 песни.

Забавный факт: для некоторых альбомов и артистов (Ed Sheeran из известных) в качестве одного из жанров указывается просто верхнеуровневый жанр «Музыка». Если хочется делать рекомендации на базе жанров, то данный жанр стоит игнорировать.

Песни артистов

Когда приложению необходимо проиграть песни артиста (музыкальной группы) чаще всего это означает, что необходимо проиграть популярные песни данной группы. Apple Music даёт возможность запросить песни как связь типа «songs» 2 для артиста. На выходе имеем максимум 20 песен 3, явно отсортированных по популярности.

Иногда всё же хочется получить чуть больше композиций. С очень популярными группами пройдёт вариант получения плейлистов, типа «: главное» (» Essentials») и «: в деталях» («: Next Steps»), но в общем случае такой вариант не подходит. Другой вариант: взять 20 популярных песен, а остальное добить из альбомов, благо Apple Music даёт возможность получить сразу все альбомы артиста (связи типа albums) и все песни в них (include=»tracks») за один запрос.

Но если получить все песни артиста, то возникает другая проблема: необходимо из всех этих песен отобрать популярные. К сожалению, API информации о популярности не предоставляет 4. Брать случайные песни из всего списка можно, но на практике такой подход приводит к частому проигрыванию совсем неинтересных записей (проходных лайвов, записей репетиций, скитов и прочего), что особо заметно на очень популярных группах 5.

Попробуем получить популярные песни другим образом. Ещё до появления MusicKit компания Apple начала предоставлять API поиска в iTunes Store. Как уже говорилось, каталог в Apple Music и iTunes Store одинаков 6 и, соответственно, идентификаторы песен тоже одинаковы. Данный API возвращает по умолчанию 50 песен, но допустимо запросить до 200 песен. Результаты в выдаче так же отсортированы по популярности.

Интересно, что сама компания Apple не использует ни один из этих вариантов в собственном веб-интерфейсе. Они используют недокументированный (читай, приватный) API 7, в выдаче которого есть всё то, чего не хватает, включая идентификатор (а не только название) жанра и индекс популярности. Использовать данный API на практике я не решился 8, поскольку идентификаторы жанров можно получить обратным поиском по именам жанров 9, а численный индекс популярности не так уж и важен, когда получаешь отсортированный по популярности список композиций.

Забавный факт, который я называю «проблемой Хью Лори» заключается в том, что в каталоге Apple Music имеется масса немузыкального контента. В частности, различные компиляции из комедийных шоу и стэндапы. Это с одной стороны прекрасно (мы платили за музыку, а получили ещё и смешные диалоги со Стивеном Фраем, которые можно послушать перед сном), а с другой приводит к прослушиванию какой-то болтовни, когда просил включить музыку. Соответственно, когда контекст работы приложения прямо говорит о том, что пользователь хочет слушать музыку, приходится самостоятельно убирать из полученного списка «песен» те, чьи жанры обозначены как «spoken word» и «comedy».

Рекомендации

Проигрывание рекомендаций (они же «похожие песни», «радиостанции», «вам понравится» и т.д.) стало базовой функциональностью стриминговых плееров. Условно рекомендации можно разделить на два вида 10: для пользователя (на базе истории прослушивания, покупок и лайков) и для музыкального объекта (артиста, трека, реже альбома и плейлиста).

С предпочтениями пользователя в Apple Music формально 11 всё в порядке: можно запросить список персональных рекомендаций, в который включаются «персональные миксы» (плейлисты) и рекомендуемые альбомы. Из альбомов список песен можно получить, используя API запроса треков (связь tracks), для плейлистов аналогично. Следует учитывать, что треки могут включать не только песни (type = «songs»), но и видео-клипы, потому дополнительная фильтрация полученных данных не повредит.

С другими же рекомендациями всё чуть сложнее. Если посмотреть в Music.app, то там отображаются «похожие артисты» и можно включить «радиостанцию» для данного артиста. Последняя проигрывает микс из артиста и рекомендаций к нему.

Кажется, всё просто: наверняка для артистов есть связь «похожие артисты». Спешу расстроить, такой связи нет. В схеме данных Enterprise Partner Feed сведения о похожести так же отсутствуют.

Хорошо, значит мы можем запросить «радиостанцию» для артиста и получить список песен? И снова нет, радиостанцию запросить мы действительно можем, её идентификатор находится в выдаче связей артиста. Но в сведениях о станции нет сведений о проигрываемых песнях, альбомах или артистах, есть только служебный объект с информацией для проигрывания playParams. Идея с playParams простая: скармливаем данный словарь 12 в очередь проигрывания и слушаем.

Это всё хорошо, если хочется играть только радиостанцию (как делает Music.app), но что если хочется смешать песни из радиостанции 13 с чем-то ещё? Очевидно, мы каким-то образом должны получить список похожих артистов.

В Media Player важную роль играют очереди проигрывания, в частности MPMusicPlayerControllerMutableQueue. Очередь позволяет: вставить дескрипторы после определённого проигрываемого объекта, удалить указанные объекты, а так же получить список всеъ объектов в очереди. При запросе объектов на выходе мы должны получить массив из MPMediaItem. А MPMediaItem, в частности включает идентификатор песни. Вот есть только одна проблема: конструкторы очередей не являются публичным API, переведу: Media Player может дать готовую очередь (иногда редактируемую), а самому создать её невозможно 14.

Хорошо, немного копнуть в сторону костылестроения может быть полезно. Если Media Player может дать мне изменяемую очередь, то её нужно взять. Для этого придётся работать с текущим (синглтон) плеером, так что действовать нужно быстро, иначе пользователю может проиграться что-то не то, а плеер успеет ещё и предзагрузить ненужные пока песни. Изменяем текущую очередь проигрывания (добавляем дескриптор станции), смотрим что получилось, откатываем измения в очереди новой транзакцией (удаляем то, что фактически добавилось в очередь).

К сожалению обнаруживаем добавление только двух объектов MPMediaItem в очередь. Оба выглядят как песни (есть имя артиста, название трека, длина трека), но не включают идентификатор песни. Если посмотреть в Music.app, то обнаружим, что там всё сходится: включив радиостанцию будет проигрываться песня, а в очереди будет только одна песня к проигрыванию. При переходе к следующей песне очередь обновляется.

Дальше пытаться строить костыли с радиостанциями смысла нет, приходится использовать другие варианты.

Вспомним, что, в Music.app и веб-интерфейсе отображаются похожие артисты. Похожие артисты доступны только для самых популярных групп 15. Опять приходится прибегать к запрещённому приёму парсинга веб-страницы. Из плюсов: мы уже скачиваем веб-страницу для получения картинки, значит мы можем получить из неё сразу и похожих артистов.

а потом по этим идентификаторам получаем данные артистов из того же json ( с типом lockup/artist):

Имея идентификаторы артистов мы можем запросить их треки. API позволяет запросить несколько артистов по их идентификаторам за один запрос с включёнными связями. Увы, на практике API возвращает ошибку, сообщающую о невозможности добавления списка треков к результату. Так можно делать только при запросе артистов по одному или при прямом запросе песен для отдельно взятого артиста. В этом случае можно воспользоваться уже упомянутым iTunes Search API, который отдаст чуть больше полезной информации.

Списки «похожих артистов» в Apple Music достаточно хороши, однако на практике часто оказываются пустыми. В ситуации пустого списка рекомендаций приходится использовать сторонние сервисы. Классика — Last.fm, чуть изощерённее — Spotify. Результаты обоих нужно матчить с объектами в каталоге Apple Music. Решение «в лоб» заключается в поиске каждого артиста по имени с получением ровно одного результата с последующим получением песен как описано выше. Решения чуть интереснее, но накладнее состоят в использовании musicbrainz для матчинга. Musicbrainz предоставляет информацию о идентификаторах 16 в других сервисах, т.е. можно связать идентификатор в Spotify с идентификатором в Apple Music. В ситуации с Last.fm всё ещё лучше: Last.fm возвращает в списке рекомендаций идентификаторы из musicbrainz. Накладность заключается в лимитах на использование musicbrainz, при большом трафике придётся поднимать собственный клон musicbrainz (благо, это возможно) или разрабатывать собственный API вокруг базы данных, дампы которой можно спокойно скачать.

Для новых групп даже Last.fm не даст рекомендаций, запасным вариантом будут «жанровые» рекомендации. Берём жанры артиста (на базе названия получаем идентификаторы из уже загруженного списка всех жанров), получаем для каждого жанра по чарту, смешиваем полученные песни. Это лучше, чем ничего.

Две вещи неразлучные: плеер и очередь

За проигрывание в iOS из Apple Music отвечает Media Player, он позволяет работать с музыкой из Apple Music и персональным каталогом пользователя 17. Фреймворк высокоуровневый и в ситуации работы со стриминговым контентом спуститься на уровень ниже 18 не получится.

Фреймворк предоставляет два плеера с общим программным интерфейсом: один играет музыку непосредственно в приложении Music.app, а другой работает более-менее независимо. Использовать первый для чего-то серьёзного бессмысленно 19. А документация нагло лжёт 20, что второй плеер не работает в фоновом режиме

С архитектурной стороны работать с этим делом просто: говорим плееру что играть (например, заполняя очередь, на основе массива идентификаторов песен) и управляем проигрыванием (играть, пауза, следующий, предыдущий).

Прямого управления очередью проигрывания нет, нужно выполнять транзакционное изменение, которое занимает время. При этом достаточно часто обработчик completionHandler вызывается с ошибкой-таймаутом, которая переводится как «я не знаю смог ли я что-то сделать или делаю я ли ещё что-то, но мне надоело самого себя ждать». Чаще всего транзакция проходит нормально, а ошибки, приходящие в обработчик приходится игнорировать. Часть изменений можно вносить и чуть более высокоуровнего, однако если уже пришлось использовать транзакционные изменения, то лучше использовать их для всего.

Вообще очереди достаточно гибкие и, если нет вероятности, что ваше приложение будет когда-то работать и с другими стриминговыми сервисами 21, то с очередями можно делать много интересного, в частности указывать в какое время какой элемент начинает играть и как долго.

Из других «минусов» такого высокоуровнего подхода стоит отметить невозможность обработки действий пользователя. Нажатие пользователя на гарнитуре кнопки «следующий трек» не приведёт к запросу программы «что мне делать», плеер лучше знает что делать и сам переключит песню. Так что можно только отлавливать фактически свершившиеся изменения в состоянии плеера и принимать какие-то решения постфактум.

С другой стороны, много всего делать не нужно: информация о проигрывании на экране блокировки просто есть и все кнопки в ней работают, Apple Watch и Siri умеют управлять проигрыванием, а стриминг через AirPlay на Apple TV работает из коробки 22.

Повторить функциональность и интерфейс очереди Music.app в своём приложении возможно, но кажущаяся простота drag’n’drop-а элементов очереди на деле оказывается жонглированием транзакциями изменения очереди и синхронизацией желаемой очереди и реальной очереди 23 плеера.

Пара слов про SDK для других платформ

Фактически, работа с API ничем не отличается на других платформах, а вот SDK сделаны не совсем под копирку с iOS и, местами, более удобны 24, хотя общая идея тандема очереди и плеера сохраняется.

Так, под Android можно получить актуальную очередь и двигать элементы очереди без ухищрений с транзакционным изменением оной (удаления из очереди и добавления в нужное место, скрестив пальцы).

MusicKit JS же предоставляет специальные методы-обёртки для работы с API Apple Music,
но при использовании обёрток без чтения документации по самому API не обойтись. Работа с очередью и плеером не удобнее iOS SDK, но с небольшими надстройками может стать терпимой .

Пара слов о симуляторе

Работать в симуляторе с MusicKit можно только в разрезе общения с HTTP API, но даже в этом случае придётся стабить токен пользователя для проведения запросов, а не получать его через StoreKit. Проигрывать музыку из Apple Music в симуляторе вовсе невозможно, ибо отсутствует приложение Music.app.

На деле приходится разрабатывать собственные надстройки над SDK и при запуске в симуляторе использовать альтернативные (mock) реализации. Фактически, при разработке симулятор оказывается полезен только для работы над пользовательским интерфейсом. Собственная абстракция будет полезна и при автоматизированном создании скриншотов для приложения (да и вообще при создании скриншотов с помощью симулятора), поскольку иметь в арсенале оба поколения «больших» iPad Pro только для того, чтобы сделать на обоих скриншоты своего плеера, крайне накладно и глупо.

В качестве интересного, но не очень полезного, эксперимента можно сделать альтернативную реализацию собственного высокоуровневого плеера на базе MusicKit JS.

Про Enterprise Partner Feed

С одной стороны Apple предоставляет по запросу дамп метаданных и говорит использовать его, дабы снизить нагрузку на API и получить сведения, которых в API нет. С другой стороны, мы имеем явную проблему курицы и яйца: доступ к Affiliate программе предоставляется при указании ссылки на приложение. Достаточно сложно разрабатывать приложение, используя данные, которые можно получить, только имея опубликованное в App Store приложение.

И, конечно, данные не дают первому встречному. Каждое заявление проверяют в течение пяти рабочих дней. На момент написания данной статьи получить дамп метаданных в свои руки мне так и не удалось. Apple завернуло моё заявление, не указав точных причин. Скорее всего, на промо-сайте приложения они увидели словосочетание «Apple Music» без упоминания о том, что я к Apple не имею отношения. Или они где-то увидели, что я использую сведения с веб-страниц, хотя при проверке приложения это проблем не вызывало. Конечно, попытки мои не закончились и сама Apple поощряет повторную подачу заявления, но факт в том, что дампа на руках нет.

Можно пофантазировать и даже сделать тестовую базу, поскольку секрета из схемы данных никто не делает, однако само наличие дампа на руках жизнь не упростит. Разрабатывать свой бэкенд и отправлять все запросы из приложения к нему вместо Apple Music не только затратно (как с точки зрения времени на разработку, так и на финансирование инфраструктуры серверной части), но и имеет скрытые проблемы. Так, фид обновляется раз в неделю, а новая музыка в Apple Music появляется ежедневно. Как участнику одного из музыкальных коллективов мне бы хотелось, чтобы свежий релиз появился сразу везде, а не только в официальных приложениях.

Вообще использование Enterprise Partner Feed видится полезным в следующих случаях:

  • большое количество активных пользователей и проявление ограничений со стороны Apple Music API или iTunes Search API
  • необходимо обработать большой объём данных («пережувать данные»), чтобы предоставить какую-то интересную функциональность
  • есть много денег и много свободного времени

Очевидные советы

Приведу несколько банальных советов, которые кому-то могут пригодиться:

  1. Кешируйте по максимуму. Жанры можно кешировать на годы, песни на недели, а результаты поиска на дни. Картинки можно
    так же кешировать на годы, если они есть. В ситуации картинок крайне рекомендую кешировать факт их отсутствия, дабы не запрашивать веб-страницу вновь в ложной надежде
  2. Экспериментируйте в дебаг-режиме на устройстве, но не забывайте, что дебаг может неочевидным образом изменять поведение программы и замедлять её работу. Скажем, получить таймаут при изменении очереди в дебаг-режиме крайне просто, даже если просто автоматически выводишь информацию в консоль без фактической остановки на дебаг-точке.
  3. Учитывайте, что SDK покрывает самые очевидные и простые сценарии в настоящий момент, в остальных ситуациях нужно подключать смекалку. Поскольку Apple 25 делает медиа SDK максимально стабильными и расширяемыми 26, ожидать появления всего нужного в ближайшее время не приходится, но вполне вероятно, что часть текущих приватных API станет публичными, когда разработчики SDK посчитают их достаточно стабильными.
  4. Если вы платите за аккаунт разработчика, то можете задать два технических «code level» вопроса в год без дополнительной платы. Так же полезными являются официальные «Q&A» и «Tech Notes», поискать по ним можно в разделе для разработчиков, а общий список доступен на легаси-сайте документации.
  5. Не бросайтесь сразу делать свой бэкенд. Понимаю, сильно хочется, но это излишне и даже может навредить. Часто API (Last.fm, musicbrainz, iTunes Search API из упоминаемых в статье) делают ограничение по IP адресу источника запроса. Передача пользовательского токена для доступа к Apple Music на бэкенд не выглядит хорошей идеей. А переносить все данные из открытых источников «себе» не всегда возможно и далеко не дёшево, не смотря на бесплатность и открытость самих данных 27.
  6. Изображения, получаемые из Apple Music API, ровно как и превью песен являются материалами, охраняемыми авторским правом. Ревью-команда App Store отклонит ваше приложение, если в превью играется музыка (на которую нет специального соглашения) и на скриншоте отображаются картинки, например, альбомов (на которые так же нет специального разрешения от правообладателя). Предыдущее моё музыкальное приложение 28 спокойно проходило ревью, не смотря на то, что на скриншотах содержало массу картинок альбомов и фотографий артистов, которые получались не самым лучшим с точки зрения авторского права образом 29. Сейчас же Apple за этим следит чуть строже 30.
  7. Учитывайте, что веб-интерфейс Apple Music — приложение на Ember. Если собираетесь парсить сведения, то нужно убедиться, что они имеются в html странице до того как в дело вступают модификации DOM со стороны Javascript.
  8. Если парсите веб-страницы, то сделайте так, чтобы приложение не показывало ошибок при изменении структуры этих страниц. Лучше не отобразить картинку или воспользоваться запасным вариантом получения данных, если парсинг не удался.

Послесловие

Не смотря на шероховатости SDK, недостаточность сведений и отсутствие по настоящему полезных batch запросов в API, имеющихся в арсенале средств достаточно для разработки интересных программных продуктов, выходящих за рамки «альтернативных плееров» для Apple Music. Хочется верить, что и другие игроки рынка, включая Яндекс и Гугл начнут предоставлять публичные SDK для музыкальных сервисов. Будем надеяться на светлое будущее с большим выбором музыкальных SDK, а пока закатаем рукава и будем делать интересные вещи в рамках имеющихся ограничений.

Говорят, ограничения даже помогают.

Бесполезные примечания

1 Он же метод (научного тыка)

2 Заметьте, что документация о такой связи умалчивает

3 Конечно, в Music.app и веб-интерфейсе при просмотре альбомов есть индикация популярности песен (популярные песни отмечены звёздочками), но в публичном API эта информация (даже простой флаг «популярно») отсутствует

4 Играться с параметром limit не получится: Specified limit for relationship ‘songs’ exceeds maximum of 20

5 The Beatles

6 Если быть более точным, то всё что есть в Apple Music есть в iTunes Store. В выдаче API iTunes Store присутствует флаг `isStreamablez, по которому можно понять есть объект в Apple Music или нет.

7 Пример запроса: https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewArtistSeeAll?cc=ru&ids=424279384&section=0

8 Хотя уверен, что он достаточно стабилен и, скорее всего, используется в декстопных приложениях iTunes и на устаревших (необновляемых) устройствах с iTunes Store

9 А список жанров нам в любом случае нужен для поиска по ним

10 Классифицируем классификаторы, всё как в лучших университетах нашей страны!

11 Формально, поскольку рекомендации в Apple Music среди пользовательской базы часто воспринимаются негативно: они игнорируют дизлайки, пропуски песен и не всегда похожи на то, что хотел бы услышать пользователь

12 Естественно, предварительно обернув в MPMusicPlayerPlayParametersQueueDescriptor

13 Станции в Apple Music бывают разных типов, в том числе (живые) с настоящими ведущими. Такие нас не очень интересуют в контексте рекомендаций.

14 Если, конечно, хочется попасть в App Store

15 Не ожидайте увидеть (Триаду) в рекомендациях для (Нигатива) и (Сансару) в рекомендациях для (Курары). Вообще не ожидайте увидеть для них рекомендации.

16 Чаще всего это просто ссылки на веб-страницы, но из них достаточно просто достать настоящие идентификаторы

17 Персональный каталог состоит из того, что пользователь купил в iTunes Store и загрузил в iTunes Match

18 И тем более получить с помощью публичного API URL для стриминга

19 Исключение — игры или программы-утилиты, где проигрывание музыки не является основной задачей. Делегировать, так делегировать.

20 Документация говорит: (When your app moves to the background, the music player stops playing the current media.). В действительности под капотом плеер использует AVPlayer, который может работать в фоне, достаточно только указать необходимые флаги в Info.plist или просто поставить галочку в нужном месте и всё будет сделано автоматически.

21 Тогда всё же хочется делать чуть более общую реализацию и свою надстройку над очередью.

22 При этом везде отображаются правильные обложки, которые самому из MPMediaItem получить не удаётся

23 Которую так же приходится получать с помощью транзакции изменения очереди

24 Скорее всего это вызвано тем, что данные SDK подключаются как внешние библиотеки, что несколько развязывает руки разработчикам, позволяя сильно не заботиться об обратной совместимости. В ситуации с iOS Media Player является частью операционной системы, соответственно требования по стабильности API более высокие.

25 Не буду тыкать пальцами в конкретные конкурирующие операционные системы, в которых работа с медиа — это игра в прятки с демонами, а с каждой версией правила игры меняются.

26 Фактически раньше тем же SDK можно было управлять только локальной библиотекой пользователя, теперь добавилась поддержка Apple Music. Apple не создала новый фреймворк, а улучшила существующий.

27 Дорого не только с точки зрения железа, но и самой дорогой части — стоимости труда программиста. Конечно, можно взять сведения из Enterprise Partner Feed, musicbrainz, всё это обработать и на каждый случай предоставлять свой API. Вполне вероятно, что это будет экономить трафик пользователя (хотя в музыкальном приложении это вопрос не первостепенный) и вообще работать быстрее. Однако стоит подождать до того момента, когда наберётся критическая масса пользователей и реальных их проблем.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *