diff --git a/cmd/mangaGetter/main.go b/cmd/mangaGetter/main.go index 5726515..846d24b 100644 --- a/cmd/mangaGetter/main.go +++ b/cmd/mangaGetter/main.go @@ -1,34 +1,59 @@ package main import ( - "bytes" "fmt" - "net/http" - "os" - "os/signal" - "sync" - "mangaGetter/internal/database" "mangaGetter/internal/provider" "mangaGetter/internal/server" + "net/http" + "os" + "os/exec" + "os/signal" + "path/filepath" + "runtime" + "time" ) func main() { - db := database.NewDatabase("db.sqlite", true) - err := db.Open() + dir, err := os.UserCacheDir() if err != nil { + fmt.Println(nil) return } - s := server.Server{ - ImageBuffers: make(map[string]*bytes.Buffer), - NextReady: make(chan bool), - PrevReady: make(chan bool), - Provider: &provider.Bato{}, - DbMgr: &db, - Mutex: &sync.Mutex{}, + dirPath := filepath.Join(dir, "MangaGetter") + filePath := filepath.Join(dirPath, "db.sqlite") + + if _, err := os.Stat(dirPath); os.IsNotExist(err) { + err = os.Mkdir(dirPath, os.ModePerm) + if err != nil { + fmt.Println(err) + return + } } + if _, err := os.Stat(filePath); os.IsNotExist(err) { + f, err := os.Create(filePath) + if err != nil { + fmt.Println(err) + return + } + err = f.Close() + if err != nil { + fmt.Println(err) + return + } + } + + db := database.NewDatabase(filePath, true) + err = db.Open() + if err != nil { + fmt.Println(err) + return + } + + s := server.New(&provider.Bato{}, &db) + c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) @@ -48,6 +73,14 @@ func main() { http.HandleFunc("POST /exit", s.HandleExit) http.HandleFunc("POST /delete", s.HandleDelete) + go func() { + time.Sleep(300 * time.Millisecond) + err := open("http://localhost:8000") + if err != nil { + fmt.Println(err) + } + }() + fmt.Println("Server starting...") err = http.ListenAndServe(":8000", nil) if err != nil { @@ -56,6 +89,23 @@ func main() { } } +func open(url string) error { + var cmd string + var args []string + + switch runtime.GOOS { + case "windows": + cmd = "cmd" + args = []string{"/c", "start"} + case "darwin": + cmd = "open" + default: // "linux", "freebsd", "openbsd", "netbsd" + cmd = "xdg-open" + } + args = append(args, url) + return exec.Command(cmd, args...).Start() +} + func Close(db *database.Manager) { fmt.Println("Attempting to save and close DB") err := db.Save() diff --git a/internal/database/database.go b/internal/database/database.go index 7e0e7ac..f145369 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -190,9 +190,11 @@ func (dbMgr *Manager) load() error { for rows.Next() { manga := Manga{} - if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix, &manga.Thumbnail); err != nil { + var thumbnail []byte + if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix, &thumbnail); err != nil { return err } + manga.Thumbnail = bytes.NewBuffer(thumbnail) dbMgr.Mangas[manga.Id] = &manga } diff --git a/internal/server/favicon.ico b/internal/server/favicon.ico new file mode 100644 index 0000000..4fcd32c Binary files /dev/null and b/internal/server/favicon.ico differ diff --git a/internal/server/handler.go b/internal/server/handler.go index ff08f56..b68106a 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -212,13 +212,20 @@ func (s *Server) HandleNext(w http.ResponseWriter, r *http.Request) { }(*s.PrevViewModel, s) } + if s.NextViewModel == nil || s.NextSubUrl == "" { + http.Redirect(w, r, "/", http.StatusTemporaryRedirect) + err := s.DbMgr.Save() + if err != nil { + fmt.Println(err) + } + return + } + s.PrevViewModel = s.CurrViewModel s.CurrViewModel = s.NextViewModel s.PrevSubUrl = s.CurrSubUrl s.CurrSubUrl = s.NextSubUrl - <-s.NextReady - go s.LoadNext() http.Redirect(w, r, "/current/", http.StatusTemporaryRedirect) @@ -236,13 +243,20 @@ func (s *Server) HandlePrev(w http.ResponseWriter, r *http.Request) { }(*s.NextViewModel, s) } + if s.PrevViewModel == nil || s.PrevSubUrl == "" { + http.Redirect(w, r, "/", http.StatusTemporaryRedirect) + err := s.DbMgr.Save() + if err != nil { + fmt.Println(err) + } + return + } + s.NextViewModel = s.CurrViewModel s.CurrViewModel = s.PrevViewModel s.NextSubUrl = s.CurrSubUrl s.CurrSubUrl = s.PrevSubUrl - <-s.PrevReady - go s.LoadPrev() http.Redirect(w, r, "/current/", http.StatusTemporaryRedirect) diff --git a/internal/server/server.go b/internal/server/server.go index de89156..02fe085 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -2,6 +2,7 @@ package server import ( "bytes" + _ "embed" "fmt" "io" "mangaGetter/internal/database" @@ -32,35 +33,51 @@ type Server struct { IsLast bool DbMgr *database.Manager +} - // I'm not even sure if this helps. - // If you press next and then prev too fast you still lock yourself out - NextReady chan bool - PrevReady chan bool +func New(provider provider.Provider, db *database.Manager) *Server { + s := Server{ + ImageBuffers: make(map[string]*bytes.Buffer), + Provider: provider, + DbMgr: db, + Mutex: &sync.Mutex{}, + } + + s.AddIco() + + return &s } func (s *Server) LoadNext() { c, err := s.Provider.GetHtml(s.CurrSubUrl) if err != nil { fmt.Println(err) + s.NextSubUrl = "" + s.NextViewModel = nil return } next, err := s.Provider.GetNext(c) if err != nil { fmt.Println(err) + s.NextSubUrl = "" + s.NextViewModel = nil return } html, err := s.Provider.GetHtml(next) if err != nil { fmt.Println(err) + s.NextSubUrl = "" + s.NextViewModel = nil return } imagesNext, err := s.AppendImagesToBuf(html) if err != nil { fmt.Println(err) + s.NextSubUrl = "" + s.NextViewModel = nil return } @@ -73,32 +90,38 @@ func (s *Server) LoadNext() { full := strings.Replace(title, "-", " ", -1) + " - " + strings.Replace(chapter, "_", " ", -1) s.NextViewModel = &view.ImageViewModel{Images: imagesNext, Title: full} - s.NextSubUrl = next fmt.Println("Loaded next") - s.NextReady <- true } func (s *Server) LoadPrev() { c, err := s.Provider.GetHtml(s.CurrSubUrl) if err != nil { fmt.Println(err) + s.PrevSubUrl = "" + s.PrevViewModel = nil return } prev, err := s.Provider.GetPrev(c) if err != nil { fmt.Println(err) + s.PrevSubUrl = "" + s.PrevViewModel = nil return } html, err := s.Provider.GetHtml(prev) if err != nil { fmt.Println(err) + s.PrevSubUrl = "" + s.PrevViewModel = nil return } imagesNext, err := s.AppendImagesToBuf(html) if err != nil { fmt.Println(err) + s.PrevSubUrl = "" + s.PrevViewModel = nil return } @@ -114,7 +137,6 @@ func (s *Server) LoadPrev() { s.PrevSubUrl = prev fmt.Println("Loaded prev") - s.PrevReady <- true } func (s *Server) LoadCurr() { @@ -187,6 +209,16 @@ func (s *Server) AppendImagesToBuf(html string) ([]view.Image, error) { return images, nil } +//go:embed favicon.ico +var ico []byte + +func (s *Server) AddIco() { + buf := bytes.NewBuffer(ico) + s.Mutex.Lock() + s.ImageBuffers["favicon.ico"] = buf + s.Mutex.Unlock() +} + func addFileToRam(url string) (*bytes.Buffer, error) { // Get the data resp, err := http.Get(url) diff --git a/internal/view/Views/menu.gohtml b/internal/view/Views/menu.gohtml index f877e95..9613dbe 100644 --- a/internal/view/Views/menu.gohtml +++ b/internal/view/Views/menu.gohtml @@ -3,7 +3,22 @@