@@ -14,8 +14,9 @@ import 'package:thunder/core/models/media_extension.dart';
14
14
import 'package:thunder/core/models/post_view_media.dart' ;
15
15
import 'package:thunder/core/singletons/lemmy_client.dart' ;
16
16
import 'package:thunder/core/singletons/preferences.dart' ;
17
- import 'package:thunder/utils/image.dart' ;
17
+ import 'package:thunder/utils/media/ image.dart' ;
18
18
import 'package:thunder/utils/links.dart' ;
19
+ import 'package:thunder/utils/media/video.dart' ;
19
20
20
21
extension on MarkPostAsReadResponse {
21
22
bool isSuccess () {
@@ -237,8 +238,10 @@ Future<List<PostViewMedia>> parsePostViews(List<PostView> postViews, {String? re
237
238
bool edgeToEdgeImages = prefs.getBool (LocalSettings .showPostEdgeToEdgeImages.name) ?? false ;
238
239
bool tabletMode = prefs.getBool (LocalSettings .useTabletMode.name) ?? false ;
239
240
bool hideNsfwPosts = prefs.getBool (LocalSettings .hideNsfwPosts.name) ?? false ;
241
+ bool scrapeMissingPreviews = prefs.getBool (LocalSettings .scrapeMissingPreviews.name) ?? false ;
240
242
241
243
List <PostView > postViewsFinal = [];
244
+
242
245
if (resolutionInstance != null ) {
243
246
final LemmyApiV3 lemmy = (LemmyClient ()..changeBaseUrl (resolutionInstance)).lemmyApiV3;
244
247
@@ -254,92 +257,66 @@ Future<List<PostViewMedia>> parsePostViews(List<PostView> postViews, {String? re
254
257
postViewsFinal = postViews.toList ();
255
258
}
256
259
257
- Iterable <Future <PostViewMedia >> postFutures =
258
- postViewsFinal.expand ((post) => [if (! hideNsfwPosts || (! post.post.nsfw && hideNsfwPosts)) parsePostView (post, fetchImageDimensions, edgeToEdgeImages, tabletMode)]).toList ();
259
- List <PostViewMedia > posts = await Future .wait (postFutures);
260
+ Iterable <Future <PostViewMedia >> postFutures = postViewsFinal
261
+ .expand (
262
+ (post) => [
263
+ if (! hideNsfwPosts || (! post.post.nsfw && hideNsfwPosts)) parsePostView (post, fetchImageDimensions, edgeToEdgeImages, tabletMode, scrapeMissingPreviews),
264
+ ],
265
+ )
266
+ .toList ();
260
267
268
+ List <PostViewMedia > posts = await Future .wait (postFutures);
261
269
return posts;
262
270
}
263
271
264
- Future <PostViewMedia > parsePostView (PostView postView, bool fetchImageDimensions, bool edgeToEdgeImages, bool tabletMode) async {
265
- List <Media > media = [];
266
- String ? url = postView.post.url;
272
+ Future <PostViewMedia > parsePostView (PostView postView, bool fetchImageDimensions, bool edgeToEdgeImages, bool tabletMode, bool scrapeMissingPreviews) async {
273
+ List <Media > mediaList = [];
267
274
268
- if (url != null && isImageUrl (url)) {
269
- try {
270
- MediaType mediaType = MediaType .image;
275
+ // There are three sources of URLs: the main url attached to the post, the thumbnail url attached to the post, and the video url attached to the post
276
+ String ? url = postView.post.url ?? '' ;
277
+ String ? thumbnailUrl = postView.post.thumbnailUrl;
278
+ String ? videoUrl = postView.post.embedVideoUrl; // @TODO: Add support for videos
271
279
272
- if (fetchImageDimensions) {
273
- Size result = await retrieveImageDimensions (imageUrl: url);
274
- Size size = MediaExtension .getScaledMediaSize (width: result.width, height: result.height, offset: edgeToEdgeImages ? 0 : 24 , tabletMode: tabletMode);
275
- media.add (Media (mediaUrl: url, originalUrl: url, width: size.width, height: size.height, mediaType: mediaType));
276
- } else {
277
- media.add (Media (mediaUrl: url, originalUrl: url, mediaType: mediaType));
278
- }
279
- } catch (e) {
280
- // If it fails, fall back to a media type of link
281
- media.add (Media (originalUrl: url, mediaType: MediaType .link));
282
- }
283
- } else if (url != null ) {
284
- if (fetchImageDimensions) {
285
- if (postView.post.thumbnailUrl? .isNotEmpty == true ) {
286
- try {
287
- Size result = await retrieveImageDimensions (imageUrl: postView.post.thumbnailUrl! );
288
- Size size = MediaExtension .getScaledMediaSize (width: result.width, height: result.height, offset: edgeToEdgeImages ? 0 : 24 , tabletMode: tabletMode);
289
- media.add (Media (
290
- mediaUrl: postView.post.thumbnailUrl! ,
291
- mediaType: MediaType .link,
292
- originalUrl: url,
293
- width: size.width,
294
- height: size.height,
295
- ));
296
- } catch (e) {
297
- // If it fails, fall back to a media type of link
298
- media.add (Media (originalUrl: url, mediaType: MediaType .link));
299
- }
300
- } else {
301
- try {
302
- // For external links, attempt to fetch any media associated with it (image, title)
303
- LinkInfo linkInfo = await getLinkInfo (url);
304
-
305
- if (linkInfo.imageURL != null && linkInfo.imageURL! .isNotEmpty) {
306
- Size result = await retrieveImageDimensions (imageUrl: linkInfo.imageURL! );
307
-
308
- int mediaHeight = result.height.toInt ();
309
- int mediaWidth = result.width.toInt ();
310
- Size size = MediaExtension .getScaledMediaSize (width: mediaWidth, height: mediaHeight, offset: edgeToEdgeImages ? 0 : 24 , tabletMode: tabletMode);
311
- media.add (Media (mediaUrl: linkInfo.imageURL! , mediaType: MediaType .link, originalUrl: url, height: size.height, width: size.width));
312
- } else {
313
- media.add (Media (mediaUrl: linkInfo.imageURL! , mediaType: MediaType .link, originalUrl: url));
314
- }
315
- } catch (e) {
316
- // Default back to a link
317
- media.add (Media (mediaType: MediaType .link, originalUrl: url));
318
- }
319
- }
320
- } else {
321
- if (postView.post.thumbnailUrl? .isNotEmpty == true ) {
322
- media.add (Media (mediaUrl: postView.post.thumbnailUrl! , mediaType: MediaType .link, originalUrl: url));
323
- } else {
324
- media.add (Media (mediaType: MediaType .link, originalUrl: url));
325
- }
280
+ // First, check what type of link we're dealing with based on the url (MediaType.image, MediaType.video, MediaType.link, MediaType.text)
281
+ bool isImage = isImageUrl (url);
282
+ bool isVideo = isVideoUrl (url);
283
+
284
+ MediaType mediaType;
285
+
286
+ if (isImage) {
287
+ mediaType = MediaType .image;
288
+ } else if (isVideo) {
289
+ mediaType = MediaType .video;
290
+ } else if (url.isNotEmpty) {
291
+ mediaType = MediaType .link;
292
+ } else {
293
+ mediaType = MediaType .text;
294
+ }
295
+
296
+ Media media = Media (mediaType: mediaType, originalUrl: url);
297
+
298
+ if (thumbnailUrl != null && thumbnailUrl.isNotEmpty) {
299
+ // Now check to see if there is a thumbnail image. If there is, we'll use that for the image
300
+ media.mediaUrl = thumbnailUrl;
301
+ } else if (scrapeMissingPreviews) {
302
+ // If there is no thumbnail image, we'll see if we should try to fetch the link metadata
303
+ LinkInfo linkInfo = await getLinkInfo (url);
304
+
305
+ if (linkInfo.imageURL != null && linkInfo.imageURL! .isNotEmpty) {
306
+ media.mediaUrl = linkInfo.imageURL! ;
326
307
}
327
308
}
328
309
329
- return PostViewMedia (
330
- postView: PostView (
331
- community: postView.community,
332
- counts: postView.counts,
333
- creator: postView.creator,
334
- creatorBannedFromCommunity: postView.creatorBannedFromCommunity,
335
- creatorBlocked: postView.creatorBlocked,
336
- myVote: postView.myVote,
337
- post: postView.post,
338
- read: postView.read,
339
- saved: postView.saved,
340
- subscribed: postView.subscribed,
341
- unreadComments: postView.unreadComments,
342
- ),
343
- media: media,
344
- );
310
+ // Finally, check to see if we need to fetch the image dimensions
311
+ if (fetchImageDimensions && media.mediaUrl != null ) {
312
+ Size result = await retrieveImageDimensions (imageUrl: media.mediaUrl);
313
+ Size size = MediaExtension .getScaledMediaSize (width: result.width, height: result.height, offset: edgeToEdgeImages ? 0 : 24 , tabletMode: tabletMode);
314
+
315
+ media.width = size.width;
316
+ media.height = size.height;
317
+ }
318
+
319
+ mediaList.add (media);
320
+
321
+ return PostViewMedia (postView: postView, media: mediaList);
345
322
}
0 commit comments