From 2f93d4498bc50eb36546a94d2ee3c4a0ab502480 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 23 May 2017 12:43:24 -0400 Subject: update query fields --- .../Data/SqliteItemRepository.cs | 266 +++++++++++++++++---- .../Library/LibraryManager.cs | 2 +- 2 files changed, 226 insertions(+), 42 deletions(-) (limited to 'Emby.Server.Implementations') diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index fbd97b6a23..c7ddc8b154 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -1347,6 +1347,11 @@ namespace Emby.Server.Implementations.Data } private BaseItem GetItem(IReadOnlyList reader, InternalItemsQuery query) + { + return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query)); + } + + private BaseItem GetItem(IReadOnlyList reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields) { var typeString = reader.GetString(0); @@ -1394,28 +1399,34 @@ namespace Emby.Server.Implementations.Data return null; } - if (!reader.IsDBNull(2)) + var index = 2; + + if (queryHasStartDate) { - var hasStartDate = item as IHasStartDate; - if (hasStartDate != null) + if (!reader.IsDBNull(index)) { - hasStartDate.StartDate = reader[2].ReadDateTime(); + var hasStartDate = item as IHasStartDate; + if (hasStartDate != null) + { + hasStartDate.StartDate = reader[index].ReadDateTime(); + } } + index++; } - if (!reader.IsDBNull(3)) + if (!reader.IsDBNull(index)) { - item.EndDate = reader[3].ReadDateTime(); + item.EndDate = reader[index].ReadDateTime(); } + index++; - if (!reader.IsDBNull(4)) + if (!reader.IsDBNull(index)) { - item.ChannelId = reader.GetString(4); + item.ChannelId = reader.GetString(index); } + index++; - var index = 5; - - if (HasProgramAttributes(query)) + if (enableProgramAttributes) { var hasProgramAttributes = item as IHasProgramAttributes; if (hasProgramAttributes != null) @@ -1728,15 +1739,18 @@ namespace Emby.Server.Implementations.Data } index++; - var trailer = item as Trailer; - if (trailer != null) + if (hasTrailerTypes) { - if (!reader.IsDBNull(index)) + var trailer = item as Trailer; + if (trailer != null) { - trailer.TrailerTypes = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList(); + if (!reader.IsDBNull(index)) + { + trailer.TrailerTypes = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList(); + } } + index++; } - index++; if (HasField(query, ItemFields.OriginalTitle)) { @@ -1795,24 +1809,27 @@ namespace Emby.Server.Implementations.Data } index++; - var episode = item as Episode; - if (episode != null) + if (hasEpisodeAttributes) { - if (!reader.IsDBNull(index)) + var episode = item as Episode; + if (episode != null) { - episode.SeasonName = reader.GetString(index); + if (!reader.IsDBNull(index)) + { + episode.SeasonName = reader.GetString(index); + } + index++; + if (!reader.IsDBNull(index)) + { + episode.SeasonId = reader.GetGuid(index); + } } - index++; - if (!reader.IsDBNull(index)) + else { - episode.SeasonId = reader.GetGuid(index); + index++; } - } - else - { index++; } - index++; if (hasSeries != null) { @@ -1931,19 +1948,22 @@ namespace Emby.Server.Implementations.Data } index++; - var hasArtists = item as IHasArtist; - if (hasArtists != null && !reader.IsDBNull(index)) + if (hasArtistFields) { - hasArtists.Artists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); - } - index++; + var hasArtists = item as IHasArtist; + if (hasArtists != null && !reader.IsDBNull(index)) + { + hasArtists.Artists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + } + index++; - var hasAlbumArtists = item as IHasAlbumArtist; - if (hasAlbumArtists != null && !reader.IsDBNull(index)) - { - hasAlbumArtists.AlbumArtists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + var hasAlbumArtists = item as IHasAlbumArtist; + if (hasAlbumArtists != null && !reader.IsDBNull(index)) + { + hasAlbumArtists.AlbumArtists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + } + index++; } - index++; if (!reader.IsDBNull(index)) { @@ -2312,6 +2332,20 @@ namespace Emby.Server.Implementations.Data private bool HasProgramAttributes(InternalItemsQuery query) { + var excludeParentTypes = new string[] + { + "Series", + "Season", + "MusicAlbum", + "MusicArtist", + "PhotoAlbum" + }; + + if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + if (query.IncludeItemTypes.Length == 0) { return true; @@ -2331,6 +2365,102 @@ namespace Emby.Server.Implementations.Data return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); } + private bool HasStartDate(InternalItemsQuery query) + { + var excludeParentTypes = new string[] + { + "Series", + "Season", + "MusicAlbum", + "MusicArtist", + "PhotoAlbum" + }; + + if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (query.IncludeItemTypes.Length == 0) + { + return true; + } + + var types = new string[] + { + "Program", + "Recording", + "LiveTvAudioRecording", + "LiveTvVideoRecording", + "LiveTvProgram" + }; + + return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); + } + + private bool HasEpisodeAttributes(InternalItemsQuery query) + { + if (query.IncludeItemTypes.Length == 0) + { + return true; + } + + var types = new string[] + { + "Episode" + }; + + return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); + } + + private bool HasTrailerTypes(InternalItemsQuery query) + { + if (query.IncludeItemTypes.Length == 0) + { + return true; + } + + var types = new string[] + { + "Trailer" + }; + + return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); + } + + private bool HasArtistFields(InternalItemsQuery query) + { + var excludeParentTypes = new string[] + { + "Series", + "Season", + "PhotoAlbum" + }; + + if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (query.IncludeItemTypes.Length == 0) + { + return true; + } + + var types = new string[] + { + "Audio", + "MusicAlbum", + "MusicVideo", + "AudioBook", + "AudioPodcast", + "LiveTvAudioRecording", + "Recording" + }; + + return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); + } + private string[] GetFinalColumnsToSelect(InternalItemsQuery query, string[] startColumns) { var list = startColumns.ToList(); @@ -2359,6 +2489,34 @@ namespace Emby.Server.Implementations.Data list.Remove("IsRepeat"); } + if (!HasEpisodeAttributes(query)) + { + list.Remove("SeasonName"); + list.Remove("SeasonId"); + } + + if (!HasStartDate(query)) + { + list.Remove("StartDate"); + } + + if (!HasTrailerTypes(query)) + { + list.Remove("TrailerTypes"); + } + + if (!HasArtistFields(query)) + { + list.Remove("AlbumArtists"); + list.Remove("Artists"); + } + + if (!HasEpisodeAttributes(query)) + { + list.Remove("SeasonName"); + list.Remove("SeasonId"); + } + if (!query.DtoOptions.EnableImages) { list.Remove("Images"); @@ -2590,9 +2748,15 @@ namespace Emby.Server.Implementations.Data // Running this again will bind the params GetWhereClauses(query, statement); + var hasEpisodeAttributes = HasEpisodeAttributes(query); + var hasProgramAttributes = HasProgramAttributes(query); + var hasStartDate = HasStartDate(query); + var hasTrailerTypes = HasTrailerTypes(query); + var hasArtistFields = HasArtistFields(query); + foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row, query); + var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields); if (item != null) { list.Add(item); @@ -2792,9 +2956,15 @@ namespace Emby.Server.Implementations.Data // Running this again will bind the params GetWhereClauses(query, statement); + var hasEpisodeAttributes = HasEpisodeAttributes(query); + var hasProgramAttributes = HasProgramAttributes(query); + var hasStartDate = HasStartDate(query); + var hasTrailerTypes = HasTrailerTypes(query); + var hasArtistFields = HasArtistFields(query); + foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row, query); + var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields); if (item != null) { list.Add(item); @@ -3562,6 +3732,15 @@ namespace Emby.Server.Implementations.Data } } + if (query.MinDateLastSavedForUser.HasValue) + { + whereClauses.Add("DateLastSaved>=@MinDateLastSaved"); + if (statement != null) + { + statement.TryBind("@MinDateLastSaved", query.MinDateLastSavedForUser.Value); + } + } + //if (query.MinPlayers.HasValue) //{ // whereClauses.Add("Players>=@MinPlayers"); @@ -3756,7 +3935,6 @@ namespace Emby.Server.Implementations.Data if (!string.IsNullOrWhiteSpace(query.SlugName)) { - Logger.Info("Searching by SlugName for {0}", query.SlugName); whereClauses.Add("CleanName=@SlugName"); if (statement != null) { @@ -5137,9 +5315,15 @@ namespace Emby.Server.Implementations.Data GetWhereClauses(innerQuery, statement); GetWhereClauses(outerQuery, statement); + var hasEpisodeAttributes = HasEpisodeAttributes(query); + var hasProgramAttributes = HasProgramAttributes(query); + var hasStartDate = HasStartDate(query); + var hasTrailerTypes = HasTrailerTypes(query); + var hasArtistFields = HasArtistFields(query); + foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row, query); + var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields); if (item != null) { var countStartColumn = columns.Count - 1; diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 8907c911a1..125db7fd66 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1546,7 +1546,7 @@ namespace Emby.Server.Implementations.Library } } - query.ParentId = null; + query.Parent = null; } private void AddUserToQuery(InternalItemsQuery query, User user) -- cgit v1.2.3 From 8b9e7e1f59334f4bbecc8d4be19653d70b42a3be Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 23 May 2017 12:44:11 -0400 Subject: rework hdhr udp stream --- .../LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs | 3 +- .../TunerHosts/HdHomerun/HdHomerunHttpStream.cs | 4 +-- .../TunerHosts/HdHomerun/HdHomerunUdpStream.cs | 35 +++++++++++++++------- 3 files changed, 29 insertions(+), 13 deletions(-) (limited to 'Emby.Server.Implementations') diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index c1e1bf2b62..50cb68a95e 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -422,7 +422,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun SupportsTranscoding = true, IsInfiniteStream = true, IgnoreDts = true, - IgnoreIndex = true + //IgnoreIndex = true, + //ReadAtNativeFramerate = true }; mediaSource.InferTotalBitrate(); diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs index 03c21b1202..477eef7ab0 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs @@ -101,9 +101,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun _logger.Info("Beginning multicastStream.CopyUntilCancelled"); FileSystem.CreateDirectory(FileSystem.GetDirectoryName(_tempFilePath)); - using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.Asynchronous | FileOpenOptions.SequentialScan)) + using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.Asynchronous)) { - ResolveAfterDelay(2000, openTaskCompletionSource); + ResolveAfterDelay(3000, openTaskCompletionSource); await response.Content.CopyToAsync(fileStream, 81920, cancellationToken).ConfigureAwait(false); } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs index ff6c0fb2c9..7c767c1417 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs @@ -121,11 +121,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun if (!cancellationToken.IsCancellationRequested) { FileSystem.CreateDirectory(FileSystem.GetDirectoryName(_tempFilePath)); - using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.Asynchronous | FileOpenOptions.SequentialScan)) + using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.Asynchronous)) { - ResolveAfterDelay(2000, openTaskCompletionSource); - - await new UdpClientStream(udpClient).CopyToAsync(fileStream, 81920, cancellationToken).ConfigureAwait(false); + await CopyTo(udpClient, fileStream, openTaskCompletionSource, cancellationToken).ConfigureAwait(false); } } } @@ -159,19 +157,36 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun }); } - private void ResolveAfterDelay(int delayMs, TaskCompletionSource openTaskCompletionSource) + private void Resolve(TaskCompletionSource openTaskCompletionSource) { - Task.Run(async () => - { - await Task.Delay(delayMs).ConfigureAwait(false); - openTaskCompletionSource.TrySetResult(true); - }); + Task.Run(() => + { + openTaskCompletionSource.TrySetResult(true); + }); } public Task CopyToAsync(Stream stream, CancellationToken cancellationToken) { return CopyFileTo(_tempFilePath, false, stream, cancellationToken); } + + private static int RtpHeaderBytes = 12; + private async Task CopyTo(ISocket udpClient, Stream outputStream, TaskCompletionSource openTaskCompletionSource, CancellationToken cancellationToken) + { + while (true) + { + var data = await udpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false); + var bytesRead = data.ReceivedBytes - RtpHeaderBytes; + + await outputStream.WriteAsync(data.Buffer, RtpHeaderBytes, bytesRead, cancellationToken).ConfigureAwait(false); + + if (openTaskCompletionSource != null) + { + Resolve(openTaskCompletionSource); + openTaskCompletionSource = null; + } + } + } } // This handles the ReadAsync function only of a Stream object -- cgit v1.2.3 From 27c3acb2bfde9025c33f584c759a4038020cb702 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 23 May 2017 12:56:01 -0400 Subject: 3.2.17.11 --- .../Data/SqliteItemRepository.cs | 69 ++++++++++++++++++---- SharedVersion.cs | 2 +- 2 files changed, 57 insertions(+), 14 deletions(-) (limited to 'Emby.Server.Implementations') diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index c7ddc8b154..7812cfb3cb 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -1348,10 +1348,10 @@ namespace Emby.Server.Implementations.Data private BaseItem GetItem(IReadOnlyList reader, InternalItemsQuery query) { - return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query)); + return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query), HasSeriesFields(query)); } - private BaseItem GetItem(IReadOnlyList reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields) + private BaseItem GetItem(IReadOnlyList reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields, bool hasSeriesFields) { var typeString = reader.GetString(0); @@ -1800,14 +1800,17 @@ namespace Emby.Server.Implementations.Data index++; var hasSeries = item as IHasSeries; - if (hasSeries != null) + if (hasSeriesFields) { - if (!reader.IsDBNull(index)) + if (hasSeries != null) { - hasSeries.SeriesName = reader.GetString(index); + if (!reader.IsDBNull(index)) + { + hasSeries.SeriesName = reader.GetString(index); + } } + index++; } - index++; if (hasEpisodeAttributes) { @@ -1831,14 +1834,17 @@ namespace Emby.Server.Implementations.Data index++; } - if (hasSeries != null) + if (hasSeriesFields) { - if (!reader.IsDBNull(index)) + if (hasSeries != null) { - hasSeries.SeriesId = reader.GetGuid(index); + if (!reader.IsDBNull(index)) + { + hasSeries.SeriesId = reader.GetGuid(index); + } } + index++; } - index++; if (HasField(query, ItemFields.PresentationUniqueKey)) { @@ -2461,6 +2467,34 @@ namespace Emby.Server.Implementations.Data return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); } + private bool HasSeriesFields(InternalItemsQuery query) + { + var excludeParentTypes = new string[] + { + "PhotoAlbum" + }; + + if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (query.IncludeItemTypes.Length == 0) + { + return true; + } + + var types = new string[] + { + "Book", + "AudioBook", + "Episode", + "Season" + }; + + return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase)); + } + private string[] GetFinalColumnsToSelect(InternalItemsQuery query, string[] startColumns) { var list = startColumns.ToList(); @@ -2511,6 +2545,12 @@ namespace Emby.Server.Implementations.Data list.Remove("Artists"); } + if (!HasSeriesFields(query)) + { + list.Remove("SeriesId"); + list.Remove("SeriesName"); + } + if (!HasEpisodeAttributes(query)) { list.Remove("SeasonName"); @@ -2753,10 +2793,11 @@ namespace Emby.Server.Implementations.Data var hasStartDate = HasStartDate(query); var hasTrailerTypes = HasTrailerTypes(query); var hasArtistFields = HasArtistFields(query); + var hasSeriesFields = HasSeriesFields(query); foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields); + var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields); if (item != null) { list.Add(item); @@ -2961,10 +3002,11 @@ namespace Emby.Server.Implementations.Data var hasStartDate = HasStartDate(query); var hasTrailerTypes = HasTrailerTypes(query); var hasArtistFields = HasArtistFields(query); + var hasSeriesFields = HasSeriesFields(query); foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields); + var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields); if (item != null) { list.Add(item); @@ -5320,10 +5362,11 @@ namespace Emby.Server.Implementations.Data var hasStartDate = HasStartDate(query); var hasTrailerTypes = HasTrailerTypes(query); var hasArtistFields = HasArtistFields(query); + var hasSeriesFields = HasSeriesFields(query); foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields); + var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields); if (item != null) { var countStartColumn = columns.Count - 1; diff --git a/SharedVersion.cs b/SharedVersion.cs index 5a7ec0dba4..1564e4a417 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,3 +1,3 @@ using System.Reflection; -[assembly: AssemblyVersion("3.2.17.10")] +[assembly: AssemblyVersion("3.2.17.11")] -- cgit v1.2.3