aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2017-06-11 18:05:07 -0400
committerGitHub <noreply@github.com>2017-06-11 18:05:07 -0400
commite0c907cc6009408157d42531afab4c089c2e2871 (patch)
tree069efdd6b11b3dd81e7bc6c191497114374f0577 /Emby.Server.Implementations
parent9ee58d399cde4ccec9ea10c60c1a508a353b7836 (diff)
parente9d2fb13e06a93336b6b16d03b66d3390a762c40 (diff)
Merge pull request #2702 from MediaBrowser/beta
Beta
Diffstat (limited to 'Emby.Server.Implementations')
-rw-r--r--Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs4
-rw-r--r--Emby.Server.Implementations/Channels/ChannelManager.cs25
-rw-r--r--Emby.Server.Implementations/Data/SqliteItemRepository.cs72
-rw-r--r--Emby.Server.Implementations/Dto/DtoService.cs24
-rw-r--r--Emby.Server.Implementations/Emby.Server.Implementations.csproj3
-rw-r--r--Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs5
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs14
-rw-r--r--Emby.Server.Implementations/Library/UserManager.cs3
-rw-r--r--Emby.Server.Implementations/Library/UserViewManager.cs11
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs5
-rw-r--r--Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs104
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvManager.cs45
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs4
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs12
-rw-r--r--Emby.Server.Implementations/Notifications/Notifications.cs5
-rw-r--r--Emby.Server.Implementations/Properties/AssemblyInfo.cs4
-rw-r--r--Emby.Server.Implementations/Session/SessionManager.cs200
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);