Как сделать резервную копию своей музыкальной коллекции в 20КБ; или, как я потерял и восстановил свою библиотеку Apple Music

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

Фон

Я был на работе, когда получил ужасное всплывающее уведомление «Y наш загрузочный диск почти заполнен ». Я ранее загружал свою коллекцию Apple Music размером 31 ГБ, поэтому решил пожертвовать мгновенным воспроизведением ради этих драгоценных гигабайт. Я выделил все песни в своей библиотеке и выбрал «Удалить загрузку», чтобы освободить дополнительное место на ноутбуке. Инстинктивно, как я делаю всякий раз, когда удаляю что-то со своего компьютера, я нажал Shift + Command + Delete, ярлык для удаления мусора.

Хорошо, за исключением того, что я все еще был в iTunes, а не в Finder. И вся моя музыка была выбрана. И в подсказке, на которую я автоматически нажал "Enter", не говорилось

«Вы действительно хотите навсегда удалить элементы из корзины?»

он сказал

«Вы действительно хотите удалить эти песни из музыкальной библиотеки iCloud?»

Оглядываясь назад, я сомневаюсь, что удаленные загрузки вообще попадут в корзину. Я только что удалил свою коллекцию из более чем 4000 песен. Тупой. В любом случае, вот как я их всех вернул.

Решение

Когда я понял, что сделал, я быстро открыл свой личный MacBook, который, к счастью, принес в тот день на работу. Не проверяя, была ли очищена библиотека iTunes, я сразу же открыл Finder, продублировавший папку «Музыка», которая содержит все файлы песен .m4p (зашифрованный тип аудиофайла Apple Music), аккуратно распределенные по каталогам по исполнителю и альбому. Я сделал это до того, как iCloud смог синхронизировать медиатеку iTunes на этом устройстве. Уф, это могло быть плохо. Я загрузил iTunes на свой домашний ноутбук и наблюдал, как моя библиотека исчезла у меня на глазах. Я восстановил дублированный каталог «Музыка», надеясь мгновенно восстановить всю музыку, но безрезультатно.

В отчаянии я позвонил в Apple. Женщина с южной растяжкой, по сути, сказала мне: «Извините, но, по крайней мере, вы знаете названия песен, чтобы вы могли повторно загрузить свою музыку. Чем еще я могу вам помочь сегодня? "

Хорошо, я не собирался вручную повторно загружать 4000 песен, но, возможно, есть другой способ.

Создание сценария

Идея здесь в том, чтобы мой MacBook автоматически перебирал все мои песни и добавлял каждую из них в мою библиотеку Apple Music, выполняя поиск в Apple Music. Я напишу сценарий на Python.

Первое, что мне нужно сделать, это создать структуру данных для хранения ссылок на все песни, которые я удалил. Возможность просматривать их все через файлы .m4p - это круто, но не очень практично.

Простой класс, представляющий каждую песню в библиотеке.

class Song:
   def __init__(self, name, artist):
      self.name = name
      self.artist = artist

Теперь мне нужно перебирать каждую песню, чтобы каждый раз запрашивать название песни и имя исполнителя в iTunes (например, «Come Together The Beatles»). Я решил, что это будет самый короткий запрос, который гарантирует, что песня, которую я хочу, будет первым результатом в каталоге Apple Music.

Для этого мне нужно заполнить массив объектов Song, проанализировав каталоги песен.

songs = []
pathName = '/Users/jacobgoldfarb/Music/iTunes/iTunes Media copy/AppleMusic'

Я объявляю пустой массив, который будет содержать объекты песни, и строку, ссылающуюся на имя пути к каталогу, в котором находится вся музыка. Папка «Apple Music» структурирована таким образом, что каждый каталог - это имя исполнителя, каждый каталог исполнителя содержит папку для альбома, а каждый каталог альбома содержит фактические файлы .m4p.

Разбор справочников. Обратите внимание, что вы должны import os и import glob:

for fileName in glob.iglob(pathName + '/**/*.m4p', recursive=True):
   songString = fileName.split('/')[9]
   artistString = fileName.split('/')[7]
   spaceIndex = 0
   for char in songString:
      if char == ' ':
          spaceIndex = songString.index(' ')
          break
    songString = songString[spaceIndex:]
    songString = os.path.splitext(songString)[0]
    songString = songString.replace('_', ':')
    song = Song(songString, artistString)
    songs.append(song)

Заголовок цикла for, по сути, говорит, что нужно рекурсивно перебрать все папки в пути и найти все файлы .m4p.

Тело анализирует каждое имя файла. Имя файла - это абсолютный путь к песням, включая обратную косую черту (например, /Users/jacobgoldfarb/Music/iTunes/iTunes Media/Apple Music/The Beatles/Abbey Road/01 Come Together.m4p). Кроме того, Apple Music добавляет номер дорожки в начало каждого файла .m4a, например 01 Come Together.m4p. Встроенный цикл for просто находит индекс этого первого пробела после числа, поскольку номер не всегда состоит из двух символов, а следующие строки удаляют эту подстроку (т.е. 01) из заголовка. os.path.splitext(songString)[0] отрезает подстроку .m4p. Наконец, система управления файлами заменяет символ ‘:’ на подчеркивание в названиях песен, поэтому следующая строка просто заменяет любые символы ‘_’ на символы ‘:’. Новый объект песни инициализируется и добавляется к модели песни.

Теперь о фактическом повторном скачивании музыки. Для управления компьютером воспользуюсь pyautogui. Я включил необходимые подмодули в начало скрипта. Я также использовал time и random для создания случайной паузы между запросами. Это моя ленивая попытка избежать сопротивления со стороны Apple. Это всего лишь предположение, но я предполагаю, что 4000 запросов подряд могут поднять некоторые флаги.

from pyautogui import press, typewrite, click, moveTo
import time
import random
for song in songs:
   moveTo(1300, 50)
   time.sleep(random.uniform(2, 2.3))
   click()
   typewrite(f'{song.name} {song.artist}')
   press('enter')
   time.sleep(4)
   click(430,305)
   click(335, 270)
   time.sleep(random.uniform(1, 4))

Вот и все. Сценарий предназначен для запуска iTunes в полноэкранном режиме за вашей IDE (который не должен быть в полноэкранном режиме). Код прост;

  • сначала переместите курсор в верхний угол экрана над строкой поиска iTunes и подождите. В параметрах метода указаны координаты «x» и «y», и я обнаружил - методом проб и ошибок - что эта координата работает на моем компьютере. Однако будьте осторожны, поскольку перемещение курсора за пределы экрана может иметь непредвиденные последствия.
  • Затем щелкните. Это должно войти в поле поиска в iTunes. Перед запуском программы убедитесь, что для поиска iTunes установлено значение «Вся Apple Music», а не «В медиатеке».
  • typewrite затем введет название песни и исполнителя. press('enter') отправляет запрос.
  • Подождите четыре секунды, пока не появятся результаты. Это может быть щедрым или недостаточным в зависимости от вашего интернет-соединения.
  • Следующие две строки должны нажать кнопку (+), которая добавит песню в вашу библиотеку. Опять же, я нашел эти координаты методом проб и ошибок. В текущем пользовательском интерфейсе Apple Music есть две возможности относительно того, где находится кнопка. Поскольку при использовании обоих положений кнопок не происходит никакого вреда, предпринимаются попытки каждого, хотя можно случайно перейти на страницу исполнителя.
  • Подождите произвольное время от 1 до 4 секунд (произвольный выбор), затем повторите процесс.

Оставьте компьютер включенным на ночь и вуаля - ваша библиотека вернулась.

Как сделать резервную копию вашей музыкальной коллекции в 8,8 МБ

Отсюда вы, возможно, догадались, как можно сделать резервную копию вашей музыкальной коллекции, используя этот невероятно хитрый метод поиска музыки. Пока у вас есть ссылка на ваш список песен и имя исполнителя, разделенные некоторым разделителем, вы можете просто изменить сегмент синтаксического анализа файла сценария, чтобы вместо этого анализировать текстовый файл. Невероятно простой способ создать текстовый файл со всей необходимой информацией - это экспортировать вашу библиотеку в виде файла .xml. Вы можете легко сделать это в iTunes, перейдя по ссылке:

Файл ›Библиотека› Экспорт библиотеки…

Я разместил исходный код здесь. Я уверен, что есть гораздо лучшее и более элегантное решение (которое не требует декодирования файлов .m4p), поэтому, если вы знаете о нем, дайте мне знать. В любом случае, я надеюсь, вам понравилась статья и ваша резервная копия размером 8,8 МБ!