NCMediaManager.swift 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. class NCMediaManager {
  12. public static let shared: NCMediaManager = {
  13. let instance = NCMediaManager()
  14. return instance
  15. }()
  16. typealias ThumbnailLRUCache = LRUCache<String, UIImage>
  17. let cache: ThumbnailLRUCache = ThumbnailLRUCache(countLimit: 2000)
  18. func createCache(account: String) {
  19. let resultsMedia = NCManageDatabase.shared.getMediaOcIdEtag(account: account)
  20. guard !resultsMedia.isEmpty,
  21. let directory = CCUtility.getDirectoryProviderStorage() else { return }
  22. let ext = ".preview.ico"
  23. let manager = FileManager.default
  24. let resourceKeys = Set<URLResourceKey>([.nameKey, .pathKey, .fileSizeKey, .creationDateKey])
  25. struct FileInfo {
  26. var path: URL
  27. var ocId: String
  28. var date: Date
  29. }
  30. var files: [FileInfo] = []
  31. let startDate = Date()
  32. let startMemory = NCUtility.shared.getMemoryUsedAndDeviceTotalInMegabytes()
  33. NextcloudKit.shared.nkCommonInstance.writeLog("--------- start ThumbnailLRUCache image process ---------")
  34. // Get files only image / video
  35. if let enumerator = manager.enumerator(at: URL(fileURLWithPath: directory), includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles]) {
  36. for case let fileURL as URL in enumerator where fileURL.lastPathComponent.hasSuffix(ext) {
  37. let fileName = fileURL.lastPathComponent
  38. let ocId = fileURL.deletingLastPathComponent().lastPathComponent
  39. guard let resourceValues = try? fileURL.resourceValues(forKeys: resourceKeys),
  40. let size = resourceValues.fileSize,
  41. size > 0,
  42. let date = resourceValues.creationDate,
  43. let etag = resultsMedia[ocId],
  44. fileName == etag + ext else { continue }
  45. files.append(FileInfo(path: fileURL, ocId: ocId, date: date))
  46. }
  47. }
  48. // Sort for most recent
  49. files.sort(by: { $0.date > $1.date })
  50. if let firstDate = files.first?.date, let lastDate = files.last?.date {
  51. NextcloudKit.shared.nkCommonInstance.writeLog("First date: \(firstDate)")
  52. NextcloudKit.shared.nkCommonInstance.writeLog("Last date: \(lastDate)")
  53. }
  54. // Insert in cache
  55. cache.removeAllValues()
  56. for file in files {
  57. autoreleasepool {
  58. if let image = UIImage(contentsOfFile: file.path.path) {
  59. cache.setValue(image, forKey: file.ocId)
  60. }
  61. }
  62. }
  63. let endDate = Date()
  64. let diffDate = endDate.timeIntervalSinceReferenceDate - startDate.timeIntervalSinceReferenceDate
  65. let endMemory = NCUtility.shared.getMemoryUsedAndDeviceTotalInMegabytes()
  66. let usedMemory = endMemory.0 - startMemory.0
  67. NextcloudKit.shared.nkCommonInstance.writeLog("Counter process: \(cache.count)")
  68. NextcloudKit.shared.nkCommonInstance.writeLog("Time process: \(diffDate)")
  69. NextcloudKit.shared.nkCommonInstance.writeLog("Memory used for cache in MB: \(usedMemory)")
  70. NextcloudKit.shared.nkCommonInstance.writeLog("--------- stop ThumbnailLRUCache image process ---------")
  71. }
  72. func getImage(ocId: String) -> UIImage? {
  73. return cache.value(forKey: ocId)
  74. }
  75. func setImage(ocId: String, image: UIImage) {
  76. cache.setValue(image, forKey: ocId)
  77. }
  78. }