aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-11-15 16:31:33 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-11-15 16:31:33 -0500
commita09e330d4e3ee9cea57f3568c8684dce66c44142 (patch)
treef4869dd400031b42d2fdd5ad635c8bd933d22e6a
parentcc16fd3af88fe3bfdc68d026e63609e41ffd1628 (diff)
Display specials within seasons
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs22
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs5
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs6
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs6
-rw-r--r--MediaBrowser.Model/LiveTv/ChannelGuide.cs23
-rw-r--r--MediaBrowser.Model/LiveTv/ProgramInfo.cs37
-rw-r--r--MediaBrowser.Model/LiveTv/RecordingQuery.cs14
-rw-r--r--MediaBrowser.Model/Querying/ItemQuery.cs2
-rw-r--r--MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs8
-rw-r--r--MediaBrowser.Providers/TV/EpisodeXmlParser.cs16
-rw-r--r--MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs36
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs1
12 files changed, 172 insertions, 4 deletions
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 9547cc0a4..3c6ea62f4 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -202,6 +202,9 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "MinCriticRating", Description = "Optional filter by minimum critic rating.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public double? MinCriticRating { get; set; }
+
+ [ApiMember(Name = "AiredDuringSeason", Description = "Gets all episodes that aired during a season, including specials.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+ public int? AiredDuringSeason { get; set; }
}
/// <summary>
@@ -1000,6 +1003,25 @@ namespace MediaBrowser.Api.UserLibrary
});
}
+ if (request.AiredDuringSeason.HasValue)
+ {
+ var val = request.AiredDuringSeason.Value;
+
+ items = items.Where(i =>
+ {
+ var episode = i as Episode;
+
+ if (episode != null)
+ {
+ var seasonNumber = episode.SpecialSeasonNumber ?? episode.ParentIndexNumber;
+
+ return seasonNumber.HasValue && seasonNumber.Value == val;
+ }
+
+ return false;
+ });
+ }
+
return items;
}
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index dbed0b489..f92e7e3e0 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -796,7 +796,7 @@ namespace MediaBrowser.Controller.Entities
foreach (var tuple in list)
{
- if (tasks.Count > 7)
+ if (tasks.Count > 10)
{
await Task.WhenAll(tasks).ConfigureAwait(false);
}
@@ -873,7 +873,8 @@ namespace MediaBrowser.Controller.Entities
progress.Report((90 * percent) + 10);
}
}
- }));
+
+ }, cancellationToken));
}
cancellationToken.ThrowIfCancellationRequested();
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index 95d346733..5100916ff 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -33,6 +33,12 @@ namespace MediaBrowser.Controller.Entities.TV
}
/// <summary>
+ /// Gets the season in which it aired.
+ /// </summary>
+ /// <value>The aired season.</value>
+ public int? SpecialSeasonNumber { get; set; }
+
+ /// <summary>
/// We want to group into series not show individually in an index
/// </summary>
/// <value><c>true</c> if [group in index]; otherwise, <c>false</c>.</value>
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index 1d50a5933..bfa751756 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -31,6 +31,12 @@ namespace MediaBrowser.Model.Dto
public DateTime? DateCreated { get; set; }
/// <summary>
+ /// Gets or sets the special season number.
+ /// </summary>
+ /// <value>The special season number.</value>
+ public int? SpecialSeasonNumber { get; set; }
+
+ /// <summary>
/// Gets or sets the name of the sort.
/// </summary>
/// <value>The name of the sort.</value>
diff --git a/MediaBrowser.Model/LiveTv/ChannelGuide.cs b/MediaBrowser.Model/LiveTv/ChannelGuide.cs
new file mode 100644
index 000000000..d2bebac18
--- /dev/null
+++ b/MediaBrowser.Model/LiveTv/ChannelGuide.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Model.LiveTv
+{
+ public class ChannelGuide
+ {
+ /// <summary>
+ /// Gets or sets the name of the service.
+ /// </summary>
+ /// <value>The name of the service.</value>
+ public string ServiceName { get; set; }
+
+ /// <summary>
+ /// ChannelId for the EPG.
+ /// </summary>
+ public string ChannelId { get; set; }
+
+ /// <summary>
+ /// List of all the programs for a specific channel
+ /// </summary>
+ public List<ProgramInfo> Programs { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/LiveTv/ProgramInfo.cs b/MediaBrowser.Model/LiveTv/ProgramInfo.cs
new file mode 100644
index 000000000..6bf0e383f
--- /dev/null
+++ b/MediaBrowser.Model/LiveTv/ProgramInfo.cs
@@ -0,0 +1,37 @@
+using System;
+
+namespace MediaBrowser.Model.LiveTv
+{
+ public class ProgramInfo
+ {
+ /// <summary>
+ /// Id of the program.
+ /// </summary>
+ public string Id { get; set; }
+
+ /// <summary>
+ /// Name of the program
+ /// </summary>
+ public string Name { get; set; }
+
+ /// <summary>
+ /// Description of the progam.
+ /// </summary>
+ public string Description { get; set; }
+
+ /// <summary>
+ /// The start date of the program, in UTC.
+ /// </summary>
+ public DateTime StartDate { get; set; }
+
+ /// <summary>
+ /// The end date of the program, in UTC.
+ /// </summary>
+ public DateTime EndDate { get; set; }
+
+ /// <summary>
+ /// Genre of the program.
+ /// </summary>
+ public string Genre { get; set; }
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Model/LiveTv/RecordingQuery.cs b/MediaBrowser.Model/LiveTv/RecordingQuery.cs
new file mode 100644
index 000000000..e7a91f4d5
--- /dev/null
+++ b/MediaBrowser.Model/LiveTv/RecordingQuery.cs
@@ -0,0 +1,14 @@
+namespace MediaBrowser.Model.LiveTv
+{
+ /// <summary>
+ /// Class RecordingQuery.
+ /// </summary>
+ public class RecordingQuery
+ {
+ /// <summary>
+ /// Gets or sets a value indicating whether this instance has recorded.
+ /// </summary>
+ /// <value><c>null</c> if [has recorded] contains no value, <c>true</c> if [has recorded]; otherwise, <c>false</c>.</value>
+ public bool? HasRecorded { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/Querying/ItemQuery.cs b/MediaBrowser.Model/Querying/ItemQuery.cs
index 13720ea2b..14c946ba1 100644
--- a/MediaBrowser.Model/Querying/ItemQuery.cs
+++ b/MediaBrowser.Model/Querying/ItemQuery.cs
@@ -265,6 +265,8 @@ namespace MediaBrowser.Model.Querying
public double? MinCommunityRating { get; set; }
public double? MinCriticRating { get; set; }
+ public int? AiredDuringSeason { get; set; }
+
/// <summary>
/// Initializes a new instance of the <see cref="ItemQuery" /> class.
/// </summary>
diff --git a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs
index 5413bd848..6d7a60756 100644
--- a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs
+++ b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs
@@ -75,6 +75,11 @@ namespace MediaBrowser.Providers.Savers
{
builder.Append("<EpisodeNumberEnd>" + SecurityElement.Escape(episode.IndexNumberEnd.Value.ToString(_usCulture)) + "</EpisodeNumberEnd>");
}
+
+ if (episode.SpecialSeasonNumber.HasValue)
+ {
+ builder.Append("<SpecialSeasonNumber>" + SecurityElement.Escape(episode.SpecialSeasonNumber.Value.ToString(_usCulture)) + "</SpecialSeasonNumber>");
+ }
if (episode.ParentIndexNumber.HasValue)
{
@@ -99,7 +104,8 @@ namespace MediaBrowser.Providers.Savers
"SeasonNumber",
"EpisodeNumber",
"EpisodeName",
- "EpisodeNumberEnd"
+ "EpisodeNumberEnd",
+ "SpecialSeasonNumber"
});
// Set last refreshed so that the provider doesn't trigger after the file save
diff --git a/MediaBrowser.Providers/TV/EpisodeXmlParser.cs b/MediaBrowser.Providers/TV/EpisodeXmlParser.cs
index d3abf397f..5188e0824 100644
--- a/MediaBrowser.Providers/TV/EpisodeXmlParser.cs
+++ b/MediaBrowser.Providers/TV/EpisodeXmlParser.cs
@@ -139,6 +139,22 @@ namespace MediaBrowser.Providers.TV
break;
}
+ case "SpecialSeasonNumber":
+ {
+ var number = reader.ReadElementContentAsString();
+
+ if (!string.IsNullOrWhiteSpace(number))
+ {
+ int num;
+
+ if (int.TryParse(number, out num))
+ {
+ item.SpecialSeasonNumber = num;
+ }
+ }
+ break;
+ }
+
case "EpisodeName":
{
var name = reader.ReadElementContentAsString();
diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
index c47640ad9..ab824ac57 100644
--- a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
@@ -113,7 +113,7 @@ namespace MediaBrowser.Providers.TV
{
get
{
- return "1";
+ return "3";
}
}
@@ -404,6 +404,40 @@ namespace MediaBrowser.Providers.TV
break;
}
+ case "airsafter_season":
+ {
+ var val = reader.ReadElementContentAsString();
+
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ int rval;
+
+ // int.TryParse is local aware, so it can be probamatic, force us culture
+ if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
+ {
+ item.SpecialSeasonNumber = rval;
+ }
+ }
+ break;
+ }
+
+ case "airsbefore_season":
+ {
+ var val = reader.ReadElementContentAsString();
+
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ int rval;
+
+ // int.TryParse is local aware, so it can be probamatic, force us culture
+ if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
+ {
+ item.SpecialSeasonNumber = rval;
+ }
+ }
+ break;
+ }
+
case "EpisodeName":
{
if (!item.LockedFields.Contains(MetadataFields.Name))
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 31b0c1a6a..62c4c2e6f 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -1029,6 +1029,7 @@ namespace MediaBrowser.Server.Implementations.Dto
if (episode != null)
{
dto.IndexNumberEnd = episode.IndexNumberEnd;
+ dto.SpecialSeasonNumber = episode.SpecialSeasonNumber;
}
// Add SeriesInfo