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