diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-06-29 23:04:50 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-06-29 23:04:50 -0400 |
| commit | 3d47b495a96fce84c03d9f3177dc6dbc8a4afa3c (patch) | |
| tree | 9d03bc06b30fec5695bb7a89094387ecbdd8e3e9 /MediaBrowser.XbmcMetadata/Images | |
| parent | 1a5a75854bd3ec4cdd771c9afdaefe0acb62c03c (diff) | |
fixes #795 - Support reading Xbmc nfo's
Diffstat (limited to 'MediaBrowser.XbmcMetadata/Images')
| -rw-r--r-- | MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs b/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs new file mode 100644 index 0000000000..a45a449044 --- /dev/null +++ b/MediaBrowser.XbmcMetadata/Images/XbmcImageSaver.cs @@ -0,0 +1,272 @@ +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; + +namespace MediaBrowser.XbmcMetadata.Images +{ + public class XbmcImageSaver : IImageFileSaver + { + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + + public IEnumerable<string> GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index) + { + var season = item as Season; + + if (!SupportsItem(item, type, season)) + { + return new string[] { }; + } + + var extension = "." + format.ToString().ToLower(); + + // Backdrop paths + if (type == ImageType.Backdrop) + { + if (index == 0) + { + if (item.IsInMixedFolder) + { + return new[] { GetSavePathForItemInMixedFolder(item, type, "fanart", extension) }; + } + + if (season != null && season.IndexNumber.HasValue) + { + var seriesFolder = season.SeriesPath; + + var seasonMarker = season.IndexNumber.Value == 0 + ? "-specials" + : season.IndexNumber.Value.ToString("00", _usCulture); + + var imageFilename = "season" + seasonMarker + "-fanart" + extension; + + return new[] { Path.Combine(seriesFolder, imageFilename) }; + } + + return new[] + { + Path.Combine(item.ContainingFolderPath, "fanart" + extension) + }; + } + + if (item.IsInMixedFolder) + { + return new[] { GetSavePathForItemInMixedFolder(item, type, "fanart" + index.ToString(_usCulture), extension) }; + } + + var extraFanartFilename = GetBackdropSaveFilename(item.GetImages(ImageType.Backdrop), "fanart", "fanart", index); + + return new[] + { + Path.Combine(item.ContainingFolderPath, "extrafanart", extraFanartFilename + extension), + Path.Combine(item.ContainingFolderPath, "extrathumbs", "thumb" + index.ToString(_usCulture) + extension) + }; + } + + if (type == ImageType.Primary) + { + if (season != null && season.IndexNumber.HasValue) + { + var seriesFolder = season.SeriesPath; + + var seasonMarker = season.IndexNumber.Value == 0 + ? "-specials" + : season.IndexNumber.Value.ToString("00", _usCulture); + + var imageFilename = "season" + seasonMarker + "-poster" + extension; + + return new[] { Path.Combine(seriesFolder, imageFilename) }; + } + + if (item is Episode) + { + var seasonFolder = Path.GetDirectoryName(item.Path); + + var imageFilename = Path.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension; + + return new[] { Path.Combine(seasonFolder, imageFilename) }; + } + + if (item.IsInMixedFolder || item is MusicVideo) + { + return new[] { GetSavePathForItemInMixedFolder(item, type, string.Empty, extension) }; + } + + if (item is MusicAlbum || item is MusicArtist) + { + return new[] { Path.Combine(item.ContainingFolderPath, "folder" + extension) }; + } + + return new[] { Path.Combine(item.ContainingFolderPath, "poster" + extension) }; + } + + if (type == ImageType.Banner) + { + if (season != null && season.IndexNumber.HasValue) + { + var seriesFolder = season.SeriesPath; + + var seasonMarker = season.IndexNumber.Value == 0 + ? "-specials" + : season.IndexNumber.Value.ToString("00", _usCulture); + + var imageFilename = "season" + seasonMarker + "-banner" + extension; + + return new[] { Path.Combine(seriesFolder, imageFilename) }; + } + } + + if (type == ImageType.Thumb) + { + if (season != null && season.IndexNumber.HasValue) + { + var seriesFolder = season.SeriesPath; + + var seasonMarker = season.IndexNumber.Value == 0 + ? "-specials" + : season.IndexNumber.Value.ToString("00", _usCulture); + + var imageFilename = "season" + seasonMarker + "-landscape" + extension; + + return new[] { Path.Combine(seriesFolder, imageFilename) }; + } + + if (item.IsInMixedFolder) + { + return new[] { GetSavePathForItemInMixedFolder(item, type, "landscape", extension) }; + } + + return new[] { Path.Combine(item.ContainingFolderPath, "landscape" + extension) }; + } + + return GetStandardSavePaths(item, type, index, extension); + } + + private IEnumerable<string> GetStandardSavePaths(IHasImages item, ImageType type, int imageIndex, string extension) + { + string filename; + + switch (type) + { + case ImageType.Art: + filename = "clearart"; + break; + case ImageType.BoxRear: + filename = "back"; + break; + case ImageType.Disc: + filename = item is MusicAlbum ? "cdart" : "disc"; + break; + case ImageType.Screenshot: + filename = GetBackdropSaveFilename(item.GetImages(type), "screenshot", "screenshot", imageIndex); + break; + default: + filename = type.ToString().ToLower(); + break; + } + + string path = null; + + if (item.IsInMixedFolder) + { + path = GetSavePathForItemInMixedFolder(item, type, filename, extension); + } + + if (string.IsNullOrEmpty(path)) + { + path = Path.Combine(item.ContainingFolderPath, filename + extension); + } + + if (string.IsNullOrEmpty(path)) + { + return new string[] { }; + } + + return new[] { path }; + } + + + private string GetSavePathForItemInMixedFolder(IHasImages item, ImageType type, string imageFilename, string extension) + { + if (type == ImageType.Primary) + { + imageFilename = "poster"; + } + var folder = Path.GetDirectoryName(item.Path); + + return Path.Combine(folder, Path.GetFileNameWithoutExtension(item.Path) + "-" + imageFilename + extension); + } + + private bool SupportsItem(IHasImages item, ImageType type, Season season) + { + if (item.IsOwnedItem || item is Audio || item is User) + { + return false; + } + + if (type != ImageType.Primary && item is Episode) + { + return false; + } + + if (!item.SupportsLocalMetadata) + { + return false; + } + + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + var allowSaving = false; + + // If season is virtual under a physical series, save locally if using compatible convention + if (season != null) + { + var series = season.Series; + + if (series != null && series.SupportsLocalMetadata) + { + allowSaving = true; + } + } + + if (!allowSaving) + { + return false; + } + } + + return true; + } + + private string GetBackdropSaveFilename(IEnumerable<ItemImageInfo> images, string zeroIndexFilename, string numberedIndexPrefix, int? index) + { + if (index.HasValue && index.Value == 0) + { + return zeroIndexFilename; + } + + var filenames = images.Select(i => Path.GetFileNameWithoutExtension(i.Path)).ToList(); + + var current = 1; + while (filenames.Contains(numberedIndexPrefix + current.ToString(_usCulture), StringComparer.OrdinalIgnoreCase)) + { + current++; + } + + return numberedIndexPrefix + current.ToString(_usCulture); + } + + public string Name + { + get { return "Media Browser/Plex/Xbmc Images"; } + } + } +} |
