1
0
Fork 0

feat: support searching well-known urls in subdirectory

This commit is contained in:
rook1e 2023-03-28 02:28:13 +08:00 committed by Frédéric Guillot
parent acc9186a59
commit 9a826bbe6f
2 changed files with 42 additions and 33 deletions

View file

@ -143,46 +143,53 @@ func parseYoutubeVideoPage(websiteURL string) string {
func tryWellKnownUrls(websiteURL, userAgent, cookie, username, password string) (Subscriptions, *errors.LocalizedError) { func tryWellKnownUrls(websiteURL, userAgent, cookie, username, password string) (Subscriptions, *errors.LocalizedError) {
var subscriptions Subscriptions var subscriptions Subscriptions
knownURLs := map[string]string{ knownURLs := map[string]string{
"/atom.xml": "atom", "atom.xml": "atom",
"/feed.xml": "atom", "feed.xml": "atom",
"/feed/": "atom", "feed/": "atom",
"/rss.xml": "rss", "rss.xml": "rss",
"/rss/": "rss", "rss/": "rss",
} }
lastCharacter := websiteURL[len(websiteURL)-1:] websiteURLRoot := url.RootURL(websiteURL)
if lastCharacter == "/" { baseURLs := []string{
websiteURL = websiteURL[:len(websiteURL)-1] // Look for knownURLs in the root.
websiteURLRoot,
}
// Look for knownURLs in current subdirectory, such as 'example.com/blog/'.
websiteURL, _ = url.AbsoluteURL(websiteURL, "./")
if websiteURL != websiteURLRoot {
baseURLs = append(baseURLs, websiteURL)
} }
for knownURL, kind := range knownURLs { for _, baseURL := range baseURLs {
fullURL, err := url.AbsoluteURL(websiteURL, knownURL) for knownURL, kind := range knownURLs {
if err != nil { fullURL, err := url.AbsoluteURL(baseURL, knownURL)
continue if err != nil {
} continue
}
clt := client.NewClientWithConfig(fullURL, config.Opts)
clt.WithCredentials(username, password)
clt.WithUserAgent(userAgent)
clt.WithCookie(cookie)
clt := client.NewClientWithConfig(fullURL, config.Opts) // Some websites redirects unknown URLs to the home page.
clt.WithCredentials(username, password) // As result, the list of known URLs is returned to the subscription list.
clt.WithUserAgent(userAgent) // We don't want the user to choose between invalid feed URLs.
clt.WithCookie(cookie) clt.WithoutRedirects()
// Some websites redirects unknown URLs to the home page. response, err := clt.Get()
// As result, the list of known URLs is returned to the subscription list. if err != nil {
// We don't want the user to choose between invalid feed URLs. continue
clt.WithoutRedirects() }
response, err := clt.Get() if response != nil && response.StatusCode == 200 {
if err != nil { subscription := new(Subscription)
continue subscription.Type = kind
} subscription.Title = fullURL
subscription.URL = fullURL
if response != nil && response.StatusCode == 200 { if subscription.URL != "" {
subscription := new(Subscription) subscriptions = append(subscriptions, subscription)
subscription.Type = kind }
subscription.Title = fullURL
subscription.URL = fullURL
if subscription.URL != "" {
subscriptions = append(subscriptions, subscription)
} }
} }
} }

View file

@ -25,6 +25,8 @@ func TestAbsoluteURL(t *testing.T) {
scenarios := [][]string{ scenarios := [][]string{
{"https://example.org/path/file.ext", "https://example.org/folder/", "/path/file.ext"}, {"https://example.org/path/file.ext", "https://example.org/folder/", "/path/file.ext"},
{"https://example.org/folder/path/file.ext", "https://example.org/folder/", "path/file.ext"}, {"https://example.org/folder/path/file.ext", "https://example.org/folder/", "path/file.ext"},
{"https://example.org/", "https://example.org/path", "./"},
{"https://example.org/folder/", "https://example.org/folder/", "./"},
{"https://example.org/path/file.ext", "https://example.org/folder", "path/file.ext"}, {"https://example.org/path/file.ext", "https://example.org/folder", "path/file.ext"},
{"https://example.org/path/file.ext", "https://example.org/folder/", "https://example.org/path/file.ext"}, {"https://example.org/path/file.ext", "https://example.org/folder/", "https://example.org/path/file.ext"},
{"https://static.example.org/path/file.ext", "https://www.example.org/", "//static.example.org/path/file.ext"}, {"https://static.example.org/path/file.ext", "https://www.example.org/", "//static.example.org/path/file.ext"},