Handler for torrent tag finds magnets and submits to transmission
parent
47284c1106
commit
d10c937131
|
|
@ -1,12 +1,16 @@
|
|||
package exchange
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"local1/logger"
|
||||
"local3/rssmon2/monitor"
|
||||
"local3/rssmon2/rss"
|
||||
"local3/rssmon2/server"
|
||||
"local3/rssmon2/store"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
|
@ -19,14 +23,16 @@ type Exchange struct {
|
|||
SClient store.Client
|
||||
Srv *server.Server
|
||||
allFeeds map[string]*rss.Feed
|
||||
toraddr string
|
||||
}
|
||||
|
||||
func New(mon *monitor.Monitor, sclient store.Client, srv *server.Server) *Exchange {
|
||||
func New(mon *monitor.Monitor, sclient store.Client, srv *server.Server, toraddr string) *Exchange {
|
||||
return &Exchange{
|
||||
Mon: mon,
|
||||
SClient: sclient,
|
||||
Srv: srv,
|
||||
allFeeds: make(map[string]*rss.Feed),
|
||||
toraddr: toraddr,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -193,4 +199,52 @@ func (ex *Exchange) UpdateFeed(url string) {
|
|||
//logger.Log("Saved feed item", feed.ID(), items[i].ID(), items[i])
|
||||
}
|
||||
logger.Logf("Saved %d feed items for %s", len(items), feed.Title)
|
||||
go ex.handlerByTag(feed.Tags, items)
|
||||
}
|
||||
|
||||
func (ex *Exchange) handlerByTag(tags []string, items []*rss.Item) {
|
||||
for i := range tags {
|
||||
for j := range items {
|
||||
switch tags[i] {
|
||||
case "torrent":
|
||||
ex.handlerTorrent(items[j])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ex *Exchange) handlerTorrent(item *rss.Item) {
|
||||
magnet := regexp.MustCompile("magnet:.xt[^ $]*")
|
||||
if !magnet.MatchString(item.Content) {
|
||||
logger.Log("no magnet link: ", item.Content)
|
||||
}
|
||||
match := magnet.FindString(item.Content)
|
||||
|
||||
resp, err := http.Get(ex.toraddr)
|
||||
if err != nil {
|
||||
logger.Logf("cannot get session id at %v: %v", ex.toraddr, err)
|
||||
return
|
||||
}
|
||||
sessionID := resp.Header.Get("X-Transmission-Session-Id")
|
||||
req, err := http.NewRequest("POST", ex.toraddr, bytes.NewBufferString(`{"method":"torrent-add", "arguments": {"filename": "`+match+`"}}`))
|
||||
if err != nil {
|
||||
logger.Log("cannot build request: %v", err)
|
||||
return
|
||||
}
|
||||
req.Header.Add("X-Transmission-Session-Id", sessionID)
|
||||
resp, err = (&http.Client{}).Do(req)
|
||||
if err != nil {
|
||||
logger.Log("failed POST: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
var out map[string]interface{}
|
||||
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
|
||||
logger.Log("cannot decode response: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if v, ok := out["result"]; !ok || v != "success" {
|
||||
logger.Logf("failed magnet submission for feed item %v (%v): %v", item.Name, item.Content, v)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue