diff --git a/src/NzbDrone.Core/MetaData/Consumers/MediaBrowser/MediaBrowserMetadata.cs b/src/NzbDrone.Core/MetaData/Consumers/MediaBrowser/MediaBrowserMetadata.cs new file mode 100644 index 000000000..2cef7fa17 --- /dev/null +++ b/src/NzbDrone.Core/MetaData/Consumers/MediaBrowser/MediaBrowserMetadata.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Linq; +using NLog; +using NzbDrone.Common; +using NzbDrone.Common.Disk; +using NzbDrone.Common.Http; +using NzbDrone.Core.MediaCover; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Metadata.Files; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.Metadata.Consumers.MediaBrowser +{ + public class MediaBrowserMetadata : MetadataBase + { + private readonly IMapCoversToLocal _mediaCoverService; + private readonly IDiskProvider _diskProvider; + private readonly Logger _logger; + + public MediaBrowserMetadata(IMapCoversToLocal mediaCoverService, + IDiskProvider diskProvider, + Logger logger) + { + _mediaCoverService = mediaCoverService; + _diskProvider = diskProvider; + _logger = logger; + } + + public override List AfterRename(Series series, List existingMetadataFiles, List episodeFiles) + { + var updatedMetadataFiles = new List(); + + return updatedMetadataFiles; + } + + public override MetadataFile FindMetadataFile(Series series, string path) + { + var filename = Path.GetFileName(path); + + if (filename == null) return null; + + var metadata = new MetadataFile + { + SeriesId = series.Id, + Consumer = GetType().Name, + RelativePath = series.Path.GetRelativePath(path) + }; + + if (filename.Equals("series.xml", StringComparison.InvariantCultureIgnoreCase)) + { + metadata.Type = MetadataType.SeriesMetadata; + return metadata; + } + + return null; + } + + public override MetadataFileResult SeriesMetadata(Series series) + { + if (!Settings.SeriesMetadata) + { + return null; + } + + _logger.Debug("Generating series.xml for: {0}", series.Title); + var sb = new StringBuilder(); + var xws = new XmlWriterSettings(); + xws.OmitXmlDeclaration = true; + xws.Indent = false; + + using (var xw = XmlWriter.Create(sb, xws)) + { + var tvShow = new XElement("Series"); + + tvShow.Add(new XElement("id", series.TvdbId)); + tvShow.Add(new XElement("Status", series.Status)); + tvShow.Add(new XElement("Network", series.Network)); + tvShow.Add(new XElement("Airs_Time", series.AirTime)); + //tvShow.Add(new XElement("Airs_DayOfWeek", + if (series.FirstAired.HasValue) + { + tvShow.Add(new XElement("FirstAired", series.FirstAired.Value.ToString("yyyy-MM-dd"))); + } + tvShow.Add(new XElement("ContentRating", series.Certification)); + tvShow.Add(new XElement("Added", DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss tt"))); + tvShow.Add(new XElement("LockData", "false")); + tvShow.Add(new XElement("Overview", series.Overview)); + tvShow.Add(new XElement("LocalTitle", series.Title)); + if (series.FirstAired.HasValue) + { + tvShow.Add(new XElement("PremiereDate", series.FirstAired.Value.ToString("yyyy-MM-dd"))); + } + //tvShow.Add(new XElement("EndDate", series.EndDate.ToString("yyyy-MM-dd"))); + tvShow.Add(new XElement("Rating", (decimal)series.Ratings.Percentage / 10)); + //tvShow.Add(new XElement("VoteCount", + tvShow.Add(new XElement("ProductionYear", series.Year)); + //tvShow.Add(new XElement("Website", + tvShow.Add(new XElement("RunningTime", series.Runtime)); + tvShow.Add(new XElement("IMDB", series.ImdbId)); + //tvShow.Add(new XElement("TMDbId", + //tvShow.Add(new XElement("Zap2itId", + tvShow.Add(new XElement("TVRageId", series.TvRageId)); + tvShow.Add(new XElement("Genres", series.Genres.Select(genre => new XElement("Genre", genre)))); + + // Studios + // Studio + // Studio + // ?? + + var persons = new XElement("Persons"); + + foreach (var person in series.Actors) + { + persons.Add(new XElement("Person", + new XElement("Name", person.Name), + new XElement("Type", "Actor"), + new XElement("Role", person.Character) + )); + } + + tvShow.Add(persons); + + + var doc = new XDocument(tvShow); + doc.Save(xw); + + _logger.Debug("Saving series.xml for {0}", series.Title); + + return new MetadataFileResult(Path.Combine(series.Path, "series.xml"), doc.ToString()); + } + } + + public override MetadataFileResult EpisodeMetadata(Series series, EpisodeFile episodeFile) + { + return null; + } + + public override List SeriesImages(Series series) + { + return new List(); + } + + public override List SeasonImages(Series series, Season season) + { + return new List(); + } + + public override List EpisodeImages(Series series, EpisodeFile episodeFile) + { + return new List(); + } + + private IEnumerable ProcessSeriesImages(Series series) + { + return new List(); + } + + private IEnumerable ProcessSeasonImages(Series series, Season season) + { + return new List(); + } + + private string GetEpisodeNfoFilename(string episodeFilePath) + { + return null; + } + + private string GetEpisodeImageFilename(string episodeFilePath) + { + return null; + } + } +} \ No newline at end of file diff --git a/src/NzbDrone.Core/MetaData/Consumers/MediaBrowser/MediaBrowserMetadataSettings.cs b/src/NzbDrone.Core/MetaData/Consumers/MediaBrowser/MediaBrowserMetadataSettings.cs new file mode 100644 index 000000000..3fbab1719 --- /dev/null +++ b/src/NzbDrone.Core/MetaData/Consumers/MediaBrowser/MediaBrowserMetadataSettings.cs @@ -0,0 +1,41 @@ +using System; +using FluentValidation; +using FluentValidation.Results; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.ThingiProvider; + +namespace NzbDrone.Core.Metadata.Consumers.MediaBrowser +{ + public class MediaBrowserSettingsValidator : AbstractValidator + { + public MediaBrowserSettingsValidator() + { + } + } + + public class MediaBrowserMetadataSettings : IProviderConfig + { + private static readonly MediaBrowserSettingsValidator Validator = new MediaBrowserSettingsValidator(); + + public MediaBrowserMetadataSettings() + { + SeriesMetadata = true; + } + + [FieldDefinition(0, Label = "Series Metadata", Type = FieldType.Checkbox)] + public Boolean SeriesMetadata { get; set; } + + public bool IsValid + { + get + { + return true; + } + } + + public ValidationResult Validate() + { + return Validator.Validate(this); + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 5e347ee4e..9b758ab25 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -383,6 +383,8 @@ + +