using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.LiveTv; using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Common.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.LiveTv { public class LiveTvProgram : BaseItem, IHasLookupInfo, IHasStartDate, IHasProgramAttributes { public LiveTvProgram() { IsVirtualItem = true; } public override List GetUserDataKeys() { var list = base.GetUserDataKeys(); if (!IsSeries) { var key = this.GetProviderId(MetadataProviders.Imdb); if (!string.IsNullOrWhiteSpace(key)) { list.Insert(0, key); } key = this.GetProviderId(MetadataProviders.Tmdb); if (!string.IsNullOrWhiteSpace(key)) { list.Insert(0, key); } } else if (!string.IsNullOrWhiteSpace(EpisodeTitle)) { var name = GetClientTypeName(); list.Insert(0, name + "-" + Name + (EpisodeTitle ?? string.Empty)); } return list; } private static string EmbyServiceName = "Emby"; public override double? GetDefaultPrimaryImageAspectRatio() { var serviceName = ServiceName; if (!IsMovie && !string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) || !string.IsNullOrWhiteSpace(serviceName)) { return null; } double value = 2; value /= 3; return value; } [IgnoreDataMember] public override SourceType SourceType { get { return SourceType.LiveTV; } } /// /// The start date of the program, in UTC. /// [IgnoreDataMember] public DateTime StartDate { get; set; } /// /// Gets or sets a value indicating whether this instance is repeat. /// /// true if this instance is repeat; otherwise, false. [IgnoreDataMember] public bool IsRepeat { get; set; } /// /// Gets or sets the episode title. /// /// The episode title. [IgnoreDataMember] public string EpisodeTitle { get; set; } [IgnoreDataMember] public string ShowId { get; set; } /// /// Gets or sets a value indicating whether this instance is movie. /// /// true if this instance is movie; otherwise, false. [IgnoreDataMember] public bool IsMovie { get; set; } /// /// Gets or sets a value indicating whether this instance is sports. /// /// true if this instance is sports; otherwise, false. [IgnoreDataMember] public bool IsSports { get; set; } /// /// Gets or sets a value indicating whether this instance is series. /// /// true if this instance is series; otherwise, false. [IgnoreDataMember] public bool IsSeries { get; set; } /// /// Gets or sets a value indicating whether this instance is live. /// /// true if this instance is live; otherwise, false. [IgnoreDataMember] public bool IsLive { get; set; } /// /// Gets or sets a value indicating whether this instance is news. /// /// true if this instance is news; otherwise, false. [IgnoreDataMember] public bool IsNews { get; set; } /// /// Gets or sets a value indicating whether this instance is kids. /// /// true if this instance is kids; otherwise, false. [IgnoreDataMember] public bool IsKids { get; set; } /// /// Gets or sets a value indicating whether this instance is premiere. /// /// true if this instance is premiere; otherwise, false. [IgnoreDataMember] public bool IsPremiere { get; set; } /// /// Returns the folder containing the item. /// If the item is a folder, it returns the folder itself /// /// The containing folder path. [IgnoreDataMember] public override string ContainingFolderPath { get { return Path; } } /// /// Gets a value indicating whether this instance is owned item. /// /// true if this instance is owned item; otherwise, false. [IgnoreDataMember] public override bool IsOwnedItem { get { return false; } } //[IgnoreDataMember] //public override string MediaType //{ // get // { // return ChannelType == ChannelType.TV ? Model.Entities.MediaType.Video : Model.Entities.MediaType.Audio; // } //} [IgnoreDataMember] public bool IsAiring { get { var now = DateTime.UtcNow; return now >= StartDate && now < EndDate; } } [IgnoreDataMember] public bool HasAired { get { var now = DateTime.UtcNow; return now >= EndDate; } } public override string GetClientTypeName() { return "Program"; } public override UnratedItem GetBlockUnratedType() { return UnratedItem.LiveTvProgram; } protected override string GetInternalMetadataPath(string basePath) { return System.IO.Path.Combine(basePath, "livetv", Id.ToString("N")); } public override bool CanDelete() { return false; } public override bool IsInternetMetadataEnabled() { return false; } public LiveTvProgramLookupInfo GetLookupInfo() { var info = GetItemLookupInfo(); info.IsMovie = IsMovie; return info; } [IgnoreDataMember] public override bool SupportsPeople { get { // Optimization if (IsNews || IsSports) { return false; } return base.SupportsPeople; } } [IgnoreDataMember] public override bool SupportsAncestors { get { return false; } } private LiveTvOptions GetConfiguration() { return ConfigurationManager.GetConfiguration("livetv"); } private ListingsProviderInfo GetListingsProviderInfo() { if (string.Equals(ServiceName, "Emby", StringComparison.OrdinalIgnoreCase)) { var config = GetConfiguration(); return config.ListingProviders.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i.MoviePrefix)); } return null; } protected override string GetNameForMetadataLookup() { var name = base.GetNameForMetadataLookup(); var listings = GetListingsProviderInfo(); if (listings != null) { if (!string.IsNullOrWhiteSpace(listings.MoviePrefix) && name.StartsWith(listings.MoviePrefix, StringComparison.OrdinalIgnoreCase)) { name = name.Substring(listings.MoviePrefix.Length).Trim(); } } return name; } public override List GetRelatedUrls() { var list = base.GetRelatedUrls(); var imdbId = this.GetProviderId(MetadataProviders.Imdb); if (!string.IsNullOrWhiteSpace(imdbId)) { if (IsMovie) { list.Add(new ExternalUrl { Name = "Trakt", Url = string.Format("https://trakt.tv/movies/{0}", imdbId) }); } } return list; } } }