diff --git a/.gitignore b/.gitignore index ece147f5..8248a38a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ *.db main nyaa -nyaa-master.exe \ No newline at end of file +nyaa.exe +nyaa-master.exe +*.zip diff --git a/index.html b/index.html index c926a3e6..ad69448c 100644 --- a/index.html +++ b/index.html @@ -35,7 +35,7 @@
- +Id | Name | Hash | +Date | +Size | Links | {{.Id}} | -{{.Name}} | +{{.Name}} | {{.Hash}} | +{{.Date}} | +{{.Filesize}} |
diff --git a/main.go b/main.go
index 27b3e64a..f2024df1 100644
--- a/main.go
+++ b/main.go
@@ -16,7 +16,7 @@ import (
)
var db *gorm.DB
-var templates = template.Must(template.ParseFiles("index.html", "FAQ.html"))
+var templates = template.Must(template.ParseFiles("index.html", "FAQ.html", "view.html"))
var debugLogger *log.Logger
var trackers = "&tr=udp://zer0day.to:1337/announce&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://explodie.org:6969&tr=udp://tracker.opentrackr.org:1337&tr=udp://tracker.coppersurfer.tk:6969"
@@ -25,7 +25,7 @@ func getDBHandle() *gorm.DB {
// Migrate the schema of Torrents
dbInit.AutoMigrate(&Torrents{}, &Categories{}, &Sub_Categories{}, &Statuses{})
-
+
checkErr(err)
return dbInit
}
@@ -64,7 +64,7 @@ func apiHandler(w http.ResponseWriter, r *http.Request) {
}
}
-func singleapiHandler(w http.ResponseWriter, r *http.Request) {
+func apiViewHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
@@ -98,6 +98,9 @@ func searchHandler(w http.ResponseWriter, r *http.Request) {
searchQuery := r.URL.Query().Get("q")
cat := r.URL.Query().Get("c")
stat := r.URL.Query().Get("s")
+ sort := r.URL.Query().Get("sort")
+ order := r.URL.Query().Get("order")
+
catsSplit := strings.Split(cat, "_")
// need this to prevent out of index panics
var searchCatId, searchSubCatId string
@@ -106,13 +109,21 @@ func searchHandler(w http.ResponseWriter, r *http.Request) {
searchCatId = html.EscapeString(catsSplit[0])
searchSubCatId = html.EscapeString(catsSplit[1])
}
+ if sort == "" {
+ sort = "torrent_id"
+ }
+ if order == "" {
+ order = "desc"
+ }
+ order_by := sort + " " + order
nbTorrents := 0
b := []TorrentsJson{}
- torrents := getTorrents(createWhereParams("torrent_name LIKE ? AND status_id LIKE ? AND category_id LIKE ? AND sub_category_id LIKE ?",
- "%"+searchQuery+"%", stat+"%", searchCatId+"%", searchSubCatId+"%"), maxPerPage, maxPerPage*(pagenum-1))
+ parameters := createWhereParams("torrent_name LIKE ? AND status_id LIKE ? AND category_id LIKE ? AND sub_category_id LIKE ?",
+ "%"+searchQuery+"%", stat+"%", searchCatId+"%", searchSubCatId+"%")
+ torrents := getTorrentsOrderBy(¶meters, order_by, maxPerPage, maxPerPage*(pagenum-1))
for i, _ := range torrents {
nbTorrents++
@@ -122,7 +133,7 @@ func searchHandler(w http.ResponseWriter, r *http.Request) {
}
- htv := HomeTemplateVariables{b, getAllCategories(false), searchQuery, stat, cat, maxPerPage, nbTorrents}
+ htv := HomeTemplateVariables{b, getAllCategories(false), searchQuery, stat, cat, sort, order, maxPerPage, nbTorrents}
err := templates.ExecuteTemplate(w, "index.html", htv)
if err != nil {
@@ -149,43 +160,60 @@ func rssHandler(w http.ResponseWriter, r *http.Request) {
torrents := getFeeds()
created := time.Now().String()
- if ( len(torrents) > 0 ) {
+ if len(torrents) > 0 {
created = torrents[0].Timestamp
}
created_as_time, err := time.Parse("2006-01-02 15:04:05", created)
if err == nil {
- ;
+
}
feed := &feeds.Feed{
- Title: "Nyaa Pantsu",
- Link: &feeds.Link{Href: "https://nyaa.pantsu.cat/"},
- Created: created_as_time,
+ Title: "Nyaa Pantsu",
+ Link: &feeds.Link{Href: "https://nyaa.pantsu.cat/"},
+ Created: created_as_time,
}
feed.Items = []*feeds.Item{}
- feed.Items = make( []*feeds.Item, len(torrents))
+ feed.Items = make([]*feeds.Item, len(torrents))
for i, _ := range torrents {
timestamp_as_time, err := time.Parse("2006-01-02 15:04:05", torrents[i].Timestamp)
if err == nil {
- feed.Items[i] = &feeds.Item{
+ feed.Items[i] = &feeds.Item{
// need a torrent view first
//Id: URL + torrents[i].Hash,
- Title: torrents[i].Name,
- Link: &feeds.Link{Href: string(torrents[i].Magnet)},
+ Title: torrents[i].Name,
+ Link: &feeds.Link{Href: string(torrents[i].Magnet)},
Description: "",
- Created: timestamp_as_time,
- Updated: timestamp_as_time,
+ Created: timestamp_as_time,
+ Updated: timestamp_as_time,
}
}
}
rss, err := feed.ToRss()
if err == nil {
- w.Write( []byte( rss ) )
+ w.Write([]byte(rss))
} else {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
+func viewHandler(w http.ResponseWriter, r *http.Request) {
+
+ vars := mux.Vars(r)
+ id := vars["id"]
+ b := []TorrentsJson{}
+
+ torrent, err := getTorrentById(id)
+ res := torrent.toJson()
+ b = append(b, res)
+
+ htv := HomeTemplateVariables{b, getAllCategories(false), "", "", "_", "", "", 1, 1}
+
+ err = templates.ExecuteTemplate(w, "view.html", htv)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ }
+}
func rootHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
@@ -209,7 +237,7 @@ func rootHandler(w http.ResponseWriter, r *http.Request) {
}
- htv := HomeTemplateVariables{b, getAllCategories(false), "", "", "_", maxPerPage, nbTorrents}
+ htv := HomeTemplateVariables{b, getAllCategories(false), "", "", "_", "torrent_id", "desc", maxPerPage, nbTorrents}
err := templates.ExecuteTemplate(w, "index.html", htv)
if err != nil {
@@ -234,9 +262,10 @@ func main() {
router.HandleFunc("/search", searchHandler)
router.HandleFunc("/search/{page}", searchHandler)
router.HandleFunc("/api/{page}", apiHandler).Methods("GET")
- router.HandleFunc("/api/torrent/{id}", singleapiHandler).Methods("GET")
+ router.HandleFunc("/api/view/{id}", apiViewHandler).Methods("GET")
router.HandleFunc("/faq", faqHandler)
router.HandleFunc("/feed.xml", rssHandler)
+ router.HandleFunc("/view/{id}", viewHandler)
http.Handle("/", router)
diff --git a/models.go b/models.go
index 3fb9ff9a..40f93fd7 100644
--- a/models.go
+++ b/models.go
@@ -10,31 +10,31 @@ import (
)
type Feed struct {
- Id int
- Name string
- Hash string
- Magnet string
- Timestamp string
+ Id int
+ Name string
+ Hash string
+ Magnet string
+ Timestamp string
}
type Categories struct {
- Category_id int
- Category_name string
- Torrents []Torrents `gorm:"ForeignKey:category_id;AssociationForeignKey:category_id"`
- Sub_Categories []Sub_Categories `gorm:"ForeignKey:category_id;AssociationForeignKey:parent_id"`
+ Category_id int
+ Category_name string
+ Torrents []Torrents `gorm:"ForeignKey:category_id;AssociationForeignKey:category_id"`
+ Sub_Categories []Sub_Categories `gorm:"ForeignKey:category_id;AssociationForeignKey:parent_id"`
}
type Sub_Categories struct {
- Sub_category_id int
+ Sub_category_id int
Sub_category_name string
- Parent_id int
- Torrents []Torrents `gorm:"ForeignKey:sub_category_id;AssociationForeignKey:sub_category_id"`
+ Parent_id int
+ Torrents []Torrents `gorm:"ForeignKey:sub_category_id;AssociationForeignKey:sub_category_id"`
}
type Statuses struct {
- Status_id int
- Status_name string
- Torrents []Torrents `gorm:"ForeignKey:status_id;AssociationForeignKey:status_id"`
+ Status_id int
+ Status_name string
+ Torrents []Torrents `gorm:"ForeignKey:status_id;AssociationForeignKey:status_id"`
}
type Torrents struct {
@@ -42,12 +42,12 @@ type Torrents struct {
Name string `gorm:"column:torrent_name"`
Category_id int `gorm:"column:category_id"`
Sub_category_id int `gorm:"column:sub_category_id"`
- Status_id int `gorm:"column:status_id"`
+ Status_id int `gorm:"column:status_id"`
Hash string `gorm:"column:torrent_hash"`
- Date int `gorm:"column:date"`
- Downloads int `gorm:"column:downloads"`
- Filesize string `gorm:"column:filesize"`
- Description []byte `gorm:"column:description"`
+ Date int `gorm:"column:date"`
+ Downloads int `gorm:"column:downloads"`
+ Filesize string `gorm:"column:filesize"`
+ Description []byte `gorm:"column:description"`
Statuses Statuses `gorm:"ForeignKey:status_id;AssociationForeignKey:status_id"`
Categories Categories `gorm:"ForeignKey:category_id;AssociationForeignKey:category_id"`
Sub_Categories Sub_Categories `gorm:"ForeignKey:sub_category_id;AssociationForeignKey:sub_category_id"`
@@ -67,11 +67,13 @@ type CategoryJson struct {
}
type TorrentsJson struct {
- Id string `json: "id"` // Is there a need to put the ID?
- Name string `json: "name"`
- Status int `json: "status"`
- Hash string `json: "hash"`
- Magnet template.URL `json: "magnet"`
+ Id string `json: "id"` // Is there a need to put the ID?
+ Name string `json: "name"`
+ Status int `json: "status"`
+ Hash string `json: "hash"`
+ Date int `json: "date"`
+ Filesize string `json: "filesize"`
+ Magnet template.URL `json: "magnet"`
}
type WhereParams struct {
@@ -87,6 +89,8 @@ type HomeTemplateVariables struct {
Query string
Status string
Category string
+ Sort string
+ Order string
QueryRecordCount int
TotalRecordCount int
}
@@ -103,15 +107,15 @@ func getFeeds() []Feed {
rows, err := db.DB().
Query(
"SELECT `torrent_id` AS `id`, `torrent_name` AS `name`, `torrent_hash` AS `hash`, `timestamp` FROM `torrents` " +
- "ORDER BY `timestamp` desc LIMIT 50")
- if ( err == nil ) {
+ "ORDER BY `timestamp` desc LIMIT 50")
+ if err == nil {
for rows.Next() {
item := Feed{}
- rows.Scan( &item.Id, &item.Name, &item.Hash, &item.Timestamp )
+ rows.Scan(&item.Id, &item.Name, &item.Hash, &item.Timestamp)
magnet := "magnet:?xt=urn:btih:" + strings.TrimSpace(item.Hash) + "&dn=" + item.Name + trackers
item.Magnet = magnet
// memory hog
- result = append( result, item )
+ result = append(result, item)
}
rows.Close()
}
@@ -131,23 +135,25 @@ func getTorrentById(id string) (Torrents, error) {
func getTorrentsOrderBy(parameters *WhereParams, orderBy string, limit int, offset int) []Torrents {
var torrents []Torrents
var dbQuery *gorm.DB
-
- if (parameters != nil) { // if there is where parameters
+
+ if parameters != nil { // if there is where parameters
dbQuery = db.Model(&torrents).Where(parameters.conditions, parameters.params...)
} else {
dbQuery = db.Model(&torrents)
}
-
- if (orderBy == "") { orderBy = "torrent_id DESC" } // Default OrderBy
+
+ if orderBy == "" {
+ orderBy = "torrent_id DESC"
+ } // Default OrderBy
if limit != 0 || offset != 0 { // if limits provided
dbQuery = dbQuery.Limit(limit).Offset(offset)
}
- dbQuery.Order(orderBy).Preload("Categories").Preload("Sub_Categories").Find(&torrents)
+ dbQuery.Order(orderBy).Preload("Categories").Preload("Sub_Categories").Find(&torrents)
return torrents
}
-/* Functions to simplify the get parameters of the main function
- *
+/* Functions to simplify the get parameters of the main function
+ *
* Get Torrents with where parameters and limits, order by default
*/
func getTorrents(parameters WhereParams, limit int, offset int) []Torrents {
@@ -163,7 +169,7 @@ func getTorrentsDB(parameters WhereParams) []Torrents {
/* Function to get all torrents
*/
-func getAllTorrentsOrderBy(orderBy string, limit int, offset int) [] Torrents {
+func getAllTorrentsOrderBy(orderBy string, limit int, offset int) []Torrents {
return getTorrentsOrderBy(nil, orderBy, limit, offset)
}
@@ -190,11 +196,13 @@ func getAllCategories(populatedWithTorrents bool) []Categories {
func (t *Torrents) toJson() TorrentsJson {
magnet := "magnet:?xt=urn:btih:" + strings.TrimSpace(t.Hash) + "&dn=" + t.Name + trackers
res := TorrentsJson{
- Id: strconv.Itoa(t.Id),
- Name: html.UnescapeString(t.Name),
- Status: t.Status_id,
- Hash: t.Hash,
- Magnet: safe(magnet)}
+ Id: strconv.Itoa(t.Id),
+ Name: html.UnescapeString(t.Name),
+ Status: t.Status_id,
+ Hash: t.Hash,
+ Date: t.Date,
+ Filesize: t.Filesize,
+ Magnet: safe(magnet)}
return res
}
diff --git a/package.sh b/package.sh
new file mode 100755
index 00000000..973f219d
--- /dev/null
+++ b/package.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Helper script to ease building binary packages for multiple targets.
+# Requires the linux64 and mingw64 gcc compilers and zip.
+# On Debian-based distros install mingw-w64.
+
+version=$(git describe --tags)
+declare -a OSes
+OSes[0]='linux;x86_64-linux-gnu-gcc'
+OSes[1]='windows;x86_64-w64-mingw32-gcc'
+
+for i in "${OSes[@]}"; do
+ arr=(${i//;/ })
+ os=${arr[0]}
+ cc=${arr[1]}
+ rm -f nyaa nyaa.exe
+ echo -e "\nBuilding $os..."
+ echo GOOS=$os GOARCH=amd64 CC=$cc CGO_ENABLED=1 go build -v
+ GOOS=$os GOARCH=amd64 CC=$cc CGO_ENABLED=1 go build -v
+ zip -9 -q nyaa-${version}_${os}_amd64.zip css js *.md *.html nyaa nyaa.exe
+done
diff --git a/view.html b/view.html
new file mode 100644
index 00000000..cc1f9664
--- /dev/null
+++ b/view.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+ |
---|