Skip to main content
Inspiring
August 26, 2025
Question

How to get Bridge to recognize tags as keywords?

  • August 26, 2025
  • 2 replies
  • 214 views

I'm trying to switch from Picasa to Bridge as my photo organizer.  My main problem with Bridge is that it doesn't automatically recognize the tags created in Picasa as keywords. It seems to recognize them as "unassigned" keywords and displays them in the keyword panel in italics, but each one has to be right-clicked on and converted to "Persistent" to remove the italics and have the keyword entered into Bridge's library of keywords.  Since I have hundreds of keywords, that's not going to work for me.  Is there a faster way?

2 replies

Stephen Marsh
Community Expert
Community Expert
August 28, 2025

The other common option beyond a script as recommended by @ExUSA is to export out all of the keywords to .txt file and then import them as keywords into Bridge.

 

https://prepression.blogspot.com/2016/08/extracting-metadata-to-csv.html

 

https://prepression.blogspot.com/2016/11/bridge-restoring-lost-keyword-xml-file.html

 

Inspiring
August 30, 2025

Thanks.  I'll try that, too.

Legend
August 26, 2025

You would need to use a script to read keywords from your files and add them to Bridge's library.

Try this script, I have not done extensive testing with it but it should work. Save it as PLAIN TEXT with a .jsx file extension and put it into the Bridge Scripts folder, then relaunch Bridge. Select all of your files from which to add keywords, then run this script from the Tools menu. The result will be a file on your desktop that you can import into Bridge to add keywords.

 

#target bridge
if(BridgeTalk.appName == 'bridge'){
    try{
        var KeywordCapture = new Object; //id object for this script

        var kwCap = MenuElement.create('command', 'Keyword Capture', 'at the end of Tools');

        kwCap.onSelect = function(){
            var kwList = app.document.selections;
            var i = 0; //counters
            var j = 1;
            var k = 1;
            var l = 0;
            var kw_clean = []; //optimized keywords array
            var kw_line = ''; //keyword
            var kw_tabs = []; //hierarchy depth
            var kw_leading = ''; //exported file requires tab delimiter for hierarchical keywords
            var kwCapLogFile = File(''); //file to write list to
            kwCapLogFile = new File('~/Desktop/kwCapture.txt').saveDlg('Create Keyword Capture File', '*.txt'); //create text file
            kwCapLogFile.open('w:');
            if (ExternalObject.AdobeXMPScript == undefined)  ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');
            for(i = 0; i < kwList.length; i++){ //loop through selected files
                if(kwList[i].hasMetadata){ //only process files with metadata
                    k = 1;
                    kw_clean = [];
                    kw_tabs = [];
                    //XMP stores keywords in several namespaces. We don't process them all.
                    var kw = kwList[i].synchronousMetadata.read(XMPConst.NS_DC, 'subject').toString();
                    var lrkw = kwList[i].synchronousMetadata.read('http://ns.adobe.com/lightroom/1.0/', 'hierarchicalSubject').toString();
                    if(kw != '' || lrkw != ''){ //at least one namespace has keywords
                        kw = kw.split(','); //make arrays out of keyword string
                        lrkw = lrkw.split(',');
                        kw = kw.concat(lrkw); //place all keywords in one array and sort
                        kw.sort();
                        if(kw[0] != ''){
                            kw_clean[0] = kw[0];
                            }
                        else{ //flag empty keywords
                            k = 0;
                            }
                        for(j = 1; j < kw.length; j++){ //eliminate duplicates and write into new array
                            if(kw[(j - 1)] != kw[j] && kw[j] != ''){
                                kw_clean[k] = kw[j];
                                k++;
                                }
                            }
                        for(j = 0; j < kw_clean.length; j++){ //write optimized list of keywords to file
                            kw_leading = ''; //reset leading tabs
                            kw_tabs = kw_clean[j].match(/\|/g); //how deep is the hierarchy
                            if(kw_tabs != null){ //hierarchical kw
                                for(l = 0; l < kw_tabs.length; l++){
                                    kw_clean[j] = kw_clean[j].replace('|', '\r' + kw_leading + '\t'); //we process "|" as a delimiter, edit script to use others
                                    kw_leading = kw_leading + '\t'; //each new level requires one more leading tab
                                    }
                                }
                            if(kw_line != ''){
                                kw_line = kw_line + '\r' + kw_clean[j];
                                }
                            else{ //first line for file, don't add extra return
                                kw_line = kw_clean[j];
                                }
                            }
                        kwCapLogFile.writeln(kw_line); //write to file
                        kw_line = ''; //reset for next file
                        }
                    }
                }
            kwCapLogFile.close();
            kwCapLogFile.open('r:');
            var kwFin = kwCapLogFile.read();
            kwCapLogFile.close();
            kwCapLogFile.open('w:');
            kwFin = kwFin.replace(/\n\t/g, '\t');
            kwFin = kwFin.split('\n');
            kwFin = kwFin.sort();
            for(i = 0; i < kwFin.length; i++){
                if(kwFin[i] == kwFin[i + 1]){
                    kwFin[i] = '';
                    }
                }
            kwFin = kwFin.sort();
            kwFin = kwFin.join('\r');
            kwFin = kwFin.replace(/\r\r/g, '');
            kwFin = kwFin.replace(/\t/g, '\r\t');
            kwFin = kwFin.replace(/\t\r/g, '\t');
            kwCapLogFile.write(kwFin);
            kwCapLogFile.close();
            alert('Keyword capture completed');
            }
        }
    catch(e){
        alert(e + ' ' + e.line);
        }
    }

 

Inspiring
August 30, 2025

Sorry for the delayed reply (swamped at work).  Thanks loads for taking the time to write this.  I'll try to test it out this weekend.