Previous Entry Share Next Entry
Перенос библиотеки iTunes под Mac OS X
Белка
lerm_ru
После установки нового диска в Mac Mini появилась возможность перенести библиотеку с музыкой из сетевого хранилища на локальный диск. Задача эта содержит один нетривиальный момент - помимо собственно переноса файлов, требуется обновить информацию о них в базе iTunes. Если вы используете консолидированную в iTunes библиотеку (как это рекомендует Apple), то никакой проблемы нет - просто меняете расположение библиотеки и файлы переедут куда надо. Однако, если вы сами занимаетесь управлением файлами, то такой способ не сработает. Очевидное решение - удалить всё текущее содержимое библиотеки и добавить все файлы по новой. К сожалению, при этом потеряется вся дополнительная информация, которая хранилась только в базе iTunes, а кроме того окажутся разрушенными все списки воспроизведения и придется заново настраивать синхронизацию с устройствами - этот вариант для меня был неприемлем. Соответственно, для корректного перемещения библиотеки требуется обновить пути ко всем файлам - заменить в них старый каталог на новый. Одно из возможных решений - экспортировать всю библиотеку в текстовый XML-файл, произвести в нём требуемую замену, а затем закачать данные обратно. Если же вы работает под Mac OS, то существует более простое решение - использовать маленький сценарий AppleScript для выполнения этой задачи. Все грамотные приложения под Mac OS имеют публичный API, с которым можно взаимодействовать в том числе и с помощью таких скриптов. Под катом - текст сценария, который я использовал для обновления своей библиотеки.


set oldRoot to "/Volumes/Storage/Media/Музыка/Mp3/"
set newRoot to "/Users/lerm/Music/Library/"
set oldLength to (length of oldRoot) + 1
 
tell application "iTunes"
	set libPlaylist to library playlist 1
	set libLength to count of file tracks of libPlaylist
	repeat with i from 1 to libLength
		log i
		set curTrack to track i of libPlaylist
		if get class of curTrack is file track then
			set curLocation to location of curTrack
			set curPath to POSIX path of curLocation
			if curPath starts with oldRoot then
				set newPath to newRoot & (text oldLength thru length of curPath)
				set newFile to newPath as POSIX file
				set location of curTrack to newFile
			end if
		end if
	end repeat
end tell
log "Done."


  • 1
Мен, ты смеёшься?
А скопировать папку iTunes на новое место и даблкликнуть потом на iTunes Music Library.xml?

Я обычно так делал.

Либо держишь alt зажатым при запуске iTunes и выбираешь новый локейшн :)

Пути оно подправит, не боись.

> А скопировать папку iTunes на новое место и даблкликнуть потом на iTunes Music Library.xml?
> Пути оно подправит, не боись.

(Вздыхая) Начнем с первого пункта в моем описании - у тебя библиотека iTunes консолидирована или нет? В смысле - вся твоя музыка лежат в одном каталоге, который прописан в iTunes или нет? Галочка "Сохранять информацию о песнях в папке iTunes Media" в настройках стоит?

Вечер добрый.
У меня почему ваш скрипт завершается со ошибкой
"Результат:
error "Не удается получить POSIX path of missing value." number -1728 from POSIX path of missing value"

Хм. Странно - судя по ошибке, в библиотеке оказался File Track без заполненного location. Честно говоря, я уже давно не работал с AS, но можно попробовать сделать так - пропускать все неправильные записи:
set oldRoot to "/Volumes/Storage/Media/Музыка/Mp3/"
set newRoot to "/Users/lerm/Music/Library/"
set oldLength to (length of oldRoot) + 1
 
tell application "iTunes"
	set libPlaylist to library playlist 1
	set libLength to count of file tracks of libPlaylist
	repeat with i from 1 to libLength
		set curTrack to track i of libPlaylist
		try
			if get class of curTrack is file track then
				set curLocation to location of curTrack
				set curPath to POSIX path of curLocation
				if curPath starts with oldRoot then
					set newPath to newRoot & (text oldLength thru length of curPath)
					set newFile to newPath as POSIX file
					set location of curTrack to newFile
				end if
			end if
		on error errStr number errorNumber
			log errStr
			log curTrack
			log name of curTrack as string
		end try
	end repeat
end tell
log "Done."


На всякий случай напоминаю, что желательно сделать резервную копию библиотеки, перед тем как с ней экспериментировать. ;) Удачи!

Спасибо, сейчас попробую.
Я понял, что ошибка связана с какой-то строкой, тк AS ссылалась на одну и туже, но не понял с чем именно и как это исправить :)

  • 1
?

Log in

No account? Create an account