Embed Peertube videos (#2261)
* Use og:video attribute for embeds, change Post.embed_html to embed_url * fix clippy
This commit is contained in:
parent
9a458d2e4b
commit
339eab01fd
12 changed files with 47 additions and 41 deletions
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
|
@ -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()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
2
migrations/2022-05-20-135341_embed-url/down.sql
Normal file
2
migrations/2022-05-20-135341_embed-url/down.sql
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
alter table post drop column embed_url;
|
||||||
|
alter table post add column embed_video_url text;
|
2
migrations/2022-05-20-135341_embed-url/up.sql
Normal file
2
migrations/2022-05-20-135341_embed-url/up.sql
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
alter table post drop column embed_html;
|
||||||
|
alter table post add column embed_video_url text;
|
Loading…
Reference in a new issue