MediaPortal.Video.Database.IMDBMovie.FetchMovieNfo C# (CSharp) Method

FetchMovieNfo() public static method

Check and set movie info data from nfo file (must be in the same directory where is videofile and must have the same name as video file. Exceptions are DVD and BluRay folders where nfo file should have name as main folder
public static FetchMovieNfo ( string path, string filename, IMDBMovie &movie ) : void
path string path is checked only for DVD/BD folders, in case of single video files it is the same as filename
filename string filename with full path
movie IMDBMovie
return void
    public static void FetchMovieNfo(string path, string filename, ref IMDBMovie movie)
    {
      try
      {
        string nfoFile = string.Empty;
        string nfoExt = ".nfo";
        string movienfoFile = @"\movie.nfo";
        
        if (filename.ToUpperInvariant().Contains("VIDEO_TS.IFO") || filename.ToUpperInvariant().Contains("INDEX.BDMV"))
        {
          nfoFile = path + @"\" + System.IO.Path.GetFileNameWithoutExtension(filename) + nfoExt;

          if (!System.IO.File.Exists(nfoFile))
          {
            string noStackPath = path;
            Util.Utils.RemoveStackEndings(ref noStackPath);
            nfoFile = path + @"\" + System.IO.Path.GetFileNameWithoutExtension(noStackPath) + nfoExt;

            if ((!System.IO.File.Exists(nfoFile)))
            {
              nfoFile = path + movienfoFile;
            }
          }
        }
        else
        {
          nfoFile = System.IO.Path.ChangeExtension(filename, nfoExt);
          Util.Utils.RemoveStackEndings(ref nfoFile);

          if ((!System.IO.File.Exists(nfoFile)))
          {
            nfoFile = path + movienfoFile;
          }
        }
        
        if (!System.IO.File.Exists(nfoFile))
        {
          return;
        }

        XmlDocument doc = new XmlDocument();

        try
        {
          doc.Load(nfoFile);
        }
        catch (Exception)
        {
          Log.Info("GUIVideoFiles.Load nfo file error: {0} is not a valid XML document", nfoFile);
          return;
        }

        if (doc.DocumentElement != null)
        {
          XmlNodeList movieList = doc.DocumentElement.SelectNodes("/movie");

          if (movieList == null)
          {
            return;
          }

          foreach (XmlNode nodeMovie in movieList)
          {
            string genre = string.Empty;
            string cast = string.Empty;
            string movieCollection = string.Empty;
            string userGroup = string.Empty;

            #region nodes

            XmlNode nodeTitle = nodeMovie.SelectSingleNode("title");
            XmlNode nodeRating = nodeMovie.SelectSingleNode("rating");
            XmlNode nodeUserRating = nodeMovie.SelectSingleNode("userrating");
            XmlNode nodeYear = nodeMovie.SelectSingleNode("year");
            XmlNode nodeDuration = nodeMovie.SelectSingleNode("runtime");
            XmlNode nodePlotShort = nodeMovie.SelectSingleNode("outline");
            XmlNode nodePlot = nodeMovie.SelectSingleNode("plot");
            XmlNode nodeTagline = nodeMovie.SelectSingleNode("tagline");
            XmlNode nodeDirector = nodeMovie.SelectSingleNode("director");
            XmlNode nodeImdbNumber = nodeMovie.SelectSingleNode("imdb");
            XmlNode nodeIdImdbNumber = nodeMovie.SelectSingleNode("id");
            XmlNode nodeMpaa = nodeMovie.SelectSingleNode("mpaa");
            XmlNode nodeTop250 = nodeMovie.SelectSingleNode("top250");
            XmlNode nodeVotes = nodeMovie.SelectSingleNode("votes");
            XmlNode nodeStudio = nodeMovie.SelectSingleNode("studio");
            XmlNode nodePoster = nodeMovie.SelectSingleNode("thumb");
            XmlNode nodeLanguage = nodeMovie.SelectSingleNode("language");
            XmlNode nodeCountry = nodeMovie.SelectSingleNode("country");
            XmlNode nodeReview = nodeMovie.SelectSingleNode("review");
            XmlNode nodeCredits = nodeMovie.SelectSingleNode("credits");
            XmlNode nodeTMDBNumber = nodeMovie.SelectSingleNode("tmdb");
            XmlNode nodeLocalDBNumber = nodeMovie.SelectSingleNode("localdb");

            #endregion

            #region Genre

            XmlNodeList genres = nodeMovie.SelectNodes("genre");

            foreach (XmlNode nodeGenre in genres)
            {
              if (nodeGenre.InnerText != null)
              {
                if (genre.Length > 0)
                {
                  genre += " / ";
                }
                genre += nodeGenre.InnerText;
              }
            }

            if (string.IsNullOrEmpty(genre))
            {
              genres = nodeMovie.SelectNodes("genres/genre");

              foreach (XmlNode nodeGenre in genres)
              {
                if (nodeGenre.InnerText != null)
                {
                  if (genre.Length > 0)
                  {
                    genre += " / ";
                  }
                  genre += nodeGenre.InnerText;
                }
              }
            }

            // Genre
            movie.Genre = genre;

            #endregion

            #region Movie Collections / Set

            XmlNodeList movieCollections = nodeMovie.SelectNodes("set");

            foreach (XmlNode nodeMovieCollection in movieCollections)
            {
              XmlNode nodeSetName = nodeMovieCollection.SelectSingleNode("setname");
              if (nodeSetName == null)
              {
                if (nodeMovieCollection.InnerText != null)
                {
                  movieCollection += (string.IsNullOrEmpty(movieCollection) ? "" : " / ") + nodeMovieCollection.InnerText;
                }
              }
            }

            // Movie Collections / Set
            movie.MovieCollection = movieCollection;

            #endregion

            #region UserGroups

            XmlNodeList userGroups = nodeMovie.SelectNodes("set");

            foreach (XmlNode nodeUserGroup in userGroups)
            {
              XmlNode nodeSetName = nodeUserGroup.SelectSingleNode("setname");
              if (nodeSetName != null)
              {
                if (nodeSetName.InnerText != null)
                {
                  userGroup += (string.IsNullOrEmpty(userGroup) ? "" : " / ") + nodeSetName.InnerText;
                }
              }
            }

            // UserGroups
            movie.UserGroup = userGroup;

            #endregion

            #region Credits (Writers)

            // Writers
            if (nodeCredits != null)
            {
              movie.WritingCredits = nodeCredits.InnerText;
            }
            #endregion

            #region Cast

            // Cast parse
            XmlNodeList actorsList = nodeMovie.SelectNodes("actor");
            
            foreach (XmlNode nodeActor in actorsList)
            {
              string name = string.Empty;
              string role = string.Empty;
              string line = string.Empty;
              XmlNode nodeActorName = nodeActor.SelectSingleNode("name");
              XmlNode nodeActorRole = nodeActor.SelectSingleNode("role");
              
              if (nodeActorName != null && nodeActorName.InnerText != null)
              {
                name = nodeActorName.InnerText;
              }
              if (nodeActorRole != null && nodeActorRole.InnerText != null)
              {
                role = nodeActorRole.InnerText;
              }
              
              if (!string.IsNullOrEmpty(name))
              {
                if (!string.IsNullOrEmpty(role))
                {
                  line = String.Format(GUILocalizeStrings.Get(1320), name, role); // "{0} as {1}\n" = "Actor as role" string 
                }
                else
                {
                  line = String.Format("{0}\n", name);
                }
                cast += line;
              }
            }
            // Cast
            movie.Cast = cast;

            #endregion

            #region Moviefiles

            // Need to fake movie to see it's properties (id = 0 is not used in vdb for movies)
            movie.Path = path;
            movie.File = filename;
            movie.MovieNfoFile = nfoFile;
            int movieId = VideoDatabase.GetMovieId(filename);

            if (movieId < 0)
            {
              movie.ID = 0;
            }
            else
            {
              movie.ID = movieId;

              #region Watched status

              int percent = 0;
              int watchedCount = 0;
              VideoDatabase.GetmovieWatchedStatus(movieId, out percent, out watchedCount);

              if (watchedCount > 0)
              {
                movie.Watched = 1;
                movie.WatchedCount = watchedCount;
                movie.WatchedPercent = percent;
              }
              else
              {
                movie.Watched = 0;
                movie.WatchedCount = 0;
                movie.WatchedPercent = 0;
              }

              movie.ID = 0;

              #endregion
            }

            #endregion

            #region Title

            // Title
            if (nodeTitle != null)
            {
              movie.Title = nodeTitle.InnerText;
            }

            #endregion

            #region Language

            // Title
            if (nodeLanguage != null)
            {
              movie.Language = nodeLanguage.InnerText;
            }

            #endregion

            #region Country

            // Title
            if (nodeCountry != null)
            {
              movie.Country = nodeCountry.InnerText;
            }

            #endregion

            #region IMDB number

            // IMDB number
            if (nodeImdbNumber != null)
            {
              if (VideoDatabase.CheckMovieImdbId(nodeImdbNumber.InnerText))
              {
                movie.IMDBNumber = nodeImdbNumber.InnerText;
              }
            }

            if (string.IsNullOrEmpty(movie.IMDBNumber) && nodeIdImdbNumber != null)
            {
              if (VideoDatabase.CheckMovieImdbId(nodeIdImdbNumber.InnerText))
              {
                movie.IMDBNumber = nodeIdImdbNumber.InnerText;
              }
            }

            #endregion

            #region Director

            // Director
            if (nodeDirector != null)
            {
              movie.Director = nodeDirector.InnerText;
            }
            #endregion

            #region Studio

            // Studio
            if (nodeStudio != null)
            {
              movie.Studios = nodeStudio.InnerText;
            }

            #endregion

            #region MPAA

            // MPAA
            if (nodeMpaa != null)
            {
              movie.MPARating = nodeMpaa.InnerText;
            }
            else
            {
              movie.MPARating = "NR";
            }

            #endregion

            #region Plot/Short plot

            // Plot
            if (nodePlot != null)
            {
              movie.Plot = nodePlot.InnerText;
            }
            else
            {
              movie.Plot = string.Empty;
            }
            // Short plot
            if (nodePlotShort != null)
            {
              movie.PlotOutline = nodePlotShort.InnerText;
            }
            else
            {
              movie.PlotOutline = string.Empty;
            }

            #endregion

            #region Review

            // Title
            if (nodeReview != null)
            {
              movie.UserReview = nodeReview.InnerText;
            }

            #endregion

            #region Rating (n.n/10)

            // Rating
            if (nodeRating != null)
            {
              double rating = 0;
              if (Double.TryParse(nodeRating.InnerText.Replace(".", ","), out rating))
              {
                movie.Rating = (float)rating;

                if (movie.Rating > 10.0f)
                {
                  movie.Rating /= 10.0f;
                }
              }
            }

            #endregion

            #region UserRating

            // User Rating
            if (nodeUserRating != null)
            {
              int userrating = 0;
              if (int.TryParse(nodeUserRating.InnerText, out userrating))
              {
                movie.UserRating = (int)userrating;
              }
            }

            #endregion

            #region Duration

            // Duration
            if (nodeDuration != null)
            {
              int runtime = 0;
              if (Int32.TryParse(nodeDuration.InnerText, out runtime))
              {
                movie.RunTime = runtime;
              }
              else
              {
                string regex = "(?<h>[0-9]*)h.(?<m>[0-9]*)";
                MatchCollection mc = Regex.Matches(nodeDuration.InnerText, regex, RegexOptions.Singleline | RegexOptions.IgnoreCase);
                if (mc.Count > 0)
                {
                  foreach (Match m in mc)
                  {
                    int hours = 0;
                    Int32.TryParse(m.Groups["h"].Value, out hours);
                    int minutes = 0;
                    Int32.TryParse(m.Groups["m"].Value, out minutes);
                    hours = hours * 60;
                    minutes = hours + minutes;
                    movie.RunTime = minutes;
                  }
                }
                else
                {
                  regex = @"\d*\s*min.";
                  if (Regex.Match(nodeDuration.InnerText, regex, RegexOptions.IgnoreCase).Success)
                  {
                    regex = @"\d*";
                    int minutes = 0;
                    Int32.TryParse(Regex.Match(nodeDuration.InnerText, regex).Value, out minutes);
                    movie.RunTime = minutes;
                  }
                }
              }
            }
            else
            {
              movie.RunTime = 0;
            }

            #endregion

            #region Tagline

            // Tagline
            if (nodeTagline != null)
            {
              movie.TagLine = nodeTagline.InnerText;
            }

            #endregion

            #region TMDB Number

            // TMDB Number
            if (nodeTMDBNumber != null)
            {
              movie.TMDBNumber = nodeTMDBNumber.InnerText;
            }

            #endregion

            #region LocalDB Number

            // LocalDB Number
            if (nodeLocalDBNumber != null)
            {
              movie.LocalDBNumber = nodeLocalDBNumber.InnerText;
            }

            #endregion

            #region TOP250

            // Top250
            if (nodeTop250 != null)
            {
              int top250 = 0;
              Int32.TryParse(nodeTop250.InnerText, out top250);
              movie.Top250 = top250;
            }
            else
            {
              movie.Top250 = 0;
            }


            #endregion

            #region votes

            // Votes
            if (nodeVotes != null)
            {
              movie.Votes = nodeVotes.InnerText;
            }

            #endregion

            #region Year

            // Year
            if (nodeYear != null)
            {
              int year = 0;
              Int32.TryParse(nodeYear.InnerText, out year);
              movie.Year = year;
            }

            #endregion

            #region poster

            // Poster
            string thumbJpgFile = string.Empty;
            string thumbTbnFile = string.Empty;
            string thumbJpgFileLocal = string.Empty;
            string thumbTbnFileLocal = string.Empty;
            string jpgExt = @".jpg";
            string tbnExt = @".tbn";
            string folderJpg = @"\folder.jpg";
            string folderJpgImage = path + folderJpg;

            if (nodePoster != null)
            {
              filename = System.IO.Path.GetFileNameWithoutExtension(filename);
              Util.Utils.RemoveStackEndings(ref filename);

              thumbJpgFile = path + @"\" + nodePoster.InnerText;
              thumbTbnFile = path + @"\" + nodePoster.InnerText;
              thumbJpgFileLocal = path + @"\" + filename + jpgExt;
              thumbTbnFileLocal = path + @"\" + filename + tbnExt;

              // local
              if (System.IO.File.Exists(thumbJpgFileLocal))
              {
                movie.ThumbURL = thumbJpgFileLocal;
              }
              else if (System.IO.File.Exists(thumbTbnFileLocal))
              {
                movie.ThumbURL = thumbTbnFileLocal;
              }
              // XML
              else if (System.IO.File.Exists(thumbJpgFile))
              {
                movie.ThumbURL = thumbJpgFile;
              }
              else if (System.IO.File.Exists(thumbTbnFile))
              {
                movie.ThumbURL = thumbTbnFile;
              }
            }
            else
            {
              filename = System.IO.Path.GetFileNameWithoutExtension(filename);
              Util.Utils.RemoveStackEndings(ref filename);

              thumbJpgFileLocal = path + @"\" + filename + jpgExt;
              thumbTbnFileLocal = path + @"\" + filename + tbnExt;

              if (System.IO.File.Exists(thumbJpgFileLocal))
              {
                movie.ThumbURL = thumbJpgFileLocal;
              }
              else if (System.IO.File.Exists(thumbTbnFileLocal))
              {
                movie.ThumbURL = thumbTbnFileLocal;
              }
            }

            // Try folder.jpg
            if (string.IsNullOrEmpty(movie.ThumbURL))
            {
              if (Util.Utils.IsFolderDedicatedMovieFolder(path) && System.IO.File.Exists(folderJpgImage))
              {
                movie.ThumbURL = folderJpgImage;
              }
            }

            #endregion

          }
        }
      }
      catch (ThreadAbortException)
      {
        // Will be logged in thread main code
      }
      catch (Exception ex)
      {
        Log.Error("GUIVideoFiles. Error in nfo xml document: {0}", ex.Message);
      }
    }