diff --git a/Directory.Packages.props b/Directory.Packages.props
index 34e6a02ff9..d2b715d6aa 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -22,7 +22,7 @@
-
+
diff --git a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
index 3c3ac2471f..905aad17b9 100644
--- a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
+++ b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
#pragma warning disable CS1591
using System;
@@ -12,45 +10,45 @@ namespace MediaBrowser.Controller.LiveTv
{
public ProgramInfo()
{
- Genres = new List();
+ Genres = [];
- ProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase);
- SeriesProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ ProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ SeriesProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase);
}
///
/// Gets or sets the id of the program.
///
- public string Id { get; set; }
+ public string? Id { get; set; }
///
/// Gets or sets the channel identifier.
///
/// The channel identifier.
- public string ChannelId { get; set; }
+ public string? ChannelId { get; set; }
///
/// Gets or sets the name of the program.
///
- public string Name { get; set; }
+ public string? Name { get; set; }
///
/// Gets or sets the official rating.
///
/// The official rating.
- public string OfficialRating { get; set; }
+ public string? OfficialRating { get; set; }
///
/// Gets or sets the overview.
///
/// The overview.
- public string Overview { get; set; }
+ public string? Overview { get; set; }
///
/// Gets or sets the short overview.
///
/// The short overview.
- public string ShortOverview { get; set; }
+ public string? ShortOverview { get; set; }
///
/// Gets or sets the start date of the program, in UTC.
@@ -108,25 +106,25 @@ namespace MediaBrowser.Controller.LiveTv
/// Gets or sets the episode title.
///
/// The episode title.
- public string EpisodeTitle { get; set; }
+ public string? EpisodeTitle { get; set; }
///
/// Gets or sets the image path if it can be accessed directly from the file system.
///
/// The image path.
- public string ImagePath { get; set; }
+ public string? ImagePath { get; set; }
///
/// Gets or sets the image url if it can be downloaded.
///
/// The image URL.
- public string ImageUrl { get; set; }
+ public string? ImageUrl { get; set; }
- public string ThumbImageUrl { get; set; }
+ public string? ThumbImageUrl { get; set; }
- public string LogoImageUrl { get; set; }
+ public string? LogoImageUrl { get; set; }
- public string BackdropImageUrl { get; set; }
+ public string? BackdropImageUrl { get; set; }
///
/// Gets or sets a value indicating whether this instance has image.
@@ -188,19 +186,19 @@ namespace MediaBrowser.Controller.LiveTv
/// Gets or sets the home page URL.
///
/// The home page URL.
- public string HomePageUrl { get; set; }
+ public string? HomePageUrl { get; set; }
///
/// Gets or sets the series identifier.
///
/// The series identifier.
- public string SeriesId { get; set; }
+ public string? SeriesId { get; set; }
///
/// Gets or sets the show identifier.
///
/// The show identifier.
- public string ShowId { get; set; }
+ public string? ShowId { get; set; }
///
/// Gets or sets the season number.
@@ -218,10 +216,10 @@ namespace MediaBrowser.Controller.LiveTv
/// Gets or sets the etag.
///
/// The etag.
- public string Etag { get; set; }
+ public string? Etag { get; set; }
- public Dictionary ProviderIds { get; set; }
+ public Dictionary ProviderIds { get; set; }
- public Dictionary SeriesProviderIds { get; set; }
+ public Dictionary SeriesProviderIds { get; set; }
}
}
diff --git a/src/Jellyfin.LiveTv/Listings/XmlTvListingsProvider.cs b/src/Jellyfin.LiveTv/Listings/XmlTvListingsProvider.cs
index b5c884bd10..318c3a2d36 100644
--- a/src/Jellyfin.LiveTv/Listings/XmlTvListingsProvider.cs
+++ b/src/Jellyfin.LiveTv/Listings/XmlTvListingsProvider.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
#pragma warning disable CS1591
using System;
@@ -62,21 +60,21 @@ namespace Jellyfin.LiveTv.Listings
_logger.LogInformation("xmltv path: {Path}", info.Path);
string cacheFilename = info.Id + ".xml";
- string cacheFile = Path.Combine(_config.ApplicationPaths.CachePath, "xmltv", cacheFilename);
+ string cacheDir = Path.Join(_config.ApplicationPaths.CachePath, "xmltv");
+ string cacheFile = Path.Join(cacheDir, cacheFilename);
- if (File.Exists(cacheFile) && File.GetLastWriteTimeUtc(cacheFile) >= DateTime.UtcNow.Subtract(_maxCacheAge))
- {
- return cacheFile;
- }
-
- // Must check if file exists as parent directory may not exist.
if (File.Exists(cacheFile))
{
+ if (File.GetLastWriteTimeUtc(cacheFile) >= DateTime.UtcNow.Subtract(_maxCacheAge))
+ {
+ return cacheFile;
+ }
+
File.Delete(cacheFile);
}
else
{
- Directory.CreateDirectory(Path.GetDirectoryName(cacheFile));
+ Directory.CreateDirectory(cacheDir);
}
if (info.Path.StartsWith("http", StringComparison.OrdinalIgnoreCase))
@@ -154,22 +152,25 @@ namespace Jellyfin.LiveTv.Listings
private static ProgramInfo GetProgramInfo(XmlTvProgram program, ListingsProviderInfo info)
{
- string episodeTitle = program.Episode.Title;
+ string? episodeTitle = program.Episode?.Title;
var programCategories = program.Categories.Where(c => !string.IsNullOrWhiteSpace(c)).ToList();
+ var imageUrl = program.Icons.FirstOrDefault()?.Source;
+ var rating = program.Ratings.FirstOrDefault()?.Value;
+ var starRating = program.StarRatings?.FirstOrDefault()?.StarRating;
var programInfo = new ProgramInfo
{
ChannelId = program.ChannelId,
EndDate = program.EndDate.UtcDateTime,
- EpisodeNumber = program.Episode.Episode,
+ EpisodeNumber = program.Episode?.Episode,
EpisodeTitle = episodeTitle,
Genres = programCategories,
StartDate = program.StartDate.UtcDateTime,
Name = program.Title,
Overview = program.Description,
ProductionYear = program.CopyrightDate?.Year,
- SeasonNumber = program.Episode.Series,
- IsSeries = program.Episode.Episode is not null,
+ SeasonNumber = program.Episode?.Series,
+ IsSeries = program.Episode?.Episode is not null,
IsRepeat = program.IsPreviouslyShown && !program.IsNew,
IsPremiere = program.Premiere is not null,
IsLive = program.IsLive,
@@ -177,11 +178,11 @@ namespace Jellyfin.LiveTv.Listings
IsMovie = programCategories.Any(c => info.MovieCategories.Contains(c, StringComparison.OrdinalIgnoreCase)),
IsNews = programCategories.Any(c => info.NewsCategories.Contains(c, StringComparison.OrdinalIgnoreCase)),
IsSports = programCategories.Any(c => info.SportsCategories.Contains(c, StringComparison.OrdinalIgnoreCase)),
- ImageUrl = string.IsNullOrEmpty(program.Icon?.Source) ? null : program.Icon.Source,
- HasImage = !string.IsNullOrEmpty(program.Icon?.Source),
- OfficialRating = string.IsNullOrEmpty(program.Rating?.Value) ? null : program.Rating.Value,
- CommunityRating = program.StarRating,
- SeriesId = program.Episode.Episode is null ? null : program.Title?.GetMD5().ToString("N", CultureInfo.InvariantCulture)
+ ImageUrl = string.IsNullOrEmpty(imageUrl) ? null : imageUrl,
+ HasImage = !string.IsNullOrEmpty(imageUrl),
+ OfficialRating = string.IsNullOrEmpty(rating) ? null : rating,
+ CommunityRating = starRating is null ? null : (float)starRating.Value,
+ SeriesId = program.Episode?.Episode is null ? null : program.Title?.GetMD5().ToString("N", CultureInfo.InvariantCulture)
};
if (string.IsNullOrWhiteSpace(program.ProgramId))
@@ -262,7 +263,7 @@ namespace Jellyfin.LiveTv.Listings
{
Id = c.Id,
Name = c.DisplayName,
- ImageUrl = string.IsNullOrEmpty(c.Icon?.Source) ? null : c.Icon.Source,
+ ImageUrl = string.IsNullOrEmpty(c.Icons.FirstOrDefault()?.Source) ? null : c.Icons.FirstOrDefault()!.Source,
Number = string.IsNullOrWhiteSpace(c.Number) ? c.Id : c.Number
}).ToList();
}