added ezconf and updated modules with integration
This commit is contained in:
21
tmdb/LICENSE
Normal file
21
tmdb/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 haelnorr
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
239
tmdb/README.md
Normal file
239
tmdb/README.md
Normal file
@@ -0,0 +1,239 @@
|
||||
# TMDB - v0.9.2
|
||||
|
||||
A Go client library for The Movie Database (TMDB) API with automatic rate limiting, retry logic, and convenient helper functions.
|
||||
|
||||
## Features
|
||||
|
||||
- Clean interface for TMDB's REST API
|
||||
- Automatic rate limiting with exponential backoff
|
||||
- Retry logic for rate limit errors (respects Retry-After header)
|
||||
- Movie search functionality
|
||||
- Movie details retrieval
|
||||
- Cast and crew information
|
||||
- Image URL helpers
|
||||
- Environment variable configuration with ConfigFromEnv
|
||||
- EZConf integration for unified configuration
|
||||
- Comprehensive test coverage (94.1%)
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
go get git.haelnorr.com/h/golib/tmdb
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"git.haelnorr.com/h/golib/tmdb"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Create API connection
|
||||
api, err := tmdb.NewAPIConnection()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Search for a movie
|
||||
results, err := api.SearchMovies("Fight Club", false, 1)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
for _, movie := range results.Results {
|
||||
fmt.Printf("%s (%s)\n", movie.Title, movie.ReleaseYear())
|
||||
fmt.Printf("Poster: %s\n", movie.GetPoster(&api.Image, "w500"))
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Getting Movie Details
|
||||
|
||||
```go
|
||||
// Get detailed information about a movie
|
||||
movie, err := api.GetMovie(550) // Fight Club
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Title: %s\n", movie.Title)
|
||||
fmt.Printf("Overview: %s\n", movie.Overview)
|
||||
fmt.Printf("Release Date: %s\n", movie.ReleaseDate)
|
||||
fmt.Printf("IMDb ID: %s\n", movie.IMDbID)
|
||||
fmt.Printf("Rating: %.1f/10\n", movie.VoteAverage)
|
||||
```
|
||||
|
||||
### Getting Cast and Crew
|
||||
|
||||
```go
|
||||
// Get credits for a movie
|
||||
credits, err := api.GetCredits(550)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Cast:")
|
||||
for _, actor := range credits.Cast {
|
||||
fmt.Printf(" %s as %s\n", actor.Name, actor.Character)
|
||||
}
|
||||
|
||||
fmt.Println("\nDirector:")
|
||||
for _, member := range credits.Crew {
|
||||
if member.Job == "Director" {
|
||||
fmt.Printf(" %s\n", member.Name)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
The package requires the following environment variable:
|
||||
|
||||
```bash
|
||||
# TMDB API access token (required)
|
||||
TMDB_TOKEN=your_api_token_here
|
||||
```
|
||||
|
||||
Get your API token from: https://www.themoviedb.org/settings/api
|
||||
|
||||
### Using EZConf Integration
|
||||
|
||||
```go
|
||||
import (
|
||||
"git.haelnorr.com/h/golib/ezconf"
|
||||
"git.haelnorr.com/h/golib/tmdb"
|
||||
)
|
||||
|
||||
loader := ezconf.New()
|
||||
loader.RegisterIntegration(tmdb.NewEZConfIntegration())
|
||||
loader.Load()
|
||||
|
||||
// Get the configured API connection
|
||||
api, ok := loader.GetConfig("tmdb")
|
||||
if !ok {
|
||||
log.Fatal("tmdb config not found")
|
||||
}
|
||||
```
|
||||
|
||||
## Rate Limiting
|
||||
|
||||
TMDB has rate limits around 40 requests per second. This package implements automatic retry logic with exponential backoff:
|
||||
|
||||
- **Initial backoff**: 1 second
|
||||
- **Exponential growth**: 1s → 2s → 4s → 8s → 16s → 32s (max)
|
||||
- **Maximum retries**: 3 attempts
|
||||
- **Respects** Retry-After header when provided by the API
|
||||
|
||||
All API calls automatically handle rate limiting, so you don't need to worry about it.
|
||||
|
||||
## Image URLs
|
||||
|
||||
The TMDB API provides base URLs for images. Use helper methods to construct full image URLs:
|
||||
|
||||
```go
|
||||
// Available poster sizes: "w92", "w154", "w185", "w342", "w500", "w780", "original"
|
||||
posterURL := movie.GetPoster(&api.Image, "w500")
|
||||
|
||||
// Available backdrop sizes: "w300", "w780", "w1280", "original"
|
||||
backdropURL := movie.GetBackdrop(&api.Image, "w1280")
|
||||
|
||||
// Available profile sizes: "w45", "w185", "h632", "original"
|
||||
profileURL := actor.GetProfile(&api.Image, "w185")
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### Main Functions
|
||||
|
||||
- `NewAPIConnection() (*APIConnection, error)` - Create a new API connection
|
||||
- `SearchMovies(query string, includeAdult bool, page int) (*SearchResponse, error)` - Search for movies
|
||||
- `GetMovie(movieID int) (*Movie, error)` - Get detailed movie information
|
||||
- `GetCredits(movieID int) (*Credits, error)` - Get cast and crew information
|
||||
|
||||
### Helper Methods
|
||||
|
||||
**Movie Methods:**
|
||||
- `ReleaseYear() string` - Extract year from release date
|
||||
- `GetPoster(imgConfig *ImageConfig, size string) string` - Get full poster URL
|
||||
- `GetBackdrop(imgConfig *ImageConfig, size string) string` - Get full backdrop URL
|
||||
|
||||
**Cast/Crew Methods:**
|
||||
- `GetProfile(imgConfig *ImageConfig, size string) string` - Get full profile image URL
|
||||
|
||||
## Error Handling
|
||||
|
||||
The package returns wrapped errors for easy debugging:
|
||||
|
||||
```go
|
||||
data, err := api.SearchMovies("Inception", false, 1)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "rate limit exceeded") {
|
||||
// Handle rate limiting
|
||||
} else if strings.Contains(err.Error(), "unexpected status code: 401") {
|
||||
// Invalid API token
|
||||
} else if strings.Contains(err.Error(), "unexpected status code: 404") {
|
||||
// Resource not found
|
||||
} else {
|
||||
// Network or other errors
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
For detailed documentation, see the [TMDB Wiki](https://git.haelnorr.com/h/golib/wiki/TMDB.md).
|
||||
|
||||
Additional API documentation is available at [GoDoc](https://pkg.go.dev/git.haelnorr.com/h/golib/tmdb).
|
||||
|
||||
## Testing
|
||||
|
||||
Run the test suite (requires a valid TMDB_TOKEN environment variable):
|
||||
|
||||
```bash
|
||||
export TMDB_TOKEN=your_api_token_here
|
||||
go test -v ./...
|
||||
```
|
||||
|
||||
Current test coverage: 94.1%
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Reuse API connections** - Create one connection and reuse it for multiple requests
|
||||
2. **Cache responses** - Cache API responses when appropriate to reduce API calls
|
||||
3. **Use specific image sizes** - Use appropriate image sizes instead of "original" to save bandwidth
|
||||
4. **Handle rate limits gracefully** - The library handles this automatically, but be aware it may introduce delays
|
||||
5. **Set a timeout** - Consider using context with timeout for long-running operations
|
||||
|
||||
## Example Projects
|
||||
|
||||
Check out these projects using the TMDB library:
|
||||
|
||||
- [Project ReShoot](https://git.haelnorr.com/h/reshoot) - Movie database application
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the LICENSE file for details.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please feel free to submit a Pull Request.
|
||||
|
||||
## Related Projects
|
||||
|
||||
- [ezconf](https://git.haelnorr.com/h/golib/ezconf) - Unified configuration management
|
||||
- [hlog](https://git.haelnorr.com/h/golib/hlog) - Structured logging with zerolog
|
||||
|
||||
## External Resources
|
||||
|
||||
- [TMDB API Documentation](https://developer.themoviedb.org/docs)
|
||||
- [Get API Token](https://www.themoviedb.org/settings/api)
|
||||
- [TMDB Website](https://www.themoviedb.org/)
|
||||
36
tmdb/ezconf.go
Normal file
36
tmdb/ezconf.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package tmdb
|
||||
|
||||
import "runtime"
|
||||
|
||||
// EZConfIntegration provides integration with ezconf for automatic configuration
|
||||
type EZConfIntegration struct{}
|
||||
|
||||
// PackagePath returns the path to the tmdb package for source parsing
|
||||
func (e EZConfIntegration) PackagePath() string {
|
||||
_, filename, _, _ := runtime.Caller(0)
|
||||
// Return directory of this file
|
||||
return filename[:len(filename)-len("/ezconf.go")]
|
||||
}
|
||||
|
||||
// ConfigFunc returns the NewAPIConnection function for ezconf
|
||||
// Note: tmdb uses NewAPIConnection instead of ConfigFromEnv
|
||||
func (e EZConfIntegration) ConfigFunc() func() (interface{}, error) {
|
||||
return func() (interface{}, error) {
|
||||
return NewAPIConnection()
|
||||
}
|
||||
}
|
||||
|
||||
// Name returns the name to use when registering with ezconf
|
||||
func (e EZConfIntegration) Name() string {
|
||||
return "tmdb"
|
||||
}
|
||||
|
||||
// GroupName returns the display name for grouping environment variables
|
||||
func (e EZConfIntegration) GroupName() string {
|
||||
return "TMDB"
|
||||
}
|
||||
|
||||
// NewEZConfIntegration creates a new EZConf integration helper
|
||||
func NewEZConfIntegration() EZConfIntegration {
|
||||
return EZConfIntegration{}
|
||||
}
|
||||
Reference in New Issue
Block a user