Browse Source

fix(meeting): 修复翻译音频导入路径处理及归档逻辑

改进翻译音频导入时的路径处理,自动归档到LocalAudio目录并统一标记类型。
修复跨平台路径分隔符兼容性问题,优化错误处理和日志记录。
同时调整上传分类逻辑,根据音频类型选择正确的上传目录。
newdev_shunjiawei
lxm 11 months ago
parent
commit
687cd58dd3
  1. 45
      lib/modules/meeting/controllers/meeting_home_controller.dart

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

@ -135,6 +135,7 @@ class MeetingHomeController extends GetxController {
.toList();
}
//未使用
void loadTranslatAudio() async {
try {
final appDir = await appDocDir; // 先 await 获取目录
@ -289,9 +290,9 @@ class MeetingHomeController extends GetxController {
}
}
// 新增:将翻译音频归档到 LocalAudio 并返回新路径(优先 rename,失败再 copy+delete)
// 新增(2025-11-04):将翻译音频归档到 LocalAudio 并返回新路径(优先 rename,失败再 copy+delete)
Future<String> _archiveTranslatToLocal(String srcPath) async {
// 中文注释:获取应用文档目录并确保 LocalAudio 目录存在
// 获取应用文档目录并确保 LocalAudio 目录存在
final appDir = await appDocDir;
final destDir = Directory(path.join(appDir.path, 'LocalAudio'));
if (!await destDir.exists()) {
@ -327,8 +328,9 @@ class MeetingHomeController extends GetxController {
for (final originalPath in selected) {
try {
// 中文注释:根据开关决定是否将翻译音频迁移到 LocalAudio
final usePath =
archiveToLocal ? await _archiveTranslatToLocal(originalPath) : originalPath;
final usePath = archiveToLocal
? await _archiveTranslatToLocal(originalPath)
: originalPath;
// 中文注释:计算音频时长与创建时间
await _audioPlayer.setAudioSource(AudioSource.file(usePath));
@ -370,7 +372,8 @@ class MeetingHomeController extends GetxController {
Logger.error('importFailed'
.tr
.replaceAll('{filePath}', originalPath)
.replaceAll('{error}', e.toString())); // 对应中文:导入文件失败: {filePath}, error: {error}
.replaceAll('{error}',
e.toString())); // 对应中文:导入文件失败: {filePath}, error: {error}
}
}
EasyLoading.dismiss();
@ -381,12 +384,30 @@ class MeetingHomeController extends GetxController {
String fileName = "";
bool isParamProvided = filePath != null; // 更清晰的变量名
String audioType = 'IMPORT'; // 默认类型为IMPORT
String effectivePath = filePath ?? '';
if (filePath != null) {
// 正确截取文件名(跨平台安全方式)
fileName = path.basename(filePath);
// 检查是否来自翻译模块
if (filePath.contains('/TranslatAudio/')) {
audioType = 'TRANSLAT'; // 设置为翻译音频类型
// 检查是否来自翻译模块(兼容不同平台路径分隔符)
final isFromTranslat = filePath.contains('/TranslatAudio/') ||
filePath.contains('\\TranslatAudio\\');
if (isFromTranslat) {
try {
// 实现——导入前将翻译音频归档到LocalAudio
effectivePath = await _archiveTranslatToLocal(filePath);
audioType = 'TRANSLAT'; // 归档后统一标记为TRANSLAT类型
fileName = path.basename(effectivePath);
} catch (e) {
// 归档失败则回退为原路径、保持TRANSLAT类型以避免中断导入
audioType = 'TRANSLAT';
effectivePath = filePath;
Logger.error('importFailed'
.tr
.replaceAll('{filePath}', filePath)
.replaceAll('{error}', e.toString())); // 翻译键代表的中文文本内容
}
} else {
effectivePath = filePath;
}
} else {
FilePickerResult? result = await FilePicker.platform.pickFiles(
@ -410,7 +431,7 @@ class MeetingHomeController extends GetxController {
}
// 使用文件路径而不是字节数据
filePath = file.path ?? await _copyFileToLocal(file);
effectivePath = file.path ?? await _copyFileToLocal(file);
fileName = file.name;
} else {
EasyLoading.dismiss();
@ -419,7 +440,7 @@ class MeetingHomeController extends GetxController {
}
final meetingId =
await insertMeetingAudio(fileName, filePath, type: audioType);
await insertMeetingAudio(fileName, effectivePath, type: audioType);
if (isParamProvided) {
Get.toNamed(Routes.meetingDetails, arguments: {
@ -449,10 +470,12 @@ class MeetingHomeController extends GetxController {
};
final meetingId = await SqfliteApi.insertMeeting(data);
if (meetingId != null) {
// 中文注释:根据类型选择上传分类;LOCAL 走 LocalAudio,其它走 ExternalAudio
final uploadBucket = type == 'LOCAL' ? 'LocalAudio' : 'ExternalAudio';
meetingUploadService.addUpload(
meetingId,
filePath,
'ExternalAudio',
uploadBucket,
isUpload: isUpload,
);
originalDataList.insert(0, {

Loading…
Cancel
Save