123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- #nullable disable
- #pragma warning disable CS1591, SA1306
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.Linq;
- using System.Text.Json.Serialization;
- using Jellyfin.Data.Enums;
- using Jellyfin.Extensions;
- using MediaBrowser.Common.Configuration;
- using MediaBrowser.Controller.Entities;
- using MediaBrowser.Controller.Providers;
- using MediaBrowser.Model.Entities;
- using MediaBrowser.Model.LiveTv;
- using MediaBrowser.Model.Providers;
- namespace MediaBrowser.Controller.LiveTv
- {
- [Common.RequiresSourceSerialisation]
- public class LiveTvProgram : BaseItem, IHasLookupInfo<ItemLookupInfo>, IHasStartDate, IHasProgramAttributes
- {
- private const string EmbyServiceName = "Emby";
- public LiveTvProgram()
- {
- IsVirtualItem = true;
- }
- public string SeriesName { get; set; }
- [JsonIgnore]
- public override SourceType SourceType => SourceType.LiveTV;
- /// <summary>
- /// Gets or sets start date of the program, in UTC.
- /// </summary>
- [JsonIgnore]
- public DateTime StartDate { get; set; }
- /// <summary>
- /// Gets or sets a value indicating whether this instance is repeat.
- /// </summary>
- /// <value><c>true</c> if this instance is repeat; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsRepeat { get; set; }
- /// <summary>
- /// Gets or sets the episode title.
- /// </summary>
- /// <value>The episode title.</value>
- [JsonIgnore]
- public string EpisodeTitle { get; set; }
- [JsonIgnore]
- public string ShowId { get; set; }
- /// <summary>
- /// Gets or sets a value indicating whether this instance is movie.
- /// </summary>
- /// <value><c>true</c> if this instance is movie; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsMovie { get; set; }
- /// <summary>
- /// Gets a value indicating whether this instance is sports.
- /// </summary>
- /// <value><c>true</c> if this instance is sports; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsSports => Tags.Contains("Sports", StringComparison.OrdinalIgnoreCase);
- /// <summary>
- /// Gets or sets a value indicating whether this instance is series.
- /// </summary>
- /// <value><c>true</c> if this instance is series; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsSeries { get; set; }
- /// <summary>
- /// Gets a value indicating whether this instance is live.
- /// </summary>
- /// <value><c>true</c> if this instance is live; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsLive => Tags.Contains("Live", StringComparison.OrdinalIgnoreCase);
- /// <summary>
- /// Gets a value indicating whether this instance is news.
- /// </summary>
- /// <value><c>true</c> if this instance is news; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsNews => Tags.Contains("News", StringComparison.OrdinalIgnoreCase);
- /// <summary>
- /// Gets a value indicating whether this instance is kids.
- /// </summary>
- /// <value><c>true</c> if this instance is kids; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsKids => Tags.Contains("Kids", StringComparison.OrdinalIgnoreCase);
- /// <summary>
- /// Gets a value indicating whether this instance is premiere.
- /// </summary>
- /// <value><c>true</c> if this instance is premiere; otherwise, <c>false</c>.</value>
- [JsonIgnore]
- public bool IsPremiere => Tags.Contains("Premiere", StringComparison.OrdinalIgnoreCase);
- /// <summary>
- /// Gets the folder containing the item.
- /// If the item is a folder, it returns the folder itself.
- /// </summary>
- /// <value>The containing folder path.</value>
- [JsonIgnore]
- public override string ContainingFolderPath => Path;
- // [JsonIgnore]
- // public override string MediaType
- // {
- // get
- // {
- // return ChannelType == ChannelType.TV ? Model.Entities.MediaType.Video : Model.Entities.MediaType.Audio;
- // }
- // }
- [JsonIgnore]
- public bool IsAiring
- {
- get
- {
- var now = DateTime.UtcNow;
- return now >= StartDate && now < EndDate;
- }
- }
- [JsonIgnore]
- public bool HasAired
- {
- get
- {
- var now = DateTime.UtcNow;
- return now >= EndDate;
- }
- }
- [JsonIgnore]
- public override bool SupportsPeople
- {
- get
- {
- // Optimization
- if (IsNews || IsSports)
- {
- return false;
- }
- return base.SupportsPeople;
- }
- }
- [JsonIgnore]
- public override bool SupportsAncestors => false;
- public override List<string> GetUserDataKeys()
- {
- var list = base.GetUserDataKeys();
- if (!IsSeries)
- {
- var key = this.GetProviderId(MetadataProvider.Imdb);
- if (!string.IsNullOrEmpty(key))
- {
- list.Insert(0, key);
- }
- key = this.GetProviderId(MetadataProvider.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;
- }
- 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;
- }
- return 16.0 / 9;
- }
- 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;
- }
- private LiveTvOptions GetConfiguration()
- {
- return ConfigurationManager.GetConfiguration<LiveTvOptions>("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 is not null)
- {
- if (!string.IsNullOrEmpty(listings.MoviePrefix) && name.StartsWith(listings.MoviePrefix, StringComparison.OrdinalIgnoreCase))
- {
- name = name.Substring(listings.MoviePrefix.Length).Trim();
- }
- }
- return name;
- }
- }
- }
|