nyaa / utils.go.old
no1b4me's picture
Upload 26 files
866e5a0 verified
package main
import (
"encoding/base64"
"encoding/json"
"encoding/xml"
"fmt"
"math/rand"
"os"
"strings"
"time"
"github.com/anacrolix/torrent"
"github.com/daniwalter001/jackett_fiber/types"
"github.com/gofiber/fiber/v2"
)
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"
}
query = 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 {
panic(err)
}
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.MagnetURI
c := TorrentClient()
defer c.Close()
fileName := strings.ReplaceAll((strings.Split(url, "&file="))[len(strings.Split(url, "&file="))-1], "+", "_") + ".torrent"
if len(fileName) > 100 {
fileName = base64.StdEncoding.EncodeToString([]byte(fileName)) + ".torrent"
fileName = fileName[len(fileName)-100:]
}
// fmt.Printf("Name: %s\n", fileName)
file, errFile := os.Create(fmt.Sprintf("./temp/%s", fileName))
if errFile != nil {
fmt.Println(errFile)
fmt.Printf("1Removing...%s\n", file.Name())
os.Remove(file.Name())
return item
}
request := fiber.Get(url).Timeout(15 * time.Second)
status, data, err := request.Bytes()
if status >= 400 {
// fmt.Printf("1.5Removing...%d %s\n", status, file.Name())
os.Remove(file.Name())
return item
}
if err != nil {
fmt.Printf("%s\n", err)
// fmt.Printf("2Removing...%s\n", file.Name())
os.Remove(file.Name())
return item
}
if err != nil {
fmt.Println(err)
// fmt.Printf("3Removing...%s\n", file.Name())
os.Remove(file.Name())
return item
}
fileError := os.WriteFile(file.Name(), data, 0666)
if fileError != nil {
fmt.Println(fileError)
fmt.Printf("4Removing...%s\n", file.Name())
os.Remove(file.Name())
return item
}
t, addErr := c.AddTorrentFromFile(file.Name())
// <-t.GotInfo()
if addErr != nil {
fmt.Printf("Err: %s\n", addErr)
fmt.Printf("5Removing...%s\n", file.Name())
os.Remove(file.Name())
return item
}
// fmt.Printf("6Removing...%s\n", file.Name())
os.Remove(file.Name())
var files []torrent.File
for i := 0; i < len(t.Files()); i++ {
file := t.Files()[i]
files = append(files, *file)
}
// fmt.Println(PrettyPrint(files))
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 []torrent.File
for i := 0; i < len(t.Files()); i++ {
file := t.Files()[i]
files = append(files, *file)
}
item.TorrentData = files
}
return item
}
}