diff --git a/reader/subscription/finder.go b/reader/subscription/finder.go index ab94b807..512a087f 100644 --- a/reader/subscription/finder.go +++ b/reader/subscription/finder.go @@ -5,7 +5,9 @@ package subscription // import "miniflux.app/reader/subscription" import ( + "fmt" "io" + "regexp" "strings" "miniflux.app/errors" @@ -18,11 +20,14 @@ import ( ) var ( - errUnreadableDoc = "Unable to analyze this page: %v" + errUnreadableDoc = "Unable to analyze this page: %v" + youtubeChannelRegex = regexp.MustCompile(`youtube\.com/channel/(.*)`) ) // FindSubscriptions downloads and try to find one or more subscriptions from an URL. func FindSubscriptions(websiteURL, userAgent, username, password string) (Subscriptions, *errors.LocalizedError) { + websiteURL = findYoutubeChannelFeed(websiteURL) + request := client.New(websiteURL) request.WithCredentials(username, password) request.WithUserAgent(userAgent) @@ -91,6 +96,15 @@ func parseDocument(websiteURL string, data io.Reader) (Subscriptions, *errors.Lo return subscriptions, nil } +func findYoutubeChannelFeed(websiteURL string) string { + matches := youtubeChannelRegex.FindStringSubmatch(websiteURL) + + if len(matches) == 2 { + return fmt.Sprintf(`https://www.youtube.com/feeds/videos.xml?channel_id=%s`, matches[1]) + } + return websiteURL +} + func tryWellKnownUrls(websiteURL, userAgent, username, password string) (Subscriptions, *errors.LocalizedError) { var subscriptions Subscriptions knownURLs := map[string]string{ diff --git a/reader/subscription/finder_test.go b/reader/subscription/finder_test.go new file mode 100644 index 00000000..f4531ea2 --- /dev/null +++ b/reader/subscription/finder_test.go @@ -0,0 +1,21 @@ +// Copyright 2020 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package subscription + +import "testing" + +func TestFindYoutubeChannelFeed(t *testing.T) { + scenarios := map[string]string{ + "https://www.youtube.com/channel/UC-Qj80avWItNRjkZ41rzHyw": "https://www.youtube.com/feeds/videos.xml?channel_id=UC-Qj80avWItNRjkZ41rzHyw", + "http://example.org/feed": "http://example.org/feed", + } + + for websiteURL, expectedFeedURL := range scenarios { + result := findYoutubeChannelFeed(websiteURL) + if result != expectedFeedURL { + t.Errorf(`Unexpected Feed, got %s, instead of %s`, result, expectedFeedURL) + } + } +}