aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/StartupWizardService.cs2
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs23
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs10
-rw-r--r--MediaBrowser.Providers/TV/MissingEpisodeProvider.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs220
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs8
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs8
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs15
-rw-r--r--MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs5
-rw-r--r--MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs5
11 files changed, 135 insertions, 166 deletions
diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs
index 7cdc3b6a2..8f4a62ced 100644
--- a/MediaBrowser.Api/StartupWizardService.cs
+++ b/MediaBrowser.Api/StartupWizardService.cs
@@ -117,7 +117,7 @@ namespace MediaBrowser.Api
config.EnableStandaloneMusicKeys = true;
config.EnableCaseSensitiveItemIds = true;
//config.EnableFolderView = true;
- config.SchemaVersion = 99;
+ config.SchemaVersion = 100;
}
public void Post(UpdateStartupConfiguration request)
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index d7526a535..4ff1813ff 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -13,7 +13,6 @@ namespace MediaBrowser.Controller.Entities.TV
/// </summary>
public class Episode : Video, IHasTrailers, IHasLookupInfo<EpisodeInfo>, IHasSeries
{
-
public Episode()
{
RemoteTrailers = new List<MediaUrl>();
@@ -181,6 +180,12 @@ namespace MediaBrowser.Controller.Entities.TV
{
var series = Series;
return series == null ? SeriesName : series.Name;
+ }
+
+ public Guid? FindSeasonId()
+ {
+ var season = Season;
+ return season == null ? (Guid?)null : season.Id;
}
/// <summary>
@@ -243,21 +248,7 @@ namespace MediaBrowser.Controller.Entities.TV
}
[IgnoreDataMember]
- public Guid? SeasonId
- {
- get
- {
- // First see if the parent is a Season
- var season = Season;
-
- if (season != null)
- {
- return season.Id;
- }
-
- return null;
- }
- }
+ public Guid? SeasonId { get; set; }
public override IEnumerable<Guid> GetAncestorIds()
{
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index 146fcc74e..ac7d97288 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -955,6 +955,16 @@ namespace MediaBrowser.Model.Dto
}
/// <summary>
+ /// Gets a value indicating whether this instance has thumb.
+ /// </summary>
+ /// <value><c>true</c> if this instance has thumb; otherwise, <c>false</c>.</value>
+ [IgnoreDataMember]
+ public bool HasBackdrop
+ {
+ get { return (BackdropImageTags != null && BackdropImageTags.Count > 0) || (ParentBackdropImageTags != null && ParentBackdropImageTags.Count > 0); }
+ }
+
+ /// <summary>
/// Gets a value indicating whether this instance has primary image.
/// </summary>
/// <value><c>true</c> if this instance has primary image; otherwise, <c>false</c>.</value>
diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
index 4e2d9a8d2..e8a0057fe 100644
--- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
@@ -429,7 +429,8 @@ namespace MediaBrowser.Providers.TV
IndexNumber = episodeNumber,
ParentIndexNumber = seasonNumber,
Id = _libraryManager.GetNewItemId((series.Id + seasonNumber.ToString(_usCulture) + name), typeof(Episode)),
- IsVirtualItem = true
+ IsVirtualItem = true,
+ SeasonId = season == null ? (Guid?)null : season.Id
};
episode.SetParent(season);
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 67ae24f3e..257448941 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -663,19 +663,12 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.GameSystem = item.GameSystemName;
}
- private List<string> GetBackdropImageTags(BaseItem item, int limit)
+ private List<string> GetImageTags(BaseItem item, List<ItemImageInfo> images)
{
- return GetCacheTags(item, ImageType.Backdrop, limit).ToList();
- }
-
- private List<string> GetScreenshotImageTags(BaseItem item, int limit)
- {
- var hasScreenshots = item as IHasScreenshots;
- if (hasScreenshots == null)
- {
- return new List<string>();
- }
- return GetCacheTags(item, ImageType.Screenshot, limit).ToList();
+ return images
+ .Select(p => GetImageCacheTag(item, p))
+ .Where(i => i != null)
+ .ToList();
}
private IEnumerable<string> GetCacheTags(BaseItem item, ImageType type, int limit)
@@ -851,53 +844,6 @@ namespace MediaBrowser.Server.Implementations.Dto
}
/// <summary>
- /// If an item does not any backdrops, this can be used to find the first parent that does have one
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="owner">The owner.</param>
- /// <returns>BaseItem.</returns>
- private BaseItem GetParentBackdropItem(BaseItem item, BaseItem owner)
- {
- var parent = item.GetParent() ?? owner;
-
- while (parent != null)
- {
- if (parent.GetImages(ImageType.Backdrop).Any())
- {
- return parent;
- }
-
- parent = parent.GetParent();
- }
-
- return null;
- }
-
- /// <summary>
- /// If an item does not have a logo, this can be used to find the first parent that does have one
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="type">The type.</param>
- /// <param name="owner">The owner.</param>
- /// <returns>BaseItem.</returns>
- private BaseItem GetParentImageItem(BaseItem item, ImageType type, BaseItem owner)
- {
- var parent = item.GetParent() ?? owner;
-
- while (parent != null)
- {
- if (parent.HasImage(type))
- {
- return parent;
- }
-
- parent = parent.GetParent();
- }
-
- return null;
- }
-
- /// <summary>
/// Gets the chapter info dto.
/// </summary>
/// <param name="chapterInfo">The chapter info.</param>
@@ -1027,7 +973,7 @@ namespace MediaBrowser.Server.Implementations.Dto
var backdropLimit = options.GetImageLimit(ImageType.Backdrop);
if (backdropLimit > 0)
{
- dto.BackdropImageTags = GetBackdropImageTags(item, backdropLimit);
+ dto.BackdropImageTags = GetImageTags(item, item.GetImages(ImageType.Backdrop).Take(backdropLimit).ToList());
}
if (fields.Contains(ItemFields.ScreenshotImageTags))
@@ -1035,7 +981,7 @@ namespace MediaBrowser.Server.Implementations.Dto
var screenshotLimit = options.GetImageLimit(ImageType.Screenshot);
if (screenshotLimit > 0)
{
- dto.ScreenshotImageTags = GetScreenshotImageTags(item, screenshotLimit);
+ dto.BackdropImageTags = GetImageTags(item, item.GetImages(ImageType.Screenshot).Take(screenshotLimit).ToList());
}
}
@@ -1064,6 +1010,7 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.Id = GetDtoId(item);
dto.IndexNumber = item.IndexNumber;
+ dto.ParentIndexNumber = item.ParentIndexNumber;
dto.IsFolder = item.IsFolder;
dto.MediaType = item.MediaType;
dto.LocationType = item.LocationType;
@@ -1126,18 +1073,6 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.ShortOverview = item.ShortOverview;
}
- // If there are no backdrops, indicate what parent has them in case the Ui wants to allow inheritance
- if (backdropLimit > 0 && dto.BackdropImageTags.Count == 0)
- {
- var parentWithBackdrop = GetParentBackdropItem(item, owner);
-
- if (parentWithBackdrop != null)
- {
- dto.ParentBackdropItemId = GetDtoId(parentWithBackdrop);
- dto.ParentBackdropImageTags = GetBackdropImageTags(parentWithBackdrop, backdropLimit);
- }
- }
-
if (fields.Contains(ItemFields.ParentId))
{
var displayParentId = item.DisplayParentId;
@@ -1147,46 +1082,7 @@ namespace MediaBrowser.Server.Implementations.Dto
}
}
- dto.ParentIndexNumber = item.ParentIndexNumber;
-
- // If there is no logo, indicate what parent has one in case the Ui wants to allow inheritance
- if (!dto.HasLogo && options.GetImageLimit(ImageType.Logo) > 0)
- {
- var parentWithLogo = GetParentImageItem(item, ImageType.Logo, owner);
-
- if (parentWithLogo != null)
- {
- dto.ParentLogoItemId = GetDtoId(parentWithLogo);
-
- dto.ParentLogoImageTag = GetImageCacheTag(parentWithLogo, ImageType.Logo);
- }
- }
-
- // If there is no art, indicate what parent has one in case the Ui wants to allow inheritance
- if (!dto.HasArtImage && options.GetImageLimit(ImageType.Art) > 0)
- {
- var parentWithImage = GetParentImageItem(item, ImageType.Art, owner);
-
- if (parentWithImage != null)
- {
- dto.ParentArtItemId = GetDtoId(parentWithImage);
-
- dto.ParentArtImageTag = GetImageCacheTag(parentWithImage, ImageType.Art);
- }
- }
-
- // If there is no thumb, indicate what parent has one in case the Ui wants to allow inheritance
- if (!dto.HasThumb && options.GetImageLimit(ImageType.Thumb) > 0)
- {
- var parentWithImage = GetParentImageItem(item, ImageType.Thumb, owner);
-
- if (parentWithImage != null)
- {
- dto.ParentThumbItemId = GetDtoId(parentWithImage);
-
- dto.ParentThumbImageTag = GetImageCacheTag(parentWithImage, ImageType.Thumb);
- }
- }
+ AddInheritedImages(dto, item, options, owner);
if (fields.Contains(ItemFields.Path))
{
@@ -1420,33 +1316,36 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.SeasonName = episode.SeasonName;
- var episodeSeries = episode.Series;
+ Series episodeSeries = null;
- if (episodeSeries != null)
+ if (fields.Contains(ItemFields.SeriesGenres))
{
- if (fields.Contains(ItemFields.SeriesGenres))
+ episodeSeries = episodeSeries ?? episode.Series;
+ if (episodeSeries != null)
{
dto.SeriesGenres = episodeSeries.Genres.ToList();
}
+ }
+ episodeSeries = episodeSeries ?? episode.Series;
+ if (episodeSeries != null)
+ {
dto.SeriesId = GetDtoId(episodeSeries);
+ }
- if (fields.Contains(ItemFields.AirTime))
- {
- dto.AirTime = episodeSeries.AirTime;
- }
-
- if (options.GetImageLimit(ImageType.Thumb) > 0)
- {
- dto.SeriesThumbImageTag = GetImageCacheTag(episodeSeries, ImageType.Thumb);
- }
-
- if (options.GetImageLimit(ImageType.Primary) > 0)
+ if (options.GetImageLimit(ImageType.Primary) > 0)
+ {
+ episodeSeries = episodeSeries ?? episode.Series;
+ if (episodeSeries != null)
{
dto.SeriesPrimaryImageTag = GetImageCacheTag(episodeSeries, ImageType.Primary);
}
+ }
- if (fields.Contains(ItemFields.SeriesStudio))
+ if (fields.Contains(ItemFields.SeriesStudio))
+ {
+ episodeSeries = episodeSeries ?? episode.Series;
+ if (episodeSeries != null)
{
dto.SeriesStudio = episodeSeries.Studios.FirstOrDefault();
}
@@ -1475,7 +1374,6 @@ namespace MediaBrowser.Server.Implementations.Dto
if (series != null)
{
dto.SeriesId = GetDtoId(series);
- dto.AirTime = series.AirTime;
if (fields.Contains(ItemFields.SeriesStudio))
{
@@ -1533,6 +1431,70 @@ namespace MediaBrowser.Server.Implementations.Dto
}
}
+ private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem owner)
+ {
+ var logoLimit = options.GetImageLimit(ImageType.Logo);
+ var artLimit = options.GetImageLimit(ImageType.Art);
+ var thumbLimit = options.GetImageLimit(ImageType.Thumb);
+ var backdropLimit = options.GetImageLimit(ImageType.Backdrop);
+
+ if (logoLimit == 0 && artLimit == 0 && thumbLimit == 0 && backdropLimit == 0)
+ {
+ return;
+ }
+
+ BaseItem parent = null;
+ var isFirst = true;
+
+ while (((!dto.HasLogo && logoLimit > 0) || (!dto.HasArtImage && artLimit > 0) || (!dto.HasThumb && thumbLimit > 0) || parent is Series) &&
+ (parent = parent ?? (isFirst ? item.GetParent() ?? owner : parent)) != null)
+ {
+ if (logoLimit > 0 && !dto.HasLogo && dto.ParentLogoItemId == null)
+ {
+ var image = parent.GetImageInfo(ImageType.Logo, 0);
+
+ if (image != null)
+ {
+ dto.ParentLogoItemId = GetDtoId(parent);
+ dto.ParentLogoImageTag = GetImageCacheTag(parent, image);
+ }
+ }
+ if (artLimit > 0 && !dto.HasArtImage && dto.ParentArtItemId == null)
+ {
+ var image = parent.GetImageInfo(ImageType.Art, 0);
+
+ if (image != null)
+ {
+ dto.ParentArtItemId = GetDtoId(parent);
+ dto.ParentArtImageTag = GetImageCacheTag(parent, image);
+ }
+ }
+ if (thumbLimit > 0 && !dto.HasThumb && (dto.ParentThumbItemId == null || parent is Series))
+ {
+ var image = parent.GetImageInfo(ImageType.Thumb, 0);
+
+ if (image != null)
+ {
+ dto.ParentThumbItemId = GetDtoId(parent);
+ dto.ParentThumbImageTag = GetImageCacheTag(parent, image);
+ }
+ }
+ if (backdropLimit > 0 && !dto.HasBackdrop)
+ {
+ var images = parent.GetImages(ImageType.Backdrop).Take(backdropLimit).ToList();
+
+ if (images.Count > 0)
+ {
+ dto.ParentBackdropItemId = GetDtoId(parent);
+ dto.ParentBackdropImageTags = GetImageTags(parent, images);
+ }
+ }
+
+ isFirst = false;
+ parent = parent.GetParent();
+ }
+ }
+
private string GetMappedPath(IHasMetadata item)
{
var path = item.Path;
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 9d66455e7..7458e7541 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -368,10 +368,10 @@ namespace MediaBrowser.Server.Implementations.Library
{
return;
}
- //if (!(item is Folder))
- //{
- // return;
- //}
+ if (!(item is Folder))
+ {
+ return;
+ }
LibraryItemsCache.AddOrUpdate(id, item, delegate { return item; });
}
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
index 14e5e446b..e279a978e 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
@@ -45,6 +45,14 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
{
var episode = ResolveVideo<Episode>(args, false);
+ if (episode != null)
+ {
+ if (season != null)
+ {
+ episode.SeasonId = season.Id;
+ }
+ }
+
return episode;
}
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index f32a4b59e..64af35a9a 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -1214,8 +1214,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, parentFolderId, cancellationToken).ConfigureAwait(false);
list.Add(item);
-
- _libraryManager.RegisterItem(item);
}
catch (OperationCanceledException)
{
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index 041647439..e239c3b83 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -95,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
private IDbCommand _updateInheritedRatingCommand;
private IDbCommand _updateInheritedTagsCommand;
- public const int LatestSchemaVersion = 99;
+ public const int LatestSchemaVersion = 100;
/// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@@ -272,6 +272,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(Logger, "TypedBaseItems", "SeriesName", "Text");
_connection.AddColumn(Logger, "TypedBaseItems", "UserDataKey", "Text");
_connection.AddColumn(Logger, "TypedBaseItems", "SeasonName", "Text");
+ _connection.AddColumn(Logger, "TypedBaseItems", "SeasonId", "GUID");
_connection.AddColumn(Logger, "UserDataKeys", "Priority", "INT");
_connection.AddColumn(Logger, "ItemValues", "CleanValue", "Text");
@@ -405,7 +406,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
"CriticRatingSummary",
"IsVirtualItem",
"SeriesName",
- "SeasonName"
+ "SeasonName",
+ "SeasonId"
};
private readonly string[] _mediaStreamSaveColumns =
@@ -526,7 +528,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
"IsVirtualItem",
"SeriesName",
"UserDataKey",
- "SeasonName"
+ "SeasonName",
+ "SeasonId"
};
_saveItemCommand = _connection.CreateCommand();
_saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@@ -961,10 +964,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
if (episode != null)
{
_saveItemCommand.GetParameter(index++).Value = episode.FindSeasonName();
+ _saveItemCommand.GetParameter(index++).Value = episode.FindSeasonId();
}
else
{
_saveItemCommand.GetParameter(index++).Value = null;
+ _saveItemCommand.GetParameter(index++).Value = null;
}
_saveItemCommand.Transaction = transaction;
@@ -1405,6 +1410,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
episode.SeasonName = reader.GetString(60);
}
+ if (!reader.IsDBNull(61))
+ {
+ episode.SeasonId = reader.GetGuid(61);
+ }
}
return item;
diff --git a/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
index a66884f89..29716d33e 100644
--- a/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
@@ -54,11 +54,6 @@ namespace MediaBrowser.Server.Implementations.UserViews
{
return series;
}
- var episodeSeason = episode.Season;
- if (episodeSeason != null)
- {
- return episodeSeason;
- }
return episode;
}
diff --git a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
index 161f771a9..ea4da19b2 100644
--- a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
@@ -86,11 +86,6 @@ namespace MediaBrowser.Server.Implementations.UserViews
{
return series;
}
- var episodeSeason = episode.Season;
- if (episodeSeason != null)
- {
- return episodeSeason;
- }
return episode;
}