75 lines
1.4 KiB
Go
75 lines
1.4 KiB
Go
// Copyright 2025 eat-pray-ai & OpenWaygate
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package thumbnail
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/eat-pray-ai/yutu/pkg"
|
|
"github.com/eat-pray-ai/yutu/pkg/common"
|
|
)
|
|
|
|
var (
|
|
errSetThumbnail = errors.New("failed to set thumbnail")
|
|
)
|
|
|
|
type Thumbnail struct {
|
|
*common.Fields
|
|
File string `yaml:"file" json:"file,omitempty"`
|
|
VideoId string `yaml:"video_id" json:"video_id,omitempty"`
|
|
}
|
|
|
|
type IThumbnail interface {
|
|
Set(io.Writer) error
|
|
}
|
|
|
|
type Option func(*Thumbnail)
|
|
|
|
func NewThumbnail(opts ...Option) IThumbnail {
|
|
t := &Thumbnail{Fields: &common.Fields{}}
|
|
for _, opt := range opts {
|
|
opt(t)
|
|
}
|
|
return t
|
|
}
|
|
|
|
func (t *Thumbnail) Set(writer io.Writer) error {
|
|
if err := t.EnsureService(); err != nil {
|
|
return err
|
|
}
|
|
file, err := pkg.Root.Open(t.File)
|
|
if err != nil {
|
|
return errors.Join(errSetThumbnail, err)
|
|
}
|
|
|
|
call := t.Service.Thumbnails.Set(t.VideoId).Media(file)
|
|
res, err := call.Do()
|
|
if err != nil {
|
|
return errors.Join(errSetThumbnail, err)
|
|
}
|
|
|
|
common.PrintResult(
|
|
t.Output, res, writer, "Thumbnail set for video %s", t.VideoId,
|
|
)
|
|
return nil
|
|
}
|
|
|
|
func WithVideoId(videoId string) Option {
|
|
return func(t *Thumbnail) {
|
|
t.VideoId = videoId
|
|
}
|
|
}
|
|
|
|
func WithFile(file string) Option {
|
|
return func(t *Thumbnail) {
|
|
t.File = file
|
|
}
|
|
}
|
|
|
|
var (
|
|
WithOutput = common.WithOutput[*Thumbnail]
|
|
WithService = common.WithService[*Thumbnail]
|
|
)
|