Episode Logging + Cleaned Code

seperate table for episodes. fetches the season and episode information from tmdb. this is beta till
huh adds support for dynamic forms. seperated functions to few files.
more refactoring later.
This commit is contained in:
icxven 2024-05-13 18:05:46 +05:30
parent 2ff3329a98
commit c14d4eff1a
Signed by: x
GPG key ID: 07D47D6C17A8E630
5 changed files with 497 additions and 311 deletions

71
database.go Normal file
View file

@ -0,0 +1,71 @@
package main
import (
"database/sql"
"runtime"
"os"
"fmt"
"log"
)
func OpenDatabase() (*sql.DB){
var db *sql.DB
var err error
switch runtime.GOOS {
case "linux", "darwin":
dbFolder := os.Getenv("HOME") + "/.config/boxd"
_, err = os.Stat(dbFolder)
if os.IsNotExist(err) {
err := os.Mkdir(dbFolder, 0755)
if err != nil {
fmt.Println("failed to create the configuration directory")
}
} else if err != nil {
fmt.Println("error checking configuration directory")
}
dbLocation := dbFolder + "/boxd.db?_foreign_keys=true"
db, err = sql.Open("sqlite3", "file:" + dbLocation)
if err != nil {
log.Fatal(err)
}
case "windows":
userProfile := os.Getenv("USERPROFILE")
dbFolder := userProfile + "\\Documents\\"
_, err = os.Stat(dbFolder)
if os.IsNotExist(err) {
err := os.Mkdir(dbFolder, 0755)
if err != nil {
fmt.Println("failed to create the configuration directory")
}
} else if err != nil {
fmt.Println("error checking configuration directory")
}
dbLocation := dbFolder + "boxd.db"
db, err = sql.Open("sqlite3", dbLocation)
if err != nil {
log.Fatal(err)
}
}
return db
}
func DBEntryExist(db *sql.DB, name string, isMovie bool, isSeries bool) (bool, error) {
var count int
var row *sql.Row
if isMovie == true && isSeries == false {
row = db.QueryRow("SELECT COUNT(*) FROM movies WHERE imdb = ?", name)
} else if isMovie == false && isSeries == true {
row = db.QueryRow("SELECT COUNT(*) FROM series WHERE tmdb = ?", name)
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
err := row.Scan(&count)
if err != nil {
return false, err
}
return count > 0, nil
}

150
episode.go Normal file
View file

@ -0,0 +1,150 @@
package main
import (
"fmt"
"database/sql"
"time"
"log"
"strings"
"strconv"
"github.com/charmbracelet/huh"
"github.com/imroc/req/v3"
"github.com/tidwall/gjson"
)
func makeRange(min, max int) []int {
a := make([]int, max-min+1)
for i := range a {
a[i] = min + i
}
return a
}
func LogEpisode(db *sql.DB) {
// try fetch unfinisedh series
series, err := db.Query("SELECT title, releasedDate, tmdb FROM series WHERE finished = 0")
if err != nil {
log.Fatal(err)
}
SeriesInfo := make(map[string]string)
var SeriesList []string
for series.Next() {
var title string
var releasedDate string
var tmdb string
if err := series.Scan(&title, &releasedDate, &tmdb); err != nil {
log.Fatal(err)
}
var releasedYear string
releasedTimeInfo := strings.Split(releasedDate, "-")
if releasedTimeInfo[0] == "" {
releasedYear = "unknown"
} else {
releasedYear = releasedTimeInfo[0]
}
comb := title + " (" + releasedYear + ")"
SeriesInfo[comb] = tmdb
}
for key := range SeriesInfo {
SeriesList = append(SeriesList, key)
}
var watchedSeries string
huh.NewSelect[string]().Title("so which one ?").Options(huh.NewOptions(SeriesList[:]...)...).Value(&watchedSeries).Run()
TMDBID := SeriesInfo[watchedSeries]
client := req.C()
client.SetCommonHeader("accept", "application/json")
client.SetCommonHeader("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIzZDllYmUxOTNhMGU4OWFjMjM0MzZjNGJhNDg1NTY5ZCIsInN1YiI6IjY1ZWQ3ZTFjYmRjMzRjMDE0NzMyMDgxYiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.cJ5Aws6Um2VEcyqjhii5IjEihYyGmw5ICbh8ldHVqIs")
url := "https://api.themoviedb.org/3/tv/" + TMDBID
resp, err := client.R().Get(url)
if err != nil {
log.Fatal(err)
}
MovieInfo := make(map[string]int)
SeasonInfo := make(map[string]int)
seasons := gjson.Get(resp.String(), "seasons")
seasons.ForEach(func(key, value gjson.Result) bool {
name := gjson.Get(value.String(), "name")
episode_count := gjson.Get(value.String(), "episode_count")
season_number := gjson.Get(value.String(), "season_number")
MovieInfo[name.String()] = int(episode_count.Int())
SeasonInfo[name.String()] = int(season_number.Int())
return true
})
// create table for the episodes
dbTableSquema := `CREATE TABLE IF NOT EXISTS episodes (
id INTEGER NOT NULL,
season INTEGER NOT NULL,
episode TEXT NOT NULL,
date TEXT NOT NULL,
FOREIGN KEY (id)
REFERENCES series (id)
);`
_, err = db.Exec(dbTableSquema)
if err != nil {
log.Fatal(err)
}
var seasonslist []string
for key := range SeasonInfo {
seasonslist = append(seasonslist, key)
}
var watchingseason string
huh.NewSelect[string]().Title("so which one ?").Options(huh.NewOptions(seasonslist[:]...)...).Value(&watchingseason).Run()
episodecount := MovieInfo[watchingseason]
loggingseason := SeasonInfo[watchingseason]
episoderange := makeRange(1, int(episodecount))
var episdoerangestring[]string
for _, val := range episoderange {
episdoerangestring = append(episdoerangestring, strconv.Itoa(val))
}
IDROW := db.QueryRow("SELECT id FROM series WHERE tmdb = ?", TMDBID)
var ID int
IDROW.Scan(&ID)
series.Close()
WatchedROW, err := db.Query("SELECT episode from episodes WHERE id = ? AND season = ?", ID, loggingseason)
if err != nil {
fmt.Println(err)
}
var watchedepisiodes []string
for WatchedROW.Next() {
var episode string
if err := WatchedROW.Scan(&episode); err != nil {
log.Fatal(err)
}
watchedepisiodes = append(watchedepisiodes, episode)
}
var selectedep[] string
huh.NewMultiSelect[string]().
Options(huh.NewOptions(episdoerangestring[:]...)...).
Title("what episodes did you watch today ?").Value(&selectedep).Run()
currentdata := time.Now()
watchedDate := currentdata.Format("2006-01-02")
for _, ep := range selectedep {
IfExistsRow := db.QueryRow("SELECT COUNT(*) FROM episodes WHERE id = ? AND season = ? AND episode = ?", ID, loggingseason, ep)
var count int
err := IfExistsRow.Scan(&count)
if err != nil {
fmt.Println("something went wrong while checking for duplicate episodes")
}
if count > 0 {
fmt.Printf("episode %s is already logged. skipping >,>", ep)
} else {
insertSQL := `INSERT INTO episodes (id, season, episode, date) VALUES (?, ?, ?, ?);`
_, err = db.Exec(insertSQL, ID, loggingseason, ep, watchedDate)
if err != nil {
fmt.Println(err)
}
}
}
}

255
main.go
View file

@ -1,265 +1,27 @@
package main
import (
"database/sql"
"fmt"
"log"
"os"
"strconv"
"strings"
"time"
"runtime"
"github.com/charmbracelet/huh"
"github.com/charmbracelet/huh/spinner"
"github.com/imroc/req/v3"
_ "github.com/mattn/go-sqlite3"
import (
"github.com/spf13/cobra"
"github.com/tidwall/gjson"
)
func entryExists(db *sql.DB, name string, isMovie bool, isSeries bool) (bool, error) {
var count int
var row *sql.Row
if isMovie == true && isSeries == false {
row = db.QueryRow("SELECT COUNT(*) FROM movies WHERE imdb = ?", name)
} else if isMovie == false && isSeries == true {
row = db.QueryRow("SELECT COUNT(*) FROM series WHERE tmdb = ?", name)
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
err := row.Scan(&count)
if err != nil {
return false, err
}
return count > 0, nil
}
func logMedia(isMovie bool, isSeries bool) {
// get the watched media
var inputstring string
huh.NewForm(huh.NewGroup(huh.NewInput().Title("what did you watch today ?").Value(&inputstring)).WithShowHelp(true)).Run()
replacedinput := strings.Replace(inputstring, " ", "+", -1)
// search it on tmdb
var url string
if isMovie == true && isSeries == false {
url = "https://api.themoviedb.org/3/search/movie?query=" + replacedinput + "&page=1"
} else if isMovie == false && isSeries == true {
url = "https://api.themoviedb.org/3/search/tv?query=" + replacedinput + "&page=1"
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
client := req.C()
client.SetCommonHeader("accept", "application/json")
client.SetCommonHeader("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIzZDllYmUxOTNhMGU4OWFjMjM0MzZjNGJhNDg1NTY5ZCIsInN1YiI6IjY1ZWQ3ZTFjYmRjMzRjMDE0NzMyMDgxYiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.cJ5Aws6Um2VEcyqjhii5IjEihYyGmw5ICbh8ldHVqIs")
resp, err := client.R().Get(url)
if err != nil {
log.Fatal(err)
}
// parsing found json data
MovieInfo := make(map[string]int64)
var MovieList []string
result := gjson.Get(resp.String(), "results")
result.ForEach(func(key, value gjson.Result) bool {
var title gjson.Result
var id gjson.Result
var releaseDate gjson.Result
if isMovie == true && isSeries == false {
title = gjson.Get(value.String(), "title")
id = gjson.Get(value.String(), "id")
releaseDate = gjson.Get(value.String(), "release_date")
} else if isMovie == false && isSeries == true {
title = gjson.Get(value.String(), "name")
id = gjson.Get(value.String(), "id")
releaseDate = gjson.Get(value.String(), "first_air_date")
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
datesplit := strings.Split(releaseDate.String(), "-")
var releaseYear string
if datesplit[0] == "" {
releaseYear = "unknown"
} else {
releaseYear = datesplit[0]
}
comb := title.String() + " (" + releaseYear + ")"
MovieInfo[comb] = id.Int()
return true
})
for key := range MovieInfo {
MovieList = append(MovieList, key)
}
var watchedMovie string
huh.NewSelect[string]().Title("so which one ?").Options(huh.NewOptions(MovieList[:]...)...).Value(&watchedMovie).Run()
// fetch info about the watched media
movid := MovieInfo[watchedMovie]
if isMovie == true && isSeries == false {
url = "https://api.themoviedb.org/3/movie/" + strconv.FormatInt(movid, 10)
} else if isMovie == false && isSeries == true {
url = "https://api.themoviedb.org/3/tv/" + strconv.FormatInt(movid, 10)
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
resp, err = client.R().Get(url)
if err != nil {
log.Fatal(err)
}
var ogTitle gjson.Result
var plot gjson.Result
var imdbid gjson.Result
var releasedday gjson.Result
if isMovie == true && isSeries == false {
ogTitle = gjson.Get(resp.String(), "title")
plot = gjson.Get(resp.String(), "overview")
imdbid = gjson.Get(resp.String(), "imdb_id")
releasedday = gjson.Get(resp.String(), "release_date")
} else if isMovie == false && isSeries == true {
ogTitle = gjson.Get(resp.String(), "name")
plot = gjson.Get(resp.String(), "overview")
imdbid = gjson.Get(resp.String(), "id")
releasedday = gjson.Get(resp.String(), "first_air_date")
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
var ratingvalue string
var movopinion string
var recomend bool
ratetitle := "how would you rate " + ogTitle.String() + "?"
huh.NewForm(huh.NewGroup(
huh.NewInput().Title(ratetitle).Value(&ratingvalue),
huh.NewText().Title("what did you think of this movie ?").Value(&movopinion),
huh.NewConfirm().Title("do you recomend this to others ?").Affirmative("absolutely").Negative("nah").Value(&recomend),
)).Run()
currentdata := time.Now()
watchedDate := currentdata.Format("2006-01-02")
// log info to the database
var db *sql.DB
switch runtime.GOOS {
case "linux", "darwin":
dbLocation := os.Getenv("HOME") + "/Documents/Databases/boxd.db"
d, err := sql.Open("sqlite3", dbLocation)
db = d
if err != nil {
log.Fatal(err)
}
case "windows":
userProfile := os.Getenv("USERPROFILE")
dbLocation := userProfile + "\\Documents\\boxd.db"
d, err := sql.Open("sqlite3", dbLocation)
db = d
if err != nil {
log.Fatal(err)
}
}
defer db.Close()
var dbTableSquema string
if isMovie == true && isSeries == false {
dbTableSquema = `CREATE TABLE IF NOT EXISTS movies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
plot TEXT,
releasedDate DATETIME,
imdb TEXT UNIQUE,
watchedOn DATETIME,
rating INTEGER,
opinion TEXT,
recommended INTEGER
);`
} else if isMovie == false && isSeries == true {
dbTableSquema = `CREATE TABLE IF NOT EXISTS series (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
plot TEXT,
releasedDate DATETIME,
tmdb TEXT UNIQUE,
watchedOn DATETIME,
rating INTEGER,
opinion TEXT,
recommended INTEGER
);`
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
_, err = db.Exec(dbTableSquema)
if err != nil {
log.Fatal(err)
}
action := func() {
time.Sleep(1 * time.Second)
}
_ = spinner.New().Title("processing").Action(action).Run()
entryExists, err := entryExists(db, imdbid.String(), isMovie, isSeries)
if err != nil {
log.Fatal(err)
}
if entryExists {
fmt.Println("you already logged this media.")
} else if ogTitle.String() == "" || plot.String() == "" || releasedday.String() == "" || imdbid.String() == "" || watchedDate == "" || ratingvalue == "" || movopinion == "" {
fmt.Println("you need the enter all the details.")
} else {
var insertSQL string
if isMovie == true && isSeries == false {
insertSQL = `INSERT INTO movies (title, plot, releasedDate, imdb, watchedOn, rating, opinion, recommended) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`
} else if isMovie == false && isSeries == true {
insertSQL = `INSERT INTO series (title, plot, releasedDate, tmdb, watchedOn, rating, opinion, recommended) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
_, err = db.Exec(insertSQL, ogTitle.String(), plot.String(), releasedday.String(), imdbid.String(), watchedDate, ratingvalue, movopinion, recomend)
if err != nil {
log.Fatal(err)
}
textOnSuccess := ogTitle.String() + " was logged to your diary."
fmt.Println(textOnSuccess)
}
}
func main() {
var isMovie bool
var isSeries bool
var isSeries bool
var isEpisode bool
cmdLog := &cobra.Command{
Use: "a",
Use: "add",
Short: "log media",
Long: `kind of like a movie diary with required
information about the watched movies`,
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
logMedia(isMovie, isSeries)
Run: func(cmd *cobra.Command, args []string) {
LOGMedia(isMovie, isSeries, isEpisode)
},
}
cmdList := &cobra.Command{
Use: "l",
Use: "list",
Short: "list media",
Long: `kind of like a movie diary with required
information about the watched movies`,
@ -270,7 +32,8 @@ func main() {
cmdLog.Flags().BoolVarP(&isMovie, "movie", "m", false, "log a movie")
cmdLog.Flags().BoolVarP(&isSeries, "series", "t", false, "log a tv show")
cmdLog.MarkFlagsOneRequired("movie", "series")
cmdLog.Flags().BoolVarP(&isEpisode, "episode", "e", false, "log an epiosde")
cmdLog.MarkFlagsOneRequired("movie", "series", "episode")
cmdLog.MarkFlagsMutuallyExclusive("movie", "series")
cmdList.Flags().BoolVarP(&isMovie, "movie", "m", false, "list logged movies")

251
media.go Normal file
View file

@ -0,0 +1,251 @@
package main
import (
"fmt"
"log"
"os"
"strconv"
"strings"
"time"
"github.com/charmbracelet/huh"
"github.com/charmbracelet/huh/spinner"
"github.com/imroc/req/v3"
_ "github.com/mattn/go-sqlite3"
"github.com/tidwall/gjson"
)
func LOGMedia(isMovie bool, isSeries bool, isEpisode bool) {
db := OpenDatabase()
defer db.Close()
if isEpisode == true {
LogEpisode(db)
} else {
// get the watched media
var inputstring string
huh.NewForm(huh.NewGroup(huh.NewInput().Title("what did you watch today ?").Value(&inputstring)).WithShowHelp(true)).Run()
replacedinput := strings.Replace(inputstring, " ", "+", -1)
// search it on tmdb
var url string
if isMovie == true && isSeries == false {
url = "https://api.themoviedb.org/3/search/movie?query=" + replacedinput + "&page=1"
} else if isMovie == false && isSeries == true {
url = "https://api.themoviedb.org/3/search/tv?query=" + replacedinput + "&page=1"
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
client := req.C()
client.SetCommonHeader("accept", "application/json")
client.SetCommonHeader("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIzZDllYmUxOTNhMGU4OWFjMjM0MzZjNGJhNDg1NTY5ZCIsInN1YiI6IjY1ZWQ3ZTFjYmRjMzRjMDE0NzMyMDgxYiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.cJ5Aws6Um2VEcyqjhii5IjEihYyGmw5ICbh8ldHVqIs")
resp, err := client.R().Get(url)
if err != nil {
log.Fatal(err)
}
// parsing found json data
MovieInfo := make(map[string]int64)
var MovieList []string
result := gjson.Get(resp.String(), "results")
result.ForEach(func(key, value gjson.Result) bool {
var title gjson.Result
var id gjson.Result
var releaseDate gjson.Result
if isMovie == true && isSeries == false {
title = gjson.Get(value.String(), "title")
id = gjson.Get(value.String(), "id")
releaseDate = gjson.Get(value.String(), "release_date")
} else if isMovie == false && isSeries == true {
title = gjson.Get(value.String(), "name")
id = gjson.Get(value.String(), "id")
releaseDate = gjson.Get(value.String(), "first_air_date")
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
datesplit := strings.Split(releaseDate.String(), "-")
var releaseYear string
if datesplit[0] == "" {
releaseYear = "unknown"
} else {
releaseYear = datesplit[0]
}
comb := title.String() + " (" + releaseYear + ")"
MovieInfo[comb] = id.Int()
return true
})
for key := range MovieInfo {
MovieList = append(MovieList, key)
}
var watchedMovie string
huh.NewSelect[string]().Title("so which one ?").Options(huh.NewOptions(MovieList[:]...)...).Value(&watchedMovie).Run()
// fetch info about the watched media
movid := MovieInfo[watchedMovie]
if isMovie == true && isSeries == false {
url = "https://api.themoviedb.org/3/movie/" + strconv.FormatInt(movid, 10)
} else if isMovie == false && isSeries == true {
url = "https://api.themoviedb.org/3/tv/" + strconv.FormatInt(movid, 10)
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
resp, err = client.R().Get(url)
if err != nil {
log.Fatal(err)
}
var ogTitle gjson.Result
var plot gjson.Result
var imdbid gjson.Result
var releasedday gjson.Result
if isMovie == true && isSeries == false {
ogTitle = gjson.Get(resp.String(), "title")
plot = gjson.Get(resp.String(), "overview")
imdbid = gjson.Get(resp.String(), "imdb_id")
releasedday = gjson.Get(resp.String(), "release_date")
} else if isMovie == false && isSeries == true {
ogTitle = gjson.Get(resp.String(), "name")
plot = gjson.Get(resp.String(), "overview")
imdbid = gjson.Get(resp.String(), "id")
releasedday = gjson.Get(resp.String(), "first_air_date")
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
var ratingvalue string
var movopinion string
var recomend bool
var isTVFinished bool
if isMovie == true && isSeries == false {
ratetitle := "how would you rate " + ogTitle.String() + "?"
huh.NewForm(huh.NewGroup(
huh.NewInput().Title(ratetitle).Value(&ratingvalue),
huh.NewText().Title("what did you think of this movie ?").Value(&movopinion),
huh.NewConfirm().Title("do you recomend this to others ?").Affirmative("absolutely").Negative("nah").Value(&recomend),
)).Run()
} else if isMovie == false && isSeries == true {
isTVFinishedTitle := "did you finish watching " + ogTitle.String() + "?"
huh.NewConfirm().Title(isTVFinishedTitle).Affirmative("yes").Negative("nope").Value(&isTVFinished).Run()
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
if isMovie == false && isSeries == true && isTVFinished == true {
ratetitle := "how would you rate " + ogTitle.String() + "?"
huh.NewForm(huh.NewGroup(
huh.NewInput().Title(ratetitle).Value(&ratingvalue),
huh.NewText().Title("what did you think of this show ?").Value(&movopinion),
huh.NewConfirm().Title("do you recomend this to others ?").Affirmative("absolutely").Negative("nah").Value(&recomend),
)).Run()
} else if isMovie == false && isSeries == true && isTVFinished == false {
fmt.Println("show added to watching section try logging your episodes now.")
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
currentdata := time.Now()
watchedDate := currentdata.Format("2006-01-02")
var dbTableSquema string
if isMovie == true && isSeries == false {
dbTableSquema = `CREATE TABLE IF NOT EXISTS movies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
plot TEXT,
releasedDate DATETIME,
imdb TEXT UNIQUE,
watchedOn DATETIME,
rating INTEGER,
opinion TEXT,
recommended INTEGER
);`
} else if isMovie == false && isSeries == true {
dbTableSquema = `CREATE TABLE IF NOT EXISTS series (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
plot TEXT,
releasedDate DATETIME,
tmdb TEXT UNIQUE,
finished INTEGER,
watchedOn DATETIME,
rating INTEGER,
opinion TEXT,
recommended INTEGER
);`
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
_, err = db.Exec(dbTableSquema)
if err != nil {
log.Fatal(err)
}
action := func() {
time.Sleep(1 * time.Second)
}
_ = spinner.New().Title("processing").Action(action).Run()
entryExists, err := DBEntryExist(db, imdbid.String(), isMovie, isSeries)
if err != nil {
log.Fatal(err)
}
if entryExists {
fmt.Println("you already logged this media.")
} else {
if isMovie == true && isSeries == false {
if ogTitle.String() == "" || plot.String() == "" || releasedday.String() == "" || imdbid.String() == "" || watchedDate == "" || ratingvalue == "" || movopinion == "" {
fmt.Println("you need to enter all the details")
} else {
insertSQL := `INSERT INTO movies (title, plot, releasedDate, imdb, watchedOn, rating, opinion, recommended) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`
_, err = db.Exec(insertSQL, ogTitle.String(), plot.String(), releasedday.String(), imdbid.String(), watchedDate, ratingvalue, movopinion, recomend)
if err != nil {
log.Fatal(err)
}
}
} else if isMovie == false && isSeries == true && isTVFinished == true {
if ogTitle.String() == "" || plot.String() == "" || releasedday.String() == "" || imdbid.String() == "" || watchedDate == "" || ratingvalue == "" || movopinion == "" {
fmt.Println("you need to enter all the details")
} else {
insertSQL := `INSERT INTO series (title, plot, releasedDate, tmdb, finished, watchedOn, rating, opinion, recommended) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);`
_, err = db.Exec(insertSQL, ogTitle.String(), plot.String(), releasedday.String(), imdbid.String(), isTVFinished, watchedDate, ratingvalue, movopinion, recomend)
if err != nil {
log.Fatal(err)
}
}
} else if isMovie == false && isSeries == true && isTVFinished == false {
if ogTitle.String() == "" || plot.String() == "" || releasedday.String() == "" || imdbid.String() == "" {
fmt.Println("something went wrong while fetching details")
} else {
insertSQL := `INSERT INTO series (title, plot, releasedDate, tmdb, finished) VALUES (?, ?, ?, ?, ?);`
_, err = db.Exec(insertSQL, ogTitle.String(), plot.String(), releasedday.String(), imdbid.String(), isTVFinished)
if err != nil {
log.Fatal(err)
}
}
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
}
textOnSuccess := ogTitle.String() + " was logged to your diary."
fmt.Println(textOnSuccess)
}
}
}

81
tab.go
View file

@ -5,8 +5,6 @@ import (
"fmt"
"log"
"os"
"os/exec"
"runtime"
"strings"
"time"
@ -16,6 +14,8 @@ import (
_ "github.com/mattn/go-sqlite3"
)
var rows *sql.Rows
var baseStyle = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
BorderForeground(lipgloss.Color("240"))
@ -50,66 +50,15 @@ func (m model) View() string {
}
func openinbrowser(dbid string) {
db, err := sql.Open("sqlite3", "./movies.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// query the database for a specific value
var imdbid string
err = db.QueryRow("SELECT imdb FROM movies WHERE id = ?", dbid).Scan(&imdbid)
if err != nil {
log.Fatal(err)
}
url := "https://www.imdb.com/title/" + imdbid
switch runtime.GOOS {
case "darwin":
err = exec.Command("open", url).Start()
case "linux":
err = exec.Command("xdg-open", url).Start()
case "windows":
err = exec.Command("cmd", "/c", "start", url).Start()
default:
log.Fatalf("Unsupported platform")
}
if err != nil {
log.Fatal(err)
}
}
func Listmovies(isMovie bool, isSeries bool) {
var db *sql.DB
switch runtime.GOOS {
case "linux", "darwin":
dbLocation := os.Getenv("HOME") + "/Documents/Databases/boxd.db"
d, err := sql.Open("sqlite3", dbLocation)
db = d
if err != nil {
log.Fatal(err)
}
case "windows":
userProfile := os.Getenv("USERPROFILE")
dbLocation := userProfile + "\\Documents\\boxd.db"
d, err := sql.Open("sqlite3", dbLocation)
db = d
if err != nil {
log.Fatal(err)
}
}
db := OpenDatabase()
defer db.Close()
var rows *sql.Rows
var err error
var err error
if isMovie == true && isSeries == false {
rows, err = db.Query("SELECT id, title, watchedOn, rating, recommended FROM movies")
rows, err = db.Query("SELECT id, title, watchedOn, rating, opinion, recommended FROM movies ORDER BY watchedOn DESC")
} else if isMovie == false && isSeries == true {
rows, err = db.Query("SELECT id, title, watchedOn, rating, recommended FROM series")
rows, err = db.Query("SELECT id, title, watchedOn, rating, opinion, recommended FROM series WHERE finished = 1 ORDER BY watchedOn DESC")
} else {
fmt.Println("oops there is some confusion")
os.Exit(1)
@ -121,11 +70,12 @@ func Listmovies(isMovie bool, isSeries bool) {
defer rows.Close()
columns := []table.Column{
{Title: "ID", Width: 3},
{Title: "Title", Width: 20},
{Title: "Watched On", Width: 15},
{Title: "Rating", Width: 8},
{Title: "Recommended", Width: 12},
{Title: "ID", Width: 5},
{Title: "Title", Width: 40},
{Title: "Watched On", Width: 20},
{Title: "Rating", Width: 10},
{Title: "Review", Width: 50},
{Title: "Recommended", Width: 15},
}
@ -135,8 +85,9 @@ func Listmovies(isMovie bool, isSeries bool) {
var title string
var watchedon time.Time
var rating string
var review string
var recommended string
if err := rows.Scan(&dbid, &title, &watchedon, &rating, &recommended); err != nil {
if err := rows.Scan(&dbid, &title, &watchedon, &rating, &review, &recommended); err != nil {
log.Fatal(err)
}
var recommendedstring string
@ -149,7 +100,7 @@ func Listmovies(isMovie bool, isSeries bool) {
dateonly := watchedon.Truncate(24 * time.Hour)
datesplit := strings.Split(dateonly.String(), " ")
info := []string{dbid, title, datesplit[0], rating, recommendedstring}
info := []string{dbid, title, datesplit[0], rating, review, recommendedstring}
tbrows = append(tbrows, info)
}
@ -157,7 +108,7 @@ func Listmovies(isMovie bool, isSeries bool) {
table.WithColumns(columns),
table.WithRows(tbrows),
table.WithFocused(true),
table.WithHeight(7),
table.WithHeight(20),
)
s := table.DefaultStyles()