|
1 | 1 | import 'dart:async'; |
2 | 2 | import 'dart:developer'; |
3 | 3 | import 'package:flutter/services.dart'; |
| 4 | +import 'package:pure_live/plugins/locale_helper.dart'; |
4 | 5 | import 'package:pure_live/recorder/ffmpeg/ffmpeg_event.dart'; |
5 | 6 | import 'package:pure_live/recorder/ffmpeg/ffmpeg_types.dart'; |
6 | 7 | import 'package:ffmpeg_kit_extended_flutter/ffmpeg_kit_extended_flutter.dart'; |
@@ -79,21 +80,35 @@ class FFmpegService { |
79 | 80 | final String logs = completedSession.getLogs() ?? ''; |
80 | 81 | log('FFmpeg 原始错误日志:\n$logs'); |
81 | 82 | final lowerLogs = logs.toLowerCase(); |
82 | | - // 根据纯文本中的关键字,为用户转换出看得懂的大白话提示 |
| 83 | + errorData["raw_logs"] = lowerLogs; |
| 84 | + // 1. 路径与权限错误 |
83 | 85 | if (code == -2 || lowerLogs.contains('no such file') || lowerLogs.contains('permission denied')) { |
84 | | - userFriendlyMessage = '录制失败:保存路径不存在、包含非法字符,或软件没有存储权限。请前往设置修改下载目录。'; |
85 | | - } else if (lowerLogs.contains('server returned 404') || lowerLogs.contains('invalid argument')) { |
86 | | - userFriendlyMessage = '参数错误,请联系开发者解决'; |
87 | | - } else if (lowerLogs.contains('server returned 404') || lowerLogs.contains('http error 404')) { |
88 | | - userFriendlyMessage = '录制失败:当前直播源地址已失效 (404 Not Found)。'; |
89 | | - } else if (lowerLogs.contains('server returned 403') || lowerLogs.contains('http error 403')) { |
90 | | - userFriendlyMessage = '录制失败:直播源拒绝访问 (403 Forbidden),防盗链可能已过期。'; |
91 | | - } else if (lowerLogs.contains('connection timed out') || lowerLogs.contains('timed out')) { |
92 | | - userFriendlyMessage = '录制失败:连接直播间服务器超时,请检查网络或代理设置。'; |
93 | | - } else if (lowerLogs.contains('invalid argument') || lowerLogs.contains('unable to open')) { |
94 | | - userFriendlyMessage = '录制失败:输入的直播流地址格式有误,无法打开。'; |
95 | | - } else if (logs.trim().isNotEmpty) { |
96 | | - userFriendlyMessage = '录制错误: ${logs.trim().split('\n').last}'; |
| 86 | + userFriendlyMessage = i18n('path_or_permission_error'); |
| 87 | + } |
| 88 | + // 2. 拦截 404 错误(原逻辑在此处有重复条件,现已优化合并) |
| 89 | + else if (lowerLogs.contains('server returned 404') || lowerLogs.contains('http error 404')) { |
| 90 | + userFriendlyMessage = i18n('url_expired_404'); |
| 91 | + } |
| 92 | + // 3. 拦截 403 错误 |
| 93 | + else if (lowerLogs.contains('server returned 403') || lowerLogs.contains('http error 403')) { |
| 94 | + userFriendlyMessage = i18n('url_forbidden_403'); |
| 95 | + } |
| 96 | + // 4. 拦截连接超时 |
| 97 | + else if (lowerLogs.contains('connection timed out') || lowerLogs.contains('timed out')) { |
| 98 | + userFriendlyMessage = i18n('timeout'); |
| 99 | + } |
| 100 | + // 5. 拦截参数错误 |
| 101 | + else if (lowerLogs.contains('invalid argument')) { |
| 102 | + userFriendlyMessage = i18n('param_error'); |
| 103 | + } |
| 104 | + // 6. 拦截流地址格式无法打开 |
| 105 | + else if (lowerLogs.contains('unable to open')) { |
| 106 | + userFriendlyMessage = i18n('invalid_stream_format'); |
| 107 | + } |
| 108 | + // 7. 兜底未知错误:提取最后一行并使用具名参数传给国际化 |
| 109 | + else if (logs.trim().isNotEmpty) { |
| 110 | + final lastLogLine = logs.trim().split('\n').last; |
| 111 | + userFriendlyMessage = i18n('unknown_error', args: {'error_log': lastLogLine}); |
97 | 112 | } |
98 | 113 | } catch (e) { |
99 | 114 | log('解析 FFmpeg 日志时发生异常: $e'); |
|
0 commit comments