< Summary - Jellyfin

Information
Class: MediaBrowser.XbmcMetadata.Parsers.MovieNfoParser
Assembly: MediaBrowser.XbmcMetadata
File(s): /srv/git/jellyfin/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs
Line coverage
88%
Covered lines: 48
Uncovered lines: 6
Coverable lines: 54
Total lines: 166
Line coverage: 88.8%
Branch coverage
95%
Covered branches: 38
Total branches: 40
Branch coverage: 95%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_SupportsUrlAfterClosingXmlTag()100%11100%
FetchDataFromXmlNode(...)93.75%33.673288.23%
ParseSetXml(...)100%8.1888.23%

File(s)

/srv/git/jellyfin/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs

#LineLine coverage
 1using System;
 2using System.IO;
 3using System.Linq;
 4using System.Xml;
 5using MediaBrowser.Common.Configuration;
 6using MediaBrowser.Controller.Entities;
 7using MediaBrowser.Controller.Entities.Movies;
 8using MediaBrowser.Controller.Extensions;
 9using MediaBrowser.Controller.Library;
 10using MediaBrowser.Controller.Providers;
 11using MediaBrowser.Model.Entities;
 12using Microsoft.Extensions.Logging;
 13
 14namespace MediaBrowser.XbmcMetadata.Parsers
 15{
 16    /// <summary>
 17    /// Nfo parser for movies.
 18    /// </summary>
 19    public class MovieNfoParser : BaseNfoParser<Video>
 20    {
 21        /// <summary>
 22        /// Initializes a new instance of the <see cref="MovieNfoParser"/> class.
 23        /// </summary>
 24        /// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>
 25        /// <param name="config">Instance of the <see cref="IConfigurationManager"/> interface.</param>
 26        /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
 27        /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
 28        /// <param name="userDataManager">Instance of the <see cref="IUserDataManager"/> interface.</param>
 29        /// <param name="directoryService">Instance of the <see cref="DirectoryService"/> interface.</param>
 30        public MovieNfoParser(
 31            ILogger logger,
 32            IConfigurationManager config,
 33            IProviderManager providerManager,
 34            IUserManager userManager,
 35            IUserDataManager userDataManager,
 36            IDirectoryService directoryService)
 1037            : base(logger, config, providerManager, userManager, userDataManager, directoryService)
 38        {
 1039        }
 40
 41        /// <inheritdoc />
 642        protected override bool SupportsUrlAfterClosingXmlTag => true;
 43
 44        /// <inheritdoc />
 45        protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Video> itemResult)
 46        {
 15847            var item = itemResult.Item;
 48
 15849            switch (reader.Name)
 50            {
 51                case "id":
 52                    {
 53                        // get ids from attributes
 254                        string? imdbId = reader.GetAttribute("IMDB");
 255                        string? tmdbId = reader.GetAttribute("TMDB");
 56
 57                        // read id from content
 258                        var contentId = reader.ReadElementContentAsString();
 259                        if (contentId.Contains("tt", StringComparison.Ordinal) && string.IsNullOrEmpty(imdbId))
 60                        {
 161                            imdbId = contentId;
 62                        }
 163                        else if (string.IsNullOrEmpty(tmdbId))
 64                        {
 165                            tmdbId = contentId;
 66                        }
 67
 268                        item.TrySetProviderId(MetadataProvider.Imdb, imdbId);
 269                        item.TrySetProviderId(MetadataProvider.Tmdb, tmdbId);
 70
 271                        break;
 72                    }
 73
 74                case "set":
 75                    {
 176                        var movie = item as Movie;
 77
 178                        var tmdbcolid = reader.GetAttribute("tmdbcolid");
 179                        movie?.TrySetProviderId(MetadataProvider.TmdbCollection, tmdbcolid);
 80
 181                        var val = reader.ReadInnerXml();
 82
 183                        if (!string.IsNullOrWhiteSpace(val) && movie is not null)
 84                        {
 85                            // TODO Handle this better later
 186                            if (!val.Contains('<', StringComparison.Ordinal))
 87                            {
 088                                movie.CollectionName = val;
 89                            }
 90                            else
 91                            {
 92                                try
 93                                {
 194                                    ParseSetXml(val, movie);
 195                                }
 096                                catch (Exception ex)
 97                                {
 098                                    Logger.LogError(ex, "Error parsing set node");
 099                                }
 100                            }
 101                        }
 102
 103                        break;
 104                    }
 105
 106                case "artist":
 1107                    var artist = reader.ReadNormalizedString();
 1108                    if (!string.IsNullOrEmpty(artist) && item is MusicVideo artistVideo)
 109                    {
 1110                        artistVideo.Artists = [..artistVideo.Artists, artist];
 111                    }
 112
 1113                    break;
 114                case "album":
 1115                    var album = reader.ReadNormalizedString();
 1116                    if (!string.IsNullOrEmpty(album) && item is MusicVideo albumVideo)
 117                    {
 1118                        albumVideo.Album = album;
 119                    }
 120
 1121                    break;
 122                default:
 153123                    base.FetchDataFromXmlNode(reader, itemResult);
 124                    break;
 125            }
 154126        }
 127
 128        private void ParseSetXml(string xml, Movie movie)
 129        {
 130            // These are not going to be valid xml so no sense in causing the provider to fail and spamming the log with
 131            try
 132            {
 1133                using (var stringReader = new StringReader("<set>" + xml + "</set>"))
 1134                using (var reader = XmlReader.Create(stringReader, GetXmlReaderSettings()))
 135                {
 1136                    reader.MoveToContent();
 1137                    reader.Read();
 138
 139                    // Loop through each element
 7140                    while (!reader.EOF && reader.ReadState == ReadState.Interactive)
 141                    {
 6142                        if (reader.NodeType == XmlNodeType.Element)
 143                        {
 2144                            switch (reader.Name)
 145                            {
 146                                case "name":
 1147                                    movie.CollectionName = reader.ReadElementContentAsString();
 1148                                    break;
 149                                default:
 1150                                    reader.Skip();
 1151                                    break;
 152                            }
 153                        }
 154                        else
 155                        {
 4156                            reader.Read();
 157                        }
 158                    }
 1159                }
 1160            }
 0161            catch (XmlException)
 162            {
 0163            }
 1164        }
 165    }
 166}