diff --git a/exchange/exchange.go b/exchange/exchange.go index 0516837..7c8e9eb 100644 --- a/exchange/exchange.go +++ b/exchange/exchange.go @@ -5,12 +5,16 @@ import ( "encoding/json" "errors" "fmt" + "io" "local/logger" "local/rssmon2/monitor" "local/rssmon2/rss" "local/rssmon2/server" "local/rssmon2/store" + "log" "net/http" + "os" + "path" "regexp" "sort" "strings" @@ -25,6 +29,7 @@ type Exchange struct { Srv *server.Server allFeeds map[string]*rss.Feed toraddr string + savepath string } func New(mon *monitor.Monitor, sclient store.Client, srv *server.Server, toraddr string) *Exchange { @@ -34,6 +39,7 @@ func New(mon *monitor.Monitor, sclient store.Client, srv *server.Server, toraddr Srv: srv, allFeeds: make(map[string]*rss.Feed), toraddr: toraddr, + savepath: "/mnt/podcasts", } } @@ -210,11 +216,45 @@ func (ex *Exchange) handlerByTag(tags []string, items []*rss.Item) { switch tags[i] { case "torrent": ex.handlerTorrent(items[j]) + case "podcast": + ex.handlerPodcast(items[j]) } } } } +func (ex *Exchange) handlerPodcast(item *rss.Item) { + if len(item.Enclosures) < 1 { + return + } + for i := range item.Enclosures { + link := item.Enclosures[i] + if !strings.Contains(link, ".mp3") { + continue + } + resp, err := http.Get(link) + if err != nil { + log.Printf("cannot get podcast %q: %v", link, err) + continue + } + defer resp.Body.Close() + + if err := os.MkdirAll(ex.savepath, os.ModePerm); err != nil && err != os.ErrExist { + log.Printf("cannot make path %q for saving: %v", ex.savepath, err) + continue + } + out, err := os.Create(path.Join(ex.savepath, path.Base(link))) + if err != nil { + log.Printf("cannot create file %q for saving: %v", path.Join(ex.savepath, path.Base(link)), err) + continue + } + if _, err := io.Copy(out, resp.Body); err != nil { + log.Printf("failed to write: %v", err) + continue + } + } +} + func (ex *Exchange) handlerTorrent(item *rss.Item) { magnet := regexp.MustCompile("magnet:.xt[^ $]*") if !magnet.MatchString(item.Content) { diff --git a/rss/item.go b/rss/item.go index caff7b2..728b92d 100644 --- a/rss/item.go +++ b/rss/item.go @@ -16,17 +16,19 @@ import ( ) type Item struct { - Name string - Link string - Content string - TS time.Time + Name string + Link string + Content string + Enclosures []string + TS time.Time } func (item *Item) String() string { - return fmt.Sprintf("Name %v, Link %v, Content %v, TS %v", + return fmt.Sprintf("Name %v, Link %v, Content %v, Enclosures %v, TS %v", item.Name, item.Link, len(item.Content), + item.Enclosures, item.TS.Local(), ) } @@ -51,11 +53,16 @@ func (item *Item) Serialize() ([]byte, error) { } func FromGofeedItem(gfitem *gofeed.Item, filter string) *Item { + enclosures := []string{} + for i := range gfitem.Enclosures { + enclosures = append(enclosures, gfitem.Enclosures[i].URL) + } item := &Item{ - Name: gfitem.Title, - Link: gfitem.Link, - Content: "", - TS: *gofeedItemTS(gfitem), + Name: gfitem.Title, + Link: gfitem.Link, + Content: "", + Enclosures: enclosures, + TS: *gofeedItemTS(gfitem), } content := gfitem.Content if content == "" {