aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.XbmcMetadata
diff options
context:
space:
mode:
authorMarc Brooks <IDisposable@gmail.com>2025-02-03 19:48:59 -0600
committerGitHub <noreply@github.com>2025-02-03 19:48:59 -0600
commite8cbcde02ebd930a5eeb6c95e0875a9e30acb3e8 (patch)
tree2ecd43f232012c8f037f4cd6fee4168e46d01aa3 /MediaBrowser.XbmcMetadata
parent6dc61a430ba3a8480399309f277e5debfd6403ba (diff)
parentd376b5fbc7cf3ae7440a606a9e885d70605956bd (diff)
Merge branch 'master' into sort-nfo-data
Diffstat (limited to 'MediaBrowser.XbmcMetadata')
-rw-r--r--MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj2
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs25
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs38
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs15
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs4
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs61
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs4
7 files changed, 81 insertions, 68 deletions
diff --git a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj
index c20073eea..b195af96c 100644
--- a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj
+++ b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj
@@ -15,7 +15,7 @@
</ItemGroup>
<PropertyGroup>
- <TargetFramework>net8.0</TargetFramework>
+ <TargetFramework>net9.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
index a8800431e..75ad0d58c 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
@@ -73,7 +73,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
protected IProviderManager ProviderManager { get; }
/// <summary>
- /// Gets a value indicating whether URLs after a closing XML tag are supporrted.
+ /// Gets a value indicating whether URLs after a closing XML tag are supported.
/// </summary>
protected virtual bool SupportsUrlAfterClosingXmlTag => false;
@@ -312,8 +312,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers
if (user is not null)
{
userData = _userDataManager.GetUserData(user, item);
- userData.Played = played;
- _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
+ if (userData is not null)
+ {
+ userData.Played = played;
+ _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
+ }
}
}
@@ -326,8 +329,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers
if (user is not null)
{
userData = _userDataManager.GetUserData(user, item);
- userData.PlayCount = count;
- _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
+ if (userData is not null)
+ {
+ userData.PlayCount = count;
+ _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
+ }
}
}
@@ -340,8 +346,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers
if (user is not null)
{
userData = _userDataManager.GetUserData(user, item);
- userData.LastPlayedDate = lastPlayed;
- _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
+ if (userData is not null)
+ {
+ userData.LastPlayedDate = lastPlayed;
+ _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
+ }
}
}
@@ -663,7 +672,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
var fileSystemMetadata = _directoryService.GetFile(val);
- // non existing file returns null
+ // nonexistent file returns null
if (fileSystemMetadata is null || !fileSystemMetadata.Exists)
{
Logger.LogWarning("Artwork file {Path} specified in nfo file for {ItemName} does not exist.", uri, itemResult.Item.Name);
diff --git a/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs
index 2d65188b6..137abff47 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs
@@ -50,23 +50,20 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
case "id":
{
- // get ids from attributes
+ // Get ids from attributes
+ item.TrySetProviderId(MetadataProvider.Tmdb, reader.GetAttribute("TMDB"));
+ item.TrySetProviderId(MetadataProvider.Tvdb, reader.GetAttribute("TVDB"));
string? imdbId = reader.GetAttribute("IMDB");
- string? tmdbId = reader.GetAttribute("TMDB");
- // read id from content
+ // Read id from content
+ // Content can be arbitrary according to Kodi wiki, so only parse if we are sure it matches a provider-specific schema
var contentId = reader.ReadElementContentAsString();
- if (contentId.Contains("tt", StringComparison.Ordinal) && string.IsNullOrEmpty(imdbId))
+ if (string.IsNullOrEmpty(imdbId) && contentId.StartsWith("tt", StringComparison.Ordinal))
{
imdbId = contentId;
}
- else if (string.IsNullOrEmpty(tmdbId))
- {
- tmdbId = contentId;
- }
item.TrySetProviderId(MetadataProvider.Imdb, imdbId);
- item.TrySetProviderId(MetadataProvider.Tmdb, tmdbId);
break;
}
@@ -82,21 +79,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
if (!string.IsNullOrWhiteSpace(val) && movie is not null)
{
- // TODO Handle this better later
- if (!val.Contains('<', StringComparison.Ordinal))
+ try
{
- movie.CollectionName = val;
+ ParseSetXml(val, movie);
}
- else
+ catch (Exception ex)
{
- try
- {
- ParseSetXml(val, movie);
- }
- catch (Exception ex)
- {
- Logger.LogError(ex, "Error parsing set node");
- }
+ Logger.LogError(ex, "Error parsing set node");
}
}
@@ -139,7 +128,12 @@ namespace MediaBrowser.XbmcMetadata.Parsers
// Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
{
- if (reader.NodeType == XmlNodeType.Element)
+ if (reader.NodeType == XmlNodeType.Text && reader.Depth == 1)
+ {
+ movie.CollectionName = reader.Value;
+ break;
+ }
+ else if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
diff --git a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs
index 59abef919..b0944515b 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs
@@ -1,3 +1,4 @@
+using System;
using System.Globalization;
using System.Xml;
using Emby.Naming.TV;
@@ -48,16 +49,20 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
case "id":
{
- item.TrySetProviderId(MetadataProvider.Imdb, reader.GetAttribute("IMDB"));
+ // Get ids from attributes
item.TrySetProviderId(MetadataProvider.Tmdb, reader.GetAttribute("TMDB"));
+ item.TrySetProviderId(MetadataProvider.Tvdb, reader.GetAttribute("TVDB"));
+ string? imdbId = reader.GetAttribute("IMDB");
- string? tvdbId = reader.GetAttribute("TVDB");
- if (string.IsNullOrWhiteSpace(tvdbId))
+ // Read id from content
+ // Content can be arbitrary according to Kodi wiki, so only parse if we are sure it matches a provider-specific schema
+ var contentId = reader.ReadElementContentAsString();
+ if (string.IsNullOrEmpty(imdbId) && contentId.StartsWith("tt", StringComparison.Ordinal))
{
- tvdbId = reader.ReadElementContentAsString();
+ imdbId = contentId;
}
- item.TrySetProviderId(MetadataProvider.Tvdb, tvdbId);
+ item.TrySetProviderId(MetadataProvider.Imdb, imdbId);
break;
}
diff --git a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
index e13ba9385..e1d006bfa 100644
--- a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
@@ -15,7 +15,7 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
- /// Nfo saver for artsist.
+ /// Nfo saver for artist.
/// </summary>
public class ArtistNfoSaver : BaseNfoSaver
{
@@ -69,7 +69,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
AddAlbums(albums, writer);
}
- private void AddAlbums(IList<BaseItem> albums, XmlWriter writer)
+ private void AddAlbums(IReadOnlyList<BaseItem> albums, XmlWriter writer)
{
foreach (var album in albums
.OrderBy(album => album.ProductionYear ?? 0)
diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
index 7c94b25c4..9c006e206 100644
--- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
@@ -878,49 +878,52 @@ namespace MediaBrowser.XbmcMetadata.Savers
var userdata = userDataRepo.GetUserData(user, item);
- writer.WriteElementString(
- "isuserfavorite",
- userdata.IsFavorite.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
-
- if (userdata.Rating.HasValue)
- {
- writer.WriteElementString(
- "userrating",
- userdata.Rating.Value.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
- }
-
- if (!item.IsFolder)
+ if (userdata is not null)
{
writer.WriteElementString(
- "playcount",
- userdata.PlayCount.ToString(CultureInfo.InvariantCulture));
- writer.WriteElementString(
- "watched",
- userdata.Played.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
+ "isuserfavorite",
+ userdata.IsFavorite.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
- if (userdata.LastPlayedDate.HasValue)
+ if (userdata.Rating.HasValue)
{
writer.WriteElementString(
- "lastplayed",
- userdata.LastPlayedDate.Value.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).ToLowerInvariant());
+ "userrating",
+ userdata.Rating.Value.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
}
- writer.WriteStartElement("resume");
+ if (!item.IsFolder)
+ {
+ writer.WriteElementString(
+ "playcount",
+ userdata.PlayCount.ToString(CultureInfo.InvariantCulture));
+ writer.WriteElementString(
+ "watched",
+ userdata.Played.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
- var runTimeTicks = item.RunTimeTicks ?? 0;
+ if (userdata.LastPlayedDate.HasValue)
+ {
+ writer.WriteElementString(
+ "lastplayed",
+ userdata.LastPlayedDate.Value.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).ToLowerInvariant());
+ }
- writer.WriteElementString(
- "position",
- TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds.ToString(CultureInfo.InvariantCulture));
- writer.WriteElementString(
- "total",
- TimeSpan.FromTicks(runTimeTicks).TotalSeconds.ToString(CultureInfo.InvariantCulture));
+ writer.WriteStartElement("resume");
+
+ var runTimeTicks = item.RunTimeTicks ?? 0;
+
+ writer.WriteElementString(
+ "position",
+ TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds.ToString(CultureInfo.InvariantCulture));
+ writer.WriteElementString(
+ "total",
+ TimeSpan.FromTicks(runTimeTicks).TotalSeconds.ToString(CultureInfo.InvariantCulture));
+ }
}
writer.WriteEndElement();
}
- private void AddActors(List<PersonInfo> people, XmlWriter writer, ILibraryManager libraryManager, bool saveImagePath)
+ private void AddActors(IReadOnlyList<PersonInfo> people, XmlWriter writer, ILibraryManager libraryManager, bool saveImagePath)
{
foreach (var person in people
.OrderBy(person => person.SortOrder ?? 0)
diff --git a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
index 3ff8749e7..2ff2fc716 100644
--- a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
@@ -116,7 +116,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
if (!string.IsNullOrEmpty(movie.CollectionName))
{
- writer.WriteElementString("set", movie.CollectionName);
+ writer.WriteStartElement("set");
+ writer.WriteElementString("name", movie.CollectionName);
+ writer.WriteEndElement();
}
}
}