2017-07-16 17:14:21 +02:00
package feedController
import (
"net/http"
"strconv"
"strings"
"time"
"github.com/NyaaPantsu/nyaa/config"
"github.com/NyaaPantsu/nyaa/utils/categories"
"github.com/NyaaPantsu/nyaa/utils/feeds"
"github.com/NyaaPantsu/nyaa/utils/publicSettings"
"github.com/gin-gonic/gin"
"github.com/gorilla/feeds"
)
// RSSTorznabHandler : Controller for displaying rss feed, accepting common search arguments
func RSSTorznabHandler ( c * gin . Context ) {
t := c . Query ( "t" )
2017-07-23 07:46:29 +02:00
var rss string
2017-07-16 17:14:21 +02:00
title := "Nyaa Pantsu"
if config . IsSukebei ( ) {
title = "Sukebei Pantsu"
}
if t == "caps" {
T := publicSettings . GetTfuncFromRequest ( c )
cats := categories . GetSelect ( true , true )
var categories [ ] * nyaafeeds . RssCategoryTorznab
categories = append ( categories , & nyaafeeds . RssCategoryTorznab {
ID : "5070" ,
Name : "Anime" ,
Description : "Anime" ,
} )
last := 0
for _ , v := range cats {
if len ( v . ID ) <= 2 {
categories = append ( categories , & nyaafeeds . RssCategoryTorznab {
ID : nyaafeeds . ConvertFromCat ( v . ID ) ,
Name : string ( T ( v . Name ) ) ,
} )
last ++
} else {
categories [ last ] . Subcat = append ( categories [ last ] . Subcat , & nyaafeeds . RssSubCat {
ID : nyaafeeds . ConvertFromCat ( v . ID ) ,
Name : string ( T ( v . Name ) ) ,
} )
}
}
feed := & nyaafeeds . RssCaps {
Server : & nyaafeeds . RssServer {
Version : "1.0" ,
Title : title ,
Strapline : "..." ,
Email : config . Get ( ) . Email . From ,
URL : config . WebAddress ( ) ,
Image : config . WebAddress ( ) + "/img/logo.png" ,
} ,
Limits : & nyaafeeds . RssLimits {
Max : "300" ,
Default : "50" ,
} ,
Registration : & nyaafeeds . RssRegistration {
Available : "yes" ,
Open : "yes" ,
} ,
Searching : & nyaafeeds . RssSearching {
Search : & nyaafeeds . RssSearch {
Available : "yes" ,
SupportedParams : "q" ,
} ,
TvSearch : & nyaafeeds . RssSearch {
Available : "no" ,
} ,
MovieSearch : & nyaafeeds . RssSearch {
Available : "no" ,
} ,
} ,
Categories : & nyaafeeds . RssCategories {
Category : categories ,
} ,
}
var rssErr error
rss , rssErr = feeds . ToXML ( feed )
if rssErr != nil {
c . AbortWithError ( http . StatusInternalServerError , rssErr )
}
} else {
// We only get the basic variable for rss based on search param
torrents , createdAsTime , title , err := getTorrentList ( c )
if err != nil {
c . AbortWithError ( http . StatusBadRequest , err )
return
}
feed := & nyaafeeds . RssFeed {
Title : title ,
Xmlns : "http://torznab.com/schemas/2015/feed" ,
Link : config . WebAddress ( ) + "/" ,
PubDate : createdAsTime . String ( ) ,
}
feed . Items = make ( [ ] * nyaafeeds . RssItem , len ( torrents ) )
for i , torrent := range torrents {
torrentJSON := torrent . ToJSON ( )
filesNumber := ""
if len ( torrentJSON . FileList ) > 0 {
filesNumber = strconv . Itoa ( len ( torrentJSON . FileList ) )
}
seeders := ""
if torrentJSON . Seeders > 0 {
seeders = strconv . Itoa ( int ( torrentJSON . Seeders ) )
}
leechers := ""
if torrentJSON . Leechers > 0 {
leechers = strconv . Itoa ( int ( torrentJSON . Leechers ) )
}
feed . Items [ i ] = & nyaafeeds . RssItem {
Title : torrentJSON . Name ,
Link : config . WebAddress ( ) + "/download/" + torrentJSON . Hash ,
Category : & nyaafeeds . RssCategory {
Domain : config . WebAddress ( ) + "/search?c=" + torrentJSON . Category + "_" + torrentJSON . SubCategory ,
} ,
Description : string ( torrentJSON . Description ) ,
Comments : config . WebAddress ( ) + "/view/" + strconv . FormatUint ( uint64 ( torrentJSON . ID ) , 10 ) ,
PubDate : torrent . Date . Format ( time . RFC822 ) ,
GUID : config . WebAddress ( ) + "/view/" + strconv . FormatUint ( uint64 ( torrentJSON . ID ) , 10 ) ,
Enclosure : & nyaafeeds . RssEnclosure {
URL : config . WebAddress ( ) + "/download/" + strings . TrimSpace ( torrentJSON . Hash ) ,
Length : strconv . FormatUint ( uint64 ( torrentJSON . Filesize ) , 10 ) ,
Type : "application/x-bittorrent" ,
} ,
}
torznab := [ ] * nyaafeeds . RssTorznab { }
if torrentJSON . Filesize > 0 {
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "size" ,
Value : strconv . FormatUint ( uint64 ( torrentJSON . Filesize ) , 10 ) ,
} )
}
if filesNumber != "" {
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "files" ,
Value : filesNumber ,
} )
}
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "grabs" ,
Value : strconv . Itoa ( int ( torrentJSON . Completed ) ) ,
} )
if seeders != "" {
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "seeders" ,
Value : seeders ,
} )
}
if leechers != "" {
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "leechers" ,
Value : leechers ,
} )
}
if torrentJSON . Hash != "" {
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "infohash" ,
Value : torrentJSON . Hash ,
} )
}
if torrentJSON . Magnet != "" {
torznab = append ( torznab , & nyaafeeds . RssTorznab {
Name : "magneturl" ,
Value : string ( torrentJSON . Magnet ) ,
} )
}
if len ( torznab ) > 0 {
feed . Items [ i ] . Torznab = torznab
}
}
var rssErr error
rss , rssErr = feeds . ToXML ( feed )
if rssErr != nil {
c . AbortWithError ( http . StatusInternalServerError , rssErr )
}
}
// allow cross domain AJAX requests
c . Header ( "Access-Control-Allow-Origin" , "*" )
_ , writeErr := c . Writer . Write ( [ ] byte ( rss ) )
if writeErr != nil {
c . AbortWithError ( http . StatusInternalServerError , writeErr )
}
}