diff options
Diffstat (limited to 'Emby.Server.Implementations')
32 files changed, 162 insertions, 124 deletions
diff --git a/Emby.Server.Implementations/Activity/ActivityRepository.cs b/Emby.Server.Implementations/Activity/ActivityRepository.cs index bf8835846..e9b6f7a40 100644 --- a/Emby.Server.Implementations/Activity/ActivityRepository.cs +++ b/Emby.Server.Implementations/Activity/ActivityRepository.cs @@ -60,7 +60,7 @@ namespace Emby.Server.Implementations.Activity { using (var statement = db.PrepareStatement("replace into ActivityLogEntries (Id, Name, Overview, ShortOverview, Type, ItemId, UserId, DateCreated, LogSeverity) values (@Id, @Name, @Overview, @ShortOverview, @Type, @ItemId, @UserId, @DateCreated, @LogSeverity)")) { - statement.TryBind("@Id", entry.Id.ToGuidParamValue()); + statement.TryBind("@Id", entry.Id.ToGuidBlob()); statement.TryBind("@Name", entry.Name); statement.TryBind("@Overview", entry.Overview); @@ -168,7 +168,7 @@ namespace Emby.Server.Implementations.Activity var info = new ActivityLogEntry { - Id = reader[index].ReadGuid().ToString("N") + Id = reader[index].ReadGuidFromBlob().ToString("N") }; index++; diff --git a/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs b/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs index 13874223c..385b4bd51 100644 --- a/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs +++ b/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs @@ -126,7 +126,7 @@ namespace Emby.Server.Implementations.AppBase Logger.Info("Saving system configuration"); var path = CommonApplicationPaths.SystemConfigurationFilePath; - FileSystem.CreateDirectory(Path.GetDirectoryName(path)); + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path)); lock (_configurationSyncLock) { @@ -293,7 +293,7 @@ namespace Emby.Server.Implementations.AppBase _configurations.AddOrUpdate(key, configuration, (k, v) => configuration); var path = GetConfigurationFile(key); - FileSystem.CreateDirectory(Path.GetDirectoryName(path)); + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path)); lock (_configurationSyncLock) { diff --git a/Emby.Server.Implementations/AppBase/ConfigurationHelper.cs b/Emby.Server.Implementations/AppBase/ConfigurationHelper.cs index ad2f45945..d6a41dd67 100644 --- a/Emby.Server.Implementations/AppBase/ConfigurationHelper.cs +++ b/Emby.Server.Implementations/AppBase/ConfigurationHelper.cs @@ -47,7 +47,7 @@ namespace Emby.Server.Implementations.AppBase // If the file didn't exist before, or if something has changed, re-save if (buffer == null || !buffer.SequenceEqual(newBytes)) { - fileSystem.CreateDirectory(Path.GetDirectoryName(path)); + fileSystem.CreateDirectory(fileSystem.GetDirectoryName(path)); // Save it after load in case we got new items fileSystem.WriteAllBytes(path, newBytes); diff --git a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs index f3d84315e..4118bd1b2 100644 --- a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs @@ -106,8 +106,8 @@ namespace Emby.Server.Implementations.Data using (var statement = connection.PrepareStatement("replace into userdisplaypreferences (id, userid, client, data) values (@id, @userId, @client, @data)")) { - statement.TryBind("@id", displayPreferences.Id.ToGuidParamValue()); - statement.TryBind("@userId", userId.ToGuidParamValue()); + statement.TryBind("@id", displayPreferences.Id.ToGuidBlob()); + statement.TryBind("@userId", userId.ToGuidBlob()); statement.TryBind("@client", client); statement.TryBind("@data", serialized); @@ -170,8 +170,8 @@ namespace Emby.Server.Implementations.Data { using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where id = @id and userId=@userId and client=@client")) { - statement.TryBind("@id", guidId.ToGuidParamValue()); - statement.TryBind("@userId", userId.ToGuidParamValue()); + statement.TryBind("@id", guidId.ToGuidBlob()); + statement.TryBind("@userId", userId.ToGuidBlob()); statement.TryBind("@client", client); foreach (var row in statement.ExecuteQuery()) @@ -204,7 +204,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where userId=@userId")) { - statement.TryBind("@userId", userId.ToGuidParamValue()); + statement.TryBind("@userId", userId.ToGuidBlob()); foreach (var row in statement.ExecuteQuery()) { diff --git a/Emby.Server.Implementations/Data/SqliteExtensions.cs b/Emby.Server.Implementations/Data/SqliteExtensions.cs index 783258a13..d2c851b3c 100644 --- a/Emby.Server.Implementations/Data/SqliteExtensions.cs +++ b/Emby.Server.Implementations/Data/SqliteExtensions.cs @@ -26,17 +26,17 @@ namespace Emby.Server.Implementations.Data }); } - public static byte[] ToGuidParamValue(this string str) + public static byte[] ToGuidBlob(this string str) { - return ToGuidParamValue(new Guid(str)); + return ToGuidBlob(new Guid(str)); } - public static byte[] ToGuidParamValue(this Guid guid) + public static byte[] ToGuidBlob(this Guid guid) { return guid.ToByteArray(); } - public static Guid ReadGuid(this IResultSetValue result) + public static Guid ReadGuidFromBlob(this IResultSetValue result) { return new Guid(result.ToBlob()); } @@ -172,7 +172,7 @@ namespace Emby.Server.Implementations.Data public static Guid GetGuid(this IReadOnlyList<IResultSetValue> result, int index) { - return result[index].ReadGuid(); + return result[index].ReadGuidFromBlob(); } private static void CheckName(string name) @@ -262,7 +262,7 @@ namespace Emby.Server.Implementations.Data IBindParameter bindParam; if (statement.BindParameters.TryGetValue(name, out bindParam)) { - bindParam.Bind(value.ToGuidParamValue()); + bindParam.Bind(value.ToGuidBlob()); } else { diff --git a/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs b/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs index 9fbe8669d..a254962c9 100644 --- a/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs @@ -62,7 +62,7 @@ namespace Emby.Server.Implementations.Data using (var statement = db.PrepareStatement(commandText)) { - statement.TryBind("@ResultId", result.Id.ToGuidParamValue()); + statement.TryBind("@ResultId", result.Id.ToGuidBlob()); statement.TryBind("@OriginalPath", result.OriginalPath); statement.TryBind("@TargetPath", result.TargetPath); @@ -100,7 +100,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = db.PrepareStatement("delete from FileOrganizerResults where ResultId = @ResultId")) { - statement.TryBind("@ResultId", id.ToGuidParamValue()); + statement.TryBind("@ResultId", id.ToGuidBlob()); statement.MoveNext(); } }, TransactionMode); @@ -188,7 +188,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = connection.PrepareStatement("select ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths from FileOrganizerResults where ResultId=@ResultId")) { - statement.TryBind("@ResultId", id.ToGuidParamValue()); + statement.TryBind("@ResultId", id.ToGuidBlob()); foreach (var row in statement.ExecuteQuery()) { @@ -207,7 +207,7 @@ namespace Emby.Server.Implementations.Data var result = new FileOrganizationResult { - Id = reader[0].ReadGuid().ToString("N") + Id = reader[0].ReadGuidFromBlob().ToString("N") }; index++; diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 61dce9bba..28be49dc2 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -2128,7 +2128,7 @@ namespace Emby.Server.Implementations.Data connection.RunInTransaction(db => { // First delete chapters - db.Execute("delete from " + ChaptersTableName + " where ItemId=@ItemId", id.ToGuidParamValue()); + db.Execute("delete from " + ChaptersTableName + " where ItemId=@ItemId", id.ToGuidBlob()); using (var saveChapterStatement = PrepareStatement(db, "replace into " + ChaptersTableName + " (ItemId, ChapterIndex, StartPositionTicks, Name, ImagePath, ImageDateModified) values (@ItemId, @ChapterIndex, @StartPositionTicks, @Name, @ImagePath, @ImageDateModified)")) { @@ -2139,7 +2139,7 @@ namespace Emby.Server.Implementations.Data saveChapterStatement.Reset(); } - saveChapterStatement.TryBind("@ItemId", id.ToGuidParamValue()); + saveChapterStatement.TryBind("@ItemId", id.ToGuidBlob()); saveChapterStatement.TryBind("@ChapterIndex", index); saveChapterStatement.TryBind("@StartPositionTicks", chapter.StartPositionTicks); saveChapterStatement.TryBind("@Name", chapter.Name); @@ -2919,7 +2919,7 @@ namespace Emby.Server.Implementations.Data foreach (var row in statement.ExecuteQuery()) { - list.Add(row[0].ReadGuid()); + list.Add(row[0].ReadGuidFromBlob()); } } @@ -3113,7 +3113,7 @@ namespace Emby.Server.Implementations.Data foreach (var row in statement.ExecuteQuery()) { - list.Add(row[0].ReadGuid()); + list.Add(row[0].ReadGuidFromBlob()); } } } @@ -3643,7 +3643,7 @@ namespace Emby.Server.Implementations.Data clauses.Add("(select Name from TypedBaseItems where guid=" + paramName + ") in (select Name from People where ItemId=Guid)"); if (statement != null) { - statement.TryBind(paramName, personId.ToGuidParamValue()); + statement.TryBind(paramName, personId.ToGuidBlob()); } index++; } @@ -3843,7 +3843,7 @@ namespace Emby.Server.Implementations.Data clauses.Add("(select CleanName from TypedBaseItems where guid=" + paramName + ") in (select CleanValue from itemvalues where ItemId=Guid and Type<=1)"); if (statement != null) { - statement.TryBind(paramName, artistId.ToGuidParamValue()); + statement.TryBind(paramName, artistId.ToGuidBlob()); } index++; } @@ -3862,7 +3862,7 @@ namespace Emby.Server.Implementations.Data clauses.Add("Album in (select Name from typedbaseitems where guid=" + paramName + ")"); if (statement != null) { - statement.TryBind(paramName, albumId.ToGuidParamValue()); + statement.TryBind(paramName, albumId.ToGuidBlob()); } index++; } @@ -3881,7 +3881,7 @@ namespace Emby.Server.Implementations.Data clauses.Add("(select CleanName from TypedBaseItems where guid=" + paramName + ") not in (select CleanValue from itemvalues where ItemId=Guid and Type<=1)"); if (statement != null) { - statement.TryBind(paramName, artistId.ToGuidParamValue()); + statement.TryBind(paramName, artistId.ToGuidBlob()); } index++; } @@ -3900,7 +3900,7 @@ namespace Emby.Server.Implementations.Data clauses.Add("(select CleanName from TypedBaseItems where guid=" + paramName + ") in (select CleanValue from itemvalues where ItemId=Guid and Type=2)"); if (statement != null) { - statement.TryBind(paramName, genreId.ToGuidParamValue()); + statement.TryBind(paramName, genreId.ToGuidBlob()); } index++; } @@ -3953,7 +3953,7 @@ namespace Emby.Server.Implementations.Data clauses.Add("(select CleanName from TypedBaseItems where guid=" + paramName + ") in (select CleanValue from itemvalues where ItemId=Guid and Type=3)"); if (statement != null) { - statement.TryBind(paramName, studioId.ToGuidParamValue()); + statement.TryBind(paramName, studioId.ToGuidBlob()); } index++; } @@ -4521,22 +4521,22 @@ namespace Emby.Server.Implementations.Data connection.RunInTransaction(db => { // Delete people - ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", id.ToGuidParamValue()); + ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", id.ToGuidBlob()); // Delete chapters - ExecuteWithSingleParam(db, "delete from " + ChaptersTableName + " where ItemId=@Id", id.ToGuidParamValue()); + ExecuteWithSingleParam(db, "delete from " + ChaptersTableName + " where ItemId=@Id", id.ToGuidBlob()); // Delete media streams - ExecuteWithSingleParam(db, "delete from mediastreams where ItemId=@Id", id.ToGuidParamValue()); + ExecuteWithSingleParam(db, "delete from mediastreams where ItemId=@Id", id.ToGuidBlob()); // Delete ancestors - ExecuteWithSingleParam(db, "delete from AncestorIds where ItemId=@Id", id.ToGuidParamValue()); + ExecuteWithSingleParam(db, "delete from AncestorIds where ItemId=@Id", id.ToGuidBlob()); // Delete item values - ExecuteWithSingleParam(db, "delete from ItemValues where ItemId=@Id", id.ToGuidParamValue()); + ExecuteWithSingleParam(db, "delete from ItemValues where ItemId=@Id", id.ToGuidBlob()); // Delete the item - ExecuteWithSingleParam(db, "delete from TypedBaseItems where guid=@Id", id.ToGuidParamValue()); + ExecuteWithSingleParam(db, "delete from TypedBaseItems where guid=@Id", id.ToGuidBlob()); }, TransactionMode); } } @@ -4643,7 +4643,7 @@ namespace Emby.Server.Implementations.Data whereClauses.Add("ItemId=@ItemId"); if (statement != null) { - statement.TryBind("@ItemId", query.ItemId.ToGuidParamValue()); + statement.TryBind("@ItemId", query.ItemId.ToGuidBlob()); } } if (query.AppearsInItemId != Guid.Empty) @@ -4651,7 +4651,7 @@ namespace Emby.Server.Implementations.Data whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)"); if (statement != null) { - statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToGuidParamValue()); + statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToGuidBlob()); } } var queryPersonTypes = query.PersonTypes.Where(IsValidPersonType).ToList(); @@ -4730,14 +4730,14 @@ namespace Emby.Server.Implementations.Data // First delete deleteAncestorsStatement.Reset(); - deleteAncestorsStatement.TryBind("@ItemId", itemId.ToGuidParamValue()); + deleteAncestorsStatement.TryBind("@ItemId", itemId.ToGuidBlob()); deleteAncestorsStatement.MoveNext(); foreach (var ancestorId in ancestorIds) { updateAncestorsStatement.Reset(); - updateAncestorsStatement.TryBind("@ItemId", itemId.ToGuidParamValue()); - updateAncestorsStatement.TryBind("@AncestorId", ancestorId.ToGuidParamValue()); + updateAncestorsStatement.TryBind("@ItemId", itemId.ToGuidBlob()); + updateAncestorsStatement.TryBind("@AncestorId", ancestorId.ToGuidBlob()); updateAncestorsStatement.TryBind("@AncestorIdText", ancestorId.ToString("N")); updateAncestorsStatement.MoveNext(); } @@ -5198,7 +5198,7 @@ namespace Emby.Server.Implementations.Data CheckDisposed(); // First delete - db.Execute("delete from ItemValues where ItemId=@Id", itemId.ToGuidParamValue()); + db.Execute("delete from ItemValues where ItemId=@Id", itemId.ToGuidBlob()); using (var statement = PrepareStatement(db, "insert into ItemValues (ItemId, Type, Value, CleanValue) values (@ItemId, @Type, @Value, @CleanValue)")) { @@ -5214,7 +5214,7 @@ namespace Emby.Server.Implementations.Data statement.Reset(); - statement.TryBind("@ItemId", itemId.ToGuidParamValue()); + statement.TryBind("@ItemId", itemId.ToGuidBlob()); statement.TryBind("@Type", pair.Item1); statement.TryBind("@Value", itemValue); @@ -5252,7 +5252,7 @@ namespace Emby.Server.Implementations.Data { // First delete // "delete from People where ItemId=?" - connection.Execute("delete from People where ItemId=?", itemId.ToGuidParamValue()); + connection.Execute("delete from People where ItemId=?", itemId.ToGuidBlob()); var listIndex = 0; @@ -5266,7 +5266,7 @@ namespace Emby.Server.Implementations.Data statement.Reset(); } - statement.TryBind("@ItemId", itemId.ToGuidParamValue()); + statement.TryBind("@ItemId", itemId.ToGuidBlob()); statement.TryBind("@Name", person.Name); statement.TryBind("@Role", person.Role); statement.TryBind("@PersonType", person.Type); @@ -5339,7 +5339,7 @@ namespace Emby.Server.Implementations.Data using (var statement = PrepareStatementSafe(connection, cmdText)) { - statement.TryBind("@ItemId", query.ItemId.ToGuidParamValue()); + statement.TryBind("@ItemId", query.ItemId.ToGuidBlob()); if (query.Type.HasValue) { @@ -5383,7 +5383,7 @@ namespace Emby.Server.Implementations.Data using (var connection = CreateConnection()) { // First delete chapters - connection.Execute("delete from mediastreams where ItemId=@ItemId", id.ToGuidParamValue()); + connection.Execute("delete from mediastreams where ItemId=@ItemId", id.ToGuidBlob()); using (var statement = PrepareStatement(connection, string.Format("replace into mediastreams ({0}) values ({1})", string.Join(",", _mediaStreamSaveColumns), @@ -5393,7 +5393,7 @@ namespace Emby.Server.Implementations.Data { var paramList = new List<object>(); - paramList.Add(id.ToGuidParamValue()); + paramList.Add(id.ToGuidBlob()); paramList.Add(stream.Index); paramList.Add(stream.Type.ToString()); paramList.Add(stream.Codec); diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index a31f0ed53..bf6388f5d 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -213,7 +213,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = db.PrepareStatement("replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)")) { - statement.TryBind("@userId", userId.ToGuidParamValue()); + statement.TryBind("@userId", userId.ToGuidBlob()); statement.TryBind("@key", key); if (userData.Rating.HasValue) @@ -311,7 +311,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = connection.PrepareStatement("select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key =@Key and userId=@UserId")) { - statement.TryBind("@UserId", userId.ToGuidParamValue()); + statement.TryBind("@UserId", userId.ToGuidBlob()); statement.TryBind("@Key", key); foreach (var row in statement.ExecuteQuery()) @@ -364,7 +364,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = connection.PrepareStatement("select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@UserId")) { - statement.TryBind("@UserId", userId.ToGuidParamValue()); + statement.TryBind("@UserId", userId.ToGuidBlob()); foreach (var row in statement.ExecuteQuery()) { @@ -386,7 +386,7 @@ namespace Emby.Server.Implementations.Data var userData = new UserItemData(); userData.Key = reader[0].ToString(); - userData.UserId = reader[1].ReadGuid(); + userData.UserId = reader[1].ReadGuidFromBlob(); if (reader[2].SQLiteType != SQLiteType.Null) { diff --git a/Emby.Server.Implementations/Data/SqliteUserRepository.cs b/Emby.Server.Implementations/Data/SqliteUserRepository.cs index b2b917e5e..29959bcab 100644 --- a/Emby.Server.Implementations/Data/SqliteUserRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserRepository.cs @@ -93,7 +93,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = db.PrepareStatement("replace into users (guid, data) values (@guid, @data)")) { - statement.TryBind("@guid", user.Id.ToGuidParamValue()); + statement.TryBind("@guid", user.Id.ToGuidBlob()); statement.TryBind("@data", serialized); statement.MoveNext(); } @@ -116,7 +116,7 @@ namespace Emby.Server.Implementations.Data { foreach (var row in connection.Query("select guid,data from users")) { - var id = row[0].ReadGuid(); + var id = row[0].ReadGuidFromBlob(); using (var stream = _memoryStreamProvider.CreateNew(row[1].ToBlob())) { @@ -156,7 +156,7 @@ namespace Emby.Server.Implementations.Data { using (var statement = db.PrepareStatement("delete from users where guid=@id")) { - statement.TryBind("@id", user.Id.ToGuidParamValue()); + statement.TryBind("@id", user.Id.ToGuidBlob()); statement.MoveNext(); } }, TransactionMode); diff --git a/Emby.Server.Implementations/Devices/DeviceManager.cs b/Emby.Server.Implementations/Devices/DeviceManager.cs index 588b42a09..b246ef196 100644 --- a/Emby.Server.Implementations/Devices/DeviceManager.cs +++ b/Emby.Server.Implementations/Devices/DeviceManager.cs @@ -158,7 +158,7 @@ namespace Emby.Server.Implementations.Devices _libraryMonitor.ReportFileSystemChangeBeginning(path); - _fileSystem.CreateDirectory(Path.GetDirectoryName(path)); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); try { diff --git a/Emby.Server.Implementations/Devices/DeviceRepository.cs b/Emby.Server.Implementations/Devices/DeviceRepository.cs index f739765b3..de0dfda2e 100644 --- a/Emby.Server.Implementations/Devices/DeviceRepository.cs +++ b/Emby.Server.Implementations/Devices/DeviceRepository.cs @@ -46,7 +46,7 @@ namespace Emby.Server.Implementations.Devices public Task SaveDevice(DeviceInfo device) { var path = Path.Combine(GetDevicePath(device.Id), "device.json"); - _fileSystem.CreateDirectory(Path.GetDirectoryName(path)); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); lock (_syncLock) { @@ -180,7 +180,7 @@ namespace Emby.Server.Implementations.Devices public void AddCameraUpload(string deviceId, LocalFileInfo file) { var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); - _fileSystem.CreateDirectory(Path.GetDirectoryName(path)); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); lock (_syncLock) { diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index d4766e1ec..b2f1f0ceb 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -308,7 +308,7 @@ <Private>True</Private> </Reference> <Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL"> - <HintPath>..\packages\SQLitePCLRaw.core.1.1.2\lib\portable-net45+netcore45+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLitePCLRaw.core.dll</HintPath> + <HintPath>..\packages\SQLitePCLRaw.core.1.1.5\lib\portable-net45+netcore45+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLitePCLRaw.core.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup> diff --git a/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs b/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs index 2becebb3d..3c8ad55fe 100644 --- a/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs +++ b/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs @@ -97,7 +97,7 @@ namespace Emby.Server.Implementations.FFMpeg else { info = existingVersion; - versionedDirectoryPath = Path.GetDirectoryName(info.EncoderPath); + versionedDirectoryPath = _fileSystem.GetDirectoryName(info.EncoderPath); excludeFromDeletions.Add(versionedDirectoryPath); } } @@ -135,7 +135,7 @@ namespace Emby.Server.Implementations.FFMpeg { EncoderPath = encoder, ProbePath = probe, - Version = Path.GetFileName(Path.GetDirectoryName(probe)) + Version = Path.GetFileName(_fileSystem.GetDirectoryName(probe)) }; } } diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs index ee5245a69..5e96eda94 100644 --- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -228,7 +228,8 @@ namespace Emby.Server.Implementations.HttpServer _streamFactory, _enableDualModeSockets, GetRequest, - _fileSystem); + _fileSystem, + _environment); } private IHttpRequest GetRequest(HttpListenerContext httpContext) @@ -452,6 +453,7 @@ namespace Emby.Server.Implementations.HttpServer var date = DateTime.Now; var httpRes = httpReq.Response; bool enableLog = false; + bool logHeaders = false; string urlToLog = null; string remoteIp = null; @@ -490,13 +492,14 @@ namespace Emby.Server.Implementations.HttpServer var urlString = url.OriginalString; enableLog = EnableLogging(urlString, localPath); urlToLog = urlString; + logHeaders = enableLog && urlToLog.IndexOf("/videos/", StringComparison.OrdinalIgnoreCase) != -1; if (enableLog) { urlToLog = GetUrlToLog(urlString); remoteIp = httpReq.RemoteIp; - LoggerUtils.LogRequest(_logger, urlToLog, httpReq.HttpMethod, httpReq.UserAgent); + LoggerUtils.LogRequest(_logger, urlToLog, httpReq.HttpMethod, httpReq.UserAgent, logHeaders ? httpReq.Headers : null); } if (string.Equals(localPath, "/emby/", StringComparison.OrdinalIgnoreCase) || @@ -611,7 +614,7 @@ namespace Emby.Server.Implementations.HttpServer var duration = DateTime.Now - date; - LoggerUtils.LogResponse(_logger, statusCode, urlToLog, remoteIp, duration); + LoggerUtils.LogResponse(_logger, statusCode, urlToLog, remoteIp, duration, logHeaders ? httpRes.Headers : null); } } } diff --git a/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs b/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs index 687bd62b0..0af88595f 100644 --- a/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs +++ b/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs @@ -353,31 +353,28 @@ namespace Emby.Server.Implementations.HttpServer /// <summary> /// Pres the process optimized result. /// </summary> - /// <param name="requestContext">The request context.</param> - /// <param name="responseHeaders">The responseHeaders.</param> - /// <param name="cacheKey">The cache key.</param> - /// <param name="cacheKeyString">The cache key string.</param> - /// <param name="lastDateModified">The last date modified.</param> - /// <param name="cacheDuration">Duration of the cache.</param> - /// <param name="contentType">Type of the content.</param> - /// <returns>System.Object.</returns> private object GetCachedResult(IRequest requestContext, IDictionary<string, string> responseHeaders, Guid cacheKey, string cacheKeyString, DateTime? lastDateModified, TimeSpan? cacheDuration, string contentType) { responseHeaders["ETag"] = string.Format("\"{0}\"", cacheKeyString); - if (IsNotModified(requestContext, cacheKey, lastDateModified, cacheDuration)) + var noCache = (requestContext.Headers.Get("Cache-Control") ?? string.Empty).IndexOf("no-cache", StringComparison.OrdinalIgnoreCase) != -1; + + if (!noCache) { - AddAgeHeader(responseHeaders, lastDateModified); - AddExpiresHeader(responseHeaders, cacheKeyString, cacheDuration); + if (IsNotModified(requestContext, cacheKey, lastDateModified, cacheDuration)) + { + AddAgeHeader(responseHeaders, lastDateModified); + AddExpiresHeader(responseHeaders, cacheKeyString, cacheDuration, noCache); - var result = new HttpResult(new byte[] { }, contentType ?? "text/html", HttpStatusCode.NotModified); + var result = new HttpResult(new byte[] { }, contentType ?? "text/html", HttpStatusCode.NotModified); - AddResponseHeaders(result, responseHeaders); + AddResponseHeaders(result, responseHeaders); - return result; + return result; + } } - AddCachingHeaders(responseHeaders, cacheKeyString, lastDateModified, cacheDuration); + AddCachingHeaders(responseHeaders, cacheKeyString, lastDateModified, cacheDuration, noCache); return null; } @@ -673,11 +670,7 @@ namespace Emby.Server.Implementations.HttpServer /// <summary> /// Adds the caching responseHeaders. /// </summary> - /// <param name="responseHeaders">The responseHeaders.</param> - /// <param name="cacheKey">The cache key.</param> - /// <param name="lastDateModified">The last date modified.</param> - /// <param name="cacheDuration">Duration of the cache.</param> - private void AddCachingHeaders(IDictionary<string, string> responseHeaders, string cacheKey, DateTime? lastDateModified, TimeSpan? cacheDuration) + private void AddCachingHeaders(IDictionary<string, string> responseHeaders, string cacheKey, DateTime? lastDateModified, TimeSpan? cacheDuration, bool noCache) { // Don't specify both last modified and Etag, unless caching unconditionally. They are redundant // https://developers.google.com/speed/docs/best-practices/caching#LeverageBrowserCaching @@ -687,11 +680,11 @@ namespace Emby.Server.Implementations.HttpServer responseHeaders["Last-Modified"] = lastDateModified.Value.ToString("r"); } - if (cacheDuration.HasValue) + if (!noCache && cacheDuration.HasValue) { responseHeaders["Cache-Control"] = "public, max-age=" + Convert.ToInt32(cacheDuration.Value.TotalSeconds); } - else if (!string.IsNullOrEmpty(cacheKey)) + else if (!noCache && !string.IsNullOrEmpty(cacheKey)) { responseHeaders["Cache-Control"] = "public"; } @@ -701,18 +694,15 @@ namespace Emby.Server.Implementations.HttpServer responseHeaders["pragma"] = "no-cache, no-store, must-revalidate"; } - AddExpiresHeader(responseHeaders, cacheKey, cacheDuration); + AddExpiresHeader(responseHeaders, cacheKey, cacheDuration, noCache); } /// <summary> /// Adds the expires header. /// </summary> - /// <param name="responseHeaders">The responseHeaders.</param> - /// <param name="cacheKey">The cache key.</param> - /// <param name="cacheDuration">Duration of the cache.</param> - private void AddExpiresHeader(IDictionary<string, string> responseHeaders, string cacheKey, TimeSpan? cacheDuration) + private void AddExpiresHeader(IDictionary<string, string> responseHeaders, string cacheKey, TimeSpan? cacheDuration, bool noCache) { - if (cacheDuration.HasValue) + if (!noCache && cacheDuration.HasValue) { responseHeaders["Expires"] = DateTime.UtcNow.Add(cacheDuration.Value).ToString("r"); } diff --git a/Emby.Server.Implementations/HttpServer/LoggerUtils.cs b/Emby.Server.Implementations/HttpServer/LoggerUtils.cs index 8fc92a09a..f0e75eea4 100644 --- a/Emby.Server.Implementations/HttpServer/LoggerUtils.cs +++ b/Emby.Server.Implementations/HttpServer/LoggerUtils.cs @@ -1,6 +1,8 @@ using MediaBrowser.Model.Logging; using System; using System.Globalization; +using System.Linq; +using MediaBrowser.Model.Services; using SocketHttpListener.Net; namespace Emby.Server.Implementations.HttpServer @@ -19,9 +21,18 @@ namespace Emby.Server.Implementations.HttpServer logger.Info("{0} {1}. UserAgent: {2}", request.IsWebSocketRequest ? "WS" : "HTTP " + request.HttpMethod, url, request.UserAgent ?? string.Empty); } - public static void LogRequest(ILogger logger, string url, string method, string userAgent) + public static void LogRequest(ILogger logger, string url, string method, string userAgent, QueryParamCollection headers) { - logger.Info("{0} {1}. UserAgent: {2}", "HTTP " + method, url, userAgent ?? string.Empty); + if (headers == null) + { + logger.Info("{0} {1}. UserAgent: {2}", "HTTP " + method, url, userAgent ?? string.Empty); + } + else + { + var headerText = string.Join(", ", headers.Select(i => i.Name + "=" + i.Value).ToArray()); + + logger.Info("HTTP {0} {1}. {2}", method, url, headerText); + } } /// <summary> @@ -32,12 +43,13 @@ namespace Emby.Server.Implementations.HttpServer /// <param name="url">The URL.</param> /// <param name="endPoint">The end point.</param> /// <param name="duration">The duration.</param> - public static void LogResponse(ILogger logger, int statusCode, string url, string endPoint, TimeSpan duration) + public static void LogResponse(ILogger logger, int statusCode, string url, string endPoint, TimeSpan duration, QueryParamCollection headers) { var durationMs = duration.TotalMilliseconds; var logSuffix = durationMs >= 1000 && durationMs < 60000 ? "ms (slow)" : "ms"; - logger.Info("HTTP Response {0} to {1}. Time: {2}{3}. {4}", statusCode, endPoint, Convert.ToInt32(durationMs).ToString(CultureInfo.InvariantCulture), logSuffix, url); + var headerText = headers == null ? string.Empty : "Headers: " + string.Join(", ", headers.Where(i => i.Name.IndexOf("Access-", StringComparison.OrdinalIgnoreCase) == -1).Select(i => i.Name + "=" + i.Value).ToArray()); + logger.Info("HTTP Response {0} to {1}. Time: {2}{3}. {4} {5}", statusCode, endPoint, Convert.ToInt32(durationMs).ToString(CultureInfo.InvariantCulture), logSuffix, url, headerText); } } } diff --git a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs index b11b2fe88..682fa7a0b 100644 --- a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs +++ b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs @@ -10,6 +10,7 @@ using MediaBrowser.Model.Cryptography; using MediaBrowser.Model.IO; using MediaBrowser.Model.Net; using MediaBrowser.Model.Services; +using MediaBrowser.Model.System; using MediaBrowser.Model.Text; using SocketHttpListener.Primitives; @@ -30,8 +31,9 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp private readonly IFileSystem _fileSystem; private readonly Func<HttpListenerContext, IHttpRequest> _httpRequestFactory; private readonly bool _enableDualMode; + private readonly IEnvironmentInfo _environment; - public WebSocketSharpListener(ILogger logger, ICertificate certificate, IMemoryStreamFactory memoryStreamProvider, ITextEncoding textEncoding, INetworkManager networkManager, ISocketFactory socketFactory, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, bool enableDualMode, Func<HttpListenerContext, IHttpRequest> httpRequestFactory, IFileSystem fileSystem) + public WebSocketSharpListener(ILogger logger, ICertificate certificate, IMemoryStreamFactory memoryStreamProvider, ITextEncoding textEncoding, INetworkManager networkManager, ISocketFactory socketFactory, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, bool enableDualMode, Func<HttpListenerContext, IHttpRequest> httpRequestFactory, IFileSystem fileSystem, IEnvironmentInfo environment) { _logger = logger; _certificate = certificate; @@ -44,6 +46,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp _enableDualMode = enableDualMode; _httpRequestFactory = httpRequestFactory; _fileSystem = fileSystem; + _environment = environment; } public Action<Exception, IRequest, bool> ErrorHandler { get; set; } @@ -56,7 +59,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp public void Start(IEnumerable<string> urlPrefixes) { if (_listener == null) - _listener = new HttpListener(_logger, _cryptoProvider, _streamFactory, _socketFactory, _networkManager, _textEncoding, _memoryStreamProvider, _fileSystem); + _listener = new HttpListener(_logger, _cryptoProvider, _streamFactory, _socketFactory, _networkManager, _textEncoding, _memoryStreamProvider, _fileSystem, _environment); _listener.EnableDualMode = _enableDualMode; diff --git a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs index fd30b227f..9e58ee57c 100644 --- a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs +++ b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs @@ -7,6 +7,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Services; using SocketHttpListener.Net; using HttpListenerResponse = SocketHttpListener.Net.HttpListenerResponse; using IHttpResponse = MediaBrowser.Model.Services.IHttpResponse; @@ -66,6 +67,14 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp _response.AddHeader(name, value); } + public QueryParamCollection Headers + { + get + { + return _response.Headers; + } + } + public string GetHeader(string name) { return _response.Headers[name]; diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs index 033cbd8b0..edff25156 100644 --- a/Emby.Server.Implementations/IO/FileRefresher.cs +++ b/Emby.Server.Implementations/IO/FileRefresher.cs @@ -34,8 +34,9 @@ namespace Emby.Server.Implementations.IO public event EventHandler<EventArgs> Completed; private readonly IEnvironmentInfo _environmentInfo; + private readonly ILibraryManager _libraryManager; - public FileRefresher(string path, IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, ITaskManager taskManager, ILogger logger, ITimerFactory timerFactory, IEnvironmentInfo environmentInfo) + public FileRefresher(string path, IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, ITaskManager taskManager, ILogger logger, ITimerFactory timerFactory, IEnvironmentInfo environmentInfo, ILibraryManager libraryManager1) { logger.Debug("New file refresher created for {0}", path); Path = path; @@ -47,6 +48,7 @@ namespace Emby.Server.Implementations.IO Logger = logger; _timerFactory = timerFactory; _environmentInfo = environmentInfo; + _libraryManager = libraryManager1; AddPath(path); } @@ -235,6 +237,12 @@ namespace Emby.Server.Implementations.IO return false; } + // Only try to open video files + if (!_libraryManager.IsVideoFile(path)) + { + return false; + } + try { var data = _fileSystem.GetFileSystemInfo(path); diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index 2677f7b2a..b2ec84a82 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -258,7 +258,7 @@ namespace Emby.Server.Implementations.Images { return await CreateSquareCollage(item, itemsWithImages, outputPath).ConfigureAwait(false); } - if (item is Playlist || item is MusicGenre || item is Genre || item is GameGenre) + if (item is Playlist || item is MusicGenre || item is Genre || item is GameGenre || item is PhotoAlbum) { return await CreateSquareCollage(item, itemsWithImages, outputPath).ConfigureAwait(false); } diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 685c794b7..3c94f9784 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1197,6 +1197,7 @@ namespace Emby.Server.Implementations.Library catch (OperationCanceledException) { _logger.Info("Post-scan task cancelled: {0}", task.GetType().Name); + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs b/Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs index 643c5970e..d4be2dabe 100644 --- a/Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs +++ b/Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs @@ -63,7 +63,7 @@ namespace Emby.Server.Implementations.Library.Validators catch (OperationCanceledException) { // Don't clutter the log - break; + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Library/Validators/GameGenresValidator.cs b/Emby.Server.Implementations/Library/Validators/GameGenresValidator.cs index b1820bb91..f7fbb9331 100644 --- a/Emby.Server.Implementations/Library/Validators/GameGenresValidator.cs +++ b/Emby.Server.Implementations/Library/Validators/GameGenresValidator.cs @@ -53,7 +53,7 @@ namespace Emby.Server.Implementations.Library.Validators catch (OperationCanceledException) { // Don't clutter the log - break; + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Library/Validators/GenresValidator.cs b/Emby.Server.Implementations/Library/Validators/GenresValidator.cs index d8956f78a..d71e77a9a 100644 --- a/Emby.Server.Implementations/Library/Validators/GenresValidator.cs +++ b/Emby.Server.Implementations/Library/Validators/GenresValidator.cs @@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.Library.Validators catch (OperationCanceledException) { // Don't clutter the log - break; + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs b/Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs index 983c881b7..98d53c125 100644 --- a/Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs +++ b/Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs @@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.Library.Validators catch (OperationCanceledException) { // Don't clutter the log - break; + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Library/Validators/StudiosValidator.cs b/Emby.Server.Implementations/Library/Validators/StudiosValidator.cs index 6faab7bb9..97b8ff0ac 100644 --- a/Emby.Server.Implementations/Library/Validators/StudiosValidator.cs +++ b/Emby.Server.Implementations/Library/Validators/StudiosValidator.cs @@ -53,7 +53,7 @@ namespace Emby.Server.Implementations.Library.Validators catch (OperationCanceledException) { // Don't clutter the log - break; + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Library/Validators/YearsPostScanTask.cs b/Emby.Server.Implementations/Library/Validators/YearsPostScanTask.cs index ae43c77f0..4afb4c04a 100644 --- a/Emby.Server.Implementations/Library/Validators/YearsPostScanTask.cs +++ b/Emby.Server.Implementations/Library/Validators/YearsPostScanTask.cs @@ -26,6 +26,8 @@ namespace Emby.Server.Implementations.Library.Validators while (yearNumber < maxYear) { + cancellationToken.ThrowIfCancellationRequested(); + try { var year = _libraryManager.GetYear(yearNumber); @@ -35,7 +37,7 @@ namespace Emby.Server.Implementations.Library.Validators catch (OperationCanceledException) { // Don't clutter the log - break; + throw; } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs b/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs index 76c7a7d77..40752db80 100644 --- a/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs +++ b/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs @@ -81,7 +81,7 @@ namespace Emby.Server.Implementations.Notifications } clauses.Add("UserId=?"); - paramList.Add(query.UserId.ToGuidParamValue()); + paramList.Add(query.UserId.ToGuidBlob()); var whereClause = " where " + string.Join(" And ", clauses.ToArray()); @@ -133,7 +133,7 @@ namespace Emby.Server.Implementations.Notifications using (var statement = connection.PrepareStatement("select Level from Notifications where UserId=@UserId and IsRead=@IsRead")) { statement.TryBind("@IsRead", false); - statement.TryBind("@UserId", userId.ToGuidParamValue()); + statement.TryBind("@UserId", userId.ToGuidBlob()); var levels = new List<NotificationLevel>(); @@ -159,8 +159,8 @@ namespace Emby.Server.Implementations.Notifications { var notification = new Notification { - Id = reader[0].ReadGuid().ToString("N"), - UserId = reader[1].ReadGuid().ToString("N"), + Id = reader[0].ReadGuidFromBlob().ToString("N"), + UserId = reader[1].ReadGuidFromBlob().ToString("N"), Date = reader[2].ReadDateTime(), Name = reader[3].ToString() }; @@ -251,8 +251,8 @@ namespace Emby.Server.Implementations.Notifications { using (var statement = conn.PrepareStatement("replace into Notifications (Id, UserId, Date, Name, Description, Url, Level, IsRead, Category, RelatedId) values (@Id, @UserId, @Date, @Name, @Description, @Url, @Level, @IsRead, @Category, @RelatedId)")) { - statement.TryBind("@Id", notification.Id.ToGuidParamValue()); - statement.TryBind("@UserId", notification.UserId.ToGuidParamValue()); + statement.TryBind("@Id", notification.Id.ToGuidBlob()); + statement.TryBind("@UserId", notification.UserId.ToGuidBlob()); statement.TryBind("@Date", notification.Date.ToDateTimeParamValue()); statement.TryBind("@Name", notification.Name); statement.TryBind("@Description", notification.Description); @@ -315,7 +315,7 @@ namespace Emby.Server.Implementations.Notifications using (var statement = conn.PrepareStatement("update Notifications set IsRead=@IsRead where UserId=@UserId")) { statement.TryBind("@IsRead", isRead); - statement.TryBind("@UserId", userId.ToGuidParamValue()); + statement.TryBind("@UserId", userId.ToGuidBlob()); statement.MoveNext(); } @@ -337,13 +337,13 @@ namespace Emby.Server.Implementations.Notifications using (var statement = conn.PrepareStatement("update Notifications set IsRead=@IsRead where UserId=@UserId and Id=@Id")) { statement.TryBind("@IsRead", isRead); - statement.TryBind("@UserId", userId.ToGuidParamValue()); + statement.TryBind("@UserId", userId.ToGuidBlob()); foreach (var id in notificationIdList) { statement.Reset(); - statement.TryBind("@Id", id.ToGuidParamValue()); + statement.TryBind("@Id", id.ToGuidBlob()); statement.MoveNext(); } diff --git a/Emby.Server.Implementations/Security/AuthenticationRepository.cs b/Emby.Server.Implementations/Security/AuthenticationRepository.cs index a2d61873b..9ec0af6bb 100644 --- a/Emby.Server.Implementations/Security/AuthenticationRepository.cs +++ b/Emby.Server.Implementations/Security/AuthenticationRepository.cs @@ -74,7 +74,7 @@ namespace Emby.Server.Implementations.Security { using (var statement = db.PrepareStatement("replace into AccessTokens (Id, AccessToken, DeviceId, AppName, AppVersion, DeviceName, UserId, IsActive, DateCreated, DateRevoked) values (@Id, @AccessToken, @DeviceId, @AppName, @AppVersion, @DeviceName, @UserId, @IsActive, @DateCreated, @DateRevoked)")) { - statement.TryBind("@Id", info.Id.ToGuidParamValue()); + statement.TryBind("@Id", info.Id.ToGuidBlob()); statement.TryBind("@AccessToken", info.AccessToken); statement.TryBind("@DeviceId", info.DeviceId); @@ -259,7 +259,7 @@ namespace Emby.Server.Implementations.Security using (var statement = connection.PrepareStatement(commandText)) { - statement.BindParameters["@Id"].Bind(id.ToGuidParamValue()); + statement.BindParameters["@Id"].Bind(id.ToGuidBlob()); foreach (var row in statement.ExecuteQuery()) { @@ -275,7 +275,7 @@ namespace Emby.Server.Implementations.Security { var info = new AuthenticationInfo { - Id = reader[0].ReadGuid().ToString("N"), + Id = reader[0].ReadGuidFromBlob().ToString("N"), AccessToken = reader[1].ToString() }; diff --git a/Emby.Server.Implementations/Social/SharingRepository.cs b/Emby.Server.Implementations/Social/SharingRepository.cs index e8230947e..46e9205bb 100644 --- a/Emby.Server.Implementations/Social/SharingRepository.cs +++ b/Emby.Server.Implementations/Social/SharingRepository.cs @@ -61,7 +61,7 @@ namespace Emby.Server.Implementations.Social var commandText = "replace into Shares (Id, ItemId, UserId, ExpirationDate) values (?, ?, ?, ?)"; db.Execute(commandText, - info.Id.ToGuidParamValue(), + info.Id.ToGuidBlob(), info.ItemId, info.UserId, info.ExpirationDate.ToDateTimeParamValue()); @@ -84,7 +84,7 @@ namespace Emby.Server.Implementations.Social var commandText = "select Id, ItemId, UserId, ExpirationDate from Shares where id = ?"; var paramList = new List<object>(); - paramList.Add(id.ToGuidParamValue()); + paramList.Add(id.ToGuidBlob()); foreach (var row in connection.Query(commandText, paramList.ToArray())) { @@ -100,7 +100,7 @@ namespace Emby.Server.Implementations.Social { var info = new SocialShareInfo(); - info.Id = reader[0].ReadGuid().ToString("N"); + info.Id = reader[0].ReadGuidFromBlob().ToString("N"); info.ItemId = reader[1].ToString(); info.UserId = reader[2].ToString(); info.ExpirationDate = reader[3].ReadDateTime(); diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index 57019cc4e..e7aa402f2 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -664,9 +664,19 @@ namespace Emby.Server.Implementations.Updates // Remove it the quick way for now _applicationHost.RemovePlugin(plugin); - _logger.Info("Deleting plugin file {0}", plugin.AssemblyFilePath); + var path = plugin.AssemblyFilePath; + _logger.Info("Deleting plugin file {0}", path); - _fileSystem.DeleteFile(plugin.AssemblyFilePath); + // Make this case-insensitive to account for possible incorrect assembly naming + var file = _fileSystem.GetFilePaths(path) + .FirstOrDefault(i => string.Equals(i, path, StringComparison.OrdinalIgnoreCase)); + + if (!string.IsNullOrWhiteSpace(file)) + { + path = file; + } + + _fileSystem.DeleteFile(path); OnPluginUninstalled(plugin); diff --git a/Emby.Server.Implementations/packages.config b/Emby.Server.Implementations/packages.config index e4c75e1e9..5ce754d3f 100644 --- a/Emby.Server.Implementations/packages.config +++ b/Emby.Server.Implementations/packages.config @@ -3,5 +3,5 @@ <package id="Emby.XmlTv" version="1.0.8" targetFramework="portable45-net45+win8" /> <package id="MediaBrowser.Naming" version="1.0.5" targetFramework="portable45-net45+win8" /> <package id="SQLitePCL.pretty" version="1.1.0" targetFramework="portable45-net45+win8" /> - <package id="SQLitePCLRaw.core" version="1.1.2" targetFramework="portable45-net45+win8" /> + <package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="portable45-net45+win8" /> </packages>
\ No newline at end of file |
