Added better logging
This commit is contained in:
2
Makefile
2
Makefile
@@ -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
8
go.mod
@@ -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
21
go.sum
@@ -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=
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
33
main.go
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user