file metadata
This commit is contained in:
@@ -15,6 +15,85 @@ import (
|
||||
"github.com/hashicorp/golang-lru/v2/expirable"
|
||||
)
|
||||
|
||||
func HandleHeadRequest(w http.ResponseWriter, r *http.Request, t *torrent.TorrentManager, c config.ConfigInterface, cache *expirable.LRU[string, string]) {
|
||||
requestPath := path.Clean(r.URL.Path)
|
||||
requestPath = strings.Replace(requestPath, "/http", "/", 1)
|
||||
if requestPath == "/favicon.ico" {
|
||||
return
|
||||
}
|
||||
|
||||
segments := strings.Split(requestPath, "/")
|
||||
// If there are less than 3 segments, return an error or adjust as needed
|
||||
if len(segments) < 4 {
|
||||
log.Println("Method not implemented", r.Method, r.URL.Path)
|
||||
http.Error(w, "Method not implemented", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
if data, exists := cache.Get("head:" + requestPath); exists {
|
||||
splits := strings.Split(data, " ")
|
||||
contentType := splits[0]
|
||||
contentLength := splits[1]
|
||||
w.Header().Set("Content-Type", contentType)
|
||||
w.Header().Set("Content-Length", contentLength)
|
||||
w.WriteHeader(http.StatusOK)
|
||||
return
|
||||
}
|
||||
|
||||
baseDirectory := segments[len(segments)-3]
|
||||
torrentName := segments[len(segments)-2]
|
||||
filename := segments[len(segments)-1]
|
||||
|
||||
torrents := findAllTorrentsWithName(t, baseDirectory, torrentName)
|
||||
if torrents == nil {
|
||||
log.Println("Cannot find torrent", torrentName, segments)
|
||||
http.Error(w, "Cannot find file", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
filenameV2, linkFragment := davextra.ExtractLinkFragment(filename)
|
||||
_, file := getFile(torrents, filenameV2, linkFragment)
|
||||
if file == nil {
|
||||
log.Println("Cannot find file", filename, segments)
|
||||
http.Error(w, "Cannot find file", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
if file.Link == "" {
|
||||
log.Println("Link not found", filename)
|
||||
http.Error(w, "Cannot find file", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
contentType := getContentMimeType(filename)
|
||||
contentLength := fmt.Sprintf("%d", file.Bytes)
|
||||
w.Header().Set("Content-Type", contentType)
|
||||
w.Header().Set("Content-Length", contentLength)
|
||||
cache.Add("head:"+requestPath, contentType+" "+contentLength)
|
||||
w.WriteHeader(http.StatusOK)
|
||||
}
|
||||
|
||||
func getContentMimeType(filePath string) string {
|
||||
switch filepath.Ext(filePath) {
|
||||
case ".mkv":
|
||||
return "video/x-matroska"
|
||||
case ".mp4":
|
||||
return "video/mp4"
|
||||
case ".avi":
|
||||
return "video/x-msvideo"
|
||||
case ".mp3":
|
||||
return "audio/mpeg"
|
||||
case ".rar":
|
||||
return "application/x-rar-compressed"
|
||||
case ".zip":
|
||||
return "application/zip"
|
||||
case ".7z":
|
||||
return "application/x-7z-compressed"
|
||||
case ".srt":
|
||||
return "text/plain"
|
||||
default:
|
||||
return "application/octet-stream"
|
||||
}
|
||||
}
|
||||
|
||||
func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.TorrentManager, c config.ConfigInterface, cache *expirable.LRU[string, string]) {
|
||||
requestPath := path.Clean(r.URL.Path)
|
||||
requestPath = strings.Replace(requestPath, "/http", "/", 1)
|
||||
|
||||
@@ -18,6 +18,9 @@ func Router(mux *http.ServeMux, c config.ConfigInterface, t *torrent.TorrentMana
|
||||
case http.MethodGet:
|
||||
intHttp.HandleDirectoryListing(w, r, t, c, cache)
|
||||
|
||||
case http.MethodHead:
|
||||
intHttp.HandleHeadRequest(w, r, t, c, cache)
|
||||
|
||||
default:
|
||||
log.Println("Method not implemented", r.Method)
|
||||
http.Error(w, "Method not implemented", http.StatusMethodNotAllowed)
|
||||
@@ -36,7 +39,7 @@ func Router(mux *http.ServeMux, c config.ConfigInterface, t *torrent.TorrentMana
|
||||
w.WriteHeader(http.StatusOK)
|
||||
|
||||
default:
|
||||
log.Println("Method not implemented", r.Method)
|
||||
log.Println("Method not implemented", r.Method, r.URL.Path)
|
||||
http.Error(w, "Method not implemented", http.StatusMethodNotAllowed)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -32,14 +32,43 @@ func (t *TorrentManager) refreshTorrents() {
|
||||
}
|
||||
t.checksum = checksum
|
||||
t.cache.Purge()
|
||||
t.torrents = t.getAll()
|
||||
for _, torrent := range t.torrents {
|
||||
go func(id string) {
|
||||
t.workerPool <- true
|
||||
t.getInfo(id)
|
||||
<-t.workerPool
|
||||
time.Sleep(1 * time.Second) // sleep for 1 second to avoid rate limiting
|
||||
}(torrent.ID)
|
||||
|
||||
newTorrents := t.getAll()
|
||||
|
||||
// Identify removed torrents
|
||||
for i := 0; i < len(t.torrents); i++ {
|
||||
found := false
|
||||
for _, newTorrent := range newTorrents {
|
||||
if t.torrents[i].ID == newTorrent.ID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
// Remove this torrent from the slice
|
||||
t.torrents = append(t.torrents[:i], t.torrents[i+1:]...)
|
||||
i-- // Decrement index since we modified the slice
|
||||
}
|
||||
}
|
||||
|
||||
// Identify and handle added torrents
|
||||
for _, newTorrent := range newTorrents {
|
||||
found := false
|
||||
for _, torrent := range t.torrents {
|
||||
if newTorrent.ID == torrent.ID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.torrents = append(t.torrents, newTorrent)
|
||||
go func(id string) {
|
||||
t.workerPool <- true
|
||||
t.getInfo(id)
|
||||
<-t.workerPool
|
||||
time.Sleep(1 * time.Second) // sleep for 1 second to avoid rate limiting
|
||||
}(newTorrent.ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,6 +222,7 @@ func (t *TorrentManager) getInfo(torrentID string) *Torrent {
|
||||
// TODO: This means some files have expired
|
||||
// we need to 'fix' this torrent then, at least the missing selected files
|
||||
log.Println("Some links has expired for", info.Name)
|
||||
|
||||
type Result struct {
|
||||
Response *realdebrid.UnrestrictResponse
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
[zurg]
|
||||
type = webdav
|
||||
url = http://zurg:9999
|
||||
vendor = other
|
||||
type = http
|
||||
url = http://zurg:9999/http
|
||||
no_head = true
|
||||
no_slash = true
|
||||
|
||||
Reference in New Issue
Block a user