diff --git a/Sources/HLSRecorder.swift b/Sources/HLSRecorder.swift index 0631a87..9185c7c 100644 --- a/Sources/HLSRecorder.swift +++ b/Sources/HLSRecorder.swift @@ -36,10 +36,13 @@ final class HLSRecorder: ObservableObject { recordTask = Task { do { let outputURL = try await recordStream(url: url) - NSLog("[MiniPlayer] recordStream completed: %@", outputURL.path) + NSLog("[MiniPlayer] recordStream completed: %@, exists: %d", outputURL.path, FileManager.default.fileExists(atPath: outputURL.path)) + let attrs = try? FileManager.default.attributesOfItem(atPath: outputURL.path) + NSLog("[MiniPlayer] Output file size: %lld", (attrs?[.size] as? Int64) ?? 0) await MainActor.run { self.isRecording = false self.timer?.invalidate() + NSLog("[MiniPlayer] Calling onRecordingSaved...") self.onRecordingSaved?(outputURL) } } catch is CancellationError { diff --git a/Sources/MiniPlayerApp.swift b/Sources/MiniPlayerApp.swift index 38bb925..62b0fe7 100644 --- a/Sources/MiniPlayerApp.swift +++ b/Sources/MiniPlayerApp.swift @@ -585,10 +585,15 @@ struct BricksAppView: View { } } .sheet(isPresented: Binding( - get: { bridge.pendingExportURL != nil }, + get: { + let has = bridge.pendingExportURL != nil + if has { NSLog("[MiniPlayer] Sheet binding: pendingExportURL=%@", bridge.pendingExportURL?.lastPathComponent ?? "nil") } + return has + }, set: { if !$0 { bridge.pendingExportURL = nil } } )) { if let url = bridge.pendingExportURL { + NSLog("[MiniPlayer] Presenting ActivityShareSheet for: %@", url.lastPathComponent) ActivityShareSheet(url: url) { bridge.pendingExportURL = nil } diff --git a/Sources/PlayerBridge.swift b/Sources/PlayerBridge.swift index 97b30b7..83ba4ba 100644 --- a/Sources/PlayerBridge.swift +++ b/Sources/PlayerBridge.swift @@ -178,8 +178,10 @@ final class PlayerBridge: ObservableObject { #if os(iOS) hlsRecorder.onRecordingSaved = { [weak self] url in + NSLog("[MiniPlayer] onRecordingSaved called, setting pendingExportURL: %@", url.lastPathComponent) self?.showToast("Saved: \(url.lastPathComponent)") self?.pendingExportURL = url + NSLog("[MiniPlayer] pendingExportURL set to: %@", url.lastPathComponent) } hlsRecorder.onError = { [weak self] msg in self?.showToast(msg) diff --git a/Sources/PlayerRecorder.swift b/Sources/PlayerRecorder.swift index aaf477e..e0476a2 100644 --- a/Sources/PlayerRecorder.swift +++ b/Sources/PlayerRecorder.swift @@ -62,10 +62,13 @@ final class PlayerRecorder: NSObject { try await recorder.start(url: url, outputPath: tempURL.path, duration: 0) // duration=0 表示无限录制,直到 stop() 被调用 // start 在 stop() 后会正常返回 - NSLog("[Recorder] ✓ Recording completed: %@", tempURL.path) + NSLog("[Recorder] ✓ Recording completed: %@, file exists: %d", tempURL.path, FileManager.default.fileExists(atPath: tempURL.path)) + let attrs = try? FileManager.default.attributesOfItem(atPath: tempURL.path) + NSLog("[Recorder] Output file size: %lld", (attrs?[.size] as? Int64) ?? 0) await MainActor.run { RecorderState.isFinalizing = false self?.stopDurationTimer() + NSLog("[Recorder] Calling showSaveDialog...") self?.showSaveDialog(tempURL: tempURL) } } catch { @@ -129,6 +132,7 @@ final class PlayerRecorder: NSObject { // MARK: - 保存对话框 private func showSaveDialog(tempURL: URL) { + NSLog("[Recorder] showSaveDialog called for: %@", tempURL.lastPathComponent) let panel = NSSavePanel() panel.allowedContentTypes = [.mpeg4Movie] // 默认文件名去掉 temp_ 前缀 @@ -136,25 +140,28 @@ final class PlayerRecorder: NSObject { panel.nameFieldStringValue = defaultName panel.directoryURL = saveDirectory - panel.begin { [weak self] response in - Task { @MainActor in - if response == .OK, let url = panel.url { - do { - if FileManager.default.fileExists(atPath: url.path) { - try FileManager.default.removeItem(at: url) - } - try FileManager.default.moveItem(at: tempURL, to: url) - NSLog("[Recorder] ✓ Saved: %@", url.path) - self?.onRecordingSaved?(url) - } catch { - NSLog("[Recorder] ✗ Save failed: %@", error.localizedDescription) - self?.onError?("Save failed: \(error.localizedDescription)") + // NSSavePanel.begin(completionHandler:) 已被 macOS 12 废弃,macOS 26 上可能静默失效 + // 使用现代 async begin() API + Task { @MainActor [weak self] in + NSLog("[Recorder] NSSavePanel.begin() starting...") + let response = await panel.begin() + NSLog("[Recorder] NSSavePanel response: %d", response.rawValue) + if response == .OK, let url = panel.url { + do { + if FileManager.default.fileExists(atPath: url.path) { + try FileManager.default.removeItem(at: url) } - } else { - try? FileManager.default.removeItem(at: tempURL) + try FileManager.default.moveItem(at: tempURL, to: url) + NSLog("[Recorder] ✓ Saved: %@", url.path) + self?.onRecordingSaved?(url) + } catch { + NSLog("[Recorder] ✗ Save failed: %@", error.localizedDescription) + self?.onError?("Save failed: \(error.localizedDescription)") } - self?.checkPendingTerminate() + } else { + try? FileManager.default.removeItem(at: tempURL) } + self?.checkPendingTerminate() } }