• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Script to add folder name as additional keyword - PROBLEM in keywords are added in quotation marks

Explorer ,
Jul 19, 2020 Jul 19, 2020

Copy link to clipboard

Copied

Can someone help me modify this Bridge script?  I have used scripts to add file and folder names to the metadata description field and I am trying to adapt one of those scripts to add keywords. But when the keywords are added they end up with quotation marks around the result.

"keywords; keywords; keyword3"

 

I think the reason is that I am not adding new keywords as part of an array but as a string. But I'm having trouble correcting that.

 

Note that I do not get quotation marks when I use this line of code: 
Desc=Desc.toString() + "" + FolderName;

And with the above line, the script adds the keyword but without a separation of space or comma

But when I modify the line to add semicolon and space I get the quotation marks: 
Desc=Desc.toString() + "; " + FolderName;

The resulting keywords are like this "apple; testfolder"  (in this case apple was an existing keyword that I want to keep and testfolder is the folder containing the selected files.

 

Here is the code.

 

//this adds the folder name of selected files but not with space as a second keyword
// added semicolon spacein line 33 but it results in  keywords enclosed in quotes
 
 #target bridge     
if( BridgeTalk.appName == "bridge" ) {    
FT = MenuElement.create("command", "FOLDERName to KEYWORD-33", "at the end of Tools");  
}  
FT.onSelect = function () { 
    var thumbs = app.document.selections;   
    if(!thumbs.length) return;  
    if (ExternalObject.AdobeXMPScript == undefined)  ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");  
    for(var a in thumbs)
{  
    var selectedFile = thumbs[a].spec;      
    var FileName = decodeURI(selectedFile.name).replace(/\.[^\.]+$/, '')  // get file name - not neededfor this script

    var FolderName = (decodeURI(selectedFile.parent.name)); //get foldername  selected File defined above - i added this line

      var myXmpFile = new XMPFile( selectedFile.fsName, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_UPDATE);   
    var myXmp = myXmpFile.getXMP();  
    var Desc=[];  
    var count =  myXmp.countArrayItems(XMPConst.NS_DC, "subject");  //replaced description with subject
    for(var i = 1;i <= count;i++)
 {  
    Desc.push(myXmp.getArrayItem(XMPConst.NS_DC, "subject", i));  //replaced description with subject
 }  
    Desc=Desc.toString() + "" + FolderName; //was FileName                                            //adding  semi colon and space to string
        myXmp.deleteProperty(XMPConst.NS_DC, "subject");  //replaced description with subject
        myXmp.appendArrayItem(XMPConst.NS_DC, "subject", Desc, 0, XMPConst.ALIAS_TO_ALT_TEXT);  //replaced description with subject
        myXmp.setQualifier(XMPConst.NS_DC, "subject[1]", "http://www.w3.org/XML/1998/namespace", "lang", "x-default");  //replaced description with subject
        if (myXmpFile.canPutXMP(myXmp)) 
    {   
        myXmpFile.putXMP(myXmp);  
         myXmpFile.closeFile(XMPConst.CLOSE_UPDATE_SAFELY);   
       }   
    }  
}  

 

TOPICS
Keywords , Metadata , Scripting

Views

541

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Jul 20, 2020 Jul 20, 2020

You are correct that Keywords need an array, they are not a simple string as with Description. This has caught me out in the past with both Adobe scripting and when using ExifTool. Try this script from the great SuperMerlin:

 

 

/* 
https://forums.adobe.com/thread/2411817
https://community.adobe.com/t5/bridge/adding-image-metadata-from-folder-s-name/td-p/9542797?page=1
*/

#target bridge
   if( BridgeTalk.appName == "bridge" ) {
folderTokeys = MenuElement.create("command", "Add Folder Name to Ke
...

Votes

Translate

Translate
Community Expert ,
Jul 20, 2020 Jul 20, 2020

Copy link to clipboard

Copied

You are correct that Keywords need an array, they are not a simple string as with Description. This has caught me out in the past with both Adobe scripting and when using ExifTool. Try this script from the great SuperMerlin:

 

 

/* 
https://forums.adobe.com/thread/2411817
https://community.adobe.com/t5/bridge/adding-image-metadata-from-folder-s-name/td-p/9542797?page=1
*/

#target bridge
   if( BridgeTalk.appName == "bridge" ) {
folderTokeys = MenuElement.create("command", "Add Folder Name to Keywords", "at the end of Tools");
}
folderTokeys.onSelect  = function () {
var thumbs = app.document.selections;
if (ExternalObject.AdobeXMPScript == undefined)  ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var FolderName =  decodeURI(Folder(app.document.presentationPath).name);
for(var a =0;a<thumbs.length;a++){
var selectedFile =  new Thumbnail(thumbs[a]);
app.synchronousMode = true;
var xmp = new XMPMeta(selectedFile.synchronousMetadata.serialize());
xmp.appendArrayItem(XMPConst.NS_DC, "subject", FolderName, 0,XMPConst.PROP_IS_ARRAY);
var newPacket = xmp.serialize(XMPConst.SERIALIZE_USE_COMPACT_FORMAT);
selectedFile.metadata = new Metadata(newPacket);
    }
};

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jul 20, 2020 Jul 20, 2020

Copy link to clipboard

Copied

An equivalent ExifTool command line code would be:

 

exiftool -r '-Subject<${directory;s/.*\/([^\/]*$)/$1/}' 'MAC FILE or FOLDER PATH'

 

exiftool -r "-Subject<${directory;s/.*\/([^\/]*$)/$1/}" "WIN FILE or FOLDER PATH"

 

Adding a + plus sign should append (untested):

 

exiftool -r '-Subject+<${directory;s/.*\/([^\/]*$)/$1/}' 'MAC FILE or FOLDER PATH'

 

exiftool -r "-Subject+<${directory;s/.*\/([^\/]*$)/$1/}" "WIN FILE or FOLDER PATH"

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 23, 2020 Jul 23, 2020

Copy link to clipboard

Copied

Thanks Stephen: That works! I love it.

I'm a fan SuperMerlin scripts on this forum and yours. Thanks for pointing this one out.

Now I need to figure out WHY it works. Need to get up to speed with handling arrays.  I see a response from  Lumigraphics below that I will dig into.

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jul 23, 2020 Jul 23, 2020

Copy link to clipboard

Copied

LATEST

I'm not sure if SuperMerlin's script is doing exactly the same thing as your original script, so please let the forum know if any modifications are required.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Jul 20, 2020 Jul 20, 2020

Copy link to clipboard

Copied

thumbs is an array of selected thumbnails

keys is an array of keywords

 

var md = thumbs[a].synchronousMetadata;
var xmp = new XMPMeta(md.serialize());
xmp.appendArrayItem(XMPConst.NS_DC, 'subject', keys[b], 0,XMPConst.PROP_IS_ARRAY);
xmp.appendArrayItem('http://ns.adobe.com/lightroom/1.0/', 'hierarchicalSubject', keys[b], 0, XMPConst.PROP_IS_ARRAY);
var updatedPacket = xmp.serialize(XMPConst.SERIALIZE_OMIT_PACKET_WRAPPER | XMPConst.SERIALIZE_USE_COMPACT_FORMAT);
thumbs[a].metadata = new Metadata(updatedPacket);

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 23, 2020 Jul 23, 2020

Copy link to clipboard

Copied

Thanks for this Lumigraphics!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines