7556f5481233352e3d29be9b077d2ba7de8ec408

Author
TheEdgeOfRage <git@theedgeofrage.com>
Committer
TheEdgeOfRage <git@theedgeofrage.com>
Date

Message

Fix duration parsing for live streams

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