add podcast support

master
Bel LaPointe 2019-02-27 08:04:07 -07:00
parent eaf9ee8a3a
commit 49b95cf5a5
2 changed files with 56 additions and 9 deletions

View File

@ -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) {

View File

@ -19,14 +19,16 @@ type Item struct {
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,10 +53,15 @@ 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: "",
Enclosures: enclosures,
TS: *gofeedItemTS(gfitem),
}
content := gfitem.Content