add podcast support
parent
eaf9ee8a3a
commit
49b95cf5a5
|
|
@ -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) {
|
||||
|
|
|
|||
25
rss/item.go
25
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 == "" {
|
||||
|
|
|
|||
Loading…
Reference in New Issue