< Summary - Jellyfin

Information
Class: MediaBrowser.Controller.Entities.InternalItemsQuery
Assembly: MediaBrowser.Controller
File(s): /srv/git/jellyfin/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
Line coverage
87%
Covered lines: 170
Uncovered lines: 24
Coverable lines: 194
Total lines: 622
Line coverage: 87.6%
Branch coverage
48%
Covered branches: 102
Total branches: 211
Branch coverage: 48.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 5/16/2026 - 12:15:55 AM Line coverage: 75.2% (76/101) Branch coverage: 38.7% (12/31) Total lines: 4925/20/2026 - 12:15:44 AM Line coverage: 75.2% (76/101) Branch coverage: 35.4% (11/31) Total lines: 4925/22/2026 - 12:15:17 AM Line coverage: 75.4% (77/102) Branch coverage: 35.4% (11/31) Total lines: 4996/6/2026 - 12:15:50 AM Line coverage: 75.4% (77/102) Branch coverage: 38.7% (12/31) Total lines: 4996/18/2026 - 12:16:24 AM Line coverage: 87.5% (168/192) Branch coverage: 48.3% (101/209) Total lines: 5958/6/2026 - 12:17:15 AM Line coverage: 87.5% (169/193) Branch coverage: 48.3% (101/209) Total lines: 60210/29/2026 - 12:17:11 AM Line coverage: 87.6% (170/194) Branch coverage: 48.3% (102/211) Total lines: 622 5/16/2026 - 12:15:55 AM Line coverage: 75.2% (76/101) Branch coverage: 38.7% (12/31) Total lines: 4925/20/2026 - 12:15:44 AM Line coverage: 75.2% (76/101) Branch coverage: 35.4% (11/31) Total lines: 4925/22/2026 - 12:15:17 AM Line coverage: 75.4% (77/102) Branch coverage: 35.4% (11/31) Total lines: 4996/6/2026 - 12:15:50 AM Line coverage: 75.4% (77/102) Branch coverage: 38.7% (12/31) Total lines: 4996/18/2026 - 12:16:24 AM Line coverage: 87.5% (168/192) Branch coverage: 48.3% (101/209) Total lines: 5958/6/2026 - 12:17:15 AM Line coverage: 87.5% (169/193) Branch coverage: 48.3% (101/209) Total lines: 60210/29/2026 - 12:17:11 AM Line coverage: 87.6% (170/194) Branch coverage: 48.3% (102/211) Total lines: 622

Coverage delta

Coverage delta 13 -13

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
.ctor(...)100%22100%
get_HasFilters()50%180180100%
set_Parent(...)100%22100%
SetUser(...)50%2294.44%
ApplyFilters(...)28%3152522.58%

File(s)

/srv/git/jellyfin/MediaBrowser.Controller/Entities/InternalItemsQuery.cs

#LineLine coverage
 1#pragma warning disable CA1044, CA1819, CA2227, CS1591
 2
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using Diacritics.Extensions;
 7using Jellyfin.Data;
 8using Jellyfin.Data.Enums;
 9using Jellyfin.Database.Implementations.Entities;
 10using Jellyfin.Database.Implementations.Enums;
 11using MediaBrowser.Controller.Dto;
 12using MediaBrowser.Model.Entities;
 13using MediaBrowser.Model.Querying;
 14
 15namespace MediaBrowser.Controller.Entities
 16{
 17    public class InternalItemsQuery
 18    {
 19        public InternalItemsQuery()
 20        {
 101021            AlbumArtistIds = [];
 101022            AlbumIds = [];
 101023            AncestorIds = [];
 101024            LinkedChildAncestorIds = [];
 101025            ArtistIds = [];
 101026            BlockUnratedItems = [];
 101027            BoxSetLibraryFolders = [];
 101028            ChannelIds = [];
 101029            ContributingArtistIds = [];
 101030            DtoOptions = new DtoOptions();
 101031            EnableTotalRecordCount = true;
 101032            ExcludeArtistIds = [];
 101033            ExcludeInheritedTags = [];
 101034            IncludeInheritedTags = [];
 101035            ExcludeItemIds = [];
 101036            ExcludeItemTypes = [];
 101037            ExcludeTags = [];
 101038            GenreIds = [];
 101039            Genres = [];
 101040            GroupByPresentationUniqueKey = true;
 101041            ImageTypes = [];
 101042            IncludeItemTypes = [];
 101043            ItemIds = [];
 101044            OwnerIds = [];
 101045            ExtraTypes = [];
 101046            MediaTypes = [];
 101047            OfficialRatings = [];
 101048            OrderBy = [];
 101049            OwnerIds = [];
 101050            PersonIds = [];
 101051            PersonTypes = [];
 101052            PresetViews = [];
 101053            SeriesStatuses = [];
 101054            SourceTypes = [];
 101055            StudioIds = [];
 101056            Tags = [];
 101057            TopParentIds = [];
 101058            TrailerTypes = [];
 101059            VideoTypes = [];
 101060            Years = [];
 101061            SkipDeserialization = false;
 101062            AudioLanguages = [];
 101063            SubtitleLanguages = [];
 101064        }
 65
 66        public InternalItemsQuery(User? user)
 13967            : this()
 68        {
 13969            if (user is not null)
 70            {
 12871                SetUser(user);
 72            }
 13973        }
 74
 75        /// <summary>
 76        /// Gets a value indicating whether the query carries any criteria that narrows the
 77        /// result set, as opposed to user context, pagination, sorting or DTO options.
 78        /// </summary>
 79        public bool HasFilters =>
 380            IncludeItemTypes.Length > 0
 381            || ExcludeItemTypes.Length > 0
 382            || Genres.Count > 0
 383            || GenreIds.Count > 0
 384            || Years.Length > 0
 385            || Tags.Length > 0
 386            || ExcludeTags.Length > 0
 387            || OfficialRatings.Length > 0
 388            || StudioIds.Length > 0
 389            || ArtistIds.Length > 0
 390            || AlbumArtistIds.Length > 0
 391            || ContributingArtistIds.Length > 0
 392            || ExcludeArtistIds.Length > 0
 393            || AlbumIds.Length > 0
 394            || PersonIds.Length > 0
 395            || PersonTypes.Length > 0
 396            || MediaTypes.Length > 0
 397            || VideoTypes.Length > 0
 398            || ImageTypes.Length > 0
 399            || SeriesStatuses.Length > 0
 3100            || ItemIds.Length > 0
 3101            || ExcludeItemIds.Length > 0
 3102            || AudioLanguages.Count > 0
 3103            || SubtitleLanguages.Count > 0
 3104            || LinkedChildAncestorIds.Length > 0
 3105            || AncestorIds.Length > 0
 3106            || DescendantOfId.HasValue
 3107            || IsFavorite.HasValue
 3108            || IsFavoriteOrLiked.HasValue
 3109            || IsLiked.HasValue
 3110            || IsPlayed.HasValue
 3111            || IsResumable.HasValue
 3112            || IsFolder.HasValue
 3113            || IsMissing.HasValue
 3114            || IsUnaired.HasValue
 3115            || IsSpecialSeason.HasValue
 3116            || Is3D.HasValue
 3117            || IsHD.HasValue
 3118            || Is4K.HasValue
 3119            || IsLocked.HasValue
 3120            || IsPlaceHolder.HasValue
 3121            || IsMovie.HasValue
 3122            || IsSports.HasValue
 3123            || IsKids.HasValue
 3124            || IsNews.HasValue
 3125            || IsSeries.HasValue
 3126            || IsAiring.HasValue
 3127            || IsVirtualItem.HasValue
 3128            || HasImdbId.HasValue
 3129            || HasTmdbId.HasValue
 3130            || HasTvdbId.HasValue
 3131            || HasOverview.HasValue
 3132            || HasOfficialRating.HasValue
 3133            || HasParentalRating.HasValue
 3134            || HasThemeSong.HasValue
 3135            || HasThemeVideo.HasValue
 3136            || HasSubtitles.HasValue
 3137            || HasSpecialFeature.HasValue
 3138            || HasTrailer.HasValue
 3139            || HasChapterImages.HasValue
 3140            || MinCriticRating.HasValue
 3141            || MinCommunityRating.HasValue
 3142            || MinParentalRating is not null
 3143            || MinIndexNumber.HasValue
 3144            || MinParentAndIndexNumber.HasValue
 3145            || IndexNumber.HasValue
 3146            || ParentIndexNumber.HasValue
 3147            || AiredDuringSeason.HasValue
 3148            || MinWidth.HasValue
 3149            || MinHeight.HasValue
 3150            || MaxWidth.HasValue
 3151            || MaxHeight.HasValue
 3152            || MinPremiereDate.HasValue
 3153            || MaxPremiereDate.HasValue
 3154            || MinStartDate.HasValue
 3155            || MaxStartDate.HasValue
 3156            || MinEndDate.HasValue
 3157            || MaxEndDate.HasValue
 3158            || MinDateCreated.HasValue
 3159            || MinDateLastSaved.HasValue
 3160            || MinDateLastSavedForUser.HasValue
 3161            || AdjacentTo.HasValue
 3162            || !string.IsNullOrEmpty(NameStartsWith)
 3163            || !string.IsNullOrEmpty(NameStartsWithOrGreater)
 3164            || !string.IsNullOrEmpty(NameLessThan)
 3165            || !string.IsNullOrEmpty(NameContains)
 3166            || !string.IsNullOrEmpty(MinSortName)
 3167            || !string.IsNullOrEmpty(Name)
 3168            || !string.IsNullOrEmpty(Person)
 3169            || !string.IsNullOrEmpty(SearchTerm)
 3170            || !string.IsNullOrEmpty(Path);
 171
 172        public bool Recursive { get; set; }
 173
 174        public int? StartIndex { get; set; }
 175
 176        public int? Limit { get; set; }
 177
 178        public User? User { get; set; }
 179
 180        public bool? IsFolder { get; set; }
 181
 182        public bool? IsFavorite { get; set; }
 183
 184        public bool? IsFavoriteOrLiked { get; set; }
 185
 186        public bool? IsLiked { get; set; }
 187
 188        public bool? IsPlayed { get; set; }
 189
 190        public bool? IsResumable { get; set; }
 191
 192        public bool? IncludeItemsByName { get; set; }
 193
 194        public MediaType[] MediaTypes { get; set; }
 195
 196        public BaseItemKind[] IncludeItemTypes { get; set; }
 197
 198        public BaseItemKind[] ExcludeItemTypes { get; set; }
 199
 200        public string[] ExcludeTags { get; set; }
 201
 202        public string[] ExcludeInheritedTags { get; set; }
 203
 204        public string[] IncludeInheritedTags { get; set; }
 205
 206        public IReadOnlyList<string> Genres { get; set; }
 207
 208        public bool? IsSpecialSeason { get; set; }
 209
 210        public bool? IsMissing { get; set; }
 211
 212        public bool? IsUnaired { get; set; }
 213
 214        public bool? CollapseBoxSetItems { get; set; }
 215
 216        /// <summary>
 217        /// Gets or sets the item types that should be collapsed into box sets.
 218        /// When empty, all types are collapsed. When set, only items of these types are replaced by their parent box se
 219        /// </summary>
 220        public BaseItemKind[] CollapseBoxSetItemTypes { get; set; } = [];
 221
 222        public string? NameStartsWithOrGreater { get; set; }
 223
 224        public string? NameStartsWith { get; set; }
 225
 226        public string? NameLessThan { get; set; }
 227
 228        public string? NameContains { get; set; }
 229
 230        public string? MinSortName { get; set; }
 231
 232        public string? PresentationUniqueKey { get; set; }
 233
 234        public string? Path { get; set; }
 235
 236        public string? Name { get; set; }
 237
 238        public string? Person { get; set; }
 239
 240        public Guid[] PersonIds { get; set; }
 241
 242        public Guid[] ItemIds { get; set; }
 243
 244        public Guid[] OwnerIds { get; set; }
 245
 246        public ExtraType[] ExtraTypes { get; set; }
 247
 248        public Guid[] ExcludeItemIds { get; set; }
 249
 250        public Guid? AdjacentTo { get; set; }
 251
 252        public string[] PersonTypes { get; set; }
 253
 254        public bool? Is3D { get; set; }
 255
 256        public bool? IsHD { get; set; }
 257
 258        public bool? IsLocked { get; set; }
 259
 260        public bool? IsPlaceHolder { get; set; }
 261
 262        public bool? HasImdbId { get; set; }
 263
 264        public bool? HasOverview { get; set; }
 265
 266        public bool? HasTmdbId { get; set; }
 267
 268        public bool? HasOfficialRating { get; set; }
 269
 270        public bool? HasTvdbId { get; set; }
 271
 272        public bool? HasThemeSong { get; set; }
 273
 274        public bool? HasThemeVideo { get; set; }
 275
 276        public bool? HasSubtitles { get; set; }
 277
 278        public bool? HasSpecialFeature { get; set; }
 279
 280        public bool? HasTrailer { get; set; }
 281
 282        public bool? HasParentalRating { get; set; }
 283
 284        public Guid[] StudioIds { get; set; }
 285
 286        public IReadOnlyList<Guid> GenreIds { get; set; }
 287
 288        public ImageType[] ImageTypes { get; set; }
 289
 290        public VideoType[] VideoTypes { get; set; }
 291
 292        public UnratedItem[] BlockUnratedItems { get; set; }
 293
 294        public int[] Years { get; set; }
 295
 296        public string[] Tags { get; set; }
 297
 298        public string[] OfficialRatings { get; set; }
 299
 300        public DateTime? MinPremiereDate { get; set; }
 301
 302        public DateTime? MaxPremiereDate { get; set; }
 303
 304        public DateTime? MinStartDate { get; set; }
 305
 306        public DateTime? MaxStartDate { get; set; }
 307
 308        public DateTime? MinEndDate { get; set; }
 309
 310        public DateTime? MaxEndDate { get; set; }
 311
 312        public bool? IsAiring { get; set; }
 313
 314        public bool? IsMovie { get; set; }
 315
 316        public bool? IsSports { get; set; }
 317
 318        public bool? IsKids { get; set; }
 319
 320        public bool? IsNews { get; set; }
 321
 322        public bool? IsSeries { get; set; }
 323
 324        public int? MinIndexNumber { get; set; }
 325
 326        /// <summary>
 327        /// Gets or sets the minimum ParentIndexNumber and IndexNumber.
 328        /// </summary>
 329        /// <remarks>
 330        /// It produces this where clause:
 331        /// <para>(ParentIndexNumber = X and IndexNumber >= Y) or ParentIndexNumber > X.
 332        /// </para>
 333        /// </remarks>
 334        public (int ParentIndexNumber, int IndexNumber)? MinParentAndIndexNumber { get; set; }
 335
 336        public int? AiredDuringSeason { get; set; }
 337
 338        public double? MinCriticRating { get; set; }
 339
 340        public double? MinCommunityRating { get; set; }
 341
 342        public IReadOnlyList<Guid> ChannelIds { get; set; }
 343
 344        public int? ParentIndexNumber { get; set; }
 345
 346        public int? ParentIndexNumberNotEquals { get; set; }
 347
 348        public int? IndexNumber { get; set; }
 349
 350        public ParentalRatingScore? MinParentalRating { get; set; }
 351
 352        public ParentalRatingScore? MaxParentalRating { get; set; }
 353
 354        public bool? HasDeadParentId { get; set; }
 355
 356        public bool? IsVirtualItem { get; set; }
 357
 358        public Guid ParentId { get; set; }
 359
 360        public BaseItemKind? ParentType { get; set; }
 361
 362        public Guid[] AncestorIds { get; set; }
 363
 364        /// <summary>
 365        /// Gets or sets a list of ancestor ids that the item's linked children must descend from.
 366        /// Useful for filtering BoxSets/Playlists to only those that contain items from a specific library.
 367        /// </summary>
 368        public Guid[] LinkedChildAncestorIds { get; set; }
 369
 370        /// <summary>
 371        /// Gets or sets the id of a folder whose descendants the items must be part of.
 372        /// Unlike <see cref="AncestorIds"/> this also follows the linked children of BoxSets and
 373        /// Playlists, so it reaches the items below a linked folder (a Series' episodes, for example).
 374        /// </summary>
 375        public Guid? DescendantOfId { get; set; }
 376
 377        public Guid[] TopParentIds { get; set; }
 378
 379        public CollectionType?[] PresetViews { get; set; }
 380
 381        public TrailerType[] TrailerTypes { get; set; }
 382
 383        public SourceType[] SourceTypes { get; set; }
 384
 385        public SeriesStatus[] SeriesStatuses { get; set; }
 386
 387        public string? ExternalSeriesId { get; set; }
 388
 389        public string? ExternalId { get; set; }
 390
 391        public Guid[] AlbumIds { get; set; }
 392
 393        public Guid[] ArtistIds { get; set; }
 394
 395        public Guid[] ExcludeArtistIds { get; set; }
 396
 397        public string? AncestorWithPresentationUniqueKey { get; set; }
 398
 399        public string? SeriesPresentationUniqueKey { get; set; }
 400
 401        public bool GroupByPresentationUniqueKey { get; set; }
 402
 403        public bool GroupBySeriesPresentationUniqueKey { get; set; }
 404
 405        public bool EnableTotalRecordCount { get; set; }
 406
 407        public bool ForceDirect { get; set; }
 408
 409        public Dictionary<string, string>? ExcludeProviderIds { get; set; }
 410
 411        public bool EnableGroupByMetadataKey { get; set; }
 412
 413        public bool? HasChapterImages { get; set; }
 414
 415        public IReadOnlyList<(ItemSortBy OrderBy, SortOrder SortOrder)> OrderBy { get; set; }
 416
 417        public DateTime? MinDateCreated { get; set; }
 418
 419        public DateTime? MinDateLastSaved { get; set; }
 420
 421        public DateTime? MinDateLastSavedForUser { get; set; }
 422
 423        public DtoOptions DtoOptions { get; set; }
 424
 425        public string? HasNoAudioTrackWithLanguage { get; set; }
 426
 427        public string? HasNoInternalSubtitleTrackWithLanguage { get; set; }
 428
 429        public string? HasNoExternalSubtitleTrackWithLanguage { get; set; }
 430
 431        public string? HasNoSubtitleTrackWithLanguage { get; set; }
 432
 433        /// <summary>
 434        /// Gets or sets a value indicating whether to return only items nothing names any more.
 435        /// </summary>
 436        public bool? IsDeadArtist { get; set; }
 437
 438        public bool? IsDeadStudio { get; set; }
 439
 440        public bool? IsDeadGenre { get; set; }
 441
 442        /// <summary>
 443        /// Gets or sets a value indicating whether to return only items nothing names any more.
 444        /// </summary>
 445        public bool? IsDeadPerson { get; set; }
 446
 447        /// <summary>
 448        /// Gets or sets a value indicating whether album sub-folders should be returned if they exist.
 449        /// </summary>
 450        public bool? DisplayAlbumFolders { get; set; }
 451
 452        public BaseItem? Parent
 453        {
 454            set
 455            {
 476456                if (value is null)
 457                {
 107458                    ParentId = Guid.Empty;
 107459                    ParentType = null;
 460                }
 461                else
 462                {
 369463                    ParentId = value.Id;
 369464                    ParentType = value.GetBaseItemKind();
 465                }
 369466            }
 467        }
 468
 469        public Dictionary<string, string>? HasAnyProviderId { get; set; }
 470
 471        public Dictionary<string, string[]>? HasAnyProviderIds { get; set; }
 472
 473        public Guid[] AlbumArtistIds { get; set; }
 474
 475        public Guid[] BoxSetLibraryFolders { get; set; }
 476
 477        public Guid[] ContributingArtistIds { get; set; }
 478
 479        public bool? HasAired { get; set; }
 480
 481        public bool? HasOwnerId { get; set; }
 482
 483        /// <summary>
 484        /// Gets or sets a value indicating whether to include items with an OwnerId
 485        /// (additional parts, alternate versions) that are normally excluded from general queries.
 486        /// </summary>
 487        public bool IncludeOwnedItems { get; set; }
 488
 489        /// <summary>
 490        /// Gets or sets a value indicating whether to include alternate versions, which carry a
 491        /// <see cref="Video.PrimaryVersionId"/> and are normally hidden behind the version they
 492        /// belong to. Unlike <see cref="IncludeOwnedItems"/> this keeps the versions a user merged
 493        /// by hand without also returning the parts and extras owned by another item.
 494        /// </summary>
 495        public bool IncludeAlternateVersions { get; set; }
 496
 497        public bool? Is4K { get; set; }
 498
 499        public int? MaxHeight { get; set; }
 500
 501        public int? MaxWidth { get; set; }
 502
 503        public int? MinHeight { get; set; }
 504
 505        public int? MinWidth { get; set; }
 506
 507        public string? SearchTerm { get; set; }
 508
 509        public string? SeriesTimerId { get; set; }
 510
 511        public bool SkipDeserialization { get; set; }
 512
 513        public bool IncludeExtras { get; set; }
 514
 515        public IReadOnlyList<string> AudioLanguages { get; set; }
 516
 517        public IReadOnlyList<string> SubtitleLanguages { get; set; }
 518
 519        /// <summary>
 520        /// Gets a value indicating whether some content in the library is hidden from <see cref="User"/>.
 521        /// Filters that only exist to hide content can be skipped entirely when this is false.
 522        /// </summary>
 523        public bool UserHasContentRestrictions { get; private set; }
 524
 525        public void SetUser(User user)
 526        {
 133527            var maxRating = user.MaxParentalRatingScore;
 131528            if (maxRating.HasValue)
 529            {
 0530                MaxParentalRating = new(maxRating.Value, user.MaxParentalRatingSubScore);
 531            }
 532
 131533            var other = UnratedItem.Other.ToString();
 131534            BlockUnratedItems = user.GetPreference(PreferenceKind.BlockUnratedItems)
 131535                .Where(i => i != other)
 131536                .Select(e => Enum.Parse<UnratedItem>(e, true)).ToArray();
 537
 131538            ExcludeInheritedTags = user.GetPreference(PreferenceKind.BlockedTags)
 131539                .Where(tag => !string.IsNullOrWhiteSpace(tag))
 131540                .Select(tag => tag.RemoveDiacritics().ToLowerInvariant())
 131541                .ToArray();
 542
 131543            IncludeInheritedTags = user.GetPreference(PreferenceKind.AllowedTags)
 131544                .Where(tag => !string.IsNullOrWhiteSpace(tag))
 131545                .Select(tag => tag.RemoveDiacritics().ToLowerInvariant())
 131546                .ToArray();
 547
 131548            UserHasContentRestrictions = user.HasContentRestrictions();
 131549            User = user;
 131550        }
 551
 552        public void ApplyFilters(ItemFilter[] filters)
 553        {
 554            static void ThrowConflictingFilters()
 555                => throw new ArgumentException("Conflicting filters", nameof(filters));
 556
 15557            foreach (var filter in filters)
 558            {
 559                switch (filter)
 560                {
 561                    case ItemFilter.IsFolder:
 1562                        if (filters.Contains(ItemFilter.IsNotFolder))
 563                        {
 1564                            ThrowConflictingFilters();
 565                        }
 566
 0567                        IsFolder = true;
 0568                        break;
 569                    case ItemFilter.IsNotFolder:
 0570                        if (filters.Contains(ItemFilter.IsFolder))
 571                        {
 0572                            ThrowConflictingFilters();
 573                        }
 574
 0575                        IsFolder = false;
 0576                        break;
 577                    case ItemFilter.IsUnplayed:
 0578                        if (filters.Contains(ItemFilter.IsPlayed))
 579                        {
 0580                            ThrowConflictingFilters();
 581                        }
 582
 0583                        IsPlayed = false;
 0584                        break;
 585                    case ItemFilter.IsPlayed:
 1586                        if (filters.Contains(ItemFilter.IsUnplayed))
 587                        {
 1588                            ThrowConflictingFilters();
 589                        }
 590
 0591                        IsPlayed = true;
 0592                        break;
 593                    case ItemFilter.IsFavorite:
 0594                        IsFavorite = true;
 0595                        break;
 596                    case ItemFilter.IsResumable:
 0597                        IsResumable = true;
 0598                        break;
 599                    case ItemFilter.Likes:
 1600                        if (filters.Contains(ItemFilter.Dislikes))
 601                        {
 1602                            ThrowConflictingFilters();
 603                        }
 604
 0605                        IsLiked = true;
 0606                        break;
 607                    case ItemFilter.Dislikes:
 0608                        if (filters.Contains(ItemFilter.Likes))
 609                        {
 0610                            ThrowConflictingFilters();
 611                        }
 612
 0613                        IsLiked = false;
 0614                        break;
 615                    case ItemFilter.IsFavoriteOrLikes:
 0616                        IsFavoriteOrLiked = true;
 617                        break;
 618                }
 619            }
 3620        }
 621    }
 622}