From 69c9d80a82de61f785b470aedb626f05deeee4ce Mon Sep 17 00:00:00 2001 From: Michal Courson Date: Thu, 26 Feb 2026 20:02:22 -0500 Subject: [PATCH] plugin work, page navigation, reticks --- audio-service/metadata.json | 96 +++++++++++++-- audio-service/settings.json | 4 +- .../metadata_manager.cpython-313.pyc | Bin 10424 -> 11020 bytes audio-service/src/main.py | 2 +- audio-service/src/metadata_manager.py | 11 ++ .../ClipTrimDotNet/Client/ClipTrimClient.cs | 113 ++++++++++++++++-- .../ClipTrimDotNet/Keys/ClipSave.cs | 49 ++++++++ .../ClipTrimDotNet/Keys/PageNavigator.cs | 107 +++++++++++++++++ .../ClipTrimDotNet/{ => Keys}/Player.cs | 48 ++++---- .../{ => Keys}/ProfileSwitcher.cs | 28 +++-- .../ClipTrimDotNet/manifest.json | 30 +++++ 11 files changed, 432 insertions(+), 56 deletions(-) create mode 100644 stream_deck_plugin/ClipTrimDotNet/Keys/ClipSave.cs create mode 100644 stream_deck_plugin/ClipTrimDotNet/Keys/PageNavigator.cs rename stream_deck_plugin/ClipTrimDotNet/{ => Keys}/Player.cs (56%) rename stream_deck_plugin/ClipTrimDotNet/{ => Keys}/ProfileSwitcher.cs (78%) diff --git a/audio-service/metadata.json b/audio-service/metadata.json index 6d6381d..57c1af3 100644 --- a/audio-service/metadata.json +++ b/audio-service/metadata.json @@ -2,12 +2,94 @@ { "name": "Uncategorized", "id": 0, - "clips": [] + "clips": [ + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_195932.wav", + "name": "Clip 20260226_195932", + "playbackType": "playOverlap", + "volume": 1 + } + ] }, { "name": "Test", "id": 1, - "clips": [] + "clips": [ + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_183607.wav", + "name": "Clip 20260226_183607", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_183812.wav", + "name": "Clip 20260226_183812", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_183822.wav", + "name": "Clip 20260226_183822", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184028.wav", + "name": "Clip 20260226_184028", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184030.wav", + "name": "Clip 20260226_184030", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184032.wav", + "name": "Clip 20260226_184032", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184037.wav", + "name": "Clip 20260226_184037", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184040.wav", + "name": "Clip 20260226_184040", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184041.wav", + "name": "Clip 20260226_184041", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184042.wav", + "name": "Clip 20260226_184042", + "playbackType": "playStop", + "volume": 1 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184043.wav", + "name": "Clip 20260226_184043", + "playbackType": "playStop", + "volume": 1 + }, + { + "endTime": 14.772566995768694, + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_194441.wav", + "name": "Test", + "playbackType": "playStop", + "startTime": 9.8548571932299, + "volume": 0.6 + } + ] }, { "name": "New", @@ -18,15 +100,15 @@ "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260220_193822.wav", "name": "Pee pee\npoo poo", "playbackType": "playOverlap", - "startTime": 27.76674010920584, - "volume": 0.25 + "startTime": 27.64044943820222, + "volume": 0.31 }, { - "endTime": 28.566433566433446, + "endTime": 30, "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260220_200442.wav", - "name": "Clip 20260220_200442", + "name": "Test", "playbackType": "playOverlap", - "startTime": 25.664335664335663, + "startTime": 26.14685314685314, "volume": 0.64 } ] diff --git a/audio-service/settings.json b/audio-service/settings.json index 7e2c9e9..600d5b4 100644 --- a/audio-service/settings.json +++ b/audio-service/settings.json @@ -10,8 +10,8 @@ "output_device": { "channels": 2, "default_samplerate": 48000, - "index": 44, - "name": "VM to Headset (VB-Audio Voicemeeter VAIO)" + "index": 45, + "name": "VM to Discord (VB-Audio Voicemeeter VAIO)" }, "http_port": 5010 } \ No newline at end of file diff --git a/audio-service/src/__pycache__/metadata_manager.cpython-313.pyc b/audio-service/src/__pycache__/metadata_manager.cpython-313.pyc index e5f17ece73ef60940574a9fe0ee99e6661a08b63..bbb6752824d07d4eaae47a80d04331202a7af239 100644 GIT binary patch delta 2230 zcma)7YiJx*6y7_tGn;I7y02`uNp?4rWb>Fb-CEMEN|U~0t$ijjtxc=hO?E6R`{M4V ztsq7BYLGh=R7AtLs{-_}SsDDB#6r_mf+-Wv3iQ)`=+ogo`o{ zK}5X}T!)jgjG*f}_tLVvdR2W(>I>ocAP*y=ZVN565|H?@{#jc;0)_hDd)jD`PPX^( zX40ei!m$xj*bHagd-ld~XsDK)F1*U=e#?C%otrU-IWKZc&Zp1t^`x92HJNXqFnEIqfeszPk)b|DVk-yP^{?Y znQXa|FcjWT+sGO|h+wJQ%ok6YD~)hZ7jrptx{@sxmKgF#`?%GQ`=%+B3!j1mnm=&D z4c8VJYJUpi-cH!q9h9dc4p`qEmPQ-koHOWG#^odh3qRd4?ikhJuRu&PRM_5D3e>!+ zB?9hyqpC<&1T^0(v%7I0C)fBefsSAW7VVszDP__XGh?`xd1=SFoz$IXK3lQ9b=o06 zKw@n=mn}`^%}N?iNb@}?D?1VN)Z@HbP3a8W^6g-!;FtIyjQfKy+tnB0D}v#|T_PC2 zRWJAp48E3wFxIhwx#4_AQc+%Z7!BlYN6lNlpDwehxj;3PSX<$0s2?V@KxiXQ`5}TO z0RXKL62t+d4$;77{fa?j8G6r*@pCn%+oa^fA*W@;L z*@N#s*0+2ZIz}sk22Ps>EX$9>?H1i@*9|Ra5e|W?bz)Yh=?Q`ff)@#1B3P9O zR=ru6$(tN&YE?QYOX!fJQ>bh#C0odtXUfzR1P?^_w8Ca4TY>rJApF{Du;<`@Xa^jM z%u*3a+z($$&G1L$l0p5CQ;#(y(F?`c_K%6iTxN7GQtOB4c6JQ3SVtF?pdnjM;vluv zl4x%R6V}!ApN}Qk3-C@X&ivI&F}Adct`_xcZQDjfpq59S4AjMq%gSbfb1_!Y9oNlsX&H{{WoV!>Xv3U80-Z)f-guVp@jFQe&01Z0_CIYuz2J1asXZ4dP7_yW3%Z&z2!-q`aPh z9(=xy;8_Au#3>q?1Vw_=1g{gkNsxf=d-^?Va47P>9r^O8XH&|hMCSuugt($S!{&V+ z97dRuX7j33>74gyO7vk&Qj&8H1X0YKx&mglgH9!{gy5pXUKEL~8_X9oGdXiB2YA1? O*;`;NIqx78N`C|PM7?qV delta 2016 zcmah~O>7%g5cadZ8~^6Fb`mGHH+E8I)8?lN0jm5oZE;AX=8r={0+r+1t77m^^42av zfZ7X{Kp+m23ml*lLLw3ZN+c96m4E|WI3QFZZ7-B7QmI^_3WNkRZyU#rqq2u@XWz`5 zH*da~*|(Q=7whkNy)Fwre_p?qIeFxI{dAZThW4B5w>mI z51sP6EywXgw;?Es!W&8L-nk)Pwf6Z@p5twZXxl-GP6AqfV1LE54?^DgdrToEc{ca( z0NK&^p4%W9JONi+PtSx=RAs}K%)i3ve8aVr%$Bq`=LK%qa>-3TK*ob)X5&L7)3Jt} z*IrI!(&q7N7%nurzhcch-@E5oaD>b#T>d!1!4QYNeECUS|GO!sqzjs^?mZF;^nLG3xb2>T zPow?N-4KO0JPLf&wb5LOwvt>JYYfVQfFL9qUtEdfW={u(cCz z&NJqQUt3h>f@3}FkxKY{mYkdQvsVweVobp2{$nuO+2SJ>`2s=Jjo^zf@a> zokHe|DAqdTOSn7?U--sZ7u@j$*a|rP-HWPxfHyvdcD$WHl#aZg65&}S!l=vS6ItY) zuhL;Mg0hBrp~Sr7pRJ?H(|@zTZU4_Fo!&}%{wh0dVVCYf?Kfk+XC?c$y)t5o(z^GM zED|;ip0=6Rixy5PRINOLFa8Y4$P!5HeGTHGf)exOiT1cmrKc4-mqk6u7N zU?cE>pd@5f1t(Pva0n-GBI1M5P%E5|wD`_YJcm%y4zG2-?t7NBf*ZTZ4a@LVs1GU) zW_6PK1%xRW53XLMy5!FhtPng;a2}zC9mA>ROF4}vi&_;&QWZxp(OxQ6L(1gS+NMrD zB*;N-yrFpAY5dl|BW^}vD|FfWQ2D~C@DD1D39cYu)+@4k87AhJ&QM8Q4=Iyu4mOlX z4;8*@Gwf6pG=0{^Bv6@%tYW{bjIdd_qjclEY3X9s^XBk$pPC_(Ytl?>qL*z4s&{YF zQ3snXE4oUIxvwK}wgCS|&f($bqVv}O;d-~{Y;8rMYGH5_8BysG@uJSt#NS!ESt}c4vV2?bij{29bk?1 zv!$J(*bO$UQh+gnKH)K4%00-u)%17*mmm6r3__P0VH!N8F1p3A7P}*GO&uL~kR$p5 zayP*w!3+Vlo!NkClJW$X2wo+)N-zj*eaAfwCIywIGOg<==AAzjL96MPFlsTg(o aC*QR(#%@`hw=C}a_7r0yWs8$uV&{KSq>A_e diff --git a/audio-service/src/main.py b/audio-service/src/main.py index a1aab8c..4fe8f4f 100644 --- a/audio-service/src/main.py +++ b/audio-service/src/main.py @@ -27,7 +27,7 @@ def handle_connect(): emit('full_data', MetaDataManager().collections) @socketio.on('record_clip') -def record_clip(data): +def record_clip(): io = AudioIO() io.save_last_n_seconds(); diff --git a/audio-service/src/metadata_manager.py b/audio-service/src/metadata_manager.py index 0652b89..8c2a4c6 100644 --- a/audio-service/src/metadata_manager.py +++ b/audio-service/src/metadata_manager.py @@ -41,6 +41,8 @@ class MetaDataManager: if collection is None: raise ValueError(f"Collection '{collection_name}' does not exist.") collection["clips"].append(clip_metadata) + if not self.socket is None: + self.socket.emit('collection_updated', collection) self.save_metadata() def remove_clip_from_collection(self, collection_name, clip_metadata): @@ -56,11 +58,18 @@ class MetaDataManager: clip for clip in collection["clips"] if clip.get("filename") != clip_metadata.get("filename") ] + if not self.socket is None: + self.socket.emit('collection_updated', collection) self.save_metadata() + def move_clip_to_collection(self, source_collection, target_collection, clip_metadata): self.remove_clip_from_collection(source_collection, clip_metadata) self.add_clip_to_collection(target_collection, clip_metadata) + if not self.socket is None: + self.socket.emit('collection_updated', source_collection) + self.socket.emit('collection_updated', target_collection) + def edit_clip_in_collection(self, collection_name, new_clip_metadata): collection = next((c for c in self.collections if c.get("name") == collection_name), None) @@ -72,6 +81,8 @@ class MetaDataManager: raise ValueError(f"Clip with filename '{new_clip_metadata.get('filename')}' not found in collection '{collection_name}'.") collection["clips"][index] = new_clip_metadata + if not self.socket is None: + self.socket.emit('collection_updated', collection) self.save_metadata() def get_collections(self): diff --git a/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs b/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs index 83df12e..0859460 100644 --- a/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs +++ b/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs @@ -1,4 +1,6 @@ using BarRaider.SdTools; +using ClipTrimDotNet.Keys; +using Microsoft.AspNetCore.Mvc.RazorPages; using Newtonsoft.Json; using SocketIOClient; using System; @@ -104,23 +106,96 @@ namespace ClipTrimDotNet.Client public List Collections { get; private set; } = new List(); public int SelectedCollection { get; private set; } = -1; - public int PageIndex { get; private set; } = 0; + public Dictionary CollectionIndexes { get; private set; } = new(); + public int PageIndex + { + get + { + if (SelectedCollection == -1) return 0; + if (!CollectionIndexes.ContainsKey(SelectedCollection)) + { + CollectionIndexes[SelectedCollection] = 0; + } + return CollectionIndexes[SelectedCollection]; + } + set + { + if (SelectedCollection == -1) return; + CollectionIndexes[SelectedCollection] = value; + } + } + public bool PageMode { get; set; } = false; + + public int PageCount + { + get + { + if (SelectedCollection == -1) return 0; + var collection = Collections[SelectedCollection]; + return (collection.Clips.Count - 1) / 10 + 1; + } + } + public bool CanPageUp + { + get + { + if(PageMode) return false; + if (SelectedCollection == -1) return false; + return PageCount - PageIndex > 1; + } + } + + public bool CanPageDown + { + get + { + if (PageMode) return false; + return PageIndex > 0; + } + } + + public void PageDown() + { + if (CanPageDown) + { + PageIndex--; + } + } + + public void PageUp() + { + if (CanPageUp) + { + PageIndex++; + } + } public List GetCollectionNames() { //await GetMetadata(); - return Collections.Select(x => x.Name).ToList(); + return Collections.Where(x => x.Name != "Uncategorized").Select(x => x.Name).ToList(); } - public void SetSelectedCollectionByName(string name) + public string GetPlayerStringByCoordinateIndex(int index) { - SelectedCollection = Collections.FindIndex(x => x.Name == name); - if (SelectedCollection != -1) + if (PageMode) { - PageIndex = 0; + int pageNumber = index + 1; + if(pageNumber <= PageCount) + { + return pageNumber.ToString(); + } + return ""; + } + else + { + var collection = GetClipByPagedIndex(index); + return collection?.Name ?? ""; } } + + public ClipMetadata? GetClipByPagedIndex(int index) { SelectedCollection = Collections.FindIndex(x => x.Name == GlobalSettings.Instance.ProfileName); @@ -134,11 +209,29 @@ namespace ClipTrimDotNet.Client return null; } - public async void PlayClip(ClipMetadata? metadata) + public async void PlayClip(int index) { - if (metadata == null) return; - Logger.Instance.LogMessage(TracingLevel.INFO, $"playing clip:"); - await socket.EmitAsync("play_clip", new List() { metadata }); + if (PageMode) + { + if(index < 0 || index >= PageCount) return; + PageIndex = index; + PageMode = false; + Player.TickAll(); + PageNavigator.TickAll(); + } + else + { + var metadata = GetClipByPagedIndex(index); + if (metadata == null) return; + Logger.Instance.LogMessage(TracingLevel.INFO, $"playing clip:"); + await socket.EmitAsync("play_clip", new List() { metadata }); + } + + } + + public async void SaveClip() + { + await socket.EmitAsync("record_clip", new List() { }); } } } diff --git a/stream_deck_plugin/ClipTrimDotNet/Keys/ClipSave.cs b/stream_deck_plugin/ClipTrimDotNet/Keys/ClipSave.cs new file mode 100644 index 0000000..ea1d55d --- /dev/null +++ b/stream_deck_plugin/ClipTrimDotNet/Keys/ClipSave.cs @@ -0,0 +1,49 @@ +using BarRaider.SdTools; +using ClipTrimDotNet.Client; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClipTrimDotNet.Keys +{ + [PluginActionId("com.michal-courson.cliptrim.clip-save")] + public class ClipSave : KeypadBase + { + public ClipSave(SDConnection connection, InitialPayload payload) : base(connection, payload) + { + GlobalSettingsManager.Instance.RequestGlobalSettings(); + } + public void Instance_OnReceivedGlobalSettings(object sender, ReceivedGlobalSettingsPayload e) + { + Tools.AutoPopulateSettings(GlobalSettings.Instance, e.Settings); + } + public override void Dispose() + { + } + public override void KeyPressed(KeyPayload payload) + { + ClipTrimClient.Instance.SaveClip(); + } + + + public override void OnTick() + { + } + + public override void KeyReleased(KeyPayload payload) + { + + } + + public override void ReceivedSettings(ReceivedSettingsPayload payload) + { + + } + public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) + { + Tools.AutoPopulateSettings(GlobalSettings.Instance, payload.Settings); + } + } +} diff --git a/stream_deck_plugin/ClipTrimDotNet/Keys/PageNavigator.cs b/stream_deck_plugin/ClipTrimDotNet/Keys/PageNavigator.cs new file mode 100644 index 0000000..5294384 --- /dev/null +++ b/stream_deck_plugin/ClipTrimDotNet/Keys/PageNavigator.cs @@ -0,0 +1,107 @@ +using BarRaider.SdTools; +using ClipTrimDotNet.Client; +using Microsoft.AspNetCore.Authentication; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClipTrimDotNet.Keys +{ + [PluginActionId("com.michal-courson.cliptrim.page-navigator")] + public class PageNavigator : KeypadBase + { + static List instances = new(); + private KeyCoordinates coordinates; + public PageNavigator(SDConnection connection, InitialPayload payload) : base(connection, payload) + { + coordinates = payload.Coordinates; + GlobalSettingsManager.Instance.RequestGlobalSettings(); + instances.Add(this); + OnTick(); + } + public void Instance_OnReceivedGlobalSettings(object sender, ReceivedGlobalSettingsPayload e) + { + Tools.AutoPopulateSettings(GlobalSettings.Instance, e.Settings); + } + public int GetIndex() + { + int index = Math.Min(Math.Max(coordinates.Column - 1, 0), 2); + return index; + } + public override void Dispose() + { + } + public override void KeyPressed(KeyPayload payload) + { + switch (GetIndex()) + { + case 0: + ClipTrimClient.Instance.PageDown(); + break; + case 1: + ClipTrimClient.Instance.PageMode = !ClipTrimClient.Instance.PageMode; + break; + case 2: + ClipTrimClient.Instance.PageUp(); + break; + } + Player.TickAll(); + TickAll(); + } + + public static void TickAll() + { + foreach (var instance in instances) + { + instance.OnTick(); + } + instances.RemoveAll(i => i == null); + } + + private async void SetTitle() + { + switch (GetIndex()) + { + case 0: + await Connection.SetTitleAsync(ClipTrimClient.Instance.CanPageDown ? "<" : ""); + break; + case 1: + await Connection.SetTitleAsync((ClipTrimClient.Instance.PageIndex + 1).ToString()); + break; + case 2: + await Connection.SetTitleAsync(ClipTrimClient.Instance.CanPageUp ? ">" : ""); + break; + } + } + + public override void OnTick() + { + SetTitle(); + } + + public override void KeyReleased(KeyPayload payload) + { + + } + + public override void ReceivedSettings(ReceivedSettingsPayload payload) + { + + } + public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) + { + Tools.AutoPopulateSettings(GlobalSettings.Instance, payload.Settings); + //if (payload.Settings == null || payload.Settings.Count == 0) + //{ + // var inst = GlobalSettings.Instance; + // //GlobalSettingsManager.Instance.SetGlobalSettings(JObject.FromObject(inst)); + //} + //else + //{ + // GlobalSettings.Instance = payload.Settings.ToObject(); + //} + } + } +} diff --git a/stream_deck_plugin/ClipTrimDotNet/Player.cs b/stream_deck_plugin/ClipTrimDotNet/Keys/Player.cs similarity index 56% rename from stream_deck_plugin/ClipTrimDotNet/Player.cs rename to stream_deck_plugin/ClipTrimDotNet/Keys/Player.cs index d3b3cb7..44b0269 100644 --- a/stream_deck_plugin/ClipTrimDotNet/Player.cs +++ b/stream_deck_plugin/ClipTrimDotNet/Keys/Player.cs @@ -12,36 +12,46 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ClipTrimDotNet +namespace ClipTrimDotNet.Keys { [PluginActionId("com.michal-courson.cliptrim.player")] public class Player : KeypadBase { - private ClipMetadata? metadata; + private int coordIndex; + private string? current_text = null; private KeyCoordinates coordinates; + static List instances = new(); + public Player(SDConnection connection, InitialPayload payload) : base(connection, payload) { - this.coordinates = payload.Coordinates; + coordinates = payload.Coordinates; GlobalSettingsManager.Instance.RequestGlobalSettings(); - CheckFile(); + instances.Add(this); + coordIndex = Math.Max((coordinates.Row - 1) * 5 + coordinates.Column, 0); + OnTick(); } - public void Instance_OnReceivedGlobalSettings(object sender, ReceivedGlobalSettingsPayload e) + public static void TickAll() { - Tools.AutoPopulateSettings(GlobalSettings.Instance, e.Settings); + Logger.Instance.LogMessage(TracingLevel.INFO, "Ticking all Player instances" + instances.Count); + foreach (var instance in instances) + { + instance.OnTick(); + } + instances.RemoveAll(i => i == null); } - public int GetIndex() - { - return Math.Max((coordinates.Row - 1) * 5 + coordinates.Column, 0); - } - private async void CheckFile() { - metadata = ClipTrimClient.Instance.GetClipByPagedIndex(GetIndex()); - await Connection.SetTitleAsync($"{metadata?.Name ?? ""}"); + var next_text = ClipTrimClient.Instance.GetPlayerStringByCoordinateIndex(coordIndex); + if(next_text != current_text) + { + current_text = next_text; + await Connection.SetTitleAsync($"{current_text ?? ""}"); + } + current_text = next_text; } public override void Dispose() @@ -50,7 +60,7 @@ namespace ClipTrimDotNet public override void KeyPressed(KeyPayload payload) { - ClipTrimClient.Instance.PlayClip(metadata); + ClipTrimClient.Instance.PlayClip(coordIndex); } @@ -60,15 +70,7 @@ namespace ClipTrimDotNet public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { - if (payload.Settings == null || payload.Settings.Count == 0) - { - var inst = GlobalSettings.Instance; - //GlobalSettingsManager.Instance.SetGlobalSettings(JObject.FromObject(inst)); - } - else - { - GlobalSettings.Instance = payload.Settings.ToObject(); - } + Tools.AutoPopulateSettings(GlobalSettings.Instance, payload.Settings); } public override void KeyReleased(KeyPayload payload) diff --git a/stream_deck_plugin/ClipTrimDotNet/ProfileSwitcher.cs b/stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs similarity index 78% rename from stream_deck_plugin/ClipTrimDotNet/ProfileSwitcher.cs rename to stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs index d95eed0..cb3ac19 100644 --- a/stream_deck_plugin/ClipTrimDotNet/ProfileSwitcher.cs +++ b/stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs @@ -12,12 +12,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ClipTrimDotNet +namespace ClipTrimDotNet.Keys { public class DataSourceItem { - public string label { get; set; } - public string value { get; set; } + public string label { get; set; } = ""; + public string value { get; set; } = ""; } [PluginActionId("com.michal-courson.cliptrim.profile-switcher")] public class ProfileSwitcher : KeypadBase @@ -44,13 +44,14 @@ namespace ClipTrimDotNet { if (payload.Settings == null || payload.Settings.Count == 0) { - this.settings = PluginSettings.CreateDefaultSettings(); + settings = PluginSettings.CreateDefaultSettings(); SaveSettings(); } else { - this.settings = payload.Settings.ToObject()!; + settings = payload.Settings.ToObject()!; } + Logger.Instance.LogMessage(TracingLevel.INFO, $"ProfileSwitcher initialized with payload {JsonConvert.SerializeObject(payload)}"); GlobalSettingsManager.Instance.RequestGlobalSettings(); Connection.OnSendToPlugin += Connection_OnSendToPlugin; SetTitle(); @@ -112,14 +113,15 @@ namespace ClipTrimDotNet public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { - if (payload.Settings == null || payload.Settings.Count == 0) - { - var inst = GlobalSettings.Instance; - } - else - { - GlobalSettings.Instance = payload.Settings.ToObject(); - } + Tools.AutoPopulateSettings(GlobalSettings.Instance, payload.Settings); + //if (payload.Settings == null || payload.Settings.Count == 0) + //{ + // var inst = GlobalSettings.Instance; + //} + //else + //{ + // GlobalSettings.Instance = payload.Settings.ToObject(); + //} } #region Private Methods diff --git a/stream_deck_plugin/ClipTrimDotNet/manifest.json b/stream_deck_plugin/ClipTrimDotNet/manifest.json index ae0ee3b..5185179 100644 --- a/stream_deck_plugin/ClipTrimDotNet/manifest.json +++ b/stream_deck_plugin/ClipTrimDotNet/manifest.json @@ -30,6 +30,36 @@ "Tooltip": "Selects which sub folder to use and opens effect profile", "UUID": "com.michal-courson.cliptrim.profile-switcher", "PropertyInspectorPath": "PropertyInspector/profile_swticher.html" + }, + { + "Icon": "Images/icon", + "Name": "Page Navigator", + "States": [ + { + "Image": "Images/pluginAction", + "TitleAlignment": "middle", + "FontSize": 16 + } + ], + "SupportedInMultiActions": false, + "Tooltip": "Navigates pages", + "UUID": "com.michal-courson.cliptrim.page-navigator", + "PropertyInspectorPath": "PropertyInspector/file_player.html" + }, + { + "Icon": "Images/icon", + "Name": "Save Clip", + "States": [ + { + "Image": "Images/pluginAction", + "TitleAlignment": "middle", + "FontSize": 16 + } + ], + "SupportedInMultiActions": false, + "Tooltip": "Saves the current clip", + "UUID": "com.michal-courson.cliptrim.clip-save", + "PropertyInspectorPath": "PropertyInspector/file_player.html" } ], "Author": "Michal Courson",