const path = require('path'); const fs = require('fs'); function Media() { } function MediaStruct(i) { this.path = i.path; this.fileName = path.parse(i.path).name; this.md5sum = i.md5sum; this.date = i.date; this.meta = {}; this.tags = []; } MediaStruct.prototype.pushMeta = function(key, value) { if (key && value && !this.meta[key]) this.meta[key] = value; } MediaStruct.prototype.pushTag = function(tag) { if (tag && this.tags.indexOf(tag) === -1) this.tags.push(tag); } MediaStruct.prototype.HaveAccess = function(accessList) { if (!fs.existsSync(this.path)) return false; accessList = accessList || {}; for (let i in accessList) { } return true; } function reduceReqToMediaStruct(acc, i) { let obj = acc[i.md5sum] = acc[i.md5sum] || new MediaStruct(i); obj.pushMeta(i.metaKey, i.metaValue); obj.pushTag(i.mediaTag); return acc; } module.exports.fetchOne = async function(app, md5sum, accessList) { let result = ((await app.databaseHelper.runSql(` select mediaFile.path, mediaFile.md5sum, mediaFile.date, mediaMeta.key as metaKey, mediaMeta.value as metaValue, mediaTag.tag as mediaTag from mediaFile left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum left join mediaTag on mediaTag.md5sum=mediaFile.md5sum where mediaFile.md5sum=?`, md5sum)) || []).reduce(reduceReqToMediaStruct, {})[md5sum] || null; return result?.HaveAccess(accessList) ? result : null; } module.exports.fetchMedias = async function(app, startTs, count) { let result = ((await app.databaseHelper.runSql(` select mediaFile.path, mediaFile.md5sum, mediaFile.date, mediaMeta.key as metaKey, mediaMeta.value as metaValue, mediaTag.tag as mediaTag from mediaFile left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum left join mediaTag on mediaTag.md5sum=mediaFile.md5sum where mediaFile.md5sum in (select md5sum from mediaFile ` +(startTs ? "where date result[i]).sort((a, b) => b.date-a.date); return result; }; module.exports.fetchMediasWithAccess = async function(app, startTs, count, access) { let result = []; let lastTs = startTs; while (result.length < count) { let tmp = await module.exports.fetchMedias(app, lastTs, 25); if (!tmp.length) return result; lastTs = tmp[tmp.length-1].date; tmp = tmp.filter(i => i.HaveAccess(access)); if (tmp.length) result = result.concat(tmp); } return result.slice(0, count); }; module.exports.getMediaRange = async function(app) { let result = await app.databaseHelper.runSql("select min(date) as _min, max(date) as _max from mediaFile"); return [ result?.[0]?._min || 0, result?.[0]?._max || 0 ]; }