Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.03 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/json"
  5.     "fmt"
  6.     "github.com/SlyMarbo/rss"
  7.     "github.com/spf13/viper"
  8.     "net/http"
  9.     "net/url"
  10.     "strconv"
  11.     "strings"
  12.     "os/exec"
  13.     "os"
  14.     "log"
  15.     "time"
  16.     "errors"
  17. )
  18.  
  19. var rssUrl string
  20. var minSeeders int
  21. var minLeechers int
  22. var endPoint = "https://torrentapi.org/pubapi_v2.php"
  23.  
  24. type Result struct {
  25.     TorrentResults []struct {
  26.         Title    string `json:"title"`
  27.         Category string `json:"category"`
  28.         Download string `json:"download"`
  29.         Seeders  int    `json:"seeders"`
  30.         Leechers int    `json:"leechers"`
  31.         Size     int    `json:"size"`
  32.         Pubdate  string `json:"pubdate"`
  33.         EpisodeInfo struct {
  34.             Imdb       string `json:"imdb"`
  35.             Tvrage     string `json:"tvrage"`
  36.             Tvdb       string `json:"tvdb"`
  37.             Themoviedb string `json:"themoviedb"`
  38.             Airdate    string `json:"airdate"`
  39.             Epnum      string `json:"epnum"`
  40.             Seasonnum  string `json:"seasonnum"`
  41.             Title      string `json:"title"`
  42.         } `json:"episode_info"`
  43.         Ranked   int    `json:"ranked"`
  44.         InfoPage string `json:"info_page"`
  45.     } `json:"torrent_results"`
  46.     Error     string `json:"error"`
  47.     ErrorCode int    `json:"error_code"`
  48. }
  49.  
  50. type Token struct {
  51.     Token string `json:"token"`
  52. }
  53.  
  54. func perror(err error) {
  55.     if err != nil {
  56.         log.Panicln(err)
  57.         return
  58.     }
  59. }
  60.  
  61. func pwarning(err error) {
  62.     if err != nil {
  63.         log.Println(err)
  64.         return
  65.     }
  66. }
  67.  
  68. func main() {
  69.     loadConfig()
  70.  
  71.     file, err := enableLogging()
  72.     perror(err)
  73.     defer file.Close()
  74.     log.SetOutput(file)
  75.  
  76.     token := obtainToken()
  77.  
  78.     feed, err := rss.Fetch(rssUrl)
  79.     perror(err)
  80.  
  81.     log.Println(1)
  82.  
  83.     for i := 0; i < len(feed.Items); i++ {
  84.         value := feed.Items[i].Title
  85.         if value == "No Episodes" {
  86.             log.Println(value)
  87.             return
  88.         }
  89.  
  90.         title := parseTitle(value)
  91.         magnetLink, err := obtainMagnetLink(title, token)
  92.         pwarning(err)
  93.         if len(magnetLink) > 0 {
  94.             openMagnetLink(magnetLink)
  95.         }
  96.     }
  97. }
  98.  
  99. func openMagnetLink(magnetLink string) {
  100.     cmd := exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", magnetLink)
  101.     _, err := cmd.Output()
  102.     cmd.Start()
  103.  
  104.     perror(err)
  105. }
  106.  
  107. func loadConfig() {
  108.     viper.SetConfigName("app")
  109.     viper.AddConfigPath("config")
  110.     viper.SetDefault("feed", "today")
  111.     viper.SetDefault("show_ignored", 0)
  112.     viper.SetDefault("only_unacquired", 1)
  113.     viper.SetDefault("min_seeders", 50)
  114.     viper.SetDefault("min_leechers", 50)
  115.  
  116.     err := viper.ReadInConfig()
  117.     if err != nil {
  118.         perror(err)
  119.     } else {
  120.         feed := viper.GetString("feed")
  121.         showIgnored := viper.GetInt("show_ignored")
  122.         onlyUnacquired := viper.GetInt("only_unacquired")
  123.         minSeeders = viper.GetInt("min_seeders")
  124.         minLeechers = viper.GetInt("min_leechers")
  125.         user := viper.GetString("user")
  126.         pass := viper.GetString("pass")
  127.         rssUrl = fmt.Sprintf("http://www.myepisodes.com/rss.php?feed=%s&showignored=%d&onlyunacquired=%d&uid=%s&pwdmd5=%s",
  128.             feed, showIgnored, onlyUnacquired, user, pass)
  129.     }
  130. }
  131.  
  132. func enableLogging() (*os.File, error) {
  133.     file, err := os.OpenFile("tvsd.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  134.     if err != nil {
  135.         log.Fatalf("error opening file: %v", err)
  136.         return nil, err
  137.     }
  138.  
  139.     return file, nil
  140. }
  141.  
  142. func parseTitle(value string) string {
  143.     name := strings.Replace(value, "[", "", -1)
  144.     name2 := strings.Split(name, "]")
  145.     name2[0] = strings.Trim(name2[0], " ")
  146.     name2[1] = strings.Replace(name2[1], " ", "", -1)
  147.     nmb := strings.Split(name2[1], "x")
  148.     se, _ := strconv.Atoi(nmb[0])
  149.     ep, _ := strconv.Atoi(nmb[1])
  150.     number := fmt.Sprintf("s%02de%02d", se, ep)
  151.  
  152.     title := fmt.Sprintf("%s %s", name2[0], number)
  153.     log.Println(title)
  154.  
  155.     return title
  156. }
  157.  
  158. func prepareUrl(query string, token string) string {
  159.     var Url *url.URL
  160.     Url, err := url.Parse(endPoint)
  161.     perror(err)
  162.  
  163.     q := url.Values{}
  164.     q.Add("mode", "search")
  165.     q.Add("search_string", query)
  166.     q.Add("min_seeders", strconv.Itoa(minSeeders))
  167.     q.Add("min_leechers", strconv.Itoa(minLeechers))
  168.     q.Add("format", "json_extended")
  169.     q.Add("sort", "seeders")
  170.     q.Add("token", token)
  171.     Url.RawQuery = q.Encode()
  172.  
  173.     return Url.String()
  174. }
  175.  
  176. func obtainToken() string {
  177.     queryUrl := fmt.Sprintf("%s?get_token=get_token", endPoint)
  178.  
  179.     res, err := http.Get(queryUrl)
  180.     perror(err)
  181.     defer res.Body.Close()
  182.  
  183.     decoder := json.NewDecoder(res.Body)
  184.     var data Token
  185.     err = decoder.Decode(&data)
  186.     perror(err)
  187.     log.Println(data.Token)
  188.  
  189.     return data.Token
  190. }
  191.  
  192. func obtainMagnetLink(query string, token string) (string, error) {
  193.     time.Sleep(2 * time.Second)
  194.     urlString := prepareUrl(query, token)
  195.     res, err := http.Get(urlString)
  196.     perror(err)
  197.     defer res.Body.Close()
  198.  
  199.     decoder := json.NewDecoder(res.Body)
  200.     var data Result
  201.     err = decoder.Decode(&data)
  202.     perror(err)
  203.  
  204.     if len(data.Error) != 0 {
  205.         return "", errors.New(data.Error)
  206.     }
  207.  
  208.     position := obtainBestTorrent(data)
  209.     magnetLink := data.TorrentResults[position].Download
  210.     log.Println(magnetLink)
  211.  
  212.     return magnetLink, nil
  213. }
  214. func obtainBestTorrent(data Result) int {
  215.     rating := 0
  216.     position := 0
  217.     results := data.TorrentResults
  218.     for i := 0; i < len(results); i++ {
  219.         r := results[i].Size
  220.         if r > rating {
  221.             position = i
  222.         }
  223.     }
  224.     return position
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement