Embed Peertube videos (#2261)

* Use og:video attribute for embeds, change Post.embed_html to embed_url

* fix clippy
This commit is contained in:
Nutomic 2022-06-02 21:44:47 +00:00 committed by GitHub
parent 9a458d2e4b
commit 339eab01fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 47 additions and 41 deletions

View file

@ -1,6 +1,6 @@
use crate::sensitive::Sensitive; use crate::sensitive::Sensitive;
use lemmy_db_schema::{ use lemmy_db_schema::{
newtypes::{CommunityId, PostId, PostReportId}, newtypes::{CommunityId, DbUrl, PostId, PostReportId},
ListingType, ListingType,
SortType, SortType,
}; };
@ -166,6 +166,6 @@ pub struct GetSiteMetadataResponse {
pub struct SiteMetadata { pub struct SiteMetadata {
pub title: Option<String>, pub title: Option<String>,
pub description: Option<String>, pub description: Option<String>,
pub(crate) image: Option<Url>, pub(crate) image: Option<DbUrl>,
pub html: Option<String>, pub embed_video_url: Option<DbUrl>,
} }

View file

@ -1,5 +1,6 @@
use crate::post::SiteMetadata; use crate::post::SiteMetadata;
use encoding::{all::encodings, DecoderTrap}; use encoding::{all::encodings, DecoderTrap};
use lemmy_db_schema::newtypes::DbUrl;
use lemmy_utils::{error::LemmyError, settings::structs::Settings, version::VERSION}; use lemmy_utils::{error::LemmyError, settings::structs::Settings, version::VERSION};
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
use reqwest_middleware::ClientWithMiddleware; use reqwest_middleware::ClientWithMiddleware;
@ -77,16 +78,17 @@ fn html_to_site_metadata(html_bytes: &[u8]) -> Result<SiteMetadata, LemmyError>
.images .images
.get(0) .get(0)
.and_then(|ogo| Url::parse(&ogo.url).ok()); .and_then(|ogo| Url::parse(&ogo.url).ok());
let og_embed_url = page
let title = og_title.or(page_title); .opengraph
let description = og_description.or(page_description); .videos
let image = og_image; .first()
.and_then(|v| Url::parse(&v.url).ok());
Ok(SiteMetadata { Ok(SiteMetadata {
title, title: og_title.or(page_title),
description, description: og_description.or(page_description),
image, image: og_image.map(Into::into),
html: None, embed_video_url: og_embed_url.map(Into::into),
}) })
} }
@ -139,7 +141,7 @@ pub async fn fetch_site_data(
client: &ClientWithMiddleware, client: &ClientWithMiddleware,
settings: &Settings, settings: &Settings,
url: Option<&Url>, url: Option<&Url>,
) -> (Option<SiteMetadata>, Option<Url>) { ) -> (Option<SiteMetadata>, Option<DbUrl>) {
match &url { match &url {
Some(url) => { Some(url) => {
// Fetch metadata // Fetch metadata
@ -179,7 +181,7 @@ pub async fn fetch_site_data(
.ok() .ok()
.flatten(); .flatten();
(metadata_option, pictrs_thumbnail) (metadata_option, pictrs_thumbnail.map(Into::into))
} }
None => (None, None), None => (None, None),
} }
@ -235,8 +237,9 @@ mod tests {
image: Some( image: Some(
Url::parse("https://gitlab.com/uploads/-/system/project/avatar/4877469/iod_logo.png") Url::parse("https://gitlab.com/uploads/-/system/project/avatar/4877469/iod_logo.png")
.unwrap() .unwrap()
.into()
), ),
html: None, embed_video_url: None,
}, },
sample_res sample_res
); );

View file

@ -86,11 +86,11 @@ impl PerformCrud for CreatePost {
// Fetch post links and pictrs cached image // Fetch post links and pictrs cached image
let data_url = data.url.as_ref(); let data_url = data.url.as_ref();
let (metadata_res, pictrs_thumbnail) = let (metadata_res, thumbnail_url) =
fetch_site_data(context.client(), &context.settings(), data_url).await; fetch_site_data(context.client(), &context.settings(), data_url).await;
let (embed_title, embed_description, embed_html) = metadata_res let (embed_title, embed_description, embed_video_url) = metadata_res
.map(|u| (u.title, u.description, u.html)) .map(|u| (u.title, u.description, u.embed_video_url))
.unwrap_or((None, None, None)); .unwrap_or_default();
let post_form = PostForm { let post_form = PostForm {
name: data.name.trim().to_owned(), name: data.name.trim().to_owned(),
@ -101,8 +101,8 @@ impl PerformCrud for CreatePost {
nsfw: data.nsfw, nsfw: data.nsfw,
embed_title, embed_title,
embed_description, embed_description,
embed_html, embed_video_url,
thumbnail_url: pictrs_thumbnail.map(|u| u.into()), thumbnail_url,
..PostForm::default() ..PostForm::default()
}; };

View file

@ -69,11 +69,11 @@ impl PerformCrud for EditPost {
// Fetch post links and Pictrs cached image // Fetch post links and Pictrs cached image
let data_url = data.url.as_ref(); let data_url = data.url.as_ref();
let (metadata_res, pictrs_thumbnail) = let (metadata_res, thumbnail_url) =
fetch_site_data(context.client(), &context.settings(), data_url).await; fetch_site_data(context.client(), &context.settings(), data_url).await;
let (embed_title, embed_description, embed_html) = metadata_res let (embed_title, embed_description, embed_video_url) = metadata_res
.map(|u| (u.title, u.description, u.html)) .map(|u| (u.title, u.description, u.embed_video_url))
.unwrap_or((None, None, None)); .unwrap_or_default();
let post_form = PostForm { let post_form = PostForm {
creator_id: orig_post.creator_id.to_owned(), creator_id: orig_post.creator_id.to_owned(),
@ -85,8 +85,8 @@ impl PerformCrud for EditPost {
updated: Some(naive_now()), updated: Some(naive_now()),
embed_title, embed_title,
embed_description, embed_description,
embed_html, embed_video_url,
thumbnail_url: pictrs_thumbnail.map(|u| u.into()), thumbnail_url,
..PostForm::default() ..PostForm::default()
}; };

View file

@ -167,15 +167,14 @@ impl ApubObject for ApubPost {
// url sent by lemmy (old) // url sent by lemmy (old)
page.url page.url
}; };
let thumbnail_url: Option<Url> = page.image.map(|i| i.url); let (metadata_res, thumbnail_url) = if let Some(url) = &url {
let (metadata_res, pictrs_thumbnail) = if let Some(url) = &url {
fetch_site_data(context.client(), &context.settings(), Some(url)).await fetch_site_data(context.client(), &context.settings(), Some(url)).await
} else { } else {
(None, thumbnail_url) (None, page.image.map(|i| i.url.into()))
}; };
let (embed_title, embed_description, embed_html) = metadata_res let (embed_title, embed_description, embed_video_url) = metadata_res
.map(|u| (u.title, u.description, u.html)) .map(|u| (u.title, u.description, u.embed_video_url))
.unwrap_or((None, None, None)); .unwrap_or_default();
let body_slurs_removed = let body_slurs_removed =
read_from_string_or_source_opt(&page.content, &page.media_type, &page.source) read_from_string_or_source_opt(&page.content, &page.media_type, &page.source)
.map(|s| remove_slurs(&s, &context.settings().slur_regex())); .map(|s| remove_slurs(&s, &context.settings().slur_regex()));
@ -195,8 +194,8 @@ impl ApubObject for ApubPost {
stickied: page.stickied, stickied: page.stickied,
embed_title, embed_title,
embed_description, embed_description,
embed_html, embed_video_url,
thumbnail_url: pictrs_thumbnail.map(|u| u.into()), thumbnail_url,
ap_id: Some(page.id.clone().into()), ap_id: Some(page.id.clone().into()),
local: Some(false), local: Some(false),
} }

View file

@ -251,7 +251,7 @@ impl DeleteableOrRemoveable for Post {
self.body = None; self.body = None;
self.embed_title = None; self.embed_title = None;
self.embed_description = None; self.embed_description = None;
self.embed_html = None; self.embed_video_url = None;
self.thumbnail_url = None; self.thumbnail_url = None;
self self
@ -316,7 +316,7 @@ mod tests {
updated: None, updated: None,
embed_title: None, embed_title: None,
embed_description: None, embed_description: None,
embed_html: None, embed_video_url: None,
thumbnail_url: None, thumbnail_url: None,
ap_id: inserted_post.ap_id.to_owned(), ap_id: inserted_post.ap_id.to_owned(),
local: true, local: true,

View file

@ -357,7 +357,7 @@ table! {
stickied -> Bool, stickied -> Bool,
embed_title -> Nullable<Text>, embed_title -> Nullable<Text>,
embed_description -> Nullable<Text>, embed_description -> Nullable<Text>,
embed_html -> Nullable<Text>, embed_video_url -> Nullable<Text>,
thumbnail_url -> Nullable<Text>, thumbnail_url -> Nullable<Text>,
ap_id -> Varchar, ap_id -> Varchar,
local -> Bool, local -> Bool,

View file

@ -23,7 +23,7 @@ pub struct Post {
pub stickied: bool, pub stickied: bool,
pub embed_title: Option<String>, pub embed_title: Option<String>,
pub embed_description: Option<String>, pub embed_description: Option<String>,
pub embed_html: Option<String>, pub embed_video_url: Option<DbUrl>,
pub thumbnail_url: Option<DbUrl>, pub thumbnail_url: Option<DbUrl>,
pub ap_id: DbUrl, pub ap_id: DbUrl,
pub local: bool, pub local: bool,
@ -47,7 +47,7 @@ pub struct PostForm {
pub stickied: Option<bool>, pub stickied: Option<bool>,
pub embed_title: Option<String>, pub embed_title: Option<String>,
pub embed_description: Option<String>, pub embed_description: Option<String>,
pub embed_html: Option<String>, pub embed_video_url: Option<DbUrl>,
pub thumbnail_url: Option<DbUrl>, pub thumbnail_url: Option<DbUrl>,
pub ap_id: Option<DbUrl>, pub ap_id: Option<DbUrl>,
pub local: Option<bool>, pub local: Option<bool>,

View file

@ -673,7 +673,7 @@ mod tests {
nsfw: false, nsfw: false,
embed_title: None, embed_title: None,
embed_description: None, embed_description: None,
embed_html: None, embed_video_url: None,
thumbnail_url: None, thumbnail_url: None,
ap_id: inserted_post.ap_id.to_owned(), ap_id: inserted_post.ap_id.to_owned(),
local: true, local: true,

View file

@ -646,7 +646,7 @@ mod tests {
nsfw: false, nsfw: false,
embed_title: None, embed_title: None,
embed_description: None, embed_description: None,
embed_html: None, embed_video_url: None,
thumbnail_url: None, thumbnail_url: None,
ap_id: inserted_post.ap_id.to_owned(), ap_id: inserted_post.ap_id.to_owned(),
local: true, local: true,

View file

@ -0,0 +1,2 @@
alter table post drop column embed_url;
alter table post add column embed_video_url text;

View file

@ -0,0 +1,2 @@
alter table post drop column embed_html;
alter table post add column embed_video_url text;