Skip to content

Commit

Permalink
Moved messages a bit and formatted additions
Browse files Browse the repository at this point in the history
  • Loading branch information
Tapanila committed Jul 3, 2024
1 parent 33d2eba commit 43788e4
Show file tree
Hide file tree
Showing 25 changed files with 201 additions and 180 deletions.
6 changes: 1 addition & 5 deletions Sharpcaster.Test/LoggingTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,8 @@
using Sharpcaster.Interfaces;
using Sharpcaster.Messages;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace Sharpcaster.Test
Expand Down Expand Up @@ -63,7 +59,7 @@ where t.GetTypeInfo().IsClass && !t.GetTypeInfo().IsAbstract && messageInterface
}

var client = new ChromecastClient(serviceCollection);
Assert.Equal("[RECEIVER_STATUS,INVALID_REQUEST,LOAD_CANCELLED,LOAD_FAILED,MEDIA_STATUS,QUEUE_CHANGE,QUEUE_ITEM_IDS,QUEUE_ITEMS,PING,CLOSE]",logMessageFirst);
Assert.Equal("[RECEIVER_STATUS,QUEUE_CHANGE,QUEUE_ITEM_IDS,QUEUE_ITEMS,INVALID_REQUEST,LOAD_CANCELLED,LOAD_FAILED,MEDIA_STATUS,PING,CLOSE]", logMessageFirst);
}
}
}
12 changes: 6 additions & 6 deletions Sharpcaster.Test/MediaChannelTester.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Sharpcaster.Channels;
using Sharpcaster.Interfaces;
using Sharpcaster.Models.Media;
using Sharpcaster.Models.Queue;
using System;
using System.Collections.Generic;
using System.Linq;
Expand Down Expand Up @@ -81,7 +82,7 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev() {

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

int testSequenceCount = 0;

Expand All @@ -90,8 +91,7 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev() {
try {
MediaStatus status = mediaChannel.Status.FirstOrDefault();
int currentItemId = status?.CurrentItemId ?? -1;
//output.WriteLine("Test Event Handler received: '" + ((status?.PlayerState.ToString()) ?? "<null>") + "'.");
if (currentItemId != -1 && status.PlayerState == PlayerStateType.Playing) {
if (status?.Items?.ToList()?.Where(i => i.ItemId == currentItemId).FirstOrDefault()?.Media?.ContentUrl?.Equals(MyCd[0].Media.ContentUrl) ?? false) {
Expand Down Expand Up @@ -135,7 +135,7 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev() {
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);

//This keeps the test running untill all eventhandler sequenc srteps are finished. If something goes wrong we get a very slow timeout here.
//This keeps the test running untill all eventhandler sequence steps are finished. If something goes wrong we get a very slow timeout here.
Assert.True(_autoResetEvent.WaitOne(20000));

}
Expand All @@ -144,7 +144,7 @@ public async Task TestLoadingMediaQueueAndNavigateNextPrev() {
public async Task TestLoadMediaQueueAndCheckContent() {
ChromecastClient client = await TestHelper.CreateConnectAndLoadAppClient(output);

Item[] MyCd = TestHelper.CreateTestCd();
QueueItem[] MyCd = TestHelper.CreateTestCd();

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

Expand Down Expand Up @@ -174,7 +174,7 @@ public async Task TestLoadMediaQueueAndCheckContent() {
public async Task TestLoadingMediaQueue() {
ChromecastClient client = await TestHelper.CreateConnectAndLoadAppClient(output);

Item[] MyCd = TestHelper.CreateTestCd();
QueueItem[] MyCd = TestHelper.CreateTestCd();

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

Expand Down
28 changes: 7 additions & 21 deletions Sharpcaster.Test/TestHelper.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.VisualStudio.TestPlatform.Utilities;
using Moq;
using Sharpcaster.Channels;
using Sharpcaster.Interfaces;
using Sharpcaster.Messages;
using Sharpcaster.Models;
using Sharpcaster.Models.Media;
using Sharpcaster.Models.Queue;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Xunit.Abstractions;

Expand All @@ -27,7 +25,6 @@ public async static Task<ChromecastReceiver> FindChromecast()
{
IChromecastLocator locator = new MdnsChromecastLocator();
var chromecasts = await locator.FindReceiversAsync();
//CurrentReceiver = chromecasts.Where(cc => cc.Name.StartsWith("B")).First();
CurrentReceiver = chromecasts.First();
try {
TestOutput?.WriteLine("Using Receiver '" + (CurrentReceiver?.Model ?? "<null>") + "' at " + CurrentReceiver?.DeviceUri);
Expand All @@ -38,17 +35,6 @@ public async static Task<ChromecastReceiver> FindChromecast()
return CurrentReceiver;
}

//public async static Task<ChromecastReceiver> FindChromecast(string name, double timeoutSeconds)
//{
// IChromecastLocator locator = new MdnsChromecastLocator();
// var cts = new CancellationTokenSource();
// cts.CancelAfter(TimeSpan.FromSeconds(timeoutSeconds));
// var chromecasts = await locator.FindReceiversAsync(cts.Token);
// CurrentReceiver = chromecasts.First(x => x.Name == name);
// return CurrentReceiver;
//}


public async static Task<ChromecastClient> CreateAndConnectClient(ITestOutputHelper output) {
TestOutput = output;
var chromecast = await TestHelper.FindChromecast();
Expand Down Expand Up @@ -106,24 +92,24 @@ where t.GetTypeInfo().IsClass && !t.GetTypeInfo().IsAbstract && messageInterface

}

public static Item[] CreateTestCd() {
Item[] MyCd = new Item[4];
MyCd[0] = new Item() {
public static QueueItem[] CreateTestCd() {
QueueItem[] MyCd = new QueueItem[4];
MyCd[0] = new QueueItem() {
Media = new Media {
ContentUrl = "http://www.openmusicarchive.org/audio/Frankie%20by%20Mississippi%20John%20Hurt.mp3"
}
};
MyCd[1] = new Item() {
MyCd[1] = new QueueItem() {
Media = new Media {
ContentUrl = "http://www.openmusicarchive.org/audio/Mississippi%20Boweavil%20Blues%20by%20The%20Masked%20Marvel.mp3"
}
};
MyCd[2] = new Item() {
MyCd[2] = new QueueItem() {
Media = new Media {
ContentUrl = "http://www.openmusicarchive.org/audio/The%20Wild%20Wagoner%20by%20Jilson%20Setters.mp3"
}
};
MyCd[3] = new Item() {
MyCd[3] = new QueueItem() {
Media = new Media {
ContentUrl = "http://www.openmusicarchive.org/audio/Drunkards%20Special%20by%20Coley%20Jones.mp3"
}
Expand Down
1 change: 0 additions & 1 deletion Sharpcaster/Channels/ConnectionChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ public async override Task OnMessageReceivedAsync(IMessage message)
// In order to avoid usage deadlocks we need to spawn a new Task here!?
_ = Task.Run(async () => {
await Client.DisconnectAsync();
//await Task.Delay(2000);
});
}
await base.OnMessageReceivedAsync(message);
Expand Down
47 changes: 23 additions & 24 deletions Sharpcaster/Channels/MediaChannel.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Sharpcaster.Interfaces;
using Sharpcaster.Messages.Media;
using Sharpcaster.Messages.Queue;
using Sharpcaster.Models.ChromecastStatus;
using Sharpcaster.Models.Media;
using Sharpcaster.Models.Queue;
using System;
using System.Collections.Generic;
using System.Linq;
Expand Down Expand Up @@ -51,7 +53,7 @@ private async Task<MediaStatus> SendAsync(MediaSessionMessage message)
public async Task<MediaStatus> LoadAsync(Media media, bool autoPlay = true)
{
var status = Client.GetChromecastStatus();
return await SendAsync(new LoadMessage() { SessionId = status.Applications[0].SessionId, Media = media , AutoPlay = autoPlay }, status.Applications[0]);
return await SendAsync(new LoadMessage() { SessionId = status.Applications[0].SessionId, Media = media, AutoPlay = autoPlay }, status.Applications[0]);
}

/// <summary>
Expand Down Expand Up @@ -92,38 +94,35 @@ public async Task<MediaStatus> SeekAsync(double seconds)
return await SendAsync(new SeekMessage() { CurrentTime = seconds });
}



public async Task<MediaStatus> QueueLoadAsync(Item[] items) {
var app = Client.GetChromecastStatus().Applications[0];
var r = await SendAsync<MediaStatusMessage>(new QueueLoadMessage() { SessionId = app.SessionId, Items = items }, app.TransportId);
return r?.Status?.FirstOrDefault();
public async Task<MediaStatus> QueueLoadAsync(QueueItem[] items)
{
var chromecastStatus = Client.GetChromecastStatus();
return (await SendAsync<MediaStatusMessage>(new QueueLoadMessage() { SessionId = chromecastStatus.Applications[0].SessionId, Items = items }, chromecastStatus.Applications[0].TransportId)).Status?.FirstOrDefault();
}


public async Task<MediaStatus> QueueNextAsync(long mediaSessionId) {
var app = Client.GetChromecastStatus().Applications[0];
var r = await SendAsync<MediaStatusMessage>(new QueueNextMessage() { MediaSessionId = mediaSessionId }, app.TransportId);
return r?.Status?.FirstOrDefault();
public async Task<MediaStatus> QueueNextAsync(long mediaSessionId)
{
var chromecastStatus = Client.GetChromecastStatus();
return (await SendAsync<MediaStatusMessage>(new QueueNextMessage() { MediaSessionId = mediaSessionId }, chromecastStatus.Applications[0].TransportId)).Status?.FirstOrDefault();
}

public async Task<MediaStatus> QueuePrevAsync(long mediaSessionId) {
var app = Client.GetChromecastStatus().Applications[0];
var r = await SendAsync<MediaStatusMessage>(new QueuePrevMessage() { MediaSessionId = mediaSessionId }, app.TransportId);
return r?.Status?.FirstOrDefault();
public async Task<MediaStatus> QueuePrevAsync(long mediaSessionId)
{
var chromecastStatus = Client.GetChromecastStatus();
return (await SendAsync<MediaStatusMessage>(new QueuePrevMessage() { MediaSessionId = mediaSessionId }, chromecastStatus.Applications[0].TransportId)).Status?.FirstOrDefault();
}


public async Task<Item[]> QueueGetItemsAsync(long mediaSessionId, int[] ids = null) {
var app = Client.GetChromecastStatus().Applications[0];
var r = await SendAsync<QueueItemsMessage>(new QueueGetItemsMessage() { MediaSessionId = mediaSessionId, Ids = ids }, app.TransportId);
return r?.Items;
public async Task<Item[]> QueueGetItemsAsync(long mediaSessionId, int[] ids = null)
{
var chromecastStatus = Client.GetChromecastStatus();
return (await SendAsync<QueueItemsMessage>(new QueueGetItemsMessage() { MediaSessionId = mediaSessionId, Ids = ids }, chromecastStatus.Applications[0].TransportId)).Items;
}

public async Task<int[]> QueueGetItemIdsAsync(long mediaSessionId) {
var app = Client.GetChromecastStatus().Applications[0];
var r = await SendAsync<QueueItemIdsMessage>(new QueueGetItemIdsMessage() { MediaSessionId = mediaSessionId }, app.TransportId);
return r?.Ids;
public async Task<int[]> QueueGetItemIdsAsync(long mediaSessionId)
{
var chromecastStatus = Client.GetChromecastStatus();
return (await SendAsync<QueueItemIdsMessage>(new QueueGetItemIdsMessage() { MediaSessionId = mediaSessionId }, chromecastStatus.Applications[0].TransportId)).Ids;
}

}
Expand Down
14 changes: 0 additions & 14 deletions Sharpcaster/ChromeCastClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using Sharpcaster.Extensions;
using Sharpcaster.Interfaces;
using Sharpcaster.Messages;
using Sharpcaster.Messages.Media;
using Sharpcaster.Models;
using Sharpcaster.Models.ChromecastStatus;
using Sharpcaster.Models.Media;
Expand Down Expand Up @@ -188,18 +187,6 @@ private void TaskCompletionSourceInvoke(MessageWithId message, string method, ob
var tcsType = tcs.GetType();
(types == null ? tcsType.GetMethod(method) : tcsType.GetMethod(method, types)).Invoke(tcs, new object[] { parameter });
}
else
{
// I think this duplicates the OnMessageReceived Event already called in line 164 !!!
// So a mediaStatus changed event will be triggered twice if received as 'not requested' Message.
// All Unit tests do succeed without this lines. So I remove them (and the async !!! for the time beeing....

// //This is just to handle media status messages. Where we want to update the status of media but we are not expecting an update
//if (message.Type == "MEDIA_STATUS") {
// var statusMessage = parameter as MediaStatusMessage;
// await GetChannel<MediaChannel>().OnMessageReceivedAsync(statusMessage);
//}
}
}

public async Task SendAsync(string ns, IMessage message, string destinationId)
Expand All @@ -215,7 +202,6 @@ private async Task SendAsync(CastMessage castMessage)
try
{
_logger?.LogTrace($"SENT : {castMessage.DestinationId}: {castMessage.PayloadUtf8}");

byte[] message = castMessage.ToProto();
var networkStream = _stream;
await networkStream.WriteAsync(message, 0, message.Length);
Expand Down
7 changes: 2 additions & 5 deletions Sharpcaster/Interfaces/IMediaChannel.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Sharpcaster.Models.Media;
using Sharpcaster.Models.Queue;
using System.Collections.Generic;
using System.Threading.Tasks;

Expand Down Expand Up @@ -39,13 +40,9 @@ public interface IMediaChannel : IStatusChannel<IEnumerable<MediaStatus>>, IChro
/// <param name="seconds">time in seconds</param>
/// <returns>media status</returns>
Task<MediaStatus> SeekAsync(double seconds);



Task<MediaStatus> QueueLoadAsync(Item[] items);
Task<MediaStatus> QueueLoadAsync(QueueItem[] items);
Task<MediaStatus> QueueNextAsync(long mediaSessionId);
Task<MediaStatus> QueuePrevAsync(long mediaSessionId);

Task<Item[]> QueueGetItemsAsync(long mediaSessionId, int[] ids = null);
Task<int[]> QueueGetItemIdsAsync(long mediaSessionId);
}
Expand Down
14 changes: 0 additions & 14 deletions Sharpcaster/Messages/Media/QueueItemIdsMessage.cs

This file was deleted.

17 changes: 0 additions & 17 deletions Sharpcaster/Messages/Media/QueueItemsMessage.cs

This file was deleted.

14 changes: 0 additions & 14 deletions Sharpcaster/Messages/Media/QueueNextMessage.cs

This file was deleted.

14 changes: 0 additions & 14 deletions Sharpcaster/Messages/Media/QueuePrevMessage .cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@

using Sharpcaster.Messages;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization;

namespace Sharpcaster.Messages.Media {
namespace Sharpcaster.Messages.Queue
{

//TODO: not tested yet. Either implement Queue manipulation Requests or test with 2nd external client!?

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
using System.Runtime.Serialization;


namespace Sharpcaster.Messages.Media {
namespace Sharpcaster.Messages.Queue
{

[DataContract]
public class QueueGetItemIdsMessage : MediaSessionMessage {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
using Sharpcaster.Messages.Media;
using System.Runtime.Serialization;

namespace Sharpcaster.Messages.Media {
namespace Sharpcaster.Messages.Queue
{

[DataContract]
public class QueueGetItemsMessage : MediaSessionMessage {
public class QueueGetItemsMessage : MediaSessionMessage
{
[DataMember(Name = "itemIds")]
public int[] Ids { get; set; }
}
Expand Down
Loading

0 comments on commit 43788e4

Please sign in to comment.