* alt attribute for ads images * fix <tr> too much * fix missing <tr> that created HTML error * fix wrong translation string name * ditto * fix accepted tags not having background on classic * Put tag table inside upload table * Update classic.css * Remove prefix of dlsite tag on view * Update main.css * 10px bigger website * fix wrong css selector * fix markdown scroll visually broken in classic.css * Add magnet link on torrent file not found page * don't show magnet <a> if empty * Fetch magnet link in download.go and pass it on to torrent_file_missing * add magnet in template_test
76 lignes
2,3 Kio
Go
76 lignes
2,3 Kio
Go
package torrentController
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/NyaaPantsu/nyaa/config"
|
|
"github.com/NyaaPantsu/nyaa/templates"
|
|
"github.com/NyaaPantsu/nyaa/models/torrents"
|
|
"github.com/NyaaPantsu/nyaa/utils/format"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// DownloadTorrent : Controller for downloading a torrent
|
|
func DownloadTorrent(c *gin.Context) {
|
|
hash := c.Param("hash")
|
|
|
|
torrent, err := torrents.FindRawByHash(hash)
|
|
|
|
if err != nil {
|
|
//File not found, send 404
|
|
variables := templates.Commonvariables(c)
|
|
templates.Render(c, "errors/torrent_file_missing.jet.html", variables)
|
|
return
|
|
}
|
|
|
|
if hash == "" && len(config.Get().Torrents.FileStorage) == 0 {
|
|
//File not found, send 404
|
|
variables := templates.Commonvariables(c)
|
|
var trackers []string
|
|
if torrent.Trackers == "" {
|
|
trackers = config.Get().Torrents.Trackers.Default
|
|
} else {
|
|
trackers = torrent.GetTrackersArray()
|
|
}
|
|
magnet := format.InfoHashToMagnet(strings.TrimSpace(torrent.Hash), torrent.Name, trackers...)
|
|
variables.Set("magnet", magnet)
|
|
templates.Render(c, "errors/torrent_file_missing.jet.html", variables)
|
|
return
|
|
}
|
|
|
|
//Check if file exists and open
|
|
Openfile, err := os.Open(fmt.Sprintf("%s%c%s.torrent", config.Get().Torrents.FileStorage, os.PathSeparator, hash))
|
|
if err != nil {
|
|
//File not found, send 404
|
|
variables := templates.Commonvariables(c)
|
|
var trackers []string
|
|
if torrent.Trackers == "" {
|
|
trackers = config.Get().Torrents.Trackers.Default
|
|
} else {
|
|
trackers = torrent.GetTrackersArray()
|
|
}
|
|
magnet := format.InfoHashToMagnet(strings.TrimSpace(torrent.Hash), torrent.Name, trackers...)
|
|
variables.Set("magnet", magnet)
|
|
templates.Render(c, "errors/torrent_file_missing.jet.html", variables)
|
|
return
|
|
}
|
|
defer Openfile.Close() //Close after function return
|
|
|
|
//Get the file size
|
|
FileStat, _ := Openfile.Stat() //Get info from file
|
|
FileSize := strconv.FormatInt(FileStat.Size(), 10) //Get file size as a string
|
|
|
|
|
|
|
|
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s.torrent\"", torrent.Name))
|
|
c.Header("Content-Type", "application/x-bittorrent")
|
|
c.Header("Content-Length", FileSize)
|
|
//Send the file
|
|
// We reset the offset to 0
|
|
Openfile.Seek(0, 0)
|
|
io.Copy(c.Writer, Openfile) //'Copy' the file to the client
|
|
}
|