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(`
| Thumbnail | Title | Current Chapter | Last Accessed | Link | +Delete | |
|---|---|---|---|---|---|---|
|
+
+ |
{{.Title}} | {{.Number}} | {{.LastTime}} | -Go to last Chapter | ++ + + + | ++ + |