1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-09-15 18:57:04 +00:00

Take RSS TTL field into consideration to schedule next check date

This commit is contained in:
Frédéric Guillot 2023-10-20 19:39:32 -07:00
parent ed35555d74
commit 5e6c054345
5 changed files with 105 additions and 11 deletions

View file

@ -1500,3 +1500,51 @@ func TestParseEntryWithCategoryAndCDATA(t *testing.T) {
t.Errorf("Incorrect entry category, got %q instead of %q", result, expected)
}
}
func TestParseFeedWithTTLField(t *testing.T) {
data := `<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Example</title>
<link>https://example.org/</link>
<ttl>60</ttl>
<item>
<title>Test</title>
<link>https://example.org/item</link>
</item>
</channel>
</rss>`
feed, err := Parse("https://example.org/", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
if feed.TTL != 60 {
t.Errorf("Incorrect TTL, got: %d", feed.TTL)
}
}
func TestParseFeedWithIncorrectTTLValue(t *testing.T) {
data := `<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Example</title>
<link>https://example.org/</link>
<ttl>invalid</ttl>
<item>
<title>Test</title>
<link>https://example.org/item</link>
</item>
</channel>
</rss>`
feed, err := Parse("https://example.org/", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
if feed.TTL != 0 {
t.Errorf("Incorrect TTL, got: %d", feed.TTL)
}
}

View file

@ -4,12 +4,14 @@
package rss // import "miniflux.app/v2/internal/reader/rss"
import (
"fmt"
"errors"
"math"
"strconv"
"strings"
)
var ErrInvalidDurationFormat = errors.New("rss: invalid duration format")
// PodcastFeedElement represents iTunes and GooglePlay feed XML elements.
// Specs:
// - https://github.com/simplepie/simplepie-ng/wiki/Spec:-iTunes-Podcast-RSS
@ -74,21 +76,19 @@ func (e *PodcastEntryElement) PodcastDescription() string {
return strings.TrimSpace(description)
}
var invalidDurationFormatErr = fmt.Errorf("rss: invalid duration format")
// normalizeDuration returns the duration tag value as a number of minutes
func normalizeDuration(rawDuration string) (int, error) {
var sumSeconds int
durationParts := strings.Split(rawDuration, ":")
if len(durationParts) > 3 {
return 0, invalidDurationFormatErr
return 0, ErrInvalidDurationFormat
}
for i, durationPart := range durationParts {
durationPartValue, err := strconv.Atoi(durationPart)
if err != nil {
return 0, invalidDurationFormatErr
return 0, ErrInvalidDurationFormat
}
sumSeconds += int(math.Pow(60, float64(len(durationParts)-i-1))) * durationPartValue

View file

@ -33,10 +33,28 @@ type rssFeed struct {
PubDate string `xml:"channel>pubDate"`
ManagingEditor string `xml:"channel>managingEditor"`
Webmaster string `xml:"channel>webMaster"`
TimeToLive rssTTL `xml:"channel>ttl"`
Items []rssItem `xml:"channel>item"`
PodcastFeedElement
}
type rssTTL struct {
Data string `xml:",chardata"`
}
func (r *rssTTL) Value() int {
if r.Data == "" {
return 0
}
value, err := strconv.Atoi(r.Data)
if err != nil {
return 0
}
return value
}
func (r *rssFeed) Transform(baseURL string) *model.Feed {
var err error
@ -60,6 +78,7 @@ func (r *rssFeed) Transform(baseURL string) *model.Feed {
}
feed.IconURL = strings.TrimSpace(r.ImageURL)
feed.TTL = r.TimeToLive.Value()
for _, item := range r.Items {
entry := item.Transform()