Since some time now KPhotoAlbum crashes on my Linux Mint Debian Edition, when new images are searched (and some other actions). As this is really annoying I looked for solutions. Updating to a newer version than 4.1.1 was not possible. Compiling from source was also out due to library version conflicts. All I really needed was a way to add new files to the index.xml file, which is KPhotoAlbums database. Due to the XML nature of the problem, I gave Groovy a shot.
Basically there are three tasks to be performed:
- Retrieve the list of files already in the XML database
- Compare that list with the files on the system
- Add the missing files to the XML database
package ch.sahits.image.cmd import groovy.xml.XmlUtil import java.security.MessageDigest def baseDirName = args[0] // Copy files copy = { File src,File dest-> def input = src.newDataInputStream() def output = dest.newDataOutputStream() output << input input.close() output.close() } // Generate md5 hash as a 32 char String for 'obj' // 'obj' can be a File, InputStream or URL def md5( obj ) { def hash = MessageDigest.getInstance( 'MD5' ).with { obj.eachByte( 8192 ) { bfr, num -> update bfr, 0, num } it.digest() } new BigInteger( 1, hash ).toString( 16 ).padLeft( 32, '0' ) } def inputXMLFile = new File(baseDirName+'/index.xml') def inputXMLBackupFile = new File(baseDirName+'/index.xml.backup') // make a backup copy(inputXMLFile, inputXMLBackupFile) def baseDirectory = new File(baseDirName) def fileListBase = baseDirectory.listFiles() def fileList = fileListBase.findAll { !it.isDirectory() } def root = new XmlParser().parse(inputXMLFile) // Filter out all files that are not yet in the XML for (Iterator<File> iterator = fileList.iterator(); iterator.hasNext();) { File file = iterator.next(); def fileName = file.name root.images.image.each { if (it.'@file'.equals(fileName) ) { iterator.remove() } } } // Add the entries of the missing files to the XML fileList.each { def label = it.name if (it.name.indexOf('.') > 0) { label = it.name.substring(0, it.name.lastIndexOf('.')) } def file = new File(baseDirName+'/'+it.name) def md5 = md5(file) def imagesNode = root.images[0] imagesNode.appendNode('image', [md5sum:md5, startDate:'', height:'-1', file:it.name, width:'-1', endDate:'', label:label, angle:'0']) } XmlUtil.serialize(root, System.out)