rework device repository

pull/1154/head
Luke Pulverenti 7 years ago
parent c583d49541
commit 9fdaa039c4

@ -938,7 +938,9 @@ namespace Emby.Server.Implementations
ConnectManager = CreateConnectManager(); ConnectManager = CreateConnectManager();
RegisterSingleInstance(ConnectManager); RegisterSingleInstance(ConnectManager);
DeviceManager = new DeviceManager(new DeviceRepository(ApplicationPaths, JsonSerializer, LogManager.GetLogger("DeviceManager"), FileSystemManager), UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager); var deviceRepo = new SqliteDeviceRepository(LogManager.GetLogger("DeviceManager"), ServerConfigurationManager, FileSystemManager, JsonSerializer);
deviceRepo.Initialize();
DeviceManager = new DeviceManager(deviceRepo, UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager);
RegisterSingleInstance(DeviceManager); RegisterSingleInstance(DeviceManager);
var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer); var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer);

@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Devices
_network = network; _network = network;
} }
public async Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId) public DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId)
{ {
if (string.IsNullOrWhiteSpace(reportedId)) if (string.IsNullOrWhiteSpace(reportedId))
{ {
@ -76,14 +76,16 @@ namespace Emby.Server.Implementations.Devices
device.DateLastModified = DateTime.UtcNow; device.DateLastModified = DateTime.UtcNow;
await _repo.SaveDevice(device).ConfigureAwait(false); device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName;
_repo.SaveDevice(device);
return device; return device;
} }
public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities) public void SaveCapabilities(string reportedId, ClientCapabilities capabilities)
{ {
return _repo.SaveCapabilities(reportedId, capabilities); _repo.SaveCapabilities(reportedId, capabilities);
} }
public ClientCapabilities GetCapabilities(string reportedId) public ClientCapabilities GetCapabilities(string reportedId)
@ -98,13 +100,13 @@ namespace Emby.Server.Implementations.Devices
public QueryResult<DeviceInfo> GetDevices(DeviceQuery query) public QueryResult<DeviceInfo> GetDevices(DeviceQuery query)
{ {
IEnumerable<DeviceInfo> devices = _repo.GetDevices().OrderByDescending(i => i.DateLastModified); IEnumerable<DeviceInfo> devices = _repo.GetDevices();
if (query.SupportsSync.HasValue) if (query.SupportsSync.HasValue)
{ {
var val = query.SupportsSync.Value; var val = query.SupportsSync.Value;
devices = devices.Where(i => GetCapabilities(i.Id).SupportsSync == val); devices = devices.Where(i => i.Capabilities.SupportsSync == val);
} }
if (query.SupportsPersistentIdentifier.HasValue) if (query.SupportsPersistentIdentifier.HasValue)
@ -113,8 +115,7 @@ namespace Emby.Server.Implementations.Devices
devices = devices.Where(i => devices = devices.Where(i =>
{ {
var caps = GetCapabilities(i.Id); var deviceVal = i.Capabilities.SupportsPersistentIdentifier;
var deviceVal = caps.SupportsPersistentIdentifier;
return deviceVal == val; return deviceVal == val;
}); });
} }
@ -132,9 +133,9 @@ namespace Emby.Server.Implementations.Devices
}; };
} }
public Task DeleteDevice(string id) public void DeleteDevice(string id)
{ {
return _repo.DeleteDevice(id); _repo.DeleteDevice(id);
} }
public ContentUploadHistory GetCameraUploadHistory(string deviceId) public ContentUploadHistory GetCameraUploadHistory(string deviceId)
@ -213,14 +214,16 @@ namespace Emby.Server.Implementations.Devices
get { return Path.Combine(_config.CommonApplicationPaths.DataPath, "camerauploads"); } get { return Path.Combine(_config.CommonApplicationPaths.DataPath, "camerauploads"); }
} }
public async Task UpdateDeviceInfo(string id, DeviceOptions options) public void UpdateDeviceInfo(string id, DeviceOptions options)
{ {
var device = GetDevice(id); var device = GetDevice(id);
device.CustomName = options.CustomName; device.CustomName = options.CustomName;
device.CameraUploadPath = options.CameraUploadPath; device.CameraUploadPath = options.CameraUploadPath;
await _repo.SaveDevice(device).ConfigureAwait(false); device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName;
_repo.SaveDevice(device);
EventHelper.FireEventIfNotNull(DeviceOptionsUpdated, this, new GenericEventArgs<DeviceInfo>(device), _logger); EventHelper.FireEventIfNotNull(DeviceOptionsUpdated, this, new GenericEventArgs<DeviceInfo>(device), _logger);
} }

@ -1,212 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Session;
using MediaBrowser.Model.Extensions;
namespace Emby.Server.Implementations.Devices
{
public class DeviceRepository : IDeviceRepository
{
private readonly object _syncLock = new object();
private readonly IApplicationPaths _appPaths;
private readonly IJsonSerializer _json;
private readonly ILogger _logger;
private readonly IFileSystem _fileSystem;
private Dictionary<string, DeviceInfo> _devices;
public DeviceRepository(IApplicationPaths appPaths, IJsonSerializer json, ILogger logger, IFileSystem fileSystem)
{
_appPaths = appPaths;
_json = json;
_logger = logger;
_fileSystem = fileSystem;
}
private string GetDevicesPath()
{
return Path.Combine(_appPaths.DataPath, "devices");
}
private string GetDevicePath(string id)
{
return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N"));
}
public Task SaveDevice(DeviceInfo device)
{
var path = Path.Combine(GetDevicePath(device.Id), "device.json");
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
lock (_syncLock)
{
_json.SerializeToFile(device, path);
_devices[device.Id] = device;
}
return Task.FromResult(true);
}
public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities)
{
var device = GetDevice(reportedId);
if (device == null)
{
throw new ArgumentException("No device has been registed with id " + reportedId);
}
device.Capabilities = capabilities;
SaveDevice(device);
return Task.FromResult(true);
}
public ClientCapabilities GetCapabilities(string reportedId)
{
var device = GetDevice(reportedId);
return device == null ? null : device.Capabilities;
}
public DeviceInfo GetDevice(string id)
{
if (string.IsNullOrWhiteSpace(id))
{
throw new ArgumentNullException("id");
}
return GetDevices()
.FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase));
}
public IEnumerable<DeviceInfo> GetDevices()
{
lock (_syncLock)
{
if (_devices == null)
{
_devices = new Dictionary<string, DeviceInfo>(StringComparer.OrdinalIgnoreCase);
var devices = LoadDevices().ToList();
foreach (var device in devices)
{
_devices[device.Id] = device;
}
}
return _devices.Values.ToList();
}
}
private IEnumerable<DeviceInfo> LoadDevices()
{
var path = GetDevicesPath();
try
{
return _fileSystem
.GetFilePaths(path, true)
.Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase))
.ToList()
.Select(i =>
{
try
{
return _json.DeserializeFromFile<DeviceInfo>(i);
}
catch (Exception ex)
{
_logger.ErrorException("Error reading {0}", ex, i);
return null;
}
})
.Where(i => i != null);
}
catch (IOException)
{
return new List<DeviceInfo>();
}
}
public Task DeleteDevice(string id)
{
var path = GetDevicePath(id);
lock (_syncLock)
{
try
{
_fileSystem.DeleteDirectory(path, true);
}
catch (IOException)
{
}
_devices = null;
}
return Task.FromResult(true);
}
public ContentUploadHistory GetCameraUploadHistory(string deviceId)
{
var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
lock (_syncLock)
{
try
{
return _json.DeserializeFromFile<ContentUploadHistory>(path);
}
catch (IOException)
{
return new ContentUploadHistory
{
DeviceId = deviceId
};
}
}
}
public void AddCameraUpload(string deviceId, LocalFileInfo file)
{
var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
lock (_syncLock)
{
ContentUploadHistory history;
try
{
history = _json.DeserializeFromFile<ContentUploadHistory>(path);
}
catch (IOException)
{
history = new ContentUploadHistory
{
DeviceId = deviceId
};
}
history.DeviceId = deviceId;
var list = history.FilesUploaded.ToList();
list.Add(file);
history.FilesUploaded = list.ToArray(list.Count);
_json.SerializeToFile(history, path);
}
}
}
}

@ -0,0 +1,441 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using Emby.Server.Implementations.Data;
using MediaBrowser.Controller;
using MediaBrowser.Model.Logging;
using SQLitePCL.pretty;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Session;
using MediaBrowser.Controller.Configuration;
namespace Emby.Server.Implementations.Devices
{
public class SqliteDeviceRepository : BaseSqliteRepository, IDeviceRepository
{
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
protected IFileSystem FileSystem { get; private set; }
private readonly object _syncLock = new object();
private readonly IJsonSerializer _json;
private IServerApplicationPaths _appPaths;
public SqliteDeviceRepository(ILogger logger, IServerConfigurationManager config, IFileSystem fileSystem, IJsonSerializer json)
: base(logger)
{
var appPaths = config.ApplicationPaths;
DbFilePath = Path.Combine(appPaths.DataPath, "devices.db");
FileSystem = fileSystem;
_json = json;
_appPaths = appPaths;
}
public void Initialize()
{
try
{
InitializeInternal();
}
catch (Exception ex)
{
Logger.ErrorException("Error loading database file. Will reset and retry.", ex);
FileSystem.DeleteFile(DbFilePath);
InitializeInternal();
}
}
private void InitializeInternal()
{
using (var connection = CreateConnection())
{
RunDefaultInitialization(connection);
string[] queries = {
"create table if not exists Devices (Id TEXT PRIMARY KEY, Name TEXT, ReportedName TEXT, CustomName TEXT, CameraUploadPath TEXT, LastUserName TEXT, AppName TEXT, AppVersion TEXT, LastUserId TEXT, DateLastModified DATETIME, Capabilities TEXT)",
"create index if not exists idx_id on Devices(Id)"
};
connection.RunQueries(queries);
MigrateDevices();
}
}
private void MigrateDevices()
{
var files = FileSystem
.GetFilePaths(GetDevicesPath(), true)
.Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase))
.ToList();
foreach (var file in files)
{
try
{
var device = _json.DeserializeFromFile<DeviceInfo>(file);
SaveDevice(device);
}
catch (Exception ex)
{
Logger.ErrorException("Error reading {0}", ex, file);
}
finally
{
try
{
FileSystem.DeleteFile(file);
}
catch (IOException)
{
try
{
FileSystem.MoveFile(file, Path.ChangeExtension(file, ".old"));
}
catch (IOException)
{
}
}
}
}
}
private const string BaseSelectText = "select Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities from Devices";
public void SaveCapabilities(string deviceId, ClientCapabilities capabilities)
{
using (WriteLock.Write())
{
using (var connection = CreateConnection())
{
connection.RunInTransaction(db =>
{
using (var statement = db.PrepareStatement("update devices set Capabilities=@Capabilities where Id=@Id"))
{
statement.TryBind("@Id", deviceId);
if (capabilities == null)
{
statement.TryBindNull("@Capabilities");
}
else
{
statement.TryBind("@Capabilities", _json.SerializeToString(capabilities));
}
statement.MoveNext();
}
}, TransactionMode);
}
}
}
public void SaveDevice(DeviceInfo entry)
{
if (entry == null)
{
throw new ArgumentNullException("entry");
}
using (WriteLock.Write())
{
using (var connection = CreateConnection())
{
connection.RunInTransaction(db =>
{
using (var statement = db.PrepareStatement("replace into Devices (Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities) values (@Id, @Name, @ReportedName, @CustomName, @CameraUploadPath, @LastUserName, @AppName, @AppVersion, @LastUserId, @DateLastModified, @Capabilities)"))
{
statement.TryBind("@Id", entry.Id);
statement.TryBind("@Name", entry.Name);
statement.TryBind("@ReportedName", entry.ReportedName);
statement.TryBind("@CustomName", entry.CustomName);
statement.TryBind("@CameraUploadPath", entry.CameraUploadPath);
statement.TryBind("@LastUserName", entry.LastUserName);
statement.TryBind("@AppName", entry.AppName);
statement.TryBind("@AppVersion", entry.AppVersion);
statement.TryBind("@DateLastModified", entry.DateLastModified);
if (entry.Capabilities == null)
{
statement.TryBindNull("@Capabilities");
}
else
{
statement.TryBind("@Capabilities", _json.SerializeToString(entry.Capabilities));
}
statement.MoveNext();
}
}, TransactionMode);
}
}
}
public DeviceInfo GetDevice(string id)
{
using (WriteLock.Read())
{
using (var connection = CreateConnection(true))
{
var statementTexts = new List<string>();
statementTexts.Add(BaseSelectText + " where Id=@Id");
return connection.RunInTransaction(db =>
{
var statements = PrepareAllSafe(db, statementTexts).ToList();
using (var statement = statements[0])
{
statement.TryBind("@Id", id);
foreach (var row in statement.ExecuteQuery())
{
return GetEntry(row);
}
}
return null;
}, ReadTransactionMode);
}
}
}
public List<DeviceInfo> GetDevices()
{
using (WriteLock.Read())
{
using (var connection = CreateConnection(true))
{
var statementTexts = new List<string>();
statementTexts.Add(BaseSelectText + " order by DateLastModified desc");
return connection.RunInTransaction(db =>
{
var list = new List<DeviceInfo>();
var statements = PrepareAllSafe(db, statementTexts).ToList();
using (var statement = statements[0])
{
foreach (var row in statement.ExecuteQuery())
{
list.Add(GetEntry(row));
}
}
return list;
}, ReadTransactionMode);
}
}
}
public ClientCapabilities GetCapabilities(string id)
{
using (WriteLock.Read())
{
using (var connection = CreateConnection(true))
{
var statementTexts = new List<string>();
statementTexts.Add("Select Capabilities from Devices where Id=@Id");
return connection.RunInTransaction(db =>
{
var statements = PrepareAllSafe(db, statementTexts).ToList();
using (var statement = statements[0])
{
statement.TryBind("@Id", id);
foreach (var row in statement.ExecuteQuery())
{
if (row[0].SQLiteType != SQLiteType.Null)
{
return _json.DeserializeFromString<ClientCapabilities>(row.GetString(0));
}
}
}
return null;
}, ReadTransactionMode);
}
}
}
private DeviceInfo GetEntry(IReadOnlyList<IResultSetValue> reader)
{
var index = 0;
var info = new DeviceInfo
{
Id = reader.GetString(index)
};
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.Name = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.ReportedName = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.CustomName = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.CameraUploadPath = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.LastUserName = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.AppName = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.AppVersion = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.LastUserId = reader.GetString(index);
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.DateLastModified = reader[index].ReadDateTime();
}
index++;
if (reader[index].SQLiteType != SQLiteType.Null)
{
info.Capabilities = _json.DeserializeFromString<ClientCapabilities>(reader.GetString(index));
}
return info;
}
private string GetDevicesPath()
{
return Path.Combine(_appPaths.DataPath, "devices");
}
private string GetDevicePath(string id)
{
return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N"));
}
public ContentUploadHistory GetCameraUploadHistory(string deviceId)
{
var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
lock (_syncLock)
{
try
{
return _json.DeserializeFromFile<ContentUploadHistory>(path);
}
catch (IOException)
{
return new ContentUploadHistory
{
DeviceId = deviceId
};
}
}
}
public void AddCameraUpload(string deviceId, LocalFileInfo file)
{
var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path));
lock (_syncLock)
{
ContentUploadHistory history;
try
{
history = _json.DeserializeFromFile<ContentUploadHistory>(path);
}
catch (IOException)
{
history = new ContentUploadHistory
{
DeviceId = deviceId
};
}
history.DeviceId = deviceId;
var list = history.FilesUploaded.ToList();
list.Add(file);
history.FilesUploaded = list.ToArray(list.Count);
_json.SerializeToFile(history, path);
}
}
public void DeleteDevice(string id)
{
using (WriteLock.Write())
{
using (var connection = CreateConnection())
{
connection.RunInTransaction(db =>
{
using (var statement = db.PrepareStatement("delete from devices where Id=@Id"))
{
statement.TryBind("@Id", id);
statement.MoveNext();
}
}, TransactionMode);
}
}
var path = GetDevicePath(id);
lock (_syncLock)
{
try
{
FileSystem.DeleteDirectory(path, true);
}
catch (IOException)
{
}
}
}
}
}

@ -67,7 +67,7 @@
<Compile Include="Devices\CameraUploadsFolder.cs" /> <Compile Include="Devices\CameraUploadsFolder.cs" />
<Compile Include="Devices\DeviceId.cs" /> <Compile Include="Devices\DeviceId.cs" />
<Compile Include="Devices\DeviceManager.cs" /> <Compile Include="Devices\DeviceManager.cs" />
<Compile Include="Devices\DeviceRepository.cs" /> <Compile Include="Devices\SqliteDeviceRepository.cs" />
<Compile Include="Diagnostics\CommonProcess.cs" /> <Compile Include="Diagnostics\CommonProcess.cs" />
<Compile Include="Diagnostics\ProcessFactory.cs" /> <Compile Include="Diagnostics\ProcessFactory.cs" />
<Compile Include="Dto\DtoService.cs" /> <Compile Include="Dto\DtoService.cs" />

@ -437,7 +437,7 @@ namespace Emby.Server.Implementations.Session
if (!string.IsNullOrEmpty(deviceId)) if (!string.IsNullOrEmpty(deviceId))
{ {
var userIdString = userId.HasValue ? userId.Value.ToString("N") : null; var userIdString = userId.HasValue ? userId.Value.ToString("N") : null;
device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false); device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString);
} }
} }
@ -446,7 +446,7 @@ namespace Emby.Server.Implementations.Session
if (device == null) if (device == null)
{ {
var userIdString = userId.HasValue ? userId.Value.ToString("N") : null; var userIdString = userId.HasValue ? userId.Value.ToString("N") : null;
device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false); device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString);
} }
if (device != null) if (device != null)
@ -1567,7 +1567,7 @@ namespace Emby.Server.Implementations.Session
ReportCapabilities(session, capabilities, true); ReportCapabilities(session, capabilities, true);
} }
private async void ReportCapabilities(SessionInfo session, private void ReportCapabilities(SessionInfo session,
ClientCapabilities capabilities, ClientCapabilities capabilities,
bool saveCapabilities) bool saveCapabilities)
{ {
@ -1593,7 +1593,7 @@ namespace Emby.Server.Implementations.Session
{ {
try try
{ {
await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false); SaveCapabilities(session.DeviceId, capabilities);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -1607,9 +1607,9 @@ namespace Emby.Server.Implementations.Session
return _deviceManager.GetCapabilities(deviceId); return _deviceManager.GetCapabilities(deviceId);
} }
private Task SaveCapabilities(string deviceId, ClientCapabilities capabilities) private void SaveCapabilities(string deviceId, ClientCapabilities capabilities)
{ {
return _deviceManager.SaveCapabilities(deviceId, capabilities); _deviceManager.SaveCapabilities(deviceId, capabilities);
} }
public SessionInfoDto GetSessionInfoDto(SessionInfo session) public SessionInfoDto GetSessionInfoDto(SessionInfo session)

@ -85,13 +85,11 @@ namespace MediaBrowser.Api.Devices
public void Post(PostDeviceOptions request) public void Post(PostDeviceOptions request)
{ {
var task = _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
{ {
CustomName = request.CustomName, CustomName = request.CustomName,
CameraUploadPath = request.CameraUploadPath CameraUploadPath = request.CameraUploadPath
}); });
Task.WaitAll(task);
} }
public object Get(GetDeviceInfo request) public object Get(GetDeviceInfo request)
@ -116,9 +114,7 @@ namespace MediaBrowser.Api.Devices
public void Delete(DeleteDevice request) public void Delete(DeleteDevice request)
{ {
var task = _deviceManager.DeleteDevice(request.Id); _deviceManager.DeleteDevice(request.Id);
Task.WaitAll(task);
} }
public void Post(PostCameraUpload request) public void Post(PostCameraUpload request)

@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Devices
/// <param name="appVersion">The application version.</param> /// <param name="appVersion">The application version.</param>
/// <param name="usedByUserId">The used by user identifier.</param> /// <param name="usedByUserId">The used by user identifier.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId); DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId);
/// <summary> /// <summary>
/// Saves the capabilities. /// Saves the capabilities.
@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Devices
/// <param name="reportedId">The reported identifier.</param> /// <param name="reportedId">The reported identifier.</param>
/// <param name="capabilities">The capabilities.</param> /// <param name="capabilities">The capabilities.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task SaveCapabilities(string reportedId, ClientCapabilities capabilities); void SaveCapabilities(string reportedId, ClientCapabilities capabilities);
/// <summary> /// <summary>
/// Gets the capabilities. /// Gets the capabilities.
@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Devices
/// <param name="id">The identifier.</param> /// <param name="id">The identifier.</param>
/// <param name="options">The options.</param> /// <param name="options">The options.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task UpdateDeviceInfo(string id, DeviceOptions options); void UpdateDeviceInfo(string id, DeviceOptions options);
/// <summary> /// <summary>
/// Gets the devices. /// Gets the devices.
@ -67,12 +67,7 @@ namespace MediaBrowser.Controller.Devices
/// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns> /// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns>
QueryResult<DeviceInfo> GetDevices(DeviceQuery query); QueryResult<DeviceInfo> GetDevices(DeviceQuery query);
/// <summary> void DeleteDevice(string id);
/// Deletes the device.
/// </summary>
/// <param name="id">The identifier.</param>
/// <returns>Task.</returns>
Task DeleteDevice(string id);
/// <summary> /// <summary>
/// Gets the upload history. /// Gets the upload history.

@ -1,7 +1,6 @@
using MediaBrowser.Model.Devices; using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Session; using MediaBrowser.Model.Session;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Devices namespace MediaBrowser.Controller.Devices
{ {
@ -12,7 +11,7 @@ namespace MediaBrowser.Controller.Devices
/// </summary> /// </summary>
/// <param name="device">The device.</param> /// <param name="device">The device.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task SaveDevice(DeviceInfo device); void SaveDevice(DeviceInfo device);
/// <summary> /// <summary>
/// Saves the capabilities. /// Saves the capabilities.
@ -20,7 +19,7 @@ namespace MediaBrowser.Controller.Devices
/// <param name="id">The identifier.</param> /// <param name="id">The identifier.</param>
/// <param name="capabilities">The capabilities.</param> /// <param name="capabilities">The capabilities.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task SaveCapabilities(string id, ClientCapabilities capabilities); void SaveCapabilities(string id, ClientCapabilities capabilities);
/// <summary> /// <summary>
/// Gets the capabilities. /// Gets the capabilities.
@ -36,18 +35,14 @@ namespace MediaBrowser.Controller.Devices
/// <returns>DeviceInfo.</returns> /// <returns>DeviceInfo.</returns>
DeviceInfo GetDevice(string id); DeviceInfo GetDevice(string id);
/// <summary> List<DeviceInfo> GetDevices();
/// Gets the devices.
/// </summary>
/// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns>
IEnumerable<DeviceInfo> GetDevices();
/// <summary> /// <summary>
/// Deletes the device. /// Deletes the device.
/// </summary> /// </summary>
/// <param name="id">The identifier.</param> /// <param name="id">The identifier.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task DeleteDevice(string id); void DeleteDevice(string id);
/// <summary> /// <summary>
/// Gets the upload history. /// Gets the upload history.

@ -21,17 +21,7 @@ namespace MediaBrowser.Model.Devices
/// <value>The camera upload path.</value> /// <value>The camera upload path.</value>
public string CameraUploadPath { get; set; } public string CameraUploadPath { get; set; }
/// <summary> public string Name { get; set; }
/// Gets the name.
/// </summary>
/// <value>The name.</value>
public string Name
{
get
{
return string.IsNullOrEmpty(CustomName) ? ReportedName : CustomName;
}
}
/// <summary> /// <summary>
/// Gets or sets the identifier. /// Gets or sets the identifier.

Loading…
Cancel
Save