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

@@ -1,5 +1,5 @@
run: develop run: develop
bin/develop --server --port 8080 --secret test --database db.sqlite bin/develop --server --port 8080 --secret test --database db.sqlite --debug --pretty
develop: develop:
go build -tags Develop -o bin/develop go build -tags Develop -o bin/develop
release: release:

8
go.mod
View File

@@ -7,6 +7,14 @@ require (
golang.org/x/text v0.14.0 golang.org/x/text v0.14.0
) )
require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/rs/zerolog v1.33.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/sys v0.20.0 // indirect
)
require ( require (
github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect github.com/jinzhu/now v1.1.5 // indirect

21
go.sum
View File

@@ -1,9 +1,30 @@
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E=

View File

@@ -7,6 +7,8 @@ import (
"net/http" "net/http"
"regexp" "regexp"
"strconv" "strconv"
"github.com/rs/zerolog/log"
) )
type Bato struct{} type Bato struct{}
@@ -49,7 +51,7 @@ func (b *Bato) GetHtml(titleSubUrl string) (string, error) {
defer func(Body io.ReadCloser) { defer func(Body io.ReadCloser) {
err := Body.Close() err := Body.Close()
if err != nil { if err != nil {
fmt.Printf("Could not close body because: %v\n", err) log.Error().Err(err).Msg("Could not close http body")
} }
}(resp.Body) }(resp.Body)
@@ -64,14 +66,23 @@ func (b *Bato) GetHtml(titleSubUrl string) (string, error) {
func (b *Bato) GetNext(html string) (subUrl string, err error) { func (b *Bato) GetNext(html string) (subUrl string, err error) {
reg, err := regexp.Compile(`<a data-hk="0-6-0" .*? href="(.*?)["']`) reg, err := regexp.Compile(`<a data-hk="0-6-0" .*? href="(.*?)["']`)
match := reg.FindStringSubmatch(html) if err != nil {
return "", err
}
match := reg.FindStringSubmatch(html)
if len(match) <= 1 {
return "", err
}
return match[1], err return match[1], err
} }
func (b *Bato) GetPrev(html string) (subUrl string, err error) { func (b *Bato) GetPrev(html string) (subUrl string, err error) {
reg, err := regexp.Compile(`<a data-hk="0-5-0" .*? href="(.*?)["']`) reg, err := regexp.Compile(`<a data-hk="0-5-0" .*? href="(.*?)["']`)
match := reg.FindStringSubmatch(html) match := reg.FindStringSubmatch(html)
if len(match) <= 1 {
return "", err
}
return match[1], err return match[1], err
} }

View File

@@ -5,20 +5,22 @@ import (
_ "embed" _ "embed"
"errors" "errors"
"fmt" "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" "html/template"
"net/http" "net/http"
"slices" "slices"
"strconv" "strconv"
"strings" "strings"
"time" "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){ func (s *Server) HandleUpdate(w http.ResponseWriter, r *http.Request) {
s.UpdateMangaList() s.UpdateMangaList()
http.Redirect(w, r, "/", http.StatusFound) http.Redirect(w, r, "/", http.StatusFound)
} }
@@ -67,8 +69,6 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
mangaViewModels := make([]view.MangaViewModel, l) mangaViewModels := make([]view.MangaViewModel, l)
counter := 0 counter := 0
n := time.Now().UnixNano()
var tmp []database.Setting var tmp []database.Setting
s.DbMgr.Db.Find(&tmp) s.DbMgr.Db.Find(&tmp)
settings := make(map[string]database.Setting) settings := make(map[string]database.Setting)
@@ -76,15 +76,10 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
settings[m.Name] = m settings[m.Name] = m
} }
var thumbNs int64 = 0
var titNs int64 = 0
//TODO: Change all this to be more performant //TODO: Change all this to be more performant
for _, manga := range all { for _, manga := range all {
title := cases.Title(language.English, cases.Compact).String(strings.Replace(manga.Title, "-", " ", -1)) title := cases.Title(language.English, cases.Compact).String(strings.Replace(manga.Title, "-", " ", -1))
t1 := time.Now().UnixNano()
thumbnail, updated, err := s.LoadThumbnail(manga) thumbnail, updated, err := s.LoadThumbnail(manga)
//TODO: Add default picture instead of not showing Manga at all //TODO: Add default picture instead of not showing Manga at all
if err != nil { if err != nil {
@@ -93,29 +88,18 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
if updated { if updated {
s.DbMgr.Db.Save(manga) s.DbMgr.Db.Save(manga)
} }
t2 := time.Now().UnixNano()
thumbNs += t2 - t1
t1 = time.Now().UnixNano()
// This is very slow // This is very slow
// TODO: put this into own Method // TODO: put this into own Method
if manga.LastChapterNum == "" { if manga.LastChapterNum == "" {
err, updated := s.UpdateLatestAvailableChapter(manga) err, updated := s.UpdateLatestAvailableChapter(manga)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Could not update latest available chapters")
} }
if updated { if updated {
s.DbMgr.Db.Save(manga) s.DbMgr.Db.Save(manga)
} }
} }
t2 = time.Now().UnixNano()
titNs += t2 - t1
latestChapter, ok := manga.GetLatestChapter() latestChapter, ok := manga.GetLatestChapter()
if !ok { if !ok {
continue continue
@@ -134,14 +118,6 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
counter++ 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"] order, ok := settings["order"]
if !ok || order.Value == "title" { if !ok || order.Value == "title" {
slices.SortStableFunc(mangaViewModels, func(a, b view.MangaViewModel) int { 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{ menuViewModel := view.MenuViewModel{
Settings: settings, Settings: settings,
Mangas: mangaViewModels, Mangas: mangaViewModels,
@@ -175,7 +148,7 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) {
err := tmpl.Execute(w, menuViewModel) err := tmpl.Execute(w, menuViewModel)
if err != nil { 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) mangaId, err := strconv.Atoi(mangaStr)
if err != nil { 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) http.Redirect(w, r, "/", http.StatusFound)
return return
} }
@@ -222,20 +195,22 @@ func (s *Server) HandleExit(w http.ResponseWriter, r *http.Request) {
} }
} }
s.Mutex.Unlock() 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)) tmpl := template.Must(view.GetViewTemplate(view.Viewer))
mangaId, chapterId, err := s.Provider.GetTitleIdAndChapterId(s.CurrSubUrl) mangaId, chapterId, err := s.Provider.GetTitleIdAndChapterId(s.CurrSubUrl)
if err != nil { 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) title, chapterName, err := s.Provider.GetTitleAndChapter(s.CurrSubUrl)
if err != nil { 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 var manga database.Manga
@@ -260,7 +235,7 @@ func (s *Server) HandleCurrent(w http.ResponseWriter, _ *http.Request) {
err = tmpl.Execute(w, s.CurrViewModel) err = tmpl.Execute(w, s.CurrViewModel)
if err != nil { 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() defer s.Mutex.Unlock()
buf := s.ImageBuffers[u] buf := s.ImageBuffers[u]
if buf == nil { if buf == nil {
fmt.Printf("url: %s is nil\n", u) log.Warn().Str("url", u).Msg("Image not found")
w.WriteHeader(400) w.WriteHeader(http.StatusNotFound)
return return
} }
w.Header().Set("Content-Type", "image/webp") w.Header().Set("Content-Type", "image/webp")
_, err := w.Write(buf) _, err := w.Write(buf)
if err != nil { 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") w.Header().Set("Content-Type", "image/webp")
_, err := w.Write(ico) _, err := w.Write(ico)
if err != nil { 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) { func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) {
fmt.Println("Received Next")
if s.PrevViewModel != nil { if s.PrevViewModel != nil {
go func(viewModel view.ImageViewModel, s *Server) { go func(viewModel view.ImageViewModel, s *Server) {
s.Mutex.Lock() s.Mutex.Lock()
@@ -303,7 +276,7 @@ func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) {
delete(s.ImageBuffers, img.Path) delete(s.ImageBuffers, img.Path)
} }
s.Mutex.Unlock() s.Mutex.Unlock()
fmt.Println("Cleaned out of scope Last") log.Debug().Msg("Cleaned imagebuffer")
}(*s.PrevViewModel, s) }(*s.PrevViewModel, s)
} }
@@ -321,8 +294,8 @@ func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/current/", http.StatusFound) http.Redirect(w, r, "/current/", http.StatusFound)
} }
func (s *Server) HandlePrev(w http.ResponseWriter, r *http.Request) { func (s *Server) HandlePrev(w http.ResponseWriter, r *http.Request) {
fmt.Println("Received Prev")
if s.NextViewModel != nil { if s.NextViewModel != nil {
go func(viewModel view.ImageViewModel, s *Server) { go func(viewModel view.ImageViewModel, s *Server) {
s.Mutex.Lock() s.Mutex.Lock()
@@ -330,7 +303,7 @@ func (s *Server) HandlePrev(w http.ResponseWriter, r *http.Request) {
delete(s.ImageBuffers, img.Path) delete(s.ImageBuffers, img.Path)
} }
s.Mutex.Unlock() s.Mutex.Unlock()
fmt.Println("Cleaned out of scope Last") log.Debug().Msg("Cleaned imagebuffer")
}(*s.NextViewModel, s) }(*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) { if res.Error != nil && errors.Is(res.Error, gorm.ErrRecordNotFound) {
set := database.NewSetting(settingName, settingValue) set := database.NewSetting(settingName, settingValue)
s.DbMgr.Db.Save(&set) s.DbMgr.Db.Save(&set)
} else if res.Error != nil {
log.Error().Err(res.Error).Send()
} else { } else {
s.DbMgr.Db.Model(&setting).Update("value", settingValue) s.DbMgr.Db.Model(&setting).Update("value", settingValue)
} }

View File

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

33
main.go
View File

@@ -14,6 +14,8 @@ import (
"github.com/pablu23/mangaGetter/internal/database" "github.com/pablu23/mangaGetter/internal/database"
"github.com/pablu23/mangaGetter/internal/provider" "github.com/pablu23/mangaGetter/internal/provider"
"github.com/pablu23/mangaGetter/internal/server" "github.com/pablu23/mangaGetter/internal/server"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
) )
var ( var (
@@ -26,6 +28,8 @@ var (
certFlag = flag.String("cert", "", "Path to cert file, has to be used in conjunction with key") certFlag = flag.String("cert", "", "Path to cert file, has to be used in conjunction with key")
keyFlag = flag.String("key", "", "Path to key file, has to be used in conjunction with cert") keyFlag = flag.String("key", "", "Path to key file, has to be used in conjunction with cert")
updateIntervalFlag = flag.String("update", "1h", "Interval to update Mangas") updateIntervalFlag = flag.String("update", "1h", "Interval to update Mangas")
debugFlag = flag.Bool("debug", false, "Activate debug Logs")
prettyLogsFlag = flag.Bool("pretty", false, "Pretty pring Logs")
) )
func main() { func main() {
@@ -33,19 +37,28 @@ func main() {
var filePath string var filePath string
flag.Parse() flag.Parse()
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if *prettyLogsFlag {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}
if !*debugFlag {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
if *secretFlag != "" { if *secretFlag != "" {
secret = *secretFlag secret = *secretFlag
} else if *secretFilePathFlag != "" { } else if *secretFilePathFlag != "" {
buf, err := os.ReadFile(*secretFilePathFlag) buf, err := os.ReadFile(*secretFilePathFlag)
if err != nil { if err != nil {
panic(err) log.Fatal().Err(err).Str("Path", *secretFilePathFlag).Msg("Could not read secret File")
} }
secret = string(buf) secret = string(buf)
} else if *authFlag { } else if *authFlag {
cacheSecret, err := getSecret() cacheSecret, err := getSecret()
secret = cacheSecret secret = cacheSecret
if err != nil { if err != nil {
fmt.Printf("Secret file could not be found or read because of %s, not activating Auth\n", err) log.Error().Err(err).Msg("Secret file could not be found or read, not activating Auth")
} }
} }
@@ -58,8 +71,7 @@ func main() {
db := database.NewDatabase(filePath, true) db := database.NewDatabase(filePath, true)
err := db.Open() err := db.Open()
if err != nil { if err != nil {
fmt.Println(err) log.Fatal().Err(err).Str("Path", filePath).Msg("Could not open Database")
return
} }
secret = strings.TrimSpace(secret) secret = strings.TrimSpace(secret)
@@ -80,14 +92,14 @@ func main() {
time.Sleep(300 * time.Millisecond) time.Sleep(300 * time.Millisecond)
err := open(fmt.Sprintf("http://localhost:%d", *portFlag)) err := open(fmt.Sprintf("http://localhost:%d", *portFlag))
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Could not open Browser")
} }
}() }()
} }
interval, err := time.ParseDuration(*updateIntervalFlag) interval, err := time.ParseDuration(*updateIntervalFlag)
if err != nil { if err != nil {
panic(err) log.Fatal().Err(err).Str("Interval", *updateIntervalFlag).Msg("Could not parse interval")
} }
s.RegisterUpdater(interval) s.RegisterUpdater(interval)
s.RegisterRoutes() s.RegisterRoutes()
@@ -95,12 +107,12 @@ func main() {
if *certFlag != "" && *keyFlag != "" { if *certFlag != "" && *keyFlag != "" {
err = s.StartTLS(*portFlag, *certFlag, *keyFlag) err = s.StartTLS(*portFlag, *certFlag, *keyFlag)
if err != nil { if err != nil {
panic(err) log.Fatal().Err(err).Str("Cert", *certFlag).Str("Key", *keyFlag).Int("Port", *portFlag).Msg("Could not start TLS server")
} }
} else { } else {
err = s.Start(*portFlag) err = s.Start(*portFlag)
if err != nil { if err != nil {
panic(err) log.Fatal().Err(err).Int("Port", *portFlag).Msg("Could not start server")
} }
} }
} }
@@ -123,10 +135,11 @@ func open(url string) error {
} }
func Close(db *database.Manager) { func Close(db *database.Manager) {
fmt.Println("Attempting to save and close DB") log.Debug().Msg("Closing Database")
err := db.Close() err := db.Close()
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Could not close Database")
return
} }
os.Exit(0) os.Exit(0)
} }