Diff
1diff --git a/lib/clients/youtube/get_durations.go b/lib/clients/youtube/get_durations.go
2index 31fda59acd5df03109b8dad99259b1ad506ef943..bad0c3c1eec49432f17c50ee3a22c622feaf1d9e 100644
3--- a/lib/clients/youtube/get_durations.go
4+++ b/lib/clients/youtube/get_durations.go
5@@ -41,6 +41,15 @@ type APIContentDetails struct {
6 Definition string `json:"definition"`
7 }
8
9+func parseISO8601Duration(s string) (time.Duration, error) {
10+ if s == "P0D" {
11+ return 0, nil
12+ }
13+ s = strings.TrimPrefix(s, "PT")
14+ s = strings.ToLower(s)
15+ return time.ParseDuration(s)
16+}
17+
18 func (c *youTubeClient) GetVideoDurations(ctx context.Context, videos map[string]*models.Video) error {
19 if len(videos) == 0 {
20 return nil
21@@ -95,17 +104,15 @@ func (c *youTubeClient) GetVideoDurations(ctx context.Context, videos map[string
22 }
23
24 for _, v := range respData.Items {
25- durationStr := strings.TrimPrefix(v.ContentDetails.Duration, "PT")
26- durationStr = strings.ToLower(durationStr)
27- duration, err := time.ParseDuration(durationStr)
28+ duration, err := parseISO8601Duration(v.ContentDetails.Duration)
29 if err != nil {
30 c.log.Error(
31 "Failed to parse video duration",
32 "error", err,
33- "durationString", durationStr,
34+ "durationString", v.ContentDetails.Duration,
35 "videoID", v.ID,
36 )
37- return fmt.Errorf("failed to parse video duration [%v]: %w", durationStr, err)
38+ return fmt.Errorf("failed to parse video duration [%v]: %w", v.ContentDetails.Duration, err)
39 }
40 videos[v.ID].DurationSeconds = int(math.Round(duration.Seconds()))
41 }
42diff --git a/lib/clients/youtube/get_video_metadata.go b/lib/clients/youtube/get_video_metadata.go
43index 7f10aecbc1d1ead762bbb02af592229948b6da10..46f8488c8abf59a657afea055536820f6b73984d 100644
44--- a/lib/clients/youtube/get_video_metadata.go
45+++ b/lib/clients/youtube/get_video_metadata.go
46@@ -8,7 +8,6 @@ import (
47 "math"
48 "net/http"
49 "net/url"
50- "strings"
51 "time"
52
53 "github.com/TheEdgeOfRage/ytrssil-api/models"
54@@ -75,11 +74,9 @@ func (c *youTubeClient) GetVideoMetadata(ctx context.Context, videoID string) (*
55 }
56 video.PublishedTime = publishedTime
57
58- durationStr := strings.TrimPrefix(videoData.ContentDetails.Duration, "PT")
59- durationStr = strings.ToLower(durationStr)
60- duration, err := time.ParseDuration(durationStr)
61+ duration, err := parseISO8601Duration(videoData.ContentDetails.Duration)
62 if err != nil {
63- return nil, fmt.Errorf("failed to parse video duration [%v]: %w", durationStr, err)
64+ return nil, fmt.Errorf("failed to parse video duration [%v]: %w", videoData.ContentDetails.Duration, err)
65 }
66 video.DurationSeconds = int(math.Round(duration.Seconds()))
67