@@ -10,8 +10,13 @@ import LinkPresentation
1010import UIKit
1111
1212final class WebPageMetadataService {
13+ private let imageStore : WebPageImageStore
1314 private let logger = Logger ( category: " WebPageMetadataService " )
1415
16+ init ( store: WebPageImageStore ) {
17+ self . imageStore = store
18+ }
19+
1520 func fetchMetadata( from urlString: String ) async throws -> WebPageMetadataResponse {
1621 logger. info ( " Fetching metadata for URL: \( urlString) " )
1722
@@ -46,12 +51,7 @@ final class WebPageMetadataService {
4651 }
4752
4853 do {
49- let removed = try await Task . detached ( priority: . utility) {
50- let fileURL = try Self . cacheFileURL ( for: url)
51- guard FileManager . default. fileExists ( atPath: fileURL. path) else { return false }
52- try FileManager . default. removeItem ( at: fileURL)
53- return true
54- } . value
54+ let removed = try imageStore. removeImage ( for: url)
5555
5656 if removed {
5757 logger. info ( " Removed cached image for URL: \( urlString) " )
@@ -66,11 +66,12 @@ final class WebPageMetadataService {
6666 throw URLError ( . badURL)
6767 }
6868
69- return try Self . cacheFileURL ( for: url)
69+ return try imageStore . cachedImageURL ( for: url)
7070 }
7171
7272 private func extractImageURL( from imageProvider: NSItemProvider ? , url: URL ) async throws -> URL ? {
7373 guard let imageProvider else { return nil }
74+ let imageStore = self . imageStore
7475
7576 return try await withCheckedThrowingContinuation { continuation in
7677 imageProvider. loadObject ( ofClass: UIImage . self) { image, error in
@@ -86,44 +87,12 @@ final class WebPageMetadataService {
8687 }
8788
8889 do {
89- let fileURL = try Self . cacheFileURL ( for: url)
90- Task . detached { [ data, fileURL] in
91- do {
92- try data. write ( to: fileURL, options: [ . atomic] )
93- continuation. resume ( returning: fileURL)
94- } catch {
95- continuation. resume ( throwing: error)
96- }
97- }
90+ let fileURL = try imageStore. saveImage ( data, for: url)
91+ continuation. resume ( returning: fileURL)
9892 } catch {
9993 continuation. resume ( throwing: error)
10094 }
10195 }
10296 }
10397 }
104-
105- private static func cacheFileURL( for url: URL ) throws -> URL {
106- let imageDir = try imageDirectoryURL ( )
107- let fileName = url. absoluteString
108- . addingPercentEncoding ( withAllowedCharacters: . alphanumerics) ?? UUID ( ) . uuidString
109-
110- return imageDir
111- . appendingPathComponent ( fileName)
112- . appendingPathExtension ( " jpeg " )
113- }
114-
115- private static func imageDirectoryURL( ) throws -> URL {
116- let directory = try FileManager . default. url (
117- for: . applicationSupportDirectory,
118- in: . userDomainMask,
119- appropriateFor: nil ,
120- create: true
121- )
122- let imageDir = directory. appendingPathComponent ( " webPageImages " , isDirectory: true )
123- if !FileManager. default. fileExists ( atPath: imageDir. path) {
124- try FileManager . default. createDirectory ( at: imageDir, withIntermediateDirectories: true )
125- }
126-
127- return imageDir
128- }
12998}
0 commit comments