Example #1
0
        private void StartStream()
        {
            var    cameraId = _packet.Args[0].ToString();
            Camera camera;

            if (Cameras.TryGetValue(cameraId, out camera) && camera != null && !camera.StreamActive)
            {
                camera.StreamActive = true;
                Cameras[cameraId]   = camera;
                var cameraStream = new Thread(() => GetWebCamFrame(cameraId));
                cameraStream.Start();
                var data = new
                {
                    cameraId,
                    cameraStreamStarted = true
                };
                _builder.WriteMessage(data);
            }
            else
            {
                if (camera != null)
                {
                    var data = new
                    {
                        cameraId,
                        cameraStreamStarted = true
                    };
                    _builder.WriteMessage(data);
                }
            }
        }
Example #2
0
        private void GetWebCamFrame(string cameraId)
        {
            Camera camera;

            if (!Cameras.TryGetValue(cameraId, out camera))
            {
                return;
            }
            while (_client != null && _client.IsConnected && camera.StreamActive && camera.Physical.IsRunning)
            {
                byte[] imageBytes;
                if (CameraFrames.TryGetValue(cameraId, out imageBytes))
                {
                    var cameraData = new
                    {
                        cameraId,
                        cameraData = imageBytes.Select(b => (int)b).ToArray()
                    };
                    _builder.Endpoint = "cameraframe";
                    _builder.WriteMessage(cameraData);
                }
                Thread.Sleep(150);
            }
            camera.StreamActive = false;
        }
Example #3
0
        /// <summary>
        /// Takes a snapshot of the specified camera.
        /// </summary>
        /// <returns>A string to the file path.</returns>
        public async Task <byte[]> TakeSnapshotAsync(string cameraName)
        {
            CookieContainer cookieContainer = new CookieContainer();

            using (HttpClient client = GetHttpClient(Config.Url, cookieContainer))
            {
                cookieContainer.Add(client.BaseAddress, new Cookie("id", Cookie.Value));

                if (Cameras.TryGetValue(cameraName, out int id))
                {
                    _logger.LogDebug($"{cameraName}: Found with Synology ID '{id}'.");

                    string resource = string.Format(URI_CAMERA_SNAPSHOT + $"&profileType={(int)Config.Quality}", _cameraPath, Config.ApiVersionCamera, id);
                    _logger.LogDebug($"{cameraName}: Taking snapshot from '{resource}'.");

                    _logger.LogInformation($"{cameraName}: Taking snapshot");
                    HttpResponseMessage response = await client.GetAsync(resource);

                    response.EnsureSuccessStatusCode();

                    if (response.Content.Headers.ContentType.MediaType == "image/jpeg")
                    {
                        // Only return the bytes when we have a valid image back
                        _logger.LogDebug($"{cameraName}: Reading snapshot");
                        return(await response.Content.ReadAsByteArrayAsync());
                    }
                    else
                    {
                        // We didn't get an image type back, so this must have errored
                        SynologyResponse errorResponse = await GetErrorResponse(response);

                        if (errorResponse.Success)
                        {
                            // This should never happen, but let's add logging just in case
                            _logger.LogError($"{cameraName}: Failed to get snapshot, but the API reported success.");
                        }
                        else
                        {
                            _logger.LogError($"{cameraName}: Failed to get snapshot with error code '{errorResponse.Error.Code}'");
                        }
                    }
                }
                else
                {
                    _logger.LogError($"The camera with the name '{cameraName}' was not found in the Synology camera list.");
                }

                return(null);
            }
        }
Example #4
0
        private void StartCamera()
        {
            var    cameraId = _packet.Args[0].ToString();
            Camera camera;

            if (Cameras.TryGetValue(cameraId, out camera))
            {
                var cameraStarted = WebCamManager.StartCamera(cameraId);
                var data          = new
                {
                    cameraId,
                    cameraRunning = camera.Physical.IsRunning,
                    cameraStarted
                };
                _builder.WriteMessage(data);
            }
        }
Example #5
0
        private void StopStream()
        {
            var    cameraId = _packet.Args[0].ToString();
            Camera camera;

            if (Cameras.TryGetValue(cameraId, out camera))
            {
                camera.StreamActive = false;
                Cameras[cameraId]   = camera;
                WebCamManager.StopCamera(cameraId);
                var data = new
                {
                    cameraId,
                    cameraStreamStopped = true
                };
                _builder.WriteMessage(data);
            }
        }
Example #6
0
        SoftwareCameraInfo IProductCameraProvider.GetCamera(string productName, CameraInfo cameraInfo, CameraModelInfo cameraModelInfo)
        {
            if (!new[] { "SDM" }.Contains(productName, StringComparer.InvariantCulture))
            {
                return(null);
            }

            if (cameraInfo.Canon?.ModelId == null)
            {
                return(null);
            }
            var modelId = $"0x{cameraInfo.Canon.ModelId:x}";

            if (!Cameras.TryGetValue(modelId, out Camera camera))
            {
                return(null);
            }

            var model = camera.Models.SingleOrDefault(m => m.Names[0].Equals(cameraModelInfo.Names[0]));

            if (model == null)
            {
                return(null);
            }

            //TODO
            var platform = model.Prefix;

            if (productName?.Equals("SDM") == true)
            {
                platform = platform.Split('_')[0];
            }

            return(new SoftwareCameraInfo
            {
                Platform = platform,
                Revision = GetFirmwareRevision(cameraInfo)
            });
        }