Moving an Aperture library over to Capture One
This is a new thread for some of the user discussion about how to assist in moving an Aperture library over to Capture One. This is a follow-on to the discussion in the thread here:.
Where we left off, tazthecar was having some success finding ways of using Applescript to mediate a heirarchical export from Aperture.
I think the folder/project difference should be fairly straightforward since folders in Aperture cannot directly contain images. So Having both of them turned into folders in the file hierarchy is fine -- if it has images in it it's a project, if not it's a folder (group).
Albums are tricky since they really just contain references to images. I suppose a logical thing would be to create folders for albums, but put aliases to the files in their project albums in them. I'm not sure how "useful" the aliases would be, but if you didn't do it this way, it seems like you'd end up with duplicate images in the album and project. But maybe that's preferable for some people depending how they organize? Maybe a user option for how you want albums handled?
Where we left off, tazthecar was having some success finding ways of using Applescript to mediate a heirarchical export from Aperture.
[quote="tazthecat" wrote:
Also the way I'm approaching it now, there will be no differentiating the type of "container" (e.g. folder/project/album) in the file hierarchy. Would this be OK or would people prefer separation in the file structure between folders, project, and albums? Luckily every object in Aperture includes all the parent objects so unwinding the hierarchy for each image is fairly straightforward.
I think the folder/project difference should be fairly straightforward since folders in Aperture cannot directly contain images. So Having both of them turned into folders in the file hierarchy is fine -- if it has images in it it's a project, if not it's a folder (group).
Albums are tricky since they really just contain references to images. I suppose a logical thing would be to create folders for albums, but put aliases to the files in their project albums in them. I'm not sure how "useful" the aliases would be, but if you didn't do it this way, it seems like you'd end up with duplicate images in the album and project. But maybe that's preferable for some people depending how they organize? Maybe a user option for how you want albums handled?
0
-
So where does C1 "put" images?
Aperture puts them in the project, folders cannot contain images and albums are references to images in a project.0 -
I had responded to BobRockefeller before this new thread started so I'm copying it here:
Yes. It is possible to determine the type of container (folder/project/group) and do something differently based on what type it is. In my case (I'm very bad at organization) I have a mixed bag of hierarchies (projects in folders, projects in projects, and albums scattered randomly about the structure) so for my case just dumping it into a single file structure makes sense for me and I can reorganize once I get everything into C1. For people with a more organized structure it might make sense to separate the file structure in to logical segments. You still need to live with the fact that you are importing a file structure not a database so it will still require the manual process of putting the collections of images into the desired C1 container type. At least all the images will be separated into directories that match the original Aperture structure.
It is also possible (at least according to the documentation) to save a sidecar xml file when exporting. I do not have enough experience with C1 to know if that would be useful or not and what information is contained in the xml file.
I hope this makes sense…0 -
[quote="tazthecat" wrote:
It is also possible (at least according to the documentation) to save a sidecar xml file when exporting. I do not have enough experience with C1 to know if that would be useful or not and what information is contained in the xml file.
Yes, if you export the originals along with the xml sidecar, C1 does correctly interpret that on import, pulling over all the metadata from Aperture (tags, geotags, ratings, etc.). If you export jpeg versions into the same directory, it even applies the tag data to the jpegs.0 -
[quote="ymatto" wrote:
This is a new thread for some of the user discussion about how to assist in moving an Aperture library over to Capture One. This is a follow-on to the discussion in the thread here:.
Where we left off, tazthecar was having some success finding ways of using Applescript to mediate a heirarchical export from Aperture.[quote="tazthecat" wrote:
Also the way I'm approaching it now, there will be no differentiating the type of "container" (e.g. folder/project/album) in the file hierarchy. Would this be OK or would people prefer separation in the file structure between folders, project, and albums? Luckily every object in Aperture includes all the parent objects so unwinding the hierarchy for each image is fairly straightforward.
I think the folder/project difference should be fairly straightforward since folders in Aperture cannot directly contain images. So Having both of them turned into folders in the file hierarchy is fine -- if it has images in it it's a project, if not it's a folder (group).
Albums are tricky since they really just contain references to images. I suppose a logical thing would be to create folders for albums, but put aliases to the files in their project albums in them. I'm not sure how "useful" the aliases would be, but if you didn't do it this way, it seems like you'd end up with duplicate images in the album and project. But maybe that's preferable for some people depending how they organize? Maybe a user option for how you want albums handled?
Thanks for that information. I'm not that careful when importing images so I never realized exactly where to images went (I mainly organize by keyword and ratings). So I won't bother exporting masters from albums but I might investigate whether I can just export the xml sidecar file for images in an album or see if there are any other ways aid in establishing the link between images in a library and the source. I'm still working on the basic mechanics of how the script would work so I'm not even close to considering user options 😄
Right now I'm working on getting the directory hierarchy populated so when I get to the point of actually exporting the image masters I can get a better handle on how thing work.
Thanks again. -ron-0 -
[quote="BobRockefeller" wrote:
So where does C1 "put" images?
Aperture puts them in the project, folders cannot contain images and albums are references to images in a project.
[strikethrough]Actually, I believe C1 kind of reverses Aperture's scheme. Images can only be contained in "albums", but references to those images can be put in "projects". "Groups" (like folders) can contain either albums, projects, or other sub-groups.[/strikethrough]
Oops, I was wrong about that. I'm still getting used to C1's way of thinking. I believe that images in the "user collections" can indeed only be contained in "albums" -- however, really they're all just references to the original image which you don't directly see in the "user collections" section. For example: I import an image into Album 1, then drag it from there into Album2, it will appear in both albums. If I delete it from either album, it will still appear in the other. If I delete it from both albums, it will still appear in the "all images" section. So "albums" really act like they do in Aperture, although the original images aren't in a user-defined "location" that I can figure out. But again, I'm very new to C1 unfortunately.
However, "projects" are very similar to "groups". They can just hold albums, and according to the PhaseOne documentation, "a project will limit the search scope of, for example, smart albums within it and it cannot contain other projects".
Anyway, I clearly need to play around with the organization in C1 and read the documentation more to figure out how the organization really "works".0 -
OK, I just had a thought and did a quick google search to see if C1 supported applescript. It looks like it has limited support but I am not at my computer that has C1 so I don't know what functions it has or if it would be of any use for transitioning albums but I will check this out at some point. Any information that anyone has on C1's applescript capabilities would be appreciated. -ron- 0 -
OK, here is the first version I have that creates the filesystem structure with folders and projects. There is nothing done with albums yet but I will add that because I have projects that contain albums that I would like to include in my file hierarchy (because of the way I imported images into Aperture). This script exports master and the xmp sidecar files. Before you try this script out make sure you have a backup of your Aperture Library. I don't think it does anything that could damage the library but it's better to be safe. Also if you have a large library, this script can take a LONG time to run. Any comments, problems, suggestions, curses, criticisms, etc are appreciated. Below is the script. -ron- global dest_root
tell application "Aperture"
activate
set dest_root to choose folder with prompt "Choose a folder to export into:"
-- Trim the final : from the file
set dr_len to length of (dest_root as string)
set dest_root_txt to rich text 1 thru (dr_len - 1) of (dest_root as string)
set dest_root to dest_root_txt
log dest_root
set this_library to library 1
set library_name to name of this_library
log library_name
tell this_library
--log name of this_library
set all_projects to projects
-- choose from list all_projects with prompt "Choose a project to export"
repeat with this_project in all_projects
-- set theP to item 1 of this_project
log "Project Found " & (name of this_project)
--set sub_alist to albums
--my doAlbums(sub_alist, library_name)
my doProjects(this_project, library_name)
--log (name of this_project) & " is class " & (class of this_project) as string
end repeat
end tell
end tell
on unwrap_container(this_obj, root_name)
tell application "Aperture"
set obj_path to {}
set this_name to ""
set cur_obj to this_obj
set tmp_parent to parent of this_obj
repeat until this_name is root_name
tell cur_obj
set this_parent to parent
end tell
set this_name to name of this_parent
copy this_name to beginning of obj_path
set cur_obj to this_parent
end repeat
return obj_path
end tell
end unwrap_container
on doAlbums(alist, this_root)
repeat with this_album in alist
set album_name to name of this_album
set album_path to my unwrap_container(this_album, this_root)
log album_name & "->" & album_path
set export_dir to (album_path & album_name)
--tell application "Finder"
-- set dest_dir to make new folder at dest_root with properties {name:export_dir}
--end tell
log export_dir
end repeat
end doAlbums
on doProjects(this_project, this_root)
set project_name to name of this_project
set project_path to my unwrap_container(this_project, this_root)
set path_name to my makeDir(project_path, project_name)
--set export_dir to (project_path & project_name)
--tell application "Finder"
-- set dest_dir to make new folder at dest_root with properties {name:export_dir}
--end tell
log project_name & "->" & path_name
my doUnsorted(this_project, dest_root & ":" & path_name)
end doProjects
on makeDir(this_path, folder_name)
tell application "Finder"
set path_name to ""
set up_path to dest_root
repeat with element in this_path
set path_name to path_name & element & ":"
-- log path_name & " - " & up_path
if not (exists folder element in alias up_path) then
make new folder at alias up_path with properties {name:element}
end if
set up_path to up_path & ":" & element
end repeat
if not (exists folder folder_name in alias up_path) then
make new folder at alias up_path with properties {name:folder_name}
end if
set path_name to path_name & folder_name
end tell
return path_name
end makeDir
on doUnsorted(this_obj, this_dir)
tell application "Aperture"
set obj_name to name of this_obj
-- get all images in container
set all_images to (image version of this_obj)
-- my_count is the number of images
set my_count to count all_images
-- Timeout of 15 Minutes
with timeout of 9000 seconds
export all_images to alias this_dir metadata sidecar
end timeout
--repeat with this_image in all_images
--set my_count to (my_count + 1)
--end repeat
end tell
log my_count
end doUnsorted0 -
The test of my script was done on a small piece of my library. This morning I started a test run of the full library and I will let it run while I'm at work. Will let you know how it turns out. My initial attempt to deal with albums is to make a text file with a list of all the images in that Album. For my use, I might just use finder actions in the script to create a directory with the name of the album and move the master files into there. This is most likely NOT what most people want so for the script for public consumption, I will most likely stick with outputting a file that contains the master source file for each image in the album and see if there is a way to coerce C1 into creating an album from a list of source images.
I will provide my updated script after I see how my test export works.
-ron-0 -
OK, first the bad news. There appears to be no way the get the location of the master file for an image in an album using applescript. Also the version name does not include the file extension and there doesn't seem to be a way to get that information either. I'll keep looking but for now it looks like albums will need to be regenerated manually.
The good news is I've been testing my applescript code and getting rid of nasty bugs so I should be close to releasing a new version. I've solved my personal organization problems by creating new folder/projects hierarchies (rather than my project/album organization) and luckily moving images from an album to a project moves the master files into that project. Problem solved 😄 So for the next release, my scripts will make the directory structure matching the Aperture library structure for folders and projects, export the master images and sidecar files, and output a text file with the list of version names for albums. Hopefully when I get home today, the full export will have completed successfully and I can send out the new version.
-ron-0 -
Here is the latest version of the script. I debugged it as much as possible and it successfully exported my Aperture library with no problems. If you choose to use it please make sure you have a backup of your library because even though the script should not do anything to the aperture library and it works for me, there is no guarantee that something bad might happen. Let me know if there are any issues or if you think I should do something differently. I'm happy to help with any problems or questions as much as I can.
-ron-global dest_root
global total_count
set total_count to 0
tell application "Aperture"
activate
set dest_root to choose folder with prompt "Choose a folder to export into:"
-- Trim the final : from the file
set dr_len to length of (dest_root as string)
set dest_root_txt to rich text 1 thru (dr_len - 1) of (dest_root as string)
set dest_root to dest_root_txt
log dest_root
set this_library to library 1
set library_name to name of this_library
log library_name
tell this_library
--log name of this_library
set all_projects to projects
-- choose from list all_projects with prompt "Choose a project to export"
repeat with this_project in all_projects
-- set theP to item 1 of this_project
log "Project Found " & (name of this_project)
set project_dir to my doProjects(this_project, library_name)
tell this_project to set sub_alist to albums
if sub_alist is not equal to {} then
my doAlbums(sub_alist, project_dir)
end if
--log (name of this_project) & " is class " & (class of this_project) as string
end repeat
end tell
end tell
log total_count & " Total Images Exported"
on unwrap_container(this_obj, root_name)
tell application "Aperture"
set obj_path to {}
set this_name to ""
set cur_obj to this_obj
set tmp_parent to parent of this_obj
repeat until this_name is root_name
tell cur_obj
set this_parent to parent
end tell
set this_name to name of this_parent
copy this_name to beginning of obj_path
set cur_obj to this_parent
end repeat
return obj_path
end tell
end unwrap_container
on doAlbums(alist, this_root)
set as_delim to this_root
set as_delim to my replaceString(as_delim, ":", "/")
set as_delim to as_delim & "/"
tell application "Aperture"
repeat with this_album in alist
set album_name to name of this_album
set album_name to my RemoveFromString(album_name, ":")
log "Album: " & album_name & "->" & this_root
set export_file to (this_root & ":" & album_name & ".lstx")
set fid to open for access export_file with write permission
tell this_album
--set all_images to every image version as list
set all_names to get the name of every image version
end tell
set AppleScript's text item delimiters to {"
/" & as_delim}
write as_delim to fid
write (all_names as string) to fid
set AppleScript's text item delimiters to {}
close access fid
end repeat
end tell
set AppleScript's text item delimiters to {}
end doAlbums
on doProjects(this_project, this_root)
set project_name to name of this_project
set project_path to my unwrap_container(this_project, this_root)
set path_name to my makeDir(project_path, project_name)
--set export_dir to (project_path & project_name)
--tell application "Finder"
-- set dest_dir to make new folder at dest_root with properties {name:export_dir}
--end tell
log "Project: " & project_name & "->" & path_name
my doUnsorted(this_project, dest_root & ":" & path_name)
--display dialog project_name with title "Project Exported" buttons {"OK"} giving up after 4
return dest_root & ":" & path_name
end doProjects
on makeDir(this_path, folder_name)
tell application "Finder"
set path_name to ""
set up_path to dest_root
repeat with element in this_path
set path_name to path_name & element & ":"
-- log path_name & " - " & up_path
if not (exists folder element in alias up_path) then
make new folder at alias up_path with properties {name:element}
end if
set up_path to up_path & ":" & element
end repeat
if not (exists folder folder_name in alias up_path) then
make new folder at alias up_path with properties {name:folder_name}
end if
set path_name to path_name & folder_name
end tell
return path_name
end makeDir
on doUnsorted(this_obj, this_dir)
set my_count to 0
tell application "Aperture"
set obj_name to name of this_obj
-- get all images in container
set all_images to (image version of this_obj)
-- my_count is the number of images
if all_images is not equal to {} then
set my_count to count all_images
-- Timeout of 30 Minutes
with timeout of 18000 seconds
export all_images to alias this_dir metadata sidecar
end timeout
end if
--repeat with this_image in all_images
--set my_count to (my_count + 1)
--end repeat
end tell
set total_count to total_count + my_count
log my_count & " Images Exported"
end doUnsorted
-- the following handlers were obtained from Brati's Lover
-- web site at http://applescript.bratis-lover.net
-- these were unmodified by me and used in accorance with
-- the copyright statement
--Permission is hereby granted, free of charge, to any person obtaining a copy
--of this software and associated documentation files (the "Software"), to deal
--in the Software without restriction, including without limitation the rights
--to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
--copies of the Software, and to permit persons to whom the Software is
--furnished to do so, subject to the following conditions:
-- The above copyright notice and this permission notice shall be included in
--all copies or substantial portions of the Software.
on RemoveFromString(theText, CharOrString)
-- ljr (http://applescript.bratis-lover.net/library/string/)
local ASTID, theText, CharOrString, lst
set ASTID to AppleScript's text item delimiters
try
considering case
if theText does not contain CharOrString then ¬
return theText
set AppleScript's text item delimiters to CharOrString
set lst to theText's text items
end considering
set AppleScript's text item delimiters to ASTID
return lst as text
on error eMsg number eNum
set AppleScript's text item delimiters to ASTID
error "Can't RemoveFromString: " & eMsg number eNum
end try
end RemoveFromString
-- e.g. replaceString("Hello hello", "hello", "Bye") --> "Hello Bye"
on replaceString(inText, oldString, newString)
-- ljr (http://applescript.bratis-lover.net/library/string/)
local ASTID, theText, oldString, newString, lst
set theText to inText
set ASTID to AppleScript's text item delimiters
try
considering case
set AppleScript's text item delimiters to oldString
set lst to every text item of theText
set AppleScript's text item delimiters to newString
set theText to lst as string
end considering
set AppleScript's text item delimiters to ASTID
return theText
on error eMsg number eNum
set AppleScript's text item delimiters to ASTID
error "Can't replaceString: " & eMsg number eNum
end try
end replaceString0 -
I forgot to add thanks to all those who have helped me with suggestions and guidance on how aperture organizes images and how my applescript code should function. I hope people find this useful and saves them time transitioning to Capture one.
-ron-0 -
Thanks Ron, I will check this out. Does this script apply equally to Referenced and Managed Libraries?
Can you tell me (only using C1 a week or so) what I should do then in C1?0 -
I guess something we should all keep in mind is that it may not be necessary to move all, or even significant parts of, an Aperture (or other) library into C1. The work done to organize, meta tag and adjust those images doesn't need to be done again in C1.
For me, I'll keep my library in Aperture for the foreseeable future. New images and projects will start in C1, now. I'll go back to Aperture to retrieve older files as I need them.
One day, maybe never, an OS upgrade will kill Aperture for good. That's the point I'll be alert for. Maybe Photo will be "good enough" to hold the old Aperture work as a repository. If not, perhaps then there will be good migration tools, such as the one developed here, readily available for the task.0 -
[quote="NNN635394991547550905" wrote:
Thanks Ron, I will check this out. Does this script apply equally to Referenced and Managed Libraries?
Can you tell me (only using C1 a week or so) what I should do then in C1?
Bob, it should work with both. I only have managed libraries so I cannot verify that it works on both and it also only works on the first library (I'm not sure how libraries work in aperture so I guess the correct statement is that it will only work on the currently open library). I'm still trying to figure out the second question. I might just generate an unmanaged catalog with my existing Aperture library and copy images I want or as I need them over to a new catalog. I am very new to C1 and have only opened the application a couple of times. Right now I'm going through the webinars to learn as much as I can about how it works before jumping in too much. I don't want to make the same mistakes I made with Aperture in terms of organization.0 -
OK one final post. I imported the images from the file structure into C1 and although it was slow, the import worked and I can work with image collections that were in Aperture Folders/Projects with the C1 folders section of the Library tab. It looks like the metadata that was written to the sidecar files was imported so items like keywords, ratings, etc are preserved. I have had no luck on Albums so it looks like those will need to be regenerated manually. So unless anybody has specific problems or needs anything changed, I am finished with the export script. Anybody is free to use and modify the script however they choose.
Thanks,
-ron-0
Post is closed for comments.
Comments
16 comments