NCMediaManager.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // NCMediaManager.swift
  3. // Nextcloud
  4. //
  5. // Created by Milen on 10.10.23.
  6. // Copyright © 2023 Marino Faggiana. All rights reserved.
  7. //
  8. import UIKit
  9. import LRUCache
  10. import NextcloudKit
  11. import Queuer
  12. struct ScaledThumbnail: Hashable {
  13. let image: UIImage
  14. var isPlaceholderImage = false
  15. var scaledSize: CGSize = .zero
  16. let ocId: String
  17. func hash(into hasher: inout Hasher) {
  18. hasher.combine(ocId)
  19. }
  20. }
  21. @objc class NCMediaManager: NSObject {
  22. @objc public static let shared: NCMediaManager = {
  23. let instance = NCMediaManager()
  24. return instance
  25. }()
  26. typealias ThumbnailLRUCache = LRUCache<String, ScaledThumbnail>
  27. private let cache: ThumbnailLRUCache = ThumbnailLRUCache(countLimit: 2000)
  28. @objc func createCache(account: String) {
  29. let resultsMedia = NCManageDatabase.shared.getMediaOcIdEtag(account: account)
  30. guard !resultsMedia.isEmpty,
  31. let directory = CCUtility.getDirectoryProviderStorage() else { return }
  32. let ext = ".preview.ico"
  33. let manager = FileManager.default
  34. let resourceKeys = Set<URLResourceKey>([.nameKey, .pathKey, .fileSizeKey, .creationDateKey])
  35. struct FileInfo {
  36. var path: URL
  37. var ocId: String
  38. var date: Date
  39. }
  40. var files: [FileInfo] = []
  41. let startDate = Date()
  42. NextcloudKit.shared.nkCommonInstance.writeLog("--------- start ThumbnailLRUCache image process ---------")
  43. // Get files only image / video
  44. if let enumerator = manager.enumerator(at: URL(fileURLWithPath: directory), includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles]) {
  45. for case let fileURL as URL in enumerator where fileURL.lastPathComponent.hasSuffix(ext) {
  46. let fileName = fileURL.lastPathComponent
  47. let ocId = fileURL.deletingLastPathComponent().lastPathComponent
  48. guard let resourceValues = try? fileURL.resourceValues(forKeys: resourceKeys),
  49. let size = resourceValues.fileSize,
  50. size > 0,
  51. let date = resourceValues.creationDate,
  52. let etag = resultsMedia[ocId],
  53. fileName == etag + ext else { continue }
  54. files.append(FileInfo(path: fileURL, ocId: ocId, date: date))
  55. }
  56. }
  57. // Sort for most recent
  58. files.sort(by: { $0.date > $1.date })
  59. if let firstDate = files.first?.date, let lastDate = files.last?.date {
  60. print("First date: \(firstDate)")
  61. print("Last date: \(lastDate)")
  62. }
  63. // Insert in cache
  64. cache.removeAllValues()
  65. for file in files {
  66. autoreleasepool {
  67. if let image = UIImage(contentsOfFile: file.path.path) {
  68. let scaledThumbnail = ScaledThumbnail(image: image, ocId: file.ocId)
  69. cache.setValue(scaledThumbnail, forKey: file.ocId)
  70. }
  71. }
  72. }
  73. let endDate = Date()
  74. let diffDate = endDate.timeIntervalSinceReferenceDate - startDate.timeIntervalSinceReferenceDate
  75. NextcloudKit.shared.nkCommonInstance.writeLog("Counter process: \(cache.count)")
  76. NextcloudKit.shared.nkCommonInstance.writeLog("Time process: \(diffDate)")
  77. NextcloudKit.shared.nkCommonInstance.writeLog("--------- stop ThumbnailLRUCache image process ---------")
  78. }
  79. func getImage(ocId: String) -> UIImage? {
  80. if let scaledThumbnail = cache.value(forKey: ocId) {
  81. return scaledThumbnail.image
  82. }
  83. return nil
  84. }
  85. func setImage(ocId: String, image: UIImage) {
  86. let scaledThumbnail = ScaledThumbnail(image: image, ocId: ocId)
  87. cache.setValue(scaledThumbnail, forKey: ocId)
  88. }
  89. @objc func clearCache() {
  90. cache.removeAllValues()
  91. }
  92. }