Browse Source

Search movies by imdb id via OMDB

Gildas Chabot 4 years ago
parent
commit
66c8e7369a
5 changed files with 79 additions and 5 deletions
  1. 1 0
      .gitignore
  2. 5 0
      README.md
  3. 43 0
      omdb/omdb.go
  4. 20 2
      pages/pages.go
  5. 10 3
      templates/list.html

+ 1 - 0
.gitignore

@@ -1 +1,2 @@
1 1
 movies.json
2
+omdb/api_key

+ 5 - 0
README.md

@@ -0,0 +1,5 @@
1
+Run with:
2
+
3
+```
4
+$ API_KEY=$(cat omdb/api_key) go run cmd/movies/main.go
5
+```

+ 43 - 0
omdb/omdb.go

@@ -0,0 +1,43 @@
1
+package omdb
2
+
3
+import (
4
+	"fmt"
5
+	"io/ioutil"
6
+	"net/http"
7
+	"os"
8
+)
9
+
10
+const (
11
+	base = "http://www.omdbapi.com/?apikey=%s&i=%s"
12
+)
13
+
14
+var cache map[string][]byte
15
+
16
+func Get(imdbID string) ([]byte, error) {
17
+	if cache == nil {
18
+		cache = make(map[string][]byte)
19
+	}
20
+	if b, ok := cache[imdbID]; ok {
21
+		return b, nil
22
+	}
23
+
24
+	url := fmt.Sprintf(base, apiKey(), imdbID)
25
+	resp, err := http.Get(url)
26
+	if err != nil {
27
+		return nil, fmt.Errorf("error getting %q: %w", url, err)
28
+	}
29
+	defer resp.Body.Close()
30
+
31
+	b, err := ioutil.ReadAll(resp.Body)
32
+	if err != nil {
33
+		return nil, fmt.Errorf("error reading body from %q: %w", url, err)
34
+	}
35
+
36
+	cache[imdbID] = b
37
+
38
+	return b, nil
39
+}
40
+
41
+func apiKey() string {
42
+	return os.Getenv("API_KEY")
43
+}

+ 20 - 2
pages/pages.go

@@ -6,6 +6,7 @@ import (
6 6
 	"net/http"
7 7
 
8 8
 	"gogs.gildas.ch/gildas/movies"
9
+	"gogs.gildas.ch/gildas/movies/omdb"
9 10
 )
10 11
 
11 12
 func List(c *movies.Collection) http.HandlerFunc {
@@ -16,17 +17,34 @@ func List(c *movies.Collection) http.HandlerFunc {
16 17
 			return
17 18
 		}
18 19
 
20
+		var errs []error
21
+
19 22
 		if r.Method == "POST" {
20 23
 			m, err := movies.Unmarshal([]byte(r.FormValue("omdb_json")))
21 24
 			if err != nil {
22 25
 				w.WriteHeader(http.StatusBadRequest)
23
-				fmt.Println(err)
26
+				errs = append(errs, err)
24 27
 				return
25 28
 			}
26 29
 
27 30
 			c.Add(m)
28 31
 		}
29 32
 
30
-		t.Execute(w, c)
33
+		var omdbString string
34
+		if imdbID := r.URL.Query().Get("imdb_id"); imdbID != "" {
35
+			b, err := omdb.Get(imdbID)
36
+			if err != nil {
37
+				errs = append(errs, err)
38
+			} else {
39
+				omdbString = string(b)
40
+			}
41
+		}
42
+
43
+		t.Execute(w, map[string]interface{}{
44
+			"Collection": c,
45
+			"IMDBID":     r.URL.Query().Get("imdb_id"),
46
+			"OMDBString": omdbString,
47
+			"Errors":     errs,
48
+		})
31 49
 	})
32 50
 }

+ 10 - 3
templates/list.html

@@ -43,10 +43,14 @@
43 43
         </style>
44 44
     </head>
45 45
     <body>
46
+        {{ range $e := .Errors }}
47
+        <div class="error">{{ $e }}</div>
48
+        {{ end }}
49
+
46 50
         <h2>Movies</h2>
47 51
 
48 52
         <ul>
49
-            {{ range $m := .Movies }}
53
+            {{ range $m := .Collection.Movies }}
50 54
             <li>
51 55
                 <div class="poster">
52 56
                     <img src="{{ $m.Poster }}" title="{{ $m.Title }}" alt="{{ $m.Title }}" />
@@ -62,11 +66,14 @@
62 66
         <h2>Add a movie</h2>
63 67
         <div>
64 68
             <form method="get">
65
-                <p>Search by title: <input type="text" name="title" /> <input type="submit" /></p>
69
+                <p>
70
+                    Search by IMDB id: <input type="text" name="imdb_id" value="{{ .IMDBID }}" />
71
+                    <input type="submit" />
72
+                </p>
66 73
             </form>
67 74
             <form method="post">
68 75
                 <p>Add OMBD JSON movie:<br />
69
-                    <textarea name="omdb_json" style="width:500px;height:140px;"></textarea>
76
+                    <textarea name="omdb_json" style="width:500px;height:140px;">{{ .OMDBString }}</textarea>
70 77
                     <input type="submit" />
71 78
                 </p>
72 79
             </form>