rework device repository
This commit is contained in:
parent
c583d49541
commit
9fdaa039c4
|
@ -938,7 +938,9 @@ namespace Emby.Server.Implementations
|
|||
ConnectManager = CreateConnectManager();
|
||||
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);
|
||||
|
||||
var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer);
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Devices
|
|||
_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))
|
||||
{
|
||||
|
@ -76,14 +76,16 @@ namespace Emby.Server.Implementations.Devices
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
|
@ -98,13 +100,13 @@ namespace Emby.Server.Implementations.Devices
|
|||
|
||||
public QueryResult<DeviceInfo> GetDevices(DeviceQuery query)
|
||||
{
|
||||
IEnumerable<DeviceInfo> devices = _repo.GetDevices().OrderByDescending(i => i.DateLastModified);
|
||||
IEnumerable<DeviceInfo> devices = _repo.GetDevices();
|
||||
|
||||
if (query.SupportsSync.HasValue)
|
||||
{
|
||||
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)
|
||||
|
@ -113,8 +115,7 @@ namespace Emby.Server.Implementations.Devices
|
|||
|
||||
devices = devices.Where(i =>
|
||||
{
|
||||
var caps = GetCapabilities(i.Id);
|
||||
var deviceVal = caps.SupportsPersistentIdentifier;
|
||||
var deviceVal = i.Capabilities.SupportsPersistentIdentifier;
|
||||
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)
|
||||
|
@ -213,14 +214,16 @@ namespace Emby.Server.Implementations.Devices
|
|||
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);
|
||||
|
||||
device.CustomName = options.CustomName;
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
441
Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs
Normal file
441
Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs
Normal file
|
@ -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\DeviceId.cs" />
|
||||
<Compile Include="Devices\DeviceManager.cs" />
|
||||
<Compile Include="Devices\DeviceRepository.cs" />
|
||||
<Compile Include="Devices\SqliteDeviceRepository.cs" />
|
||||
<Compile Include="Diagnostics\CommonProcess.cs" />
|
||||
<Compile Include="Diagnostics\ProcessFactory.cs" />
|
||||
<Compile Include="Dto\DtoService.cs" />
|
||||
|
|
|
@ -437,7 +437,7 @@ namespace Emby.Server.Implementations.Session
|
|||
if (!string.IsNullOrEmpty(deviceId))
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
|
@ -1567,7 +1567,7 @@ namespace Emby.Server.Implementations.Session
|
|||
ReportCapabilities(session, capabilities, true);
|
||||
}
|
||||
|
||||
private async void ReportCapabilities(SessionInfo session,
|
||||
private void ReportCapabilities(SessionInfo session,
|
||||
ClientCapabilities capabilities,
|
||||
bool saveCapabilities)
|
||||
{
|
||||
|
@ -1593,7 +1593,7 @@ namespace Emby.Server.Implementations.Session
|
|||
{
|
||||
try
|
||||
{
|
||||
await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false);
|
||||
SaveCapabilities(session.DeviceId, capabilities);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -1607,9 +1607,9 @@ namespace Emby.Server.Implementations.Session
|
|||
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)
|
||||
|
|
|
@ -85,13 +85,11 @@ namespace MediaBrowser.Api.Devices
|
|||
|
||||
public void Post(PostDeviceOptions request)
|
||||
{
|
||||
var task = _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
|
||||
_deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
|
||||
{
|
||||
CustomName = request.CustomName,
|
||||
CameraUploadPath = request.CameraUploadPath
|
||||
});
|
||||
|
||||
Task.WaitAll(task);
|
||||
}
|
||||
|
||||
public object Get(GetDeviceInfo request)
|
||||
|
@ -116,9 +114,7 @@ namespace MediaBrowser.Api.Devices
|
|||
|
||||
public void Delete(DeleteDevice request)
|
||||
{
|
||||
var task = _deviceManager.DeleteDevice(request.Id);
|
||||
|
||||
Task.WaitAll(task);
|
||||
_deviceManager.DeleteDevice(request.Id);
|
||||
}
|
||||
|
||||
public void Post(PostCameraUpload request)
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// <param name="appVersion">The application version.</param>
|
||||
/// <param name="usedByUserId">The used by user identifier.</param>
|
||||
/// <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>
|
||||
/// Saves the capabilities.
|
||||
|
@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// <param name="reportedId">The reported identifier.</param>
|
||||
/// <param name="capabilities">The capabilities.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task SaveCapabilities(string reportedId, ClientCapabilities capabilities);
|
||||
void SaveCapabilities(string reportedId, ClientCapabilities capabilities);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the capabilities.
|
||||
|
@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// <param name="id">The identifier.</param>
|
||||
/// <param name="options">The options.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task UpdateDeviceInfo(string id, DeviceOptions options);
|
||||
void UpdateDeviceInfo(string id, DeviceOptions options);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the devices.
|
||||
|
@ -67,12 +67,7 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// <returns>IEnumerable<DeviceInfo>.</returns>
|
||||
QueryResult<DeviceInfo> GetDevices(DeviceQuery query);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the device.
|
||||
/// </summary>
|
||||
/// <param name="id">The identifier.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task DeleteDevice(string id);
|
||||
void DeleteDevice(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the upload history.
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
using MediaBrowser.Model.Devices;
|
||||
using MediaBrowser.Model.Session;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Devices
|
||||
{
|
||||
|
@ -12,7 +11,7 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// </summary>
|
||||
/// <param name="device">The device.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task SaveDevice(DeviceInfo device);
|
||||
void SaveDevice(DeviceInfo device);
|
||||
|
||||
/// <summary>
|
||||
/// Saves the capabilities.
|
||||
|
@ -20,7 +19,7 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// <param name="id">The identifier.</param>
|
||||
/// <param name="capabilities">The capabilities.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task SaveCapabilities(string id, ClientCapabilities capabilities);
|
||||
void SaveCapabilities(string id, ClientCapabilities capabilities);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the capabilities.
|
||||
|
@ -36,18 +35,14 @@ namespace MediaBrowser.Controller.Devices
|
|||
/// <returns>DeviceInfo.</returns>
|
||||
DeviceInfo GetDevice(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the devices.
|
||||
/// </summary>
|
||||
/// <returns>IEnumerable<DeviceInfo>.</returns>
|
||||
IEnumerable<DeviceInfo> GetDevices();
|
||||
List<DeviceInfo> GetDevices();
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the device.
|
||||
/// </summary>
|
||||
/// <param name="id">The identifier.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task DeleteDevice(string id);
|
||||
void DeleteDevice(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the upload history.
|
||||
|
|
|
@ -21,17 +21,7 @@ namespace MediaBrowser.Model.Devices
|
|||
/// <value>The camera upload path.</value>
|
||||
public string CameraUploadPath { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the name.
|
||||
/// </summary>
|
||||
/// <value>The name.</value>
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
return string.IsNullOrEmpty(CustomName) ? ReportedName : CustomName;
|
||||
}
|
||||
}
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the identifier.
|
||||
|
|
Loading…
Reference in New Issue
Block a user