mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-25 22:36:59 -04:00
Fixed: Detect Kodi nfo vs. Scene nfo. Other extras fixes
Fixes #240 Co-Authored-By: taloth <taloth@users.noreply.github.com>
This commit is contained in:
@@ -17,14 +17,17 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
||||
{
|
||||
public class XbmcMetadata : MetadataBase<XbmcMetadataSettings>
|
||||
{
|
||||
private readonly IMapCoversToLocal _mediaCoverService;
|
||||
private readonly Logger _logger;
|
||||
private readonly IMapCoversToLocal _mediaCoverService;
|
||||
private readonly IDetectXbmcNfo _detectNfo;
|
||||
|
||||
public XbmcMetadata(IMapCoversToLocal mediaCoverService,
|
||||
public XbmcMetadata(IDetectXbmcNfo detectNfo,
|
||||
IMapCoversToLocal mediaCoverService,
|
||||
Logger logger)
|
||||
{
|
||||
_mediaCoverService = mediaCoverService;
|
||||
_logger = logger;
|
||||
_mediaCoverService = mediaCoverService;
|
||||
_detectNfo = detectNfo;
|
||||
}
|
||||
|
||||
private static readonly Regex ArtistImagesRegex = new Regex(@"^(?<type>poster|banner|fanart|logo)\.(?:png|jpg|jpeg)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
@@ -72,27 +75,22 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
||||
return metadata;
|
||||
}
|
||||
|
||||
if (filename.Equals("artist.nfo", StringComparison.OrdinalIgnoreCase))
|
||||
var isXbmcNfoFile = _detectNfo.IsXbmcNfoFile(path);
|
||||
|
||||
if (filename.Equals("artist.nfo", StringComparison.OrdinalIgnoreCase) &&
|
||||
isXbmcNfoFile)
|
||||
{
|
||||
metadata.Type = MetadataType.ArtistMetadata;
|
||||
return metadata;
|
||||
}
|
||||
|
||||
if (filename.Equals("album.nfo", StringComparison.OrdinalIgnoreCase))
|
||||
if (filename.Equals("album.nfo", StringComparison.OrdinalIgnoreCase) &&
|
||||
isXbmcNfoFile)
|
||||
{
|
||||
metadata.Type = MetadataType.AlbumMetadata;
|
||||
return metadata;
|
||||
}
|
||||
|
||||
var parseResult = Parser.Parser.ParseMusicTitle(filename);
|
||||
|
||||
if (parseResult != null &&
|
||||
Path.GetExtension(filename).Equals(".nfo", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
metadata.Type = MetadataType.TrackMetadata;
|
||||
return metadata;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -196,93 +194,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
||||
|
||||
public override MetadataFileResult TrackMetadata(Artist artist, TrackFile trackFile)
|
||||
{
|
||||
if (!Settings.TrackMetadata)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
_logger.Debug("Generating Track Metadata for: {0}", Path.Combine(artist.Path, trackFile.RelativePath));
|
||||
|
||||
var xmlResult = string.Empty;
|
||||
foreach (var episode in trackFile.Tracks.Value)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
var xws = new XmlWriterSettings();
|
||||
xws.OmitXmlDeclaration = true;
|
||||
xws.Indent = false;
|
||||
|
||||
using (var xw = XmlWriter.Create(sb, xws))
|
||||
{
|
||||
var doc = new XDocument();
|
||||
|
||||
var details = new XElement("episodedetails");
|
||||
details.Add(new XElement("title", episode.Title));
|
||||
details.Add(new XElement("episode", episode.TrackNumber));
|
||||
|
||||
//If trakt ever gets airs before information for specials we should add set it
|
||||
details.Add(new XElement("displayseason"));
|
||||
details.Add(new XElement("displayepisode"));
|
||||
|
||||
details.Add(new XElement("watched", "false"));
|
||||
|
||||
if (episode.Ratings != null && episode.Ratings.Votes > 0)
|
||||
{
|
||||
details.Add(new XElement("rating", episode.Ratings.Value));
|
||||
}
|
||||
|
||||
if (trackFile.MediaInfo != null)
|
||||
{
|
||||
var fileInfo = new XElement("fileinfo");
|
||||
var streamDetails = new XElement("streamdetails");
|
||||
|
||||
var video = new XElement("video");
|
||||
video.Add(new XElement("aspect", (float)trackFile.MediaInfo.Width / (float)trackFile.MediaInfo.Height));
|
||||
video.Add(new XElement("bitrate", trackFile.MediaInfo.VideoBitrate));
|
||||
video.Add(new XElement("codec", trackFile.MediaInfo.VideoCodec));
|
||||
video.Add(new XElement("framerate", trackFile.MediaInfo.VideoFps));
|
||||
video.Add(new XElement("height", trackFile.MediaInfo.Height));
|
||||
video.Add(new XElement("scantype", trackFile.MediaInfo.ScanType));
|
||||
video.Add(new XElement("width", trackFile.MediaInfo.Width));
|
||||
|
||||
if (trackFile.MediaInfo.RunTime != null)
|
||||
{
|
||||
video.Add(new XElement("duration", trackFile.MediaInfo.RunTime.TotalMinutes));
|
||||
video.Add(new XElement("durationinseconds", trackFile.MediaInfo.RunTime.TotalSeconds));
|
||||
}
|
||||
|
||||
streamDetails.Add(video);
|
||||
|
||||
var audio = new XElement("audio");
|
||||
audio.Add(new XElement("bitrate", trackFile.MediaInfo.AudioBitrate));
|
||||
audio.Add(new XElement("channels", trackFile.MediaInfo.AudioChannels));
|
||||
audio.Add(new XElement("codec", GetAudioCodec(trackFile.MediaInfo.AudioFormat)));
|
||||
audio.Add(new XElement("language", trackFile.MediaInfo.AudioLanguages));
|
||||
streamDetails.Add(audio);
|
||||
|
||||
if (trackFile.MediaInfo.Subtitles != null && trackFile.MediaInfo.Subtitles.Length > 0)
|
||||
{
|
||||
var subtitle = new XElement("subtitle");
|
||||
subtitle.Add(new XElement("language", trackFile.MediaInfo.Subtitles));
|
||||
streamDetails.Add(subtitle);
|
||||
}
|
||||
|
||||
fileInfo.Add(streamDetails);
|
||||
details.Add(fileInfo);
|
||||
}
|
||||
|
||||
//Todo: get guest stars, writer and director
|
||||
//details.Add(new XElement("credits", tvdbEpisode.Writer.FirstOrDefault()));
|
||||
//details.Add(new XElement("director", tvdbEpisode.Directors.FirstOrDefault()));
|
||||
|
||||
doc.Add(details);
|
||||
doc.Save(xw);
|
||||
|
||||
xmlResult += doc.ToString();
|
||||
xmlResult += Environment.NewLine;
|
||||
}
|
||||
}
|
||||
|
||||
return new MetadataFileResult(GetTrackMetadataFilename(trackFile.RelativePath), xmlResult.Trim(Environment.NewLine.ToCharArray()));
|
||||
return null;
|
||||
}
|
||||
|
||||
public override List<ImageFileResult> ArtistImages(Artist artist)
|
||||
@@ -339,14 +251,5 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
||||
return Path.ChangeExtension(trackFilePath, "nfo");
|
||||
}
|
||||
|
||||
private string GetAudioCodec(string audioCodec)
|
||||
{
|
||||
if (audioCodec == "AC-3")
|
||||
{
|
||||
return "AC3";
|
||||
}
|
||||
|
||||
return audioCodec;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,20 +17,16 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
||||
{
|
||||
ArtistMetadata = true;
|
||||
AlbumMetadata = true;
|
||||
TrackMetadata = true;
|
||||
ArtistImages = true;
|
||||
AlbumImages = true;
|
||||
}
|
||||
|
||||
[FieldDefinition(0, Label = "Artist Metadata", Type = FieldType.Checkbox)]
|
||||
[FieldDefinition(0, Label = "Artist Metadata", Type = FieldType.Checkbox, HelpText = "artist.nfo")]
|
||||
public bool ArtistMetadata { get; set; }
|
||||
|
||||
[FieldDefinition(1, Label = "Album Metadata", Type = FieldType.Checkbox)]
|
||||
[FieldDefinition(1, Label = "Album Metadata", Type = FieldType.Checkbox, HelpText = "album.nfo")]
|
||||
public bool AlbumMetadata { get; set; }
|
||||
|
||||
[FieldDefinition(2, Label = "Track Metadata", Type = FieldType.Checkbox)]
|
||||
public bool TrackMetadata { get; set; }
|
||||
|
||||
[FieldDefinition(3, Label = "Artist Images", Type = FieldType.Checkbox)]
|
||||
public bool ArtistImages { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using NzbDrone.Common.Disk;
|
||||
|
||||
namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
|
||||
{
|
||||
public interface IDetectXbmcNfo
|
||||
{
|
||||
bool IsXbmcNfoFile(string path);
|
||||
}
|
||||
|
||||
public class XbmcNfoDetector : IDetectXbmcNfo
|
||||
{
|
||||
private readonly IDiskProvider _diskProvider;
|
||||
|
||||
private readonly Regex _regex = new Regex("<(movie|tvshow|episodedetails|artist|album|musicvideo)>", RegexOptions.Compiled);
|
||||
|
||||
public XbmcNfoDetector(IDiskProvider diskProvider)
|
||||
{
|
||||
_diskProvider = diskProvider;
|
||||
}
|
||||
|
||||
public bool IsXbmcNfoFile(string path)
|
||||
{
|
||||
// Lets make sure we're not reading huge files.
|
||||
if (_diskProvider.GetFileSize(path) > 10.Megabytes())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it contains some of the kodi/xbmc xml tags
|
||||
var content = _diskProvider.ReadAllText(path);
|
||||
|
||||
return _regex.IsMatch(content);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,5 @@ namespace NzbDrone.Core.Extras.Metadata.Files
|
||||
: base(repository, artistService, diskProvider, recycleBinProvider, logger)
|
||||
{
|
||||
}
|
||||
|
||||
public override bool PermanentlyDelete => true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Extras.Files;
|
||||
using NzbDrone.Core.Extras.Metadata.Files;
|
||||
using NzbDrone.Core.Extras.Others;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.Music;
|
||||
using NzbDrone.Core.Organizer;
|
||||
@@ -20,6 +21,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
{
|
||||
private readonly IMetadataFactory _metadataFactory;
|
||||
private readonly ICleanMetadataService _cleanMetadataService;
|
||||
private readonly IRecycleBinProvider _recycleBinProvider;
|
||||
private readonly IOtherExtraFileRenamer _otherExtraFileRenamer;
|
||||
private readonly IDiskTransferService _diskTransferService;
|
||||
private readonly IDiskProvider _diskProvider;
|
||||
private readonly IHttpClient _httpClient;
|
||||
@@ -31,6 +34,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
public MetadataService(IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IDiskTransferService diskTransferService,
|
||||
IRecycleBinProvider recycleBinProvider,
|
||||
IOtherExtraFileRenamer otherExtraFileRenamer,
|
||||
IMetadataFactory metadataFactory,
|
||||
ICleanMetadataService cleanMetadataService,
|
||||
IHttpClient httpClient,
|
||||
@@ -42,6 +47,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
{
|
||||
_metadataFactory = metadataFactory;
|
||||
_cleanMetadataService = cleanMetadataService;
|
||||
_otherExtraFileRenamer = otherExtraFileRenamer;
|
||||
_recycleBinProvider = recycleBinProvider;
|
||||
_diskTransferService = diskTransferService;
|
||||
_diskProvider = diskProvider;
|
||||
_httpClient = httpClient;
|
||||
@@ -249,6 +256,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
|
||||
var fullPath = Path.Combine(artist.Path, artistMetadata.RelativePath);
|
||||
|
||||
_otherExtraFileRenamer.RenameOtherExtraFile(artist, fullPath);
|
||||
|
||||
_logger.Debug("Writing Artist Metadata to: {0}", fullPath);
|
||||
SaveMetadataFile(fullPath, artistMetadata.Contents);
|
||||
|
||||
@@ -293,6 +302,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
|
||||
var fullPath = Path.Combine(artist.Path, albumMetadata.RelativePath);
|
||||
|
||||
_otherExtraFileRenamer.RenameOtherExtraFile(artist, fullPath);
|
||||
|
||||
_logger.Debug("Writing Album Metadata to: {0}", fullPath);
|
||||
SaveMetadataFile(fullPath, albumMetadata.Contents);
|
||||
|
||||
@@ -314,6 +325,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
|
||||
var fullPath = Path.Combine(artist.Path, trackMetadata.RelativePath);
|
||||
|
||||
_otherExtraFileRenamer.RenameOtherExtraFile(artist, fullPath);
|
||||
|
||||
var existingMetadata = GetMetadataFile(artist, existingMetadataFiles, c => c.Type == MetadataType.TrackMetadata &&
|
||||
c.TrackFileId == trackFile.Id);
|
||||
|
||||
@@ -368,6 +381,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
continue;
|
||||
}
|
||||
|
||||
_otherExtraFileRenamer.RenameOtherExtraFile(artist, fullPath);
|
||||
|
||||
var metadata = GetMetadataFile(artist, existingMetadataFiles, c => c.Type == MetadataType.ArtistImage &&
|
||||
c.RelativePath == image.RelativePath) ??
|
||||
new MetadataFile
|
||||
@@ -401,6 +416,8 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
continue;
|
||||
}
|
||||
|
||||
_otherExtraFileRenamer.RenameOtherExtraFile(artist, fullPath);
|
||||
|
||||
var metadata = GetMetadataFile(artist, existingMetadataFiles, c => c.Type == MetadataType.AlbumImage &&
|
||||
c.AlbumId == album.Id &&
|
||||
c.RelativePath == image.RelativePath) ??
|
||||
@@ -471,10 +488,10 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
|
||||
_logger.Debug("Removing duplicate Metadata file: {0}", path);
|
||||
|
||||
_diskProvider.DeleteFile(path);
|
||||
var subfolder = _diskProvider.GetParentFolder(artist.Path).GetRelativePath(_diskProvider.GetParentFolder(path));
|
||||
_recycleBinProvider.DeleteFile(path, subfolder);
|
||||
_metadataFileService.Delete(file.Id);
|
||||
}
|
||||
|
||||
|
||||
return matchingMetadataFiles.First();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user