added ezconf and updated modules with integration

This commit is contained in:
2026-01-13 21:18:35 +11:00
parent f8919e8398
commit 0ceeb37058
22 changed files with 2448 additions and 3 deletions

21
tmdb/LICENSE Normal file
View 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
View 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
View 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{}
}