diff --git a/cmd/mangaGetter/main.go b/cmd/mangaGetter/main.go index a76d707..5726515 100644 --- a/cmd/mangaGetter/main.go +++ b/cmd/mangaGetter/main.go @@ -46,6 +46,7 @@ func main() { http.HandleFunc("POST /next", s.HandleNext) http.HandleFunc("POST /prev", s.HandlePrev) http.HandleFunc("POST /exit", s.HandleExit) + http.HandleFunc("POST /delete", s.HandleDelete) fmt.Println("Server starting...") err = http.ListenAndServe(":8000", nil) @@ -55,7 +56,7 @@ func main() { } } -func Close(db *database.DatabaseManager) { +func Close(db *database.Manager) { fmt.Println("Attempting to save and close DB") err := db.Save() if err != nil { diff --git a/internal/database/createDb.sql b/internal/database/createDb.sql index add62f2..02cf297 100644 --- a/internal/database/createDb.sql +++ b/internal/database/createDb.sql @@ -1,7 +1,8 @@ create table if not exists Manga ( ID integer not null primary key, Title text, - TimeStampUnixEpoch int + TimeStampUnixEpoch int, + Thumbnail blob ); create table if not exists Chapter ( diff --git a/internal/database/database.go b/internal/database/database.go index 52ae74e..7e0e7ac 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -1,8 +1,10 @@ package database import ( + "bytes" "database/sql" _ "embed" + "fmt" "sync" _ "github.com/mattn/go-sqlite3" @@ -12,6 +14,7 @@ type Manga struct { Id int Title string TimeStampUnix int64 + Thumbnail *bytes.Buffer // Not in DB LatestChapter *Chapter @@ -26,7 +29,7 @@ type Chapter struct { TimeStampUnix int64 } -type DatabaseManager struct { +type Manager struct { ConnectionString string db *sql.DB @@ -37,8 +40,8 @@ type DatabaseManager struct { CreateIfNotExists bool } -func NewDatabase(connectionString string, createIfNotExists bool) DatabaseManager { - return DatabaseManager{ +func NewDatabase(connectionString string, createIfNotExists bool) Manager { + return Manager{ ConnectionString: connectionString, Rw: &sync.Mutex{}, Mangas: make(map[int]*Manga), @@ -47,7 +50,7 @@ func NewDatabase(connectionString string, createIfNotExists bool) DatabaseManage } } -func (dbMgr *DatabaseManager) Open() error { +func (dbMgr *Manager) Open() error { db, err := sql.Open("sqlite3", dbMgr.ConnectionString) if err != nil { return err @@ -63,7 +66,7 @@ func (dbMgr *DatabaseManager) Open() error { return err } -func (dbMgr *DatabaseManager) Close() error { +func (dbMgr *Manager) Close() error { err := dbMgr.db.Close() if err != nil { return err @@ -75,11 +78,43 @@ func (dbMgr *DatabaseManager) Close() error { return nil } -func (dbMgr *DatabaseManager) Save() error { +func (dbMgr *Manager) Delete(mangaId int) error { + db := dbMgr.db + fmt.Println("Locking Rw in database.go:84") + dbMgr.Rw.Lock() + defer func() { + fmt.Println("Unlocking Rw in database.go:87") + dbMgr.Rw.Unlock() + }() + + _, err := db.Exec("DELETE from Chapter where MangaID = ?", mangaId) + if err != nil { + return err + } + + _, err = db.Exec("DELETE from Manga where ID = ?", mangaId) + if err != nil { + return err + } + + for i, chapter := range dbMgr.Chapters { + if chapter.Manga.Id == mangaId { + delete(dbMgr.Chapters, i) + } + } + delete(dbMgr.Mangas, mangaId) + return nil +} + +func (dbMgr *Manager) Save() error { db := dbMgr.db + fmt.Println("Locking Rw in database.go:113") dbMgr.Rw.Lock() - defer dbMgr.Rw.Unlock() + defer func() { + fmt.Println("Unlocking Rw in database.go:116") + dbMgr.Rw.Unlock() + }() for _, m := range dbMgr.Mangas { count := 0 err := db.QueryRow("SELECT COUNT(*) FROM Manga where ID = ?", m.Id).Scan(&count) @@ -88,9 +123,16 @@ func (dbMgr *DatabaseManager) Save() error { } if count == 0 { - _, err := db.Exec("INSERT INTO Manga(ID, Title, TimeStampUnixEpoch) values(?, ?, ?)", m.Id, m.Title, m.TimeStampUnix) - if err != nil { - return err + if m.Thumbnail != nil { + _, err := db.Exec("INSERT INTO Manga(ID, Title, TimeStampUnixEpoch, Thumbnail) values(?, ?, ?, ?)", m.Id, m.Title, m.TimeStampUnix, m.Thumbnail.Bytes()) + if err != nil { + return err + } + } else { + _, err := db.Exec("INSERT INTO Manga(ID, Title, TimeStampUnixEpoch ) values(?, ?, ?)", m.Id, m.Title, m.TimeStampUnix) + if err != nil { + return err + } } } else { _, err := db.Exec("UPDATE Manga set Title = ?, TimeStampUnixEpoch = ? WHERE ID = ?", m.Title, m.TimeStampUnix, m.Id) @@ -126,16 +168,20 @@ func (dbMgr *DatabaseManager) Save() error { //go:embed createDb.sql var createSql string -func (dbMgr *DatabaseManager) createDatabaseIfNotExists() error { +func (dbMgr *Manager) createDatabaseIfNotExists() error { _, err := dbMgr.db.Exec(createSql) return err } -func (dbMgr *DatabaseManager) load() error { +func (dbMgr *Manager) load() error { db := dbMgr.db + fmt.Println("Locking Rw in database.go:180") dbMgr.Rw.Lock() - defer dbMgr.Rw.Unlock() + defer func() { + fmt.Println("Unlocking Rw in database.go:183") + dbMgr.Rw.Unlock() + }() rows, err := db.Query("SELECT * FROM Manga") if err != nil { @@ -144,7 +190,7 @@ func (dbMgr *DatabaseManager) load() error { for rows.Next() { manga := Manga{} - if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix); err != nil { + if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix, &manga.Thumbnail); err != nil { return err } dbMgr.Mangas[manga.Id] = &manga diff --git a/internal/provider/bato.go b/internal/provider/bato.go index 6480de1..4574e98 100644 --- a/internal/provider/bato.go +++ b/internal/provider/bato.go @@ -108,3 +108,40 @@ func (b *Bato) GetTitleIdAndChapterId(url string) (titleId int, chapterId int, e return t, c, err } + +//func (b *Bato) GetChapterList(url string) (chapterIds []int, err error) { +// +//} + +func (b *Bato) GetThumbnail(subUrl string) (thumbnailUrl string, err error) { + url := fmt.Sprintf("https://bato.to/title/%s", subUrl) + resp, err := http.Get(url) + + // TODO: Testing for above 300 is dirty + if err != nil && resp.StatusCode > 300 { + return "", errors.New("could not get html") + } + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + fmt.Printf("Could not close body because: %v\n", err) + } + }(resp.Body) + + all, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + h := string(all) + + reg, err := regexp.Compile(`
-{{/* */}} - +
+ + {{range .Mangas}} + - + + {{end}}
Thumbnail Title Current Chapter Last Accessed LinkDelete
+ + img_{{.ThumbnailUrl}} + + {{.Title}} {{.Number}} {{.LastTime}}Go to last Chapter + + + + +
+ + +
+
diff --git a/internal/view/viewmodels.go b/internal/view/viewmodels.go index 0817593..06b224d 100644 --- a/internal/view/viewmodels.go +++ b/internal/view/viewmodels.go @@ -11,10 +11,12 @@ type ImageViewModel struct { } type MangaViewModel struct { - Title string - Number int - LastTime string - Url string + ID int + Title string + Number int + LastTime string + Url string + ThumbnailUrl string } type MenuViewModel struct {