🚸 EnsureService with error instead of panic

This commit is contained in:
OpenWaygate committed 2026-04-06 22:04:05 +08:00
1 parent ac6fd7cde1
commit 10cbf87428
23 files changed
+154 -53

No files matched your search

+3 -1
View File
@@ -46,7 +46,9 @@ func NewActivity(opts ...Option) IActivity[youtube.Activity] {
}
func (a *Activity) Get() ([]*youtube.Activity, error) {
a.EnsureService()
if err := a.EnsureService(); err != nil {
return nil, err
}
call := a.Service.Activities.List(a.Parts)
if a.ChannelId != "" {
call = call.ChannelId(a.ChannelId)
+12 -4
View File
@@ -69,7 +69,9 @@ func (c *Caption) GetFields() *common.Fields {
}
func (c *Caption) Get() ([]*youtube.Caption, error) {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return nil, err
}
call := c.Service.Captions.List(c.Parts, c.VideoId)
if len(c.Ids) > 0 {
call = call.Id(c.Ids...)
@@ -119,7 +121,9 @@ func (c *Caption) List(writer io.Writer) error {
}
func (c *Caption) Insert(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
file, err := pkg.Root.Open(c.File)
if err != nil {
return errors.Join(errInsertCaption, err)
@@ -246,7 +250,9 @@ func (c *Caption) Update(writer io.Writer) error {
}
func (c *Caption) Delete(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
for _, id := range c.Ids {
call := c.Service.Captions.Delete(id)
if c.OnBehalfOf != "" {
@@ -267,7 +273,9 @@ func (c *Caption) Delete(writer io.Writer) error {
}
func (c *Caption) Download(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
call := c.Service.Captions.Download(c.Ids[0])
if c.Tfmt != "" {
call = call.Tfmt(c.Tfmt)
+3 -1
View File
@@ -59,7 +59,9 @@ func NewChannel(opts ...Option) IChannel[youtube.Channel] {
}
func (c *Channel) Get() ([]*youtube.Channel, error) {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return nil, err
}
call := c.Service.Channels.List(c.Parts)
if c.CategoryId != "" {
call = call.CategoryId(c.CategoryId)
+3 -1
View File
@@ -43,7 +43,9 @@ func NewChannelBanner(opts ...Option) IChannelBanner {
}
func (cb *ChannelBanner) Insert(writer io.Writer) error {
cb.EnsureService()
if err := cb.EnsureService(); err != nil {
return err
}
file, err := pkg.Root.Open(cb.File)
if err != nil {
return errors.Join(errInsertChannelBanner, err)
+6 -2
View File
@@ -55,7 +55,9 @@ func (cs *ChannelSection) GetFields() *common.Fields {
func (cs *ChannelSection) Get() (
[]*youtube.ChannelSection, error,
) {
cs.EnsureService()
if err := cs.EnsureService(); err != nil {
return nil, err
}
call := cs.Service.ChannelSections.List(cs.Parts)
if len(cs.Ids) > 0 {
call = call.Id(cs.Ids...)
@@ -105,7 +107,9 @@ func (cs *ChannelSection) List(writer io.Writer) error {
}
func (cs *ChannelSection) Delete(writer io.Writer) error {
cs.EnsureService()
if err := cs.EnsureService(); err != nil {
return err
}
for _, id := range cs.Ids {
call := cs.Service.ChannelSections.Delete(id)
if cs.OnBehalfOfContentOwner != "" {
+18 -6
View File
@@ -62,7 +62,9 @@ func NewComment(opts ...Option) IComment[youtube.Comment] {
}
func (c *Comment) Get() ([]*youtube.Comment, error) {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return nil, err
}
call := c.Service.Comments.List(c.Parts)
if len(c.Ids) > 0 && c.Ids[0] != "" {
call = call.Id(c.Ids...)
@@ -135,7 +137,9 @@ func (c *Comment) List(writer io.Writer) error {
}
func (c *Comment) Insert(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
comment := &youtube.Comment{
Snippet: &youtube.CommentSnippet{
AuthorChannelId: &youtube.CommentSnippetAuthorChannelId{
@@ -171,7 +175,9 @@ func (c *Comment) Insert(writer io.Writer) error {
}
func (c *Comment) Update(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
c.Parts = []string{"id", "snippet"}
comments, err := c.Get()
@@ -214,7 +220,9 @@ func (c *Comment) Update(writer io.Writer) error {
}
func (c *Comment) MarkAsSpam(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
call := c.Service.Comments.MarkAsSpam(c.Ids)
err := call.Do()
if err != nil {
@@ -234,7 +242,9 @@ func (c *Comment) MarkAsSpam(writer io.Writer) error {
}
func (c *Comment) SetModerationStatus(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
call := c.Service.Comments.SetModerationStatus(c.Ids, c.ModerationStatus)
if c.BanAuthor != nil {
@@ -262,7 +272,9 @@ func (c *Comment) SetModerationStatus(writer io.Writer) error {
}
func (c *Comment) Delete(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
for _, id := range c.Ids {
call := c.Service.Comments.Delete(id)
err := call.Do()
+6 -2
View File
@@ -54,7 +54,9 @@ func NewCommentThread(opts ...Option) ICommentThread[youtube.CommentThread] {
}
func (c *CommentThread) Get() ([]*youtube.CommentThread, error) {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return nil, err
}
call := c.Service.CommentThreads.List(c.Parts)
if len(c.Ids) > 0 {
call = call.Id(c.Ids...)
@@ -136,7 +138,9 @@ func (c *CommentThread) List(writer io.Writer) error {
}
func (c *CommentThread) Insert(writer io.Writer) error {
c.EnsureService()
if err := c.EnsureService(); err != nil {
return err
}
ct := &youtube.CommentThread{
Snippet: &youtube.CommentThreadSnippet{
ChannelId: c.ChannelId,
+4 -3
View File
@@ -21,22 +21,23 @@ func (d *Fields) GetFields() *Fields {
return d
}
func (d *Fields) EnsureService() {
func (d *Fields) EnsureService() error {
if d.Service == nil {
svc, err := auth.NewY2BService(
auth.WithCredential("", pkg.Root.FS()),
auth.WithCacheToken("", pkg.Root.FS()),
).GetService()
if err != nil {
panic(fmt.Sprintf("failed to create YouTube service: %v", err))
return fmt.Errorf("failed to create YouTube service: %w", err)
}
d.Service = svc
}
return nil
}
type HasFields interface {
GetFields() *Fields
EnsureService()
EnsureService() error
}
func WithParts[T HasFields](parts []string) func(T) {
+3 -1
View File
@@ -41,7 +41,9 @@ func NewI18nLanguage(opts ...Option) II18nLanguage[youtube.I18nLanguage] {
func (i *I18nLanguage) Get() (
[]*youtube.I18nLanguage, error,
) {
i.EnsureService()
if err := i.EnsureService(); err != nil {
return nil, err
}
call := i.Service.I18nLanguages.List(i.Parts)
if i.Hl != "" {
call = call.Hl(i.Hl)
+3 -1
View File
@@ -39,7 +39,9 @@ func NewI18nRegion(opts ...Option) II18nRegion[youtube.I18nRegion] {
}
func (i *I18nRegion) Get() ([]*youtube.I18nRegion, error) {
i.EnsureService()
if err := i.EnsureService(); err != nil {
return nil, err
}
call := i.Service.I18nRegions.List(i.Parts)
if i.Hl != "" {
call = call.Hl(i.Hl)
+3 -1
View File
@@ -43,7 +43,9 @@ func NewMember(opts ...Option) IMember[youtube.Member] {
}
func (m *Member) Get() ([]*youtube.Member, error) {
m.EnsureService()
if err := m.EnsureService(); err != nil {
return nil, err
}
call := m.Service.Members.List(m.Parts)
if m.MemberChannelId != "" {
call = call.FilterByMemberChannelId(m.MemberChannelId)
+3 -1
View File
@@ -42,7 +42,9 @@ func (m *MembershipsLevel) GetFields() *common.Fields {
}
func (m *MembershipsLevel) Get() ([]*youtube.MembershipsLevel, error) {
m.EnsureService()
if err := m.EnsureService(); err != nil {
return nil, err
}
call := m.Service.MembershipsLevels.List(m.Parts)
res, err := call.Do()
if err != nil {
+12 -4
View File
@@ -59,7 +59,9 @@ func NewPlaylist(opts ...Option) IPlaylist[youtube.Playlist] {
}
func (p *Playlist) Get() ([]*youtube.Playlist, error) {
p.EnsureService()
if err := p.EnsureService(); err != nil {
return nil, err
}
call := p.Service.Playlists.List(p.Parts)
if len(p.Ids) > 0 {
@@ -136,7 +138,9 @@ func (p *Playlist) List(writer io.Writer) error {
}
func (p *Playlist) Insert(writer io.Writer) error {
p.EnsureService()
if err := p.EnsureService(); err != nil {
return err
}
upload := &youtube.Playlist{
Snippet: &youtube.PlaylistSnippet{
Title: p.Title,
@@ -175,7 +179,9 @@ func (p *Playlist) Insert(writer io.Writer) error {
}
func (p *Playlist) Update(writer io.Writer) error {
p.EnsureService()
if err := p.EnsureService(); err != nil {
return err
}
playlists, err := p.Get()
if err != nil {
return errors.Join(errUpdatePlaylist, err)
@@ -223,7 +229,9 @@ func (p *Playlist) Update(writer io.Writer) error {
}
func (p *Playlist) Delete(writer io.Writer) error {
p.EnsureService()
if err := p.EnsureService(); err != nil {
return err
}
for _, id := range p.Ids {
call := p.Service.Playlists.Delete(id)
if p.OnBehalfOfContentOwner != "" {
+12 -4
View File
@@ -58,7 +58,9 @@ func NewPlaylistImage(opts ...Option) IPlaylistImage[youtube.PlaylistImage] {
}
func (pi *PlaylistImage) Get() ([]*youtube.PlaylistImage, error) {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return nil, err
}
call := pi.Service.PlaylistImages.List()
call = call.Part(pi.Parts...)
if pi.Parent != "" {
@@ -122,7 +124,9 @@ func (pi *PlaylistImage) List(writer io.Writer) error {
}
func (pi *PlaylistImage) Insert(writer io.Writer) error {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return err
}
file, err := pkg.Root.Open(pi.File)
if err != nil {
return errors.Join(errInsertPlaylistImage, err)
@@ -168,7 +172,9 @@ func (pi *PlaylistImage) Insert(writer io.Writer) error {
}
func (pi *PlaylistImage) Update(writer io.Writer) error {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return err
}
pi.Parts = []string{"id", "kind", "snippet"}
playlistImages, err := pi.Get()
if err != nil {
@@ -226,7 +232,9 @@ func (pi *PlaylistImage) Update(writer io.Writer) error {
}
func (pi *PlaylistImage) Delete(writer io.Writer) error {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return err
}
for _, id := range pi.Ids {
call := pi.Service.PlaylistImages.Delete()
call = call.Id(id)
+12 -4
View File
@@ -60,7 +60,9 @@ func NewPlaylistItem(opts ...Option) IPlaylistItem[youtube.PlaylistItem] {
}
func (pi *PlaylistItem) Get() ([]*youtube.PlaylistItem, error) {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return nil, err
}
call := pi.Service.PlaylistItems.List(pi.Parts)
if len(pi.Ids) > 0 {
call = call.Id(pi.Ids...)
@@ -145,7 +147,9 @@ func (pi *PlaylistItem) List(writer io.Writer) error {
}
func (pi *PlaylistItem) Insert(writer io.Writer) error {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return err
}
var resourceId *youtube.ResourceId
switch pi.Kind {
case "video":
@@ -203,7 +207,9 @@ func (pi *PlaylistItem) Insert(writer io.Writer) error {
}
func (pi *PlaylistItem) Update(writer io.Writer) error {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return err
}
pi.Parts = []string{"id", "snippet", "status"}
playlistItems, err := pi.Get()
@@ -250,7 +256,9 @@ func (pi *PlaylistItem) Update(writer io.Writer) error {
}
func (pi *PlaylistItem) Delete(writer io.Writer) error {
pi.EnsureService()
if err := pi.EnsureService(); err != nil {
return err
}
for _, id := range pi.Ids {
call := pi.Service.PlaylistItems.Delete(id)
if pi.OnBehalfOfContentOwner != "" {
+3 -1
View File
@@ -68,7 +68,9 @@ func NewSearch(opts ...Option) ISearch[youtube.SearchResult] {
}
func (s *Search) Get() ([]*youtube.SearchResult, error) {
s.EnsureService()
if err := s.EnsureService(); err != nil {
return nil, err
}
call := s.Service.Search.List(s.Parts)
if s.ChannelId != "" {
call = call.ChannelId(s.ChannelId)
+9 -3
View File
@@ -58,7 +58,9 @@ func NewSubscription(opts ...Option) ISubscription[youtube.Subscription] {
}
func (s *Subscription) Get() ([]*youtube.Subscription, error) {
s.EnsureService()
if err := s.EnsureService(); err != nil {
return nil, err
}
call := s.Service.Subscriptions.List(s.Parts)
if len(s.Ids) > 0 {
call = call.Id(s.Ids...)
@@ -150,7 +152,9 @@ func (s *Subscription) List(writer io.Writer) error {
}
func (s *Subscription) Insert(writer io.Writer) error {
s.EnsureService()
if err := s.EnsureService(); err != nil {
return err
}
subscription := &youtube.Subscription{
Snippet: &youtube.SubscriptionSnippet{
ChannelId: s.SubscriberChannelId,
@@ -180,7 +184,9 @@ func (s *Subscription) Insert(writer io.Writer) error {
}
func (s *Subscription) Delete(writer io.Writer) error {
s.EnsureService()
if err := s.EnsureService(); err != nil {
return err
}
for _, id := range s.Ids {
call := s.Service.Subscriptions.Delete(id)
err := call.Do()
+3 -1
View File
@@ -41,7 +41,9 @@ func NewSuperChatEvent(opts ...Option) ISuperChatEvent[youtube.SuperChatEvent] {
}
func (s *SuperChatEvent) Get() ([]*youtube.SuperChatEvent, error) {
s.EnsureService()
if err := s.EnsureService(); err != nil {
return nil, err
}
call := s.Service.SuperChatEvents.List(s.Parts)
if s.Hl != "" {
call = call.Hl(s.Hl)
+3 -1
View File
@@ -38,7 +38,9 @@ func NewThumbnail(opts ...Option) IThumbnail {
}
func (t *Thumbnail) Set(writer io.Writer) error {
t.EnsureService()
if err := t.EnsureService(); err != nil {
return err
}
file, err := pkg.Root.Open(t.File)
if err != nil {
return errors.Join(errSetThumbnail, err)
+21 -7
View File
@@ -90,7 +90,9 @@ func NewVideo(opts ...Option) IVideo[youtube.Video] {
}
func (v *Video) Get() ([]*youtube.Video, error) {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return nil, err
}
call := v.Service.Videos.List(v.Parts)
if len(v.Ids) > 0 {
call = call.Id(v.Ids...)
@@ -188,7 +190,9 @@ func (v *Video) List(writer io.Writer) error {
}
func (v *Video) Insert(writer io.Writer) error {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return err
}
file, err := pkg.Root.Open(v.File)
if err != nil {
return errors.Join(errInsertVideo, err)
@@ -295,7 +299,9 @@ func (v *Video) Insert(writer io.Writer) error {
}
func (v *Video) Update(writer io.Writer) error {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return err
}
v.Parts = []string{"id", "snippet", "status"}
videos, err := v.Get()
@@ -385,7 +391,9 @@ func (v *Video) Update(writer io.Writer) error {
}
func (v *Video) Rate(writer io.Writer) error {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return err
}
for _, id := range v.Ids {
call := v.Service.Videos.Rate(id, v.Rating)
err := call.Do()
@@ -398,7 +406,9 @@ func (v *Video) Rate(writer io.Writer) error {
}
func (v *Video) GetRating(writer io.Writer) error {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return err
}
call := v.Service.Videos.GetRating(v.Ids)
if v.OnBehalfOfContentOwner != "" {
call = call.OnBehalfOfContentOwner(v.OnBehalfOfContentOwner)
@@ -427,7 +437,9 @@ func (v *Video) GetRating(writer io.Writer) error {
}
func (v *Video) Delete(writer io.Writer) error {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return err
}
for _, id := range v.Ids {
call := v.Service.Videos.Delete(id)
if v.OnBehalfOfContentOwner != "" {
@@ -444,7 +456,9 @@ func (v *Video) Delete(writer io.Writer) error {
}
func (v *Video) ReportAbuse(writer io.Writer) error {
v.EnsureService()
if err := v.EnsureService(); err != nil {
return err
}
for _, id := range v.Ids {
videoAbuseReport := &youtube.VideoAbuseReport{
Comments: v.Comments,
@@ -41,7 +41,9 @@ func NewVideoAbuseReportReason(opt ...Option) IVideoAbuseReportReason[youtube.Vi
func (va *VideoAbuseReportReason) Get() (
[]*youtube.VideoAbuseReportReason, error,
) {
va.EnsureService()
if err := va.EnsureService(); err != nil {
return nil, err
}
call := va.Service.VideoAbuseReportReasons.List(va.Parts)
if va.Hl != "" {
call = call.Hl(va.Hl)
+3 -1
View File
@@ -41,7 +41,9 @@ func NewVideoCategory(opt ...Option) IVideoCategory[youtube.VideoCategory] {
}
func (vc *VideoCategory) Get() ([]*youtube.VideoCategory, error) {
vc.EnsureService()
if err := vc.EnsureService(); err != nil {
return nil, err
}
call := vc.Service.VideoCategories.List(vc.Parts)
if len(vc.Ids) > 0 {
call = call.Id(vc.Ids...)
+6 -2
View File
@@ -47,7 +47,9 @@ func NewWatermark(opts ...Option) IWatermark {
}
func (w *Watermark) Set(writer io.Writer) error {
w.EnsureService()
if err := w.EnsureService(); err != nil {
return err
}
file, err := pkg.Root.Open(w.File)
if err != nil {
return errors.Join(errSetWatermark, err)
@@ -89,7 +91,9 @@ func (w *Watermark) Set(writer io.Writer) error {
}
func (w *Watermark) Unset(writer io.Writer) error {
w.EnsureService()
if err := w.EnsureService(); err != nil {
return err
}
call := w.Service.Watermarks.Unset(w.ChannelId)
if w.OnBehalfOfContentOwner != "" {
call = call.OnBehalfOfContentOwner(w.OnBehalfOfContentOwner)