225793c0942a6a46d15e5a9399c65c37d2bf964c

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

Message

Parse days values in duration

Diff

 1diff --git a/lib/clients/youtube/get_durations.go b/lib/clients/youtube/get_durations.go
 2index c604921f0a4c88594931f481836b35766e1d7d16..a42463e30256e1ca3febdc8813a757d0026ad607 100644
 3--- a/lib/clients/youtube/get_durations.go
 4+++ b/lib/clients/youtube/get_durations.go
 5@@ -51,9 +51,30 @@ func parseISO8601Duration(s string) (time.Duration, error) {
 6 	if s == "P0D" {
 7 		return 0, nil
 8 	}
 9-	s = strings.TrimPrefix(s, "PT")
10-	s = strings.ToLower(s)
11-	return time.ParseDuration(s)
12+
13+	var total time.Duration
14+	s = strings.ToLower(strings.TrimPrefix(s, "P"))
15+
16+	if i := strings.Index(s, "d"); i != -1 {
17+		days, err := time.ParseDuration(s[:i] + "h")
18+		if err != nil {
19+			return 0, fmt.Errorf("failed to parse days: %w", err)
20+		}
21+		total += days * 24
22+		s = s[i+1:]
23+	}
24+
25+	s = strings.TrimPrefix(s, "t")
26+	if s == "" {
27+		return total, nil
28+	}
29+
30+	d, err := time.ParseDuration(s)
31+	if err != nil {
32+		return 0, err
33+	}
34+
35+	return total + d, nil
36 }
37 
38 func (c *youTubeClient) GetVideoDurations(ctx context.Context, videos map[string]*models.Video) error {
39diff --git a/lib/clients/youtube/get_durations_test.go b/lib/clients/youtube/get_durations_test.go
40new file mode 100644
41index 0000000000000000000000000000000000000000..26cba87cf6411f48e7a6bb66a4f6b9b6e0f55ba9
42--- /dev/null
43+++ b/lib/clients/youtube/get_durations_test.go
44@@ -0,0 +1,34 @@
45+package youtube
46+
47+import (
48+	"testing"
49+	"time"
50+)
51+
52+func TestParseISO8601Duration(t *testing.T) {
53+	tests := []struct {
54+		input    string
55+		expected time.Duration
56+	}{
57+		{"P0D", 0},
58+		{"PT5M", 5 * time.Minute},
59+		{"PT1H30M", 90 * time.Minute},
60+		{"PT3M42S", 3*time.Minute + 42*time.Second},
61+		{"P1DT5H3M42S", 29*time.Hour + 3*time.Minute + 42*time.Second},
62+		{"P2DT0S", 48 * time.Hour},
63+		{"P1D", 24 * time.Hour},
64+		{"PT0S", 0},
65+	}
66+
67+	for _, tt := range tests {
68+		t.Run(tt.input, func(t *testing.T) {
69+			got, err := parseISO8601Duration(tt.input)
70+			if err != nil {
71+				t.Fatalf("parseISO8601Duration(%q) returned error: %v", tt.input, err)
72+			}
73+			if got != tt.expected {
74+				t.Errorf("parseISO8601Duration(%q) = %v, want %v", tt.input, got, tt.expected)
75+			}
76+		})
77+	}
78+}