1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-11 17:51:01 +00:00

refactor(rewrite): replaced regex-based YouTube and Invidious video ID extraction with URL parsing

This commit is contained in:
Julien Voisin 2025-08-02 02:44:12 +02:00 committed by GitHub
parent 1f7843e313
commit cce0e7bd29
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -21,11 +21,8 @@ import (
) )
var ( var (
youtubeVideoRegex = regexp.MustCompile(`youtube\.com/watch\?v=(.*)$`) youtubeIdRegex = regexp.MustCompile(`youtube_id"?\s*[:=]\s*"([a-zA-Z0-9_-]{11})"`)
youtubeShortRegex = regexp.MustCompile(`youtube\.com/shorts/([a-zA-Z0-9_-]{11})$`) textLinkRegex = regexp.MustCompile(`(?mi)(\bhttps?:\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])`)
youtubeIdRegex = regexp.MustCompile(`youtube_id"?\s*[:=]\s*"([a-zA-Z0-9_-]{11})"`)
invidioRegex = regexp.MustCompile(`https?://(.*)/watch\?v=(.*)`)
textLinkRegex = regexp.MustCompile(`(?mi)(\bhttps?:\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])`)
) )
// titlelize returns a copy of the string s with all Unicode letters that begin words // titlelize returns a copy of the string s with all Unicode letters that begin words
@ -261,15 +258,29 @@ func useNoScriptImages(entryContent string) string {
} }
func getYoutubVideoIDFromURL(entryURL string) string { func getYoutubVideoIDFromURL(entryURL string) string {
matches := youtubeVideoRegex.FindStringSubmatch(entryURL) u, err := url.Parse(entryURL)
if err != nil {
if len(matches) != 2 { return ""
matches = youtubeShortRegex.FindStringSubmatch(entryURL)
} }
if len(matches) == 2 { if !strings.HasSuffix(u.Hostname(), "youtube.com") {
return matches[1] return ""
} }
if u.Path == "/watch" {
if v := u.Query().Get("v"); v != "" {
return v
}
return ""
}
if id, found := strings.CutPrefix(u.Path, "/shorts/"); found {
if len(id) == 11 {
// youtube shorts id are always 11 chars.
return id
}
}
return "" return ""
} }
@ -311,11 +322,29 @@ func addYoutubeVideoFromId(entryContent string) string {
} }
func addInvidiousVideo(entryURL, entryContent string) string { func addInvidiousVideo(entryURL, entryContent string) string {
matches := invidioRegex.FindStringSubmatch(entryURL) u, err := url.Parse(entryURL)
if len(matches) == 3 { if err != nil {
return addVideoPlayerIframe(`https://`+matches[1]+`/embed/`+matches[2], entryContent) return entryContent
} }
return entryContent
if u.Path != "/watch" {
return entryContent
}
v := u.Query().Get("v")
if v == "" {
return entryContent
}
src := "https://" + u.Hostname() + `/embed/` + v
for key, val := range u.Query() {
if key == "v" || len(val) != 1 {
continue
}
src += "&" + key + "=" + val[0]
}
return addVideoPlayerIframe(src, entryContent)
} }
func addPDFLink(entryURL, entryContent string) string { func addPDFLink(entryURL, entryContent string) string {