1
0

mediaService.js 3.0 KB

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