Skip to content

Commit

Permalink
Merge pull request #2158 from onevcat/fix/local-file-cache-key-for-av…
Browse files Browse the repository at this point in the history
…asset

Use the correct cacheKey of local files for `AVAssetImageDataProvider`
  • Loading branch information
onevcat authored Oct 27, 2023
2 parents 66a7ff7 + 0a2213c commit aa89c25
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
5 changes: 4 additions & 1 deletion Sources/General/ImageSource/AVAssetImageDataProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ public struct AVAssetImageDataProvider: ImageDataProvider {
public let time: CMTime

private var internalKey: String {
return (assetImageGenerator.asset as? AVURLAsset)?.url.absoluteString ?? UUID().uuidString
guard let url = (assetImageGenerator.asset as? AVURLAsset)?.url else {
return UUID().uuidString
}
return url.cacheKey
}

/// The cache key used by `self`.
Expand Down
23 changes: 23 additions & 0 deletions Tests/KingfisherTests/ImageDataProviderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,29 @@ class ImageDataProviderTests: XCTestCase {
XCTAssertTrue(called)
}

func testAVAssetImageDataProviderCacheKeyVariesForRemote() {
let remoteURL1 = URL(string: "https://example.com/1/hello.mp4")!
let remoteURL2 = URL(string: "https://example.com/2/hello.mp4")!

let provider1 = AVAssetImageDataProvider(assetURL: remoteURL1, seconds: 10)
XCTAssertEqual(provider1.cacheKey, "https://example.com/1/hello.mp4_10.0")

let provider2 = AVAssetImageDataProvider(assetURL: remoteURL2, seconds: 10)
XCTAssertNotEqual(provider1.cacheKey, provider2.cacheKey)
}

// AVAssetImageDataProvider fix for appending to #1825
func testAVAssetImageDataProviderCacheKeyConsistForDifferentAppSandbox() {
let localURL1 = URL(string: "file:///Users/onevcat/Library/Developer/CoreSimulator/Devices/ABC/data/Containers/Bundle/Application/DEF/Kingfisher-Demo.app/video/hello.mp4")!
let localURL2 = URL(string: "file:///Users/onevcat/Library/Developer/CoreSimulator/Devices/ABC/data/Containers/Bundle/Application/XYZ/Kingfisher-Demo.app/video/hello.mp4")!

let provider1 = AVAssetImageDataProvider(assetURL: localURL1, seconds: 10)
XCTAssertEqual(provider1.cacheKey, "\(URL.localFileCacheKeyPrefix)/Kingfisher-Demo.app/video/hello.mp4_10.0")

let provider2 = AVAssetImageDataProvider(assetURL: localURL2, seconds: 10)
XCTAssertEqual(provider1.cacheKey, provider2.cacheKey)
}

#if swift(>=5.5)
#if canImport(_Concurrency)
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
Expand Down

0 comments on commit aa89c25

Please sign in to comment.