Handler for torrent tag finds magnets and submits to transmission
parent
47284c1106
commit
d10c937131
|
|
@ -1,12 +1,16 @@
|
||||||
package exchange
|
package exchange
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"local1/logger"
|
"local1/logger"
|
||||||
"local3/rssmon2/monitor"
|
"local3/rssmon2/monitor"
|
||||||
"local3/rssmon2/rss"
|
"local3/rssmon2/rss"
|
||||||
"local3/rssmon2/server"
|
"local3/rssmon2/server"
|
||||||
"local3/rssmon2/store"
|
"local3/rssmon2/store"
|
||||||
|
"net/http"
|
||||||
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -19,14 +23,16 @@ type Exchange struct {
|
||||||
SClient store.Client
|
SClient store.Client
|
||||||
Srv *server.Server
|
Srv *server.Server
|
||||||
allFeeds map[string]*rss.Feed
|
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{
|
return &Exchange{
|
||||||
Mon: mon,
|
Mon: mon,
|
||||||
SClient: sclient,
|
SClient: sclient,
|
||||||
Srv: srv,
|
Srv: srv,
|
||||||
allFeeds: make(map[string]*rss.Feed),
|
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.Log("Saved feed item", feed.ID(), items[i].ID(), items[i])
|
||||||
}
|
}
|
||||||
logger.Logf("Saved %d feed items for %s", len(items), feed.Title)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
main.go
2
main.go
|
|
@ -18,7 +18,7 @@ func core() {
|
||||||
|
|
||||||
config := config.New()
|
config := config.New()
|
||||||
|
|
||||||
ex := exchange.New(nil, nil, nil)
|
ex := exchange.New(nil, nil, nil, config.TorAddr)
|
||||||
|
|
||||||
var mon *monitor.Monitor
|
var mon *monitor.Monitor
|
||||||
if mon, err = monitor.New(ex.UpdateFeed); err != nil {
|
if mon, err = monitor.New(ex.UpdateFeed); err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue