Skip to content

Commit

Permalink
feat: add hidden flag for tmdb episodes
Browse files Browse the repository at this point in the history
Since I will need it to hide "missing" episodes in a TMDB structure that I never intend to get and don't want to show up in Jellyfin/Shokofin. We already have this for Shoko/AniDB episodes, but in a pure TMDB structured series in Shokofin then we don't use the Shoko/AniDB episodes at all, and most if not all of the episodes that you would want hidden you would probably also not want linked to Shoko/AniDB, so a way to hide them when they're not necessarily linked to Shoko/AniDB was needed.
  • Loading branch information
revam committed Dec 10, 2024
1 parent 6b65930 commit c005739
Show file tree
Hide file tree
Showing 18 changed files with 237 additions and 25 deletions.
54 changes: 51 additions & 3 deletions Shoko.Server/API/v3/Controllers/TmdbController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1248,6 +1248,7 @@ public ActionResult<ListResult<TmdbSeason>> GetTmdbSeasonsByTmdbShowID(
/// <param name="showID">The ID of the show.</param>
/// <param name="include">The optional details to include in the response.</param>
/// <param name="language">The optional language to use for the episode titles.</param>
/// <param name="includeHidden">Whether or not to include hidden episodes.</param>
/// <param name="alternateOrderingID">The optional ID of an alternate ordering.</param>
/// <param name="pageSize">The number of entries to return per page.</param>
/// <param name="page">The page of entries to return.</param>
Expand All @@ -1259,6 +1260,7 @@ public ActionResult<ListResult<TmdbEpisode>> GetTmdbEpisodesByTmdbShowID(
[FromRoute] int showID,
[FromQuery, ModelBinder(typeof(CommaDelimitedModelBinder))] HashSet<TmdbEpisode.IncludeDetails>? include = null,
[FromQuery, ModelBinder(typeof(CommaDelimitedModelBinder))] HashSet<TitleLanguage>? language = null,
[FromQuery] IncludeOnlyFilter includeHidden = IncludeOnlyFilter.False,
[FromQuery, RegularExpression(AlternateOrderingIdRegex)] string? alternateOrderingID = null,
[FromQuery, Range(0, 1000)] int pageSize = 100,
[FromQuery, Range(1, int.MaxValue)] int page = 1,
Expand Down Expand Up @@ -1309,6 +1311,11 @@ public ActionResult<ListResult<TmdbEpisode>> GetTmdbEpisodesByTmdbShowID(
.Select(ordering => (ordering, episode: ordering.TmdbEpisode))
.Where(tuple => tuple.episode is not null)
.OfType<(TMDB_AlternateOrdering_Episode ordering, TMDB_Episode episode)>();
if (includeHidden is not IncludeOnlyFilter.True)
{
var shouldHideHidden = includeHidden is IncludeOnlyFilter.False;
altEpisodes = altEpisodes.Where(t => t.episode.IsHidden == shouldHideHidden);
}
if (seasonNumber is not null && episodeNumber is not null)
altEpisodes = altEpisodes.Where(t => t.episode.SeasonNumber == seasonNumber && t.episode.EpisodeNumber == episodeNumber);
else if (seasonNumber is not null)
Expand All @@ -1326,6 +1333,11 @@ public ActionResult<ListResult<TmdbEpisode>> GetTmdbEpisodesByTmdbShowID(
}

IEnumerable<TMDB_Episode> episodes = show.TmdbEpisodes;
if (includeHidden is not IncludeOnlyFilter.True)
{
var shouldHideHidden = includeHidden is IncludeOnlyFilter.False;
episodes = episodes.Where(e => e.IsHidden == shouldHideHidden);
}
if (seasonNumber is not null && episodeNumber is not null)
episodes = episodes.Where(e => e.SeasonNumber == seasonNumber && e.EpisodeNumber == episodeNumber);
else if (seasonNumber is not null)
Expand Down Expand Up @@ -1842,6 +1854,7 @@ public ActionResult<ListResult<TmdbEpisode>> GetTmdbEpisodesBySeasonID(
[FromRoute, RegularExpression(SeasonIdRegex)] string seasonID,
[FromQuery, ModelBinder(typeof(CommaDelimitedModelBinder))] HashSet<TmdbEpisode.IncludeDetails>? include = null,
[FromQuery, ModelBinder(typeof(CommaDelimitedModelBinder))] HashSet<TitleLanguage>? language = null,
[FromQuery] IncludeOnlyFilter includeHidden = IncludeOnlyFilter.False,
[FromQuery, Range(0, 1000)] int pageSize = 100,
[FromQuery, Range(1, int.MaxValue)] int page = 1
)
Expand All @@ -1856,8 +1869,17 @@ public ActionResult<ListResult<TmdbEpisode>> GetTmdbEpisodesBySeasonID(
if (altShow is null)
return NotFound(ShowNotFoundBySeasonID);

return altOrderSeason.TmdbAlternateOrderingEpisodes
.ToListResult(e => new TmdbEpisode(altShow, e.TmdbEpisode!, e, include?.CombineFlags(), language), page, pageSize);
var altEpisodes = altOrderSeason.TmdbAlternateOrderingEpisodes
.Select(ordering => (ordering, episode: ordering.TmdbEpisode))
.Where(tuple => tuple.episode is not null)
.OfType<(TMDB_AlternateOrdering_Episode ordering, TMDB_Episode episode)>();
if (includeHidden is not IncludeOnlyFilter.True)
{
var shouldHideHidden = includeHidden is IncludeOnlyFilter.False;
altEpisodes = altEpisodes.Where(t => t.episode.IsHidden == shouldHideHidden);
}
return altEpisodes
.ToListResult(t => new TmdbEpisode(altShow, t.episode, t.ordering, include?.CombineFlags(), language), page, pageSize);
}

var seasonId = int.Parse(seasonID);
Expand All @@ -1869,7 +1891,13 @@ public ActionResult<ListResult<TmdbEpisode>> GetTmdbEpisodesBySeasonID(
if (show is null)
return NotFound(ShowNotFoundBySeasonID);

return season.TmdbEpisodes
IEnumerable<TMDB_Episode> episodes = season.TmdbEpisodes;
if (includeHidden is not IncludeOnlyFilter.True)
{
var shouldHideHidden = includeHidden is IncludeOnlyFilter.False;
episodes = episodes.Where(e => e.IsHidden == shouldHideHidden);
}
return episodes
.ToListResult(e => new TmdbEpisode(show, e, include?.CombineFlags(), language), page, pageSize);
}

Expand Down Expand Up @@ -2195,6 +2223,26 @@ [FromRoute] int episodeID

#endregion

#region Actions

[HttpPost("Episode/{episodeID}/Action/SetHiddenState")]
public ActionResult SetHiddenStateForTmdbEpisodeByEpisodeID(
[FromRoute] int episodeID,
[FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] TmdbEpisode.SetHiddenStateForTmdbEpisodeByEpisodeIDRequestBody? body
)
{
var episode = RepoFactory.TMDB_Episode.GetByTmdbEpisodeID(episodeID);
if (episode is null)
return NotFound(EpisodeNotFound);

episode.IsHidden = body?.Value ?? true;
RepoFactory.TMDB_Episode.Save(episode);

return Ok();
}

#endregion

#region Same-Source Linked Entries

[HttpGet("Episode/{episodeID}/Show")]
Expand Down
17 changes: 17 additions & 0 deletions Shoko.Server/API/v3/Models/TMDB/Episode.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
Expand Down Expand Up @@ -63,6 +64,12 @@ public class Episode
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public IReadOnlyList<Overview>? Overviews { get; init; }

/// <summary>
/// Indicates that the episode should be hidden from view unless explicitly
/// requested, and should now be used internally at all.
/// </summary>
public bool IsHidden { get; init; }

/// <summary>
/// The episode number for the main ordering or alternate ordering in use.
/// </summary>
Expand Down Expand Up @@ -161,6 +168,7 @@ public Episode(TMDB_Show show, TMDB_Episode episode, TMDB_AlternateOrdering_Epis
if (include.HasFlag(IncludeDetails.Overviews))
Overviews = episode.GetAllOverviews()
.ToDto(episode.EnglishOverview, preferredOverview, language);
IsHidden = episode.IsHidden;

if (alternateOrderingEpisode != null)
{
Expand Down Expand Up @@ -356,6 +364,15 @@ public CrossReference(CrossRef_AniDB_TMDB_Episode xref, int? index = null)
}
}

public class SetHiddenStateForTmdbEpisodeByEpisodeIDRequestBody
{
/// <summary>
/// The new hidden state of the episode.
/// </summary>
[DefaultValue(true)]
public bool Value { get; set; } = true;
}

[Flags]
[JsonConverter(typeof(StringEnumConverter))]
public enum IncludeDetails
Expand Down
7 changes: 7 additions & 0 deletions Shoko.Server/API/v3/Models/TMDB/Season.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ public class Season
/// </summary>
public int EpisodeCount { get; init; }

/// <summary>
/// Count of hidden episodes associated with the season.
/// </summary>
public int HiddenEpisodeCount { get; init; }

/// <summary>
/// Indicates the alternate ordering season is locked. Will not be set if
/// <seealso cref="AlternateOrderingID"/> is not set.
Expand Down Expand Up @@ -131,6 +136,7 @@ public Season(TMDB_Season season, IncludeDetails? includeDetails = null, IReadOn
.ToList();
SeasonNumber = season.SeasonNumber;
EpisodeCount = season.EpisodeCount;
HiddenEpisodeCount = season.HiddenEpisodeCount;
IsLocked = null;
CreatedAt = season.CreatedAt.ToUniversalTime();
LastUpdatedAt = season.LastUpdatedAt.ToUniversalTime();
Expand All @@ -153,6 +159,7 @@ public Season(TMDB_AlternateOrdering_Season season, IncludeDetails? includeDetai
Images = new();
SeasonNumber = season.SeasonNumber;
EpisodeCount = season.EpisodeCount;
HiddenEpisodeCount = season.HiddenEpisodeCount;
IsLocked = season.IsLocked;
CreatedAt = season.CreatedAt.ToUniversalTime();
LastUpdatedAt = season.LastUpdatedAt.ToUniversalTime();
Expand Down
14 changes: 14 additions & 0 deletions Shoko.Server/API/v3/Models/TMDB/Show.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@ public class Show
/// </summary>
public int EpisodeCount { get; init; }

/// <summary>
/// Count of hidden episodes associated with the show.
/// </summary>
public int HiddenEpisodeCount { get; init; }

/// <summary>
/// Count of seasons associated with the show.
/// </summary>
Expand Down Expand Up @@ -224,11 +229,13 @@ public Show(TMDB_Show show, TMDB_AlternateOrdering? alternateOrdering, IncludeDe
if (alternateOrdering != null)
{
EpisodeCount = alternateOrdering.EpisodeCount;
HiddenEpisodeCount = alternateOrdering.HiddenEpisodeCount;
SeasonCount = alternateOrdering.SeasonCount;
}
else
{
EpisodeCount = show.EpisodeCount;
HiddenEpisodeCount = show.HiddenEpisodeCount;
SeasonCount = show.SeasonCount;
}
AlternateOrderingCount = show.AlternateOrderingCount;
Expand Down Expand Up @@ -286,6 +293,11 @@ public class OrderingInformation
/// </summary>
public int EpisodeCount { get; init; }

/// <summary>
/// The number of hidden episodes in the ordering scheme.
/// </summary>
public int HiddenEpisodeCount { get; init; }

/// <summary>
/// The number of seasons in the ordering scheme.
/// </summary>
Expand All @@ -312,6 +324,7 @@ public OrderingInformation(TMDB_Show show, TMDB_AlternateOrdering? alternateOrde
OrderingName = "Seasons";
OrderingType = null;
EpisodeCount = show.EpisodeCount;
HiddenEpisodeCount = show.HiddenEpisodeCount;
SeasonCount = show.SeasonCount;
IsDefault = true;
IsPreferred = string.IsNullOrEmpty(show.PreferredAlternateOrderingID) || string.Equals(show.Id.ToString(), show.PreferredAlternateOrderingID);
Expand All @@ -324,6 +337,7 @@ public OrderingInformation(TMDB_Show show, TMDB_AlternateOrdering ordering, TMDB
OrderingName = ordering.EnglishTitle;
OrderingType = ordering.Type;
EpisodeCount = ordering.EpisodeCount;
HiddenEpisodeCount = ordering.HiddenEpisodeCount;
SeasonCount = ordering.SeasonCount;
IsDefault = false;
IsPreferred = string.Equals(ordering.TmdbEpisodeGroupCollectionID, show.PreferredAlternateOrderingID);
Expand Down
7 changes: 6 additions & 1 deletion Shoko.Server/Databases/MySQL.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace Shoko.Server.Databases;
public class MySQL : BaseDatabase<MySqlConnection>
{
public override string Name { get; } = "MySQL";
public override int RequiredVersion { get; } = 144;
public override int RequiredVersion { get; } = 145;

private List<DatabaseCommand> createVersionTable = new()
{
Expand Down Expand Up @@ -859,6 +859,11 @@ public class MySQL : BaseDatabase<MySqlConnection>
new(143, 2, "ALTER TABLE `TMDB_Show` CHANGE COLUMN `ProductionCountries` `ProductionCountries` VARCHAR(255) NULL;"),
new(144, 1, "CREATE INDEX IX_TMDB_Episode_TmdbSeasonID ON TMDB_Episode(TmdbSeasonID);"),
new(144, 2, "CREATE INDEX IX_TMDB_Episode_TmdbShowID ON TMDB_Episode(TmdbShowID);"),
new(145, 1, "ALTER TABLE `TMDB_Episode` ADD COLUMN `IsHidden` int NOT NULL DEFAULT 0;"),
new(145, 2, "ALTER TABLE `TMDB_Season` ADD COLUMN `HiddenEpisodeCount` int NOT NULL DEFAULT 0;"),
new(145, 3, "ALTER TABLE `TMDB_Show` ADD COLUMN `HiddenEpisodeCount` int NOT NULL DEFAULT 0;"),
new(145, 4, "ALTER TABLE `TMDB_AlternateOrdering_Season` ADD COLUMN `HiddenEpisodeCount` int NOT NULL DEFAULT 0;"),
new(145, 5, "ALTER TABLE `TMDB_AlternateOrdering` ADD COLUMN `HiddenEpisodeCount` int NOT NULL DEFAULT 0;"),
};

private DatabaseCommand linuxTableVersionsFix = new("RENAME TABLE versions TO Versions;");
Expand Down
7 changes: 6 additions & 1 deletion Shoko.Server/Databases/SQLServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ namespace Shoko.Server.Databases;
public class SQLServer : BaseDatabase<SqlConnection>
{
public override string Name { get; } = "SQLServer";
public override int RequiredVersion { get; } = 136;
public override int RequiredVersion { get; } = 137;

public override void BackupDatabase(string fullfilename)
{
Expand Down Expand Up @@ -789,6 +789,11 @@ public override bool HasVersionsTable()
new DatabaseCommand(135, 2, "ALTER TABLE TMDB_Show ALTER COLUMN ProductionCountries NVARCHAR(255) NULL;"),
new DatabaseCommand(136, 1, "CREATE INDEX IX_TMDB_Episode_TmdbSeasonID ON TMDB_Episode(TmdbSeasonID);"),
new DatabaseCommand(136, 2, "CREATE INDEX IX_TMDB_Episode_TmdbShowID ON TMDB_Episode(TmdbShowID);"),
new DatabaseCommand(137, 1, "ALTER TABLE TMDB_Episode ADD IsHidden int NOT NULL DEFAULT 0;"),
new DatabaseCommand(137, 2, "ALTER TABLE TMDB_Season ADD HiddenEpisodeCount int NOT NULL DEFAULT 0;"),
new DatabaseCommand(137, 3, "ALTER TABLE TMDB_Show ADD HiddenEpisodeCount int NOT NULL DEFAULT 0;"),
new DatabaseCommand(137, 4, "ALTER TABLE TMDB_AlternateOrdering_Season ADD HiddenEpisodeCount int NOT NULL DEFAULT 0;"),
new DatabaseCommand(137, 5, "ALTER TABLE TMDB_AlternateOrdering ADD HiddenEpisodeCount int NOT NULL DEFAULT 0;"),
};

private static void AlterImdbMovieIDType()
Expand Down
7 changes: 6 additions & 1 deletion Shoko.Server/Databases/SQLite.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class SQLite : BaseDatabase<SqliteConnection>
{
public override string Name => "SQLite";

public override int RequiredVersion => 127;
public override int RequiredVersion => 128;

public override void BackupDatabase(string fullfilename)
{
Expand Down Expand Up @@ -782,6 +782,11 @@ public override void CreateDatabase()
new(126, 1, "CREATE INDEX IX_AniDB_Anime_Relation_RelatedAnimeID on AniDB_Anime_Relation(RelatedAnimeID);"),
new(127, 1, "CREATE INDEX IX_TMDB_Episode_TmdbSeasonID ON TMDB_Episode(TmdbSeasonID);"),
new(127, 2, "CREATE INDEX IX_TMDB_Episode_TmdbShowID ON TMDB_Episode(TmdbShowID);"),
new(128, 1, "ALTER TABLE TMDB_Episode ADD COLUMN IsHidden INTEGER NOT NULL DEFAULT 0;"),
new(128, 2, "ALTER TABLE TMDB_Season ADD COLUMN HiddenEpisodeCount INTEGER NOT NULL DEFAULT 0;"),
new(128, 3, "ALTER TABLE TMDB_Show ADD COLUMN HiddenEpisodeCount INTEGER NOT NULL DEFAULT 0;"),
new(128, 4, "ALTER TABLE TMDB_AlternateOrdering_Season ADD COLUMN HiddenEpisodeCount INTEGER NOT NULL DEFAULT 0;"),
new(128, 5, "ALTER TABLE TMDB_AlternateOrdering ADD COLUMN HiddenEpisodeCount INTEGER NOT NULL DEFAULT 0;"),
};

private static Tuple<bool, string> MigrateRenamers(object connection)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public TMDB_AlternateOrderingMap()
Map(x => x.EnglishTitle).Not.Nullable();
Map(x => x.EnglishOverview).Not.Nullable();
Map(x => x.EpisodeCount).Not.Nullable();
Map(x => x.HiddenEpisodeCount).Not.Nullable();
Map(x => x.SeasonCount).Not.Nullable();
Map(x => x.Type).Not.Nullable().CustomType<AlternateOrderingType>();
Map(x => x.CreatedAt).Not.Nullable();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public TMDB_AlternateOrdering_SeasonMap()
Map(x => x.TmdbEpisodeGroupID).Not.Nullable();
Map(x => x.EnglishTitle).Not.Nullable();
Map(x => x.EpisodeCount).Not.Nullable();
Map(x => x.HiddenEpisodeCount).Not.Nullable();
Map(x => x.SeasonNumber).Not.Nullable();
Map(x => x.IsLocked).Not.Nullable();
Map(x => x.CreatedAt).Not.Nullable();
Expand Down
3 changes: 2 additions & 1 deletion Shoko.Server/Mappings/TMDB/TMDB_EpisodeMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ public TMDB_EpisodeMap()
Map(x => x.TvdbEpisodeID).Nullable();
Map(x => x.EnglishTitle).Not.Nullable();
Map(x => x.EnglishOverview).Not.Nullable();
Map(x => x.EpisodeNumber).Not.Nullable();
Map(x => x.IsHidden).Not.Nullable();
Map(x => x.SeasonNumber).Not.Nullable();
Map(x => x.EpisodeNumber).Not.Nullable();
Map(x => x.RuntimeMinutes).Column("Runtime");
Map(x => x.UserRating).Not.Nullable();
Map(x => x.UserVotes).Not.Nullable();
Expand Down
1 change: 1 addition & 0 deletions Shoko.Server/Mappings/TMDB/TMDB_SeasonMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public TMDB_SeasonMap()
Map(x => x.EnglishTitle).Not.Nullable();
Map(x => x.EnglishOverview).Not.Nullable();
Map(x => x.EpisodeCount).Not.Nullable();
Map(x => x.HiddenEpisodeCount).Not.Nullable();
Map(x => x.SeasonNumber).Not.Nullable();
Map(x => x.CreatedAt).Not.Nullable();
Map(x => x.LastUpdatedAt).Not.Nullable();
Expand Down
1 change: 1 addition & 0 deletions Shoko.Server/Mappings/TMDB/TMDB_ShowMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public TMDB_ShowMap()
Map(x => x.ContentRatings).Not.Nullable().CustomType<TmdbContentRatingConverter>();
Map(x => x.ProductionCountries).Not.Nullable().CustomType<TmdbProductionCountryConverter>();
Map(x => x.EpisodeCount).Not.Nullable();
Map(x => x.HiddenEpisodeCount).Not.Nullable();
Map(x => x.SeasonCount).Not.Nullable();
Map(x => x.AlternateOrderingCount).Not.Nullable();
Map(x => x.UserRating).Not.Nullable();
Expand Down
6 changes: 5 additions & 1 deletion Shoko.Server/Models/TMDB/Optional/TMDB_AlternateOrdering.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@ public class TMDB_AlternateOrdering : TMDB_Base<string>
/// </summary>
public int EpisodeCount { get; set; }

/// <summary>
/// Number of episodes within the season that are hidden.
/// </summary>
public int HiddenEpisodeCount { get; set; }

/// <summary>
/// Number of seasons within the episode group.
/// </summary>
Expand Down Expand Up @@ -101,7 +106,6 @@ public bool Populate(TvGroupCollection collection, int showId)
UpdateProperty(TmdbNetworkID, collection.Network?.Id, v => TmdbNetworkID = v),
UpdateProperty(EnglishTitle, collection.Name, v => EnglishTitle = v),
UpdateProperty(EnglishOverview, collection.Description, v => EnglishOverview = v),
UpdateProperty(EpisodeCount, collection.EpisodeCount, v => EpisodeCount = v),
UpdateProperty(SeasonCount, collection.GroupCount, v => SeasonCount = v),
UpdateProperty(Type, Enum.Parse<AlternateOrderingType>(collection.Type.ToString()), v => Type = v),
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ public class TMDB_AlternateOrdering_Season : TMDB_Base<string>
/// </summary>
public int EpisodeCount { get; set; }

/// <summary>
/// Number of episodes within the season that are hidden.
/// </summary>
public int HiddenEpisodeCount { get; set; }

/// <summary>
/// Indicates the alternate ordering season is locked.
/// </summary>
Expand Down Expand Up @@ -90,7 +95,6 @@ public bool Populate(TvGroup episodeGroup, string collectionId, int showId, int
UpdateProperty(TmdbEpisodeGroupCollectionID, collectionId, v => TmdbEpisodeGroupCollectionID = v),
UpdateProperty(EnglishTitle, episodeGroup.Name, v => EnglishTitle = v),
UpdateProperty(SeasonNumber, seasonNumber, v => SeasonNumber = v),
UpdateProperty(EpisodeCount, episodeGroup.Episodes.Count, v => EpisodeCount = v),
UpdateProperty(IsLocked, episodeGroup.Locked, v => IsLocked = v),
};

Expand Down
6 changes: 6 additions & 0 deletions Shoko.Server/Models/TMDB/TMDB_Episode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ public class TMDB_Episode : TMDB_Base<int>, IEntityMetadata, IEpisode
/// </summary>
public string EnglishOverview { get; set; } = string.Empty;

/// <summary>
/// Indicates that the episode should be hidden from view unless explicitly
/// requested, and should now be used internally at all.
/// </summary>
public bool IsHidden { get; set; }

/// <summary>
/// Season number for default ordering.
/// </summary>
Expand Down
Loading

0 comments on commit c005739

Please sign in to comment.