@ -1601,6 +1601,14 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
try
{
var program = string . IsNullOrWhiteSpace ( timer . ProgramId ) ? null : _libraryManager . GetItemList ( new InternalItemsQuery
{
IncludeItemTypes = new [ ] { typeof ( LiveTvProgram ) . Name } ,
Limit = 1 ,
ExternalId = timer . ProgramId
} ) . FirstOrDefault ( ) ;
if ( timer . IsSports )
{
AddGenre ( timer . Genres , "Sports" ) ;
@ -1615,14 +1623,37 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
AddGenre ( timer . Genres , "News" ) ;
}
// dummy this up
if ( program = = null )
{
program = new LiveTvProgram
{
Name = timer . Name ,
HomePageUrl = timer . HomePageUrl ,
ShortOverview = timer . ShortOverview ,
Overview = timer . Overview ,
Genres = timer . Genres ,
CommunityRating = timer . CommunityRating ,
OfficialRating = timer . OfficialRating ,
ProductionYear = timer . ProductionYear ,
PremiereDate = timer . OriginalAirDate ,
IndexNumber = timer . EpisodeNumber ,
ParentIndexNumber = timer . SeasonNumber
} ;
}
if ( timer . IsProgramSeries )
{
SaveSeriesNfo ( timer , recordingPath , seriesPath ) ;
SaveVideoNfo ( timer , recordingPath , false ) ;
SaveSeriesNfo ( timer , seriesPath) ;
SaveVideoNfo ( timer , recordingPath , program , false ) ;
}
else if ( ! timer . IsMovie | | timer . IsSports | | timer . IsNews )
{
SaveVideoNfo ( timer , recordingPath , true ) ;
SaveVideoNfo ( timer , recordingPath , program , true ) ;
}
else
{
SaveVideoNfo ( timer , recordingPath , program , false ) ;
}
}
catch ( Exception ex )
@ -1631,7 +1662,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
}
}
private void SaveSeriesNfo ( TimerInfo timer , string recordingPath, string seriesPath)
private void SaveSeriesNfo ( TimerInfo timer , string seriesPath)
{
var nfoPath = Path . Combine ( seriesPath , "tvshow.nfo" ) ;
@ -1676,7 +1707,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
}
public const string DateAddedFormat = "yyyy-MM-dd HH:mm:ss" ;
private void SaveVideoNfo ( TimerInfo timer , string recordingPath , bool lockData )
private void SaveVideoNfo ( TimerInfo timer , string recordingPath , BaseItem item , bool lockData )
{
var nfoPath = Path . ChangeExtension ( recordingPath , ".nfo" ) ;
@ -1694,6 +1725,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
CloseOutput = false
} ;
var options = _config . GetNfoConfiguration ( ) ;
using ( XmlWriter writer = XmlWriter . Create ( stream , settings ) )
{
writer . WriteStartDocument ( true ) ;
@ -1707,45 +1740,64 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
writer . WriteElementString ( "title" , timer . EpisodeTitle ) ;
}
if ( timer. OriginalAir Date. HasValue )
if ( item. Premiere Date. HasValue )
{
var formatString = _config. GetNfoConfiguration ( ) . ReleaseDateFormat ;
var formatString = options . ReleaseDateFormat ;
writer . WriteElementString ( "aired" , timer. OriginalAir Date. Value . ToLocalTime ( ) . ToString ( formatString ) ) ;
writer . WriteElementString ( "aired" , item. Premiere Date. Value . ToLocalTime ( ) . ToString ( formatString ) ) ;
}
if ( timer. Episode Number. HasValue )
if ( item. Index Number. HasValue )
{
writer . WriteElementString ( "episode" , timer. Episode Number. Value . ToString ( CultureInfo . InvariantCulture ) ) ;
writer . WriteElementString ( "episode" , item. Index Number. Value . ToString ( CultureInfo . InvariantCulture ) ) ;
}
if ( timer. Season Number. HasValue )
if ( item. ParentIndex Number. HasValue )
{
writer . WriteElementString ( "season" , timer. Season Number. Value . ToString ( CultureInfo . InvariantCulture ) ) ;
writer . WriteElementString ( "season" , item. ParentIndex Number. Value . ToString ( CultureInfo . InvariantCulture ) ) ;
}
}
else
{
writer . WriteStartElement ( "movie" ) ;
if ( ! string . IsNullOrWhiteSpace ( timer . Name ) )
if ( ! string . IsNullOrWhiteSpace ( item . Name ) )
{
writer . WriteElementString ( "title" , timer . Name ) ;
writer . WriteElementString ( "title" , item . Name ) ;
}
if ( ! string . IsNullOrWhiteSpace ( item . OriginalTitle ) )
{
writer . WriteElementString ( "originaltitle" , item . OriginalTitle ) ;
}
if ( item . PremiereDate . HasValue )
{
var formatString = options . ReleaseDateFormat ;
writer . WriteElementString ( "premiered" , item . PremiereDate . Value . ToLocalTime ( ) . ToString ( formatString ) ) ;
writer . WriteElementString ( "releasedate" , item . PremiereDate . Value . ToLocalTime ( ) . ToString ( formatString ) ) ;
}
}
writer . WriteElementString ( "dateadded" , DateTime . UtcNow . ToLocalTime ( ) . ToString ( DateAddedFormat ) ) ;
if ( timer . ProductionYear . HasValue )
if ( item . ProductionYear . HasValue )
{
writer . WriteElementString ( "year" , timer . ProductionYear . Value . ToString ( CultureInfo . InvariantCulture ) ) ;
writer . WriteElementString ( "year" , item . ProductionYear . Value . ToString ( CultureInfo . InvariantCulture ) ) ;
}
if ( ! string . IsNullOrEmpty ( timer . OfficialRating ) )
if ( ! string . IsNullOrEmpty ( item . OfficialRating ) )
{
writer . WriteElementString ( "mpaa" , timer . OfficialRating ) ;
writer . WriteElementString ( "mpaa" , item . OfficialRating ) ;
}
if ( ! string . IsNullOrEmpty ( item . OfficialRatingDescription ) )
{
writer . WriteElementString ( "mpaadescription" , item . OfficialRatingDescription ) ;
}
var overview = ( timer . Overview ? ? string . Empty )
var overview = ( item . Overview ? ? string . Empty )
. StripHtml ( )
. Replace ( """ , "'" ) ;
@ -1756,24 +1808,116 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
writer . WriteElementString ( "lockdata" , true . ToString ( ) . ToLower ( ) ) ;
}
if ( timer . CommunityRating . HasValue )
if ( item . CommunityRating . HasValue )
{
writer . WriteElementString ( "rating" , timer . CommunityRating . Value . ToString ( CultureInfo . InvariantCulture ) ) ;
writer . WriteElementString ( "rating" , item . CommunityRating . Value . ToString ( CultureInfo . InvariantCulture ) ) ;
}
foreach ( var genre in timer . Genres )
foreach ( var genre in item . Genres )
{
writer . WriteElementString ( "genre" , genre ) ;
}
if ( ! string . IsNullOrWhiteSpace ( timer . ShortOverview ) )
if ( ! string . IsNullOrWhiteSpace ( item . ShortOverview ) )
{
writer . WriteElementString ( "outline" , timer . ShortOverview ) ;
writer . WriteElementString ( "outline" , item . ShortOverview ) ;
}
if ( ! string . IsNullOrWhiteSpace ( timer . HomePageUrl ) )
if ( ! string . IsNullOrWhiteSpace ( item . HomePageUrl ) )
{
writer . WriteElementString ( "website" , timer . HomePageUrl ) ;
writer . WriteElementString ( "website" , item . HomePageUrl ) ;
}
var people = item . Id = = Guid . Empty ? new List < PersonInfo > ( ) : _libraryManager . GetPeople ( item ) ;
var directors = people
. Where ( i = > IsPersonType ( i , PersonType . Director ) )
. Select ( i = > i . Name )
. ToList ( ) ;
foreach ( var person in directors )
{
writer . WriteElementString ( "director" , person ) ;
}
var writers = people
. Where ( i = > IsPersonType ( i , PersonType . Writer ) )
. Select ( i = > i . Name )
. Distinct ( StringComparer . OrdinalIgnoreCase )
. ToList ( ) ;
foreach ( var person in writers )
{
writer . WriteElementString ( "writer" , person ) ;
}
foreach ( var person in writers )
{
writer . WriteElementString ( "credits" , person ) ;
}
var rt = item . GetProviderId ( MetadataProviders . RottenTomatoes ) ;
if ( ! string . IsNullOrEmpty ( rt ) )
{
writer . WriteElementString ( "rottentomatoesid" , rt ) ;
}
var tmdbCollection = item . GetProviderId ( MetadataProviders . TmdbCollection ) ;
if ( ! string . IsNullOrEmpty ( tmdbCollection ) )
{
writer . WriteElementString ( "collectionnumber" , tmdbCollection ) ;
}
var imdb = item . GetProviderId ( MetadataProviders . Imdb ) ;
if ( ! string . IsNullOrEmpty ( imdb ) )
{
if ( item is Series )
{
writer . WriteElementString ( "imdb_id" , imdb ) ;
}
else
{
writer . WriteElementString ( "imdbid" , imdb ) ;
}
}
var tvdb = item . GetProviderId ( MetadataProviders . Tvdb ) ;
if ( ! string . IsNullOrEmpty ( tvdb ) )
{
writer . WriteElementString ( "tvdbid" , tvdb ) ;
}
var tmdb = item . GetProviderId ( MetadataProviders . Tmdb ) ;
if ( ! string . IsNullOrEmpty ( tmdb ) )
{
writer . WriteElementString ( "tmdbid" , tmdb ) ;
}
if ( item . CriticRating . HasValue )
{
writer . WriteElementString ( "criticrating" , item . CriticRating . Value . ToString ( CultureInfo . InvariantCulture ) ) ;
}
if ( ! string . IsNullOrEmpty ( item . CriticRatingSummary ) )
{
writer . WriteElementString ( "criticratingsummary" , item . CriticRatingSummary ) ;
}
if ( ! string . IsNullOrWhiteSpace ( item . Tagline ) )
{
writer . WriteElementString ( "tagline" , item . Tagline ) ;
}
foreach ( var studio in item . Studios )
{
writer . WriteElementString ( "studio" , studio ) ;
}
if ( item . VoteCount . HasValue )
{
writer . WriteElementString ( "votes" , item . VoteCount . Value . ToString ( CultureInfo . InvariantCulture ) ) ;
}
writer . WriteEndElement ( ) ;
@ -1782,6 +1926,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
}
}
private static bool IsPersonType ( PersonInfo person , string type )
{
return string . Equals ( person . Type , type , StringComparison . OrdinalIgnoreCase ) | | string . Equals ( person . Role , type , StringComparison . OrdinalIgnoreCase ) ;
}
private void AddGenre ( List < string > genres , string genre )
{
if ( ! genres . Contains ( genre , StringComparer . OrdinalIgnoreCase ) )