tmdb search back

This commit is contained in:
Erik Winter 2023-12-24 17:11:29 +01:00
parent 33ff36052a
commit c9254b2aac
6 changed files with 59 additions and 190 deletions

View File

@ -24,32 +24,31 @@ func NewTMDB(apikey string) (*TMDB, error) {
}, nil }, 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) { //func (t TMDB) Search(query string) ([]model.Movie, error) {
// // return []model.Movie{
// results, err := t.c.GetSearchMovies(query, nil) // {Title: "movie1", Year: 2020, Summary: "summary1"},
// if err != nil { // {Title: "movie2", Year: 2020, Summary: "summary2"},
// return nil, err // {Title: "movie3", Year: 2020, Summary: "summary3"},
// } // }, nil
//
// 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) 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) { func (t TMDB) GetMovie(id int64) (model.Movie, error) {
result, err := t.c.GetMovieDetails(int(id), nil) result, err := t.c.GetMovieDetails(int(id), nil)
if err != nil { if err != nil {

View File

@ -7,7 +7,6 @@ import (
"ewintr.nl/emdb/client" "ewintr.nl/emdb/client"
"github.com/charmbracelet/bubbles/viewport" "github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
) )
type baseModel struct { type baseModel struct {
@ -76,7 +75,8 @@ func (m baseModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
Height: m.contentSize.Height, Height: m.contentSize.Height,
} }
cmds = append(cmds, m.tabs.Update(tabSize)) cmds = append(cmds, m.tabs.Update(tabSize))
m.Log("done with resize") case error:
m.Log(fmt.Sprintf("ERROR: %s", msg.Error()))
default: default:
cmds = append(cmds, m.tabs.Update(msg)) cmds = append(cmds, m.tabs.Update(msg))
} }
@ -97,17 +97,8 @@ func (m baseModel) View() string {
return "\n Initializing..." return "\n Initializing..."
} }
doc := strings.Builder{} logWindow := windowStyle.Width(m.contentSize.Width).Height(logLineCount).Render(m.logViewport.View())
doc.WriteString(lipgloss.PlaceHorizontal(m.contentSize.Width, lipgloss.Left, m.tabs.ViewMenu())) return docStyle.Render(fmt.Sprintf("%s\n%s", m.tabs.View(), logWindow))
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())
} }
func (m *baseModel) setSize() { func (m *baseModel) setSize() {

View File

@ -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
}

View File

@ -26,7 +26,8 @@ func NewTabEMDB(emdb *client.EMDB, logger *Logger) (tea.Model, tea.Cmd) {
list: list, list: list,
} }
return m, FetchMovieList(emdb, logger) logger.Log("search emdb...")
return m, FetchMovieList(emdb)
} }
func (m tabEMDB) Init() tea.Cmd { 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) m.list.SetSize(msg.Width, msg.Height)
case Movies: case Movies:
m.logger.Log(fmt.Sprintf("found %d movies in in emdb", len(msg)))
m.list.SetItems(msg.listItems()) m.list.SetItems(msg.listItems())
} }
@ -61,17 +63,12 @@ func (m *tabEMDB) Log(s string) {
m.logger.Log(s) m.logger.Log(s)
} }
func FetchMovieList(emdb *client.EMDB, logger *Logger) tea.Cmd { func FetchMovieList(emdb *client.EMDB) tea.Cmd {
return func() tea.Msg { return func() tea.Msg {
logger.Log("fetching emdb movies...")
ems, err := emdb.GetMovies() ems, err := emdb.GetMovies()
if err != nil { 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) return Movies(ems)
} }
} }

View File

@ -12,6 +12,7 @@ type TabSet struct {
order []string order []string
title map[string]string title map[string]string
tabs map[string]tea.Model tabs map[string]tea.Model
size TabSizeMsgType
} }
func NewTabSet() *TabSet { 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) t.tabs[name], cmd = t.tabs[name].Update(msg)
cmds = append(cmds, cmd) cmds = append(cmds, cmd)
} }
t.size = msg.(TabSizeMsgType)
default: default:
name := t.order[t.active] name := t.order[t.active]
t.tabs[name], cmd = t.tabs[name].Update(msg) 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...) return tea.Batch(cmds...)
} }
func (t *TabSet) ViewMenu() string { func (t *TabSet) View() string {
var items []string var items []string
for i, name := range t.order { for i, name := range t.order {
if i == t.active { if i == t.active {
@ -75,11 +77,9 @@ func (t *TabSet) ViewMenu() string {
Foreground(colorNormalForeground). Foreground(colorNormalForeground).
Render(fmt.Sprintf(" %s ", t.title[name]))) 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 return fmt.Sprintf("%s\n%s", menu, pane)
}
func (t *TabSet) ViewContent() string {
return t.tabs[t.order[t.active]].View()
} }

View File

@ -34,28 +34,34 @@ func (m tabTMDB) Init() tea.Cmd {
func (m tabTMDB) Update(msg tea.Msg) (tea.Model, tea.Cmd) { func (m tabTMDB) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd var cmd tea.Cmd
var cmds []tea.Cmd var cmds []tea.Cmd
m.Log(fmt.Sprintf("%v", msg))
switch msg := msg.(type) { switch msg := msg.(type) {
case TabSizeMsgType: case TabSizeMsgType:
if !m.initialized { if !m.initialized {
m.Log(fmt.Sprintf("tmdb initialized. focused: %s", m.focused))
m.initialModel(msg.Width, msg.Height) m.initialModel(msg.Width, msg.Height)
} }
m.initialized = true m.initialized = true
m.searchResults.SetSize(msg.Width, msg.Height-10) m.searchResults.SetSize(msg.Width, msg.Height)
case tea.KeyMsg: case tea.KeyMsg:
switch msg.String() { 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 { switch m.focused {
case "search": case "search":
m.Log("search")
m.searchInput, cmd = m.searchInput.Update(msg) m.searchInput, cmd = m.searchInput.Update(msg)
case "result": case "result":
m.Log("result")
m.searchResults, cmd = m.searchResults.Update(msg) m.searchResults, cmd = m.searchResults.Update(msg)
} }
cmds = append(cmds, cmd) cmds = append(cmds, cmd)
@ -86,20 +92,12 @@ func (m *tabTMDB) initialModel(width, height int) {
m.focused = "search" m.focused = "search"
} }
//func (m *model) Search() { func SearchTMDB(tmdb *client.TMDB, query string) tea.Cmd {
// m.Log("start search") return func() tea.Msg {
// movies, err := m.tmdb.Search(m.searchInput.Value()) tms, err := tmdb.Search(query)
// if err != nil { if err != nil {
// m.Log(fmt.Sprintf("error: %v", err)) return err
// return }
// } return Movies(tms)
// }
// 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"
//}