Schematize NFO in XBMC with Kodi format: https://kodi.wiki/view/NFO_files/Movies

pull/5662/head
jasimancas 4 years ago committed by Qstick
parent 44fa36373c
commit f734ba2323

@ -1,3 +1,6 @@
// Esquema obtenido de: https://kodi.wiki/view/NFO_files/Movies
// Validado para Kodiv V18 (Leila)
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
@ -47,7 +50,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
private static readonly Regex MovieImagesRegex = new Regex(@"^(?<type>poster|banner|fanart|clearart|discart|keyart|landscape|logo|backdrop|clearlogo)\.(?:png|jpe?g)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex MovieImagesRegex = new Regex(@"^(?<type>poster|banner|fanart|clearart|discart|keyart|landscape|logo|backdrop|clearlogo)\.(?:png|jpe?g)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex MovieFileImageRegex = new Regex(@"(?<type>-thumb|-poster|-banner|-fanart|-clearart|-discart|-keyart|-landscape|-logo|-backdrop|-clearlogo)\.(?:png|jpe?g)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex MovieFileImageRegex = new Regex(@"(?<type>-thumb|-poster|-banner|-fanart|-clearart|-discart|-keyart|-landscape|-logo|-backdrop|-clearlogo)\.(?:png|jpe?g)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public override string Name => "Kodi (XBMC) / Emby"; public override string Name => "Kodi/XBMC/Jellyfin";
public override string GetFilenameAfterMove(Movie movie, MovieFile movieFile, MetadataFile metadataFile) public override string GetFilenameAfterMove(Movie movie, MovieFile movieFile, MetadataFile metadataFile)
{ {
@ -144,39 +147,106 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
details.Add(new XElement("title", movieTranslation?.Title ?? movie.Title)); details.Add(new XElement("title", movieTranslation?.Title ?? movie.Title));
details.Add(new XElement("originaltitle", movie.OriginalTitle));
details.Add(new XElement("sorttitle", movie.SortTitle));
if (movie.Ratings != null && movie.Ratings.Votes > 0) if (movie.Ratings != null && movie.Ratings.Votes > 0)
{ {
details.Add(new XElement("rating", movie.Ratings.Value)); details.Add(new XElement("rating", movie.Ratings.Value));
} }
#region userrating
// pendiente de poner
#endregion
#region top250
// pendiente de poner
#endregion
#region outline
// pendiente de poner
#endregion
details.Add(new XElement("plot", movieTranslation?.Overview ?? movie.Overview)); details.Add(new XElement("plot", movieTranslation?.Overview ?? movie.Overview));
details.Add(new XElement("id", movie.ImdbId));
details.Add(new XElement("tmdbid", movie.TmdbId));
if (movie.ImdbId.IsNotNullOrWhiteSpace()) #region tagline
// pendiente de poner
#endregion
details.Add(new XElement("runtime", movie.Runtime));
// banner? clearart? clearlogo? discart? landscape? poster?
if (thumbnail != null)
{ {
var imdbId = new XElement("uniqueid", movie.ImdbId); details.Add(new XElement("thumb", thumbnail.Url));
imdbId.SetAttributeValue("type", "imdb"); }
imdbId.SetAttributeValue("default", true); else
details.Add(imdbId); {
details.Add(new XElement("thumb"));
} }
var uniqueId = new XElement("uniqueid", movie.TmdbId); foreach (var poster in posters)
uniqueId.SetAttributeValue("type", "tmdb"); {
details.Add(uniqueId); if (poster != null && poster.Url != null)
{
details.Add(new XElement("thumb", new XAttribute("aspect", "poster"), poster.Url));
}
}
if (fanarts.Any())
{
var fanartElement = new XElement("fanart");
foreach (var fanart in fanarts)
{
if (fanart != null && fanart.Url != null)
{
fanartElement.Add(new XElement("thumb", fanart.Url));
}
}
details.Add(fanartElement);
}
if (movie.Certification.IsNotNullOrWhiteSpace()) if (movie.Certification.IsNotNullOrWhiteSpace())
{ {
details.Add(new XElement("mpaa", movie.Certification)); details.Add(new XElement("mpaa", movie.Certification));
} }
details.Add(new XElement("year", movie.Year)); #region playcount
// pendiente de poner
#endregion
if (movie.InCinemas.HasValue) #region lastplayed
// pendiente de poner
#endregion
// #region id
// details.Add(new XElement("id", movie.ImdbId));
// details.Add(new XElement("tmdbid", movie.TmdbId));
// #endregion
var uniqueId = new XElement("uniqueid", movie.TmdbId);
uniqueId.SetAttributeValue("type", "tmdb");
details.Add(uniqueId);
if (movie.ImdbId.IsNotNullOrWhiteSpace())
{ {
details.Add(new XElement("premiered", movie.InCinemas.Value.ToString("yyyy-MM-dd"))); var imdbId = new XElement("uniqueid", movie.ImdbId);
imdbId.SetAttributeValue("type", "imdb");
imdbId.SetAttributeValue("default", true);
details.Add(imdbId);
}
foreach (var genre in movie.Genres)
{
details.Add(new XElement("genre", genre));
} }
#region country
// pendiente de poner
#endregion
if (movie.Collection?.Name != null) if (movie.Collection?.Name != null)
{ {
var setElement = new XElement("set"); var setElement = new XElement("set");
@ -186,54 +256,56 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
details.Add(setElement); details.Add(setElement);
} }
if (movie.Collection?.TmdbId > 0) #region tag
{ //details.Add(new XElement("tag", movie.Tags)); //Añadido Tags //Estan vacios en la BBDD...
details.Add(new XElement("tmdbCollectionId", movie.Collection.TmdbId)); #endregion
var uniqueSetId = new XElement("uniqueid", movie.Collection.TmdbId); // esto hay que comprobarlo, porque este credits es el escritor y lo mete como ¿actores?
uniqueSetId.SetAttributeValue("type", "tmdbSet"); var credits = _creditService.GetAllCreditsForMovie(movie.Id);
details.Add(uniqueSetId);
}
foreach (var genre in movie.Genres) foreach (var credit in credits)
{ {
details.Add(new XElement("genre", genre)); if (credit.Name != null && credit.Character != null)
} {
var actorElement = new XElement("actor");
details.Add(new XElement("studio", movie.Studio)); actorElement.Add(new XElement("name", credit.Name));
actorElement.Add(new XElement("role", credit.Character));
actorElement.Add(new XElement("order", credit.Order));
if (thumbnail == null) var headshot = credit.Images.FirstOrDefault(m => m.CoverType == MediaCoverTypes.Headshot);
{
details.Add(new XElement("thumb")); if (headshot != null && headshot.Url != null)
}
else
{ {
details.Add(new XElement("thumb", thumbnail.Url)); actorElement.Add(new XElement("thumb", headshot.Url));
} }
foreach (var poster in posters) details.Add(actorElement);
{
if (poster != null && poster.Url != null)
{
details.Add(new XElement("thumb", new XAttribute("aspect", "poster"), poster.Url));
} }
} }
if (fanarts.Any()) if (movie.InCinemas.HasValue)
{
var fanartElement = new XElement("fanart");
foreach (var fanart in fanarts)
{
if (fanart != null && fanart.Url != null)
{ {
fanartElement.Add(new XElement("thumb", fanart.Url)); details.Add(new XElement("premiered", movie.InCinemas.Value.ToString("yyyy-MM-dd")));
}
} }
details.Add(fanartElement); details.Add(new XElement("year", movie.Year));
}
#region collection
// Esto no aparece en el NFO de Kodi, pendiente de ver si borrar o no
// if (movie.Collection?.TmdbId > 0)
// {
// details.Add(new XElement("tmdbCollectionId", movie.Collection.TmdbId));
// var uniqueSetId = new XElement("uniqueid", movie.Collection.TmdbId);
// uniqueSetId.SetAttributeValue("type", "tmdbSet");
// details.Add(uniqueSetId);
// }
#endregion
details.Add(new XElement("studio", movie.Studio));
details.Add(new XElement("watched", watched)); details.Add(new XElement("trailer", "https://www.youtube.com/watch?v=" + movie.YouTubeTrailerId)); //Añadido el trailer
if (movieFile.MediaInfo != null) if (movieFile.MediaInfo != null)
{ {
@ -274,33 +346,9 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
streamDetails.Add(subtitle); streamDetails.Add(subtitle);
} }
var credits = _creditService.GetAllCreditsForMovie(movie.Id);
foreach (var credit in credits)
{
if (credit.Name != null && credit.Character != null)
{
var actorElement = new XElement("actor");
actorElement.Add(new XElement("name", credit.Name));
actorElement.Add(new XElement("role", credit.Character));
actorElement.Add(new XElement("order", credit.Order));
var headshot = credit.Images.FirstOrDefault(m => m.CoverType == MediaCoverTypes.Headshot);
if (headshot != null && headshot.Url != null)
{
actorElement.Add(new XElement("thumb", headshot.Url));
}
details.Add(actorElement);
}
}
fileInfo.Add(streamDetails); fileInfo.Add(streamDetails);
details.Add(fileInfo); details.Add(fileInfo);
} }
doc.Add(details); doc.Add(details);
doc.Save(xw); doc.Save(xw);

Loading…
Cancel
Save