golang The Movie Database API v3 封装插件库golang-tmdb的使用

golang The Movie Database API v3 封装插件库golang-tmdb的使用

这是一个用于TMDb API的Golang封装库。

golang-tmdb logo

要求

  • Go 1.18.x 或更高版本。我们旨在支持Go的最新版本。

安装

go get -u github.com/cyruzin/golang-tmdb

使用方法

首先导入tmdb包并初始化客户端:

import "github.com/cyruzin/golang-tmdb"

// 使用API v3
tmdbClient, err := tmdb.Init(os.Getenv("YOUR_APIKEY"))
if err != nil {
    fmt.Println(err)
}

// 使用API v4
tmdbClient, err := tmdb.InitV4(os.Getenv("YOUR_BEARER_TOKEN"))
if err != nil {
    fmt.Println(err)
}

// 可选:启用自动重试功能
// 如果之前的请求失败(429 TOO MANY REQUESTS),此选项将重试
tmdbClient.SetClientAutoRetry()

// 可选:如果默认URL有问题,设置备用基本URL
// 使用https://api.tmdb.org/3代替https://api.themoviedb.org/3
tmdbClient.SetAlternateBaseURL()

// 可选:用于测试,设置自定义基本URL
tmdbClient.SetCustomBaseURL("http://localhost:3000")

// 获取当前基本URL
tmdbClient.GetBaseURL()

// 可选:为http.Client设置自定义配置
// 默认超时为10秒。在这里你可以设置其他选项如Timeout和Transport
customClient := http.Client{
    Timeout: time.Second * 5,
    Transport: &http.Transport{
        MaxIdleConns: 10,
        IdleConnTimeout: 15 * time.Second,
    },
}

tmdbClient.SetClientConfig(customClient)

// 可选:如果你要使用需要session id的端点,启用此选项
tmdbClient.SetSessionID(os.Getenv("YOUR_SESSION_ID"))

// 获取电影详情
movie, err := tmdbClient.GetMovieDetails(297802, nil)
if err != nil {
 fmt.Println(err)
}

fmt.Println(movie.Title)

带可选参数:

options := map[string]string{
  "language": "pt-BR",
  "append_to_response": "credits,images",
}

movie, err := tmdbClient.GetMovieDetails(297802, options)
if err != nil {
 fmt.Println(err)
}

fmt.Println(movie.Title)

辅助功能

生成图片和视频URL:

options := map[string]string{
 "append_to_response": "videos",
}

movie, err := tmdbClient.GetMovieDetails(297802, options)
if err != nil {
 fmt.Println(err)
}

// 获取图片URL
fmt.Println(tmdb.GetImageURL(movie.BackdropPath, tmdb.W500))
// 输出: https://image.tmdb.org/t/p/w500/bOGkgRGdhrBYJSLpXaxhXVstddV.jpg
fmt.Println(tmdb.GetImageURL(movie.PosterPath, tmdb.Original))
// 输出: https://image.tmdb.org/t/p/original/bOGkgRGdhrBYJSLpXaxhXVstddV.jpg

// 获取视频URL
for _, video := range movie.MovieVideosAppend.Videos.Results {
   if video.Key != "" {
     fmt.Println(tmdb.GetVideoURL(video.Key))
     // 输出: https://www.youtube.com/watch?v=6ZfuNTqbHE8
   }
}

性能

获取电影详情:

迭代次数 ns/op B/op allocs/op
19 60886648 60632 184

多搜索:

迭代次数 ns/op B/op allocs/op
16 66596963 107109 608

测试

要进行本地测试,只需运行:

go test -v

许可证

MIT


更多关于golang The Movie Database API v3 封装插件库golang-tmdb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang The Movie Database API v3 封装插件库golang-tmdb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang TMDB API v3 封装库使用指南

TMDB (The Movie Database) 是一个流行的电影和电视节目数据库,提供了丰富的API。golang-tmdb 是一个用于访问TMDB API v3的Golang封装库。

安装

首先安装golang-tmdb库:

go get github.com/cyruzin/golang-tmdb

基本使用

初始化客户端

package main

import (
	"fmt"
	"log"

	tmdb "github.com/cyruzin/golang-tmdb"
)

func main() {
	// 使用你的TMDB API密钥初始化客户端
	tmdbClient, err := tmdb.Init("your-api-key-here")
	if err != nil {
		log.Fatal(err)
	}

	// 可选: 设置语言(默认为en-US)
	tmdbClient.SetClientAutoRetry()
	tmdbClient.SetLanguage("zh-CN")
}

获取电影详情

func getMovieDetails(client *tmdb.Client, movieID int64) {
	// 获取电影详情
	movie, err := client.GetMovieDetails(movieID, nil)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("电影标题: %s\n", movie.Title)
	fmt.Printf("上映日期: %s\n", movie.ReleaseDate)
	fmt.Printf("简介: %s\n", movie.Overview)
	fmt.Printf("评分: %.1f\n", movie.VoteAverage)
}

搜索电影

func searchMovies(client *tmdb.Client, query string) {
	options := map[string]string{
		"query": query,
	}

	// 搜索电影
	result, err := client.GetSearchMovies(options)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("找到 %d 部电影\n", result.TotalResults)
	for _, movie := range result.Results {
		fmt.Printf("- %s (%s)\n", movie.Title, movie.ReleaseDate)
	}
}

获取热门电影

func getPopularMovies(client *tmdb.Client) {
	options := map[string]string{
		"page": "1",
	}

	// 获取热门电影
	movies, err := client.GetMoviePopular(options)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("当前热门电影:")
	for _, movie := range movies.Results {
		fmt.Printf("- %s (评分: %.1f)\n", movie.Title, movie.VoteAverage)
	}
}

获取电影图片

func getMovieImages(client *tmdb.Client, movieID int64) {
	// 获取电影图片
	images, err := client.GetMovieImages(movieID, nil)
	if err != nil {
		log.Fatal(err)
	}

	if len(images.Backdrops) > 0 {
		// 获取第一张背景图
		imageURL := "https://image.tmdb.org/t/p/original" + images.Backdrops[0].FilePath
		fmt.Printf("背景图URL: %s\n", imageURL)
	}

	if len(images.Posters) > 0 {
		// 获取第一张海报
		posterURL := "https://image.tmdb.org/t/p/original" + images.Posters[0].FilePath
		fmt.Printf("海报URL: %s\n", posterURL)
	}
}

高级功能

使用选项参数

许多API方法接受选项参数来过滤结果:

func getMoviesWithOptions(client *tmdb.Client) {
	options := map[string]string{
		"page":            "1",
		"language":        "zh-CN",
		"region":          "CN",
		"include_adult":   "false",
		"primary_release_year": "2023",
	}

	movies, err := client.GetDiscoverMovie(options)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("2023年发行的电影:")
	for _, movie := range movies.Results {
		fmt.Printf("- %s\n", movie.Title)
	}
}

处理分页

func getAllPopularMovies(client *tmdb.Client) {
	var allMovies []*tmdb.MovieShort

	page := 1
	totalPages := 1

	for page <= totalPages {
		options := map[string]string{
			"page": fmt.Sprintf("%d", page),
		}

		result, err := client.GetMoviePopular(options)
		if err != nil {
			log.Fatal(err)
		}

		allMovies = append(allMovies, result.Results...)
		totalPages = result.TotalPages
		page++
	}

	fmt.Printf("总共获取了 %d 部热门电影\n", len(allMovies))
}

错误处理

func safeGetMovieDetails(client *tmdb.Client, movieID int64) {
	movie, err := client.GetMovieDetails(movieID, nil)
	if err != nil {
		if tmdbErr, ok := err.(*tmdb.Error); ok {
			fmt.Printf("TMDB API错误: %s (状态码: %d)\n", tmdbErr.Message, tmdbErr.StatusCode)
			return
		}
		log.Fatal(err)
	}

	fmt.Printf("成功获取电影: %s\n", movie.Title)
}

完整示例

package main

import (
	"fmt"
	"log"

	tmdb "github.com/cyruzin/golang-tmdb"
)

func main() {
	// 初始化客户端
	tmdbClient, err := tmdb.Init("your-api-key-here")
	if err != nil {
		log.Fatal(err)
	}

	// 设置中文
	tmdbClient.SetLanguage("zh-CN")

	// 搜索电影
	searchMovies(tmdbClient, "复仇者联盟")

	// 获取特定电影详情
	getMovieDetails(tmdbClient, 299536) // 复仇者联盟3:无限战争

	// 获取热门电影
	getPopularMovies(tmdbClient)
}

// 其他函数定义同上...

注意事项

  1. 确保遵守TMDB API的使用条款
  2. 考虑实现缓存机制以减少API调用
  3. 处理API速率限制(默认每秒40次请求)
  4. 对于生产环境,考虑使用环境变量存储API密钥

这个封装库提供了对TMDB API的全面访问,包括电影、电视节目、人物、搜索等功能。更多详细用法可以参考库的GitHub页面TMDB官方API文档

回到顶部