mediaService.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const path = require('path');
  2. const fs = require('fs');
  3. function Media()
  4. {
  5. }
  6. function MediaStruct(i) {
  7. this.path = i.path;
  8. this.fileName = path.parse(i.path).name;
  9. this.md5sum = i.md5sum;
  10. this.date = i.date;
  11. this.meta = {};
  12. this.tags = [];
  13. }
  14. MediaStruct.prototype.pushMeta = function(key, value) {
  15. if (key && value && !this.meta[key]) {
  16. let type = '';
  17. if (['photochamberImport', 'dateTime'].indexOf(key) >= 0)
  18. type = 'date';
  19. else if (['height', 'width', 'iso', 'focal', 'fNumber', 'exposureTime'].indexOf(key) >= 0)
  20. type = 'number';
  21. else if (['artist', 'camera', 'lensModel', 'exposureTimeStr', 'libraryPath', 'compression', 'software'].indexOf(key) >= 0)
  22. type = 'string';
  23. else if (['fileSize'].indexOf(key) >= 0)
  24. type = 'octet';
  25. else console.log(key, value);
  26. this.meta[key] = { type: type, value: value };
  27. }
  28. }
  29. MediaStruct.prototype.pushTag = function(tag) {
  30. if (tag && this.tags.indexOf(tag) === -1)
  31. this.tags.push(tag);
  32. }
  33. MediaStruct.prototype.HaveAccess = function(accessList) {
  34. if (!fs.existsSync(this.path))
  35. return false;
  36. accessList = accessList || {};
  37. for (let i in accessList) {
  38. // FIXME
  39. }
  40. return true;
  41. }
  42. function reduceReqToMediaStruct(acc, i) {
  43. let obj = acc[i.md5sum] = acc[i.md5sum] || new MediaStruct(i);
  44. obj.pushMeta(i.metaKey, i.metaValue);
  45. obj.pushTag(i.mediaTag);
  46. return acc;
  47. }
  48. module.exports.fetchOne = async function(app, md5sum, accessList) {
  49. let result = ((await app.databaseHelper.runSql(`
  50. select mediaFile.path, mediaFile.md5sum, mediaFile.date,
  51. mediaMeta.key as metaKey, mediaMeta.value as metaValue,
  52. mediaTag.tag as mediaTag
  53. from mediaFile
  54. left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum
  55. left join mediaTag on mediaTag.md5sum=mediaFile.md5sum
  56. where mediaFile.md5sum=?`, md5sum)) || []).reduce(reduceReqToMediaStruct, {})[md5sum] || null;
  57. return result?.HaveAccess(accessList) ? result : null;
  58. }
  59. module.exports.fetchMedias = async function(app, startTs, count) {
  60. let result = ((await app.databaseHelper.runSql(`
  61. select mediaFile.path, mediaFile.md5sum, mediaFile.date,
  62. mediaMeta.key as metaKey, mediaMeta.value as metaValue,
  63. mediaTag.tag as mediaTag
  64. from mediaFile
  65. left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum
  66. left join mediaTag on mediaTag.md5sum=mediaFile.md5sum
  67. where mediaFile.md5sum in
  68. (select md5sum from mediaFile `
  69. +(startTs ? "where date <? " : "")
  70. +"order by date desc limit ?)", startTs ? [startTs, count] : [count])) || [])
  71. .reduce(reduceReqToMediaStruct, {});
  72. result = Object.keys(result).map(i => result[i]).sort((a, b) => b.date-a.date);
  73. return result;
  74. };
  75. module.exports.fetchMediasWithAccess = async function(app, startTs, count, access) {
  76. let result = [];
  77. let lastTs = startTs;
  78. while (result.length < count) {
  79. let tmp = await module.exports.fetchMedias(app, lastTs, 25);
  80. if (!tmp.length)
  81. return result;
  82. lastTs = tmp[tmp.length-1].date;
  83. tmp = tmp.filter(i => i.HaveAccess(access));
  84. if (tmp.length)
  85. result = result.concat(tmp);
  86. }
  87. return result.slice(0, count);
  88. };
  89. module.exports.getMediaRange = async function(app) {
  90. let result = await app.databaseHelper.runSql("select min(date) as _min, max(date) as _max from mediaFile");
  91. return [ result?.[0]?._min || 0, result?.[0]?._max || 0 ];
  92. }