@ -1,19 +1,19 @@
using MediaBrowser.Controller.Providers ;
using MediaBrowser.Model.Configuration ;
using MediaBrowser.Model.Entities ;
using System ;
using System.Collections.Generic ;
using System.Globalization ;
using System.Linq ;
using MediaBrowser.Model.IO ;
using MediaBrowser.Model.Serialization ;
namespace MediaBrowser.Controller.Entities.TV
{
/// <summary>
/// Class Episode
/// </summary>
public class Episode : Video , IHasTrailers , IHasLookupInfo < EpisodeInfo > , IHasSeries
using MediaBrowser.Controller.Providers ;
using MediaBrowser.Model.Configuration ;
using MediaBrowser.Model.Entities ;
using System ;
using System.Collections.Generic ;
using System.Globalization ;
using System.Linq ;
using MediaBrowser.Model.IO ;
using MediaBrowser.Model.Serialization ;
namespace MediaBrowser.Controller.Entities.TV
{
/// <summary>
/// Class Episode
/// </summary>
public class Episode : Video , IHasTrailers , IHasLookupInfo < EpisodeInfo > , IHasSeries
{
public Episode ( )
{
@ -26,35 +26,35 @@ namespace MediaBrowser.Controller.Entities.TV
public List < Guid > RemoteTrailerIds { get ; set ; }
public List < MediaUrl > RemoteTrailers { get ; set ; }
/// <summary>
/// Gets the season in which it aired.
/// </summary>
/// <value>The aired season.</value>
public int? AirsBeforeSeasonNumber { get ; set ; }
public int? AirsAfterSeasonNumber { get ; set ; }
public int? AirsBeforeEpisodeNumber { get ; set ; }
/// <summary>
/// Gets or sets the DVD season number.
/// </summary>
/// <value>The DVD season number.</value>
public int? DvdSeasonNumber { get ; set ; }
/// <summary>
/// Gets or sets the DVD episode number.
/// </summary>
/// <value>The DVD episode number.</value>
public float? DvdEpisodeNumber { get ; set ; }
/// <summary>
/// Gets or sets the absolute episode number.
/// </summary>
/// <value>The absolute episode number.</value>
public int? AbsoluteEpisodeNumber { get ; set ; }
/// <summary>
/// This is the ending episode number for double episodes.
/// </summary>
/// <value>The index number.</value>
/// <summary>
/// Gets the season in which it aired.
/// </summary>
/// <value>The aired season.</value>
public int? AirsBeforeSeasonNumber { get ; set ; }
public int? AirsAfterSeasonNumber { get ; set ; }
public int? AirsBeforeEpisodeNumber { get ; set ; }
/// <summary>
/// Gets or sets the DVD season number.
/// </summary>
/// <value>The DVD season number.</value>
public int? DvdSeasonNumber { get ; set ; }
/// <summary>
/// Gets or sets the DVD episode number.
/// </summary>
/// <value>The DVD episode number.</value>
public float? DvdEpisodeNumber { get ; set ; }
/// <summary>
/// Gets or sets the absolute episode number.
/// </summary>
/// <value>The absolute episode number.</value>
public int? AbsoluteEpisodeNumber { get ; set ; }
/// <summary>
/// This is the ending episode number for double episodes.
/// </summary>
/// <value>The index number.</value>
public int? IndexNumberEnd { get ; set ; }
public string FindSeriesSortName ( )
@ -62,56 +62,56 @@ namespace MediaBrowser.Controller.Entities.TV
var series = Series ;
return series = = null ? SeriesName : series . SortName ;
}
[IgnoreDataMember]
protected override bool SupportsOwnedItems
{
get
{
return IsStacked | | MediaSourceCount > 1 ;
}
[IgnoreDataMember]
protected override bool SupportsOwnedItems
{
get
{
return IsStacked | | MediaSourceCount > 1 ;
}
}
[IgnoreDataMember]
public override bool SupportsInheritedParentImages
{
get { return true ; }
}
[IgnoreDataMember]
public int? AiredSeasonNumber
{
get
{
return AirsAfterSeasonNumber ? ? AirsBeforeSeasonNumber ? ? ParentIndexNumber ;
}
}
[IgnoreDataMember]
public override Folder LatestItemsIndexContainer
{
get
{
return Series ;
}
}
[IgnoreDataMember]
public override Guid ? DisplayParentId
{
get
{
return SeasonId ;
}
}
[IgnoreDataMember]
protected override bool EnableDefaultVideoUserDataKeys
{
get
{
return false ;
}
}
[IgnoreDataMember]
public int? AiredSeasonNumber
{
get
{
return AirsAfterSeasonNumber ? ? AirsBeforeSeasonNumber ? ? ParentIndexNumber ;
}
}
[IgnoreDataMember]
public override Folder LatestItemsIndexContainer
{
get
{
return Series ;
}
}
[IgnoreDataMember]
public override Guid ? DisplayParentId
{
get
{
return SeasonId ;
}
}
[IgnoreDataMember]
protected override bool EnableDefaultVideoUserDataKeys
{
get
{
return false ;
}
}
public override double? GetDefaultPrimaryImageAspectRatio ( )
@ -120,64 +120,64 @@ namespace MediaBrowser.Controller.Entities.TV
value / = 9 ;
return value ;
}
public override List < string > GetUserDataKeys ( )
{
var list = base . GetUserDataKeys ( ) ;
var series = Series ;
if ( series ! = null & & ParentIndexNumber . HasValue & & IndexNumber . HasValue )
{
var seriesUserDataKeys = series . GetUserDataKeys ( ) ;
var take = seriesUserDataKeys . Count ;
if ( seriesUserDataKeys . Count > 1 )
{
take - - ;
}
list . InsertRange ( 0 , seriesUserDataKeys . Take ( take ) . Select ( i = > i + ParentIndexNumber . Value . ToString ( "000" ) + IndexNumber . Value . ToString ( "000" ) ) ) ;
}
return list ;
}
/// <summary>
/// This Episode's Series Instance
/// </summary>
/// <value>The series.</value>
[IgnoreDataMember]
public Series Series
{
get
{
}
public override List < string > GetUserDataKeys ( )
{
var list = base . GetUserDataKeys ( ) ;
var series = Series ;
if ( series ! = null & & ParentIndexNumber . HasValue & & IndexNumber . HasValue )
{
var seriesUserDataKeys = series . GetUserDataKeys ( ) ;
var take = seriesUserDataKeys . Count ;
if ( seriesUserDataKeys . Count > 1 )
{
take - - ;
}
list . InsertRange ( 0 , seriesUserDataKeys . Take ( take ) . Select ( i = > i + ParentIndexNumber . Value . ToString ( "000" ) + IndexNumber . Value . ToString ( "000" ) ) ) ;
}
return list ;
}
/// <summary>
/// This Episode's Series Instance
/// </summary>
/// <value>The series.</value>
[IgnoreDataMember]
public Series Series
{
get
{
var seriesId = SeriesId ? ? FindSeriesId ( ) ;
return seriesId . HasValue ? ( LibraryManager . GetItemById ( seriesId . Value ) as Series ) : null ;
}
}
[IgnoreDataMember]
public Season Season
{
get
{
return seriesId . HasValue ? ( LibraryManager . GetItemById ( seriesId . Value ) as Series ) : null ;
}
}
[IgnoreDataMember]
public Season Season
{
get
{
var seasonId = SeasonId ? ? FindSeasonId ( ) ;
return seasonId . HasValue ? ( LibraryManager . GetItemById ( seasonId . Value ) as Season ) : null ;
}
}
[IgnoreDataMember]
public bool IsInSeasonFolder
{
get
{
return FindParent < Season > ( ) ! = null ;
}
return seasonId . HasValue ? ( LibraryManager . GetItemById ( seasonId . Value ) as Season ) : null ;
}
}
[IgnoreDataMember]
public bool IsInSeasonFolder
{
get
{
return FindParent < Season > ( ) ! = null ;
}
}
[IgnoreDataMember]
public string SeriesPresentationUniqueKey { get ; set ; }
[IgnoreDataMember]
[IgnoreDataMember]
public string SeriesName { get ; set ; }
[IgnoreDataMember]
@ -187,17 +187,17 @@ namespace MediaBrowser.Controller.Entities.TV
{
var series = Series ;
return series = = null ? null : series . PresentationUniqueKey ;
}
public string FindSeasonName ( )
}
public string FindSeasonName ( )
{
var season = Season ;
if ( season = = null )
{
if ( ParentIndexNumber . HasValue )
{
return "Season " + ParentIndexNumber . Value . ToString ( CultureInfo . InvariantCulture ) ;
var season = Season ;
if ( season = = null )
{
if ( ParentIndexNumber . HasValue )
{
return "Season " + ParentIndexNumber . Value . ToString ( CultureInfo . InvariantCulture ) ;
}
return "Season Unknown" ;
}
@ -231,92 +231,92 @@ namespace MediaBrowser.Controller.Entities.TV
}
return season = = null ? ( Guid ? ) null : season . Id ;
}
/// <summary>
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
protected override string CreateSortName Internal ( )
{
return ( ParentIndexNumber ! = null ? ParentIndexNumber . Value . ToString ( "000 - " ) : "" )
+ ( IndexNumber ! = null ? IndexNumber . Value . ToString ( "0000 - " ) : "" ) + Name ;
}
/// <summary>
/// Determines whether [contains episode number] [the specified number].
/// </summary>
/// <param name="number">The number.</param>
/// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
public bool ContainsEpisodeNumber ( int number )
{
if ( IndexNumber . HasValue )
{
if ( IndexNumberEnd . HasValue )
{
return number > = IndexNumber . Value & & number < = IndexNumberEnd . Value ;
}
return IndexNumber . Value = = number ;
}
return false ;
}
[IgnoreDataMember]
public override bool SupportsRemoteImageDownloading
{
get
{
if ( IsMissingEpisode )
{
return false ;
}
return true ;
}
}
[IgnoreDataMember]
public bool IsMissingEpisode
{
get
{
return LocationType = = LocationType . Virtual & & ! IsUnaired ;
}
}
[IgnoreDataMember]
public bool IsVirtualUnaired
{
get { return LocationType = = LocationType . Virtual & & IsUnaired ; }
}
[IgnoreDataMember]
}
/// <summary>
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
protected override string CreateSortName ( )
{
return ( ParentIndexNumber ! = null ? ParentIndexNumber . Value . ToString ( "000 - " ) : "" )
+ ( IndexNumber ! = null ? IndexNumber . Value . ToString ( "0000 - " ) : "" ) + Name ;
}
/// <summary>
/// Determines whether [contains episode number] [the specified number].
/// </summary>
/// <param name="number">The number.</param>
/// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
public bool ContainsEpisodeNumber ( int number )
{
if ( IndexNumber . HasValue )
{
if ( IndexNumberEnd . HasValue )
{
return number > = IndexNumber . Value & & number < = IndexNumberEnd . Value ;
}
return IndexNumber . Value = = number ;
}
return false ;
}
[IgnoreDataMember]
public override bool SupportsRemoteImageDownloading
{
get
{
if ( IsMissingEpisode )
{
return false ;
}
return true ;
}
}
[IgnoreDataMember]
public bool IsMissingEpisode
{
get
{
return LocationType = = LocationType . Virtual & & ! IsUnaired ;
}
}
[IgnoreDataMember]
public bool IsVirtualUnaired
{
get { return LocationType = = LocationType . Virtual & & IsUnaired ; }
}
[IgnoreDataMember]
public Guid ? SeasonId { get ; set ; }
[IgnoreDataMember]
public Guid ? SeriesId { get ; set ; }
public Guid ? FindSeriesId ( )
{
var series = FindParent < Series > ( ) ;
var series = FindParent < Series > ( ) ;
return series = = null ? ( Guid ? ) null : series . Id ;
}
public override IEnumerable < Guid > GetAncestorIds ( )
{
var list = base . GetAncestorIds ( ) . ToList ( ) ;
var seasonId = SeasonId ;
if ( seasonId . HasValue & & ! list . Contains ( seasonId . Value ) )
{
list . Add ( seasonId . Value ) ;
}
return list ;
}
}
public override IEnumerable < Guid > GetAncestorIds ( )
{
var list = base . GetAncestorIds ( ) . ToList ( ) ;
var seasonId = SeasonId ;
if ( seasonId . HasValue & & ! list . Contains ( seasonId . Value ) )
{
list . Add ( seasonId . Value ) ;
}
return list ;
}
public override IEnumerable < FileSystemMetadata > GetDeletePaths ( )
{
return new [ ] {
@ -327,60 +327,60 @@ namespace MediaBrowser.Controller.Entities.TV
}
} . Concat ( GetLocalMetadataFilesToDelete ( ) ) ;
}
public override UnratedItem GetBlockUnratedType ( )
{
return UnratedItem . Series ;
}
public EpisodeInfo GetLookupInfo ( )
{
var id = GetItemLookupInfo < EpisodeInfo > ( ) ;
var series = Series ;
if ( series ! = null )
{
id . SeriesProviderIds = series . ProviderIds ;
}
id . IsMissingEpisode = IsMissingEpisode ;
id . IndexNumberEnd = IndexNumberEnd ;
id . IsVirtualUnaired = IsVirtualUnaired ;
return id ;
}
public override bool BeforeMetadataRefresh ( )
{
var hasChanges = base . BeforeMetadataRefresh ( ) ;
try
{
if ( LibraryManager . FillMissingEpisodeNumbersFromPath ( this ) )
{
hasChanges = true ;
}
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error in FillMissingEpisodeNumbersFromPath. Episode: {0}" , ex , Path ? ? Name ? ? Id . ToString ( ) ) ;
}
if ( ! ParentIndexNumber . HasValue )
{
var season = Season ;
if ( season ! = null )
{
if ( season . ParentIndexNumber . HasValue )
{
ParentIndexNumber = season . ParentIndexNumber ;
hasChanges = true ;
}
}
}
return hasChanges ;
}
}
}
public override UnratedItem GetBlockUnratedType ( )
{
return UnratedItem . Series ;
}
public EpisodeInfo GetLookupInfo ( )
{
var id = GetItemLookupInfo < EpisodeInfo > ( ) ;
var series = Series ;
if ( series ! = null )
{
id . SeriesProviderIds = series . ProviderIds ;
}
id . IsMissingEpisode = IsMissingEpisode ;
id . IndexNumberEnd = IndexNumberEnd ;
id . IsVirtualUnaired = IsVirtualUnaired ;
return id ;
}
public override bool BeforeMetadataRefresh ( )
{
var hasChanges = base . BeforeMetadataRefresh ( ) ;
try
{
if ( LibraryManager . FillMissingEpisodeNumbersFromPath ( this ) )
{
hasChanges = true ;
}
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error in FillMissingEpisodeNumbersFromPath. Episode: {0}" , ex , Path ? ? Name ? ? Id . ToString ( ) ) ;
}
if ( ! ParentIndexNumber . HasValue )
{
var season = Season ;
if ( season ! = null )
{
if ( season . ParentIndexNumber . HasValue )
{
ParentIndexNumber = season . ParentIndexNumber ;
hasChanges = true ;
}
}
}
return hasChanges ;
}
}
}