mediaService.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. this.meta[key] = value;
  17. }
  18. MediaStruct.prototype.pushTag = function(tag) {
  19. if (tag && this.tags.indexOf(tag) === -1)
  20. this.tags.push(tag);
  21. }
  22. MediaStruct.prototype.HaveAccess = function(accessList) {
  23. if (!fs.existsSync(this.path))
  24. return false;
  25. // FIXME
  26. return true;
  27. }
  28. function reduceReqToMediaStruct(acc, i) {
  29. let obj = acc[i.md5sum] = acc[i.md5sum] || new MediaStruct(i);
  30. obj.pushMeta(i.metaKey, i.metaValue);
  31. obj.pushTag(i.mediaTag);
  32. return acc;
  33. }
  34. module.exports.fetchOne = async function(app, md5sum, accessList) {
  35. let result = ((await app.databaseHelper.runSql(`
  36. select mediaFile.path, mediaFile.md5sum, mediaFile.date,
  37. mediaMeta.key as metaKey, mediaMeta.value as metaValue,
  38. mediaTag.tag as mediaTag
  39. from mediaFile
  40. left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum
  41. left join mediaTag on mediaTag.md5sum=mediaFile.md5sum
  42. where mediaFile.md5sum=?`, md5sum)) || []).reduce(reduceReqToMediaStruct, {})[md5sum] || null;
  43. return result?.HaveAccess(accessList) ? result : null;
  44. }
  45. module.exports.fetchMedias = async function(app, startTs, count) {
  46. let result = ((await app.databaseHelper.runSql(`
  47. select mediaFile.path, mediaFile.md5sum, mediaFile.date,
  48. mediaMeta.key as metaKey, mediaMeta.value as metaValue,
  49. mediaTag.tag as mediaTag
  50. from mediaFile
  51. left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum
  52. left join mediaTag on mediaTag.md5sum=mediaFile.md5sum
  53. where mediaFile.md5sum in
  54. (select md5sum from mediaFile `
  55. +(startTs ? "where date <? " : "")
  56. +"order by date desc limit ?)", startTs ? [startTs, count] : [count])) || [])
  57. .reduce(reduceReqToMediaStruct, {});
  58. result = Object.keys(result).map(i => result[i]).sort((a, b) => b.date-a.date);
  59. return result;
  60. };
  61. module.exports.fetchMediasWithAccess = async function(app, startTs, count, access) {
  62. let result = [];
  63. let lastTs = startTs;
  64. while (result.length < count) {
  65. let tmp = await module.exports.fetchMedias(app, lastTs, 25);
  66. if (!tmp.length)
  67. return result;
  68. lastTs = tmp[tmp.length-1].date;
  69. tmp = tmp.filter(i => i.HaveAccess(access));
  70. if (tmp.length)
  71. result = result.concat(tmp);
  72. }
  73. return result.slice(0, count);
  74. };
  75. module.exports.getMediaRange = async function(app) {
  76. let result = await app.databaseHelper.runSql("select min(date) as _min, max(date) as _max from mediaFile");
  77. return [ result?.[0]?._min || 0, result?.[0]?._max || 0 ];
  78. }