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:
parent
2ff3329a98
commit
c14d4eff1a
71
database.go
Normal file
71
database.go
Normal 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
150
episode.go
Normal 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
255
main.go
|
@ -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
251
media.go
Normal 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
81
tab.go
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue