140 lines
3.6 KiB
Markdown
140 lines
3.6 KiB
Markdown
#meta
|
|
|
|
Implements useful embed widgets.
|
|
|
|
# Youtube
|
|
## Example
|
|
${embed.youtube "https://youtu.be/t1oy_41bDAY?si=X76FvJEUlJnApwEg"}
|
|
|
|
# Peertube
|
|
## Example
|
|
${embed.peertube "https://peertube.fr/w/kkGMgK9ZtnKfYAgnEtQxbv"}
|
|
|
|
# Vimeo
|
|
## Example
|
|
${embed.vimeo "https://vimeo.com/1084537"}
|
|
|
|
# Implementation
|
|
```space-lua
|
|
-- priority: 10
|
|
-- Schema
|
|
local embedVideoSpecSchema = {
|
|
type = "object",
|
|
properties = {
|
|
url = { type = "string"},
|
|
width = { type = "number"},
|
|
height = { type = "number"},
|
|
},
|
|
required = {"url"}
|
|
}
|
|
|
|
-- Youtube widget
|
|
function embed.youtube(specOrUrl)
|
|
if type(specOrUrl) == "string" then
|
|
specOrUrl = { url = specOrUrl }
|
|
end
|
|
-- Validate spec
|
|
local validationResult = jsonschema.validateObject(embedVideoSpecSchema, specOrUrl)
|
|
if validationResult then
|
|
error(validationResult)
|
|
end
|
|
local videoId = string.match(specOrUrl.url, "youtube%.com/watch%?v=(.+)")
|
|
if not videoId then
|
|
videoId = string.match(specOrUrl.url, "youtu%.be/(.+)")
|
|
end
|
|
if not videoId then
|
|
videoId = string.match(specOrUrl.url, "youtube%.com/shorts/(.+)")
|
|
end
|
|
|
|
if not videoId then
|
|
error("No video id found")
|
|
end
|
|
|
|
local width = specOrUrl.width or "100%"
|
|
local height = specOrUrl.height or "400px"
|
|
return widget.html(dom.iframe {
|
|
src="https://www.youtube.com/embed/" .. videoId,
|
|
style="width: " .. width .. "; height: " .. height,
|
|
class = "sb-video-embed",
|
|
referrerpolicy = "strict-origin-when-cross-origin",
|
|
allow = "accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share",
|
|
allowfullscreen = "true",
|
|
})
|
|
end
|
|
|
|
-- Peertube widget
|
|
function embed.peertube(specOrUrl)
|
|
if type(specOrUrl) == "string" then
|
|
specOrUrl = { url = specOrUrl }
|
|
end
|
|
-- Validate spec
|
|
local validationResult = jsonschema.validateObject(embedVideoSpecSchema, specOrUrl)
|
|
if validationResult then
|
|
error(validationResult)
|
|
end
|
|
|
|
local tempHost = string.match(specOrUrl.url, "https://(.+)")
|
|
local lastIndex = string.find(tempHost, "/w/")
|
|
local peertubeInstance = string.sub(tempHost, 1, (lastIndex -1) )
|
|
local videoId = string.match(specOrUrl.url, "/w/(.+)")
|
|
|
|
if not videoId then
|
|
error("No video id found")
|
|
end
|
|
|
|
local width = specOrUrl.width or "100%"
|
|
local height = specOrUrl.height or "400px"
|
|
return widget.html(dom.iframe {
|
|
src = "https://" .. peertubeInstance .. "/videos/embed/" .. videoId,
|
|
style = "width: " .. width .. "; height: " .. height,
|
|
frameborder = "0",
|
|
allowfullscreen = "",
|
|
sandbox = "allow-same-origin allow-scripts allow-popups allow-forms",
|
|
class = "sb-video-embed"
|
|
})
|
|
end
|
|
|
|
-- Vimeo widget
|
|
function embed.vimeo(specOrUrl)
|
|
if type(specOrUrl) == "string" then
|
|
specOrUrl = { url = specOrUrl }
|
|
end
|
|
-- Validate spec
|
|
local validationResult = jsonschema.validateObject(embedVideoSpecSchema, specOrUrl)
|
|
if validationResult then
|
|
error(validationResult)
|
|
end
|
|
local videoId = string.match(specOrUrl.url, "vimeo%.com/(.+)")
|
|
|
|
if not videoId then
|
|
error("No video id found")
|
|
end
|
|
|
|
local width = specOrUrl.width or "100%"
|
|
local height = specOrUrl.height or "400px"
|
|
return widget.html(dom.iframe {
|
|
src = "https://player.vimeo.com/video/" .. videoId,
|
|
style = "width: " .. width .. "; height: " .. height,
|
|
frameborder = "0",
|
|
referrerpolicy = "strict-origin-when-cross-origin",
|
|
allow = "fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share",
|
|
allowfullscreen = "",
|
|
class = "sb-video-embed"
|
|
})
|
|
end
|
|
```
|
|
|
|
## Styling
|
|
|
|
```space-style
|
|
.sb-video-embed {
|
|
border: 0 !important;
|
|
}
|
|
```
|
|
|
|
# General implementation
|
|
```space-lua
|
|
-- priority: 50
|
|
embed = {}
|
|
```
|