< Summary - Jellyfin

Information
Class: Jellyfin.Api.Controllers.SuggestionsController
Assembly: Jellyfin.Api
File(s): /srv/git/jellyfin/Jellyfin.Api/Controllers/SuggestionsController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 30
Coverable lines: 30
Total lines: 126
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 1/23/2026 - 12:11:06 AM Line coverage: 0% (0/30) Branch coverage: 0% (0/2) Total lines: 1254/27/2026 - 12:15:04 AM Line coverage: 0% (0/30) Branch coverage: 0% (0/2) Total lines: 126 1/23/2026 - 12:11:06 AM Line coverage: 0% (0/30) Branch coverage: 0% (0/2) Total lines: 1254/27/2026 - 12:15:04 AM Line coverage: 0% (0/30) Branch coverage: 0% (0/2) Total lines: 126

Coverage delta

Coverage delta 1 -1

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
GetSuggestions(...)0%620%

File(s)

/srv/git/jellyfin/Jellyfin.Api/Controllers/SuggestionsController.cs

#LineLine coverage
 1using System;
 2using System.ComponentModel.DataAnnotations;
 3using Jellyfin.Api.Extensions;
 4using Jellyfin.Api.Helpers;
 5using Jellyfin.Api.ModelBinders;
 6using Jellyfin.Data.Enums;
 7using Jellyfin.Database.Implementations.Entities;
 8using Jellyfin.Database.Implementations.Enums;
 9using Jellyfin.Extensions;
 10using MediaBrowser.Controller.Dto;
 11using MediaBrowser.Controller.Entities;
 12using MediaBrowser.Controller.Library;
 13using MediaBrowser.Model.Dto;
 14using MediaBrowser.Model.Querying;
 15using Microsoft.AspNetCore.Authorization;
 16using Microsoft.AspNetCore.Http;
 17using Microsoft.AspNetCore.Mvc;
 18
 19namespace Jellyfin.Api.Controllers;
 20
 21/// <summary>
 22/// The suggestions controller.
 23/// </summary>
 24[Route("")]
 25[Authorize]
 26[Tags("Suggestion")]
 27public class SuggestionsController : BaseJellyfinApiController
 28{
 29    private readonly IDtoService _dtoService;
 30    private readonly IUserManager _userManager;
 31    private readonly ILibraryManager _libraryManager;
 32
 33    /// <summary>
 34    /// Initializes a new instance of the <see cref="SuggestionsController"/> class.
 35    /// </summary>
 36    /// <param name="dtoService">Instance of the <see cref="IDtoService"/> interface.</param>
 37    /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
 38    /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
 039    public SuggestionsController(
 040        IDtoService dtoService,
 041        IUserManager userManager,
 042        ILibraryManager libraryManager)
 43    {
 044        _dtoService = dtoService;
 045        _userManager = userManager;
 046        _libraryManager = libraryManager;
 047    }
 48
 49    /// <summary>
 50    /// Gets suggestions.
 51    /// </summary>
 52    /// <param name="userId">The user id.</param>
 53    /// <param name="mediaType">The media types.</param>
 54    /// <param name="type">The type.</param>
 55    /// <param name="startIndex">Optional. The start index.</param>
 56    /// <param name="limit">Optional. The limit.</param>
 57    /// <param name="enableTotalRecordCount">Whether to enable the total record count.</param>
 58    /// <response code="200">Suggestions returned.</response>
 59    /// <returns>A <see cref="QueryResult{BaseItemDto}"/> with the suggestions.</returns>
 60    [HttpGet("Items/Suggestions")]
 61    [ProducesResponseType(StatusCodes.Status200OK)]
 62    public ActionResult<QueryResult<BaseItemDto>> GetSuggestions(
 63        [FromQuery] Guid? userId,
 64        [FromQuery, ModelBinder(typeof(CommaDelimitedCollectionModelBinder))] MediaType[] mediaType,
 65        [FromQuery, ModelBinder(typeof(CommaDelimitedCollectionModelBinder))] BaseItemKind[] type,
 66        [FromQuery] int? startIndex,
 67        [FromQuery] int? limit,
 68        [FromQuery] bool enableTotalRecordCount = false)
 69    {
 70        User? user;
 071        if (userId.IsNullOrEmpty())
 72        {
 073            user = null;
 74        }
 75        else
 76        {
 077            var requestUserId = RequestHelpers.GetUserId(User, userId);
 078            user = _userManager.GetUserById(requestUserId);
 79        }
 80
 081        var dtoOptions = new DtoOptions();
 082        var result = _libraryManager.GetItemsResult(new InternalItemsQuery(user)
 083        {
 084            OrderBy = new[] { (ItemSortBy.Random, SortOrder.Descending) },
 085            MediaTypes = mediaType,
 086            IncludeItemTypes = type,
 087            IsVirtualItem = false,
 088            StartIndex = startIndex,
 089            Limit = limit,
 090            DtoOptions = dtoOptions,
 091            EnableTotalRecordCount = enableTotalRecordCount,
 092            Recursive = true
 093        });
 94
 095        var dtoList = _dtoService.GetBaseItemDtos(result.Items, dtoOptions, user);
 96
 097        return new QueryResult<BaseItemDto>(
 098            startIndex,
 099            result.TotalRecordCount,
 0100            dtoList);
 101    }
 102
 103    /// <summary>
 104    /// Gets suggestions.
 105    /// </summary>
 106    /// <param name="userId">The user id.</param>
 107    /// <param name="mediaType">The media types.</param>
 108    /// <param name="type">The type.</param>
 109    /// <param name="startIndex">Optional. The start index.</param>
 110    /// <param name="limit">Optional. The limit.</param>
 111    /// <param name="enableTotalRecordCount">Whether to enable the total record count.</param>
 112    /// <response code="200">Suggestions returned.</response>
 113    /// <returns>A <see cref="QueryResult{BaseItemDto}"/> with the suggestions.</returns>
 114    [HttpGet("Users/{userId}/Suggestions")]
 115    [ProducesResponseType(StatusCodes.Status200OK)]
 116    [Obsolete("Kept for backwards compatibility")]
 117    [ApiExplorerSettings(IgnoreApi = true)]
 118    public ActionResult<QueryResult<BaseItemDto>> GetSuggestionsLegacy(
 119        [FromRoute, Required] Guid userId,
 120        [FromQuery, ModelBinder(typeof(CommaDelimitedCollectionModelBinder))] MediaType[] mediaType,
 121        [FromQuery, ModelBinder(typeof(CommaDelimitedCollectionModelBinder))] BaseItemKind[] type,
 122        [FromQuery] int? startIndex,
 123        [FromQuery] int? limit,
 124        [FromQuery] bool enableTotalRecordCount = false)
 125        => GetSuggestions(userId, mediaType, type, startIndex, limit, enableTotalRecordCount);
 126}