[reddit] Add Support for Piped Videos (#144)

If a Reddit post contains a Piped video it can now be played directly
within the app, similar to how it is handled in Nitter posts.
This commit is contained in:
Rico Berger
2024-02-14 19:00:51 +01:00
committed by GitHub
parent 66173d5a38
commit 8199c451b1

View File

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:feeddeck/models/item.dart';
import 'package:feeddeck/models/source.dart';
import 'package:feeddeck/widgets/item/details/utils/item_description.dart';
import 'package:feeddeck/widgets/item/details/utils/item_piped/item_piped_video.dart';
import 'package:feeddeck/widgets/item/details/utils/item_subtitle.dart';
import 'package:feeddeck/widgets/item/details/utils/item_title.dart';
import 'package:feeddeck/widgets/item/details/utils/item_youtube/item_youtube_video.dart';
@@ -36,10 +37,30 @@ class ItemDetailsReddit extends StatelessWidget {
return null;
}
/// [_getPipedUrl] returns a Piped url when the provided [description]
/// contains a Piped link. If the [description] does not contain a Piped link,
/// the function returns `null`.
String? _getPipedUrl(String description) {
final exp = RegExp(r'(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+');
final matches = exp.allMatches(description);
for (var match in matches) {
final url = description.substring(match.start, match.end);
if (url.startsWith('https://piped.video/watch?v=') ||
url.startsWith('https://piped.video/')) {
return url;
}
}
return null;
}
/// [_buildDescription] builds the description widget for the item. If the
/// description contains a YouTube link, we render the [ItemYoutubeVideo]
/// and the [ItemDescription] widgets. If the description does not contain a
/// YouTube link, we only render the [ItemDescription] widget.
/// and the [ItemDescription] widgets. If the description contains a Piped
/// link, we render the [ItemPipedVideo] and the [ItemDescription] widget. If
/// the description does not contain a YouTube or Piped link, we only render
/// the [ItemDescription] widget.
///
/// If the description containes a YouTube link we also have to disable the
/// rendering of images within the [ItemDescription] widget.
@@ -62,6 +83,24 @@ class ItemDetailsReddit extends StatelessWidget {
];
}
final pipedUrl =
item.description != null ? _getPipedUrl(item.description!) : null;
if (pipedUrl != null) {
return [
ItemPipedVideo(
item.media,
pipedUrl,
),
ItemDescription(
itemDescription: item.description,
sourceFormat: DescriptionFormat.html,
tagetFormat: DescriptionFormat.markdown,
disableImages: true,
),
];
}
return [
ItemDescription(
itemDescription: item.description,