yogai/fetch/youtube.go

77 lines
1.6 KiB
Go
Raw Permalink Normal View History

2023-07-06 13:25:51 +02:00
package fetch
2023-05-10 20:08:45 +02:00
import (
"strings"
2023-05-27 14:36:22 +02:00
2024-09-17 07:10:35 +02:00
"go-mod.ewintr.nl/yogai/model"
2023-05-27 14:36:22 +02:00
"google.golang.org/api/youtube/v3"
2023-05-10 20:08:45 +02:00
)
type Youtube struct {
Client *youtube.Service
}
func NewYoutube(client *youtube.Service) *Youtube {
return &Youtube{Client: client}
}
2023-05-27 14:36:22 +02:00
func (y *Youtube) Search(channelID model.YoutubeChannelID, pageToken string) ([]model.YoutubeVideoID, string, error) {
call := y.Client.Search.
List([]string{"id"}).
MaxResults(50).
Type("video").
Order("date").
ChannelId(string(channelID))
if pageToken != "" {
call.PageToken(pageToken)
}
response, err := call.Do()
if err != nil {
return []model.YoutubeVideoID{}, "", err
}
ids := make([]model.YoutubeVideoID, len(response.Items))
for i, item := range response.Items {
ids[i] = model.YoutubeVideoID(item.Id.VideoId)
}
return ids, response.NextPageToken, nil
}
func (y *Youtube) FetchMetadata(ytIDs []model.YoutubeVideoID) (map[model.YoutubeVideoID]Metadata, error) {
strIDs := make([]string, len(ytIDs))
for i, id := range ytIDs {
strIDs[i] = string(id)
}
2023-05-10 20:08:45 +02:00
call := y.Client.Videos.
2023-05-31 16:27:35 +02:00
List([]string{"snippet,contentDetails"}).
2023-05-27 14:36:22 +02:00
Id(strings.Join(strIDs, ","))
2023-05-10 20:08:45 +02:00
response, err := call.Do()
if err != nil {
2023-05-27 14:36:22 +02:00
return map[model.YoutubeVideoID]Metadata{}, err
2023-05-10 20:08:45 +02:00
}
2023-05-27 14:36:22 +02:00
mds := make(map[model.YoutubeVideoID]Metadata, len(response.Items))
2023-05-10 20:08:45 +02:00
for _, item := range response.Items {
2023-05-31 16:27:35 +02:00
if item.Snippet == nil {
continue
}
md := Metadata{
2023-05-10 20:08:45 +02:00
Title: item.Snippet.Title,
Description: item.Snippet.Description,
2023-05-31 16:27:35 +02:00
PublishedAt: item.Snippet.PublishedAt,
}
if item.ContentDetails != nil {
md.Duration = item.ContentDetails.Duration
2023-05-10 20:08:45 +02:00
}
2023-05-31 16:27:35 +02:00
mds[model.YoutubeVideoID(item.Id)] = md
2023-05-10 20:08:45 +02:00
}
return mds, nil
}