Browse Source

feat(meeting): 为本地录音添加暂存标题功能

在保存录音时,不再直接重命名文件,而是将新标题暂存到存储中。当导入本地录音时,会优先使用暂存的标题作为显示名称,避免因文件重命名导致的导入失败问题。
weicu
lxm 8 months ago
parent
commit
b8cdebfab3
  1. 25
      lib/data/services/meeting/meeting_task_service.dart
  2. 9
      lib/modules/meeting/controllers/meeting_home_controller.dart
  3. 27
      lib/modules/meeting/controllers/meeting_record_controller.dart

25
lib/data/services/meeting/meeting_task_service.dart

@ -11,6 +11,10 @@ import 'meeting_upload_service.dart';
class MeetingTaskService extends GetxService {
MeetingUploadService get _uploadService => Get.find<MeetingUploadService>();
final GetStorage _storage = GetStorage();
static const String _pendingLocalRecordingTitleStorageKey =
'meeting_pending_local_recording_titles';
List _taskList = []; //待处理的会议任务列表
bool _isTask = false; //是否有正在处理的任务
@ -24,6 +28,27 @@ class MeetingTaskService extends GetxService {
String summary = '';
String overview = '';
void setPendingLocalRecordingTitle(String wavFileName, String displayTitle) {
if (wavFileName.isEmpty) return;
final data = _storage.read(_pendingLocalRecordingTitleStorageKey);
final map = (data is Map)
? Map<String, dynamic>.from(data)
: <String, dynamic>{};
map[wavFileName] = displayTitle;
_storage.write(_pendingLocalRecordingTitleStorageKey, map);
}
String? takePendingLocalRecordingTitle(String wavFileName) {
if (wavFileName.isEmpty) return null;
final data = _storage.read(_pendingLocalRecordingTitleStorageKey);
if (data is! Map) return null;
final map = Map<String, dynamic>.from(data);
final v = map.remove(wavFileName);
if (v == null) return null;
_storage.write(_pendingLocalRecordingTitleStorageKey, map);
return v.toString();
}
void requestLocalImport() {
localImportState.value++;
}

9
lib/modules/meeting/controllers/meeting_home_controller.dart

@ -259,8 +259,13 @@ class MeetingHomeController extends GetxController {
final creationTime = fileStat.changed.millisecondsSinceEpoch;
final originalFileName = entityName;
final pendingTitle = meetingTaskService
.takePendingLocalRecordingTitle(originalFileName);
final displayTitle = pendingTitle ?? originalFileName;
// 准备新路径
String fileName = filePath.split('/').last; //获取文件名(包含扩展名)
String fileName = originalFileName; //获取文件名(包含扩展名)
String newPath = "${destDir.path}/$fileName"; //构建新路径,保持原文件名
if (await File(newPath).exists()) {
final ext = path.extension(fileName);
@ -272,7 +277,7 @@ class MeetingHomeController extends GetxController {
// 构建要存入数据库的音频文件抽象对象
Map<String, Object?> data = {
'title': fileName,
'title': displayTitle,
'type': 'LOCAL',
'seconds': seconds,
'filepath': newPath, // 存储新路径

27
lib/modules/meeting/controllers/meeting_record_controller.dart

@ -476,7 +476,6 @@ class MeetingRecordController extends GetxController
if (isEditingTitle.value) {
newName.value = titleEditingController.text;
isEditingTitle.value = false;
// Actual file renaming happens during saveRecording()
}
}
@ -800,28 +799,14 @@ class MeetingRecordController extends GetxController
Future<void> _applyTitleChangeAfterSave() async {
if (fileName.value == newName.value) return;
final appDir = await appDocDir;
final dir = Directory("${appDir.path}/MeetingAudio/");
if (!await dir.exists()) await dir.create(recursive: true);
if (!Get.isRegistered<MeetingTaskService>()) return;
if (isMarked.value) {
final newDir = Directory("${appDir.path}/DestAudio/");
if (!await newDir.exists()) await newDir.create(recursive: true);
await _asrService
.moveFile(
"${dir.path}${fileName.value}.wav",
"${newDir.path}${fileName.value}.wav",
)
.timeout(_fileOpTimeout);
return;
}
final raw = newName.value.trim();
if (raw.isEmpty) return;
await _asrService
.renameFile(
"${dir.path}${fileName.value}.wav",
newName.value,
)
.timeout(_fileOpTimeout);
final nextTitle = raw.toLowerCase().endsWith('.wav') ? raw : '$raw.wav';
Get.find<MeetingTaskService>()
.setPendingLocalRecordingTitle('${fileName.value}.wav', nextTitle);
}
/// 将控制器重置到初始状态

Loading…
Cancel
Save