From 09d27c8b4f3a8e4305108ab37b089dc6be7b6611 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Mon, 26 Nov 2018 15:34:59 +0000 Subject: [PATCH] =?utf8?q?Feature=20#106=20MediaCubeAPI=20b=C5=91v=C3=ADt?= =?utf8?q?=C3=A9se=20szinkron=20folyamat=20futtat=C3=A1ssal?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31351 --- .../Configuration/configuration - Copy.json | 6 +- .../Maestro/Configuration/configuration.json | 2 +- client/Maestro/Program.cs | 51 +++++--- client/MediaCubeClient/MediaCubeApi.cs | 9 +- client/MediaCubeClient/MediaCubeClient.csproj | 2 + client/MediaCubeClient/MediaCubeStrings.cs | 11 ++ client/MediaCubeClient/MediaCubeWSApi.cs | 114 ++++++++++++++++++ client/MediaCubeClient/NexioAPI.cs | 12 +- 8 files changed, 174 insertions(+), 33 deletions(-) create mode 100644 client/MediaCubeClient/MediaCubeStrings.cs create mode 100644 client/MediaCubeClient/MediaCubeWSApi.cs diff --git a/client/Maestro/Configuration/configuration - Copy.json b/client/Maestro/Configuration/configuration - Copy.json index 1e964867..8a54c54b 100644 --- a/client/Maestro/Configuration/configuration - Copy.json +++ b/client/Maestro/Configuration/configuration - Copy.json @@ -1,6 +1,6 @@ { "title": "Development", - "active": false, + "active": true, "startInTray": false, "enableCustomMetadataId": true, "filter": "avi", @@ -10,7 +10,7 @@ "$type": "NEXIOSource", "hideEmpty": true, "local": { - "address": "ws://10.10.1.27/services/nexio" + "address": "ws://localhost:8888/services/nexio" }, "remote": { "address": "ftp://10.10.1.55:2098", @@ -38,7 +38,7 @@ { "$type": "MediaCubeMetadata", "server": { - "address": "http://10.10.1.27/services/rest/jobengine", + "address": "http://localhost:8888/services/rest/jobengine", "userName": "mediacube", "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", "timeout": 1000 diff --git a/client/Maestro/Configuration/configuration.json b/client/Maestro/Configuration/configuration.json index 24c4828a..f755d8f7 100644 --- a/client/Maestro/Configuration/configuration.json +++ b/client/Maestro/Configuration/configuration.json @@ -1,6 +1,6 @@ { "title": "Development", - "active": true, + "active": false, "startInTray": false, "enableCustomMetadataId": true, "filter": "avi", diff --git a/client/Maestro/Program.cs b/client/Maestro/Program.cs index 628f7e0b..bd05c20b 100644 --- a/client/Maestro/Program.cs +++ b/client/Maestro/Program.cs @@ -2,10 +2,13 @@ using LinkDotNet.MessageHandling.Contracts; using Maestro.Properties; using MaestroShared.Configuration; +using MediaCubeClient; +using Newtonsoft.Json.Linq; using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics; using System.DirectoryServices.AccountManagement; using System.IO; using System.Linq; @@ -29,14 +32,32 @@ namespace Maestro { [STAThread] [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)] static void Main() { + + IMessageBus mb = new MessageBus(); + mb.Subscribe(m => { + if (m.Finished) { + if (!string.IsNullOrEmpty(m.Content)) + Debug.WriteLine("Error " + m.Content); + Debug.WriteLine("Finished"); + } else + Debug.WriteLine("Progress " + m.Data.As("progress")); + }); + MediaCubeWSApi c = new MediaCubeWSApi("ws://localhost:8888/services/wsapi", mb); + JObject data = new JObject(); + data.Add("itemID", JToken.FromObject(0)); + data.Add("resultID", JToken.FromObject(0)); + c.SubmitJob("fake.xml", data); + Thread.Sleep(1000000); + return; + + string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString(); string userName = WindowsIdentity.GetCurrent().Name; string mutexId = string.Format("Global\\{0}-{1}", appGuid, userName.Replace('\\', '-')); - bool createdNew; var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); var securitySettings = new MutexSecurity(); securitySettings.AddAccessRule(allowEveryoneRule); - using (var mutex = new Mutex(false, mutexId, out createdNew, securitySettings)) { + using (var mutex = new Mutex(false, mutexId, out bool createdNew, securitySettings)) { var hasHandle = false; bool enableInstance = TrayApplicationContext.HasCommandlineParameter(TrayApplicationContext.NOSINGLE); try { @@ -46,16 +67,14 @@ namespace Maestro { if (hasHandle == false) MessageBox.Show("A MediaCube Maestro alkalmazás már fut egy példányban."); } - } - catch (AbandonedMutexException) { + } catch (AbandonedMutexException) { hasHandle = true; } - } - finally { + } finally { if (hasHandle || enableInstance) { TrayApplicationContext context = null; try { - Application.ThreadException += (s,e) => { + Application.ThreadException += (s, e) => { logger.Error(e); MessageBox.Show(new Form() { TopMost = true }, e.Exception?.Message); }; @@ -68,12 +87,10 @@ namespace Maestro { context = new TrayApplicationContext(); context.Start(); Application.Run(context); - } - catch (Exception e) { + } catch (Exception e) { logger.Error(e); MessageBox.Show(new Form() { TopMost = true }, e.Message); - } - finally { + } finally { if (hasHandle) mutex.ReleaseMutex(); if (context != null) @@ -105,7 +122,7 @@ namespace Maestro { private const string HYPHEN = "-"; private NotifyIcon trayIcon; private ConcurrentBag forms = new ConcurrentBag(); - private IMessageBus messageBus = new MessageBus(); + private readonly IMessageBus messageBus = new MessageBus(); public static string UserName { get; set; } public static GlobalInfo GlobalConfig { get; internal set; } @@ -134,14 +151,14 @@ namespace Maestro { throw new Exception(CONFIG_ERROR); GlobalConfig = LoadGlobalConfig(configFiles); - + CheckUser(); CreateForms(configFiles); CreateTrayIcon(); } private void CreateForms(string[] configFiles) { - foreach (String file in configFiles) { + foreach (string file in configFiles) { string audioRecorderFile = ConfigurationSerializer.Combine(AUDIORECORDER_JSON); if (file.ToLower().Equals(audioRecorderFile.ToLower())) continue; @@ -224,8 +241,7 @@ namespace Maestro { password = loginForm.Password; } } - } - catch (Exception e) { + } catch (Exception e) { throw new Exception("Hiba a hitelesítő adatok lekérdezésekor. A rendszer üzenete: " + e.Message); } @@ -244,8 +260,7 @@ namespace Maestro { form.ShowFormMinimized(); else form.ShowForm(); - } - catch (Exception e) { + } catch (Exception e) { logger.Error(e); MessageBox.Show(e.Message); } diff --git a/client/MediaCubeClient/MediaCubeApi.cs b/client/MediaCubeClient/MediaCubeApi.cs index 3efdd14e..de543302 100644 --- a/client/MediaCubeClient/MediaCubeApi.cs +++ b/client/MediaCubeClient/MediaCubeApi.cs @@ -1,3 +1,6 @@ +using LinkDotNet.MessageHandling.Contracts; +using MaestroShared.Interfaces; +using MaestroShared.MessageBus; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using NLog; @@ -7,9 +10,6 @@ using System; using System.Diagnostics; using System.Net; using System.Runtime.Serialization; -using LinkDotNet.MessageHandling.Contracts; -using MaestroShared.MessageBus; -using MaestroShared.Interfaces; namespace MediaCubeClient { public class MediaCubeMessage : MaestroMessage { @@ -25,6 +25,7 @@ namespace MediaCubeClient { private string user; private string pwd; private IMessageBus messageBus; + private object template; public MediaCubeApi(string address, string user, string pwd, int timeout, IMessageBus messageBus) { this.user = user; @@ -43,7 +44,7 @@ namespace MediaCubeClient { public T Create(object data) { var request = new RestRequest("create", Method.POST); - String body = JsonConvert.SerializeObject(data, serializerSettings); + string body = JsonConvert.SerializeObject(data, serializerSettings); //Debug.WriteLine(body); request.AddParameter("application/json", body, ParameterType.RequestBody); var response = client.Execute(request); diff --git a/client/MediaCubeClient/MediaCubeClient.csproj b/client/MediaCubeClient/MediaCubeClient.csproj index fb4c22d5..b59eb955 100644 --- a/client/MediaCubeClient/MediaCubeClient.csproj +++ b/client/MediaCubeClient/MediaCubeClient.csproj @@ -102,7 +102,9 @@ + + diff --git a/client/MediaCubeClient/MediaCubeStrings.cs b/client/MediaCubeClient/MediaCubeStrings.cs new file mode 100644 index 00000000..85667f89 --- /dev/null +++ b/client/MediaCubeClient/MediaCubeStrings.cs @@ -0,0 +1,11 @@ +namespace MediaCubeClient { + class MediaCubeStrings { + public static readonly string ACTION = "action"; + public static readonly string LIST = "list"; + public static readonly string STARTJOB = "startjob"; + public static readonly string ERROR = "error"; + public static readonly string STATUS = "status"; + public static readonly string TEMPLATE = "template"; + public static readonly string PARAMETERS = "parameters"; + } +} diff --git a/client/MediaCubeClient/MediaCubeWSApi.cs b/client/MediaCubeClient/MediaCubeWSApi.cs new file mode 100644 index 00000000..bdf7be3b --- /dev/null +++ b/client/MediaCubeClient/MediaCubeWSApi.cs @@ -0,0 +1,114 @@ +using LinkDotNet.MessageHandling.Contracts; +using MaestroShared.MessageBus; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using WebSocketSharp; + +namespace MediaCubeClient { + public class MediaCubeWSMessage : MaestroMessage { + public bool Finished { get; } + public JObject Data { get; } + + public MediaCubeWSMessage() : base(null) { + Finished = true; + } + + public MediaCubeWSMessage(string message) : base(message) { + Finished = true; + } + + public MediaCubeWSMessage(JObject data) : base(null) { + Data = data; + } + + } + + public class MediaCubeWSApi { + private const string DATEFORMAT = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK"; + private static NLog.Logger logger = LogManager.GetCurrentClassLogger(); + private JsonSerializerSettings serializerSettings; + private readonly string address; + private IMessageBus messageBus; + + public MediaCubeWSApi(string address, IMessageBus messageBus) { + this.address = address; + this.messageBus = messageBus; + serializerSettings = new JsonSerializerSettings { + TypeNameHandling = TypeNameHandling.Objects, + SerializationBinder = new TypeNameSerializationBinder(), + DateFormatString = DATEFORMAT + }; + } + /* + public T Create(object data) { + var request = new RestRequest("create", Method.POST); + string body = JsonConvert.SerializeObject(data, serializerSettings); + //Debug.WriteLine(body); + request.AddParameter("application/json", body, ParameterType.RequestBody); + var response = client.Execute(request); + if (response.StatusCode != HttpStatusCode.OK && response.ErrorMessage != null) { + messageBus.Send(new MediaCubeMessage("Sikertelen kapcsolódás a MediaCube rendszerhez.")); + return default(T); + } + //Debug.WriteLine(response.Content); + var result = JsonConvert.DeserializeObject(response.Content); + return result; + } + */ + public void SubmitJob(string template, JObject parameters) { + WebSocket ws = new WebSocket(address); + ws.SslConfiguration.ServerCertificateValidationCallback = (s, c, ch, e) => { + return true; + }; + ws.OnMessage += (s, e) => { + JObject jo = JObject.Parse(e.Data); + if (true.Equals(jo.As(MediaCubeStrings.ERROR))) { + ws.Close(); + messageBus.Send(new MediaCubeWSMessage("Hiba a MediaCube szolgáltatás használata során. A rendszer üzenete: " + jo.As(MediaCubeStrings.ERROR))); + return; + } + if ("FINISHED".Equals(jo.As(MediaCubeStrings.STATUS))) { + ws.Close(); + messageBus.Send(new MediaCubeWSMessage()); + return; + } + messageBus.Send(new MediaCubeWSMessage(jo)); + }; + ws.OnError += (s, e) => { + ws.Close(); + messageBus.Send(new MediaCubeWSMessage("Hiba a MediaCube szolgáltatás használata során. A rendszer üzenete: " + e.Message)); + }; + + try { + ws.Connect(); + } catch { + ws.Close(); + messageBus.Send(new MediaCubeWSMessage("Sikertelen kapcsolódás a MediaCube szolgáltatáshoz.")); + } + try { + JObject data = new JObject(); + data.Add(MediaCubeStrings.ACTION, JToken.FromObject(MediaCubeStrings.STARTJOB)); + data.Add(MediaCubeStrings.TEMPLATE, JToken.FromObject(template)); + data.Add(MediaCubeStrings.PARAMETERS, JToken.FromObject(parameters)); + ws.Send(data.ToString()); + } catch (Exception e) { + ws.Close(); + messageBus.Send(new MediaCubeWSMessage("Sikertelen MediaCube folyamatindítás.")); + } + } + + + } + +} + + +public static class JObjectValues { + + public static T As(this JObject jo, string field) { + JToken jToken = jo.GetValue(field); + return jToken == null ? default(T) : jToken.Value(); + } +} diff --git a/client/MediaCubeClient/NexioAPI.cs b/client/MediaCubeClient/NexioAPI.cs index 55319e34..027b6348 100644 --- a/client/MediaCubeClient/NexioAPI.cs +++ b/client/MediaCubeClient/NexioAPI.cs @@ -1,9 +1,9 @@ +using LinkDotNet.MessageHandling.Contracts; +using MediaCubeClient; using Newtonsoft.Json.Linq; using System; using System.Diagnostics; using WebSocketSharp; -using LinkDotNet.MessageHandling.Contracts; -using MediaCubeClient; namespace NexioClient { public class NexioAPI { @@ -17,7 +17,7 @@ namespace NexioClient { private string path; private IMessageBus messageBus; - public NexioAPI(String path, IMessageBus messageBus) { + public NexioAPI(string path, IMessageBus messageBus) { this.path = path; this.messageBus = messageBus; } @@ -51,8 +51,7 @@ namespace NexioClient { Debug.WriteLine("OnClose: " + e.Reason); try { ws.Connect(); - } - catch (Exception e) { + } catch (Exception e) { messageBus.Send(new MediaCubeMessage("Sikertelen kapcsolódás a MediaCube NEXIO szolgáltatásához.")); } } @@ -62,8 +61,7 @@ namespace NexioClient { data.Add(ACTION, JToken.FromObject(LIST)); try { ws.Send(data.ToString()); - } - catch (Exception e) { + } catch (Exception e) { messageBus.Send(new MediaCubeMessage("Sikertelen inicializálás a MediaCube NEXIO szolgáltatásában.")); } } -- 2.54.0