diff --git a/MediaBrowser.Api/IHasItemFields.cs b/MediaBrowser.Api/IHasItemFields.cs
new file mode 100644
index 000000000..36303c889
--- /dev/null
+++ b/MediaBrowser.Api/IHasItemFields.cs
@@ -0,0 +1,52 @@
+using MediaBrowser.Model.Querying;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace MediaBrowser.Api
+{
+ ///
+ /// Interface IHasItemFields
+ ///
+ public interface IHasItemFields
+ {
+ ///
+ /// Gets or sets the fields.
+ ///
+ /// The fields.
+ string Fields { get; set; }
+ }
+
+ ///
+ /// Class ItemFieldsExtensions.
+ ///
+ public static class ItemFieldsExtensions
+ {
+ ///
+ /// Gets the item fields.
+ ///
+ /// The request.
+ /// IEnumerable{ItemFields}.
+ public static IEnumerable GetItemFields(this IHasItemFields request)
+ {
+ var val = request.Fields;
+
+ if (string.IsNullOrEmpty(val))
+ {
+ return new ItemFields[] { };
+ }
+
+ return val.Split(',').Select(v =>
+ {
+ ItemFields value;
+
+ if (Enum.TryParse(v, true, out value))
+ {
+ return (ItemFields?)value;
+ }
+ return null;
+
+ }).Where(i => i.HasValue).Select(i => i.Value);
+ }
+ }
+}
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index 7a9c6c8ac..a5720dfad 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -70,6 +70,7 @@
+
diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs
index 587965b3f..a160ce666 100644
--- a/MediaBrowser.Api/SimilarItemsHelper.cs
+++ b/MediaBrowser.Api/SimilarItemsHelper.cs
@@ -25,7 +25,7 @@ namespace MediaBrowser.Api
public string Id { get; set; }
}
- public class BaseGetSimilarItems : IReturn
+ public class BaseGetSimilarItems : IReturn, IHasItemFields
{
///
/// Gets or sets the user id.
@@ -47,32 +47,6 @@ namespace MediaBrowser.Api
/// The fields.
[ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines, TrailerUrls", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Fields { get; set; }
-
- ///
- /// Gets the item fields.
- ///
- /// IEnumerable{ItemFields}.
- public IEnumerable GetItemFields()
- {
- var val = Fields;
-
- if (string.IsNullOrEmpty(val))
- {
- return new ItemFields[] { };
- }
-
- return val.Split(',').Select(v =>
- {
- ItemFields value;
-
- if (Enum.TryParse(v, true, out value))
- {
- return (ItemFields?)value;
- }
- return null;
-
- }).Where(i => i.HasValue).Select(i => i.Value);
- }
}
///
diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs
index 6cae379d2..1774f1a8e 100644
--- a/MediaBrowser.Api/TvShowsService.cs
+++ b/MediaBrowser.Api/TvShowsService.cs
@@ -17,7 +17,7 @@ namespace MediaBrowser.Api
///
[Route("/Shows/NextUp", "GET")]
[Api(("Gets a list of currently installed plugins"))]
- public class GetNextUpEpisodes : IReturn
+ public class GetNextUpEpisodes : IReturn, IHasItemFields
{
///
/// Gets or sets the user id.
@@ -49,32 +49,6 @@ namespace MediaBrowser.Api
[ApiMember(Name = "SeriesId", Description = "Optional. Filter by series id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string SeriesId { get; set; }
-
- ///
- /// Gets the item fields.
- ///
- /// IEnumerable{ItemFields}.
- public IEnumerable GetItemFields()
- {
- var val = Fields;
-
- if (string.IsNullOrEmpty(val))
- {
- return new ItemFields[] { };
- }
-
- return val.Split(',').Select(v =>
- {
- ItemFields value;
-
- if (Enum.TryParse(v, true, out value))
- {
- return (ItemFields?)value;
- }
- return null;
-
- }).Where(i => i.HasValue).Select(i => i.Value);
- }
}
[Route("/Shows/{Id}/Similar", "GET")]
@@ -83,6 +57,34 @@ namespace MediaBrowser.Api
{
}
+ [Route("/Shows/{Id}/Episodes", "GET")]
+ [Api(Description = "Finds tv shows similar to a given one.")]
+ public class GetEpisodes : IReturn, IHasItemFields
+ {
+ ///
+ /// Gets or sets the user id.
+ ///
+ /// The user id.
+ [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public Guid UserId { get; set; }
+
+ ///
+ /// Fields to return within the items, in addition to basic information
+ ///
+ /// The fields.
+ [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines, TrailerUrls", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
+ public string Fields { get; set; }
+
+ [ApiMember(Name = "Id", Description = "The series id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public Guid Id { get; set; }
+
+ [ApiMember(Name = "Season", Description = "Optional filter by season number.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public int? Season { get; set; }
+
+ [ApiMember(Name = "ExcludeLocationTypes", Description = "Optional. If specified, results will be filtered based on LocationType. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
+ public string ExcludeLocationTypes { get; set; }
+ }
+
///
/// Class TvShowsService
///
@@ -311,5 +313,88 @@ namespace MediaBrowser.Api
return items;
}
+
+ public object Get(GetEpisodes request)
+ {
+ var user = _userManager.GetUserById(request.UserId);
+
+ var series = _libraryManager.GetItemById(request.Id) as Series;
+
+ var fields = request.GetItemFields().ToList();
+
+ var episodes = series.GetRecursiveChildren(user)
+ .OfType();
+
+ var sortOrder = ItemSortBy.SortName;
+
+ if (request.Season.HasValue)
+ {
+ episodes = FilterEpisodesBySeason(episodes, request.Season.Value, true);
+
+ sortOrder = ItemSortBy.AiredEpisodeOrder;
+ }
+
+ var config = user.Configuration;
+
+ if (!config.DisplayMissingEpisodes)
+ {
+ episodes = episodes.Where(i => !i.IsMissingEpisode);
+ }
+ if (!config.DisplayUnairedEpisodes)
+ {
+ episodes = episodes.Where(i => !i.IsVirtualUnaired);
+ }
+
+ // ExcludeLocationTypes
+ if (!string.IsNullOrEmpty(request.ExcludeLocationTypes))
+ {
+ var vals = request.ExcludeLocationTypes.Split(',');
+ episodes = episodes.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase));
+ }
+
+ episodes = _libraryManager.Sort(episodes, user, new[] { sortOrder }, SortOrder.Ascending)
+ .Cast();
+
+ var returnItems = episodes.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
+ .ToArray();
+
+ return new ItemsResult
+ {
+ TotalRecordCount = returnItems.Length,
+ Items = returnItems
+ };
+ }
+
+ internal static IEnumerable FilterEpisodesBySeason(IEnumerable episodes, int seasonNumber, bool includeSpecials)
+ {
+ if (!includeSpecials || seasonNumber < 1)
+ {
+ return episodes.Where(i => (i.PhysicalSeasonNumber ?? -1) == seasonNumber);
+ }
+
+ var episodeList = episodes.ToList();
+
+ // We can only enforce the air date requirement if the episodes have air dates
+ var enforceAirDate = episodeList.Any(i => i.PremiereDate.HasValue);
+
+ return episodeList.Where(i =>
+ {
+ var episode = i;
+
+ if (episode != null)
+ {
+ if (enforceAirDate && !episode.PremiereDate.HasValue)
+ {
+ return false;
+ }
+
+ var currentSeasonNumber = episode.AiredSeasonNumber;
+
+ return currentSeasonNumber.HasValue && currentSeasonNumber.Value == seasonNumber;
+ }
+
+ return false;
+ });
+ }
}
}
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
index eba36d856..6aa87e499 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
@@ -7,7 +7,7 @@ using System;
namespace MediaBrowser.Api.UserLibrary
{
- public abstract class BaseItemsRequest
+ public abstract class BaseItemsRequest : IHasItemFields
{
///
/// Skips over a given number of items within the results. Use for paging.
@@ -109,32 +109,6 @@ namespace MediaBrowser.Api.UserLibrary
return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true));
}
- ///
- /// Gets the item fields.
- ///
- /// IEnumerable{ItemFields}.
- public IEnumerable GetItemFields()
- {
- var val = Fields;
-
- if (string.IsNullOrEmpty(val))
- {
- return new ItemFields[] { };
- }
-
- return val.Split(',').Select(v =>
- {
- ItemFields value;
-
- if (Enum.TryParse(v, true, out value))
- {
- return (ItemFields?)value;
- }
- return null;
-
- }).Where(i => i.HasValue).Select(i => i.Value);
- }
-
///
/// Gets the image types.
///
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 3936014c5..cae74cc2f 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -1012,7 +1012,7 @@ namespace MediaBrowser.Api.UserLibrary
if (request.AiredDuringSeason.HasValue)
{
- items = FilterByAiredDuringSeason(items, request.AiredDuringSeason.Value);
+ items = TvShowsService.FilterEpisodesBySeason(items.OfType(), request.AiredDuringSeason.Value, true);
}
if (!string.IsNullOrEmpty(request.MinPremiereDate))
@@ -1032,43 +1032,6 @@ namespace MediaBrowser.Api.UserLibrary
return items;
}
- private IEnumerable FilterByAiredDuringSeason(IEnumerable items, int seasonNumber)
- {
- var episodes = items.OfType().ToList();
-
- // We can only enforce the air date requirement if the episodes have air dates
- var enforceAirDate = episodes.Any(i => i.PremiereDate.HasValue);
-
- return episodes.Where(i =>
- {
- var episode = i;
-
- if (episode != null)
- {
- var currentSeasonNumber = episode.AirsAfterSeasonNumber ?? episode.AirsBeforeSeasonNumber ?? episode.ParentIndexNumber;
-
- // If this produced nothing, try and get it from the parent folder
- if (!currentSeasonNumber.HasValue)
- {
- var season = episode.Parent as Season;
- if (season != null)
- {
- currentSeasonNumber = season.IndexNumber;
- }
- }
-
- if (enforceAirDate && !episode.PremiereDate.HasValue)
- {
- return false;
- }
-
- return currentSeasonNumber.HasValue && currentSeasonNumber.Value == seasonNumber;
- }
-
- return false;
- });
- }
-
///
/// Determines whether the specified item has image.
///
diff --git a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
index 56641296f..0581343d3 100644
--- a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
+++ b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
@@ -168,7 +168,7 @@ namespace MediaBrowser.Common.Implementations.Updates
{
// Let dev users get results more often for testing purposes
var cacheLength = _config.CommonConfiguration.SystemUpdateLevel == PackageVersionClass.Dev
- ? TimeSpan.FromMinutes(15)
+ ? TimeSpan.FromMinutes(5)
: TimeSpan.FromHours(12);
if ((DateTime.UtcNow - _lastPackageListResult.Item2) < cacheLength)
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index c68ba0ad1..95ea10ea1 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -50,6 +50,33 @@ namespace MediaBrowser.Controller.Entities.TV
get { return true; }
}
+ [IgnoreDataMember]
+ public int? AiredSeasonNumber
+ {
+ get
+ {
+ return AirsBeforeSeasonNumber ?? AirsAfterSeasonNumber ?? PhysicalSeasonNumber;
+ }
+ }
+
+ [IgnoreDataMember]
+ public int? PhysicalSeasonNumber
+ {
+ get
+ {
+ var value = ParentIndexNumber;
+
+ if (value.HasValue)
+ {
+ return value;
+ }
+
+ var season = Parent as Season;
+
+ return season != null ? season.IndexNumber : null;
+ }
+ }
+
///
/// We roll up into series
///
diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
index 0856ca1f6..8ee622eda 100644
--- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
+++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
@@ -1072,7 +1072,7 @@ namespace MediaBrowser.Controller.Providers
/// IEnumerable{PersonInfo}.
private IEnumerable GetPersonsFromXmlNode(XmlReader reader)
{
- var names = new List();
+ var name = string.Empty;
var type = "Actor"; // If type is not specified assume actor
var role = string.Empty;
int? sortOrder = null;
@@ -1086,7 +1086,7 @@ namespace MediaBrowser.Controller.Providers
switch (reader.Name)
{
case "Name":
- names.AddRange(SplitNames(reader.ReadElementContentAsString()));
+ name = reader.ReadElementContentAsString() ?? string.Empty;
break;
case "Type":
@@ -1132,7 +1132,15 @@ namespace MediaBrowser.Controller.Providers
}
}
- return names.Select(n => new PersonInfo { Name = n.Trim(), Role = role, Type = type, SortOrder = sortOrder });
+ var personInfo = new PersonInfo
+ {
+ Name = name.Trim(),
+ Role = role,
+ Type = type,
+ SortOrder = sortOrder
+ };
+
+ return new[] { personInfo };
}
///
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index 726df1eb5..ced0b712f 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -311,6 +311,9 @@
Querying\ArtistsQuery.cs
+
+ Querying\EpisodeQuery.cs
+
Querying\ItemCountsQuery.cs
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 471db6f25..80b5e9ab8 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -298,6 +298,9 @@
Querying\ArtistsQuery.cs
+
+ Querying\EpisodeQuery.cs
+
Querying\ItemCountsQuery.cs
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 3f66f195e..7817a26cd 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -225,6 +225,13 @@ namespace MediaBrowser.Model.ApiClient
/// Task{ItemCounts}.
Task GetItemCountsAsync(ItemCountsQuery query);
+ ///
+ /// Gets the episodes asynchronous.
+ ///
+ /// The query.
+ /// Task{ItemsResult}.
+ Task GetEpisodesAsync(EpisodeQuery query);
+
///
/// Queries for items
///
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 6ff6fcf73..45b5998d2 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -90,6 +90,7 @@
+
diff --git a/MediaBrowser.Model/Querying/EpisodeQuery.cs b/MediaBrowser.Model/Querying/EpisodeQuery.cs
new file mode 100644
index 000000000..ab9b246c8
--- /dev/null
+++ b/MediaBrowser.Model/Querying/EpisodeQuery.cs
@@ -0,0 +1,23 @@
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Model.Querying
+{
+ public class EpisodeQuery
+ {
+ public string UserId { get; set; }
+
+ public string SeriesId { get; set; }
+
+ public LocationType[] ExcludeLocationTypes { get; set; }
+
+ public int? SeasonNumber { get; set; }
+
+ public ItemFields[] Fields { get; set; }
+
+ public EpisodeQuery()
+ {
+ Fields = new ItemFields[] { };
+ ExcludeLocationTypes = new LocationType[] { };
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs
index cc2293968..aff71c6db 100644
--- a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs
+++ b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs
@@ -68,8 +68,8 @@ namespace MediaBrowser.Providers.Movies
var timestampFileInfo = new FileInfo(timestampFile);
- // Don't check for tvdb updates anymore frequently than 24 hours
- if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1)
+ // Don't check for updates every single time
+ if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 3)
{
return;
}
diff --git a/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs
index 50e04a9af..f8fb133c6 100644
--- a/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs
+++ b/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs
@@ -100,8 +100,8 @@ namespace MediaBrowser.Providers.Movies
var timestampFileInfo = new FileInfo(timestampFile);
- // Don't check for tvdb updates anymore frequently than 24 hours
- if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1)
+ // Don't check for updates every single time
+ if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 3)
{
return;
}
diff --git a/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs b/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs
index 2264ccd3f..489b0ad09 100644
--- a/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs
+++ b/MediaBrowser.Providers/Movies/PersonUpdatesPreScanTask.cs
@@ -76,8 +76,8 @@ namespace MediaBrowser.Providers.Movies
var timestampFileInfo = new FileInfo(timestampFile);
- // Don't check for tvdb updates anymore frequently than 24 hours
- if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1)
+ // Don't check for updates every single time
+ if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 3)
{
return;
}
diff --git a/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs b/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs
index 6d9a16e87..ddf212179 100644
--- a/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs
+++ b/MediaBrowser.Providers/Music/FanArtUpdatesPrescanTask.cs
@@ -67,8 +67,8 @@ namespace MediaBrowser.Providers.Music
var timestampFileInfo = new FileInfo(timestampFile);
- // Don't check for tvdb updates anymore frequently than 24 hours
- if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1)
+ // Don't check for updates every single time
+ if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 3)
{
return;
}
diff --git a/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs b/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs
index 4bc7c3c4f..8ef04ed11 100644
--- a/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs
+++ b/MediaBrowser.Providers/TV/FanArtTvUpdatesPrescanTask.cs
@@ -68,8 +68,8 @@ namespace MediaBrowser.Providers.TV
var timestampFileInfo = new FileInfo(timestampFile);
- // Don't check for tvdb updates anymore frequently than 24 hours
- if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 1)
+ // Don't check for updates every single time
+ if (timestampFileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(timestampFileInfo)).TotalDays < 3)
{
return;
}
diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js
index d6f82184c..387a84970 100644
--- a/MediaBrowser.WebDashboard/ApiClient.js
+++ b/MediaBrowser.WebDashboard/ApiClient.js
@@ -469,6 +469,17 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
});
};
+ self.getEpisodes = function (itemId, options) {
+
+ var url = self.getUrl("Shows/" + itemId + "/Episodes", options);
+
+ return self.ajax({
+ type: "GET",
+ url: url,
+ dataType: "json"
+ });
+ };
+
self.getSimilarMovies = function (itemId, options) {
var url = self.getUrl("Movies/" + itemId + "/Similar", options);
diff --git a/MediaBrowser.WebDashboard/packages.config b/MediaBrowser.WebDashboard/packages.config
index d431a43a5..6e250aae3 100644
--- a/MediaBrowser.WebDashboard/packages.config
+++ b/MediaBrowser.WebDashboard/packages.config
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index 70922e14b..321b2f681 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Common.Internal
- 3.0.244
+ 3.0.245
MediaBrowser.Common.Internal
Luke
ebr,Luke,scottisafool
@@ -12,7 +12,7 @@
Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.
Copyright © Media Browser 2013
-
+
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 16413baf5..a8b8c686a 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Common
- 3.0.244
+ 3.0.245
MediaBrowser.Common
Media Browser Team
ebr,Luke,scottisafool
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 7246f517f..1d8c165e6 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Server.Core
- 3.0.244
+ 3.0.245
Media Browser.Server.Core
Media Browser Team
ebr,Luke,scottisafool
@@ -12,7 +12,7 @@
Contains core components required to build plugins for Media Browser Server.
Copyright © Media Browser 2013
-
+