File size: 3,525 Bytes
ca7217f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | package engine
import (
"image"
"github.com/metatube-community/metatube-sdk-go/common/number"
R "github.com/metatube-community/metatube-sdk-go/constant"
"github.com/metatube-community/metatube-sdk-go/detector"
"github.com/metatube-community/metatube-sdk-go/engine/providerid"
"github.com/metatube-community/metatube-sdk-go/imageutil"
"github.com/metatube-community/metatube-sdk-go/model"
mt "github.com/metatube-community/metatube-sdk-go/provider"
)
// Default position constants for different kind of images.
const (
defaultActorPrimaryImagePosition = 0.5
defaultMoviePrimaryImagePosition = 1.0
defaultMovieThumbImagePosition = 0.5
defaultMovieBackdropImagePosition = 0.0
)
func (e *Engine) GetActorPrimaryImage(pid providerid.ProviderID) (image.Image, error) {
info, err := e.GetActorInfoByProviderID(pid, true)
if err != nil {
return nil, err
}
if len(info.Images) == 0 {
return nil, mt.ErrImageNotFound
}
return e.GetImageByURL(
e.MustGetActorProviderByName(pid.Provider), info.Images[0],
R.PrimaryImageRatio, defaultActorPrimaryImagePosition, false,
)
}
func (e *Engine) GetMoviePrimaryImage(pid providerid.ProviderID, ratio, pos float64) (image.Image, error) {
url, info, err := e.getPreferredMovieImageURLAndInfo(pid, true)
if err != nil {
return nil, err
}
if ratio < 0 /* default primary ratio */ {
ratio = R.PrimaryImageRatio
}
var auto bool
if pos < 0 /* manual position disabled */ {
pos = defaultMoviePrimaryImagePosition
auto = number.RequiresFaceDetection(info.Number)
}
return e.GetImageByURL(
e.MustGetMovieProviderByName(pid.Provider),
url, ratio, pos, auto,
)
}
func (e *Engine) GetMovieThumbImage(pid providerid.ProviderID) (image.Image, error) {
url, _, err := e.getPreferredMovieImageURLAndInfo(pid, false)
if err != nil {
return nil, err
}
return e.GetImageByURL(
e.MustGetMovieProviderByName(pid.Provider), url,
R.ThumbImageRatio, defaultMovieThumbImagePosition, false,
)
}
func (e *Engine) GetMovieBackdropImage(pid providerid.ProviderID) (image.Image, error) {
url, _, err := e.getPreferredMovieImageURLAndInfo(pid, false)
if err != nil {
return nil, err
}
return e.GetImageByURL(
e.MustGetMovieProviderByName(pid.Provider), url,
R.BackdropImageRatio, defaultMovieBackdropImagePosition, false,
)
}
func (e *Engine) GetImageByURL(provider mt.Provider, url string, ratio, pos float64, auto bool) (img image.Image, err error) {
if img, err = e.getImageByURL(provider, url); err != nil {
return
}
if auto {
// only turn on advanced for movie providers.
advancedMode := e.IsMovieProvider(provider.Name())
axisR, found := detector.FindPrimaryFaceAxisRatio(img, ratio, advancedMode)
if found {
pos = axisR // override the default position with detected position.
}
}
return imageutil.CropImagePosition(img, ratio, pos), nil
}
func (e *Engine) getImageByURL(provider mt.Provider, url string) (img image.Image, err error) {
resp, err := e.Fetch(url, provider)
if err != nil {
return
}
defer resp.Body.Close()
img, _, err = imageutil.Decode(resp.Body)
return
}
func (e *Engine) getPreferredMovieImageURLAndInfo(pid providerid.ProviderID, thumb bool) (url string, info *model.MovieInfo, err error) {
info, err = e.GetMovieInfoByProviderID(pid, true)
if err != nil {
return
}
url = info.CoverURL
if thumb && info.BigThumbURL != "" /* big thumb > cover */ {
url = info.BigThumbURL
} else if !thumb && info.BigCoverURL != "" /* big cover > cover */ {
url = info.BigCoverURL
}
return
}
|