Files
Luma/Sources/Shared/Models/VideoNoteRecordingCompletionPolicy.swift
T
2026-07-30 20:07:51 +07:00

45 lines
1.7 KiB
Swift

import AVFoundation
import Foundation
/// AVCaptureMovieFileOutput may finish with a non-nil error while explicitly
/// reporting that the movie file itself was completed successfully.
enum VideoNoteRecordingCompletionPolicy {
static func shouldKeepOutput(for error: Error?) -> Bool {
guard let error else { return true }
let value = error as NSError
if value.domain == AVFoundationErrorDomain,
value.code == AVError.Code.maximumDurationReached.rawValue {
return true
}
if let finished = value.userInfo[AVErrorRecordingSuccessfullyFinishedKey] as? Bool {
return finished
}
return (value.userInfo[AVErrorRecordingSuccessfullyFinishedKey] as? NSNumber)?.boolValue
== true
}
/// A camera interruption may still leave a playable partial movie. That
/// file is useful for recovery, but it must not be sent as though the user
/// released the record button. The 60-second capture limit is the only
/// completion that is expected without an explicit stop request.
static func wasRequestedOrReachedLimit(
stopRequested: Bool,
error: Error?,
recordedDuration: TimeInterval,
maximumDuration: TimeInterval
) -> Bool {
if stopRequested { return true }
if let error,
(error as NSError).domain == AVFoundationErrorDomain,
(error as NSError).code == AVError.Code.maximumDurationReached.rawValue {
return true
}
guard recordedDuration.isFinite,
maximumDuration.isFinite,
maximumDuration > 0 else { return false }
return recordedDuration >= maximumDuration - 0.25
}
}