diff --git a/Jellyfin.Api/Controllers/YearsController.cs b/Jellyfin.Api/Controllers/YearsController.cs
new file mode 100644
index 0000000000..2d8ef69cbf
--- /dev/null
+++ b/Jellyfin.Api/Controllers/YearsController.cs
@@ -0,0 +1,226 @@
+using System;
+using Jellyfin.Api.Extensions;
+using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Querying;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Jellyfin.Api.Controllers
+{
+ public class YearsController : BaseJellyfinApiController
+ {
+ private readonly ILibraryManager _libraryManager;
+ private readonly IUserManager _userManager;
+ private readonly IDtoService _dtoService;
+
+ ///
+ /// Get years.
+ ///
+ /// Optional. Filter by maximum official rating (PG, PG-13, TV-MA, etc).
+ /// Optional. Filter by items with theme songs.
+ /// Optional. Filter by items with theme videos.
+ /// Optional. Filter by items with subtitles.
+ /// Optional. Filter by items with special features.
+ /// Optional. Filter by items with trailers.
+ /// Optional. Return items that are siblings of a supplied item.
+ /// Optional. Filter by minimum index number.
+ /// Optional. Filter by parent index number.
+ /// Optional. filter by items that have or do not have a parental rating.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpGet]
+ public ActionResult> GetYears(
+ [FromQuery] string maxOfficialRating,
+ [FromQuery] bool? hasThemeSong,
+ [FromQuery] bool? hasThemeVideo,
+ [FromQuery] bool? hasSubtitles,
+ [FromQuery] bool? hasSpecialFeatures,
+ [FromQuery] bool? hasTrailer,
+ [FromQuery] string adjacentTo,
+ [FromQuery] int? minIndexNumber,
+ [FromQuery] int? parentIndexNumber,
+ [FromQuery] bool? hasParentalRating,
+ [FromQuery] bool? isHd,
+ [FromQuery] bool? is4k,
+ [FromQuery] string locationTypes,
+ [FromQuery] string excludeLocationTypes,
+ [FromQuery] bool? isMissing,
+ [FromQuery] bool? isUnaired,
+ [FromQuery] double? minCommunityRating,
+ [FromQuery] double? minCriticRating,
+ [FromQuery] int? airedDuringSeason,
+ [FromQuery] DateTime? minPremiereDate,
+ [FromQuery] DateTime? minDateLastSaved,
+ [FromQuery] DateTime? minDateLastSavedForUser,
+ [FromQuery] DateTime? maxPremiereDate,
+ [FromQuery] bool? hasOverview,
+ [FromQuery] bool? hasImdbId,
+ [FromQuery] bool? hasTmdbId,
+ [FromQuery] bool? hasTvdbId,
+ [FromQuery] string excludeItemIds,
+ [FromQuery] int? startIndex,
+ [FromQuery] int? limit,
+ [FromQuery] string searchTerm,
+ [FromQuery] string sortOrder,
+ [FromQuery] string parentId,
+ [FromQuery] string fields,
+ [FromQuery] string excludeItemTypes,
+ [FromQuery] string includeItemTypes,
+ [FromQuery] string filters,
+ [FromQuery] bool? isFavorite,
+ [FromQuery] string mediaTypes,
+ [FromQuery] string imageTypes,
+ [FromQuery] string sortBy,
+ [FromQuery] bool? isPlayed,
+ [FromQuery] string genres,
+ [FromQuery] string genreIds,
+ [FromQuery] string officialRatings,
+ [FromQuery] string tags,
+ [FromQuery] string years,
+ [FromQuery] bool? enableUserData,
+ [FromQuery] int? imageTypeLimit,
+ [FromQuery] string enableImageTypes,
+ [FromQuery] string person,
+ [FromQuery] string personIds,
+ [FromQuery] string personTypes,
+ [FromQuery] string studios,
+ [FromQuery] string studioIds,
+ [FromQuery] string artists,
+ [FromQuery] string excludeArtistIds,
+ [FromQuery] string artistIds,
+ [FromQuery] string albumArtistIds,
+ [FromQuery] string contributingArtistIds,
+ [FromQuery] string albums,
+ [FromQuery] string albumIds,
+ [FromQuery] string ids,
+ [FromQuery] string videoTypes,
+ [FromQuery] Guid userId,
+ [FromQuery] string minOfficialRating,
+ [FromQuery] bool? isLocked,
+ [FromQuery] bool? isPlaceholder,
+ [FromQuery] bool? hasOfficialRating,
+ [FromQuery] bool? collapseBoxSetItems,
+ [FromQuery] int? minWidth,
+ [FromQuery] int? minHeight,
+ [FromQuery] int? maxWidth,
+ [FromQuery] int? maxHeight,
+ [FromQuery] bool? is3d,
+ [FromQuery] string seriesStatus,
+ [FromQuery] string nameStartsWithOrGreater,
+ [FromQuery] string nameStartsWith,
+ [FromQuery] string nameLessThan,
+ [FromQuery] bool recursive = true,
+ [FromQuery] bool? enableImages = true,
+ [FromQuery] bool enableTotalRecordCount = true)
+ {
+
+ }
+
+ ///
+ /// Gets a year.
+ ///
+ /// The year.
+ /// Optional. Filter by user id, and attach user data.
+ /// Year returned.
+ /// Year not found.
+ ///
+ /// An containing the year,
+ /// or a if year not found.
+ ///
+ [HttpGet("{year}")]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status404NotFound)]
+ public ActionResult GetYear([FromRoute] int year, [FromQuery] Guid userId)
+ {
+ var item = _libraryManager.GetYear(year);
+ if (item == null)
+ {
+ return NotFound();
+ }
+
+ var dtoOptions = new DtoOptions()
+ .AddClientFields(Request);
+
+ if (!userId.Equals(Guid.Empty))
+ {
+ var user = _userManager.GetUserById(userId);
+ return _dtoService.GetBaseItemDto(item, dtoOptions, user);
+ }
+
+ return _dtoService.GetBaseItemDto(item, dtoOptions);
+ }
+ }
+}
diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs
index d023ee90ab..f34884f8bc 100644
--- a/MediaBrowser.Api/UserLibrary/YearsService.cs
+++ b/MediaBrowser.Api/UserLibrary/YearsService.cs
@@ -20,27 +20,6 @@ namespace MediaBrowser.Api.UserLibrary
{
}
- ///
- /// Class GetYear
- ///
- [Route("/Years/{Year}", "GET", Summary = "Gets a year")]
- public class GetYear : IReturn
- {
- ///
- /// Gets or sets the year.
- ///
- /// The year.
- [ApiMember(Name = "Year", Description = "The year", IsRequired = true, DataType = "int", ParameterType = "path", Verb = "GET")]
- public int Year { get; set; }
-
- ///
- /// Gets or sets the user id.
- ///
- /// The user id.
- [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public Guid UserId { get; set; }
- }
-
///
/// Class YearsService
///
@@ -68,39 +47,6 @@ namespace MediaBrowser.Api.UserLibrary
{
}
- ///
- /// Gets the specified request.
- ///
- /// The request.
- /// System.Object.
- public object Get(GetYear request)
- {
- var result = GetItem(request);
-
- return ToOptimizedResult(result);
- }
-
- ///
- /// Gets the item.
- ///
- /// The request.
- /// Task{BaseItemDto}.
- private BaseItemDto GetItem(GetYear request)
- {
- var item = LibraryManager.GetYear(request.Year);
-
- var dtoOptions = GetDtoOptions(AuthorizationContext, request);
-
- if (!request.UserId.Equals(Guid.Empty))
- {
- var user = UserManager.GetUserById(request.UserId);
-
- return DtoService.GetBaseItemDto(item, dtoOptions, user);
- }
-
- return DtoService.GetBaseItemDto(item, dtoOptions);
- }
-
///
/// Gets the specified request.
///