diff --git a/config/options.go b/config/options.go
index 6b319518..bd2bd6b5 100644
--- a/config/options.go
+++ b/config/options.go
@@ -68,6 +68,7 @@ const (
defaultMetricsRefreshInterval = 60
defaultMetricsAllowedNetworks = "127.0.0.1/8"
defaultWatchdog = true
+ defaultInvidiousInstance = "yewtu.be"
)
var defaultHTTPClientUserAgent = "Mozilla/5.0 (compatible; Miniflux/" + version.Version + "; +https://miniflux.app)"
@@ -135,6 +136,7 @@ type Options struct {
metricsRefreshInterval int
metricsAllowedNetworks []string
watchdog bool
+ invidiousInstance string
}
// NewOptions returns Options with default values.
@@ -193,6 +195,7 @@ func NewOptions() *Options {
metricsRefreshInterval: defaultMetricsRefreshInterval,
metricsAllowedNetworks: []string{defaultMetricsAllowedNetworks},
watchdog: defaultWatchdog,
+ invidiousInstance: defaultInvidiousInstance,
}
}
@@ -482,6 +485,11 @@ func (o *Options) HasWatchdog() bool {
return o.watchdog
}
+// InvidiousInstance returns the invidious instance used by miniflux
+func (o *Options) InvidiousInstance() string {
+ return o.invidiousInstance
+}
+
// SortedOptions returns options as a list of key value pairs, sorted by keys.
func (o *Options) SortedOptions(redactSecret bool) []*Option {
var keyValues = map[string]interface{}{
@@ -516,6 +524,7 @@ func (o *Options) SortedOptions(redactSecret bool) []*Option {
"HTTP_CLIENT_USER_AGENT": o.httpClientUserAgent,
"HTTP_SERVICE": o.httpService,
"KEY_FILE": o.certKeyFile,
+ "INVIDIOUS_INSTANCE": o.invidiousInstance,
"LISTEN_ADDR": o.listenAddr,
"LOG_DATE_TIME": o.logDateTime,
"MAINTENANCE_MESSAGE": o.maintenanceMessage,
diff --git a/config/parser.go b/config/parser.go
index ea77b6a6..2d4f5727 100644
--- a/config/parser.go
+++ b/config/parser.go
@@ -195,6 +195,8 @@ func (p *Parser) parseLines(lines []string) (err error) {
p.opts.fetchYouTubeWatchTime = parseBool(value, defaultFetchYouTubeWatchTime)
case "WATCHDOG":
p.opts.watchdog = parseBool(value, defaultWatchdog)
+ case "INVIDIOUS_INSTANCE":
+ p.opts.invidiousInstance = parseString(value, defaultInvidiousInstance)
}
}
diff --git a/miniflux.1 b/miniflux.1
index eb7db1c2..f938a06e 100644
--- a/miniflux.1
+++ b/miniflux.1
@@ -1,5 +1,5 @@
.\" Manpage for miniflux.
-.TH "MINIFLUX" "1" "May 23, 2021" "\ \&" "\ \&"
+.TH "MINIFLUX" "1" "January 5, 2022" "\ \&" "\ \&"
.SH NAME
miniflux \- Minimalist and opinionated feed reader
@@ -416,6 +416,11 @@ Default is "Miniflux is currently under maintenance"\&.
Enable or disable Systemd watchdog\&.
.br
Enabled by default\&.
+.TP
+.B INVIDIOUS_INSTANCE
+Set a custom invidious instance to use\&.
+.br
+Default is yewtu.be\&.
.SH AUTHORS
.P
diff --git a/reader/rewrite/rewrite_functions.go b/reader/rewrite/rewrite_functions.go
index 4ea9ce4e..c5f930fe 100644
--- a/reader/rewrite/rewrite_functions.go
+++ b/reader/rewrite/rewrite_functions.go
@@ -11,6 +11,8 @@ import (
"regexp"
"strings"
+ "miniflux.app/config"
+
"github.com/PuerkitoBio/goquery"
)
@@ -214,7 +216,7 @@ func addYoutubeVideoUsingInvidiousPlayer(entryURL, entryContent string) string {
matches := youtubeRegex.FindStringSubmatch(entryURL)
if len(matches) == 2 {
- video := ``
+ video := ``
return video + `
` + entryContent
}
return entryContent
diff --git a/reader/rewrite/rules.go b/reader/rewrite/rules.go
index 29fce0db..f2c6a5a1 100644
--- a/reader/rewrite/rules.go
+++ b/reader/rewrite/rules.go
@@ -16,7 +16,6 @@ var predefinedRules = map[string]string{
"framatube.org": "nl2br,convert_text_link",
"happletea.com": "add_image_title",
"imogenquest.net": "add_image_title",
- "invidio.us": "add_invidious_video",
"lukesurl.com": "add_image_title",
"medium.com": "fix_medium_images",
"mercworks.net": "add_image_title",
diff --git a/reader/sanitizer/sanitizer.go b/reader/sanitizer/sanitizer.go
index 89df6851..0af6c197 100644
--- a/reader/sanitizer/sanitizer.go
+++ b/reader/sanitizer/sanitizer.go
@@ -12,6 +12,7 @@ import (
"strconv"
"strings"
+ "miniflux.app/config"
"miniflux.app/url"
"golang.org/x/net/html"
@@ -308,7 +309,6 @@ func isBlockedResource(src string) bool {
func isValidIframeSource(baseURL, src string) bool {
whitelist := []string{
- "https://invidio.us",
"//www.youtube.com",
"http://www.youtube.com",
"https://www.youtube.com",
@@ -334,6 +334,11 @@ func isValidIframeSource(baseURL, src string) bool {
return true
}
+ // allow iframe from custom invidious instance
+ if config.Opts != nil && config.Opts.InvidiousInstance() == url.Domain(src) {
+ return true
+ }
+
for _, prefix := range whitelist {
if strings.HasPrefix(src, prefix) {
return true