@@ -4,6 +4,8 @@ package mpd
4
4
5
5
import (
6
6
"encoding/xml"
7
+ "strconv"
8
+ "strings"
7
9
"time"
8
10
)
9
11
@@ -13,6 +15,15 @@ func (d Duration) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
13
15
return xml.Attr {name , d .String ()}, nil
14
16
}
15
17
18
+ func (d * Duration ) UnmarshalXMLAttr (attr xml.Attr ) error {
19
+ dur , err := parseDuration (attr .Value )
20
+ if err != nil {
21
+ return err
22
+ }
23
+ * d = Duration (dur )
24
+ return nil
25
+ }
26
+
16
27
// String renders a Duration in XML Duration Data Type format
17
28
func (d * Duration ) String () string {
18
29
// Largest time is 2540400h10m10.000000000s
@@ -126,3 +137,42 @@ func fmtInt(buf []byte, v uint64) int {
126
137
}
127
138
return w
128
139
}
140
+
141
+ func parseDuration (str string ) (time.Duration , error ) {
142
+ if strings .HasPrefix (str , "PT" ) {
143
+ offset := 2
144
+ var sum float64
145
+
146
+ if i := strings .Index (str [offset :], "H" ); i != - 1 {
147
+ hours , err := strconv .ParseInt (str [offset :offset + i ], 10 , 64 )
148
+ if err != nil {
149
+ return 0 , err
150
+ }
151
+ sum += float64 (hours ) * 60 * 60
152
+ offset += i + 1
153
+ }
154
+ if i := strings .Index (str [offset :], "M" ); i != - 1 {
155
+ minutes , err := strconv .ParseInt (str [offset :offset + i ], 10 , 64 )
156
+ if err != nil {
157
+ return 0 , err
158
+ }
159
+ sum += float64 (minutes ) * 60
160
+ offset += i + 1
161
+ }
162
+ if i := strings .Index (str [offset :], "S" ); i != - 1 {
163
+ seconds , err := strconv .ParseFloat (str [offset :offset + i ], 64 )
164
+ if err != nil {
165
+ return 0 , err
166
+ }
167
+ sum += seconds
168
+ }
169
+
170
+ return time .Duration (sum * float64 (time .Second )), nil
171
+ }
172
+
173
+ dur , err := strconv .ParseFloat (str , 64 )
174
+ if err != nil {
175
+ return 0 , err
176
+ }
177
+ return time .Duration (dur * float64 (time .Second )), nil
178
+ }
0 commit comments