mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-06-04 14:14:29 -04:00
Add TryParseDateTime and TryParseDateTimeExact to XmlReaderExtensions
This commit is contained in:
parent
1a6ec2c740
commit
99832642ce
@ -5,6 +5,7 @@ using System.Linq;
|
|||||||
using System.Xml;
|
using System.Xml;
|
||||||
using Jellyfin.Data.Enums;
|
using Jellyfin.Data.Enums;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace MediaBrowser.Controller.Extensions;
|
namespace MediaBrowser.Controller.Extensions;
|
||||||
|
|
||||||
@ -13,6 +14,52 @@ namespace MediaBrowser.Controller.Extensions;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class XmlReaderExtensions
|
public static class XmlReaderExtensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Parses a <see cref="DateTime"/> from the current node.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader">The <see cref="XmlReader"/>.</param>
|
||||||
|
/// <param name="logger">The <see cref="ILogger"/> to use on failure.</param>
|
||||||
|
/// <param name="value">The parsed <see cref="DateTime"/>.</param>
|
||||||
|
/// <returns>A value indicating whether the parsing succeeded.</returns>
|
||||||
|
public static bool TryReadDateTime(this XmlReader reader, ILogger logger, out DateTime value)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(reader);
|
||||||
|
ArgumentNullException.ThrowIfNull(logger);
|
||||||
|
|
||||||
|
var text = reader.ReadElementContentAsString();
|
||||||
|
if (DateTime.TryParse(
|
||||||
|
text,
|
||||||
|
CultureInfo.InvariantCulture,
|
||||||
|
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
|
||||||
|
out value))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogWarning("Invalid date: {Date}", text);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parses a <see cref="DateTime"/> from the current node.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader">The <see cref="XmlReader"/>.</param>
|
||||||
|
/// <param name="formatString">The date format string.</param>
|
||||||
|
/// <param name="value">The parsed <see cref="DateTime"/>.</param>
|
||||||
|
/// <returns>A value indicating whether the parsing succeeded.</returns>
|
||||||
|
public static bool TryReadDateTimeExact(this XmlReader reader, string formatString, out DateTime value)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(reader);
|
||||||
|
ArgumentNullException.ThrowIfNull(formatString);
|
||||||
|
|
||||||
|
return DateTime.TryParseExact(
|
||||||
|
reader.ReadElementContentAsString(),
|
||||||
|
formatString,
|
||||||
|
CultureInfo.InvariantCulture,
|
||||||
|
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
|
||||||
|
out value);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parses a <see cref="PersonInfo"/> from the xml node.
|
/// Parses a <see cref="PersonInfo"/> from the xml node.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -129,26 +129,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||||||
|
|
||||||
switch (reader.Name)
|
switch (reader.Name)
|
||||||
{
|
{
|
||||||
// DateCreated
|
|
||||||
case "Added":
|
case "Added":
|
||||||
|
if (reader.TryReadDateTime(Logger, out var dateCreated))
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
item.DateCreated = dateCreated;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(val))
|
|
||||||
{
|
|
||||||
if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out var added))
|
|
||||||
{
|
|
||||||
item.DateCreated = added;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.LogWarning("Invalid Added value found: {Value}", val);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "OriginalTitle":
|
case "OriginalTitle":
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
var val = reader.ReadElementContentAsString();
|
||||||
@ -465,37 +452,21 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||||||
case "BirthDate":
|
case "BirthDate":
|
||||||
case "PremiereDate":
|
case "PremiereDate":
|
||||||
case "FirstAired":
|
case "FirstAired":
|
||||||
|
if (reader.TryReadDateTimeExact("yyyy-MM-dd", out var firstAired))
|
||||||
{
|
{
|
||||||
var firstAired = reader.ReadElementContentAsString();
|
item.PremiereDate = firstAired;
|
||||||
|
item.ProductionYear = firstAired.Year;
|
||||||
if (!string.IsNullOrWhiteSpace(firstAired))
|
|
||||||
{
|
|
||||||
if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal, out var airDate) && airDate.Year > 1850)
|
|
||||||
{
|
|
||||||
item.PremiereDate = airDate;
|
|
||||||
item.ProductionYear = airDate.Year;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "DeathDate":
|
case "DeathDate":
|
||||||
case "EndDate":
|
case "EndDate":
|
||||||
|
if (reader.TryReadDateTimeExact("yyyy-MM-dd", out var endDate))
|
||||||
{
|
{
|
||||||
var firstAired = reader.ReadElementContentAsString();
|
item.EndDate = endDate;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(firstAired))
|
|
||||||
{
|
|
||||||
if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal, out var airDate) && airDate.Year > 1850)
|
|
||||||
{
|
|
||||||
item.EndDate = airDate;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "CollectionNumber":
|
case "CollectionNumber":
|
||||||
var tmdbCollection = reader.ReadElementContentAsString();
|
var tmdbCollection = reader.ReadElementContentAsString();
|
||||||
if (!string.IsNullOrWhiteSpace(tmdbCollection))
|
if (!string.IsNullOrWhiteSpace(tmdbCollection))
|
||||||
|
@ -268,23 +268,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
|
|
||||||
switch (reader.Name)
|
switch (reader.Name)
|
||||||
{
|
{
|
||||||
// DateCreated
|
|
||||||
case "dateadded":
|
case "dateadded":
|
||||||
|
if (reader.TryReadDateTime(Logger, out var dateCreated))
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
item.DateCreated = dateCreated;
|
||||||
|
|
||||||
if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var added))
|
|
||||||
{
|
|
||||||
item.DateCreated = added;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.LogWarning("Invalid Added value found: {Value}", val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "originaltitle":
|
case "originaltitle":
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
var val = reader.ReadElementContentAsString();
|
||||||
@ -373,9 +363,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
var val = reader.ReadElementContentAsString();
|
||||||
if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var count)
|
if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var count)
|
||||||
&& Guid.TryParse(nfoConfiguration.UserId, out var guid))
|
&& Guid.TryParse(nfoConfiguration.UserId, out var playCountUserId))
|
||||||
{
|
{
|
||||||
var user = _userManager.GetUserById(guid);
|
var user = _userManager.GetUserById(playCountUserId);
|
||||||
userData = _userDataManager.GetUserData(user, item);
|
userData = _userDataManager.GetUserData(user, item);
|
||||||
userData.PlayCount = count;
|
userData.PlayCount = count;
|
||||||
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
|
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
|
||||||
@ -385,26 +375,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
}
|
}
|
||||||
|
|
||||||
case "lastplayed":
|
case "lastplayed":
|
||||||
|
if (reader.TryReadDateTime(Logger, out var lastPlayed)
|
||||||
|
&& Guid.TryParse(nfoConfiguration.UserId, out var lastPlayedUserId))
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
var user = _userManager.GetUserById(lastPlayedUserId);
|
||||||
if (Guid.TryParse(nfoConfiguration.UserId, out var guid))
|
|
||||||
{
|
|
||||||
if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var added))
|
|
||||||
{
|
|
||||||
var user = _userManager.GetUserById(guid);
|
|
||||||
userData = _userDataManager.GetUserData(user, item);
|
userData = _userDataManager.GetUserData(user, item);
|
||||||
userData.LastPlayedDate = added;
|
userData.LastPlayedDate = lastPlayed;
|
||||||
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
|
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.LogWarning("Invalid lastplayed value found: {Value}", val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "countrycode":
|
case "countrycode":
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
var val = reader.ReadElementContentAsString();
|
||||||
@ -641,34 +621,20 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
case "formed":
|
case "formed":
|
||||||
case "premiered":
|
case "premiered":
|
||||||
case "releasedate":
|
case "releasedate":
|
||||||
|
if (reader.TryReadDateTimeExact(nfoConfiguration.ReleaseDateFormat, out var releaseDate))
|
||||||
{
|
{
|
||||||
var formatString = nfoConfiguration.ReleaseDateFormat;
|
item.PremiereDate = releaseDate;
|
||||||
|
item.ProductionYear = releaseDate.Year;
|
||||||
var val = reader.ReadElementContentAsString();
|
|
||||||
|
|
||||||
if (DateTime.TryParseExact(val, formatString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var date) && date.Year > 1850)
|
|
||||||
{
|
|
||||||
item.PremiereDate = date;
|
|
||||||
item.ProductionYear = date.Year;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "enddate":
|
case "enddate":
|
||||||
|
if (reader.TryReadDateTimeExact(nfoConfiguration.ReleaseDateFormat, out var endDate))
|
||||||
{
|
{
|
||||||
var formatString = nfoConfiguration.ReleaseDateFormat;
|
item.EndDate = endDate;
|
||||||
|
|
||||||
var val = reader.ReadElementContentAsString();
|
|
||||||
|
|
||||||
if (DateTime.TryParseExact(val, formatString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var date) && date.Year > 1850)
|
|
||||||
{
|
|
||||||
item.EndDate = date;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "genre":
|
case "genre":
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsString();
|
var val = reader.ReadElementContentAsString();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user