From 3eca8b9c98e5ad0ad9cefd85f27439f05f5bd6b5 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Sun, 1 Sep 2019 17:24:42 +0200 Subject: [PATCH] Address comments --- .../MediaBrowser.XbmcMetadata.csproj | 4 + .../Parsers/BaseNfoParser.cs | 1 - .../Savers/AlbumNfoSaver.cs | 2 +- .../Savers/ArtistNfoSaver.cs | 2 +- .../Savers/BaseNfoSaver.cs | 140 +++++++++++------- 5 files changed, 93 insertions(+), 56 deletions(-) diff --git a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj index f653270a6c..1ca9e43bb8 100644 --- a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj +++ b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj @@ -15,4 +15,8 @@ true + + latest + + diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index 091c60fc90..b8d0e6560d 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -48,7 +48,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers protected virtual string MovieDbParserSearchString => "themoviedb.org/movie/"; - /// /// Fetches metadata for an item from one xml file /// diff --git a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs index 3a32112b65..233b3cb89c 100644 --- a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.XbmcMetadata.Savers /// public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) - => !item.SupportsLocalMetadata && item is MusicAlbum && updateType >= MinimumUpdateType; + => item.SupportsLocalMetadata && item is MusicAlbum && updateType >= MinimumUpdateType; /// protected override void WriteCustomElements(BaseItem item, XmlWriter writer) diff --git a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs index 7808edcbc6..04565ff7e2 100644 --- a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs @@ -29,7 +29,7 @@ namespace MediaBrowser.XbmcMetadata.Savers /// public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) - => !item.SupportsLocalMetadata && item is MusicArtist && updateType >= MinimumUpdateType; + => item.SupportsLocalMetadata && item is MusicArtist && updateType >= MinimumUpdateType; /// protected override void WriteCustomElements(BaseItem item, XmlWriter writer) diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs index ae3c5f7f9d..d84bc2abbc 100644 --- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs @@ -29,8 +29,6 @@ namespace MediaBrowser.XbmcMetadata.Savers public const string YouTubeWatchUrl = "https://www.youtube.com/watch?v="; - private static readonly CultureInfo _usCulture = CultureInfo.ReadOnly(new CultureInfo("en-US")); - private static readonly HashSet _commonTags = new HashSet(StringComparer.OrdinalIgnoreCase) { "plot", @@ -100,7 +98,6 @@ namespace MediaBrowser.XbmcMetadata.Savers // filters control characters but allows only properly-formed surrogate sequences private const string _invalidXMLCharsRegex = @"(? public string Name => SaverName; public static string SaverName => "Nfo"; @@ -164,12 +162,7 @@ namespace MediaBrowser.XbmcMetadata.Savers /// . protected abstract string GetRootElementName(BaseItem item); - /// - /// Determines whether [is enabled for] [the specified item]. - /// - /// The item. - /// Type of the update. - /// true if [is enabled for] [the specified item]; otherwise, false. + /// public abstract bool IsEnabledFor(BaseItem item, ItemUpdateType updateType); protected virtual List GetTagsUsed(BaseItem item) @@ -187,6 +180,7 @@ namespace MediaBrowser.XbmcMetadata.Savers return list; } + /// public void Save(BaseItem item, CancellationToken cancellationToken) { var path = GetSavePath(item); @@ -206,6 +200,7 @@ namespace MediaBrowser.XbmcMetadata.Savers private void SaveToFile(Stream stream, string path) { Directory.CreateDirectory(Path.GetDirectoryName(path)); + // On Windows, savint the file will fail if the file is hidden or readonly FileSystem.SetAttributes(path, false, false); @@ -226,9 +221,9 @@ namespace MediaBrowser.XbmcMetadata.Savers { FileSystem.SetHidden(path, hidden); } - catch (Exception ex) + catch (IOException ex) { - Logger.LogError(ex, "Error setting hidden attribute on {path}", path); + Logger.LogError(ex, "Error setting hidden attribute on {Path}", path); } } @@ -267,7 +262,7 @@ namespace MediaBrowser.XbmcMetadata.Savers try { - AddCustomTags(xmlPath, tagsUsed, writer, Logger, FileSystem); + AddCustomTags(xmlPath, tagsUsed, writer, Logger); } catch (FileNotFoundException) { @@ -291,7 +286,7 @@ namespace MediaBrowser.XbmcMetadata.Savers protected abstract void WriteCustomElements(BaseItem item, XmlWriter writer); public static void AddMediaInfo(T item, XmlWriter writer) - where T : IHasMediaSources + where T : IHasMediaSources { writer.WriteStartElement("fileinfo"); writer.WriteStartElement("streamdetails"); @@ -321,17 +316,17 @@ namespace MediaBrowser.XbmcMetadata.Savers if (stream.BitRate.HasValue) { - writer.WriteElementString("bitrate", stream.BitRate.Value.ToString(_usCulture)); + writer.WriteElementString("bitrate", stream.BitRate.Value.ToString(CultureInfo.InvariantCulture)); } if (stream.Width.HasValue) { - writer.WriteElementString("width", stream.Width.Value.ToString(_usCulture)); + writer.WriteElementString("width", stream.Width.Value.ToString(CultureInfo.InvariantCulture)); } if (stream.Height.HasValue) { - writer.WriteElementString("height", stream.Height.Value.ToString(_usCulture)); + writer.WriteElementString("height", stream.Height.Value.ToString(CultureInfo.InvariantCulture)); } if (!string.IsNullOrEmpty(stream.AspectRatio)) @@ -344,7 +339,7 @@ namespace MediaBrowser.XbmcMetadata.Savers if (framerate.HasValue) { - writer.WriteElementString("framerate", framerate.Value.ToString(_usCulture)); + writer.WriteElementString("framerate", framerate.Value.ToString(CultureInfo.InvariantCulture)); } if (!string.IsNullOrEmpty(stream.Language)) @@ -362,12 +357,12 @@ namespace MediaBrowser.XbmcMetadata.Savers if (stream.Channels.HasValue) { - writer.WriteElementString("channels", stream.Channels.Value.ToString(_usCulture)); + writer.WriteElementString("channels", stream.Channels.Value.ToString(CultureInfo.InvariantCulture)); } if (stream.SampleRate.HasValue) { - writer.WriteElementString("samplingrate", stream.SampleRate.Value.ToString(_usCulture)); + writer.WriteElementString("samplingrate", stream.SampleRate.Value.ToString(CultureInfo.InvariantCulture)); } writer.WriteElementString("default", stream.IsDefault.ToString()); @@ -380,8 +375,12 @@ namespace MediaBrowser.XbmcMetadata.Savers { var timespan = TimeSpan.FromTicks(runtimeTicks.Value); - writer.WriteElementString("duration", Math.Floor(timespan.TotalMinutes).ToString(_usCulture)); - writer.WriteElementString("durationinseconds", Math.Floor(timespan.TotalSeconds).ToString(_usCulture)); + writer.WriteElementString( + "duration", + Math.Floor(timespan.TotalMinutes).ToString(CultureInfo.InvariantCulture)); + writer.WriteElementString( + "durationinseconds", + Math.Floor(timespan.TotalSeconds).ToString(CultureInfo.InvariantCulture)); } if (item is Video video) @@ -423,7 +422,14 @@ namespace MediaBrowser.XbmcMetadata.Savers /// Adds the common nodes. /// /// Task. - private void AddCommonNodes(BaseItem item, XmlWriter writer, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepo, IFileSystem fileSystem, IServerConfigurationManager config) + private void AddCommonNodes( + BaseItem item, + XmlWriter writer, + ILibraryManager libraryManager, + IUserManager userManager, + IUserDataManager userDataRepo, + IFileSystem fileSystem, + IServerConfigurationManager config) { var writtenProviderIds = new HashSet(StringComparer.OrdinalIgnoreCase); @@ -515,12 +521,12 @@ namespace MediaBrowser.XbmcMetadata.Savers if (item.CommunityRating.HasValue) { - writer.WriteElementString("rating", item.CommunityRating.Value.ToString(_usCulture)); + writer.WriteElementString("rating", item.CommunityRating.Value.ToString(CultureInfo.InvariantCulture)); } if (item.ProductionYear.HasValue) { - writer.WriteElementString("year", item.ProductionYear.Value.ToString(_usCulture)); + writer.WriteElementString("year", item.ProductionYear.Value.ToString(CultureInfo.InvariantCulture)); } var forcedSortName = item.ForcedSortName; @@ -534,13 +540,10 @@ namespace MediaBrowser.XbmcMetadata.Savers writer.WriteElementString("mpaa", item.OfficialRating); } - var hasAspectRatio = item as IHasAspectRatio; - if (hasAspectRatio != null) + if (item is IHasAspectRatio hasAspectRatio + && !string.IsNullOrEmpty(hasAspectRatio.AspectRatio)) { - if (!string.IsNullOrEmpty(hasAspectRatio.AspectRatio)) - { - writer.WriteElementString("aspectratio", hasAspectRatio.AspectRatio); - } + writer.WriteElementString("aspectratio", hasAspectRatio.AspectRatio); } var tmdbCollection = item.GetProviderId(MetadataProviders.TmdbCollection); @@ -562,6 +565,7 @@ namespace MediaBrowser.XbmcMetadata.Savers { writer.WriteElementString("imdbid", imdb); } + writtenProviderIds.Add(MetadataProviders.Imdb.ToString()); } @@ -598,12 +602,18 @@ namespace MediaBrowser.XbmcMetadata.Savers if (item is MusicArtist) { - writer.WriteElementString("formed", item.PremiereDate.Value.ToLocalTime().ToString(formatString)); + writer.WriteElementString( + "formed", + item.PremiereDate.Value.ToLocalTime().ToString(formatString)); } else { - writer.WriteElementString("premiered", item.PremiereDate.Value.ToLocalTime().ToString(formatString)); - writer.WriteElementString("releasedate", item.PremiereDate.Value.ToLocalTime().ToString(formatString)); + writer.WriteElementString( + "premiered", + item.PremiereDate.Value.ToLocalTime().ToString(formatString)); + writer.WriteElementString( + "releasedate", + item.PremiereDate.Value.ToLocalTime().ToString(formatString)); } } @@ -613,13 +623,17 @@ namespace MediaBrowser.XbmcMetadata.Savers { var formatString = options.ReleaseDateFormat; - writer.WriteElementString("enddate", item.EndDate.Value.ToLocalTime().ToString(formatString)); + writer.WriteElementString( + "enddate", + item.EndDate.Value.ToLocalTime().ToString(formatString)); } } if (item.CriticRating.HasValue) { - writer.WriteElementString("criticrating", item.CriticRating.Value.ToString(_usCulture)); + writer.WriteElementString( + "criticrating", + item.CriticRating.Value.ToString(CultureInfo.InvariantCulture)); } if (item is IHasDisplayOrder hasDisplayOrder) @@ -637,7 +651,9 @@ namespace MediaBrowser.XbmcMetadata.Savers { var timespan = TimeSpan.FromTicks(runTimeTicks.Value); - writer.WriteElementString("runtime", Convert.ToInt64(timespan.TotalMinutes).ToString(_usCulture)); + writer.WriteElementString( + "runtime", + Convert.ToInt64(timespan.TotalMinutes).ToString(CultureInfo.InvariantCulture)); } if (!string.IsNullOrWhiteSpace(item.Tagline)) @@ -745,9 +761,9 @@ namespace MediaBrowser.XbmcMetadata.Savers try { var tagName = GetTagForProviderKey(providerKey); - //logger.LogDebug("Verifying custom provider tagname {0}", tagName); + Logger.LogDebug("Verifying custom provider tagname {0}", tagName); XmlConvert.VerifyName(tagName); - //logger.LogDebug("Saving custom provider tagname {0}", tagName); + Logger.LogDebug("Saving custom provider tagname {0}", tagName); writer.WriteElementString(GetTagForProviderKey(providerKey), providerId); } @@ -854,29 +870,43 @@ namespace MediaBrowser.XbmcMetadata.Savers var userdata = userDataRepo.GetUserData(user, item); - writer.WriteElementString("isuserfavorite", userdata.IsFavorite.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); + writer.WriteElementString( + "isuserfavorite", + userdata.IsFavorite.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); if (userdata.Rating.HasValue) { - writer.WriteElementString("userrating", userdata.Rating.Value.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); + writer.WriteElementString( + "userrating", + userdata.Rating.Value.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); } if (!item.IsFolder) { - writer.WriteElementString("playcount", userdata.PlayCount.ToString(_usCulture)); - writer.WriteElementString("watched", userdata.Played.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); + writer.WriteElementString( + "playcount", + userdata.PlayCount.ToString(CultureInfo.InvariantCulture)); + writer.WriteElementString( + "watched", + userdata.Played.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); if (userdata.LastPlayedDate.HasValue) { - writer.WriteElementString("lastplayed", userdata.LastPlayedDate.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss").ToLowerInvariant()); + writer.WriteElementString( + "lastplayed", + userdata.LastPlayedDate.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss").ToLowerInvariant()); } writer.WriteStartElement("resume"); var runTimeTicks = item.RunTimeTicks ?? 0; - writer.WriteElementString("position", TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds.ToString(_usCulture)); - writer.WriteElementString("total", TimeSpan.FromTicks(runTimeTicks).TotalSeconds.ToString(_usCulture)); + writer.WriteElementString( + "position", + TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds.ToString(CultureInfo.InvariantCulture)); + writer.WriteElementString( + "total", + TimeSpan.FromTicks(runTimeTicks).TotalSeconds.ToString(CultureInfo.InvariantCulture)); } writer.WriteEndElement(); @@ -910,7 +940,9 @@ namespace MediaBrowser.XbmcMetadata.Savers if (person.SortOrder.HasValue) { - writer.WriteElementString("sortorder", person.SortOrder.Value.ToString(_usCulture)); + writer.WriteElementString( + "sortorder", + person.SortOrder.Value.ToString(CultureInfo.InvariantCulture)); } if (saveImagePath) @@ -920,7 +952,9 @@ namespace MediaBrowser.XbmcMetadata.Savers if (image != null) { - writer.WriteElementString("thumb", GetImagePathToSave(image, libraryManager, config)); + writer.WriteElementString( + "thumb", + GetImagePathToSave(image, libraryManager, config)); } } @@ -939,11 +973,10 @@ namespace MediaBrowser.XbmcMetadata.Savers } private bool IsPersonType(PersonInfo person, string type) - { - return string.Equals(person.Type, type, StringComparison.OrdinalIgnoreCase) || string.Equals(person.Role, type, StringComparison.OrdinalIgnoreCase); - } + => string.Equals(person.Type, type, StringComparison.OrdinalIgnoreCase) + || string.Equals(person.Role, type, StringComparison.OrdinalIgnoreCase); - private void AddCustomTags(string path, List xmlTagsUsed, XmlWriter writer, ILogger logger, IFileSystem fileSystem) + private void AddCustomTags(string path, List xmlTagsUsed, XmlWriter writer, ILogger logger) { var settings = new XmlReaderSettings() { @@ -963,7 +996,7 @@ namespace MediaBrowser.XbmcMetadata.Savers } catch (Exception ex) { - logger.LogError(ex, "Error reading existing xml tags from {path}.", path); + logger.LogError(ex, "Error reading existing xml tags from {Path}.", path); return; } @@ -976,7 +1009,8 @@ namespace MediaBrowser.XbmcMetadata.Savers { var name = reader.Name; - if (!_commonTags.Contains(name) && !xmlTagsUsed.Contains(name, StringComparer.OrdinalIgnoreCase)) + if (!_commonTags.Contains(name) + && !xmlTagsUsed.Contains(name, StringComparer.OrdinalIgnoreCase)) { writer.WriteNode(reader, false); }