1
0

mediaService.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. function Media()
  2. {
  3. }
  4. function MediaStruct(i) {
  5. this.path = i.path;
  6. this.md5sum = i.md5sum;
  7. this.date = i.date;
  8. this.meta = {};
  9. this.tags = [];
  10. }
  11. MediaStruct.prototype.pushMeta = function(key, value) {
  12. if (key && value && !this.meta[key])
  13. this.meta[key] = value;
  14. }
  15. MediaStruct.prototype.pushTag = function(tag) {
  16. if (tag && this.tags.indexOf(tag) === -1)
  17. this.tags.push(tag);
  18. }
  19. MediaStruct.prototype.HaveAccess = function(accessList) {
  20. // FIXME
  21. return true;
  22. }
  23. function reduceReqToMediaStruct(acc, i) {
  24. let obj = acc[i.md5sum] = acc[i.md5sum] || new MediaStruct(i);
  25. obj.pushMeta(i.metaKey, i.metaValue);
  26. obj.pushTag(i.mediaTag);
  27. return acc;
  28. }
  29. module.exports.fetchOne = async function(app, md5sum, accessList) {
  30. let result = ((await app.databaseHelper.runSql(`
  31. select mediaFile.path, mediaFile.md5sum, mediaFile.date,
  32. mediaMeta.key as metaKey, mediaMeta.value as metaValue,
  33. mediaTag.tag as mediaTag
  34. from mediaFile
  35. left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum
  36. left join mediaTag on mediaTag.md5sum=mediaFile.md5sum
  37. where mediaFile.md5sum=?`, md5sum)) || []).reduce(reduceReqToMediaStruct, {})[md5sum] || null;
  38. return result.HaveAccess(accessList) ? result : null;
  39. }
  40. module.exports.fetchMedias = async function(app, startTs, count) {
  41. let result = ((await app.databaseHelper.runSql(`
  42. select mediaFile.path, mediaFile.md5sum, mediaFile.date,
  43. mediaMeta.key as metaKey, mediaMeta.value as metaValue,
  44. mediaTag.tag as mediaTag
  45. from mediaFile
  46. left join mediaMeta on mediaMeta.md5sum=mediaFile.md5sum
  47. left join mediaTag on mediaTag.md5sum=mediaFile.md5sum
  48. where mediaFile.md5sum in
  49. (select md5sum from mediaFile `
  50. +(startTs ? "where date <? " : "")
  51. +"order by date desc limit ?)", startTs ? [startTs, count] : [count])) || [])
  52. .reduce(reduceReqToMediaStruct, {});
  53. result = Object.keys(result).map(i => result[i]).sort((a, b) => b.date-a.date);
  54. return result;
  55. };
  56. module.exports.fetchMediasWithAccess = async function(app, startTs, count, access) {
  57. let result = [];
  58. let lastTs = startTs;
  59. while (result.length < count) {
  60. let tmp = await module.exports.fetchMedias(app, lastTs, 25);
  61. if (!tmp.length)
  62. return result;
  63. lastTs = tmp[tmp.length-1].date;
  64. tmp = tmp.filter(i => i.HaveAccess(access));
  65. if (tmp.length)
  66. result = result.concat(tmp);
  67. }
  68. return result;
  69. };