From b098f0cd2704e744f3b3185f7233d3181ea572b6 Mon Sep 17 00:00:00 2001 From: Softworkz Date: Sun, 14 Aug 2016 02:51:11 +0200 Subject: [PATCH 01/18] ETag for synced media --- .../Sync/SyncedMediaSourceProvider.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs b/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs index efd37fa00e..a2b5851ac0 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs @@ -144,6 +144,10 @@ namespace MediaBrowser.Server.Implementations.Sync { mediaSource.Id = item.Id; mediaSource.SupportsTranscoding = false; + if (mediaSource.Protocol == Model.MediaInfo.MediaProtocol.File) + { + mediaSource.ETag = item.Id; + } } public Task CloseMediaSource(string liveStreamId, CancellationToken cancellationToken) From 86bc77fd6aa9f366e29cd789de112e4f1f6e7fd9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 25 Aug 2016 17:30:35 -0400 Subject: [PATCH 02/18] fix update level migration --- .../Updates/GithubUpdater.cs | 63 ++++++++++++++++++ .../Migrations/UpdateLevelMigration.cs | 65 ++++++++++--------- 2 files changed, 96 insertions(+), 32 deletions(-) diff --git a/MediaBrowser.Common.Implementations/Updates/GithubUpdater.cs b/MediaBrowser.Common.Implementations/Updates/GithubUpdater.cs index a118f7c265..6281ab3edb 100644 --- a/MediaBrowser.Common.Implementations/Updates/GithubUpdater.cs +++ b/MediaBrowser.Common.Implementations/Updates/GithubUpdater.cs @@ -78,6 +78,69 @@ namespace MediaBrowser.Common.Implementations.Updates }; } + private bool MatchesUpdateLevel(RootObject i, PackageVersionClass updateLevel) + { + if (updateLevel == PackageVersionClass.Beta) + { + return !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase); + } + if (updateLevel == PackageVersionClass.Dev) + { + return !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) || + i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase); + } + + // Technically all we need to do is check that it's not pre-release + // But let's addititional checks for -beta and -dev to handle builds that might be temporarily tagged incorrectly. + return !i.prerelease && !i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) && + !i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase); + } + + public async Task> GetLatestReleases(string organzation, string repository, string assetFilename, CancellationToken cancellationToken) + { + var list = new List(); + + var url = string.Format("https://api.github.com/repos/{0}/{1}/releases", organzation, repository); + + var options = new HttpRequestOptions + { + Url = url, + EnableKeepAlive = false, + CancellationToken = cancellationToken, + UserAgent = "Emby/3.0" + }; + + if (_cacheLength.Ticks > 0) + { + options.CacheMode = CacheMode.Unconditional; + options.CacheLength = _cacheLength; + } + + using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + { + var obj = _jsonSerializer.DeserializeFromStream(stream); + + obj = obj.Where(i => (i.assets ?? new List()).Any(a => IsAsset(a, assetFilename))).ToArray(); + + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Release)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Beta)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Dev)).OrderByDescending(GetVersion).Take(1)); + + return list; + } + } + + public Version GetVersion(RootObject obj) + { + Version version; + if (!Version.TryParse(obj.tag_name, out version)) + { + return new Version(1, 0); + } + + return version; + } + private CheckForUpdateResult CheckForUpdateResult(RootObject obj, Version minVersion, string assetFilename, string packageName, string targetFilename) { Version version; diff --git a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs index fa354065c3..948fe114ae 100644 --- a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs +++ b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs @@ -41,16 +41,7 @@ namespace MediaBrowser.Server.Startup.Common.Migrations { var updateLevel = _config.Configuration.SystemUpdateLevel; - // Go down a level - if (updateLevel == PackageVersionClass.Release) - { - updateLevel = PackageVersionClass.Beta; - } - else if (updateLevel == PackageVersionClass.Beta) - { - updateLevel = PackageVersionClass.Dev; - } - else if (updateLevel == PackageVersionClass.Dev) + if (updateLevel == PackageVersionClass.Dev) { // It's already dev, there's nothing to check return; @@ -66,32 +57,42 @@ namespace MediaBrowser.Server.Startup.Common.Migrations private async Task CheckVersion(Version currentVersion, PackageVersionClass updateLevel, CancellationToken cancellationToken) { - var result = await new GithubUpdater(_httpClient, _jsonSerializer, TimeSpan.FromMinutes(5)) - .CheckForUpdateResult("MediaBrowser", "Emby", currentVersion, PackageVersionClass.Beta, _releaseAssetFilename, "MBServer", "Mbserver.zip", - cancellationToken).ConfigureAwait(false); + var releases = await new GithubUpdater(_httpClient, _jsonSerializer, TimeSpan.FromMinutes(5)) + .GetLatestReleases("MediaBrowser", "Emby", _releaseAssetFilename, cancellationToken).ConfigureAwait(false); - if (result != null && result.IsUpdateAvailable) + var newUpdateLevel = updateLevel; + + if (releases.Count >= 2) { - _config.Configuration.SystemUpdateLevel = updateLevel; + var beta = releases[1]; + Version version; + if (Version.TryParse(beta.tag_name, out version)) + { + if (currentVersion >= version) + { + newUpdateLevel = PackageVersionClass.Beta; + } + } + } + + if (releases.Count >= 3) + { + var dev = releases[2]; + Version version; + if (Version.TryParse(dev.tag_name, out version)) + { + if (currentVersion >= version) + { + newUpdateLevel = PackageVersionClass.Dev; + } + } + } + + if (newUpdateLevel != updateLevel) + { + _config.Configuration.SystemUpdateLevel = newUpdateLevel; _config.SaveConfiguration(); - return; } - - // Go down a level - if (updateLevel == PackageVersionClass.Release) - { - updateLevel = PackageVersionClass.Beta; - } - else if (updateLevel == PackageVersionClass.Beta) - { - updateLevel = PackageVersionClass.Dev; - } - else - { - return; - } - - await CheckVersion(currentVersion, updateLevel, cancellationToken).ConfigureAwait(false); } } } From 6377e7365b94be92e38515beda20a0e6dbabe65f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Aug 2016 13:24:04 -0400 Subject: [PATCH 03/18] fix sync container statuses --- MediaBrowser.Api/ItemUpdateService.cs | 2 +- MediaBrowser.Controller/Entities/BaseItem.cs | 3 + .../Entities/IHasMetadata.cs | 3 + .../Manager/MetadataService.cs | 7 ++ .../Persistence/SqliteItemRepository.cs | 92 ++------------ .../Sync/SyncRepository.cs | 112 +++++++++++++----- .../Migrations/UpdateLevelMigration.cs | 14 ++- 7 files changed, 113 insertions(+), 120 deletions(-) diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index b944a39b6a..2778cfe29c 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -304,7 +304,7 @@ namespace MediaBrowser.Api item.EndDate = request.EndDate.HasValue ? NormalizeDateTime(request.EndDate.Value) : (DateTime?)null; item.PremiereDate = request.PremiereDate.HasValue ? NormalizeDateTime(request.PremiereDate.Value) : (DateTime?)null; item.ProductionYear = request.ProductionYear; - item.OfficialRating = request.OfficialRating; + item.OfficialRating = string.IsNullOrWhiteSpace(request.OfficialRating) ? null : request.OfficialRating; item.CustomRating = request.CustomRating; SetProductionLocations(item, request); diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 984374a499..55aaf04ffc 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -781,6 +781,9 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public string OfficialRating { get; set; } + [IgnoreDataMember] + public int InheritedParentalRatingValue { get; set; } + /// /// Gets or sets the critic rating. /// diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 26f425ff0b..cf2f7db64b 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -59,5 +59,8 @@ namespace MediaBrowser.Controller.Entities string GetPresentationUniqueKey(); string CreatePresentationUniqueKey(); bool StopRefreshIfLocalMetadataFound { get; } + + int? GetInheritedParentalRatingValue(); + int InheritedParentalRatingValue { get; set; } } } diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 2a69948b1a..c535f33baf 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -294,6 +294,13 @@ namespace MediaBrowser.Providers.Manager updateType |= ItemUpdateType.MetadataImport; } + var inheritedParentalRatingValue = item.GetInheritedParentalRatingValue() ?? 0; + if (inheritedParentalRatingValue != item.InheritedParentalRatingValue) + { + item.InheritedParentalRatingValue = inheritedParentalRatingValue; + updateType |= ItemUpdateType.MetadataImport; + } + return updateType; } diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 5c94d589dc..dc98c346ed 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -92,7 +92,6 @@ namespace MediaBrowser.Server.Implementations.Persistence private IDbCommand _deleteImagesCommand; private IDbCommand _saveImagesCommand; - private IDbCommand _updateInheritedRatingCommand; private IDbCommand _updateInheritedTagsCommand; public const int LatestSchemaVersion = 109; @@ -412,7 +411,8 @@ namespace MediaBrowser.Server.Implementations.Persistence "SeasonId", "SeriesId", "SeriesSortName", - "PresentationUniqueKey" + "PresentationUniqueKey", + "InheritedParentalRatingValue" }; private readonly string[] _mediaStreamSaveColumns = @@ -611,11 +611,6 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveStreamCommand.Parameters.Add(_saveStreamCommand, "@" + col); } - _updateInheritedRatingCommand = _connection.CreateCommand(); - _updateInheritedRatingCommand.CommandText = "Update TypedBaseItems set InheritedParentalRatingValue=@InheritedParentalRatingValue where Guid=@Guid"; - _updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@Guid"); - _updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@InheritedParentalRatingValue"); - _updateInheritedTagsCommand = _connection.CreateCommand(); _updateInheritedTagsCommand.CommandText = "Update TypedBaseItems set InheritedTags=@InheritedTags where Guid=@Guid"; _updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@Guid"); @@ -1458,6 +1453,12 @@ namespace MediaBrowser.Server.Implementations.Persistence } index++; + if (!reader.IsDBNull(index)) + { + item.InheritedParentalRatingValue = reader.GetInt32(index); + } + index++; + return item; } @@ -3402,7 +3403,6 @@ namespace MediaBrowser.Server.Implementations.Persistence public async Task UpdateInheritedValues(CancellationToken cancellationToken) { - await UpdateInheritedParentalRating(cancellationToken).ConfigureAwait(false); await UpdateInheritedTags(cancellationToken).ConfigureAwait(false); } @@ -3482,82 +3482,6 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - private async Task UpdateInheritedParentalRating(CancellationToken cancellationToken) - { - var newValues = new List>(); - - using (var cmd = _connection.CreateCommand()) - { - cmd.CommandText = "select Guid,InheritedParentalRatingValue,(select Max(InheritedParentalRatingValue, (select COALESCE(MAX(InheritedParentalRatingValue),0) from TypedBaseItems where guid in (Select AncestorId from AncestorIds where ItemId=Outer.guid)))) as NewInheritedParentalRatingValue from typedbaseitems as Outer where InheritedParentalRatingValue <> NewInheritedParentalRatingValue"; - - using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) - { - while (reader.Read()) - { - var id = reader.GetGuid(0); - var newValue = reader.GetInt32(2); - - newValues.Add(new Tuple(id, newValue)); - } - } - } - - Logger.Debug("UpdateInheritedParentalRatings - {0} rows", newValues.Count); - if (newValues.Count == 0) - { - return; - } - - await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); - - IDbTransaction transaction = null; - - try - { - transaction = _connection.BeginTransaction(); - - foreach (var item in newValues) - { - _updateInheritedRatingCommand.GetParameter(0).Value = item.Item1; - _updateInheritedRatingCommand.GetParameter(1).Value = item.Item2; - - _updateInheritedRatingCommand.Transaction = transaction; - _updateInheritedRatingCommand.ExecuteNonQuery(); - } - - transaction.Commit(); - } - catch (OperationCanceledException) - { - if (transaction != null) - { - transaction.Rollback(); - } - - throw; - } - catch (Exception e) - { - Logger.ErrorException("Error running query:", e); - - if (transaction != null) - { - transaction.Rollback(); - } - - throw; - } - finally - { - if (transaction != null) - { - transaction.Dispose(); - } - - WriteLock.Release(); - } - } - private static Dictionary GetTypeMapDictionary() { var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 6b7bcfa010..8b0a1d5602 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -47,15 +47,18 @@ namespace MediaBrowser.Server.Implementations.Sync string[] queries = { "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Profile TEXT, Quality TEXT, Bitrate INT, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)", - "create index if not exists idx_SyncJobs on SyncJobs(Id)", - "create index if not exists idx_SyncJobs1 on SyncJobs(TargetId)", "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, TemporaryPath TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT, AdditionalFiles TEXT, MediaSource TEXT, IsMarkedForRemoval BIT, JobItemIndex INT, ItemDateModifiedTicks BIGINT)", - "create index if not exists idx_SyncJobItems1 on SyncJobItems(Id)", "drop index if exists idx_SyncJobItems2", "drop index if exists idx_SyncJobItems3", + "drop index if exists idx_SyncJobs1", + "drop index if exists idx_SyncJobs", + "drop index if exists idx_SyncJobItems1", "create index if not exists idx_SyncJobItems4 on SyncJobItems(TargetId,ItemId,Status,Progress,DateCreated)", + "create index if not exists idx_SyncJobItems5 on SyncJobItems(TargetId,Status,ItemId,Progress)", + + "create index if not exists idx_SyncJobs2 on SyncJobs(TargetId,Status,ItemIds,Progress)", "pragma shrink_memory" }; @@ -641,37 +644,24 @@ namespace MediaBrowser.Server.Implementations.Sync cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray()); } - using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) + cmd.CommandText += ";" + cmd.CommandText + .Replace("select ItemId,Status,Progress from SyncJobItems", "select ItemIds,Status,Progress from SyncJobs") + .Replace("'Synced'", "'Completed','CompletedWithError'"); + + Logger.Debug(cmd.CommandText); + + using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) { while (reader.Read()) { - var itemId = reader.GetString(0); + AddStatusResult(reader, result, false); + } - if (!reader.IsDBNull(1)) + if (reader.NextResult()) + { + while (reader.Read()) { - var status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(1), true); - - if (status == SyncJobItemStatus.Synced) - { - result[itemId] = new SyncedItemProgress - { - Status = SyncJobItemStatus.Synced - }; - } - else - { - SyncedItemProgress currentStatus; - double progress = reader.IsDBNull(2) ? 0.0 : reader.GetDouble(2); - - if (!result.TryGetValue(itemId, out currentStatus) || (currentStatus.Status != SyncJobItemStatus.Synced && progress >= currentStatus.Progress)) - { - result[itemId] = new SyncedItemProgress - { - Status = status, - Progress = progress - }; - } - } + AddStatusResult(reader, result, true); } } } @@ -681,6 +671,70 @@ namespace MediaBrowser.Server.Implementations.Sync return result; } + private void AddStatusResult(IDataReader reader, Dictionary result, bool multipleIds) + { + if (reader.IsDBNull(0)) + { + return; + } + + var itemIds = new List(); + + var ids = reader.GetString(0); + + if (multipleIds) + { + itemIds = ids.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); + } + else + { + itemIds.Add(ids); + } + + if (!reader.IsDBNull(1)) + { + SyncJobItemStatus status; + var statusString = reader.GetString(1); + if (string.Equals(statusString, "Completed", StringComparison.OrdinalIgnoreCase) || + string.Equals(statusString, "CompletedWithError", StringComparison.OrdinalIgnoreCase)) + { + status = SyncJobItemStatus.Synced; + } + else + { + status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), statusString, true); + } + + if (status == SyncJobItemStatus.Synced) + { + foreach (var itemId in itemIds) + { + result[itemId] = new SyncedItemProgress + { + Status = SyncJobItemStatus.Synced + }; + } + } + else + { + double progress = reader.IsDBNull(2) ? 0.0 : reader.GetDouble(2); + + foreach (var itemId in itemIds) + { + SyncedItemProgress currentStatus; + if (!result.TryGetValue(itemId, out currentStatus) || (currentStatus.Status != SyncJobItemStatus.Synced && progress >= currentStatus.Progress)) + { + result[itemId] = new SyncedItemProgress + { + Status = status, + Progress = progress + }; + } + } + } + } + } + public QueryResult GetJobItems(SyncJobItemQuery query) { return GetJobItemReader(query, BaseJobItemSelectText, GetJobItem); diff --git a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs index 948fe114ae..6d22aaed02 100644 --- a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs +++ b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs @@ -62,11 +62,12 @@ namespace MediaBrowser.Server.Startup.Common.Migrations var newUpdateLevel = updateLevel; - if (releases.Count >= 2) + // If the current version is later than current stable, set the update level to beta + if (releases.Count >= 1) { - var beta = releases[1]; + var release = releases[0]; Version version; - if (Version.TryParse(beta.tag_name, out version)) + if (Version.TryParse(release.tag_name, out version)) { if (currentVersion >= version) { @@ -75,11 +76,12 @@ namespace MediaBrowser.Server.Startup.Common.Migrations } } - if (releases.Count >= 3) + // If the current version is later than current beta, set the update level to dev + if (releases.Count >= 2) { - var dev = releases[2]; + var release = releases[1]; Version version; - if (Version.TryParse(dev.tag_name, out version)) + if (Version.TryParse(release.tag_name, out version)) { if (currentVersion >= version) { From d3ce29b5c3ffad11eef3287a7ebb4c24e779d20f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Aug 2016 13:28:05 -0400 Subject: [PATCH 04/18] 3.1.122 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 0f9cd1aecb..cd54d2b8d5 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.121")] +[assembly: AssemblyVersion("3.1.122")] From 510fbf139cf1df9ba7659351d96cf74eb92c0b23 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Aug 2016 15:29:28 -0400 Subject: [PATCH 05/18] fix repeated guide refreshes --- .../LiveTv/ILiveTvManager.cs | 5 ++- MediaBrowser.Model/Dlna/StreamBuilder.cs | 2 +- .../LiveTv/LiveTvManager.cs | 7 ++-- .../LiveTv/TunerHosts/SatIp/SatIpDiscovery.cs | 4 +-- .../Sync/SyncRepository.cs | 32 ++++++++++++++++++- .../Migrations/UpdateLevelMigration.cs | 4 +-- MediaBrowser.ServerApplication/MainStartup.cs | 2 +- 7 files changed, 44 insertions(+), 12 deletions(-) diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index fe69b38cb0..ed64127c38 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -331,12 +331,11 @@ namespace MediaBrowser.Controller.LiveTv /// The user. /// Task. Task AddInfoToProgramDto(List> programs, List fields, User user = null); + /// /// Saves the tuner host. /// - /// The information. - /// Task. - Task SaveTunerHost(TunerHostInfo info); + Task SaveTunerHost(TunerHostInfo info, bool dataSourceChanged = true); /// /// Saves the listing provider. /// diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index d042125b9b..13d5597738 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -602,7 +602,7 @@ namespace MediaBrowser.Model.Dlna private int GetAudioBitrate(string subProtocol, int? maxTotalBitrate, int? targetAudioChannels, string targetAudioCodec, MediaStream audioStream) { - var defaultBitrate = audioStream.BitRate ?? 192000; + var defaultBitrate = audioStream == null ? 192000 : audioStream.BitRate ?? 192000; // Reduce the bitrate if we're downmixing if (targetAudioChannels.HasValue && audioStream != null && audioStream.Channels.HasValue && targetAudioChannels.Value < audioStream.Channels.Value) { diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index ccbcb910d3..88017aa59d 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -2475,7 +2475,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv return await _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken).ConfigureAwait(false); } - public async Task SaveTunerHost(TunerHostInfo info) + public async Task SaveTunerHost(TunerHostInfo info, bool dataSourceChanged = true) { info = (TunerHostInfo)_jsonSerializer.DeserializeFromString(_jsonSerializer.SerializeToString(info), typeof(TunerHostInfo)); @@ -2508,7 +2508,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv _config.SaveConfiguration("livetv", config); - _taskManager.CancelIfRunningAndQueue(); + if (dataSourceChanged) + { + _taskManager.CancelIfRunningAndQueue(); + } return info; } diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpDiscovery.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpDiscovery.cs index 43f48b37bf..9d5dba2823 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpDiscovery.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/SatIp/SatIpDiscovery.cs @@ -111,7 +111,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp M3UUrl = info.M3UUrl, IsEnabled = true - }).ConfigureAwait(false); + }, true).ConfigureAwait(false); } else { @@ -120,7 +120,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp existing.M3UUrl = info.M3UUrl; existing.FriendlyName = info.FriendlyName; existing.Tuners = info.Tuners; - await _liveTvManager.SaveTunerHost(existing).ConfigureAwait(false); + await _liveTvManager.SaveTunerHost(existing, false).ConfigureAwait(false); } } catch (OperationCanceledException) diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 8b0a1d5602..64ed00ded1 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -618,6 +618,8 @@ namespace MediaBrowser.Server.Implementations.Sync { var result = new Dictionary(); + var now = DateTime.UtcNow; + using (var connection = CreateConnection(true).Result) { using (var cmd = connection.CreateCommand()) @@ -648,10 +650,12 @@ namespace MediaBrowser.Server.Implementations.Sync .Replace("select ItemId,Status,Progress from SyncJobItems", "select ItemIds,Status,Progress from SyncJobs") .Replace("'Synced'", "'Completed','CompletedWithError'"); - Logger.Debug(cmd.CommandText); + //Logger.Debug(cmd.CommandText); using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) { + LogQueryTime("GetSyncedItemProgresses", cmd, now); + while (reader.Read()) { AddStatusResult(reader, result, false); @@ -671,6 +675,32 @@ namespace MediaBrowser.Server.Implementations.Sync return result; } + private void LogQueryTime(string methodName, IDbCommand cmd, DateTime startDate) + { + var elapsed = (DateTime.UtcNow - startDate).TotalMilliseconds; + + var slowThreshold = 1000; + +#if DEBUG + slowThreshold = 50; +#endif + + if (elapsed >= slowThreshold) + { + Logger.Debug("{2} query time (slow): {0}ms. Query: {1}", + Convert.ToInt32(elapsed), + cmd.CommandText, + methodName); + } + else + { + //Logger.Debug("{2} query time: {0}ms. Query: {1}", + // Convert.ToInt32(elapsed), + // cmd.CommandText, + // methodName); + } + } + private void AddStatusResult(IDataReader reader, Dictionary result, bool multipleIds) { if (reader.IsDBNull(0)) diff --git a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs index 6d22aaed02..5212b8ac3e 100644 --- a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs +++ b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs @@ -69,7 +69,7 @@ namespace MediaBrowser.Server.Startup.Common.Migrations Version version; if (Version.TryParse(release.tag_name, out version)) { - if (currentVersion >= version) + if (currentVersion > version) { newUpdateLevel = PackageVersionClass.Beta; } @@ -83,7 +83,7 @@ namespace MediaBrowser.Server.Startup.Common.Migrations Version version; if (Version.TryParse(release.tag_name, out version)) { - if (currentVersion >= version) + if (currentVersion > version) { newUpdateLevel = PackageVersionClass.Dev; } diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs index c40e633749..8f153f33fe 100644 --- a/MediaBrowser.ServerApplication/MainStartup.cs +++ b/MediaBrowser.ServerApplication/MainStartup.cs @@ -163,7 +163,7 @@ namespace MediaBrowser.ServerApplication { _logger.Info("Found a duplicate process. Giving it time to exit."); - if (!duplicate.WaitForExit(15000)) + if (!duplicate.WaitForExit(20000)) { _logger.Info("The duplicate process did not exit."); return true; From 76daf165355ab3fea8f37570c1cf37de4cf9b3ab Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Aug 2016 15:37:01 -0400 Subject: [PATCH 06/18] 3.1.123 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index cd54d2b8d5..2046949b3b 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.122")] +[assembly: AssemblyVersion("3.1.123")] From ae331babed85ad55eb67641fb17f9829f2a3a8bc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Aug 2016 16:37:19 -0400 Subject: [PATCH 07/18] fix version comparison --- .../Migrations/UpdateLevelMigration.cs | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs index 5212b8ac3e..ec00fb33de 100644 --- a/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs +++ b/MediaBrowser.Server.Startup.Common/Migrations/UpdateLevelMigration.cs @@ -66,13 +66,10 @@ namespace MediaBrowser.Server.Startup.Common.Migrations if (releases.Count >= 1) { var release = releases[0]; - Version version; - if (Version.TryParse(release.tag_name, out version)) + var version = ParseVersion(release.tag_name); + if (version != null && currentVersion > version) { - if (currentVersion > version) - { - newUpdateLevel = PackageVersionClass.Beta; - } + newUpdateLevel = PackageVersionClass.Beta; } } @@ -80,13 +77,10 @@ namespace MediaBrowser.Server.Startup.Common.Migrations if (releases.Count >= 2) { var release = releases[1]; - Version version; - if (Version.TryParse(release.tag_name, out version)) + var version = ParseVersion(release.tag_name); + if (version != null && currentVersion > version) { - if (currentVersion > version) - { - newUpdateLevel = PackageVersionClass.Dev; - } + newUpdateLevel = PackageVersionClass.Dev; } } @@ -96,5 +90,19 @@ namespace MediaBrowser.Server.Startup.Common.Migrations _config.SaveConfiguration(); } } + + private Version ParseVersion(string versionString) + { + var parts = versionString.Split('.'); + if (parts.Length == 3) + { + versionString += ".0"; + } + + Version version; + Version.TryParse(versionString, out version); + + return version; + } } } From 23c3b359835d5fd49238b27988c6db082d0d93d0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 26 Aug 2016 16:39:58 -0400 Subject: [PATCH 08/18] 3.1.124 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 2046949b3b..722cad492d 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.1.*")] -[assembly: AssemblyVersion("3.1.123")] +[assembly: AssemblyVersion("3.1.124")] From 4fa0df37e28d88f789bb978bbb4757241fd5dceb Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 27 Aug 2016 00:35:06 -0400 Subject: [PATCH 09/18] fix fields that shouldn't be required --- MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs index 6380b9f53b..bf6df2347f 100644 --- a/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs @@ -64,25 +64,25 @@ namespace MediaBrowser.XbmcMetadata.Savers writer.WriteElementString("aired", episode.PremiereDate.Value.ToLocalTime().ToString(formatString)); } - if (episode.AirsAfterSeasonNumber.HasValue) + if (episode.AirsAfterSeasonNumber.HasValue && episode.AirsAfterSeasonNumber.Value != -1) { writer.WriteElementString("airsafter_season", episode.AirsAfterSeasonNumber.Value.ToString(UsCulture)); } - if (episode.AirsBeforeEpisodeNumber.HasValue) + if (episode.AirsBeforeEpisodeNumber.HasValue && episode.AirsBeforeEpisodeNumber.Value != -1) { writer.WriteElementString("airsbefore_episode", episode.AirsBeforeEpisodeNumber.Value.ToString(UsCulture)); } - if (episode.AirsBeforeEpisodeNumber.HasValue) + if (episode.AirsBeforeEpisodeNumber.HasValue && episode.AirsBeforeEpisodeNumber.Value != -1) { writer.WriteElementString("displayepisode", episode.AirsBeforeEpisodeNumber.Value.ToString(UsCulture)); } - if (episode.AirsBeforeSeasonNumber.HasValue) + if (episode.AirsBeforeSeasonNumber.HasValue && episode.AirsBeforeSeasonNumber.Value != -1) { writer.WriteElementString("airsbefore_season", episode.AirsBeforeSeasonNumber.Value.ToString(UsCulture)); } var season = episode.AiredSeasonNumber; - if (season.HasValue) + if (season.HasValue && season.Value != -1) { writer.WriteElementString("displayseason", season.Value.ToString(UsCulture)); } From 73bafa7cda7d341a347b4f56681d7efebe756618 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 27 Aug 2016 12:47:09 -0400 Subject: [PATCH 10/18] fix saving of IsVirtualItem --- MediaBrowser.Server.Implementations/Library/UserViewManager.cs | 2 +- .../Persistence/SqliteItemRepository.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs index 319e715c33..5fffa3d1fb 100644 --- a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs @@ -283,7 +283,7 @@ namespace MediaBrowser.Server.Implementations.Library ExcludeItemTypes = excludeItemTypes, ExcludeLocationTypes = new[] { LocationType.Virtual }, Limit = limit * 5, - ExcludeSourceTypes = parentIds.Length == 0 ? new[] { SourceType.Channel, SourceType.LiveTV } : new SourceType[] { }, + SourceTypes = parentIds.Length == 0 ? new[] { SourceType.Library } : new SourceType[] { }, IsPlayed = request.IsPlayed }, parentIds); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index dc98c346ed..5ece3dd826 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -937,7 +937,7 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveItemCommand.GetParameter(index++).Value = item.Album; - _saveItemCommand.GetParameter(index++).Value = item.IsVirtualItem || (!item.IsFolder && item.LocationType == LocationType.Virtual); + _saveItemCommand.GetParameter(index++).Value = item.IsVirtualItem; var hasSeries = item as IHasSeries; if (hasSeries != null) From d68e9841207e6681b9b78c560ccee889fb1173fa Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 27 Aug 2016 13:27:48 -0400 Subject: [PATCH 11/18] add new sony dlna profiles --- MediaBrowser.Dlna/DlnaManager.cs | 5 +- MediaBrowser.Dlna/MediaBrowser.Dlna.csproj | 10 +- ...2013Profile.cs => SonyBlurayPlayer2013.cs} | 4 +- .../Profiles/SonyBlurayPlayer2014.cs | 187 ++++++++++++++++++ .../Profiles/SonyBlurayPlayer2015.cs | 187 ++++++++++++++++++ .../Profiles/SonyBlurayPlayer2016.cs | 187 ++++++++++++++++++ MediaBrowser.Dlna/Profiles/Xml/BubbleUPnp.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/Default.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml | 8 +- .../Profiles/Xml/DirecTV HD-DVR.xml | 6 +- .../Profiles/Xml/Dish Hopper-Joey.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/Kodi.xml | 10 +- .../Profiles/Xml/LG Smart TV.xml | 8 +- .../Profiles/Xml/Linksys DMA2100.xml | 8 +- .../Profiles/Xml/MediaMonkey.xml | 8 +- .../Profiles/Xml/Panasonic Viera.xml | 8 +- .../Profiles/Xml/Popcorn Hour.xml | 8 +- .../Profiles/Xml/Samsung Smart TV.xml | 8 +- .../Profiles/Xml/Sony Blu-ray Player 2013.xml | 8 +- .../Profiles/Xml/Sony Blu-ray Player 2014.xml | 81 ++++++++ .../Profiles/Xml/Sony Blu-ray Player 2015.xml | 81 ++++++++ .../Profiles/Xml/Sony Blu-ray Player 2016.xml | 81 ++++++++ .../Profiles/Xml/Sony Blu-ray Player.xml | 8 +- .../Profiles/Xml/Sony Bravia (2010).xml | 8 +- .../Profiles/Xml/Sony Bravia (2011).xml | 8 +- .../Profiles/Xml/Sony Bravia (2012).xml | 8 +- .../Profiles/Xml/Sony Bravia (2013).xml | 8 +- .../Profiles/Xml/Sony Bravia (2014).xml | 8 +- .../Profiles/Xml/Sony PlayStation 3.xml | 8 +- .../Profiles/Xml/Sony PlayStation 4.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/Vlc.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml | 8 +- MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml | 8 +- 35 files changed, 923 insertions(+), 108 deletions(-) rename MediaBrowser.Dlna/Profiles/{SonyBlurayPlayer2013Profile.cs => SonyBlurayPlayer2013.cs} (99%) create mode 100644 MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2014.cs create mode 100644 MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2015.cs create mode 100644 MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2016.cs create mode 100644 MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2014.xml create mode 100644 MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2015.xml create mode 100644 MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2016.xml diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs index a01d73451e..5f4c34bb77 100644 --- a/MediaBrowser.Dlna/DlnaManager.cs +++ b/MediaBrowser.Dlna/DlnaManager.cs @@ -566,7 +566,10 @@ namespace MediaBrowser.Dlna new SonyBravia2012Profile(), new SonyBravia2013Profile(), new SonyBravia2014Profile(), - new SonyBlurayPlayer2013Profile(), + new SonyBlurayPlayer2013(), + new SonyBlurayPlayer2014(), + new SonyBlurayPlayer2015(), + new SonyBlurayPlayer2016(), new SonyBlurayPlayerProfile(), new PanasonicVieraProfile(), new WdtvLiveProfile(), diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index 9df9c0a252..d10a5f7b5a 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -94,6 +94,9 @@ + + + @@ -137,7 +140,7 @@ - + @@ -244,6 +247,11 @@ + + + + +