Files
ClipTrimApp/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs
michalcourson 1e7141c43f some tests
2026-02-24 21:11:26 -05:00

154 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using SocketIOClient;
using BarRaider.SdTools;
using System.Runtime.CompilerServices;
namespace ClipTrimDotNet.Client
{
public class ClipTrimClient
{
private static ClipTrimClient? instance;
public static ClipTrimClient Instance
{
get
{
if (instance == null)
{
instance = new ClipTrimClient();
}
return instance;
}
}
//private HttpClient httpClient;
private SocketIO socket;
public int PortNumber { get; set; } = 5010;
public ClipTrimClient()
{
//httpClient = new HttpClient()
//{
// BaseAddress = new Uri("http://localhost:5010/"),
// Timeout = TimeSpan.FromSeconds(10)
//};
socket = new SocketIO(new Uri($"http://localhost:5010/"));
socket.Options.AutoUpgrade = false;
socket.Options.ConnectionTimeout = TimeSpan.FromSeconds(10);
socket.Options.Reconnection = true;
socket.On("full_data", ctx =>
{
try
{
Collections = JsonConvert.DeserializeObject<List<CollectionMetaData>>(ctx.RawText);
}
catch
{
}
return Task.CompletedTask;
});
socket.On("collection_updated", ctx =>
{
try
{
var collection = JsonConvert.DeserializeObject<CollectionMetaData>(ctx.RawText);
int index = Collections.FindIndex(x => x.Id == collection.Id);
if(index != -1)
{
Collections[index] = collection;
}
}
catch
{
}
return Task.CompletedTask;
});
Task.Run(async () => await socket.ConnectAsync());
//Task.Run(ShortPoll);
}
//public async Task ShortPoll()
//{
// while (true)
// {
// await GetMetadata();
// await Task.Delay(TimeSpan.FromSeconds(5)); await Task.Delay(TimeSpan.FromSeconds(5));
// }
//}
public List<CollectionMetaData> Collections { get; private set; } = new List<CollectionMetaData>();
public CollectionMetaData? SelectedCollection { get; private set; }
public int PageIndex { get; private set; } = 0;
//private async Task GetMetadata()
//{
// try
// {
// var response = await httpClient.GetAsync("meta");
// if (response.IsSuccessStatusCode)
// {
// var json = await response.Content.ReadAsStringAsync();
// dynamic collections = JsonConvert.DeserializeObject(json);
// collections = collections.collections;
// Collections = JsonConvert.DeserializeObject<List<CollectionMetaData>>(collections.ToString());
// }
// }
// catch (Exception ex)
// {
// //Logger.Instance.LogMessage(TracingLevel.INFO, $"Error pinging ClipTrim API: {ex.Message}");
// return;
// }
//}
public List<string> GetCollectionNames()
{
//await GetMetadata();
return Collections.Select(x => x.Name).ToList();
}
public void SetSelectedCollectionByName(string name)
{
var collection = Collections.FirstOrDefault(x => x.Name == name);
if (collection != null)
{
SelectedCollection = collection;
PageIndex = 0;
}
}
public ClipMetadata? GetClipByPagedIndex(int index)
{
if (SelectedCollection == null) return null;
int clipIndex = PageIndex * 10 + index;
if (clipIndex >= 0 && clipIndex < SelectedCollection.Clips.Count)
{
return SelectedCollection.Clips[clipIndex];
}
return null;
}
public async void PlayClip(ClipMetadata? metadata)
{
if (metadata == null) return;
//var response = await httpClient.PostAsync("playback/start", new StringContent(JsonConvert.SerializeObject(metadata), Encoding.UTF8, "application/json"));
//if (!response.IsSuccessStatusCode)
//{
// //Logger.Instance.LogMessage(TracingLevel.INFO, $"Error playing clip: {response.ReasonPhrase}");
//}
}
}
}