Wednesday, March 11, 2009

AppleScript to automatically add file extensions

First off, I have to point you to http://www.macwindows.com/convertr.html. That is where I found the original script to modify for my needs, so thank you for that. I needed to set up a folder using folder actions (see previous post) that would check a file put in a folder to see what type of file it was, and if it didn't have the correct extension, it would add it to the filename. At first I didn't think it was possible, but then I ran across this script and the idea of File Creator and File Type (see previous post). If you know what the file type and file creator are for a file, and you also know what the extension should be for that combination, you can program it with AppleScript. The previous post has a link to a free program that makes it easy to find both of those values for any particular file. The main project I was given was to rename art/design files created with Quark, Illustrator, InDesign, Photoshop, and Acrobat. This covers various extensions: eps, qxd, ai, indd, pdf, tif, and jpg. You could tweak it to your needs, or add more, using some copy/paste action, and also the FileType program from the previous post. I apologize in advance for the poor formatting, but it was either this or post a screenshot, and this way you can use copy/paste. Be aware that because of the formatting, simply copying and pasting will probably cause the code to not compile. You'll most likely need to try compiling, and then go through the code in your AppleScript editor, adding carriage returns where needed so the commands are lined up correctly. Use this code to create a new AppleScript, then enable Folder Actions on a folder and attach the script to that folder. After you do that, each time you add a file to that folder, the system will run the script, check what type of file it is, and add the extension if needed. Anyway, here is the final AppleScript that I came up with, and it seems to be working fine for the users who have been using it.

If you have a need to add the file extension and also remove or replace certain characters from the file name, check out my newer post about using Applescript for the removing or replacing.
________________________________

EPSF (eps), AI (ai), PDF (pdf), ART5 is Illustrator

indd = Creator: InDn, Type: IDd5
indd = Creator: InDn, Type: IDd4
ai = Creator: ART5, Type: PDF
eps = Creator: ART5, Type: EPSF
psd = Creator: 8BIM, Type: 8BPS
pdf = Creator: CARO, Type: PDF
jpg = Creator: 8BIM, Type: JPEG
eps = Creator: 8BIM, Type: EPSF
qxd = Creator: XPR3, Type: XPRJ
tif = Creator: 8BIM, Type: TIFF
*)

-- THESE PROPERTIES ARE FOR THE NOTIFICATION ROUTINE
-- if true, the script will speak the alert. If false, the script will 
--display an alert

property speak_alert : false 

-- set the amount of time before dialogs auto-answer.dialog
property dialog_timeout : 30

-- THIS PROPERTY IS USED TO INDICATE WHETHER THE SCRIPT 
--CHECKS THE INCOMING FILES FOR COMPLETED TRANSFER
-- SET THIS PROPERTY TO TRUE FOR FOLDERS SHARED VIA 
--FILE SHARING
-- NOTE THAT ITEMS DROPPED IN SHARED FOLDERS WILL 
--HAVE THEIR LABEL SET TO 7

property copy_checks_indicator : false

-- THESE PROPERTIES ARE FOR THE STATUS CHECKING 
--ROUTINES
property item_check_delay_time : 2
property folder_check_delay_time : 3
property special_label_index : 7

on adding folder items to this_folder after receiving added_items
try
if copy_checks_indicator is true then
 -- CHECK THE FILES TO MAKE SURE THEY'RE 
--COMPLETELY AVAILABLE
set the added_items to my check_added_items(the added_items)

if the added_items is {} then return "no valid items"
end if

tell application "Finder"
 --get the name of the folder
set this_folder_name to the name of this_folder
end tell

-- find out how many new items have been placed in the folder
set new_item_count to the number of items in the added_items

tell application "Finder"
repeat with x in added_items
copy name of x as string to FileName
copy file type of x as string to FileType
copy creator type of x as string to FileCreator
-- check for Quark
if FileType is "XPRJ" and FileCreator is "XPR3" then
if FileName does not end with ".qxd" then
set Suffix to ".qxd"
set the name of x to FileName & Suffix
end if

else if FileType is "XDOC" and FileCreator is "XPR3" then
if FileName does not end with ".qxd" then
set Suffix to ".qxd"
set the name of x to FileName & Suffix
end if
-- check for Illustrator ai
else if FileType is "PDF" and FileCreator is "ART5" then
if FileName does not end with ".ai" then
set Suffix to ".ai"
set the name of x to FileName & Suffix
end if
-- check for InDesign
else if FileType is "InDn" and FileCreator is "IDd5" then
if FileName does not end with ".indd" then
set Suffix to ".indd"
set the name of x to FileName & Suffix
end if

--check for InDesign CS2
else if FileType is "InDn" and FileCreator is "IDd4" then
if FileName does not end with ".indd" then
set Suffix to ".indd"
set the name of x to FileName & Suffix
end if
-- check for Illustrator eps
else if FileType is "EPSF" and FileCreator is "ART5" then
if FileName does not end with ".eps" then
set Suffix to ".eps"
set the name of x to FileName & Suffix
end if
-- check for Photoshop psd
else if FileType is "8BPS" and FileCreator is "8BIM" then
if FileName does not end with ".psd" then
set Suffix to ".psd"
set the name of x to FileName & Suffix
end if
-- check for Photoshop tif
else if FileType is "TIFF" and FileCreator is "8BIM" then
if FileName does not end with ".tif" then
set Suffix to ".tif"
set the name of x to FileName & Suffix
end if
-- check for Photoshop jpg
else if FileType is "JPEG" and FileCreator is "8BIM" then
if FileName does not end with ".jpg" then
set Suffix to ".jpg"
set the name of x to FileName & Suffix
end if

-- check for pdf
else if FileType is "PDF" and FileCreator is "CARO" then
if FileName does not end with ".pdf" then
set Suffix to ".pdf"
set the name of x to FileName & Suffix
end if
end if
end repeat
end tell

on error
end try
end adding folder items to

on remove_labels(the added_items)
tell application "Finder" repeat with this_item in the added_items
set the label index of this_item to
end repeat
end tell
end remove_labels

on check_added_items(the added_items)
-- check the transfer status of every added file to determine
-- if each file has completed being moved into the 
--attached folder

set the notbusy_items to {}
repeat with i from 1 to the number of items in the added_items
set this_item to (item i of the added_items)
if my check_busy_status(this_item) is false then
set the end of the notbusy_items to this_item
end if
end repeat
return the notbusy_items
end check_added_items

on check_busy_status(this_item)
-- a folder can contain items partially transfered
-- this routine will wait for all the folder contents to transfer

if the last character of (this_item as text) is ":" then
set the check_flag to false
repeat

-- look for any files within the folder that are still transferring
tell application "Finder"
try
set the busy_items to the name of every file of the entire contents of this_item whose file type begins with "bzy"
on error 
set the busy_items to {}
end try
end tell

if the check_flag is true and the busy_items is {} then
return false
-- pause for the indicated time
delay the folder_check_delay_time

-- set the flag and check again
set the check_flag to true
end repeat
else 
-- the passed item is a single file, suitcase, clipping, etc.
-- check the label of the item. If it is the marked label 
--then it's already been processed so ignore.
tell application "Finder"
if (the label index of this_item) as integer is the special_label_index then
return "ignore"

end if
end tell

set the check_flag to false
repeat
tell application "Finder"
set the item_file_type to the file type of this_item
end tell

if the check_flag is true and the item_file_type does not start with "bzy" then
tell application "Finder"
set the label index of this_item to the special_label_index
end tell

-- allow the Finder time to change the label
delay the item_check_delay_time
return false
else if the item_file_type does not start with "bzy" then
-- set the flag and check again
set the check_flag to true
end if
-- pause for the indicated time
delay the item_check_delay_time
end repeat
end if
end check_busy_status

--HANDLER FOR KEEPING THIS FOLDER OPEN

--To activate the handler, remove the comment 
--markers (the parens and asterisks)
--at the beginning and end of the following handler 
--and save this script.

(*
on closing folder window for this_folder
beep
tell application "Finder"
open this_folder
end tell
end closing folder window for
*)

No comments: