Sunday, May 28, 2017

#1 2017-03-17 09:24:30 am

mmoraes
Member
Registered: 2017-01-19
Posts: 6

Moving, duplicating, overwriting

Hello, my friends! I'm working with videos on an event (so, it's live!), and I have this complicated scenario:

1- A camera is going to film the same thing several times, and each time it will creates a new file on the folder "01_Camera" on the desktop, for example.

2- This folder "01_Camera" has to be always empty for the new footage that are coming, so each new file has to be moved to the folder "02_Media" and copied to the folder "03_Backup".

3- The thing is: The folder "02_Media" has to have always ONLY ONE file, named "Film.cine" (because I will use it in a video editor program, refreshing each time)....... so every time a new footage comes to the folder "01_Camera", it has to be moved to the folder "02_Media" and renamed as "Film.cine" (overwriting the old file "Film.cine").

4- At the same time I have to maintain a copy of each footage file on the folder "03_Backup"


So at the end I have always the folder "01_Camera" empty, the folder "02_Media" with one file ("Film.cine") and the folder "03_Backups" with all the footage files.


Last thing: because videos are heavy, and I have to make it really fast, i'd like to not make a copy of the files on the folder "01_Camera" to the folder "02_Media", but moving it while renaming it. On the folder "03_Backup", I can make a copy because i have no hurry to use these files.

Is it possible? Thank you in advance!

Marcelo

Operating System: Mac OS X (10.10)


Filed under: moving, renaming, duplicating

Offline

 

#2 2017-03-17 11:24:18 am

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3007

Re: Moving, duplicating, overwriting

You may use that :

Applescript:

use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"

# Most code borrowed from Shane STANLEY

on adding folder items to this_folder after receiving these_items
   set FilmCine to "Film.cine"
   set name2 to "02_Media"
   set name3 to "03_Backup"
   set thePOSIXPath to POSIX path of these_items's item 1
   # Get the URL pointing to the folder containing this_folder
   set {name1, URLContainer} to my getNameAndContainer:(POSIX path of this_folder)
   # Build the URL pointing to the folder "02_Media"
   set URL2 to my buildFullPath:name2 inFolder:URLContainer
   # Build the URL pointing to the folder "03_Backup"
   set URL3 to my buildFullPath:name3 inFolder:URLContainer
   # Copy in "02_Media2" as "Film.cine"
   my copyThis:thePOSIXPath intoFolder:URL2 withName:FilmCine
   # Move to "03_Backup"
   my movePath:thePOSIXPath toFolder:URL3
end adding folder items to

#=====#=====#=====#=====#=====#=====

on copyThis:POSIXPath intoFolder:theFolderURL withName:destName
   local |⌘|, theSourceURL, theDestURL
   set |⌘| to current application
   set theSourceURL to |⌘|'s |NSURL|'s fileURLWithPath:POSIXPath
   set theDestURL to theFolderURL's URLByAppendingPathComponent:destName
   set theFileManager to |⌘|'s NSFileManager's |defaultManager|()
   set {theResult, theError} to theFileManager's createDirectoryAtURL:theFolderURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
   --set {theResult, theError} to theFileManager's createDirectoryAtURL:destURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
   my copyFromURL:theSourceURL toURL:theDestURL withReplacing:true
end copyThis:intoFolder:withName:

#=====

-- This handler is called by other handlers, and is not meant to called directly
on copyFromURL:sourceURL toURL:destinationURL withReplacing:replaceFlag
   set |⌘| to current application
   set theFileManager to |⌘|'s NSFileManager's |defaultManager|()
   set {theResult, theError} to (theFileManager's copyItemAtURL:sourceURL toURL:destinationURL |error|:(reference))
   if not theResult as boolean then
       if replaceFlag and (theError's code() as integer = |⌘|'s NSFileWriteFileExistsError as integer) then -- it already exists, so try replacing
           -- create suitable temporary directory in destinationURL's parent folder
           set {tempFolderURL, theError} to theFileManager's URLForDirectory:(|⌘|'s NSItemReplacementDirectory) inDomain:(|⌘|'s NSUserDomainMask) appropriateForURL:(destinationURL's |URLByDeletingLastPathComponent|()) create:true |error|:(reference)
           if tempFolderURL = missing value then error (theError's |localizedDescription|() as text) -- failed, so return error
           -- copy sourceURL to temp directory
           set tempDestURL to tempFolderURL's URLByAppendingPathComponent:(destinationURL's |lastPathComponent|())
           set {theResult, theError} to theFileManager's copyItemAtURL:sourceURL toURL:tempDestURL |error|:(reference)
           if not theResult as boolean then
               -- copy failed, so delete temporary directory and return error
               theFileManager's removeItemAtURL:tempFolderURL |error|:(missing value)
               error (theError's |localizedDescription|() as text)
           end if
           -- replace existing file with temp file atomically, then delete temp directory
           set {theResult, theError} to theFileManager's replaceItemAtURL:destinationURL withItemAtURL:tempDestURL backupItemName:(missing value) options:(|⌘|'s NSFileManagerItemReplacementUsingNewMetadataOnly) resultingItemURL:(missing value) |error|:(reference)
           theFileManager's removeItemAtURL:tempFolderURL |error|:(missing value)
           -- if replacement failed, return error
           if not theResult as boolean then error (theError's |localizedDescription|() as text)
       else -- replaceFlag is false or an error other than file already exists, so return error
           error (theError's |localizedDescription|() as text)
       end if
   end if
end copyFromURL:toURL:withReplacing:

#=====#=====#=====#=====#=====#=====

on movePath:posixSource toFolder:destURL
   local |⌘|, theSourceURL, destURL, shortURL, origName, theFileManager, theResult, theError, destName
   set |⌘| to current application
   set theSourceURL to |⌘|'s |NSURL|'s fileURLWithPath:posixSource
   set theFileManager to |⌘|'s NSFileManager's |defaultManager|()
   set {theResult, theError} to theFileManager's createDirectoryAtURL:destURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
   --if not (theResult as boolean) then error (theError's |localizedDescription|() as text)
   # maintenant, move cheminPosixDuFichierSource item
   set destName to theSourceURL's |lastPathComponent|()
   set destURL to destURL's URLByAppendingPathComponent:destName
   my moveFromURL:theSourceURL toURL:destURL withReplacing:true
   --return destURL's |path| as text
end movePath:toFolder:

#=====

-- This handler is called by other handlers, and is not meant to called directly
on moveFromURL:sourceURL toURL:destinationURL withReplacing:replaceFlag
   set |⌘| to current application
   set theFileManager to |⌘|'s NSFileManager's |defaultManager|()
   set {theResult, theError} to (theFileManager's moveItemAtURL:sourceURL toURL:destinationURL |error|:(reference))
   if not theResult as boolean then
       if replaceFlag and (theError's code() = |⌘|'s NSFileWriteFileExistsError) then -- it already exists, so try replacing
           -- replace existing file with temp file atomically, then delete temp directory
           set {theResult, theError} to theFileManager's replaceItemAtURL:destinationURL withItemAtURL:sourceURL backupItemName:(missing value) options:(|⌘|'s NSFileManagerItemReplacementUsingNewMetadataOnly) resultingItemURL:(missing value) |error|:(reference)
           -- if replacement failed, return error
           if not theResult as boolean then error (theError's |localizedDescription|() as text)
       else -- replaceFlag is false or an error other than file already exists, so return error
           error (theError's |localizedDescription|() as text)
       end if
   end if
end moveFromURL:toURL:withReplacing:

#=====#=====#=====#=====#=====#=====

on buildFullPath:proposedName inFolder:theFolderURL
   local |⌘|, proposedName, theDestURL
   
   set |⌘| to current application
   if class of proposedName is text then set proposedName to |⌘|'s NSString's stringWithString:proposedName
   set proposedName to proposedName's stringByReplacingOccurrencesOfString:"/" withString:":"
   set theDestURL to theFolderURL's URLByAppendingPathComponent:proposedName
   
   return theDestURL
end buildFullPath:inFolder:

#=====#=====#=====#=====#=====#=====

on getNameAndContainer:POSIXPath
   local theURL, POSIXContainer, PosixName
   
   set theURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
   set POSIXContainer to theURL's URLByDeletingLastPathComponent()
   set PosixName to (theURL's lastPathComponent()) as text
   # ATTENTION, Sierra ne met pas le / final
   
   return {PosixName, POSIXContainer}
end getNameAndContainer:

#=====#=====#=====#=====#=====#=====

Yvan KOENIG running Sierra 10.12.3 in French (VALLAURIS, France) vendredi 17 mars 2017 17:23:48

Offline

 

#3 2017-03-17 03:48:11 pm

mmoraes
Member
Registered: 2017-01-19
Posts: 6

Re: Moving, duplicating, overwriting

Uou! It's really complicated...

I'm quite new on this thing and I couldn't understand the script... anyway I've tried to attach it to the folder and nothing happened...

do I have to make any adjustment on the script (like on the paths, for exemple) to work in my folders? Where it should be?

Thank you!

Operating System: Mac OS X (10.10)

Offline

 

#4 2017-03-18 04:46:02 am

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3007

Re: Moving, duplicating, overwriting

Here I created a folder named "01_Camera" on the desktop (in fact the folder name is never used) then I attached the script.
I dropped the file testFile copie.txt onto the folder icon and the folders 02_Media and 03_Backup where created with the file Film.cine in 02_Media and the file testFile copie.txt in 03_Backup.

I see no instruction able to kill the script in 10.10 (Yosemite).
Disable the folder action
Open the script
Edit the main handler as :

Applescript:

--on adding folder items to this_folder after receiving these_items # DISABLED

set this_folder to (path to desktop as text) & "01_Camera" # ADDED
set these_items to {this_folder & "a.file"} # adjust the name to the file available # ADDED

set FilmCine to "Film.cine"
set name2 to "02_Media"
set name3 to "03_Backup"
set thePOSIXPath to POSIX path of these_items's item 1
# Get the URL pointing to the folder containing this_folder
set {name1, URLContainer} to my getNameAndContainer:(POSIX path of this_folder)
# Build the URL pointing to the folder "02_Media"
set URL2 to my buildFullPath:name2 inFolder:URLContainer
# Build the URL pointing to the folder "03_Backup"
set URL3 to my buildFullPath:name3 inFolder:URLContainer
# Copy in "02_Media2" as "Film.cine"
my copyThis:thePOSIXPath intoFolder:URL2 withName:FilmCine
# Move to "03_Backup"
my movePath:thePOSIXPath toFolder:URL3
--end adding folder items to # DISABLED

execute the script.
You will see if it works or at which instruction it fails.

I will look again in Xcode help to check if I missed a feature requiring 10.11.


Yvan KOENIG running Sierra 10.12.3 in French (VALLAURIS, France) samedi 18 mars 2017 10:45:54

Offline

 

#5 2017-03-18 05:33:15 am

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3007

Re: Moving, duplicating, overwriting

Here is an old fashioned script doing the job.

Applescript:

on adding folder items to this_folder after receiving these_items
   
   --set these_items to {((path to desktop as text) & "01_kamera:testFile copie.txt") as alias}
   --tell application "Finder" to set this_folder to container of these_items's item 1
   
   set FilmCine to "Film.cine"
   set name2 to "02_Media"
   set name3 to "03_Backup"
   
   tell application "Finder"
       # Extracts the path of container of this_folder
       set theContainer to (container of this_folder) as text
       # Extracts the dropped file
       set theFile to these_items's item 1
       # Builds the path to folder 02_Media
       set pathToFolder2 to theContainer & name2
       # Creates folder 02_Media if it doesn't exist
       if not (exists folder pathToFolder2) then make new folder at folder theContainer with properties {name:name2}
       # Builds the path to folder 03_Backup
       set pathToFolder3 to theContainer & name3
       # Creates folder 03_Backup if it doesn't exist
       if not (exists folder pathToFolder3) then make new folder at folder theContainer with properties {name:name3}
       # Builds the path to the file Film.cine
       set path2FilmCine to pathToFolder2 & ":" & FilmCine
       # If the file already exists, delete it
       if exists item path2FilmCine then delete item path2FilmCine
       duplicate theFile to folder pathToFolder2 # returns a reference to the copied file
       # Rename the copied file
       set name of result to FilmCine
       move theFile to folder pathToFolder3
   end tell
end adding folder items to

Yvan KOENIG running Sierra 10.12.3 in French (VALLAURIS, France) samedi 18 mars 2017 11:33:09

Last edited by Yvan Koenig (2017-03-18 09:03:13 am)

Offline

 

#6 2017-03-18 09:49:27 am

mmoraes
Member
Registered: 2017-01-19
Posts: 6

Re: Moving, duplicating, overwriting

Thank you so much!!

The old fashioned script worked very well!

The other one, I got this result:

error "|NSURL| doesn’t understand the “fileURLWithPath_” message." number -1708 from NSURL

(it was referring to the last part of the script)




#=====#=====#=====#=====#=====#=====

on getNameAndContainer:POSIXPath
    local theURL, POSIXContainer, PosixName
   
    set theURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
    set POSIXContainer to theURL's URLByDeletingLastPathComponent()
    set PosixName to (theURL's lastPathComponent()) as text
    # ATTENTION, Sierra ne met pas le / final
   
    return {PosixName, POSIXContainer}
end getNameAndContainer:

#=====#=====#=====#=====#=====#=====

Offline

 

#7 2017-03-18 10:38:52 am

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3007

Re: Moving, duplicating, overwriting

mmoraes wrote:

Thank you so much!!

The old fashioned script worked very well!

The other one, I got this result:

error "|NSURL| doesn’t understand the “fileURLWithPath_” message." number -1708 from NSURL

(it was referring to the last part of the script)




#=====#=====#=====#=====#=====#=====

on getNameAndContainer:POSIXPath
    local theURL, POSIXContainer, PosixName
   
    set theURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
    set POSIXContainer to theURL's URLByDeletingLastPathComponent()
    set PosixName to (theURL's lastPathComponent()) as text
    # ATTENTION, Sierra ne met pas le / final
   
    return {PosixName, POSIXContainer}
end getNameAndContainer:

#=====#=====#=====#=====#=====#=====

I'm quite sure that you dropped at least one instruction at the beginning of the original script.

Applescript:

use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation" # this one

I may replicate what you describe if I disable the instruction use framework "Foundation"
Did you used the button [Open this Scriplet in your Editor] or  used copy/paste to get the script in your editor?


Yvan KOENIG running Sierra 10.12.3 in French (VALLAURIS, France) samedi 18 mars 2017 16:38:03

Offline

 

#8 2017-03-21 09:15:10 am

mmoraes
Member
Registered: 2017-01-19
Posts: 6

Re: Moving, duplicating, overwriting

Yes, that's it...

I had not the framework "Foundation" activated.

Thank you very much!

Offline

 

Board footer

Powered by FluxBB

[ Generated in 0.089 seconds, 11 queries executed ]

RSS (new topics) RSS (active topics)