Skip to content

Commit

Permalink
added Channel properties to ChromecastClient to make usage easier
Browse files Browse the repository at this point in the history
  • Loading branch information
Tapanila committed Jul 20, 2024
1 parent f29751a commit dbf5c87
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 79 deletions.
7 changes: 3 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@ https://nuget.org/packages/SharpCaster/
## Finding chromecast devices from network
```cs
IChromecastLocator locator = new MdnsChromecastLocator();
var chromecasts = await locator.FindReceiversAsync();
//If that does not return devices on desktop then you can use this, Where 192.168.1.2 is your machines local ip
var chromecasts = await locator.FindReceiversAsync("192.168.1.2");
var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(1500));
var chromecasts = await locator.FindReceiversAsync(source.Token);
```
## Connecting to chromecast device, launch application and load media
```cs
Expand All @@ -34,7 +33,7 @@ var media = new Media
{
ContentUrl = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4"
};
_ = await client.GetChannel<IMediaChannel>().LoadAsync(media);
_ = await client.MediaChannel.LoadAsync(media);
```

## SharpCaster Demo
Expand Down
8 changes: 4 additions & 4 deletions Sharpcaster.Test/ChromecastConnectionTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@ public async Task TestingHeartBeat(ChromecastReceiver receiver)
int commandsToRun = 10;

//We are setting up an event to listen to status change. Because we don't know when the video has started to play
client.GetChannel<IMediaChannel>().StatusChanged += (object sender, EventArgs e) =>
client.MediaChannel.StatusChanged += (object sender, EventArgs e) =>
{
_autoResetEvent.Set();
};

mediaStatus = await client.GetChannel<IMediaChannel>().LoadAsync(media);
mediaStatus = await client.MediaChannel.LoadAsync(media);

_autoResetEvent.WaitOne(3000);

Expand All @@ -98,14 +98,14 @@ public async Task TestingHeartBeat(ChromecastReceiver receiver)
if (i % 2 == 0)
{
await Task.Delay(1000);
mediaStatus = await client.GetChannel<IMediaChannel>().PauseAsync();
mediaStatus = await client.MediaChannel.PauseAsync();
Assert.Equal(PlayerStateType.Paused, mediaStatus.PlayerState);
runSequence += pause;
}
else
{
await Task.Delay(1000);
mediaStatus = await client.GetChannel<IMediaChannel>().PlayAsync();
mediaStatus = await client.MediaChannel.PlayAsync();
Assert.Equal(PlayerStateType.Playing, mediaStatus.PlayerState);
runSequence += play;
}
Expand Down
2 changes: 1 addition & 1 deletion Sharpcaster.Test/LoggingTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public async Task TestPlayMediaWorksWithoutLogging(ChromecastReceiver receiver)
ContentUrl = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4"
};

MediaStatus status = await client.GetChannel<IMediaChannel>().LoadAsync(media);
MediaStatus status = await client.MediaChannel.LoadAsync(media);

Assert.Equal(PlayerStateType.Playing, status.PlayerState);
Assert.Single(status.Items);
Expand Down
76 changes: 36 additions & 40 deletions Sharpcaster.Test/MediaChannelTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public async Task TestWaitForDeviceStopDuringPlayback(ChromecastReceiver receive
};

AutoResetEvent _disconnectReceived = new AutoResetEvent(false);
IMediaChannel mediaChannel = client.GetChannel<IMediaChannel>();
IMediaChannel mediaChannel = client.MediaChannel;

mediaChannel.StatusChanged += (object sender, EventArgs e) => {
try {
Expand All @@ -65,14 +65,14 @@ public async Task TestWaitForDeviceStopDuringPlayback(ChromecastReceiver receive
}
};

MediaStatus status = await client.GetChannel<IMediaChannel>().LoadAsync(media);
MediaStatus status = await client.MediaChannel.LoadAsync(media);

//This keeps the test running for 20 seconds or until the device initates the wanted stop-disconnect.
Assert.True(_disconnectReceived.WaitOne(20000), "Have you manually stopped the device while playback? If you did so, this is a real Error :-) !");

// To reuse the device now you have to create a new connection and reload the app ...
client = await TestHelper.CreateConnectAndLoadAppClient(output);
status = await client.GetChannel<IMediaChannel>().LoadAsync(media);
status = await client.MediaChannel.LoadAsync(media);
Assert.Equal(PlayerStateType.Playing, status.PlayerState);
} else {
Assert.Fail("This test only runs with a 'JBL Playlist' device and also needs manual operations!");
Expand All @@ -89,7 +89,7 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev(ChromecastReceiver re
ChromecastClient client = await TestHelper.CreateConnectAndLoadAppClient(output, receiver);

AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
IMediaChannel mediaChannel = client.GetChannel<IMediaChannel>();
IMediaChannel mediaChannel = client.MediaChannel;
QueueItem[] MyCd = TestHelper.CreateTestCd();

int testSequenceCount = 0;
Expand Down Expand Up @@ -137,7 +137,7 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev(ChromecastReceiver re



MediaStatus status = await client.GetChannel<IMediaChannel>().QueueLoadAsync(MyCd);
MediaStatus status = await client.MediaChannel.QueueLoadAsync(MyCd);

Assert.Equal(PlayerStateType.Playing, status.PlayerState);
Assert.Equal(2, status.Items.Count()); // The status message only contains the next (and if available Prev) Track/QueueItem!
Expand All @@ -157,24 +157,24 @@ public async Task TestLoadMediaQueueAndCheckContent(ChromecastReceiver receiver)

QueueItem[] MyCd = TestHelper.CreateTestCd();

MediaStatus status = await client.GetChannel<IMediaChannel>().QueueLoadAsync(MyCd);
MediaStatus status = await client.MediaChannel.QueueLoadAsync(MyCd);

Assert.Equal(PlayerStateType.Playing, status.PlayerState);
Assert.Equal(2, status.Items.Count()); // The status message only contains the next (and if available Prev) Track/QueueItem!
Assert.Equal(status.CurrentItemId, status.Items[0].ItemId);

await Task.Delay(2000);

int[] ids = await client.GetChannel<IMediaChannel>().QueueGetItemIdsAsync(status.MediaSessionId);
int[] ids = await client.MediaChannel.QueueGetItemIdsAsync(status.MediaSessionId);

Assert.Equal(4, ids.Length);

foreach (int id in ids) {
QueueItem[] items = await client.GetChannel<IMediaChannel>().QueueGetItemsAsync(status.MediaSessionId, new int[] {id});
QueueItem[] items = await client.MediaChannel.QueueGetItemsAsync(status.MediaSessionId, new int[] {id});
Assert.Single(items);
}

QueueItem[] items2 = await client.GetChannel<IMediaChannel>().QueueGetItemsAsync(status.MediaSessionId, ids);
QueueItem[] items2 = await client.MediaChannel.QueueGetItemsAsync(status.MediaSessionId, ids);
Assert.Equal(4, items2.Length);
await client.DisconnectAsync();
}
Expand All @@ -189,7 +189,7 @@ public async Task TestLoadingMediaQueue(ChromecastReceiver receiver) {

QueueItem[] MyCd = TestHelper.CreateTestCd();

MediaStatus status = await client.GetChannel<IMediaChannel>().QueueLoadAsync(MyCd);
MediaStatus status = await client.MediaChannel.QueueLoadAsync(MyCd);

Assert.Equal(PlayerStateType.Playing, status.PlayerState);
Assert.Equal(2, status.Items.Count()); // The status message only contains the next (and if available Prev) Track/QueueItem!
Expand All @@ -209,7 +209,7 @@ public async Task TestLoadingMedia(ChromecastReceiver receiver)
ContentUrl = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4"
};

MediaStatus status = await client.GetChannel<IMediaChannel>().LoadAsync(media);
MediaStatus status = await client.MediaChannel.LoadAsync(media);

Assert.Equal(PlayerStateType.Playing, status.PlayerState);
Assert.Single(status.Items);
Expand All @@ -234,7 +234,7 @@ public async Task StartApplicationAThenStartBAndLoadMedia(ChromecastReceiver rec
{
ContentUrl = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4"
};
_ = await client.GetChannel<IMediaChannel>().LoadAsync(media);
_ = await client.MediaChannel.LoadAsync(media);
await client.DisconnectAsync();
}

Expand All @@ -256,15 +256,15 @@ public async Task TestLoadingAndPausingMedia(ChromecastReceiver receiver)
bool firstPlay = true;

//We are setting up an event to listen to status change. Because we don't know when the video has started to play
client.GetChannel<IMediaChannel>().StatusChanged += async (object sender, EventArgs e) =>
client.MediaChannel.StatusChanged += async (object sender, EventArgs e) =>
{
//runSequence += ".";
if (client.GetChannel<IMediaChannel>().Status.FirstOrDefault()?.PlayerState == PlayerStateType.Playing)
if (client.MediaChannel.Status.FirstOrDefault()?.PlayerState == PlayerStateType.Playing)
{
if (firstPlay) {
firstPlay = false;
runSequence += "p";
mediaStatus = await client.GetChannel<IMediaChannel>().PauseAsync();
mediaStatus = await client.MediaChannel.PauseAsync();
Assert.Equal(PlayerStateType.Paused, mediaStatus.PlayerState);
runSequence += "P";
_autoResetEvent.Set();
Expand All @@ -273,7 +273,7 @@ public async Task TestLoadingAndPausingMedia(ChromecastReceiver receiver)
};

runSequence += "1";
mediaStatus = await client.GetChannel<IMediaChannel>().LoadAsync(media);
mediaStatus = await client.MediaChannel.LoadAsync(media);
runSequence += "2";

//This checks that within 5000 ms we have loaded video and were able to pause it
Expand All @@ -300,14 +300,14 @@ public async Task TestLoadingAndStoppingMedia(ChromecastReceiver receiver)
bool firstPlay = true;

//We are setting up an event to listen to status change. Because we don't know when the video has started to play
client.GetChannel<IMediaChannel>().StatusChanged += async (object sender, EventArgs e) =>
client.MediaChannel.StatusChanged += async (object sender, EventArgs e) =>
{
try {
if (client.GetChannel<IMediaChannel>().Status.FirstOrDefault()?.PlayerState == PlayerStateType.Playing) {
if (client.MediaChannel.Status.FirstOrDefault()?.PlayerState == PlayerStateType.Playing) {
if (firstPlay) {
firstPlay = false;
await Task.Delay(2000); // Listen for some time
mediaStatus = await client.GetChannel<IMediaChannel>().StopAsync();
mediaStatus = await client.MediaChannel.StopAsync();
_autoResetEvent.Set();
}
}
Expand All @@ -316,7 +316,7 @@ public async Task TestLoadingAndStoppingMedia(ChromecastReceiver receiver)
}
};

mediaStatus = await client.GetChannel<IMediaChannel>().LoadAsync(media);
mediaStatus = await client.MediaChannel.LoadAsync(media);

//This checks that within 5000 ms we have loaded video and were able to pause it
Assert.True(_autoResetEvent.WaitOne(10000));
Expand All @@ -342,7 +342,7 @@ public async Task TestFailingLoadMedia(ChromecastReceiver receiver)
MediaStatus mediaStatus;
try
{
mediaStatus = await client.GetChannel<IMediaChannel>().LoadAsync(media);
mediaStatus = await client.MediaChannel.LoadAsync(media);
} catch (Exception ex)
{
loadFailedException = ex;
Expand All @@ -366,8 +366,8 @@ public async Task TestJoiningRunningMediaSessionAndPausingMedia(ChromecastReceiv
ContentUrl = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4"
};

mediaStatus = await client.GetChannel<IMediaChannel>().LoadAsync(media);
await client.GetChannel<IMediaChannel>().PlayAsync();
mediaStatus = await client.MediaChannel.LoadAsync(media);
await client.MediaChannel.PlayAsync();

client = TestHelper.GetClientWithTestOutput(output);
var status = await client.ConnectChromecast(receiver);
Expand All @@ -377,7 +377,7 @@ public async Task TestJoiningRunningMediaSessionAndPausingMedia(ChromecastReceiv


var chromecastStatus = await client.LaunchApplicationAsync(applicationRunning.AppId, true);
await client.GetChannel<IMediaChannel>().PauseAsync();
await client.MediaChannel.PauseAsync();
}

[Theory]
Expand All @@ -394,13 +394,12 @@ public async Task TestRepeatingAllQueueMedia(ChromecastReceiver receiver)

var queueItem = new QueueItem
{
Media = media,

Media = media
};


await client.GetChannel<IMediaChannel>().QueueLoadAsync([queueItem], null, RepeatModeType.ALL);
var test = await client.GetChannel<IMediaChannel>().PlayAsync();
await client.MediaChannel.QueueLoadAsync([queueItem], null, RepeatModeType.ALL);
var test = await client.MediaChannel.PlayAsync();

Assert.Equal(RepeatModeType.ALL, test.RepeatMode);
}
Expand All @@ -419,13 +418,12 @@ public async Task TestRepeatingOffQueueMedia(ChromecastReceiver receiver)

var queueItem = new QueueItem
{
Media = media,

Media = media
};


await client.GetChannel<IMediaChannel>().QueueLoadAsync([queueItem], null, RepeatModeType.OFF);
var test = await client.GetChannel<IMediaChannel>().PlayAsync();
await client.MediaChannel.QueueLoadAsync([queueItem], null, RepeatModeType.OFF);
var test = await client.MediaChannel.PlayAsync();

Assert.Equal(RepeatModeType.OFF, test.RepeatMode);
}
Expand All @@ -444,13 +442,12 @@ public async Task TestRepeatingSingleQueueMedia(ChromecastReceiver receiver)

var queueItem = new QueueItem
{
Media = media,

Media = media
};


await client.GetChannel<IMediaChannel>().QueueLoadAsync([queueItem], null, RepeatModeType.SINGLE);
var test = await client.GetChannel<IMediaChannel>().PlayAsync();
await client.MediaChannel.QueueLoadAsync([queueItem], null, RepeatModeType.SINGLE);
var test = await client.MediaChannel.PlayAsync();

Assert.Equal(RepeatModeType.SINGLE, test.RepeatMode);
}
Expand All @@ -469,13 +466,12 @@ public async Task TestRepeatingAllAndShuffleQueueMedia(ChromecastReceiver receiv

var queueItem = new QueueItem
{
Media = media,

Media = media
};


await client.GetChannel<IMediaChannel>().QueueLoadAsync([queueItem], null, RepeatModeType.ALL_AND_SHUFFLE);
var test = await client.GetChannel<IMediaChannel>().PlayAsync();
await client.MediaChannel.QueueLoadAsync([queueItem], null, RepeatModeType.ALL_AND_SHUFFLE);
var test = await client.MediaChannel.PlayAsync();

Assert.Equal(RepeatModeType.ALL_AND_SHUFFLE, test.RepeatMode);
}
Expand Down
10 changes: 5 additions & 5 deletions Sharpcaster.Test/MultiZoneChannelTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,30 @@ public async Task TestingMultiZone(ChromecastReceiver receiver)
int commandsToRun = 5;

//We are setting up an event listener for multi zone messages
client.GetChannel<MultiZoneChannel>().StatusChanged += (sender, args) =>
client.MultiZoneChannel.StatusChanged += (sender, args) =>
{
_autoResetEvent.Set();
};

//We are setting up an event listener for multi zone messages
client.GetChannel<MultiZoneChannel>().DeviceUpdated += (sender, args) =>
client.MultiZoneChannel.DeviceUpdated += (sender, args) =>
{
_autoResetEvent.Set();
};

var mediaStatus = await client.GetChannel<IMediaChannel>().LoadAsync(media);
var mediaStatus = await client.MediaChannel.LoadAsync(media);

for (int i = 0; i < commandsToRun; i++)
{
if (i % 2 == 0)
{
await Task.Delay(1000);
await client.GetChannel<ReceiverChannel>().SetVolume(0.2);
await client.ReceiverChannel.SetVolume(0.2);
}
else
{
await Task.Delay(1000);
await client.GetChannel<ReceiverChannel>().SetVolume(0.3);
await client.ReceiverChannel.SetVolume(0.3);
}
}

Expand Down
Loading

0 comments on commit dbf5c87

Please sign in to comment.