using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.LiveTv; 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.IsNullOrEmpty(key)) { list.Insert(0, key); } key = this.GetProviderId(MetadataProviders.Tmdb); if (!string.IsNullOrEmpty(key)) { list.Insert(0, key); } } else if (!string.IsNullOrEmpty(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 (string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) || string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) { return 2.0 / 3; } else { return 16.0 / 9; } } [IgnoreDataMember] public override SourceType SourceType => 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 => Tags.Contains("Sports", StringComparer.OrdinalIgnoreCase); /// /// 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 => Tags.Contains("Live", StringComparer.OrdinalIgnoreCase); /// /// Gets or sets a value indicating whether this instance is news. /// /// true if this instance is news; otherwise, false. [IgnoreDataMember] public bool IsNews => Tags.Contains("News", StringComparer.OrdinalIgnoreCase); /// /// Gets or sets a value indicating whether this instance is kids. /// /// true if this instance is kids; otherwise, false. [IgnoreDataMember] public bool IsKids => Tags.Contains("Kids", StringComparer.OrdinalIgnoreCase); /// /// Gets or sets a value indicating whether this instance is premiere. /// /// true if this instance is premiere; otherwise, false. [IgnoreDataMember] public bool IsPremiere => Tags.Contains("Premiere", StringComparer.OrdinalIgnoreCase); /// /// 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 => Path; //[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", CultureInfo.InvariantCulture)); } public override bool CanDelete() { return false; } [IgnoreDataMember] public override bool SupportsPeople { get { // Optimization if (IsNews || IsSports) { return false; } return base.SupportsPeople; } } [IgnoreDataMember] public override bool SupportsAncestors => 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.IsNullOrEmpty(i.MoviePrefix)); } return null; } protected override string GetNameForMetadataLookup() { var name = base.GetNameForMetadataLookup(); var listings = GetListingsProviderInfo(); if (listings != null) { if (!string.IsNullOrEmpty(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.IsNullOrEmpty(imdbId)) { if (IsMovie) { list.Add(new ExternalUrl { Name = "Trakt", Url = string.Format("https://trakt.tv/movies/{0}", imdbId) }); } } return list; } public string SeriesName { get; set; } } }