diff options
| author | Luke <luke.pulverenti@gmail.com> | 2017-06-11 18:05:07 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-11 18:05:07 -0400 |
| commit | e0c907cc6009408157d42531afab4c089c2e2871 (patch) | |
| tree | 069efdd6b11b3dd81e7bc6c191497114374f0577 /Emby.Server.Implementations | |
| parent | 9ee58d399cde4ccec9ea10c60c1a508a353b7836 (diff) | |
| parent | e9d2fb13e06a93336b6b16d03b66d3390a762c40 (diff) | |
Merge pull request #2702 from MediaBrowser/beta
Beta
Diffstat (limited to 'Emby.Server.Implementations')
19 files changed, 238 insertions, 306 deletions
diff --git a/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs b/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs index d3b2ef7ef7..567f139fd8 100644 --- a/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs +++ b/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs @@ -123,7 +123,7 @@ namespace Emby.Server.Implementations.Activity return; } - if (item.IsThemeMedia) + if (e.Item != null && e.Item.IsThemeMedia) { // Don't report theme song or local trailer playback return; @@ -155,7 +155,7 @@ namespace Emby.Server.Implementations.Activity return; } - if (item.IsThemeMedia) + if (e.Item != null && e.Item.IsThemeMedia) { // Don't report theme song or local trailer playback return; diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index 809771b045..73878160c9 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -176,7 +176,9 @@ namespace Emby.Server.Implementations.Channels var internalResult = await GetChannelsInternal(query, cancellationToken).ConfigureAwait(false); - var dtoOptions = new DtoOptions(); + var dtoOptions = new DtoOptions() + { + }; var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) .ToArray(); @@ -558,7 +560,10 @@ namespace Emby.Server.Implementations.Channels totalRecordCount = items.Length; } - var dtoOptions = new DtoOptions(); + var dtoOptions = new DtoOptions() + { + Fields = query.Fields.ToList() + }; var returnItems = (await _dtoService.GetBaseItemDtos(items, dtoOptions, user).ConfigureAwait(false)) .ToArray(); @@ -825,7 +830,10 @@ namespace Emby.Server.Implementations.Channels RefreshIfNeeded(internalResult.Items); - var dtoOptions = new DtoOptions(); + var dtoOptions = new DtoOptions() + { + Fields = query.Fields.ToList() + }; var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) .ToArray(); @@ -974,7 +982,10 @@ namespace Emby.Server.Implementations.Channels var internalResult = await GetChannelItemsInternal(query, new Progress<double>(), cancellationToken).ConfigureAwait(false); - var dtoOptions = new DtoOptions(); + var dtoOptions = new DtoOptions() + { + Fields = query.Fields.ToList() + }; var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) .ToArray(); @@ -1378,12 +1389,6 @@ namespace Emby.Server.Implementations.Channels item.SetImagePath(ImageType.Primary, info.ImageUrl); } - if (item.SourceType != SourceType.Channel) - { - item.SourceType = SourceType.Channel; - forceUpdate = true; - } - if (isNew) { await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 49ba6c9f3c..df3cecbf9d 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -199,10 +199,11 @@ namespace Emby.Server.Implementations.Data AddColumn(db, "TypedBaseItems", "ParentId", "GUID", existingColumnNames); AddColumn(db, "TypedBaseItems", "Genres", "Text", existingColumnNames); AddColumn(db, "TypedBaseItems", "SortName", "Text", existingColumnNames); + AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames); + AddColumn(db, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames); AddColumn(db, "TypedBaseItems", "HomePageUrl", "Text", existingColumnNames); - AddColumn(db, "TypedBaseItems", "VoteCount", "INT", existingColumnNames); AddColumn(db, "TypedBaseItems", "DisplayMediaType", "Text", existingColumnNames); AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames); AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames); @@ -233,7 +234,6 @@ namespace Emby.Server.Implementations.Data AddColumn(db, "TypedBaseItems", "UnratedType", "Text", existingColumnNames); AddColumn(db, "TypedBaseItems", "TopParentId", "Text", existingColumnNames); AddColumn(db, "TypedBaseItems", "IsItemByName", "BIT", existingColumnNames); - AddColumn(db, "TypedBaseItems", "SourceType", "Text", existingColumnNames); AddColumn(db, "TypedBaseItems", "TrailerTypes", "Text", existingColumnNames); AddColumn(db, "TypedBaseItems", "CriticRating", "Float", existingColumnNames); AddColumn(db, "TypedBaseItems", "InheritedTags", "Text", existingColumnNames); @@ -424,9 +424,8 @@ namespace Emby.Server.Implementations.Data "OfficialRating", "HomePageUrl", "DisplayMediaType", - "SortName", + "ForcedSortName", "RunTimeTicks", - "VoteCount", "DateCreated", "DateModified", "guid", @@ -439,7 +438,6 @@ namespace Emby.Server.Implementations.Data "LockedFields", "Studios", "Tags", - "SourceType", "TrailerTypes", "OriginalTitle", "PrimaryVersionId", @@ -541,9 +539,9 @@ namespace Emby.Server.Implementations.Data "Genres", "InheritedParentalRatingValue", "SortName", + "ForcedSortName", "RunTimeTicks", "HomePageUrl", - "VoteCount", "DisplayMediaType", "DateCreated", "DateModified", @@ -563,7 +561,6 @@ namespace Emby.Server.Implementations.Data "UnratedType", "TopParentId", "IsItemByName", - "SourceType", "TrailerTypes", "CriticRating", "InheritedTags", @@ -815,10 +812,12 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBind("@InheritedParentalRatingValue", item.InheritedParentalRatingValue); saveItemStatement.TryBind("@SortName", item.SortName); + + saveItemStatement.TryBind("@ForcedSortName", item.ForcedSortName); + saveItemStatement.TryBind("@RunTimeTicks", item.RunTimeTicks); saveItemStatement.TryBind("@HomePageUrl", item.HomePageUrl); - saveItemStatement.TryBind("@VoteCount", item.VoteCount); saveItemStatement.TryBind("@DisplayMediaType", item.DisplayMediaType); saveItemStatement.TryBind("@DateCreated", item.DateCreated); saveItemStatement.TryBind("@DateModified", item.DateModified); @@ -909,7 +908,6 @@ namespace Emby.Server.Implementations.Data isByName = dualAccess == null || dualAccess.IsAccessedByName; } saveItemStatement.TryBind("@IsItemByName", isByName); - saveItemStatement.TryBind("@SourceType", item.SourceType.ToString()); var trailer = item as Trailer; if (trailer != null && trailer.TrailerTypes.Count > 0) @@ -1624,7 +1622,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.SortName = reader.GetString(index); + item.ForcedSortName = reader.GetString(index); } index++; } @@ -1635,15 +1633,6 @@ namespace Emby.Server.Implementations.Data } index++; - if (HasField(query, ItemFields.VoteCount)) - { - if (!reader.IsDBNull(index)) - { - item.VoteCount = reader.GetInt32(index); - } - index++; - } - if (HasField(query, ItemFields.DateCreated)) { if (!reader.IsDBNull(index)) @@ -1733,12 +1722,6 @@ namespace Emby.Server.Implementations.Data index++; } - if (!reader.IsDBNull(index)) - { - item.SourceType = (SourceType)Enum.Parse(typeof(SourceType), reader.GetString(index), true); - } - index++; - if (hasTrailerTypes) { var trailer = item as Trailer; @@ -2283,7 +2266,7 @@ namespace Emby.Server.Implementations.Data } if (field == ItemFields.SortName) { - return new[] { "SortName" }; + return new[] { "ForcedSortName" }; } if (field == ItemFields.Taglines) { @@ -2306,7 +2289,6 @@ namespace Emby.Server.Implementations.Data case ItemFields.HomePageUrl: case ItemFields.Keywords: case ItemFields.DisplayMediaType: - case ItemFields.VoteCount: case ItemFields.CustomRating: case ItemFields.ProductionLocations: case ItemFields.Settings: @@ -3872,34 +3854,6 @@ namespace Emby.Server.Implementations.Data } } - if (query.SourceTypes.Length == 1) - { - whereClauses.Add("SourceType=@SourceType"); - if (statement != null) - { - statement.TryBind("@SourceType", query.SourceTypes[0].ToString()); - } - } - else if (query.SourceTypes.Length > 1) - { - var inClause = string.Join(",", query.SourceTypes.Select(i => "'" + i + "'").ToArray()); - whereClauses.Add(string.Format("SourceType in ({0})", inClause)); - } - - if (query.ExcludeSourceTypes.Length == 1) - { - whereClauses.Add("SourceType<>@ExcludeSourceTypes"); - if (statement != null) - { - statement.TryBind("@ExcludeSourceTypes", query.ExcludeSourceTypes[0].ToString()); - } - } - else if (query.ExcludeSourceTypes.Length > 1) - { - var inClause = string.Join(",", query.ExcludeSourceTypes.Select(i => "'" + i + "'").ToArray()); - whereClauses.Add(string.Format("SourceType not in ({0})", inClause)); - } - if (query.TrailerTypes.Length > 0) { var clauses = new List<string>(); @@ -5017,14 +4971,6 @@ namespace Emby.Server.Implementations.Data statement.TryBind("@NameContains", "%" + query.NameContains + "%"); } } - if (query.SourceTypes.Length == 1) - { - whereClauses.Add("(select sourcetype from typedbaseitems where guid=ItemId) = @SourceTypes"); - if (statement != null) - { - statement.TryBind("@SourceTypes", query.SourceTypes[0].ToString()); - } - } return whereClauses; } diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index 45fbd69dc6..6bf58455f9 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -1058,11 +1058,6 @@ namespace Emby.Server.Implementations.Dto dto.CommunityRating = item.CommunityRating; } - if (fields.Contains(ItemFields.VoteCount)) - { - dto.VoteCount = item.VoteCount; - } - //if (item.IsFolder) //{ // var folder = (Folder)item; @@ -1084,7 +1079,10 @@ namespace Emby.Server.Implementations.Dto if (audio != null) { dto.Album = audio.Album; - dto.ExtraType = audio.ExtraType; + if (audio.ExtraType.HasValue) + { + dto.ExtraType = audio.ExtraType.Value.ToString(); + } var albumParent = audio.AlbumEntity; @@ -1239,7 +1237,10 @@ namespace Emby.Server.Implementations.Dto dto.Chapters = GetChapterInfoDtos(item); } - dto.ExtraType = video.ExtraType; + if (video.ExtraType.HasValue) + { + dto.ExtraType = video.ExtraType.Value.ToString(); + } } if (fields.Contains(ItemFields.MediaStreams)) @@ -1395,7 +1396,7 @@ namespace Emby.Server.Implementations.Dto } } - if (fields.Contains(ItemFields.SeriesPrimaryImage)) + //if (fields.Contains(ItemFields.SeriesPrimaryImage)) { series = series ?? season.Series; if (series != null) @@ -1586,7 +1587,7 @@ namespace Emby.Server.Implementations.Dto { var imageInfo = item.GetImageInfo(ImageType.Primary, 0); - if (imageInfo == null || !imageInfo.IsLocalFile) + if (imageInfo == null) { return null; } @@ -1610,6 +1611,11 @@ namespace Emby.Server.Implementations.Dto } else { + if (!imageInfo.IsLocalFile) + { + return null; + } + try { size = _imageProcessor.GetImageSize(imageInfo); diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index 14d9763252..df70680f15 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -31,6 +31,9 @@ <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> + <Compile Include="..\SharedVersion.cs"> + <Link>Properties\SharedVersion.cs</Link> + </Compile> <Compile Include="Activity\ActivityLogEntryPoint.cs" /> <Compile Include="Activity\ActivityManager.cs" /> <Compile Include="Activity\ActivityRepository.cs" /> diff --git a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs index 54f9ca3920..961f9886c1 100644 --- a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs +++ b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs @@ -38,7 +38,10 @@ namespace Emby.Server.Implementations.Library // Synology "@eaDir", "eaDir", - "#recycle" + "#recycle", + + // Qnap + "@Recycle" }; diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 42eda00b7c..a08c744748 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1292,7 +1292,7 @@ namespace Emby.Server.Implementations.Library return item; } - public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query) + public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, bool allowExternalContent) { if (query.Recursive && query.ParentId.HasValue) { @@ -1305,12 +1305,17 @@ namespace Emby.Server.Implementations.Library if (query.User != null) { - AddUserToQuery(query, query.User); + AddUserToQuery(query, query.User, allowExternalContent); } return ItemRepository.GetItemList(query); } + public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query) + { + return GetItemList(query, true); + } + public int GetCount(InternalItemsQuery query) { if (query.Recursive && query.ParentId.HasValue) @@ -1548,7 +1553,7 @@ namespace Emby.Server.Implementations.Library query.Parent = null; } - private void AddUserToQuery(InternalItemsQuery query, User user) + private void AddUserToQuery(InternalItemsQuery query, User user, bool allowExternalContent = true) { if (query.AncestorIds.Length == 0 && !query.ParentId.HasValue && @@ -1561,7 +1566,8 @@ namespace Emby.Server.Implementations.Library var userViews = _userviewManager().GetUserViews(new UserViewQuery { UserId = user.Id.ToString("N"), - IncludeHidden = true + IncludeHidden = true, + IncludeExternalContent = allowExternalContent }, CancellationToken.None).Result.ToList(); diff --git a/Emby.Server.Implementations/Library/UserManager.cs b/Emby.Server.Implementations/Library/UserManager.cs index 0b90272915..8e8f8c4dc3 100644 --- a/Emby.Server.Implementations/Library/UserManager.cs +++ b/Emby.Server.Implementations/Library/UserManager.cs @@ -202,8 +202,7 @@ namespace Emby.Server.Implementations.Library private bool IsValidUsernameCharacter(char i) { - return char.IsLetterOrDigit(i) || char.Equals(i, '-') || char.Equals(i, '_') || char.Equals(i, '\'') || - char.Equals(i, '.'); + return !char.Equals(i, '<') && !char.Equals(i, '>'); } public string MakeValidUsername(string username) diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index f403ca266f..a6ed84f29f 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -280,7 +280,7 @@ namespace Emby.Server.Implementations.Library } : new string[] { }; - return _libraryManager.GetItemList(new InternalItemsQuery(user) + var query = new InternalItemsQuery(user) { IncludeItemTypes = includeItemTypes, SortOrder = SortOrder.Descending, @@ -289,11 +289,16 @@ namespace Emby.Server.Implementations.Library ExcludeItemTypes = excludeItemTypes, IsVirtualItem = false, Limit = limit * 5, - SourceTypes = parents.Count == 0 ? new[] { SourceType.Library } : new SourceType[] { }, IsPlayed = isPlayed, DtoOptions = options + }; - }, parents); + if (parents.Count == 0) + { + return _libraryManager.GetItemList(query, false); + } + + return _libraryManager.GetItemList(query, parents); } } } diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index 6ce2b88f12..a4c5b338e2 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -2270,11 +2270,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV writer.WriteElementString("studio", studio); } - if (item.VoteCount.HasValue) - { - writer.WriteElementString("votes", item.VoteCount.Value.ToString(CultureInfo.InvariantCulture)); - } - writer.WriteEndElement(); writer.WriteEndDocument(); } diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index da6759b34d..bba625cd12 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -136,6 +136,9 @@ namespace Emby.Server.Implementations.LiveTv.Listings var requestBody = "[\"" + string.Join("\", \"", programsID) + "\"]"; httpOptions.RequestContent = requestBody; + double wideAspect = 1.77777778; + var primaryImageCategory = "Logo"; + using (var innerResponse = await Post(httpOptions, true, info).ConfigureAwait(false)) { StreamReader innerReader = new StreamReader(innerResponse.Content); @@ -167,13 +170,25 @@ namespace Emby.Server.Implementations.LiveTv.Listings { var programEntry = programDict[schedule.programID]; - var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).OrderByDescending(GetSizeOrder).ToList(); + var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).ToList(); var imagesWithText = allImages.Where(i => string.Equals(i.text, "yes", StringComparison.OrdinalIgnoreCase)).ToList(); + var imagesWithoutText = allImages.Where(i => string.Equals(i.text, "no", StringComparison.OrdinalIgnoreCase)).ToList(); + + double desiredAspect = IsMovie(programEntry) ? 0.666666667 : wideAspect; + + programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, true, desiredAspect) ?? + GetProgramImage(ApiUrl, allImages, true, desiredAspect); + + programEntry.thumbImage = GetProgramImage(ApiUrl, imagesWithText, true, wideAspect); + + // Don't supply the same image twice + if (string.Equals(programEntry.primaryImage, programEntry.thumbImage, StringComparison.Ordinal)) + { + programEntry.thumbImage = null; + } - programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, "Logo", true, 600) ?? - GetProgramImage(ApiUrl, allImages, "Logo", true, 600); + programEntry.backdropImage = GetProgramImage(ApiUrl, imagesWithoutText, true, wideAspect); - //programEntry.thumbImage = GetProgramImage(ApiUrl, data, "Iconic", false); //programEntry.bannerImage = GetProgramImage(ApiUrl, data, "Banner", false) ?? // GetProgramImage(ApiUrl, data, "Banner-L1", false) ?? // GetProgramImage(ApiUrl, data, "Banner-LO", false) ?? @@ -220,9 +235,14 @@ namespace Emby.Server.Implementations.LiveTv.Listings return channelNumber; } + private bool IsMovie(ScheduleDirect.ProgramDetails programInfo) + { + var showType = programInfo.showType ?? string.Empty; + return showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1; + } + private ProgramInfo GetProgram(string channelId, ScheduleDirect.Program programInfo, ScheduleDirect.ProgramDetails details) { - //_logger.Debug("Show type is: " + (details.showType ?? "No ShowType")); DateTime startAt = GetDate(programInfo.airDateTime); DateTime endAt = startAt.AddSeconds(programInfo.duration); ProgramAudio audioType = ProgramAudio.Stereo; @@ -276,9 +296,10 @@ namespace Emby.Server.Implementations.LiveTv.Listings IsRepeat = repeat, IsSeries = showType.IndexOf("series", StringComparison.OrdinalIgnoreCase) != -1, ImageUrl = details.primaryImage, + ThumbImageUrl = details.thumbImage, IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase), IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1, - IsMovie = showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1, + IsMovie = IsMovie(details), Etag = programInfo.md5 }; @@ -378,49 +399,18 @@ namespace Emby.Server.Implementations.LiveTv.Listings return date; } - private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, string category, bool returnDefaultImage, int desiredWidth) + private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, bool returnDefaultImage, double desiredAspect) { string url = null; - var matches = images - .Where(i => string.Equals(i.category, category, StringComparison.OrdinalIgnoreCase)) - .ToList(); - - if (matches.Count == 0) - { - if (!returnDefaultImage) - { - return null; - } - matches = images; - } + var matches = images; - var match = matches.FirstOrDefault(i => - { - if (!string.IsNullOrWhiteSpace(i.width)) - { - int value; - if (int.TryParse(i.width, out value)) - { - return value <= desiredWidth; - } - } + matches = matches + .OrderBy(i => Math.Abs(desiredAspect - GetApsectRatio(i))) + .ThenByDescending(GetSizeOrder) + .ToList(); - return false; - }); - - if (match == null) - { - // Get the second lowest quality image, when possible - if (matches.Count > 1) - { - match = matches[matches.Count - 2]; - } - else - { - match = matches.FirstOrDefault(); - } - } + var match = matches.FirstOrDefault(); if (match == null) { @@ -444,6 +434,31 @@ namespace Emby.Server.Implementations.LiveTv.Listings return url; } + private double GetApsectRatio(ScheduleDirect.ImageData i) + { + int width = 0; + int height = 0; + + if (!string.IsNullOrWhiteSpace(i.width)) + { + int.TryParse(i.width, out width); + } + + if (!string.IsNullOrWhiteSpace(i.height)) + { + int.TryParse(i.height, out height); + } + + if (height == 0 || width == 0) + { + return 0; + } + + double result = width; + result /= height; + return result; + } + private async Task<List<ScheduleDirect.ShowImages>> GetImageForPrograms( ListingsProviderInfo info, List<string> programIds, @@ -1188,6 +1203,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings public bool hasImageArtwork { get; set; } public string primaryImage { get; set; } public string thumbImage { get; set; } + public string backdropImage { get; set; } public string bannerImage { get; set; } public string imageID { get; set; } public string md5 { get; set; } diff --git a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs index d56ddc57dd..12da1464bc 100644 --- a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs +++ b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs @@ -16,7 +16,7 @@ namespace Emby.Server.Implementations.LiveTv private readonly IMediaEncoder _mediaEncoder; private readonly ILogger _logger; - const int AnalyzeDurationMs = 2000; + const int AnalyzeDurationMs = 1000; public LiveStreamHelper(IMediaEncoder mediaEncoder, ILogger logger) { diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index c2f0575604..4ad411c19b 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -679,8 +679,7 @@ namespace Emby.Server.Implementations.LiveTv item.SetImage(new ItemImageInfo { Path = info.ImagePath, - Type = ImageType.Primary, - IsPlaceholder = true + Type = ImageType.Primary }, 0); } else if (!string.IsNullOrWhiteSpace(info.ImageUrl)) @@ -688,8 +687,46 @@ namespace Emby.Server.Implementations.LiveTv item.SetImage(new ItemImageInfo { Path = info.ImageUrl, - Type = ImageType.Primary, - IsPlaceholder = true + Type = ImageType.Primary + }, 0); + } + } + + if (!item.HasImage(ImageType.Thumb)) + { + if (!string.IsNullOrWhiteSpace(info.ThumbImageUrl)) + { + item.SetImage(new ItemImageInfo + { + Path = info.ThumbImageUrl, + Type = ImageType.Thumb + + }, 0); + } + } + + if (!item.HasImage(ImageType.Logo)) + { + if (!string.IsNullOrWhiteSpace(info.LogoImageUrl)) + { + item.SetImage(new ItemImageInfo + { + Path = info.LogoImageUrl, + Type = ImageType.Logo + + }, 0); + } + } + + if (!item.HasImage(ImageType.Backdrop)) + { + if (!string.IsNullOrWhiteSpace(info.BackdropImageUrl)) + { + item.SetImage(new ItemImageInfo + { + Path = info.BackdropImageUrl, + Type = ImageType.Backdrop + }, 0); } } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index 2afc3744f4..153f86aed4 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -422,6 +422,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun SupportsTranscoding = true, IsInfiniteStream = true, IgnoreDts = true, + //SupportsProbing = false, + //AnalyzeDurationMs = 2000000 //IgnoreIndex = true, //ReadAtNativeFramerate = true }; diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs index 90bbaaf3dd..d2e9c8bf02 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs @@ -117,7 +117,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun } else { - await _multicastStream.CopyUntilCancelled(response.Content, () => Resolve(openTaskCompletionSource), cancellationToken).ConfigureAwait(false); + Resolve(openTaskCompletionSource); + + await _multicastStream.CopyUntilCancelled(response.Content, null, cancellationToken).ConfigureAwait(false); } } } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs index 4c1190e0ee..8d73c7e2bb 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs @@ -235,10 +235,18 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts } else { - numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last()); + try + { + numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last()); - if (!IsValidChannelNumber(numberString)) + if (!IsValidChannelNumber(numberString)) + { + numberString = null; + } + } + catch { + // Seeing occasional argument exception here numberString = null; } } diff --git a/Emby.Server.Implementations/Notifications/Notifications.cs b/Emby.Server.Implementations/Notifications/Notifications.cs index 8f24dfe1a3..f95b3f701a 100644 --- a/Emby.Server.Implementations/Notifications/Notifications.cs +++ b/Emby.Server.Implementations/Notifications/Notifications.cs @@ -23,6 +23,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Threading; +using MediaBrowser.Model.Dto; namespace Emby.Server.Implementations.Notifications { @@ -260,7 +261,7 @@ namespace Emby.Server.Implementations.Notifications var item = e.MediaInfo; - if ( item.IsThemeMedia) + if (e.Item != null && e.Item.IsThemeMedia) { // Don't report theme song or local trailer playback return; @@ -430,7 +431,7 @@ namespace Emby.Server.Implementations.Notifications return name; } - public static string GetItemName(BaseItemInfo item) + public static string GetItemName(BaseItemDto item) { var name = item.Name; diff --git a/Emby.Server.Implementations/Properties/AssemblyInfo.cs b/Emby.Server.Implementations/Properties/AssemblyInfo.cs index ed7f9631fa..28ffcbac64 100644 --- a/Emby.Server.Implementations/Properties/AssemblyInfo.cs +++ b/Emby.Server.Implementations/Properties/AssemblyInfo.cs @@ -25,6 +25,4 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +// [assembly: AssemblyVersion("1.0.*")]
\ No newline at end of file diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index 42cd5d1b1e..a5582ddc55 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -338,7 +338,7 @@ namespace Emby.Server.Implementations.Session } } - info.Item = GetItemInfo(libraryItem, libraryItem, mediaSource); + info.Item = GetItemInfo(libraryItem, mediaSource); info.Item.RunTimeTicks = runtimeTicks; } @@ -813,7 +813,7 @@ namespace Emby.Server.Implementations.Session mediaSource = await GetMediaSource(hasMediaSources, info.MediaSourceId, info.LiveStreamId).ConfigureAwait(false); } - info.Item = GetItemInfo(libraryItem, libraryItem, mediaSource); + info.Item = GetItemInfo(libraryItem, mediaSource); } else { @@ -1637,165 +1637,65 @@ namespace Emby.Server.Implementations.Session return dto; } + private DtoOptions _itemInfoDtoOptions; + /// <summary> /// Converts a BaseItem to a BaseItemInfo /// </summary> - /// <param name="item">The item.</param> - /// <param name="chapterOwner">The chapter owner.</param> - /// <param name="mediaSource">The media source.</param> - /// <returns>BaseItemInfo.</returns> - /// <exception cref="System.ArgumentNullException">item</exception> - private BaseItemInfo GetItemInfo(BaseItem item, BaseItem chapterOwner, MediaSourceInfo mediaSource) + private BaseItemDto GetItemInfo(BaseItem item, MediaSourceInfo mediaSource) { if (item == null) { throw new ArgumentNullException("item"); } - var info = new BaseItemInfo - { - Id = GetDtoId(item), - Name = item.Name, - MediaType = item.MediaType, - Type = item.GetClientTypeName(), - RunTimeTicks = item.RunTimeTicks, - IndexNumber = item.IndexNumber, - ParentIndexNumber = item.ParentIndexNumber, - PremiereDate = item.PremiereDate, - ProductionYear = item.ProductionYear, - IsThemeMedia = item.IsThemeMedia - }; - - info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary); - if (info.PrimaryImageTag != null) - { - info.PrimaryImageItemId = GetDtoId(item); - } - - var episode = item as Episode; - if (episode != null) - { - info.IndexNumberEnd = episode.IndexNumberEnd; - } - - var hasSeries = item as IHasSeries; - if (hasSeries != null) - { - info.SeriesName = hasSeries.SeriesName; - } - - var recording = item as ILiveTvRecording; - if (recording != null) - { - if (recording.IsSeries) - { - info.Name = recording.EpisodeTitle; - info.SeriesName = recording.Name; - - if (string.IsNullOrWhiteSpace(info.Name)) - { - info.Name = recording.Name; - } - } - } - - var audio = item as Audio; - if (audio != null) - { - info.Album = audio.Album; - info.Artists = audio.Artists; - - if (info.PrimaryImageTag == null) - { - var album = audio.AlbumEntity; - - if (album != null && album.HasImage(ImageType.Primary)) - { - info.PrimaryImageTag = GetImageCacheTag(album, ImageType.Primary); - if (info.PrimaryImageTag != null) - { - info.PrimaryImageItemId = GetDtoId(album); - } - } - } - } - - var musicVideo = item as MusicVideo; - if (musicVideo != null) - { - info.Album = musicVideo.Album; - info.Artists = musicVideo.Artists.ToList(); - } - - var backropItem = item.HasImage(ImageType.Backdrop) ? item : null; - var thumbItem = item.HasImage(ImageType.Thumb) ? item : null; - var logoItem = item.HasImage(ImageType.Logo) ? item : null; - - if (thumbItem == null) - { - if (episode != null) - { - var series = episode.Series; - - if (series != null && series.HasImage(ImageType.Thumb)) - { - thumbItem = series; - } - } - } + var dtoOptions = _itemInfoDtoOptions; - if (backropItem == null) + if (_itemInfoDtoOptions == null) { - if (episode != null) + dtoOptions = new DtoOptions { - var series = episode.Series; - - if (series != null && series.HasImage(ImageType.Backdrop)) - { - backropItem = series; - } - } - } - - if (backropItem == null) - { - backropItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Backdrop)); - } - - if (thumbItem == null) - { - thumbItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Thumb)); - } - - if (logoItem == null) - { - logoItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Logo)); - } - - if (thumbItem != null) - { - info.ThumbImageTag = GetImageCacheTag(thumbItem, ImageType.Thumb); - info.ThumbItemId = GetDtoId(thumbItem); - } - - if (backropItem != null) - { - info.BackdropImageTag = GetImageCacheTag(backropItem, ImageType.Backdrop); - info.BackdropItemId = GetDtoId(backropItem); - } - - if (logoItem != null) - { - info.LogoImageTag = GetImageCacheTag(logoItem, ImageType.Logo); - info.LogoItemId = GetDtoId(logoItem); - } - - if (chapterOwner != null) - { - info.ChapterImagesItemId = chapterOwner.Id.ToString("N"); - - info.Chapters = _dtoService.GetChapterInfoDtos(chapterOwner).ToList(); - } + AddProgramRecordingInfo = false + }; + + dtoOptions.Fields.Remove(ItemFields.BasicSyncInfo); + dtoOptions.Fields.Remove(ItemFields.SyncInfo); + dtoOptions.Fields.Remove(ItemFields.CanDelete); + dtoOptions.Fields.Remove(ItemFields.CanDownload); + dtoOptions.Fields.Remove(ItemFields.ChildCount); + dtoOptions.Fields.Remove(ItemFields.CustomRating); + dtoOptions.Fields.Remove(ItemFields.DateLastMediaAdded); + dtoOptions.Fields.Remove(ItemFields.DateLastRefreshed); + dtoOptions.Fields.Remove(ItemFields.DateLastSaved); + dtoOptions.Fields.Remove(ItemFields.DisplayMediaType); + dtoOptions.Fields.Remove(ItemFields.DisplayPreferencesId); + dtoOptions.Fields.Remove(ItemFields.Etag); + dtoOptions.Fields.Remove(ItemFields.ExternalEtag); + dtoOptions.Fields.Remove(ItemFields.IndexOptions); + dtoOptions.Fields.Remove(ItemFields.InheritedParentalRatingValue); + dtoOptions.Fields.Remove(ItemFields.ItemCounts); + dtoOptions.Fields.Remove(ItemFields.Keywords); + dtoOptions.Fields.Remove(ItemFields.MediaSourceCount); + dtoOptions.Fields.Remove(ItemFields.MediaStreams); + dtoOptions.Fields.Remove(ItemFields.MediaSources); + dtoOptions.Fields.Remove(ItemFields.People); + dtoOptions.Fields.Remove(ItemFields.PlayAccess); + dtoOptions.Fields.Remove(ItemFields.People); + dtoOptions.Fields.Remove(ItemFields.ProductionLocations); + dtoOptions.Fields.Remove(ItemFields.RecursiveItemCount); + dtoOptions.Fields.Remove(ItemFields.RemoteTrailers); + dtoOptions.Fields.Remove(ItemFields.SeasonUserData); + dtoOptions.Fields.Remove(ItemFields.SeriesGenres); + dtoOptions.Fields.Remove(ItemFields.Settings); + dtoOptions.Fields.Remove(ItemFields.SortName); + dtoOptions.Fields.Remove(ItemFields.Tags); + dtoOptions.Fields.Remove(ItemFields.ThemeSongIds); + dtoOptions.Fields.Remove(ItemFields.ThemeVideoIds); + + _itemInfoDtoOptions = dtoOptions; + } + + var info = _dtoService.GetBaseItemDto(item, dtoOptions); if (mediaSource != null) { @@ -1837,7 +1737,7 @@ namespace Emby.Server.Implementations.Session //ReportNowViewingItem(sessionId, info); } - public void ReportNowViewingItem(string sessionId, BaseItemInfo item) + public void ReportNowViewingItem(string sessionId, BaseItemDto item) { //var session = GetSession(sessionId); |
