diff --git a/assets/images/live/live.gif b/assets/images/live/live.gif deleted file mode 100644 index f87db96b7..000000000 Binary files a/assets/images/live/live.gif and /dev/null differ diff --git a/assets/images/live/live.png b/assets/images/live/live.png new file mode 100644 index 000000000..8ddf9161c Binary files /dev/null and b/assets/images/live/live.png differ diff --git a/lib/common/assets.dart b/lib/common/assets.dart index 97996d364..134ac795f 100644 --- a/lib/common/assets.dart +++ b/lib/common/assets.dart @@ -15,9 +15,9 @@ abstract final class Assets { static const trendingBanner = 'assets/images/trending_banner.png'; static const ai = 'assets/images/ai.png'; - static const livingChart = 'assets/images/live.gif'; + // static const livingChart = 'assets/images/live.gif'; static const livingStatic = 'assets/images/live.png'; - static const livingRect = 'assets/images/live/live.gif'; + static const livingRect = 'assets/images/live/live.png'; static const livingBackground = 'assets/images/live/default_bg.webp'; static const thunder1 = 'assets/images/paycoins/ic_thunder_1.png'; diff --git a/lib/common/widgets/image/network_img_layer.dart b/lib/common/widgets/image/network_img_layer.dart index c6f327191..99ccf3144 100644 --- a/lib/common/widgets/image/network_img_layer.dart +++ b/lib/common/widgets/image/network_img_layer.dart @@ -71,7 +71,15 @@ class NetworkImgLayer extends StatelessWidget { memCacheHeight = height.cacheSize(context); } return CachedNetworkImage( - imageUrl: ImageUtils.thumbnailUrl(src, quality), + imageUrl: ImageUtils.thumbnailUrl( + src, + maxQuality: quality, + + /// remove gif + suffix: src!.endsWith(ImageUtils.kSuffixGIF) + ? ImageUtils.kSuffixJPG + : ImageUtils.kSuffixWEBP, + ), width: width, height: height, memCacheWidth: memCacheWidth, diff --git a/lib/common/widgets/image_grid/image_grid_view.dart b/lib/common/widgets/image_grid/image_grid_view.dart index b2fbfc84d..91db5437e 100644 --- a/lib/common/widgets/image_grid/image_grid_view.dart +++ b/lib/common/widgets/image_grid/image_grid_view.dart @@ -22,7 +22,6 @@ import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/image_grid/image_grid_builder.dart'; -import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; @@ -59,6 +58,8 @@ class ImageModel { bool get isLivePhoto => _isLivePhoto ??= enableLivePhoto && liveUrl?.isNotEmpty == true; + bool get isGif => url.endsWith(ImageUtils.kSuffixGIF); + static bool enableLivePhoto = Pref.enableLivePhoto; } @@ -245,13 +246,20 @@ class ImageGridView extends StatelessWidget { text: 'Live', right: 8, bottom: 8, - type: PBadgeType.gray, + type: .gray, ) else if (item.isLongPic) const PBadge( text: '长图', right: 8, bottom: 8, + ) + else if (item.isGif) + const PBadge( + text: 'GIF', + right: 8, + bottom: 8, + type: .gray, ), ], ); diff --git a/lib/common/widgets/image_viewer/gallery_viewer.dart b/lib/common/widgets/image_viewer/gallery_viewer.dart index be8479eda..baa582e1b 100644 --- a/lib/common/widgets/image_viewer/gallery_viewer.dart +++ b/lib/common/widgets/image_viewer/gallery_viewer.dart @@ -98,7 +98,7 @@ class _GalleryViewerState extends State String _getActualUrl(String url) { return _quality != 100 - ? ImageUtils.thumbnailUrl(url, _quality) + ? ImageUtils.thumbnailUrl(url, maxQuality: _quality) : url.http2https; } @@ -413,7 +413,10 @@ class _GalleryViewerState extends State _containerSize.width.cacheSize(context), null, CachedNetworkImageProvider( - ImageUtils.thumbnailUrl(item.url, widget.quality), + ImageUtils.thumbnailUrl( + item.url, + maxQuality: widget.quality, + ), ), ), minScale: widget.minScale, diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 4aff0b96d..386cb0172 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -1173,10 +1173,11 @@ class Emoji { String? url; late num size; + /// remove gif Emoji.fromJson(Map json) { url = - noneNullOrEmptyString(json['webp_url']) ?? - noneNullOrEmptyString(json['gif_url']) ?? + // noneNullOrEmptyString(json['webp_url']) ?? + // noneNullOrEmptyString(json['gif_url']) ?? noneNullOrEmptyString(json['icon_url']); size = json['size'] ?? 1; } diff --git a/lib/pages/article/view.dart b/lib/pages/article/view.dart index 5d92d25f1..93c2023b3 100644 --- a/lib/pages/article/view.dart +++ b/lib/pages/article/view.dart @@ -298,7 +298,7 @@ class _ArticlePageState extends CommonDynPageState { : null, imageUrl: ImageUtils.thumbnailUrl( pic.url, - 60, + maxQuality: 60, ), fadeInDuration: const Duration( milliseconds: 120, diff --git a/lib/pages/article/widgets/article_ops.dart b/lib/pages/article/widgets/article_ops.dart index 368a42473..2a9309bb6 100644 --- a/lib/pages/article/widgets/article_ops.dart +++ b/lib/pages/article/widgets/article_ops.dart @@ -73,7 +73,10 @@ class ArticleOpus extends StatelessWidget { width: width, height: height, memCacheWidth: width.cacheSize(context), - imageUrl: ImageUtils.thumbnailUrl(card.url, 60), + imageUrl: ImageUtils.thumbnailUrl( + card.url, + maxQuality: 60, + ), placeholder: (_, _) => const SizedBox.shrink(), ), ), diff --git a/lib/pages/article/widgets/html_render.dart b/lib/pages/article/widgets/html_render.dart index caf10a468..54a72554d 100644 --- a/lib/pages/article/widgets/html_render.dart +++ b/lib/pages/article/widgets/html_render.dart @@ -62,7 +62,7 @@ Widget htmlRender({ width: width, height: isEmote ? 22.0 : null, memCacheWidth: width.cacheSize(context), - imageUrl: ImageUtils.thumbnailUrl(imgUrl, 60), + imageUrl: ImageUtils.thumbnailUrl(imgUrl, maxQuality: 60), fadeInDuration: const Duration(milliseconds: 120), fadeOutDuration: const Duration(milliseconds: 120), placeholder: (context, url) => Image.asset(Assets.loading), diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 2cfe06f34..80e4b813d 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -229,7 +229,7 @@ class OpusContent extends StatelessWidget { width: width, height: height, memCacheWidth: width.cacheSize(context), - imageUrl: ImageUtils.thumbnailUrl(pic.url!, 60), + imageUrl: ImageUtils.thumbnailUrl(pic.url!, maxQuality: 60), fadeInDuration: const Duration(milliseconds: 120), fadeOutDuration: const Duration(milliseconds: 120), placeholder: (_, _) => Image.asset(Assets.loading), diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index de5ffc288..d7e01af14 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -293,7 +293,7 @@ class _AudioPageState extends State { WidgetSpan( alignment: .bottom, child: Image.asset( - Assets.livingChart, + Assets.livingStatic, width: 16, height: 16, cacheWidth: 16.cacheSize( @@ -337,7 +337,7 @@ class _AudioPageState extends State { WidgetSpan( alignment: .bottom, child: Image.asset( - Assets.livingChart, + Assets.livingStatic, width: 16, height: 16, cacheWidth: 16.cacheSize( diff --git a/lib/pages/member/widget/medal_wall.dart b/lib/pages/member/widget/medal_wall.dart index 3a0fcfafc..632ca6d7d 100644 --- a/lib/pages/member/widget/medal_wall.dart +++ b/lib/pages/member/widget/medal_wall.dart @@ -107,7 +107,7 @@ class MedalWall extends StatelessWidget { Padding( padding: const .only(left: 4), child: Image.asset( - Assets.livingChart, + Assets.livingStatic, height: 16, cacheHeight: 16.cacheSize(context), color: colorScheme.primary, diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index 9f17ab1d7..cacab6a3a 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -794,11 +794,13 @@ class ReplyItemGrpc extends StatelessWidget { spanChildren.add( WidgetSpan( child: NetworkImgLayer( - src: emote.hasWebpUrl() - ? emote.webpUrl - : emote.hasGifUrl() - ? emote.gifUrl - : emote.url, + /// remove gif + src: emote.url, + // src: emote.hasWebpUrl() + // ? emote.webpUrl + // : emote.hasGifUrl() + // ? emote.gifUrl + // : emote.url, type: ImageType.emote, width: size, height: size, diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index d87b0922c..0133b4311 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -671,7 +671,9 @@ class ChatItem extends StatelessWidget { if (eInfos != null) { for (final e in eInfos!) { emojiMap[e.text] ??= { - 'url': e.hasGifUrl() ? e.gifUrl : e.url, + /// remove gif + 'url': e.url, + // 'url': e.hasGifUrl() ? e.gifUrl : e.url, 'size': e.size * 22.0, }; } diff --git a/lib/utils/image_utils.dart b/lib/utils/image_utils.dart index 68641dc0c..9d59b21af 100644 --- a/lib/utils/image_utils.dart +++ b/lib/utils/image_utils.dart @@ -266,7 +266,16 @@ abstract final class ImageUtils { r'(@(\d+[a-z]_?)*)(\..*)?$', caseSensitive: false, ); - static String thumbnailUrl(String? src, [int maxQuality = 1]) { + + static const kSuffixJPG = '.jpg'; + static const kSuffixGIF = '.gif'; + static const kSuffixWEBP = '.webp'; + + static String thumbnailUrl( + String? src, { + int maxQuality = 1, + String suffix = kSuffixWEBP, + }) { if (src != null && maxQuality != 100) { maxQuality = math.max(maxQuality, GlobalData().imgQuality); bool hasMatch = false; @@ -274,15 +283,14 @@ abstract final class ImageUtils { _thumbRegex, onMatch: (match) { hasMatch = true; - String suffix = match.group(3) ?? '.webp'; - return '${match.group(1)}_${maxQuality}q$suffix'; + return '${match.group(1)}_${maxQuality}q${match.group(3) ?? suffix}'; }, onNonMatch: (String str) { return str; }, ); if (!hasMatch) { - src += '@${maxQuality}q.webp'; + src += '@${maxQuality}q$suffix'; } } return src.http2https;