Handler for torrent tag finds magnets and submits to transmission

master
Bel LaPointe 2018-10-13 09:56:54 -06:00
parent 47284c1106
commit d10c937131
2 changed files with 56 additions and 2 deletions

View File

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

View File

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