mirror of https://github.com/thumbsup/thumbsup
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
/*
|
|
--------------------------------------------------------------------------------
|
|
Provides most metadata based on the output of <exiftool>
|
|
Caches the resulting DB in <metadata.json> for faster re-runs
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
const debug = require('debug')('thumbsup')
|
|
const exifdb = require('exiftool-json-db')
|
|
const Observable = require('zen-observable')
|
|
|
|
exports.run = function (media, databasePath, callback) {
|
|
return new Observable(observer => {
|
|
var count = 0
|
|
var total = 0
|
|
var emitter = null
|
|
|
|
try {
|
|
emitter = exifdb.create({media: media, database: databasePath})
|
|
} catch (ex) {
|
|
const message = [
|
|
'Loading database',
|
|
ex.toString(),
|
|
'If migrating from thumbsup v1, delete <metadata.json> to rebuild the database from scratch'
|
|
]
|
|
observer.error(new Error(message.join('\n')))
|
|
}
|
|
|
|
// once we know how many files need to be read
|
|
emitter.on('stats', (stats) => {
|
|
debug(`Database stats: total=${stats.total}`)
|
|
total = stats.added + stats.modified
|
|
reportProgress()
|
|
})
|
|
|
|
// after every file is read
|
|
emitter.on('file', file => {
|
|
++count
|
|
reportProgress()
|
|
})
|
|
|
|
// when finished
|
|
emitter.on('done', files => {
|
|
callback(null, {database: files})
|
|
observer.complete()
|
|
})
|
|
|
|
// on error
|
|
emitter.on('error', err => observer.error(err))
|
|
|
|
function reportProgress () {
|
|
if (total === 0) return
|
|
const percent = count * 100 / total
|
|
observer.next(`Updated ${count}/${total} files (${percent}%)`)
|
|
}
|
|
})
|
|
}
|