| 
					
				 | 
			
			
				@@ -53,16 +53,9 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public IActionResult GetDevices([FromQuery] bool? supportsSync, [FromQuery] Guid? userId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var deviceQuery = new DeviceQuery { SupportsSync = supportsSync, UserId = userId ?? Guid.Empty }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var devices = _deviceManager.GetDevices(deviceQuery); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(devices); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var deviceQuery = new DeviceQuery { SupportsSync = supportsSync, UserId = userId ?? Guid.Empty }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var devices = _deviceManager.GetDevices(deviceQuery); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(devices); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -77,20 +70,13 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public IActionResult GetDeviceInfo([FromQuery, BindRequired] string id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var deviceInfo = _deviceManager.GetDevice(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (deviceInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return NotFound(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(deviceInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var deviceInfo = _deviceManager.GetDevice(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (deviceInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return NotFound(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(deviceInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -105,20 +91,13 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public IActionResult GetDeviceOptions([FromQuery, BindRequired] string id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var deviceInfo = _deviceManager.GetDeviceOptions(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (deviceInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var deviceInfo = _deviceManager.GetDeviceOptions(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (deviceInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return NotFound(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(deviceInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return NotFound(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(deviceInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -136,21 +115,14 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             [FromQuery, BindRequired] string id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             [FromBody, BindRequired] DeviceOptions deviceOptions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var existingDeviceOptions = _deviceManager.GetDeviceOptions(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (existingDeviceOptions == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return NotFound(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                _deviceManager.UpdateDeviceOptions(id, deviceOptions); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var existingDeviceOptions = _deviceManager.GetDeviceOptions(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (existingDeviceOptions == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return NotFound(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _deviceManager.UpdateDeviceOptions(id, deviceOptions); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -163,21 +135,14 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public IActionResult DeleteDevice([FromQuery, BindRequired] string id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var sessions = _authenticationRepository.Get(new AuthenticationInfoQuery { DeviceId = id }).Items; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                foreach (var session in sessions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    _sessionManager.Logout(session); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var sessions = _authenticationRepository.Get(new AuthenticationInfoQuery { DeviceId = id }).Items; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var session in sessions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _sessionManager.Logout(session); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -190,15 +155,8 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public IActionResult GetCameraUploads([FromQuery, BindRequired] string id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var uploadHistory = _deviceManager.GetCameraUploadHistory(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(uploadHistory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var uploadHistory = _deviceManager.GetCameraUploadHistory(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(uploadHistory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -219,46 +177,33 @@ namespace Jellyfin.Api.Controllers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             [FromQuery, BindRequired] string name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             [FromQuery, BindRequired] string id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Stream fileStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                string contentType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Stream fileStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            string contentType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (Request.HasFormContentType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (Request.HasFormContentType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (Request.Form.Files.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (Request.Form.Files.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        fileStream = Request.Form.Files[0].OpenReadStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        contentType = Request.Form.Files[0].ContentType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return BadRequest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    fileStream = Request.Form.Files[0].OpenReadStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    contentType = Request.Form.Files[0].ContentType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    fileStream = Request.Body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    contentType = Request.ContentType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return BadRequest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await _deviceManager.AcceptCameraUpload( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    deviceId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    fileStream, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    new LocalFileInfo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        MimeType = contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Album = album, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Name = name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Id = id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    }).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return StatusCode(StatusCodes.Status500InternalServerError, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                fileStream = Request.Body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                contentType = Request.ContentType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            await _deviceManager.AcceptCameraUpload( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                deviceId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                fileStream, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new LocalFileInfo { MimeType = contentType, Album = album, Name = name, Id = id }).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |