From c9254b2aace56abbe343dc79ee879a941c38df38 Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Sun, 24 Dec 2023 17:11:29 +0100 Subject: [PATCH] tmdb search back --- client/tmdb.go | 45 +++++------ cmd/terminal-client/tui/basemodel.go | 17 +--- cmd/terminal-client/tui/search.go | 116 --------------------------- cmd/terminal-client/tui/tabemdb.go | 13 ++- cmd/terminal-client/tui/tabset.go | 14 ++-- cmd/terminal-client/tui/tabtmdb.go | 44 +++++----- 6 files changed, 59 insertions(+), 190 deletions(-) delete mode 100644 cmd/terminal-client/tui/search.go diff --git a/client/tmdb.go b/client/tmdb.go index bd24347..294cedc 100644 --- a/client/tmdb.go +++ b/client/tmdb.go @@ -24,32 +24,31 @@ func NewTMDB(apikey string) (*TMDB, error) { }, nil } -func (t TMDB) Search(query string) ([]model.Movie, error) { - return []model.Movie{ - {Title: "movie1", Year: 2020, Summary: "summary1"}, - {Title: "movie2", Year: 2020, Summary: "summary2"}, - {Title: "movie3", Year: 2020, Summary: "summary3"}, - }, nil -} - //func (t TMDB) Search(query string) ([]model.Movie, error) { -// -// results, err := t.c.GetSearchMovies(query, nil) -// if err != nil { -// return nil, err -// } -// -// movies := make([]model.Movie, len(results.Results)) -// for i, result := range results.Results { -// movies[i], err = t.GetMovie(result.ID) -// if err != nil { -// return nil, err -// } -// } -// -// return movies, nil +// return []model.Movie{ +// {Title: "movie1", Year: 2020, Summary: "summary1"}, +// {Title: "movie2", Year: 2020, Summary: "summary2"}, +// {Title: "movie3", Year: 2020, Summary: "summary3"}, +// }, nil //} +func (t TMDB) Search(query string) ([]model.Movie, error) { + results, err := t.c.GetSearchMovies(query, nil) + if err != nil { + return nil, err + } + + movies := make([]model.Movie, len(results.Results)) + for i, result := range results.Results { + movies[i], err = t.GetMovie(result.ID) + if err != nil { + return nil, err + } + } + + return movies, nil +} + func (t TMDB) GetMovie(id int64) (model.Movie, error) { result, err := t.c.GetMovieDetails(int(id), nil) if err != nil { diff --git a/cmd/terminal-client/tui/basemodel.go b/cmd/terminal-client/tui/basemodel.go index 7fcabed..4b1cc33 100644 --- a/cmd/terminal-client/tui/basemodel.go +++ b/cmd/terminal-client/tui/basemodel.go @@ -7,7 +7,6 @@ import ( "ewintr.nl/emdb/client" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" ) type baseModel struct { @@ -76,7 +75,8 @@ func (m baseModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { Height: m.contentSize.Height, } cmds = append(cmds, m.tabs.Update(tabSize)) - m.Log("done with resize") + case error: + m.Log(fmt.Sprintf("ERROR: %s", msg.Error())) default: cmds = append(cmds, m.tabs.Update(msg)) } @@ -97,17 +97,8 @@ func (m baseModel) View() string { return "\n Initializing..." } - doc := strings.Builder{} - doc.WriteString(lipgloss.PlaceHorizontal(m.contentSize.Width, lipgloss.Left, m.tabs.ViewMenu())) - doc.WriteString("\n") - doc.WriteString(m.tabs.ViewContent()) - doc.WriteString("\n") - doc.WriteString(m.renderLog()) - return docStyle.Render(doc.String()) -} - -func (m *baseModel) renderLog() string { - return windowStyle.Width(m.contentSize.Width).Height(logLineCount).Render(m.logViewport.View()) + logWindow := windowStyle.Width(m.contentSize.Width).Height(logLineCount).Render(m.logViewport.View()) + return docStyle.Render(fmt.Sprintf("%s\n%s", m.tabs.View(), logWindow)) } func (m *baseModel) setSize() { diff --git a/cmd/terminal-client/tui/search.go b/cmd/terminal-client/tui/search.go deleted file mode 100644 index 765c40d..0000000 --- a/cmd/terminal-client/tui/search.go +++ /dev/null @@ -1,116 +0,0 @@ -package tui - -import ( - "fmt" - - "ewintr.nl/emdb/client" - "github.com/charmbracelet/bubbles/list" - "github.com/charmbracelet/bubbles/textinput" - "github.com/charmbracelet/bubbles/viewport" - tea "github.com/charmbracelet/bubbletea" -) - -type modelSearch struct { - tmdb *client.TMDB - focused string - searchInput textinput.Model - searchResults list.Model - logContent string - ready bool - logViewport viewport.Model -} - -func (m modelSearch) Init() tea.Cmd { - return nil -} - -func (m modelSearch) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - var ( - cmd tea.Cmd - cmds []tea.Cmd - ) - - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.String() { - case "ctrl+c", "q", "esc": - return m, tea.Quit - case "enter": - switch m.focused { - case "search": - m.Search() - case "result": - selected := m.searchResults.Items()[m.searchResults.Index()].(Movie) - m.Log(fmt.Sprintf("selected: %d - %s", m.searchResults.Index(), selected.Title())) - return NewEdit(selected), nil - } - } - - case tea.WindowSizeMsg: - if !m.ready { - m.initialModel(msg.Width, msg.Height) - } - } - - switch m.focused { - case "search": - m.searchInput, cmd = m.searchInput.Update(msg) - case "result": - m.searchResults, cmd = m.searchResults.Update(msg) - } - - cmds = append(cmds, cmd) - - return m, tea.Batch(cmds...) -} - -func (m *modelSearch) Log(msg string) { - m.logContent = fmt.Sprintf("%s\n%s", m.logContent, msg) - m.logViewport.SetContent(m.logContent) - m.logViewport.GotoBottom() -} - -func (m *modelSearch) Search() { - m.Log("start search") - movies, err := m.tmdb.Search(m.searchInput.Value()) - if err != nil { - m.Log(fmt.Sprintf("error: %v", err)) - return - } - - m.Log(fmt.Sprintf("found %d results", len(movies))) - items := []list.Item{} - for _, res := range movies { - items = append(items, Movie{m: res}) - } - - m.searchResults.SetItems(items) - m.focused = "result" -} - -func (m modelSearch) View() string { - if !m.ready { - return "\n Initializing..." - } - return fmt.Sprintf("%s\n---\n%s\n---\n%s", m.searchInput.View(), m.searchResults.View(), m.logViewport.View()) -} - -func (m *modelSearch) initialModel(width, height int) { - - si := textinput.New() - si.Placeholder = "title" - si.CharLimit = 156 - si.Width = 20 - m.searchInput = si - m.searchInput.Focus() - - m.searchResults = list.New([]list.Item{}, list.NewDefaultDelegate(), width, height-50) - m.searchResults.Title = "Search results" - m.searchResults.SetShowHelp(false) - - m.logViewport = viewport.New(width, 10) - m.logViewport.SetContent(m.logContent) - m.logViewport.KeyMap = viewport.KeyMap{} - m.focused = "search" - m.ready = true -} diff --git a/cmd/terminal-client/tui/tabemdb.go b/cmd/terminal-client/tui/tabemdb.go index 4584454..2cf544f 100644 --- a/cmd/terminal-client/tui/tabemdb.go +++ b/cmd/terminal-client/tui/tabemdb.go @@ -26,7 +26,8 @@ func NewTabEMDB(emdb *client.EMDB, logger *Logger) (tea.Model, tea.Cmd) { list: list, } - return m, FetchMovieList(emdb, logger) + logger.Log("search emdb...") + return m, FetchMovieList(emdb) } func (m tabEMDB) Init() tea.Cmd { @@ -44,6 +45,7 @@ func (m tabEMDB) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } m.list.SetSize(msg.Width, msg.Height) case Movies: + m.logger.Log(fmt.Sprintf("found %d movies in in emdb", len(msg))) m.list.SetItems(msg.listItems()) } @@ -61,17 +63,12 @@ func (m *tabEMDB) Log(s string) { m.logger.Log(s) } -func FetchMovieList(emdb *client.EMDB, logger *Logger) tea.Cmd { +func FetchMovieList(emdb *client.EMDB) tea.Cmd { return func() tea.Msg { - logger.Log("fetching emdb movies...") ems, err := emdb.GetMovies() if err != nil { - logger.Log(err.Error()) + return err } - - //m.list.SetItems(items) - logger.Log(fmt.Sprintf("found %d movies in in emdb", len(ems))) - return Movies(ems) } } diff --git a/cmd/terminal-client/tui/tabset.go b/cmd/terminal-client/tui/tabset.go index 5c7bb24..816cd13 100644 --- a/cmd/terminal-client/tui/tabset.go +++ b/cmd/terminal-client/tui/tabset.go @@ -12,6 +12,7 @@ type TabSet struct { order []string title map[string]string tabs map[string]tea.Model + size TabSizeMsgType } func NewTabSet() *TabSet { @@ -52,6 +53,7 @@ func (t *TabSet) Update(msg tea.Msg) tea.Cmd { t.tabs[name], cmd = t.tabs[name].Update(msg) cmds = append(cmds, cmd) } + t.size = msg.(TabSizeMsgType) default: name := t.order[t.active] t.tabs[name], cmd = t.tabs[name].Update(msg) @@ -61,7 +63,7 @@ func (t *TabSet) Update(msg tea.Msg) tea.Cmd { return tea.Batch(cmds...) } -func (t *TabSet) ViewMenu() string { +func (t *TabSet) View() string { var items []string for i, name := range t.order { if i == t.active { @@ -75,11 +77,9 @@ func (t *TabSet) ViewMenu() string { Foreground(colorNormalForeground). Render(fmt.Sprintf(" %s ", t.title[name]))) } - return lipgloss.JoinHorizontal(lipgloss.Top, items...) + menu := lipgloss.JoinHorizontal(lipgloss.Top, items...) + pane := t.tabs[t.order[t.active]].View() + lipgloss.PlaceHorizontal(t.size.Width, lipgloss.Left, menu) - //return -} - -func (t *TabSet) ViewContent() string { - return t.tabs[t.order[t.active]].View() + return fmt.Sprintf("%s\n%s", menu, pane) } diff --git a/cmd/terminal-client/tui/tabtmdb.go b/cmd/terminal-client/tui/tabtmdb.go index a018e14..3fb3b7b 100644 --- a/cmd/terminal-client/tui/tabtmdb.go +++ b/cmd/terminal-client/tui/tabtmdb.go @@ -34,28 +34,34 @@ func (m tabTMDB) Init() tea.Cmd { func (m tabTMDB) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd var cmds []tea.Cmd - m.Log(fmt.Sprintf("%v", msg)) switch msg := msg.(type) { case TabSizeMsgType: if !m.initialized { - m.Log(fmt.Sprintf("tmdb initialized. focused: %s", m.focused)) m.initialModel(msg.Width, msg.Height) } m.initialized = true - m.searchResults.SetSize(msg.Width, msg.Height-10) + m.searchResults.SetSize(msg.Width, msg.Height) case tea.KeyMsg: switch msg.String() { + case "enter": + switch m.focused { + case "search": + cmds = append(cmds, SearchTMDB(m.tmdb, m.searchInput.Value())) + m.searchInput.Blur() + m.Log("search tmdb...") + } } + case Movies: + m.Log(fmt.Sprintf("found %d movies in in tmdb", len(msg))) + m.searchResults.SetItems(msg.listItems()) + m.focused = "result" } - m.Log(fmt.Sprintf("focused: %s", m.focused)) switch m.focused { case "search": - m.Log("search") m.searchInput, cmd = m.searchInput.Update(msg) case "result": - m.Log("result") m.searchResults, cmd = m.searchResults.Update(msg) } cmds = append(cmds, cmd) @@ -86,20 +92,12 @@ func (m *tabTMDB) initialModel(width, height int) { m.focused = "search" } -//func (m *model) Search() { -// m.Log("start search") -// movies, err := m.tmdb.Search(m.searchInput.Value()) -// if err != nil { -// m.Log(fmt.Sprintf("error: %v", err)) -// return -// } -// -// m.Log(fmt.Sprintf("found %d results", len(movies))) -// items := []list.Item{} -// for _, res := range movies { -// items = append(items, Movie{m: res}) -// } -// -// m.searchResults.SetItems(items) -// m.focused = "result" -//} +func SearchTMDB(tmdb *client.TMDB, query string) tea.Cmd { + return func() tea.Msg { + tms, err := tmdb.Search(query) + if err != nil { + return err + } + return Movies(tms) + } +}