Хочешь что-то сделать хорошо - сделай сам. Вот сделал и делюсь.
iTunes DRM Atomic remover
Скрипт позволяющий удалить из музыкальных треков формата m4a и m4v (music video) защищеные DRM теги с персональными данными аккаунта AppleID с которого были куплены или получены через iTunes Match эти треки.
Скрипт использует ffmpeg, однако не требует его установки, исполнительный файл достаточно положить в ту же папку, что и скрипт.
add: Новые версии, если таковые будут, можно найти здесь
https://github.com/Alekk32/iTunes-DRM-Atomic-remover
Для Windows:
iTunes-DRM-Atomic-remover.bat
Код:
@echo off
echo.
echo This will remove iTunes DRM tags with personal information from m4a and m4v files in this folder and all subfolders.
echo Unfortunately this will remove album covers from music video files (m4v).
echo You need to put ffmpeg.exe file in this folder to proceed.
echo.
pause
setlocal EnableDelayedExpansion
set "skipConfirmation="
for /r %%a in (*.m4a *.m4v) do (
if not defined skipConfirmation (
set /p "confirmation=To skip confirmation press R and ENTER or just press ENTER to continue: "
if /i "!confirmation!"=="R" (
set skipConfirmation=true
)
)
echo Processing file: "%%a"
ffmpeg -i "%%a" -metadata encoder="" -map_metadata 0 -fflags +bitexact -c copy "%%a_temp.m4a"
IF !ERRORLEVEL! NEQ 0 (
echo Error converting file: "%%a"
set /p "continueOnError=Do you want to continue processing other files? (Y/N): "
if /i "!continueOnError!"=="N" (goto end)
)
move "%%a_temp.m4a" "%%a"
echo.
echo "%%a" file processing completed.
echo.
)
:end
pause
Для macOS:
iTunes-DRM-Atomic-remover.sh
Код:
#!/bin/zsh
echo ""
echo "This will remove iTunes DRM tags with personal information from m4a and m4v files in this folder and all subfolders."
echo "Unfortunately, this will remove album covers from music video files (m4v)."
echo "You need to put ffmpeg file in this folder to proceed."
echo ""
skipConfirmation=""
current_dir=$(dirname "$0")
files=$(find "$current_dir" -type f \( -name "*.m4a" -o -name "*.m4v" \))
IFS=$'\n'
for file in $files; do
if [[ ! -n $skipConfirmation ]]; then
echo -n "To skip confirmation press R and ENTER or just press ENTER to continue: "
read confirmation
if [[ "$confirmation" == [Rr] ]]; then
skipConfirmation=true
fi
fi
echo "Processing file: $file"
./ffmpeg -i "$file" -metadata encoder="" -map_metadata 0 -fflags +bitexact -c copy "${file}_temp.m4a"
if [[ $? -ne 0 ]]; then
echo "Error converting file: $file"
echo -n "Do you want to continue processing other files? (Y/N): "
read continueOnError
if [[ "$continueOnError" == [Nn] ]]; then
break
fi
fi
mv "${file}_temp.m4a" "$file"
echo ""
echo "$file file processing completed."
echo ""
done
echo "Script execution completed."
Как пользоваться:
Windows:
1. Кладем файлики iTunes-DRM-Atomic-remover.bat и ffmpeg.exe в папку с вашей музыкальной коллекцией.
2. Запускаем iTunes-DRM-Atomic-remover.bat без прав администратора.
macOS:
- Кладем файлики iTunes-DRM-Atomic-remover.sh и ffmpeg в папку с вашей музыкальной коллекцией.
- Запускаем ffmpeg.
- Если получаем сообщение 'Файл «ffmpeg» является Unix‑приложением, загруженным из интернета. Вы действительно хотите открыть его?' Нажимаем Отменить и переходим к пункту 3.
- Если получаем сообщение 'Приложение «ffmpeg» нельзя открыть, так как не удалось проверить разработчика.' Нажимаем Отменить. Переходим в Настройки -> Конфиденциальность и безопасность, спускаемся ниже к разделу Безопасность и видим сообщение "Приложение «ffmpeg» заблокировано, так как его автор не является установленным разработчиком.". Нажимаем 'Подтвердить вход', а в появившемся после сообщении - Отменить.
- Открываем терминал. Переходим в нем в папку с музыкальной коллекцией, где уже находятся скрипт и ffmpeg:
Вводим 'cd ' (с пробелом в конце, без кавычек), перетаскиваем папку с музыкальной коллекцией в терминал, и жмем enter.
Даем скрипту разрешение на исполнение:
Вводим 'chmod +x iTunes-DRM-Atomic-remover.sh' без кавычек.
Запускаем скрипт:
Вводим 'sh iTunes-DRM-Atomic-remover.sh' без кавычек.
Будут обработаны все m4a и m4v файлы в текущей папке и во всех подпапках.
Перед обработкой каждого файла скрипт просит нажать enter. Чтоб продолжить обработку всех файлов без подтверждения введите R и нажмите enter.
ffmpeg можно скачать:
https://ffmpeg.org/download.html#build-windows (я использовал Windows builds by BtbN)
https://ffmpeg.org/download.html#build-mac
Для чего нужно:
Для пользователей хранящих собственную музыкальную коллекцию локально, в стандартных приложениях Music на Mac или iOS, или iTunes на Windows, если в этой коллекции есть треки формата m4a и m4v, купленные или полученные через iTunes Match не с вашего AppleID. Особенно, если эти треки скачаны из сторонних источников.
После всех данных манипуляций рекомендуется пересоздать медиатеку добавив туда все треки заново. Для пользователей macOS, которые хотят перенести в новую медиатеку счетчики количества воспроизведений, лайки, и некоторое другое - есть скрипт на AppleScript
https://github.com/Alekk32/iTunes-Medialib-XML-importer
AppleScript (Редактор скриптов) для переноса счетчика воспроизведений, лайков и др. из xml в новую медиатеку
Код:
-- Выбор файла plist или xml
set xmlFilePath to (choose file with prompt "Выберите файл iTunes Music Library" of type {"plist", "xml"})
set xmlTracksList to {}
set xmlTracksListRef to a reference to xmlTracksList
tell application "System Events"
tell property list file (POSIX path of xmlFilePath)
tell contents
set xmlTracks to value of property list item "Tracks"
set xmlTracksRef to a reference to xmlTracks
end tell
end tell
end tell
tell application "Music"
-- отдельный счетчик количества обработанных треков
set processedTracksCounter to 0
-- установка параметров прогрессбара для считывания данных из XML
set theXMLitemCount to length of xmlTracks
tell me
set progress total steps to theXMLitemCount
set progress completed steps to 0
set progress description to "Analysing XML items..."
set progress additional description to "Preparing to analyse."
set xmlTracksIter to 1
end tell
repeat with t in items of xmlTracksRef
tell me
set progress additional description to "Processing xml items " & xmlTracksIter & " of " & theXMLitemCount
end tell
set xmlTrackInfo to {name:(|Name| of t), album:(|Album| of t), artist:(|Artist| of t), trackNumber:("" as integer), playCount:(missing value), playDate:(missing value), skipCount:(missing value), skipDate:(missing value), lovedStatus:(missing value)}
try
if class of (|Track Number| of t) is integer then set trackNumber of xmlTrackInfo to (|Track Number| of t)
end try
try
if class of (|Play Count| of t) is integer then set playCount of xmlTrackInfo to (|Play Count| of t)
end try
try
if class of (|Play Date UTC| of t) is date then set playDate of xmlTrackInfo to |Play Date UTC| of t
end try
try
if class of (|Skip Count| of t) is integer then set skipCount of xmlTrackInfo to |Skip Count| of t
end try
try
if class of (|Skip Date| of t) is date then set skipDate of xmlTrackInfo to |Skip Date| of t
end try
try
if class of (|Loved| of t) is boolean then set lovedStatus of xmlTrackInfo to |Loved| of t
end try
set end of xmlTracksListRef to xmlTrackInfo
tell me
set progress completed steps to xmlTracksIter
set xmlTracksIter to xmlTracksIter + 1
end tell
end repeat
-- Поиск и установка значений для каждого трека в массиве
set libraryTracks to tracks
set libraryTracksRef to a reference to libraryTracks
-- установка параметров прогрессбара для отображения количества обработанных треков
set theTracksCount to length of libraryTracks
tell me
set progress total steps to theTracksCount
set progress completed steps to 0
set progress description to "Updating tracks info..."
set progress additional description to "Preparing to process."
set libraryTracksIter to 1
end tell
repeat with iTracks in libraryTracksRef
tell me
set progress additional description to "Processing track " & libraryTracksIter & " of " & theTracksCount
end tell
set libTrack to track number of iTracks
set libName to name of iTracks
set libAlbum to album of iTracks
set libArtist to artist of iTracks
repeat with t in xmlTracksListRef
set xmlTrackNumber to the trackNumber of t
set xmlTrackName to the name of t
set xmlAlbumName to the album of t
set xmlArtistName to the artist of t
set xmlPlayCount to playCount of t
set xmlPlayDate to playDate of t
set xmlSkipCount to skipCount of t
set xmlSkipDate to skipDate of t
set xmlLoved to lovedStatus of t
if xmlTrackNumber is equal to libTrack and ¬
xmlTrackName is equal to libName and ¬
xmlAlbumName is equal to libAlbum and ¬
xmlArtistName is equal to libArtist then
if xmlPlayCount is not missing value then set played count of iTracks to xmlPlayCount
if xmlPlayDate is not missing value then set played date of iTracks to xmlPlayDate
if xmlSkipCount is not missing value then set skipped count of iTracks to xmlSkipCount
if xmlSkipDate is not missing value then set skipped date of iTracks to xmlSkipDate
if xmlLoved is not missing value then
if xmlLoved is true then
set loved of iTracks to xmlLoved
else if xmlLoved is false then
set disliked of iTracks to true
end if
end if
set processedTracksCounter to processedTracksCounter + 1
exit repeat
end if
end repeat
tell me
set progress completed steps to libraryTracksIter
set libraryTracksIter to libraryTracksIter + 1
end tell
end repeat
-- Вывод результатов (просто для информации)
display dialog "Перенесена информация для " & processedTracksCounter & " совпадающих треков"
end tell
Замечено всего два случая, когда эти треки с DRM тегами в медиатеке вызывали проблемы:
Первый случай связан с синхронизацией локальной медиатеки Music на macOS с Music на iOS. Синхронизация происходила с ощутимой задержкой перед началом, около 2-х минут через кабель, и около 5 минут по WiFi. Она тупила на этапе 4/4, и только потом начинала синхронизацию. И так при каждой синхронизации, даже если добавлялся всего один новый трек. Всего в моей медиатеке около 6 тыс треков, из них с такими DRM тегами около 4 тыс, естественно из самых разных источников. Вероятнее всего в процессе синхронизации каждый раз DRM теги проверяются во всех треках, и данные об аккаунтах AppleID из них заносятся в iIunes Store на iPhone. Скорее всего из-за этого происходит описанное во втором случае, о котором ниже.
Но более существенные проблемы с синхронизацией начались после обновления на macOS Big Sur 11.3 (20E232). В процессе тупки на 4/4 этапе синхронизация просто прерывалась еще толком не начавшись, и выдавала ошибку "iPhone "имя айфона" не удалось синхронизировать, так как сеанс синхронизации не удалось завершить". После этого обновления macOS синхронизировать мою медиатеку на iPhone было практически невозможно. Но на 1 из 20-30 раз случалось чудо, и синхронизация все же происходила. Однако со временем добавились проблемы с отображением медиатеки в Music на iPhone. У половины альбомов не отображалась обложка, а у некоторых исполнителей треки были перепутаны между альбомами, либо вообще отображались в отдельных "неизвестных альбомах". Подробнее эта проблема описана тут
https://discussions.apple.com/thread/255324218
Проблема полностью решилась после очистки всех треков с DRM тегами данным скриптом.
Второй случай - это процесс восстановление iPhone из резервной копии iCloud. Напомню, в ней не хранилась никакая облачная медиатека, только настройки iPhone и данные приложений, а медиатека - локальная на Mac.
Так вот, после входа в свой AppleID, но непосредственно перед процессом восстановления из iCloud, iPhone начал усиленно запрашивать пароли ото всех AppleID содержащихся в тех DRM тегах подряд! Мол, у вас обнаружены покупки с других аккаунтов, извольте в них войти! Хотя ни на iPhone ни в iCloud никаких треков еще не было, синхронизировал локальную медиатеку с Mac я уже после восстановления. Но данные о DRM тегах в iCloud похоже таки сохраняются при каждой синхронизации медиатеки, вероятнее всего в приложении iTunes Store, и соответственно остались от предыдущих синхронизаций. Возможно после синхронизации медиатеки уже без DRM тегов эти данные удалятся. Конечно, все эти запросы пароля можно просто отменить, но не слишком удобно отменять и подтверждать отмену более 40 запросов. Да и понимание того, что в твоем iCloud хранится информация обо всех этих "покупках с твоего iPhone" но не с твоего AppleID несколько напрягает. Никогда не угадаешь какими еще проблемами это может всплыть в будущем.
Как работает, и почему mp3tag не поможет:
С помощью ffmpeg происходит перепаковка аудиопотока для m4a и видео вместе с аудиопотоком для m4v в новый контейнер. Сами потоки не подвергаются никаким конвертациям или другим изменениям, оригинальный и результирующий файл полностью вычитаются в противофазе, лично проверил. Тем более удивительно, но показатель битрейта почему-то меняется с CBR 256 на VBR с каким-то средним значением. Возможно искусственное отображение красивого CBR 256 - перфекционистские заморочки Apple.
В новый контейнер переносятся также и все метаданные, и обложки альбомов.
Не переносятся, во-первых самое главное - те самые DRM теги (DRM атомы контейнера MPEG-4 AAC), которые сложно удалить обычным способом, но в которых и содержится тот самый идентификатор AppleID вызывавший вышеописанные запросы на вход в аккаунты.
Также не переносятся следующие теги:
ITUNESACCOUNT
ITUNESADVISORY
ITUNESALBUMID
ITUNESARTISTID
ITUNESCATALOGID
ITUNESCOMPOSERID
ITUNESCOUNTRYID
ITUNESGAPLESS (все-таки переносится)
ITUNESGENREID
ITUNESMEDIATYPE (все-таки переносится)
ITUNESOWNER
ITUNESPURCHASEDATE
ITUNMOVI
ITUNNORM
ITUNSMPB
TVSHOWSORT
XID
WWW
обложка для m4v (музыкальных видео)
Ее можно перенести вручную в приложении iTunes или Music простым перетаскиванием из "Сведений" в любую удобную папку, а оттуда таким же перетаскиванием обратно в "Сведения" уже очищенного файла.
Переносить все эти данные по каким-то причинам не умеет сам ffmpeg. Но в нашем случае в этом и заключается польза (только с обложками для m4v досадно получилось).
Но даже если бы он переносил все теги, кроме DRM тегов, это не вызвало бы вышеописаную проблему с запросами на вход в аккаунты. И даже iTunes или Music не распознают файлы без DRM тегов как купленные или полученные из iTunes Match. Хотя эти теги тоже лучше удалять, поскольку они тоже могут содержать персональную информацию об аккаунте AppleID владельца (email, first name, last name), дате покупки и некоторые другие.
Это легко проверить с помощью mp3tag (
https://www.mp3tag.de/en/download.html). Он умеет и удалять все эти теги, и копировать их в другой файл, но не умеет удалять и даже отображать DRM теги.
Можно удалить с его помощью все теги из списка выше (для их просмотра нажать Alt+T), после чего снова добавить очищенные файлы в медиатеку iTunes или Music. В "Сведениях" все равно останется метка "Купленное аудио AAC" или "Аудиофайл из iTunes Match" (а значит и DRM теги с идентификатором AppleID получателя), хоть и не будет отображаться имя владельца и дата покупки, если они ранее отображались.
А можно наоборот - в файлы очищенные данным скриптом, скопировать все теги из исходного файла с помощью mp3tag. Достаточно просто нажать Ctrl+C на исходном файле и Ctrl+V на очищенном - это скопирует все видимые для mp3tag теги, в том числе и из списка выше, и даже обложки для m4v (но не DRM теги). В таких файлах в iTunes или Music в "Сведениях" исчезнет метка "Купленное аудио AAC" или "Аудиофайл из iTunes Match", и даже имя владельца и дата покупки отображаться не будет, хоть эти теги и будут присутствовать в файле.
Увидеть те самые DRM теги можно в HEX редакторе. Они находятся прямо во второй строчке, среди служебных символов есть текст вида nameИмяФамилия, причем не только в купленных аудиофайлах, но даже в аудиофайлах из iTunes Match, в которых персональные данные в "Сведениях" никогда не отображались. Наверняка где-то там записан и тот самый идентификатор AppleID с которого были получены эти треки, подробнее не расшифровывал. И наверняка именно он вызывает вышеописаную проблему с запросами на вход в аккаунты.
Эти DRM теги специально защищены от простого удаления. Если их вырезать в HEX редакторе - файл не сможет воспроизвести ни одни плеер. И иного способа удаления, кроме того, которому посвящено это описание, мне найти не удалось. Хоть этот DRM защищает только метаданные с информацией об аккаунте AppleID и никак не мешает прослушиванию самого аудио, тем не менее такая защита значительно осложняет удаление этих DRM тегов (на то они и DRM).
Дискуссия на эту тему с разработчиком mp3tag
https://community.mp3tag.de/t/itunes-owner-tag-is-not-working-appears-another-name-owner/44099/7
Надеюсь мой труд облегчит жизнь кому-то еще =)