From d10c9371311d6f89e67bd161045df6b4f19b1440 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Sat, 13 Oct 2018 09:56:54 -0600 Subject: [PATCH] Handler for torrent tag finds magnets and submits to transmission --- exchange/exchange.go | 56 +++++++++++++++++++++++++++++++++++++++++++- main.go | 2 +- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/exchange/exchange.go b/exchange/exchange.go index 96a42f2..873cd84 100644 --- a/exchange/exchange.go +++ b/exchange/exchange.go @@ -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) + } } diff --git a/main.go b/main.go index 04a5d0b..9255dc8 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,7 @@ func core() { config := config.New() - ex := exchange.New(nil, nil, nil) + ex := exchange.New(nil, nil, nil, config.TorAddr) var mon *monitor.Monitor if mon, err = monitor.New(ex.UpdateFeed); err != nil {