Added better logging

This commit is contained in:
Pablu23
2024-05-30 23:42:35 +02:00
parent 2aab7906e1
commit 766da5aeb2
7 changed files with 139 additions and 99 deletions

View File

@@ -5,41 +5,43 @@ import (
_ "embed"
"errors"
"fmt"
"github.com/pablu23/mangaGetter/internal/database"
"github.com/pablu23/mangaGetter/internal/view"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"gorm.io/gorm"
"html/template"
"net/http"
"slices"
"strconv"
"strings"
"time"
"github.com/pablu23/mangaGetter/internal/database"
"github.com/pablu23/mangaGetter/internal/view"
"github.com/rs/zerolog/log"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"gorm.io/gorm"
)
func (s *Server) HandleUpdate(w http.ResponseWriter, r *http.Request){
s.UpdateMangaList()
http.Redirect(w, r, "/", http.StatusFound)
func (s *Server) HandleUpdate(w http.ResponseWriter, r *http.Request) {
s.UpdateMangaList()
http.Redirect(w, r, "/", http.StatusFound)
}
func (s *Server) HandleLoginPost(w http.ResponseWriter, r *http.Request) {
secret := r.PostFormValue("secret")
http.SetCookie(w, &http.Cookie{
Name: "auth",
Value: secret,
Path: "/",
MaxAge: 3600,
Secure: false,
HttpOnly: false,
SameSite: http.SameSiteLaxMode,
Name: "auth",
Value: secret,
Path: "/",
MaxAge: 3600,
Secure: false,
HttpOnly: false,
SameSite: http.SameSiteLaxMode,
})
http.Redirect(w, r, "/", http.StatusFound)
http.Redirect(w, r, "/", http.StatusFound)
}
func (s *Server) HandleLogin(w http.ResponseWriter, r *http.Request) {
tmpl := template.Must(view.GetViewTemplate(view.Login))
tmpl.Execute(w, nil)
tmpl := template.Must(view.GetViewTemplate(view.Login))
tmpl.Execute(w, nil)
}
func (s *Server) HandleNew(w http.ResponseWriter, r *http.Request) {
@@ -67,8 +69,6 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
mangaViewModels := make([]view.MangaViewModel, l)
counter := 0
n := time.Now().UnixNano()
var tmp []database.Setting
s.DbMgr.Db.Find(&tmp)
settings := make(map[string]database.Setting)
@@ -76,15 +76,10 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
settings[m.Name] = m
}
var thumbNs int64 = 0
var titNs int64 = 0
//TODO: Change all this to be more performant
for _, manga := range all {
title := cases.Title(language.English, cases.Compact).String(strings.Replace(manga.Title, "-", " ", -1))
t1 := time.Now().UnixNano()
thumbnail, updated, err := s.LoadThumbnail(manga)
//TODO: Add default picture instead of not showing Manga at all
if err != nil {
@@ -93,29 +88,18 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
if updated {
s.DbMgr.Db.Save(manga)
}
t2 := time.Now().UnixNano()
thumbNs += t2 - t1
t1 = time.Now().UnixNano()
// This is very slow
// TODO: put this into own Method
if manga.LastChapterNum == "" {
err, updated := s.UpdateLatestAvailableChapter(manga)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not update latest available chapters")
}
if updated {
s.DbMgr.Db.Save(manga)
}
}
t2 = time.Now().UnixNano()
titNs += t2 - t1
latestChapter, ok := manga.GetLatestChapter()
if !ok {
continue
@@ -134,14 +118,6 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
counter++
}
fmt.Printf("Loading Thumbnails took %d ms\n", (thumbNs)/1000000)
fmt.Printf("Loading latest Chapters took %d ms\n", (titNs)/1000000)
nex := time.Now().UnixNano()
fmt.Printf("Creating Viewmodels took %d ms\n", (nex-n)/1000000)
n = time.Now().UnixNano()
order, ok := settings["order"]
if !ok || order.Value == "title" {
slices.SortStableFunc(mangaViewModels, func(a, b view.MangaViewModel) int {
@@ -165,9 +141,6 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
})
}
nex = time.Now().UnixNano()
fmt.Printf("Sorting took %d ms\n", (nex-n)/1000000)
menuViewModel := view.MenuViewModel{
Settings: settings,
Mangas: mangaViewModels,
@@ -175,7 +148,7 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
err := tmpl.Execute(w, menuViewModel)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not template Menu")
}
}
@@ -189,7 +162,7 @@ func (s *Server) HandleDelete(w http.ResponseWriter, r *http.Request) {
mangaId, err := strconv.Atoi(mangaStr)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Str("Id", mangaStr).Msg("Could not convert id to int")
http.Redirect(w, r, "/", http.StatusFound)
return
}
@@ -222,20 +195,22 @@ func (s *Server) HandleExit(w http.ResponseWriter, r *http.Request) {
}
}
s.Mutex.Unlock()
fmt.Println("Cleaned last Manga")
log.Info().Msg("Cleaned up images")
}()
}
func (s *Server) HandleCurrent(w http.ResponseWriter, _ *http.Request) {
func (s *Server) HandleCurrent(w http.ResponseWriter, r *http.Request) {
tmpl := template.Must(view.GetViewTemplate(view.Viewer))
mangaId, chapterId, err := s.Provider.GetTitleIdAndChapterId(s.CurrSubUrl)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Str("subUrl", s.CurrSubUrl).Msg("Could not get TitleId and ChapterId")
http.Redirect(w, r, "/", http.StatusFound)
return
}
title, chapterName, err := s.Provider.GetTitleAndChapter(s.CurrSubUrl)
if err != nil {
fmt.Println(err)
log.Warn().Err(err).Str("subUrl", s.CurrSubUrl).Msg("Could not get Title and Chapter")
}
var manga database.Manga
@@ -260,7 +235,7 @@ func (s *Server) HandleCurrent(w http.ResponseWriter, _ *http.Request) {
err = tmpl.Execute(w, s.CurrViewModel)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not template Current")
}
}
@@ -270,15 +245,15 @@ func (s *Server) HandleImage(w http.ResponseWriter, r *http.Request) {
defer s.Mutex.Unlock()
buf := s.ImageBuffers[u]
if buf == nil {
fmt.Printf("url: %s is nil\n", u)
w.WriteHeader(400)
log.Warn().Str("url", u).Msg("Image not found")
w.WriteHeader(http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "image/webp")
_, err := w.Write(buf)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not write image")
}
}
@@ -289,13 +264,11 @@ func (s *Server) HandleFavicon(w http.ResponseWriter, _ *http.Request) {
w.Header().Set("Content-Type", "image/webp")
_, err := w.Write(ico)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not write favicon")
}
}
func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) {
fmt.Println("Received Next")
if s.PrevViewModel != nil {
go func(viewModel view.ImageViewModel, s *Server) {
s.Mutex.Lock()
@@ -303,7 +276,7 @@ func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) {
delete(s.ImageBuffers, img.Path)
}
s.Mutex.Unlock()
fmt.Println("Cleaned out of scope Last")
log.Debug().Msg("Cleaned imagebuffer")
}(*s.PrevViewModel, s)
}
@@ -321,8 +294,8 @@ func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/current/", http.StatusFound)
}
func (s *Server) HandlePrev(w http.ResponseWriter, r *http.Request) {
fmt.Println("Received Prev")
if s.NextViewModel != nil {
go func(viewModel view.ImageViewModel, s *Server) {
s.Mutex.Lock()
@@ -330,7 +303,7 @@ func (s *Server) HandlePrev(w http.ResponseWriter, r *http.Request) {
delete(s.ImageBuffers, img.Path)
}
s.Mutex.Unlock()
fmt.Println("Cleaned out of scope Last")
log.Debug().Msg("Cleaned imagebuffer")
}(*s.NextViewModel, s)
}
@@ -376,6 +349,8 @@ func (s *Server) HandleSetting(w http.ResponseWriter, r *http.Request) {
if res.Error != nil && errors.Is(res.Error, gorm.ErrRecordNotFound) {
set := database.NewSetting(settingName, settingValue)
s.DbMgr.Db.Save(&set)
} else if res.Error != nil {
log.Error().Err(res.Error).Send()
} else {
s.DbMgr.Db.Model(&setting).Update("value", settingValue)
}

View File

@@ -4,9 +4,6 @@ import (
"bytes"
_ "embed"
"fmt"
"github.com/pablu23/mangaGetter/internal/database"
"github.com/pablu23/mangaGetter/internal/provider"
"github.com/pablu23/mangaGetter/internal/view"
"io"
"net/http"
"path/filepath"
@@ -14,6 +11,11 @@ import (
"strings"
"sync"
"time"
"github.com/pablu23/mangaGetter/internal/database"
"github.com/pablu23/mangaGetter/internal/provider"
"github.com/pablu23/mangaGetter/internal/view"
"github.com/rs/zerolog/log"
)
type Server struct {
@@ -67,12 +69,11 @@ func (s *Server) RegisterRoutes() {
s.mux.HandleFunc("/favicon.ico", s.HandleFavicon)
s.mux.HandleFunc("POST /setting/", s.HandleSetting)
s.mux.HandleFunc("GET /setting/set/{setting}/{value}", s.HandleSettingSet)
s.mux.HandleFunc("GET /update", s.HandleUpdate)
s.mux.HandleFunc("GET /update", s.HandleUpdate)
}
func (s *Server) StartTLS(port int, certFile, keyFile string) error {
fmt.Println("Server starting...")
log.Info().Int("Port", port).Str("Certificate", certFile).Str("Key", keyFile).Msg("Starting server")
server := http.Server{
Addr: fmt.Sprintf(":%d", port),
Handler: s.Auth(s.mux),
@@ -81,7 +82,7 @@ func (s *Server) StartTLS(port int, certFile, keyFile string) error {
}
func (s *Server) Start(port int) error {
fmt.Println("Server starting...")
log.Info().Int("Port", port).Msg("Starting server")
server := http.Server{
Addr: fmt.Sprintf(":%d", port),
@@ -96,7 +97,7 @@ func (s *Server) UpdateMangaList() {
for _, m := range all {
err, updated := s.UpdateLatestAvailableChapter(m)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Str("Manga", m.Title).Msg("Could not update latest available chapters")
}
if updated {
s.DbMgr.Db.Save(m)
@@ -118,7 +119,7 @@ func (s *Server) RegisterUpdater(interval time.Duration) {
func (s *Server) LoadNext() {
c, err := s.Provider.GetHtml(s.CurrSubUrl)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not get Html for current chapter")
s.NextSubUrl = ""
s.NextViewModel = nil
return
@@ -126,7 +127,7 @@ func (s *Server) LoadNext() {
next, err := s.Provider.GetNext(c)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not load next chapter")
s.NextSubUrl = ""
s.NextViewModel = nil
return
@@ -134,7 +135,7 @@ func (s *Server) LoadNext() {
html, err := s.Provider.GetHtml(next)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not get Html for next chapter")
s.NextSubUrl = ""
s.NextViewModel = nil
return
@@ -142,7 +143,7 @@ func (s *Server) LoadNext() {
imagesNext, err := s.AppendImagesToBuf(html)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not download images")
s.NextSubUrl = ""
s.NextViewModel = nil
return
@@ -150,6 +151,7 @@ func (s *Server) LoadNext() {
title, chapter, err := s.Provider.GetTitleAndChapter(next)
if err != nil {
log.Warn().Err(err).Str("Url", next).Msg("Could not extract title and chapter")
title = "Unknown"
chapter = "ch_?"
}
@@ -158,27 +160,27 @@ func (s *Server) LoadNext() {
s.NextViewModel = &view.ImageViewModel{Images: imagesNext, Title: full}
s.NextSubUrl = next
fmt.Println("Loaded next")
log.Debug().Msg("Successfully loaded next chapter")
}
func (s *Server) LoadPrev() {
c, err := s.Provider.GetHtml(s.CurrSubUrl)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not get Html for current chapter")
s.PrevSubUrl = ""
s.PrevViewModel = nil
return
}
prev, err := s.Provider.GetPrev(c)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not load prev chapter")
s.PrevSubUrl = ""
s.PrevViewModel = nil
return
}
html, err := s.Provider.GetHtml(prev)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not get Html for prev chapter")
s.PrevSubUrl = ""
s.PrevViewModel = nil
return
@@ -186,7 +188,7 @@ func (s *Server) LoadPrev() {
imagesNext, err := s.AppendImagesToBuf(html)
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not download images")
s.PrevSubUrl = ""
s.PrevViewModel = nil
return
@@ -194,6 +196,7 @@ func (s *Server) LoadPrev() {
title, chapter, err := s.Provider.GetTitleAndChapter(prev)
if err != nil {
log.Warn().Err(err).Str("Url", prev).Msg("Could not extract title and chapter")
title = "Unknown"
chapter = "ch_?"
}
@@ -203,19 +206,28 @@ func (s *Server) LoadPrev() {
s.PrevViewModel = &view.ImageViewModel{Images: imagesNext, Title: full}
s.PrevSubUrl = prev
fmt.Println("Loaded prev")
log.Debug().Msg("Successfully loaded prev chapter")
}
func (s *Server) LoadCurr() {
html, err := s.Provider.GetHtml(s.CurrSubUrl)
if err != nil {
panic(err)
log.Error().Err(err).Msg("Could not get Html for current chapter")
s.NextSubUrl = ""
s.PrevSubUrl = ""
s.CurrSubUrl = ""
s.NextViewModel = nil
s.CurrViewModel = nil
s.PrevViewModel = nil
return
}
imagesCurr, err := s.AppendImagesToBuf(html)
title, chapter, err := s.Provider.GetTitleAndChapter(s.CurrSubUrl)
if err != nil {
log.Warn().Err(err).Str("Url", s.CurrSubUrl).Msg("Could not extract title and chapter")
title = "Unknown"
chapter = "ch_?"
}
@@ -223,11 +235,11 @@ func (s *Server) LoadCurr() {
full := strings.Replace(title, "-", " ", -1) + " - " + strings.Replace(chapter, "_", " ", -1)
s.CurrViewModel = &view.ImageViewModel{Images: imagesCurr, Title: full}
fmt.Println("Loaded current")
log.Debug().Msg("Successfully loaded curr chapter")
}
func (s *Server) UpdateLatestAvailableChapter(manga *database.Manga) (error, bool) {
fmt.Printf("Updating Manga: %s\n", manga.Title)
log.Info().Str("Manga", manga.Title).Msg("Updating Manga")
l, err := s.Provider.GetChapterList("/title/" + strconv.Itoa(manga.Id))
if err != nil {
@@ -315,7 +327,7 @@ func addFileToRam(url string) ([]byte, error) {
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.Println(err)
log.Error().Err(err).Msg("Could not close http body")
}
}(resp.Body)