0.10.6
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
import Foundation
|
||||
|
||||
enum VideoNoteRecordingLifecycle: Equatable, Sendable {
|
||||
case idle
|
||||
case prepared
|
||||
case starting
|
||||
case recording
|
||||
case stopping
|
||||
|
||||
var isBusy: Bool {
|
||||
switch self {
|
||||
case .starting, .recording, .stopping:
|
||||
return true
|
||||
case .idle, .prepared:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
static func acceptsCompletion(activeURL: URL?, outputURL: URL) -> Bool {
|
||||
guard let activeURL else { return false }
|
||||
return normalizedRecordingPath(activeURL) == normalizedRecordingPath(outputURL)
|
||||
}
|
||||
|
||||
/// AVFoundation can return a temporary file through its canonical macOS
|
||||
/// path (`/private/var/...`) even when the caller supplied the equivalent
|
||||
/// user-facing path (`/var/...`). Treat those aliases as one recording so
|
||||
/// a valid delegate callback is not mistaken for a stale attempt.
|
||||
private static func normalizedRecordingPath(_ url: URL) -> String {
|
||||
var path = url.standardizedFileURL.resolvingSymlinksInPath().path
|
||||
for privateAlias in ["/private/var", "/private/tmp"] {
|
||||
if path == privateAlias || path.hasPrefix(privateAlias + "/") {
|
||||
path.removeFirst("/private".count)
|
||||
break
|
||||
}
|
||||
}
|
||||
return path
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user