Представьте себе, что вы — представитель той немногочисленной прослойки пользователей iTunes, который держит свою медиатеку в идеальном состоянии. Каждому альбому в обязательном порядке присвоена обложка, все тэги дотошно прописаны, напротив тысяч композиций выставлен рейтинг, а количество вручную подобранных плейлистов перевалило за второй десяток. Для вас музыка — больше, чем просто набор байтов. Свою медиатеку вы накапливаете годами, покупая альбомы в iTunes Store или выискивая редкие записи на торрентах. А сами файлы хранятся не по уголкам жесткого диска, а в автоматически сгенерированной файловой библиотеке iTunes — разложены по папочкам и всегда под рукой.
И вот в одно прекрасное утро вы замечаете, что ваша замечательная медиатека больна. Да настолько больна, что с каждым мгновением желание пристрелить её (чтоб не мучалась) только увеличивается. Ведь перед глазами творится какой-то настоящий кошмар. Появляются несколько дубликатов одного и того же альбома, обложки полностью попутаны, плейлисты оказались наполнены совершенно произвольными песнями. Более того, при воспроизведении композиций их содержание полностью расходится с метаданными! «Нет, нет, это ведь Боб Дилан, а не Cage the Elephant!», крутится у вас в голове, но вы не можете ничего с этим поделать.
Именно это и произошло со мной. Разница только в том, что моя катастрофа не была спонтанной. Она возникла не сама по себе. Она возникла после обновления iTunes до долгожданной версии 12.2, которая принесла нам Apple Music и iCloud Music Library. Знали бы я и сотни (если не тысячи) других пользователей iTunes о том, что их ждёт, заранее — не делали бы резких движений. Однако кнопка «Включить Медиатеку iCloud» казалась достаточно безобидной на первый взгляд.
iCloud по какой-то причине не справился с выгрузкой библиотеки в облако, и возле каждой песни поставил предупреждение о том, что, мол, данная композиция уже загружена в iCloud. Первое подозрение — подписка на iTunes Match, от которой я в конце прошлого года отказался. Возможно, по какой-то ошибке файлы всё ещё остались на сервере, и действия Apple Music вызвали какой-то конфликт. Множественные комментарии на форумах Apple подтверждают мою теорию, что с подобным ужасом столкнулись именно бывшие подписчики iTunes Match.
Впрочем, чисто внешне казалось, что вся неразбериха вызвана исключительно сбоем в работе самой программы — мол, попытка включить Медиатеку iCloud вызвала «линейный сдвиг» метаданных. Причем «под раздачу» попали записи, добавленные в iTunes одними из первых — что также выглядело странновато. Достаточно быстро в недрах файловой системы были найдены резервные копии непосредственно медиатеки iTunes в формате .itl — iTunes предусмотрительно делает сохранение перед каждым обновлением ПО. (резервные копии находятся по адресу C:\Users\\Music\iTunes\Previous iTunes Libraries)
«Подставив» последний найденный .itl вместо текущей медиатеки, удалось вернуть iTunes к состоянию, в котором он находился до обновления. К сожалению, на этом мои мучения только начались. Оказалось, что пользуясь своей вседозволенностью в рамках каталога iTunes Media, iTunes подменил метаданные не только в своей базе данных, но и непосредственно в файлах. Более того, «исправленные» файлы он раскидал внутри своего каталога как душе угодно. Естественно, предыдущая версия базы данных оказалась обескуражена таким поворотом. Получалось, что при попытке воспроизвести некоторые песни, вылазила ошибка о том, что «Файл не найден».
Следующие абзацы описывают процесс «лечения» медиатеки в достаточно мелких технических деталях. Если вам это неинтересно — можете листать статью до следующего подобного предупреждения.
Да и как его вообще можно было найти? Битых песен оказалось несколько сотен, искать их всех вручную и переносить в первоначальное место (по пути так же вручную исправляя метаданные) — не вариант. Пользуясь золотым правилом «никто тебе не поможет, кроме тебя самого», решил воспользоваться языком программирования Python, крайне удобным для написания подобного рода скриптов. Основная задача стояла одна — вникнуть в организацию файла базы данных медиатеки iTunes и найти способ определить «прошлую жизнь» испорченного файла, чтобы потом вернуть его на место.
Подобная лазейка нашлась достаточно быстро. iTunes после запуска с новым .itl файлом автоматически генерирует XML документ, в котором и хранит информацию о своей медиатеке. В XML файле можно найти информацию о каждой отдельной композиции — название, альбом, исполнителя, жанр и так далее. Самым интересным полем оказалось «Persistent ID» — это кодовый набор букв и цифр, который присваивается файлу в момент добавления его в медиатеку и не меняется, что бы с ним не происходило. Именно по этому полю и можно было определить, что же за песня на самом деле находится перед нами. А учитывая, что в информации о песне также прописывалось её местонахождение, задача наконец-то стала полностью понятной и осязаемой.
То есть, нужно было сравнить два XML файла — с правильной информацией и с неправильной информацией. В случае, если у песен с одинаковым Persistent ID расходится местоположение файла, нужно просто переместить его, попутно очистив его от метаданных — сам iTunes потом «подтянет» их из своей медиатеки.
Признаюсь, навыки разработки на Python у меня достаточно посредственные, поэтому для реализации этого простого алгоритма мне пришлось достаточно помучиться. При написании программы были задействованы встроенная библиотека plistlib (который превращает plist-XML в удобно отформатированный «dict») и внешняя библиотека mutagen (для работы с ID3-тегами и не только). В итоге разработка и отладка заняла у меня чуть более восьми часов, однако скрипт, полученный на выходе, делал именно то, чего я от него и ожидал.
Я не буду выкладывать скрипт в открытый доступ, так как для его функционирования нужны особые условия и я не могу гарантировать его работоспособность в каждом отдельном случае. Впрочем, если вы, как и я, столкнулись с описанной выше проблемой, обязательно свяжитесь со мной — я и код предоставлю, и расскажу, как им пользоваться. Актуальные контакты вы всегда найдёте в моём профиле.
На этом месте заканчиваются технические детали и продолжаются размышления о том, что «Apple уже не та»
После того, как моя музыка была почти полностью вылечена, я предпринял ещё одну попытку подключить iCloud Music Library — на этот раз предварительно её очистив. Не помогло. Снова предупреждение о «дубликатах», снова катастрофа с метаданными. Правда, во второй раз она уже столько ужаса не навела — буквально в два клика всё вернулось в исходное состояние. Однако после этого я окончательно решил, что Apple Music — не для меня, и пока её не починят, пользоваться ею просто невозможно.
Насколько я знаю, подобное уже происходило ранее — при запуске iTunes Match. Хорошо, что я не столкнулся с этим тогда. Но я уже предвкушаю ваши замечания о том, что «у всех всё нормально работает, а ты мне тут втираешь какую-то дичь». Так вот нет, не работает. Комментарии на форумах поддержки Apple, на MacRumors и ещё нескольких больших порталах показывают, что с такой проблемой столкнулись многие — и пускай на фоне миллионов пользователей Apple Music это лишь единицы. И этого Apple просто нельзя прощать — уже далеко не в первый раз компания лезет в пользовательские файлы и без предупреждения меняет то, что менять просто непозволительно.
Более того, после подобных проишествий доверие к Apple, итак пошатнувшееся после недавних событий, пропадает окончательно. В конце-концов, такого ужаса от компании, адепты которой щеголяют фразой «это просто работает», уж никак не ждешь.