Skip to content

Commit

Permalink
webdav history sync thread safety
Browse files Browse the repository at this point in the history
  • Loading branch information
Predidit committed Feb 3, 2025
1 parent 569a4c2 commit 5218302
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 50 deletions.
28 changes: 10 additions & 18 deletions lib/app_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,22 +73,18 @@ class _AppWidgetState extends State<AppWidget>
debugPrint("应用进入后台");
bool webDavEnable =
await setting.get(SettingBoxKey.webDavEnable, defaultValue: false);
bool webDavEnableHistory =
await setting.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
bool webDavEnableHistory = await setting
.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
if (webDavEnable && webDavEnableHistory) {
try {
var webDav = WebDav();
webDav.updateHistory();
} catch (e) {
KazumiLogger().log(Level.error, '同步记录失败 ${e.toString()}');
}
var webDav = WebDav();
webDav.updateHistory();
}
} else if (state == AppLifecycleState.resumed) {
debugPrint("应用回到前台");
bool webDavEnable =
await setting.get(SettingBoxKey.webDavEnable, defaultValue: false);
bool webDavEnableHistory =
await setting.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
bool webDavEnableHistory = await setting
.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
if (webDavEnable && webDavEnableHistory) {
try {
var webDav = WebDav();
Expand All @@ -102,15 +98,11 @@ class _AppWidgetState extends State<AppWidget>
if (Platform.isWindows || Platform.isLinux) {
bool webDavEnable =
await setting.get(SettingBoxKey.webDavEnable, defaultValue: false);
bool webDavEnableHistory =
await setting.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
bool webDavEnableHistory = await setting
.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
if (webDavEnable && webDavEnableHistory) {
try {
var webDav = WebDav();
webDav.updateHistory();
} catch (e) {
KazumiLogger().log(Level.error, '同步记录失败 ${e.toString()}');
}
var webDav = WebDav();
webDav.updateHistory();
}
}
}
Expand Down
9 changes: 2 additions & 7 deletions lib/pages/player/player_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,8 @@ class _PlayerItemState extends State<PlayerItem>
}
danmakuController.clear();
if (webDavEnable && webDavEnableHistory) {
try {
var webDav = WebDav();
webDav.updateHistory();
} catch (e) {
KazumiDialog.showToast(message: '同步记录失败 ${e.toString()}');
KazumiLogger().log(Level.error, '同步记录失败 ${e.toString()}');
}
var webDav = WebDav();
webDav.updateHistory();
}
}

Expand Down
27 changes: 14 additions & 13 deletions lib/pages/webdav_editor/webdav_setting.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ class _PlayerSettingsPageState extends State<WebDavSettingsPage> {
void initState() {
super.initState();
webDavEnable = setting.get(SettingBoxKey.webDavEnable, defaultValue: false);
webDavEnableHistory = setting.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
enableGitProxy = setting.get(SettingBoxKey.enableGitProxy, defaultValue: false);
webDavEnableHistory =
setting.get(SettingBoxKey.webDavEnableHistory, defaultValue: false);
enableGitProxy =
setting.get(SettingBoxKey.enableGitProxy, defaultValue: false);
}

void onBackPressed(BuildContext context) {}
Expand Down Expand Up @@ -56,14 +58,10 @@ class _PlayerSettingsPageState extends State<WebDavSettingsPage> {
var webDavEnable =
await setting.get(SettingBoxKey.webDavEnable, defaultValue: false);
if (webDavEnable) {
try {
KazumiDialog.showToast(message: '尝试上传到WebDav');
var webDav = WebDav();
await webDav.updateHistory();
KazumiDialog.showToast(message: '同步成功');
} catch (e) {
KazumiDialog.showToast(message: '同步失败 ${e.toString()}');
}
KazumiDialog.showToast(message: '尝试上传到WebDav');
var webDav = WebDav();
await webDav.updateHistory();
KazumiDialog.showToast(message: '同步成功');
} else {
KazumiDialog.showToast(message: '未开启WebDav同步或配置无效');
}
Expand Down Expand Up @@ -107,7 +105,8 @@ class _PlayerSettingsPageState extends State<WebDavSettingsPage> {
SettingsTile.switchTile(
onToggle: (value) async {
enableGitProxy = value ?? !enableGitProxy;
await setting.put(SettingBoxKey.enableGitProxy, enableGitProxy);
await setting.put(
SettingBoxKey.enableGitProxy, enableGitProxy);
setState(() {});
},
title: const Text('Github镜像'),
Expand All @@ -125,7 +124,8 @@ class _PlayerSettingsPageState extends State<WebDavSettingsPage> {
if (!WebDav().initialized && webDavEnable) {
WebDav().init();
}
await setting.put(SettingBoxKey.webDavEnable, webDavEnable);
await setting.put(
SettingBoxKey.webDavEnable, webDavEnable);
setState(() {});
},
title: const Text('WEBDAV同步'),
Expand All @@ -138,7 +138,8 @@ class _PlayerSettingsPageState extends State<WebDavSettingsPage> {
return;
}
webDavEnableHistory = value ?? !webDavEnableHistory;
await setting.put(SettingBoxKey.webDavEnableHistory, webDavEnableHistory);
await setting.put(SettingBoxKey.webDavEnableHistory,
webDavEnableHistory);
setState(() {});
},
title: const Text('观看记录同步'),
Expand Down
45 changes: 33 additions & 12 deletions lib/utils/webdav.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ class WebDav {
late webdav.Client client;

bool initialized = false;
// make sure only one upload history task at a time
bool isHistorySyncing = false;

WebDav._internal();
static final WebDav _instance = WebDav._internal();
Expand Down Expand Up @@ -66,7 +68,16 @@ class WebDav {
}

Future<void> updateHistory() async {
await update('histories');
if (isHistorySyncing) {
return;
}
isHistorySyncing = true;
try {
await update('histories');
} catch (e) {
KazumiLogger().log(Level.error, 'webDav update history failed $e');
}
isHistorySyncing = false;
}

Future<void> updateCollectibles() async {
Expand All @@ -80,19 +91,29 @@ class WebDav {
}

Future<void> downloadAndPatchHistory() async {
String fileName = 'histories.tmp';
if (!await webDavLocalTempDirectory.exists()) {
await webDavLocalTempDirectory.create(recursive: true);
if (isHistorySyncing) {
return;
}
final existingFile = File('${webDavLocalTempDirectory.path}/$fileName');
if (await existingFile.exists()) {
await existingFile.delete();
isHistorySyncing = true;
String fileName = 'histories.tmp';
try {
if (!await webDavLocalTempDirectory.exists()) {
await webDavLocalTempDirectory.create(recursive: true);
}
final existingFile = File('${webDavLocalTempDirectory.path}/$fileName');
if (await existingFile.exists()) {
await existingFile.delete();
}
await client.read2File('/kazumiSync/$fileName', existingFile.path,
onProgress: (c, t) {
// print(c / t);
});
await GStorage.patchHistory(existingFile.path);
} catch (e) {
KazumiLogger()
.log(Level.error, 'webDav download and patch history failed $e');
}
await client.read2File('/kazumiSync/$fileName', existingFile.path,
onProgress: (c, t) {
// print(c / t);
});
await GStorage.patchHistory(existingFile.path);
isHistorySyncing = false;
}

Future<void> downloadCollectibles() async {
Expand Down

0 comments on commit 5218302

Please sign in to comment.