From 0eedeb9389494de97a3b0ab61caee0b3b114ad21 Mon Sep 17 00:00:00 2001 From: PrivateGER Date: Mon, 18 Oct 2021 13:38:56 +0200 Subject: [PATCH] Make metadata loading hot --- DirectoryIndexers/DirectoryIndexer.go | 31 +-------------------------- DirectoryIndexers/MetadataParser.go | 22 +++++++++++++++++++ PageHandlers/View.go | 18 +++++++++++++--- main.go | 2 +- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/DirectoryIndexers/DirectoryIndexer.go b/DirectoryIndexers/DirectoryIndexer.go index 7d3a298..caea679 100644 --- a/DirectoryIndexers/DirectoryIndexer.go +++ b/DirectoryIndexers/DirectoryIndexer.go @@ -66,42 +66,13 @@ func Index(path string, results chan FileList) { id := filenameToID(video.Name()) - videoObject := VideoFile{ - Filename: video.Name(), - Extension: extension, - Title: filenameToTitle(video.Name(), extension), - Id: id, - } - - metadataFilename := strings.TrimSuffix(video.Name(), filepath.Ext(video.Name())) + ".info.json" - jsonMetadataFile, err := os.Open(path + metadataFilename) - if err != nil { - FL.Lock() - FL.Files[id] = videoObject - FL.Unlock() - wg.Done() - return - } - - metadataBytes, _ := ioutil.ReadAll(jsonMetadataFile) - _ = jsonMetadataFile.Close() - - metadata, err := ParseMetadata(metadataBytes) - if err != nil { - FL.Lock() - FL.Files[id] = videoObject - FL.Unlock() - wg.Done() - return - } - FL.Lock() FL.Files[id] = VideoFile{ Filename: video.Name(), Extension: extension, Title: filenameToTitle(video.Name(), extension), Id: id, - Metadata: metadata, + Metadata: Metadata{}, } FL.Unlock() diff --git a/DirectoryIndexers/MetadataParser.go b/DirectoryIndexers/MetadataParser.go index 6f13398..e5f2de0 100644 --- a/DirectoryIndexers/MetadataParser.go +++ b/DirectoryIndexers/MetadataParser.go @@ -3,6 +3,10 @@ package DirectoryIndexers import ( "encoding/json" "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" ) type Metadata struct { @@ -50,3 +54,21 @@ func ParseMetadata(jsonBytes []byte) (Metadata, error) { } return meta, err } + +func LoadMetadata(videoobject VideoFile, path string) (Metadata, error) { + metadataFilename := strings.TrimSuffix(videoobject.Filename, filepath.Ext(videoobject.Filename)) + ".info.json" + jsonMetadataFile, err := os.Open(path + metadataFilename) + if err != nil { + return Metadata{}, err + } + + metadataBytes, _ := ioutil.ReadAll(jsonMetadataFile) + _ = jsonMetadataFile.Close() + + metadata, err := ParseMetadata(metadataBytes) + if err != nil { + return Metadata{}, err + } + + return metadata, nil +} diff --git a/PageHandlers/View.go b/PageHandlers/View.go index 5b6c623..2d38a99 100644 --- a/PageHandlers/View.go +++ b/PageHandlers/View.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "net/http" + "reflect" "ytdlp-viewer/DirectoryIndexers" ) @@ -16,9 +17,9 @@ type ViewPageData struct { Metadata DirectoryIndexers.Metadata } -func View(writer http.ResponseWriter, request *http.Request, FL *DirectoryIndexers.FileList) { - FL.RLock() - defer FL.RUnlock() +func View(writer http.ResponseWriter, request *http.Request, FL *DirectoryIndexers.FileList, path string) { + FL.Lock() + defer FL.Unlock() keys, ok := request.URL.Query()["id"] if !ok || len(keys[0]) < 1 { @@ -30,6 +31,17 @@ func View(writer http.ResponseWriter, request *http.Request, FL *DirectoryIndexe return } + // if no metadata loaded, do so + if reflect.ValueOf(FL.Files[keys[0]].Metadata).IsZero() { + metadata, err := DirectoryIndexers.LoadMetadata(FL.Files[keys[0]], path) + if err == nil { + var fileObject DirectoryIndexers.VideoFile + fileObject = FL.Files[keys[0]] + fileObject.Metadata = metadata + FL.Files[keys[0]] = fileObject + } + } + video := FL.Files[keys[0]] data := ViewPageData{ Title: video.Title, diff --git a/main.go b/main.go index 3a79ffc..9059ed5 100644 --- a/main.go +++ b/main.go @@ -50,7 +50,7 @@ func main() { }) http.HandleFunc("/view", func(writer http.ResponseWriter, request *http.Request) { fmt.Println(time.Now().String(),request.URL) - PageHandlers.View(writer, request, &FL) + PageHandlers.View(writer, request, &FL, path) }) http.Handle("/videos/", http.StripPrefix("/videos/", http.FileServer(http.Dir(path))))