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);
}
}