add podcast support
parent
eaf9ee8a3a
commit
49b95cf5a5
|
|
@ -5,12 +5,16 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"local/logger"
|
"local/logger"
|
||||||
"local/rssmon2/monitor"
|
"local/rssmon2/monitor"
|
||||||
"local/rssmon2/rss"
|
"local/rssmon2/rss"
|
||||||
"local/rssmon2/server"
|
"local/rssmon2/server"
|
||||||
"local/rssmon2/store"
|
"local/rssmon2/store"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -25,6 +29,7 @@ type Exchange struct {
|
||||||
Srv *server.Server
|
Srv *server.Server
|
||||||
allFeeds map[string]*rss.Feed
|
allFeeds map[string]*rss.Feed
|
||||||
toraddr string
|
toraddr string
|
||||||
|
savepath string
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(mon *monitor.Monitor, sclient store.Client, srv *server.Server, toraddr string) *Exchange {
|
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,
|
Srv: srv,
|
||||||
allFeeds: make(map[string]*rss.Feed),
|
allFeeds: make(map[string]*rss.Feed),
|
||||||
toraddr: toraddr,
|
toraddr: toraddr,
|
||||||
|
savepath: "/mnt/podcasts",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,11 +216,45 @@ func (ex *Exchange) handlerByTag(tags []string, items []*rss.Item) {
|
||||||
switch tags[i] {
|
switch tags[i] {
|
||||||
case "torrent":
|
case "torrent":
|
||||||
ex.handlerTorrent(items[j])
|
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) {
|
func (ex *Exchange) handlerTorrent(item *rss.Item) {
|
||||||
magnet := regexp.MustCompile("magnet:.xt[^ $]*")
|
magnet := regexp.MustCompile("magnet:.xt[^ $]*")
|
||||||
if !magnet.MatchString(item.Content) {
|
if !magnet.MatchString(item.Content) {
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,16 @@ type Item struct {
|
||||||
Name string
|
Name string
|
||||||
Link string
|
Link string
|
||||||
Content string
|
Content string
|
||||||
|
Enclosures []string
|
||||||
TS time.Time
|
TS time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func (item *Item) String() string {
|
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.Name,
|
||||||
item.Link,
|
item.Link,
|
||||||
len(item.Content),
|
len(item.Content),
|
||||||
|
item.Enclosures,
|
||||||
item.TS.Local(),
|
item.TS.Local(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -51,10 +53,15 @@ func (item *Item) Serialize() ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func FromGofeedItem(gfitem *gofeed.Item, filter string) *Item {
|
func FromGofeedItem(gfitem *gofeed.Item, filter string) *Item {
|
||||||
|
enclosures := []string{}
|
||||||
|
for i := range gfitem.Enclosures {
|
||||||
|
enclosures = append(enclosures, gfitem.Enclosures[i].URL)
|
||||||
|
}
|
||||||
item := &Item{
|
item := &Item{
|
||||||
Name: gfitem.Title,
|
Name: gfitem.Title,
|
||||||
Link: gfitem.Link,
|
Link: gfitem.Link,
|
||||||
Content: "",
|
Content: "",
|
||||||
|
Enclosures: enclosures,
|
||||||
TS: *gofeedItemTS(gfitem),
|
TS: *gofeedItemTS(gfitem),
|
||||||
}
|
}
|
||||||
content := gfitem.Content
|
content := gfitem.Content
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue