Better video URL resolution and embedding #3633
Better video URL resolution and embedding #3633

Better video URL resolution and embedding · Issue #3633 · LemmyNet/lemmy

Requirements
- Is this a feature request? For questions or discussions use https://lemmy.ml/c/lemmy_support
- Did you check to see if this issue already exists?
- Is this only a feature request? Do not put multiple feature requests in one issue.
- Is this a backend issue? Use the lemmy-ui repo for UI / frontend issues.
Is your proposal related to a problem?
Many videos from external sites fail to properly embed on Lemmy clients. Video detection from a URL is based on opengraph tags (specifically og:video
), which a lot of sites intentionally don't send, and should be made more intelligent to ensure better content sharing. This is a major sore point for Lemmy at the moment.
Describe the solution you'd like.
To facilitate better video embedding, the fetch_site_metadata
function needs to be improved - this way, no UI changes will be required. One easy and cheap way to do this might be to use something like yt-dlp
, which can extract direct video URLs from indirect URLs. There are Rust wrappers available for the library.
For example, consider the imgur URL https://imgur.com/gallery/hOPRxdR
. From this, yt-dlp is able to extract the direct MP4:
~ ❯ yt-dlp https://imgur.com/gallery/hOPRxdR -g https://i.imgur.com/txMlHj7.mp4
This process should fail fast. If any error is encountered, simply ditch the approach and fall back to opengraph.
Considerations
- This can be too aggressive: for example, YouTube and
v.reddit
links can be resolved, but they arem3u8
streams that can't be played by the UI in a<video>
tag. Only three formats are supported:mp4
,webm
, andogg
. This can be tuned in the command:~ ❯ yt-dlp https://imgur.com/gallery/hOPRxdR -g -f 'best[ext=webm]/best[ext=mp4]/best[ext=ogg]' https://i.imgur.com/txMlHj7.mp4
- Error handling is required in case a URL can't be selected:This is a non-zero exit code, so the normal fail-fast behavior might be enough.
~ ❯ yt-dlp https://v.redd.it/s2426qje27cb1 -g -f 'best[ext=webm]/best[ext=mp4]/best[ext=ogg]' ERROR: [Reddit] s2426qje27cb1: Requested format is not available. Use --list-formats for a list of available formats
Describe alternatives you've considered.
I considered using yt-dlp
to also do the downloading of a video to pictrs
, but that seems like unnecessary storage use. I'm sure there are alternative solutions out there.
Additional context
Sample Rust code (I am not a Rust programmer so don't judge)
rust
fn run_ytdl(input: &str) -> Result<YoutubeDlOutput, youtube_dl::Error> { YoutubeDl::new(input) .download(false) .format("best[ext=webm]/best[ext=mp4]/best[ext=ogg]") .socket_timeout("10") .run() } fn extract_direct_url(input: &str) -> Option<String> { let output = run_ytdl(input).ok()?; match output { YoutubeDlOutput::Playlist(playlist) => playlist.entries?.get(0)?.clone().url, YoutubeDlOutput::SingleVideo(video) => video.url } }