2
2
using Sharpcaster . Extensions ;
3
3
using Sharpcaster . Interfaces ;
4
4
using Sharpcaster . Messages . Connection ;
5
+ using Sharpcaster . Messages . Media ;
6
+ using Sharpcaster . Models . Media ;
7
+ using System . Linq ;
5
8
using System . Text . Json ;
6
9
using Xunit ;
7
10
using Sharpcaster . Test . helper ;
@@ -19,5 +22,88 @@ public void TestConnectMessage()
19
22
var output = JsonSerializer . Serialize ( connectMessage , SharpcasteSerializationContext . Default . ConnectMessage ) ;
20
23
Assert . Equal ( "{\" requestId\" :" + requestId + ",\" type\" :\" CONNECT\" }" , output ) ;
21
24
}
25
+
26
+ [ Fact ]
27
+ public void TestMediaStatusWithGermanUmlautTitle ( )
28
+ {
29
+ // Test parsing a MEDIA_STATUS message with German umlaut characters in the title
30
+ var mediaStatusJson = """
31
+ {
32
+ "type": "MEDIA_STATUS",
33
+ "status": [{
34
+ "mediaSessionId": 1,
35
+ "playbackRate": 1,
36
+ "playerState": "PLAYING",
37
+ "currentTime": 80288.353693,
38
+ "supportedMediaCommands": 274447,
39
+ "volume": {"level": 1, "muted": false},
40
+ "activeTrackIds": [],
41
+ "media": {
42
+ "contentId": "https://orf-live.ors-shoutcast.at/oe1-q1a",
43
+ "streamType": 1,
44
+ "contentType": "audio/mp4",
45
+ "metadata": {
46
+ "metadataType": 0,
47
+ "title": "Ö1-(128bps)"
48
+ },
49
+ "duration": null,
50
+ "mediaCategory": "AUDIO",
51
+ "tracks": [],
52
+ "breakClips": [],
53
+ "breaks": []
54
+ },
55
+ "currentItemId": 1,
56
+ "items": [{
57
+ "itemId": 1,
58
+ "media": {
59
+ "contentId": "https://orf-live.ors-shoutcast.at/oe1-q1a",
60
+ "streamType": 1,
61
+ "contentType": "audio/mp4",
62
+ "metadata": {
63
+ "metadataType": 0,
64
+ "title": "Ö1-(128bps)"
65
+ },
66
+ "duration": null,
67
+ "mediaCategory": "AUDIO"
68
+ },
69
+ "autoplay": true,
70
+ "orderId": 0
71
+ }],
72
+ "repeatMode": "REPEAT_OFF"
73
+ }],
74
+ "requestId": 1345463442
75
+ }
76
+ """ ;
77
+
78
+ // Parse the JSON message
79
+ MediaStatusMessage mediaStatusMessage = JsonSerializer . Deserialize ( mediaStatusJson , SharpcasteSerializationContext . Default . MediaStatusMessage ) ;
80
+
81
+ // Verify the message was parsed correctly
82
+ Assert . NotNull ( mediaStatusMessage ) ;
83
+ Assert . NotNull ( mediaStatusMessage . Status ) ;
84
+ Assert . Single ( mediaStatusMessage . Status ) ;
85
+
86
+ var status = mediaStatusMessage . Status . First ( ) ;
87
+ Assert . Equal ( 1 , status . MediaSessionId ) ;
88
+ Assert . Equal ( PlayerStateType . Playing , status . PlayerState ) ;
89
+
90
+ // Verify the German umlaut title is preserved correctly
91
+ Assert . NotNull ( status . Media ) ;
92
+ Assert . NotNull ( status . Media . Metadata ) ;
93
+ Assert . Equal ( "Ö1-(128bps)" , status . Media . Metadata . Title ) ;
94
+
95
+ // Verify queue item also has correct title
96
+ Assert . NotNull ( status . Items ) ;
97
+ Assert . Single ( status . Items ) ;
98
+ Assert . NotNull ( status . Items [ 0 ] . Media ) ;
99
+ Assert . NotNull ( status . Items [ 0 ] . Media . Metadata ) ;
100
+ Assert . Equal ( "Ö1-(128bps)" , status . Items [ 0 ] . Media . Metadata . Title ) ;
101
+
102
+ // Verify live stream properties
103
+ Assert . Equal ( "https://orf-live.ors-shoutcast.at/oe1-q1a" , status . Media . ContentId ) ;
104
+ Assert . Equal ( StreamType . Live , status . Media . StreamType ) ;
105
+ Assert . Equal ( "audio/mp4" , status . Media . ContentType ) ;
106
+ Assert . Null ( status . Media . Duration ) ;
107
+ }
22
108
}
23
109
}
0 commit comments