From 62654db465e98b6bcbadb872216e378b470a0273 Mon Sep 17 00:00:00 2001 From: Nils Stinnesbeck Date: Sat, 27 Dec 2025 15:42:44 +0100 Subject: [PATCH] initial commit --- go.mod | 3 ++ imdb.go | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ imdb_test.go | 40 ++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 go.mod create mode 100644 imdb.go create mode 100644 imdb_test.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ddcadab --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.stinnesbeck.com/go/imdb + +go 1.23.3 diff --git a/imdb.go b/imdb.go new file mode 100644 index 0000000..a256859 --- /dev/null +++ b/imdb.go @@ -0,0 +1,104 @@ +package imdb + +import ( + "encoding/json" + "fmt" + "net/http" + "slices" +) + +const ( + searchURL = "https://v3.sg.media-imdb.com/suggestion/x/%s.json" +) + +type Answer struct { + Data []Data `json:"d"` + Query string `json:"q"` + V int `json:"v"` +} + +// type Image struct { +// Height int `json:"height"` +// ImageURL string `json:"imageUrl"` +// Width int `json:"width"` +// } + +type ( + QID string + Q string +) + +const ( + QID_Movie QID = "movie" + QID_TVMovie QID = "tvMovie" + QID_MusicVideo QID = "musicVideo" + QID_TVSeries QID = "tvSeries" + QID_TVMiniSeries QID = "tvMiniSeries" +) + +const ( + Q_Feature Q = "feature" + Q_TVMovie Q = "TV movie" + Q_MusicVideo Q = "musicVideo" + Q_TVSeries Q = "TV series" + Q_TVMiniSeries Q = "TV mini-series" +) + +type Data struct { + // Image Image `json:"i,omitempty"` + ID string `json:"id"` + Title string `json:"l"` + Stars string `json:"s"` + Q Q `json:"q,omitempty"` + QID QID `json:"qid,omitempty"` + Rank int `json:"rank,omitempty"` + Year int `json:"y,omitempty"` +} + +func SearchMovie(title string) ([]Data, error) { + data, err := Search(title) + if err != nil { + return nil, err + } + + data = slices.DeleteFunc(data, func(d Data) bool { + return d.QID != QID_Movie + }) + + return data, nil +} + +func SearchTVSeries(title string) ([]Data, error) { + data, err := Search(title) + if err != nil { + return nil, err + } + + data = slices.DeleteFunc(data, func(d Data) bool { + return d.Q != Q_TVSeries + }) + + return data, nil +} + +func Search(title string) ([]Data, error) { + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf(searchURL, title), nil) + if err != nil { + return nil, err + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + + var ans Answer + + if err := json.NewDecoder(res.Body).Decode(&ans); err != nil { + return nil, err + } + + return ans.Data, nil +} diff --git a/imdb_test.go b/imdb_test.go new file mode 100644 index 0000000..8b36a8c --- /dev/null +++ b/imdb_test.go @@ -0,0 +1,40 @@ +package imdb_test + +import ( + "testing" + + "git.stinnesbeck.com/go/imdb" +) + +func TestSearch(t *testing.T) { + d, err := imdb.Search("IT") + if err != nil { + t.Fatal(err) + } + + for _, data := range d { + t.Logf("%+v\n", data) + } +} + +func TestSearchMovie(t *testing.T) { + d, err := imdb.SearchMovie("tron") + if err != nil { + t.Fatal(err) + } + + for _, data := range d { + t.Logf("%+v\n", data) + } +} + +func TestSearchTVShow(t *testing.T) { + d, err := imdb.SearchTVSeries("Big Bang Theory") + if err != nil { + t.Fatal(err) + } + + for _, data := range d { + t.Logf("%+v\n", data) + } +}