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+}