mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-24 00:33:14 +00:00
43 lines
965 B
Go
43 lines
965 B
Go
package server
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"io"
|
|
)
|
|
|
|
type opml struct {
|
|
XMLName xml.Name `xml:"opml"`
|
|
Version string `xml:"version,attr"`
|
|
Outlines []outline `xml:"body>outline"`
|
|
}
|
|
|
|
type outline struct {
|
|
Type string `xml:"type,attr,omitempty"`
|
|
Title string `xml:"text,attr"`
|
|
FeedURL string `xml:"xmlUrl,attr,omitempty"`
|
|
SiteURL string `xml:"htmlUrl,attr,omitempty"`
|
|
Description string `xml:"description,attr,omitempty"`
|
|
Outlines []outline `xml:"outline,omitempty"`
|
|
}
|
|
|
|
func (o outline) AllFeeds() []outline {
|
|
result := make([]outline, 0)
|
|
for _, sub := range o.Outlines {
|
|
if sub.Type == "rss" {
|
|
result = append(result, sub)
|
|
} else {
|
|
result = append(result, sub.AllFeeds()...)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func parseOPML(r io.Reader) (*opml, error) {
|
|
feeds := new(opml)
|
|
decoder := xml.NewDecoder(r)
|
|
decoder.Entity = xml.HTMLEntity
|
|
decoder.Strict = false
|
|
err := decoder.Decode(&feeds)
|
|
return feeds, err
|
|
}
|