From 9aef265ea214ba554e19081b62a371d6762f9822 Mon Sep 17 00:00:00 2001 From: ngfchl Date: Sat, 18 Jul 2026 16:18:13 +0800 Subject: [PATCH] feat: make tmdb image proxy configurable --- lib/core/storage/storage_manager.dart | 1 + lib/pages/media_library_page.dart | 17 ++++++++++++----- lib/pages/settings_page.dart | 20 ++++++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/core/storage/storage_manager.dart b/lib/core/storage/storage_manager.dart index 197b81a..9ac702c 100644 --- a/lib/core/storage/storage_manager.dart +++ b/lib/core/storage/storage_manager.dart @@ -12,6 +12,7 @@ class StorageKeys { static const String tmdbApiKey = 'guangya.tmdbApiKey'; static const String tmdbProxyHost = 'guangya.tmdbProxyHost'; static const String tmdbProxyPort = 'guangya.tmdbProxyPort'; + static const String tmdbImageProxy = 'guangya.tmdbImageProxy'; static const String mediaLibraries = 'guangya.mediaLibraries'; static const String mediaLibraryItems = 'guangya.mediaLibraryItems'; static const String mediaCategoryRules = 'guangya.mediaCategoryRules'; diff --git a/lib/pages/media_library_page.dart b/lib/pages/media_library_page.dart index d9a465e..e5f273b 100644 --- a/lib/pages/media_library_page.dart +++ b/lib/pages/media_library_page.dart @@ -16,11 +16,18 @@ enum _MediaWallFilter { all, movies, series, collections, unmatched } String _tmdbImageURL(String path, {required String size}) { final source = _tmdbDirectImageURL(path, size: size); - return Uri.https('wsrv.nl', '/', { - 'url': source, - 'output': 'webp', - 'q': '85', - }).toString(); + final configured = StorageManager.get( + StorageKeys.tmdbImageProxy, + )?.trim(); + if (configured != null && configured.isEmpty) return source; + final proxy = Uri.tryParse(configured ?? 'https://wsrv.nl'); + if (proxy == null || !proxy.hasScheme || proxy.host.isEmpty) return source; + return proxy + .replace( + path: proxy.path.isEmpty ? '/' : proxy.path, + queryParameters: {'url': source, 'output': 'webp', 'q': '85'}, + ) + .toString(); } String _tmdbDirectImageURL(String path, {required String size}) { diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index e8a40fe..e3dbdfe 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -15,6 +15,7 @@ class _SettingsDialogState extends ConsumerState { final _tmdbApiKeyController = TextEditingController(); final _tmdbProxyHostController = TextEditingController(); final _tmdbProxyPortController = TextEditingController(); + final _tmdbImageProxyController = TextEditingController(); final _httpProxyHostController = TextEditingController(); final _httpProxyPortController = TextEditingController(); final _scanConcurrencyController = TextEditingController(); @@ -31,6 +32,9 @@ class _SettingsDialogState extends ConsumerState { StorageManager.get(StorageKeys.tmdbProxyHost) ?? ''; _tmdbProxyPortController.text = StorageManager.get(StorageKeys.tmdbProxyPort) ?? ''; + _tmdbImageProxyController.text = + StorageManager.get(StorageKeys.tmdbImageProxy) ?? + 'https://wsrv.nl'; _httpProxyHostController.text = StorageManager.get(StorageKeys.httpProxyHost) ?? ''; _httpProxyPortController.text = @@ -50,6 +54,7 @@ class _SettingsDialogState extends ConsumerState { _tmdbApiKeyController.dispose(); _tmdbProxyHostController.dispose(); _tmdbProxyPortController.dispose(); + _tmdbImageProxyController.dispose(); _httpProxyHostController.dispose(); _httpProxyPortController.dispose(); _scanConcurrencyController.dispose(); @@ -270,6 +275,17 @@ class _SettingsDialogState extends ConsumerState { ), ), ), + _SettingsRow( + icon: Icons.image_rounded, + label: '图片加速代理', + child: SizedBox( + width: 200, + child: ShadInput( + controller: _tmdbImageProxyController, + placeholder: const Text('https://wsrv.nl(留空直连)'), + ), + ), + ), const SizedBox(height: 16), const ShadSeparator.horizontal(), const SizedBox(height: 16), @@ -310,6 +326,10 @@ class _SettingsDialogState extends ConsumerState { StorageKeys.tmdbProxyPort, _tmdbProxyPortController.text.trim(), ); + StorageManager.set( + StorageKeys.tmdbImageProxy, + _tmdbImageProxyController.text.trim(), + ); StorageManager.set( StorageKeys.httpProxyHost, _httpProxyHostController.text.trim(),