Thanks Nigel
I would have certainly not build that.
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) dimanche 16 avril 2017 19:52:52
Thanks Nigel
I would have certainly not build that.
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) dimanche 16 avril 2017 19:52:52
Hi Yvan.
I’ve just shortened it considerably!
Although they’ll still get bitten if they’re fans of Beyoncé…
But the version for use with mdls is slightly longer:
use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"
# Decode the string extracted by mdls from the metadata.
my decodeText("Le garA\\U0303\\U00a7on est arrivA\\U0303\\U00a9.")
my decodeText("Le gar\\U00e7on est arrive\\U0301.")
on decodeText(theText)
set |⌘| to current application
set theText to |⌘|'s class "NSString"'s stringWithString:(theText)
-- Set up and use a regex to find Unicode substitute expressions of the garbled kind (misderived from UTF-8 sequences).
set aHandyRegex to |⌘|'s class "NSRegularExpression"'s regularExpressionWithPattern:("([[:alpha:]]\\\\U[[:hex:]]{4})(\\\\U[[:hex:]]{4})") options:(0) |error|:(missing value)
set regexMatches to aHandyRegex's matchesInString:(theText) options:(0) range:({0, theText's |length|()})
set matchCount to (count regexMatches)
-- If none are found, look for Unicode substitute expressions of the correct kind instead.
set containsGarbledBlips to (matchCount > 0)
if (not containsGarbledBlips) then
set aHandyRegex to |⌘|'s class "NSRegularExpression"'s regularExpressionWithPattern:("(\\\\U[[:hex:]]{4})") options:(0) |error|:(missing value)
set regexMatches to aHandyRegex's matchesInString:(theText) options:(0) range:({0, theText's |length|()})
set matchCount to (count regexMatches)
end if
-- If either kind is found, reconstitute the original characters and substitute them for the matched expressions.
if (matchCount > 0) then
set theText to theText's mutableCopy()
repeat with i from (count regexMatches) to 1 by -1 -- Reverse loop because theText's length will change.
-- With each match, get the text matching the first first capture group in the regex.
set thisMatch to item i of regexMatches
set subrange1 to (thisMatch's rangeAtIndex:(1))
set component1 to (theText's substringWithRange:(subrange1))
-- Convert it to data using 7-bit ASCII encoding.
set dataObj to (component1's dataUsingEncoding:(|⌘|'s NSASCIIStringEncoding))
-- Convert it back to a character using "non-lossy ASCII" encoding.
set reconstitutedCharacter to (|⌘|'s class "NSString"'s alloc()'s initWithData:(dataObj) encoding:(|⌘|'s NSNonLossyASCIIStringEncoding))
-- If dealing with misderived expressions, perform a further twiddle.
if (containsGarbledBlips) then
-- Get the text matching the other capture group in the regex.
set subrange2 to (thisMatch's rangeAtIndex:(2))
set component2 to (theText's substringWithRange:(subrange2))
-- Convert that to data using 7-bit ASCII encoding.
set dataObj to (component2's dataUsingEncoding:(|⌘|'s NSASCIIStringEncoding))
-- Convert it back to a character using "non-lossy ASCII" encoding.
set component2 to (|⌘|'s class "NSString"'s alloc()'s initWithData:(dataObj) encoding:(|⌘|'s NSNonLossyASCIIStringEncoding))
-- Convert the first character back to data, now with ISO Latin-1 encoding.
set dataObj to (reconstitutedCharacter's dataUsingEncoding:(|⌘|'s NSISOLatin1StringEncoding))'s mutableCopy()
-- Convert the second character to data too and append it to the data from the first.
tell dataObj to appendData:(component2's dataUsingEncoding:(|⌘|'s NSISOLatin1StringEncoding))
-- Convert the combination back to a single character using UTF-8 encoding.
set reconstitutedCharacter to (|⌘|'s class "NSString"'s alloc()'s initWithData:(dataObj) encoding:(|⌘|'s NSUTF8StringEncoding))
end if
-- Replace the whole of the matched expression in the text with the character derived from it.
tell theText to replaceCharactersInRange:(thisMatch's range()) withString:(reconstitutedCharacter)
end repeat
end if
return theText -- as text
end decodeText
Ah yes. Or of Blue Öyster Cult. Mmm. That ages me …
In case there’s anyone still hanging in here, I maintain that making these “corrections” is wrong. If the file says “François”, even if the correct name is “François”, the code should return what the file (and iTunes) says, in this case “François”.
I tend to agree, although maybe it should be that the main code should return what the file says and a “correction” after-process can be bolted on if people like Yvan so wish.
I wrote the correction handlers mainly out of interest and for the challenge. They only handle the situations I currently know about and assume that intended eight-bit-or-more characters aren’t adjacent to each other in the text.
I apologizes but in the case of the example which I gave,“David Guetta, Giorgio Tuinfort, Frédéric Riesterer, Taio Cruz, Nick Van De Wall, Rico Love, Raymond Usher & Aviici”,
iTunes displays only the first author “David Guetta”
I’m curious and wish to get readable strings.
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) lundi 17 avril 2017 12:45:42
Nothing to apologize for – it took long enough for the penny to drop here. It could well be that “official” metadata format is ambiguous anyhow.
Any ideas on how to stop the script from moving files that have null in any of the below fields. I can get it to prompt but it continues to move the file.
This is the last part I need to work.
#SOME MP3 TAGS ARE NOT PROPERLY FILLED OUT- THIS BELOW PART DOESNT WORK AS SCRIPT PROCEEDS??????. # problem solved below
if (count theGenre) ≤ (count "(null)") and theGenre contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Genre)"
if (count theArtist) ≤ (count "(null)") and theArtist contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Artist)"
if (count theTempo) ≤ (count "(null)") and theTempo contains "null" then display dialog "Error: " & (theFile as text) & " has a blank field - Please Fix (no Tempo)"
if (count theKey) ≤ (count "(null)") and theKey contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Key)"
Go to messages #53 &54
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) mardi 18 avril 2017 15:36:18
the above script doesn’t work. I selected the mp3, it only creates the genre and artist folder path but doesn’t move the actual file.
Is there any chance you could modify the below?. So that it doesn’t move the file if the genre,artist,key and tempo are equal to null.
FYI the mp3/aiff I use come from beatport so all the BPM,Key etc are filled out when you buy them. However sometimes I might select a folder that may not contain Beatport mp3s within, hence why I don’t want to move them.
use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"
on listFolder:POSIXPath # handler using ASObjC
set fileManager to current application's NSFileManager's defaultManager()
set aURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
set theOptions to (current application's NSDirectoryEnumerationSkipsPackageDescendants as integer) + (current application's NSDirectoryEnumerationSkipsHiddenFiles as integer)
set theEnumerator to fileManager's enumeratorAtURL:aURL includingPropertiesForKeys:{} options:theOptions errorHandler:(missing value)
set theFiles to theEnumerator's allObjects()
set theFiles to theFiles's filteredArrayUsingPredicate:(current application's NSPredicate's predicateWithFormat:"(lastPathComponent ENDSWITH '.mp3') OR (lastPathComponent ENDSWITH '.aiff')")
return theFiles as list # if we work upon files
--return (theFiles's valueForKey:"path") as list # if we work upon POSIX paths
end listFolder:
-- Creates a new folder. There is no error if the folder already exists, and it will also create intermediate folders if required
on createFolder:POSIXPath
set |⌘| to current application
set theFolderURL to |⌘|'s |NSURL|'s fileURLWithPath:POSIXPath
set theFileManager to |⌘|'s NSFileManager's defaultManager()
set {theResult, theError} to theFileManager's createDirectoryAtURL:theFolderURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
if not (theResult as boolean) then error (theError's |localizedDescription|() as text)
end createFolder:
set theFolder to choose folder with prompt "Please select a folder containing MP3/AIFF files" # ADDED
set theFiles to its listFolder:(POSIX path of theFolder) # ADDED
repeat with aFile in theFiles
my treatThisFile(aFile)
end repeat
on treatThisFile(theFile)
set posixFilePath to the quoted form of (POSIX path of theFile)
set genreTag to (do shell script "mdls " & posixFilePath & " -name kMDItemMusicalGenre")
set artistTag to (do shell script "mdls " & posixFilePath & " -name kMDItemAuthors")
set tempoTag to (do shell script "mdls " & posixFilePath & " -name kMDItemTempo")
set keyTag to (do shell script "mdls " & posixFilePath & " -name kMDItemKeySignature")
set titleTag to (do shell script "mdls " & posixFilePath & " -name kMDItemTitle")
set theGenre to text ((offset of "= " in genreTag) + 3) through -2 of genreTag
set theArtist to text ((offset of "= " in artistTag) + 9) through -4 of artistTag
set theTempo to text ((offset of "= " in tempoTag) + 2) through -1 of tempoTag
set theKey to text ((offset of "= " in keyTag) + 3) through -2 of keyTag
set theTitle to text ((offset of "= " in titleTag) + 3) through -2 of titleTag
#SOME MP3 TAGS ARE NOT PROPERLY FILLED OUT- THIS BELOW PART DOESNT WORK AS SCRIPT PROCEEDS??????. # problem solved below
if (count theGenre) ≤ (count "(null)") and theGenre contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Genre)"
if (count theArtist) ≤ (count "(null)") and theArtist contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Artist)"
if (count theTempo) ≤ (count "(null)") and theTempo contains "null" then display dialog "Error: " & (theFile as text) & " has a blank field - Please Fix (no Tempo)"
if (count theKey) ≤ (count "(null)") and theKey contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Key)"
# For some files, theTitle is returned as "null" or "(null)" so it may generate duplicates # Edited
# I choose to use the original name deprieved of the extension
if (count theTitle) ≤ (count "(null)") and theTitle contains "null" then # EDITED
tell application "System Events" # ADDED
set theTitle to text 1 thru -5 of (get name of file (theFile as text))
end tell
end if
set renamedTitle to ("{" & theTempo & "-" & theKey & "} " & theTitle)
set DestFolder to ("/Volumes/Production/test/" & theGenre & "/" & theArtist)
--set DestFolder to ("/Volumes/Macintosh HD/Users/Important/Test/" & theGenre & "/" & theArtist)
my createFolder:DestFolder
set DestFolder to POSIX file DestFolder
set theFile to (theFile as text) as alias # ADDED. Finder refuse to get extension or rename the object returned by the ASObjC handler
tell application "Finder"
set theExtension to name extension of theFile
set name of theFile to renamedTitle & "." & theExtension #AS MAYBE AIFF OR MP3
try
move theFile to DestFolder
on error errMsg
display dialog renamedTitle & errMsg # IF ALREADY EXISTS WILL PROMPT
end try
end tell
end treatThisFile
Go to messages #53 &54
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) mercredi 19 avril 2017 10:20:41
I got this below error with the long script.
error "You don't have permission to save the file "Derek Howell" in the folder "Progressive House"." number -2700 from «script» to item
Can you please amend the below script (the first one) to not move null mp3s.
use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"
on listFolder:POSIXPath # handler using ASObjC
set fileManager to current application's NSFileManager's defaultManager()
set aURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
set theOptions to (current application's NSDirectoryEnumerationSkipsPackageDescendants as integer) + (current application's NSDirectoryEnumerationSkipsHiddenFiles as integer)
set theEnumerator to fileManager's enumeratorAtURL:aURL includingPropertiesForKeys:{} options:theOptions errorHandler:(missing value)
set theFiles to theEnumerator's allObjects()
set theFiles to theFiles's filteredArrayUsingPredicate:(current application's NSPredicate's predicateWithFormat:"(lastPathComponent ENDSWITH '.mp3') OR (lastPathComponent ENDSWITH '.aiff')")
return theFiles as list # if we work upon files
--return (theFiles's valueForKey:"path") as list # if we work upon POSIX paths
end listFolder:
-- Creates a new folder. There is no error if the folder already exists, and it will also create intermediate folders if required
on createFolder:POSIXPath
set |⌘| to current application
set theFolderURL to |⌘|'s |NSURL|'s fileURLWithPath:POSIXPath
set theFileManager to |⌘|'s NSFileManager's defaultManager()
set {theResult, theError} to theFileManager's createDirectoryAtURL:theFolderURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
if not (theResult as boolean) then error (theError's |localizedDescription|() as text)
end createFolder:
set theFolder to choose folder with prompt "Please select a folder containing MP3/AIFF files" # ADDED
set theFiles to its listFolder:(POSIX path of theFolder) # ADDED
repeat with aFile in theFiles
my treatThisFile(aFile)
end repeat
on treatThisFile(theFile)
set posixFilePath to the quoted form of (POSIX path of theFile)
set genreTag to (do shell script "mdls " & posixFilePath & " -name kMDItemMusicalGenre")
set artistTag to (do shell script "mdls " & posixFilePath & " -name kMDItemAuthors")
set tempoTag to (do shell script "mdls " & posixFilePath & " -name kMDItemTempo")
set keyTag to (do shell script "mdls " & posixFilePath & " -name kMDItemKeySignature")
set titleTag to (do shell script "mdls " & posixFilePath & " -name kMDItemTitle")
set theGenre to text ((offset of "= " in genreTag) + 3) through -2 of genreTag
set theArtist to text ((offset of "= " in artistTag) + 9) through -4 of artistTag
set theTempo to text ((offset of "= " in tempoTag) + 2) through -1 of tempoTag
set theKey to text ((offset of "= " in keyTag) + 3) through -2 of keyTag
set theTitle to text ((offset of "= " in titleTag) + 3) through -2 of titleTag
#SOME MP3 TAGS ARE NOT PROPERLY FILLED OUT- THIS BELOW PART DOESNT WORK AS SCRIPT PROCEEDS??????. # problem solved below
if (count theGenre) ≤ (count "(null)") and theGenre contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Genre)"
if (count theArtist) ≤ (count "(null)") and theArtist contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Artist)"
if (count theTempo) ≤ (count "(null)") and theTempo contains "null" then display dialog "Error: " & (theFile as text) & " has a blank field - Please Fix (no Tempo)"
if (count theKey) ≤ (count "(null)") and theKey contains "null" then display dialog "Error: " & theTitle & " has a blank field - Please Fix (no Key)"
# For some files, theTitle is returned as "null" or "(null)" so it may generate duplicates # Edited
# I choose to use the original name deprieved of the extension
if (count theTitle) ≤ (count "(null)") and theTitle contains "null" then # EDITED
tell application "System Events" # ADDED
set theTitle to text 1 thru -5 of (get name of file (theFile as text))
end tell
end if
set renamedTitle to ("{" & theTempo & "-" & theKey & "} " & theTitle)
set DestFolder to ("/Volumes/Production/test/" & theGenre & "/" & theArtist)
--set DestFolder to ("/Volumes/Macintosh HD/Users/Important/Test/" & theGenre & "/" & theArtist)
my createFolder:DestFolder
set DestFolder to POSIX file DestFolder
set theFile to (theFile as text) as alias # ADDED. Finder refuse to get extension or rename the object returned by the ASObjC handler
tell application "Finder"
set theExtension to name extension of theFile
set name of theFile to renamedTitle & "." & theExtension #AS MAYBE AIFF OR MP3
try
move theFile to DestFolder
on error errMsg
display dialog renamedTitle & errMsg # IF ALREADY EXISTS WILL PROMPT
end try
end tell
end treatThisFile
Go to messages #53 &54
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) mercredi 19 avril 2017 16:24:34
how do you get the long script to handle folders?
error "Can't get alias \"Untitled:_Production Drive backup 13/3/17:iTunes Media Folder:\"." number -1728 from alias "Untitled:_Production Drive backup 13/3/17:iTunes Media Folder:"
(*
rename & move mp3 ASObjC - 2
Written for http://macscripter.net/viewtopic.php?id=45629
by Nigel GARVEY, Shane STANLEY & Yvan KOENIG
2017/04/15
Tested under 10.12.4 public version
# Edited on 2017/04/18 : report the list of files which weren't moved
# Edited on 2017/04/19 : at Nigel GARVEY's request, removed some instructions
CAUTION. THE SCRIPT IS SUPPOSED TO RENAME AND MOVE SOME FILES.
IF YOU ARE NOT SURE OF WHAT IT DOES, EDIT THE PROPERTY NAMED testIt SETTING IT THE VALUE : true
*)
use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"
property copyString : " #" -- added to file names for copies; edit to suit your language
property destinationRootPath : "/Volumes/Production/test/" # I assume that it's the one you need
property testIt : false
#################### true = log some metadatas and DON'T MOVE the files
#################### false = don't log these metadatas and MOVE the files
on run -- For when testing.
set theFiles to choose folder with prompt "Please select folder"
mainBusiness(theFiles)
end run
on adding folder items to thisFolder after receiving addedItems -- For when run as a folder action.
mainBusiness(addedItems)
end adding folder items to
on mainBusiness(theFiles)
-- Get the root path in a convenient form for use with ASObjC.
local destinationRootPath, |⌘|
# Instructions useful to get a script running flawlessly on my machine!
set run4YK to (path to home folder as text) starts with "SSD 500"
if run4YK then
set my destinationRootPath to "/Volumes/Production/test3"
set my testIt to true
end if
set |⌘| to current application
set newArray to |⌘|'s NSMutableArray's arrayWithArray:{}
set destinationRootPath to |⌘|'s class "NSString"'s stringWithString:(my destinationRootPath)
repeat with thisFile in theFiles
set thePath to POSIX path of thisFile
set thePath to (|⌘|'s NSString's stringWithString:thePath)
set theExtension to thePath's pathExtension()
set theName to thePath's lastPathComponent()
set theContainer to thePath's stringByDeletingLastPathComponent()
set thePred to |⌘|'s NSPredicate's predicateWithFormat_("kMDItemFSName == %@", theName)
-- build and start query
set theQuery to |⌘|'s NSMetadataQuery's new()
(theQuery's setPredicate:thePred)
(theQuery's setSearchScopes:{theContainer})
theQuery's startQuery()
-- loop until it's stopped gathering
repeat while theQuery's isGathering() as boolean
delay 0.1
end repeat
-- stop and get the first NSMetadataItem (there can only be one in this case)
theQuery's stopQuery()
set metaItem to (theQuery's resultAtIndex:0)
-- get the required attribute values, or default alternatives where the attributes weren't found.
-- Firstly the artist ("authors") and genre values.
set theArtist to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemAuthorsKey))
set moveItArtist to (theArtist is not missing value)
if (theArtist is missing value) then
set theArtist to "(no artist)"
else
set theArtist to (theArtist's componentsJoinedByString:(","))
set theArtist to my decodeText(theArtist)
end if
set theGenre to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemMusicalGenreKey))
set moveItGenre to (theGenre is not missing value) # MOVED
if (theGenre is missing value) then set theGenre to "(no genre)"
-- Get the key, tempo, and title values.
set theKey to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemKeySignatureKey))
set moveItKey to (theKey is not missing value) # MOVED
if (theKey is missing value) then set theKey to "(no key signature)"
set theTempo to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemTempoKey))
set moveItTempo to (theTempo is not missing value)
# Instructions useful to get a script running flawlessly on my machine!
if run4YK then
# Here theKey metadata is NEVER defined so this instruction forbid every move.
--set moveForbidden to (moveItArtist is false) or (moveItGenre is false) or (moveItKey is false)
# With this one move is often allowed
set moveForbidden to (moveItArtist is false) or (moveItGenre is false)
else
# The test below matches what you asked in the thread
# If one of the four flags is false we don't move the file.
set moveForbidden to (moveItArtist is false) or (moveItGenre is false) or (moveItKey is false) or (moveItTempo is false)
end if
if moveForbidden then
log "Don't move : " & thePath & linefeed & "because at least one of these flags is false --> moveItArtist = " & moveItArtist & ", moveItGenre = " & moveItGenre & ", moveItKey = " & moveItKey & ", moveItTempo = " & moveItTempo # don't move the file
(newArray's addObject:thePath)
else
-- Derive a path to the destination folder from the root path, genre, and artist.
set destinationFolderPath to destinationRootPath's stringByAppendingFormat_("%@/%@", theGenre, theArtist)
-- Create the folder, if necessary.
my createFolder(destinationFolderPath) -- as text)
set theTitle to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemTitleKey))
if (theTitle is missing value) then
--set theTitle to "(no title)"
-- Derive a destination path for the file with a new name made up from these details.
# but replace theTtle by the original fileName
set destinationFileName to (|⌘|'s NSString's stringWithFormat_("%@-%@ %@", theTempo, theKey, theName))
else
# CAUTION, if the original title contained underscores they are replaced by slashes in theTitle.
# We must revert that
set theTitle to (theTitle's stringByReplacingOccurrencesOfString:"/" withString:"_")
-- Derive a destination path for the file with a new name made up from these details.
set destinationFileName to (|⌘|'s NSString's stringWithFormat_("%@-%@ %@.%@", theTempo, theKey, theTitle, theExtension))
end if
if not testIt then
# Move the file to the new destination. It'll be renamed in the process.
# DISABLED DURING TESTS
(my moveThisFile:thePath uniquelyToPath:destinationFolderPath newName:destinationFileName)
else
log (get destinationFolderPath as text) & ", " & destinationFileName
log "theArtist (Authors) : " & theArtist
log "theTitle : " & theTitle
log "theGenre : " & theGenre
if theKey is not missing value then log "theKey : " & theKey
end if # not testIt
end if # (moveItTitle .
end repeat
if (newArray's |count|()) as integer > 0 then
set outDoc to (newArray's componentsJoinedByString:linefeed)
set outPath to (path to desktop as text) & "report Mp3_3pMtroper.txt"
set outPath to (|⌘|'s NSString's stringWithString:(POSIX path of outPath))
set theResult to outDoc's writeToFile:outPath atomically:true encoding:(current application's NSUTF8StringEncoding) |error|:(missing value)
end if
end mainBusiness
#=====
-- Creates a new folder. There is no error if the folder already exists, and it will also create intermediate folders if required
on createFolder(POSIXPath)
log "PosixPath : " & POSIXPath
set |⌘| to current application
set theFolderURL to |⌘|'s |NSURL|'s fileURLWithPath:POSIXPath
set theFileManager to |⌘|'s NSFileManager's defaultManager()
set {theResult, theError} to theFileManager's createDirectoryAtURL:theFolderURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
if not (theResult as boolean) then error (theError's |localizedDescription|() as text)
end createFolder
# Called with sourceString defined as NSString
on replaceSeveralStrings:sourceString existingStrings:listOfExistingStrings newStrings:listOfNewStrings
if (count listOfExistingStrings) > (count listOfNewStrings) then error "The first list of strings is longer than the second one !" number 1789
--set sourceString to current application's NSString's stringWithString:sourceString
repeat with i from 1 to count listOfExistingStrings
set sourceString to (sourceString's stringByReplacingOccurrencesOfString:(listOfExistingStrings's item i) withString:(listOfNewStrings's item i))
end repeat
return sourceString as text
end replaceSeveralStrings:existingStrings:newStrings:
# Called with sourceString defined as NSString
on decodeText(theText) # Handler written by Nigel GARVEY
set |⌘| to current application
--set theText to |⌘|'s class "NSString"'s stringWithString:(theText)
-- If the string contains at least two consecutive 8+bit characters, assume it's a mangled result.
if ((theText's rangeOfString:("[\\u0080-\\U0010ffff]{2}") options:(|⌘|'s NSRegularExpressionSearch))'s |length|() > 0) then
set dataObj to (theText's dataUsingEncoding:(|⌘|'s NSISOLatin1StringEncoding))
set theText to (|⌘|'s class "NSString"'s alloc()'s initWithData:(dataObj) encoding:(|⌘|'s NSUTF8StringEncoding))
end if
return theText as text
end decodeText
# Modified version of a Shane STANLEY's handler borrowed from File Manager.scptd
on moveThisFile:aFileOrPath uniquelyToPath:folderOrPath newName:destName
# makes a NSURL from aFileOrPath
set theSourceURL to my makeURLFromFileOrPath:aFileOrPath
# makes a NSURL from folderOrPath
set theFolderURL to my makeURLFromFileOrPath:folderOrPath
# Drops the name extension from the proposed name
set destNameLessExt to destName's |stringByDeletingPathExtension|()
set theExtension to theSourceURL's |pathExtension|()
# Builds the URL pointing to the final file
set theDestURL to theFolderURL's URLByAppendingPathComponent:destName
set theFileManager to current application's NSFileManager's |defaultManager|()
set i to 2
repeat
set {theResult, theError} to (theFileManager's moveItemAtURL:theSourceURL toURL:theDestURL |error|:(reference))
if theResult as boolean then exit repeat
if (theError's code() as integer = current application's NSFileWriteFileExistsError as integer) then -- it already exists, so change name
set proposedName to (destNameLessExt's stringByAppendingString:(copyString & i))'s stringByAppendingPathExtension:theExtension
set theDestURL to theFolderURL's URLByAppendingPathComponent:proposedName
set i to i + 1
else -- an error other than file already exists, so return error
error (theError's |localizedDescription|() as text)
end if
end repeat
-- return theDestURL's |path|() as text
end moveThisFile:uniquelyToPath:newName:
# Shane STANLEY's handler borrowed from File Manager.scptd
-- This handler is called by moveItem
on makeURLFromFileOrPath:theFileOrPathInput
set |⌘| to current application
-- make it into a Cocoa object for easier comparison
set theFileOrPath to item 1 of (|⌘|'s NSArray's arrayWithObject:theFileOrPathInput)
if (theFileOrPath's isKindOfClass:(|⌘|'s NSString)) as boolean then
if (theFileOrPath's hasPrefix:"/") as boolean then -- full POSIX path
return |⌘|'s class "NSURL"'s fileURLWithPath:theFileOrPath
else if (theFileOrPath's hasPrefix:"~") as boolean then -- POSIX path needing ~ expansion
return |⌘|'s class "NSURL"'s fileURLWithPath:(theFileOrPath's |stringByExpandingTildeInPath|())
else -- must be HFS path
return |⌘|'s class "NSURL"'s fileURLWithPath:(POSIX path of theFileOrPathInput)
end if
else if (theFileOrPath's isKindOfClass:(|⌘|'s class "NSURL")) as boolean then -- happens with files and aliases in 10.11
return theFileOrPath
else -- must be a file or alias
return |⌘|'s class "NSURL"'s fileURLWithPath:(POSIX path of theFileOrPathInput)
end if
end makeURLFromFileOrPath:
Since the beginning every scripts were using choose file. Now you ask for choose folder.
As you made the change without knowing what you do, it’s not surprising that you get a wrong behavior.
As with your code, theFiles is not a list of aliases but an alias, it’s logical that the instruction
repeat with thisFile in theFiles
issue an error number -1728 !
Edit the run handler this way:
on run -- For when testing.
set theFolder to choose folder with prompt "Please select folder"
tell application "Finder"
set theFiles to (files of theFolder) as alias list
end tell
mainBusiness(theFiles)
end run
May I know why you modified :
if run4YK then
set my destinationRootPath to "/Volumes/Macintosh HD/Users/Important/Test/"
set my testIt to true
end if
as
if run4YK then
set my destinationRootPath to "/Volumes/Production/test3"
set my testIt to true
end if
This piece of code was designed to allow the script to behave correctly on my machine where there is no device named “Production”.
On your machine it’s the instruction
property destinationRootPath : "/Volumes/Production/test/" # I assume that it's the one you need
which defines the destination location.
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) jeudi 20 avril 2017 14:26:25
Oops
Now that you want to use choose folder I forgot to add instructions accepting only the mp3 and/or aiff files.
I’m forced to post the complete script.
(*
rename & move mp3 ASObjC - Æ’
Written for http://macscripter.net/viewtopic.php?id=45629
by Nigel GARVEY, Shane STANLEY & Yvan KOENIG
2017/04/15
Tested under 10.12.4 public version
# Edited on 2017/04/18 : report the list of files which weren't moved
# Edited on 2017/04/19 : at Nigel GARVEY's request, removed some instructions
# Edited on 2017/04/20 : now in the run handler choose file is replaced by choose folder + code getting the content of the selected folder
# Edited on 2017/04/21 : insert theArtist in the new fileNames. Write the count of moved files and the count of not moved files in the report : "report Mp3_3pMtroper.txt"
# Edited on 2017/04/29 : now write info about a not saved file one by one. Inserted numerous log instructions.
# Edited on 2017/04/30 : added a complementary transcoder handler named decodeText2 to treat an "unknown" encoding applied to theArtist
# Edited on 2017/05/01 : enhanced the handler decodeText2
# Edited on 2017/05/03 : disabled decodeText2 and try to filter the reported odd error
# Edited on 2017/05/11 : removed the log instruction and the decodeText2 handler
CAUTION. THE SCRIPT IS SUPPOSED TO RENAME AND MOVE SOME FILES.
IF YOU ARE NOT SURE OF WHAT IT DOES, EDIT THE PROPERTY NAMED testIt SETTING IT TO THE VALUE : true
*)
use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"
property copyString : " #" -- added to file names for copies; edit to suit your language
property destinationRootPath : "/Volumes/Production/test/" # I assume that it's the one you need # Is silently changed when the script run on my machine
property testIt : false
#################### true = log some metadatas and DON'T MOVE the files
#################### false = don't log these metadatas and MOVE the files
script o
# These properties are available for the handlers but aren't saved on disk
property filesMoved : 0
property filesNotMoved : 0
end script
on run -- For when testing.
set theFolder to choose folder with prompt "Please select folder"
set theFiles to its listFolder:(POSIX path of theFolder) # ADDED to get the list of mp3 and/or aiff files
mainBusiness(theFiles)
end run
on adding folder items to thisFolder after receiving addedItems -- For when run as a folder action.
# CAUTION : this entry doesn't check that the files are mp3 and/or aiff ones !
mainBusiness(addedItems)
end adding folder items to
on mainBusiness(theFiles)
-- Get the root path in a convenient form for use with ASObjC.
local filesMoved, filesNotMoved, newPath, blank, forYvanKoenig, |⌘|, newArray, destinationRootPath, thisFile, thePath, theExtension
local theName, theContainer, thePred, theQuery, metaItem, theArtist, moveItArtist, theGenre, moveItGenre, theKey, moveItKey
local theTempo, moveItTempo, moveForbidden, needComma, wrongMessage, destinationFolderPath, theTitle, destinationFileName
# Prepare the counters of treated files
set {filesMoved, filesNotMoved} to {0, 0}
set newPath to POSIX path of ((path to desktop as text) & "report Mp3_3pMtroper.txt")
# create a blank text file
set blank to current application's NSString's stringWithString:("")
set blank to blank's dataUsingEncoding:(current application's NSUTF8StringEncoding)
(blank's writeToFile:newPath atomically:true) -- as boolean # clears the report
# Instructions useful to get a script running flawlessly on MY machine!
set forYvanKoenig to (path to home folder as text) starts with "SSD 500"
if forYvanKoenig then
set my destinationRootPath to "/Volumes/Macintosh HD/Users/Important/Test/"
set my testIt to false --true
end if
set |⌘| to current application
set newArray to |⌘|'s NSMutableArray's arrayWithArray:{}
set destinationRootPath to |⌘|'s class "NSString"'s stringWithString:(my destinationRootPath)
repeat with thisFile in theFiles
set thePath to (|⌘|'s NSString's stringWithString:(POSIX path of thisFile))
set theExtension to thePath's pathExtension()
set theName to thePath's lastPathComponent()
set theContainer to thePath's stringByDeletingLastPathComponent()
set thePred to |⌘|'s NSPredicate's predicateWithFormat_("kMDItemFSName == %@", theName)
-- build and start query
set theQuery to |⌘|'s NSMetadataQuery's new()
(theQuery's setPredicate:thePred)
(theQuery's setSearchScopes:{theContainer})
theQuery's startQuery()
-- loop until it's stopped gathering
repeat while theQuery's isGathering() as boolean
delay 0.1
end repeat
-- stop and get the first NSMetadataItem (there can only be one in this case)
theQuery's stopQuery()
try
set metaItem to (theQuery's resultAtIndex:0)
-- get the required attribute values, or default alternatives where the attributes weren't found.
-- Firstly the artist ("authors") and genre values.
set theArtist to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemAuthorsKey))
set moveItArtist to (theArtist is not missing value)
if (theArtist is missing value) then
set theArtist to "(no artist)"
else
set theArtist to (theArtist's componentsJoinedByString:",")
set theArtist to my decodeText(theArtist)
end if
set theGenre to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemMusicalGenreKey))
set moveItGenre to (theGenre is not missing value)
if (theGenre is missing value) then set theGenre to "(no genre)"
-- Get the key, tempo, and title values.
set theKey to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemKeySignatureKey))
set moveItKey to (theKey is not missing value)
if (theKey is missing value) then set theKey to "(no key signature)"
set theTempo to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemTempoKey))
set moveItTempo to (theTempo is not missing value)
if (theTempo is missing value) then set theKey to "(no tempo)"
# Instructions useful to get a script running flawlessly on MY machine!
if forYvanKoenig then
# Here theKey metadata is NEVER defined so this instruction forbid every move.
--set moveForbidden to (moveItArtist is false) or (moveItGenre is false) or (moveItKey is false)
# With this one move is often allowed
set moveForbidden to (moveItArtist is false) or (moveItGenre is false)
else
# The test below matches what you asked in the thread. If one of the four flags is false we don't move the file.
set moveForbidden to (moveItArtist is false) or (moveItGenre is false) or (moveItKey is false) or (moveItTempo is false)
end if
if moveForbidden then
set needComma to false
set wrongMessage to "Not moved : " & thePath & linefeed & " because these flags are false --> "
if moveItArtist is false then
set wrongMessage to wrongMessage & "moveItArtist"
set needComma to true
end if # moveItArtist
if moveItGenre is false then
if needComma then set wrongMessage to wrongMessage & ", "
set wrongMessage to wrongMessage & "moveItGenre"
set needComma to true
end if # moveItGenre
if moveItKey is false then
if needComma then set wrongMessage to wrongMessage & ", "
set wrongMessage to wrongMessage & "moveItKey"
set needComma to true
end if # moveItKey
if moveItTempo is false then
if needComma then set wrongMessage to wrongMessage & ", "
set wrongMessage to wrongMessage & "moveItTempo"
set needComma to true
end if # moveItTempo
set wrongMessage to wrongMessage & linefeed
my writeTo(newPath, wrongMessage)
set filesNotMoved to filesNotMoved + 1
else
-- Derive a path to the destination folder from the root path, genre, and artist.
set destinationFolderPath to destinationRootPath's stringByAppendingFormat_("%@/%@", theGenre, theArtist)
-- Create the folder, if necessary.
my createFolder(destinationFolderPath) -- as text)
set theTitle to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemTitleKey))
if (theTitle is missing value) then
--set theTitle to "(no title)"
-- Derive a destination path for the file with a new name made up from these details.
# but replace theTitle by the original fileName
set destinationFileName to (|⌘|'s NSString's stringWithFormat_("{%@-%@} %@ - %@", theTempo, theKey, theArtist, theName))
else
# CAUTION, if the original title contained underscores they are replaced by slashes in theTitle.
# We must revert that
set theTitle to (theTitle's stringByReplacingOccurrencesOfString:"/" withString:"_")
-- Derive a destination path for the file with a new name made up from these details.
set destinationFileName to (|⌘|'s NSString's stringWithFormat_("{%@-%@} %@ - %@.%@", theTempo, theKey, theArtist, theTitle, theExtension))
end if
if not my testIt then
# Move the file to the new destination. It'll be renamed in the process.
# DISABLED DURING TESTS
(my moveThisFile:thePath uniquelyToPath:destinationFolderPath newName:destinationFileName)
set filesMoved to filesMoved + 1
else
if theKey is not missing value then log "theKey : " & theKey
set filesMoved to filesMoved + 1 # ADDED on 2017/04/25
end if # not testIt
end if # (moveItTitle .
on error errMsg number errNbr
# report the file as not moved
set wrongMessage to "Not moved : " & thePath & linefeed & " Error " & "number #" & errNbr & linefeed & " " & errMsg & linefeed
my writeTo(thePath, wrongMessage)
set filesNotMoved to filesNotMoved + 1
end try
end repeat
my writeTo(newPath, (linefeed & filesMoved & " were moved." & linefeed & filesNotMoved & " were not moved !" & linefeed))
end mainBusiness
#=====
-- Creates a new folder. There is no error if the folder already exists, and it will also create intermediate folders if required
on createFolder(POSIXPath)
set |⌘| to current application
set theFolderURL to |⌘|'s |NSURL|'s fileURLWithPath:POSIXPath
set theFileManager to |⌘|'s NSFileManager's defaultManager()
set {theResult, theError} to theFileManager's createDirectoryAtURL:theFolderURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
if not (theResult as boolean) then error (theError's |localizedDescription|() as text)
end createFolder
# Called with sourceString defined as NSString
on replaceSeveralStrings:sourceString existingStrings:listOfExistingStrings newStrings:listOfNewStrings
if (count listOfExistingStrings) > (count listOfNewStrings) then error "The first list of strings is longer than the second one !" number 1789
--set sourceString to current application's NSString's stringWithString:sourceString
repeat with i from 1 to count listOfExistingStrings
set sourceString to (sourceString's stringByReplacingOccurrencesOfString:(listOfExistingStrings's item i) withString:(listOfNewStrings's item i))
end repeat
return sourceString as text
end replaceSeveralStrings:existingStrings:newStrings:
# Called with sourceString defined as NSString
on decodeText(theText) # Handler written by Nigel GARVEY
set |⌘| to current application
--set theText to |⌘|'s class "NSString"'s stringWithString:(theText)
-- If the string contains at least two consecutive 8+bit characters, assume it's a mangled result.
if ((theText's rangeOfString:("[\\u0080-\\U0010ffff]{2}") options:(|⌘|'s NSRegularExpressionSearch))'s |length|() > 0) then
set dataObj to (theText's dataUsingEncoding:(|⌘|'s NSISOLatin1StringEncoding))
set theText to (|⌘|'s class "NSString"'s alloc()'s initWithData:(dataObj) encoding:(|⌘|'s NSUTF8StringEncoding))
end if
return theText as text
end decodeText
# Modified version of a Shane STANLEY's handler borrowed from File Manager.scptd
on moveThisFile:aFileOrPath uniquelyToPath:folderOrPath newName:destName
# makes a NSURL from aFileOrPath
set theSourceURL to my makeURLFromFileOrPath:aFileOrPath
# makes a NSURL from folderOrPath
set theFolderURL to my makeURLFromFileOrPath:folderOrPath
# Drops the name extension from the proposed name
set destNameLessExt to destName's |stringByDeletingPathExtension|()
set theExtension to theSourceURL's |pathExtension|()
# Builds the URL pointing to the final file
set theDestURL to theFolderURL's URLByAppendingPathComponent:destName
set theFileManager to current application's NSFileManager's |defaultManager|()
set i to 2
repeat
set {theResult, theError} to (theFileManager's moveItemAtURL:theSourceURL toURL:theDestURL |error|:(reference))
if theResult as boolean then exit repeat
if (theError's code() as integer = current application's NSFileWriteFileExistsError as integer) then -- it already exists, so change name
set proposedName to (destNameLessExt's stringByAppendingString:(copyString & i))'s stringByAppendingPathExtension:theExtension
set theDestURL to theFolderURL's URLByAppendingPathComponent:proposedName
set i to i + 1
else -- an error other than file already exists, so return error
error (theError's |localizedDescription|() as text)
end if
end repeat
-- return theDestURL's |path|() as text
end moveThisFile:uniquelyToPath:newName:
# Shane STANLEY's handler borrowed from File Manager.scptd
-- This handler is called by moveItem
on makeURLFromFileOrPath:theFileOrPathInput
set |⌘| to current application
-- make it into a Cocoa object for easier comparison
set theFileOrPath to item 1 of (|⌘|'s NSArray's arrayWithObject:theFileOrPathInput)
if (theFileOrPath's isKindOfClass:(|⌘|'s NSString)) as boolean then
if (theFileOrPath's hasPrefix:"/") as boolean then -- full POSIX path
return |⌘|'s class "NSURL"'s fileURLWithPath:theFileOrPath
else if (theFileOrPath's hasPrefix:"~") as boolean then -- POSIX path needing ~ expansion
return |⌘|'s class "NSURL"'s fileURLWithPath:(theFileOrPath's |stringByExpandingTildeInPath|())
else -- must be HFS path
return |⌘|'s class "NSURL"'s fileURLWithPath:(POSIX path of theFileOrPathInput)
end if
else if (theFileOrPath's isKindOfClass:(|⌘|'s class "NSURL")) as boolean then -- happens with files and aliases in 10.11
return theFileOrPath
else -- must be a file or alias
return |⌘|'s class "NSURL"'s fileURLWithPath:(POSIX path of theFileOrPathInput)
end if
end makeURLFromFileOrPath:
on listFolder:POSIXPath # handler using ASObjC ADDED
set fileManager to current application's NSFileManager's defaultManager()
set aURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
set theOptions to (current application's NSDirectoryEnumerationSkipsPackageDescendants as integer) + (current application's NSDirectoryEnumerationSkipsHiddenFiles as integer)
set theEnumerator to fileManager's enumeratorAtURL:aURL includingPropertiesForKeys:{} options:theOptions errorHandler:(missing value)
set theFiles to theEnumerator's allObjects()
set theFiles to theFiles's filteredArrayUsingPredicate:(current application's NSPredicate's predicateWithFormat:"(lastPathComponent ENDSWITH '.mp3') OR (lastPathComponent ENDSWITH '.aiff')")
return theFiles as list # if we work upon files
--return (theFiles's valueForKey:"path") as list # if we work upon POSIX paths
end listFolder:
#=====
on writeTo(newPath, theString)
set fileAccess to current application's NSFileHandle's fileHandleForWritingAtPath:newPath
try
tell fileAccess to seekToEndOfFile()
set theString to current application's NSString's stringWithString:theString
set stringData to theString's dataUsingEncoding:(current application's NSUTF8StringEncoding)
tell fileAccess to writeData:stringData
set theResult to true
end try
tell fileAccess to closeFile()
end writeTo
#=====
I was far from home so I was unable to edit this message before my return.
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) jeudi 20 avril 2017 19:20:56
Here is the “short old-fashioned” SLOW version.
use AppleScript version "2.4" # requires at least Yosemite
use scripting additions
use framework "Foundation"
script o
property targetFile : missing value
property filesMoved : 0
property filesNotMoved : 0
end script
# The main code
set theFolder to choose folder with prompt "Please select a folder containing MP3/AIFF files" # ADDED
set theFiles to its listFolder:(POSIX path of theFolder) # ADDED
set o's targetFile to ((path to desktop as text) & "report Mp3_3pMtroper.txt") as «class furl»
# Creates the file reporting files not moved
my writeto(o's targetFile, "", «class utf8», false)
repeat with aFile in theFiles
my treatThisFile(aFile)
end repeat
# Write the count of moved and not moved files in the text file "report Mp3_3pMtroper.txt"
my writeto(o's targetFile, linefeed & o's filesMoved & " were moved." & linefeed & o's filesNotMoved & " were not moved !", «class utf8», true)
#===== Below are the handlers
on treatThisFile(theFile)
set posixFilePath to the quoted form of (POSIX path of theFile)
set genreTag to (do shell script "mdls " & posixFilePath & " -name kMDItemMusicalGenre")
set artistTag to (do shell script "mdls " & posixFilePath & " -name kMDItemAuthors")
set tempoTag to (do shell script "mdls " & posixFilePath & " -name kMDItemTempo")
set keyTag to (do shell script "mdls " & posixFilePath & " -name kMDItemKeySignature")
set theGenre to text ((offset of "= " in genreTag) + 3) through -2 of genreTag
set theArtist to text ((offset of "= " in artistTag) + 9) through -4 of artistTag
set theTempo to text ((offset of "= " in tempoTag) + 2) through -1 of tempoTag
set theKey to text ((offset of "= " in keyTag) + 3) through -2 of keyTag
#SOME MP3 TAGS ARE NOT PROPERLY FILLED OUT- THIS BELOW PART DOESNT WORK AS SCRIPT PROCEEDS??????. # problem solved below
if ((count theGenre) ≤ (count "(null)") and theGenre contains "null") or ((count theArtist) ≤ (count "(null)") and theArtist contains "null") or ((count theTempo) ≤ (count "(null)") and theTempo contains "null") or ((count theKey) ≤ (count "(null)") and theKey contains "null") then
# The file can't be moved. Write it's path in the dedicated text file
my writeto(o's targetFile, theFile as text, «class utf8», true)
set o's filesNotMoved to (o's filesNotMoved) + 1
else
# There was no need to extract this info if one of the four other ones is null
set titleTag to (do shell script "mdls " & posixFilePath & " -name kMDItemTitle")
set theTitle to text ((offset of "= " in titleTag) + 3) through -2 of titleTag
# For some files, theTitle is returned as "null" or "(null)" so it may generate duplicates # Edited
# I choose to use the original name deprieved of the extension
if (count theTitle) ≤ (count "(null)") and theTitle contains "null" then # EDITED
tell application "System Events" # ADDED
set theTitle to text 1 thru -5 of (get name of file (theFile as text))
end tell
end if
set renamedTitle to ("{" & theTempo & "-" & theKey & "} " & theArtist & " - " & theTitle)
set DestFolder to ("/Volumes/Production/test/" & theGenre & "/" & theArtist)
--set DestFolder to ("/Volumes/Macintosh HD/Users/Important/Test/" & theGenre & "/" & theArtist)
my createFolder:DestFolder
set DestFolder to POSIX file DestFolder
set theFile to (theFile as text) as alias # ADDED. Finder refuse to get extension or rename the object returned by the ASObjC handler
tell application "Finder"
set theExtension to name extension of theFile
set name of theFile to renamedTitle & "." & theExtension #AS MAYBE AIFF OR MP3
try
move theFile to DestFolder
set o's filesMoved to (o's filesMoved) + 1
-- log ">>>>> " & theFile & linefeed & DestFolder
on error errMsg
-- display dialog renamedTitle & errMsg # IF ALREADY EXISTS WILL PROMPT
my writeto(o's targetFile, (theFile as text) & errMsg, «class utf8», true)
set o's filesNotMoved to (o's filesNotMoved) + 1
end try
end tell
end if # (moveitGenre is false) or.
end treatThisFile
#=====
on listFolder:POSIXPath # handler using ASObjC
set fileManager to current application's NSFileManager's defaultManager()
set aURL to current application's |NSURL|'s fileURLWithPath:POSIXPath
set theOptions to (current application's NSDirectoryEnumerationSkipsPackageDescendants as integer) + (current application's NSDirectoryEnumerationSkipsHiddenFiles as integer)
set theEnumerator to fileManager's enumeratorAtURL:aURL includingPropertiesForKeys:{} options:theOptions errorHandler:(missing value)
set theFiles to theEnumerator's allObjects()
set theFiles to theFiles's filteredArrayUsingPredicate:(current application's NSPredicate's predicateWithFormat:"(lastPathComponent ENDSWITH '.mp3') OR (lastPathComponent ENDSWITH '.aiff')")
return theFiles as list # if we work upon files
--return (theFiles's valueForKey:"path") as list # if we work upon POSIX paths
end listFolder:
-- Creates a new folder. There is no error if the folder already exists, and it will also create intermediate folders if required
on createFolder:POSIXPath
set |⌘| to current application
set theFolderURL to |⌘|'s |NSURL|'s fileURLWithPath:POSIXPath
set theFileManager to |⌘|'s NSFileManager's defaultManager()
set {theResult, theError} to theFileManager's createDirectoryAtURL:theFolderURL withIntermediateDirectories:true attributes:(missing value) |error|:(reference)
if not (theResult as boolean) then error (theError's |localizedDescription|() as text)
end createFolder:
#=====
(*
Handler borrowed to Regulus6633 - http://macscripter.net/viewtopic.php?id=36861
*)
on writeto(targetFile, theData, dataType, apendData)
-- targetFile is the path to the file you want to write
-- theData is the data you want in the file.
-- dataType is the data type of theData and it can be text, list, record etc.
-- apendData is true to append theData to the end of the current contents of the file or false to overwrite it
try
--set targetFile to targetFile as «class furl» # no need, the calling instructions pass a «class furl» object
set openFile to open for access targetFile with write permission
if not apendData then set eof of openFile to 0
write (theData & linefeed) to openFile starting at eof as dataType
close access openFile
return true
on error
try
close access targetFile
end try
return false
end try
end writeto
#=====
I hope that I didn’t forgot a change to match your settings after testing it with mines.
Added code writing the count of moved and the count of not-moved files in the file : “report Mp3_3pMtroper.txt”
Yvan KOENIG running Sierra 10.12.4 in French (VALLAURIS, France) jeudi 20 avril 2017 19:49:29
thanks Yvan
I’m looking to change the renaming format to: {118-Gmaj} Elton John - Tiny Dancer
In the script I found where it does it, however not sure how to script it (the older script I could do it)
Also would it be hard to script how many mp3/aiff files were moved after completing?
set theTitle to (metaItem's valueForAttribute:(|⌘|'s NSMetadataItemTitleKey)) --SET THE NEW FILE NAME
if (theTitle is missing value) then
--set theTitle to "(no title)"
-- Derive a destination path for the file with a new name made up from these details.
# but replace theTtle by the original fileName
set destinationFileName to (|⌘|'s NSString's stringWithFormat_("%@-%@ %@", theTempo, theKey, theName))
else
# CAUTION, if the original title contained underscores they are replaced by slashes in theTitle.
# We must revert that
set theTitle to (theTitle's stringByReplacingOccurrencesOfString:"/" withString:"_")
-- Derive a destination path for the file with a new name made up from these details.
set destinationFileName to (|⌘|'s NSString's stringWithFormat_("%@-%@ %@.%@", theTempo, theKey, theTitle, theExtension))
end if