Skip to main content

⚠️ Please note that this topic or post has been archived. The information contained here may no longer be accurate or up-to-date. ⚠️

Moving an Aperture library over to Capture One

Comments

16 comments

  • BobRockefeller
    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
  • Ronald Lipps
    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
  • ymatto
    [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
  • Ronald Lipps
    [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
  • ymatto
    [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
  • Ronald Lipps
    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
  • Ronald Lipps
    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 doUnsorted

    0
  • Ronald Lipps
    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
  • Ronald Lipps
    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
  • Ronald Lipps
    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 replaceString
    0
  • Ronald Lipps
    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
  • Tommy Weir
    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
  • BobRockefeller
    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
  • Ronald Lipps
    [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
  • Ronald Lipps
    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.