NCMediaManager.swift 3.0 KB

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