nyaa / utils.go
no1b4me's picture
Upload 31 files
8cef93b verified
raw
history blame
6.52 kB
package main
import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"math/rand"
"os"
"regexp"
"strings"
"time"
"github.com/daniwalter001/jackett_fiber/types"
"github.com/gofiber/fiber/v2"
gotorrentparser "github.com/j-muller/go-torrent-parser"
)
func getMeta(id string, type_ string) (string, string) {
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
splitedId := strings.Split(id, ":")
// api := "https://v3-cinemeta.strem.io/meta/" + type_ + "/" + splitedId[0] + ".json"
api := "https://cinemeta-live.strem.io/meta/" + type_ + "/" + splitedId[0] + ".json"
fmt.Println(api)
request := fiber.Get(api)
status, data, err := request.Bytes()
if err != nil {
panic(err)
}
fmt.Printf("Status code: %d\n", status)
if status >= 400 {
return "", ""
}
var res types.IMDBMeta
jsonErr := json.Unmarshal(data, &res)
if jsonErr != nil {
return "", ""
}
var year string
if res.Meta.Year != nil {
year = *res.Meta.Year
} else if res.Meta.ReleaseInfo != nil {
year = (*res.Meta.ReleaseInfo)[:4]
} else {
year = ""
}
return *res.Meta.Name, year
}
func getImdbFromKitsu(id string) []string {
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
splitedId := strings.Split(id, ":")
api := "https://anime-kitsu.strem.fun/meta/anime/" + splitedId[0] + ":" + splitedId[1] + ".json"
request := fiber.Get(api)
status, data, err := request.Bytes()
if err != nil {
panic(err)
}
fmt.Printf("Status code: %d\n", status)
if status >= 400 {
return make([]string, 0)
}
var res types.KitsuMeta
jsonErr := json.Unmarshal(data, &res)
if jsonErr != nil {
panic(jsonErr)
}
imdb := res.Meta.ImdbID
var meta types.Videos
for i := 0; i < len(res.Meta.Videos); i++ {
a := res.Meta.Videos[i]
// fmt.Println("-------------------------")
// fmt.Println(a.ID)
// fmt.Println(a.Episode)
// fmt.Println(a.Season)
// fmt.Println(a.ImdbSeason)
// fmt.Println(a.ImdbEpisode)
// fmt.Println("-------------------------")
if a.ID == id {
meta = res.Meta.Videos[i]
}
}
var resArray []string
var e int
var abs string
if meta.Episode != meta.ImdbSeason || meta.ImdbSeason == 1 {
abs = "true"
} else {
abs = "false"
}
if meta.ImdbSeason == 1 {
e = meta.ImdbEpisode
} else {
e = meta.Episode
}
resArray = append(resArray, imdb, fmt.Sprint(meta.ImdbSeason), fmt.Sprint(meta.ImdbEpisode), fmt.Sprint(meta.Season), fmt.Sprint(e), abs)
return resArray
}
func fetchTorrent(query string, type_ string) []types.ItemsParsed {
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
servers := getServers()
randomInt := rand.Intn(len(servers))
host := servers[randomInt].Host
apiKey := servers[randomInt].ApiKey
//
category := "5000"
if type_ == "movie" {
category = "2000"
}
fmt.Printf("Query: %s\n", query)
query = removeAccents(strings.ReplaceAll(query, " ", "+"))
override := os.Getenv("OVERRIDE_API_URL")
api := fmt.Sprintf("%s/api/v2.0/indexers/yggtorrent/results/torznab/api?cache=false&cat=%s&apikey=%s&q=%s", host, category, apiKey, query)
if override != "" {
api = fmt.Sprintf("%s%s&apikey=%s&q=%s", host, override, apiKey, query)
}
fmt.Println(api)
request := fiber.Get(api)
status, data, err := request.Bytes()
if err != nil {
return make([]types.ItemsParsed, 0)
}
fmt.Printf("Status code: %d\n", status)
if status >= 400 {
return make([]types.ItemsParsed, 0)
}
var res types.JackettRssReponse
xmlErr := xml.Unmarshal(data, &res)
if xmlErr != nil {
panic(xmlErr)
}
items := res.Channel.Item
var parsedItems []types.ItemsParsed
for i := 0; i < len(items); i++ {
var a types.ItemsParsed
a.Title = items[i].Title
a.Link = items[i].Enclosure.URL
a.Tracker = items[i].Jackettindexer.Text
a.MagnetURI = items[i].Link
attr := items[i].Attr
for ii := 0; ii < len(attr); ii++ {
if attr[ii].Name == "seeders" {
a.Seeders = attr[ii].Value
}
if attr[ii].Name == "peers" {
a.Peers = attr[ii].Value
}
}
parsedItems = append(parsedItems, a)
}
// fmt.Println(PrettyPrint(parsedItems))
return parsedItems
}
func readTorrent(item types.ItemsParsed) types.ItemsParsed {
url := item.Link
request := fiber.Get(url).Timeout(15 * time.Second)
status, data, err := request.Bytes()
if status >= 400 {
return item
}
if err != nil {
fmt.Printf("%s\n", err)
return item
}
if err != nil {
fmt.Println(err)
return item
}
var files []types.TorrentFile
fileReader := bytes.NewReader(data)
torrentFile, _ := gotorrentparser.Parse(fileReader)
for _, file := range torrentFile.Files {
// fmt.Println(file.Path[len(file.Path)-1])
files = append(files, types.TorrentFile{
Name: file.Path[len(file.Path)-1],
TorrentName: file.Path[len(file.Path)-1],
Path: "/" + file.Path[len(file.Path)-1],
Length: int(file.Length),
AnnounceList: torrentFile.Announce,
InfoHash: torrentFile.InfoHash,
})
}
item.TorrentData = files
return item
}
func readTorrentFromMagnet(item types.ItemsParsed) types.ItemsParsed {
c := TorrentClient()
t, addErr := c.AddMagnet(item.MagnetURI)
if addErr != nil {
fmt.Printf("ErrMagnet: %s\n", addErr)
return item
}
ed := make(chan string, 1)
go func() {
<-t.GotInfo()
ed <- "done"
}()
select {
case <-time.After(15 * time.Second):
return item
case res := <-ed:
if res == "done" {
var files []types.TorrentFile
for i := 0; i < len(t.Files()); i++ {
file := t.Files()[i]
var announceList []string
for i := 0; i < len(file.Torrent().Metainfo().AnnounceList); i++ {
for j := 0; j < len(file.Torrent().Metainfo().AnnounceList[i]); j++ {
announceList = append(announceList, fmt.Sprintf("tracker:%s", file.Torrent().Metainfo().AnnounceList[i][j]))
}
}
files = append(files, types.TorrentFile{
Name: file.DisplayPath(),
TorrentName: file.Torrent().Name(),
Path: file.Path(),
Length: int(file.Length()),
AnnounceList: announceList,
InfoHash: file.Torrent().InfoHash().String(),
})
}
item.TorrentData = files
}
return item
}
}
func simplifiedName(name string) string {
r, _ := regexp.Compile(`\s{2,}`)
resRegex := r.FindAllString(name, -1)
for _, word := range resRegex {
name = strings.ReplaceAll(name, word, " ")
}
if strings.Contains(name, ":") {
name = strings.Split(name, ":")[0]
}
if strings.Contains(name, "-") {
name = strings.Split(name, "-")[0]
}
return strings.Trim(name, " ")
}