From 28bb5c7903425b4dcedcc299609702c534647089 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 15 Oct 2013 21:44:23 -0400 Subject: [PATCH] support more xbmc image conventions --- .../ImageFromMediaLocationProvider.cs | 298 +++++++++++++----- .../TV/RemoteSeriesProvider.cs | 28 +- .../Providers/ImageSaver.cs | 35 +- 3 files changed, 264 insertions(+), 97 deletions(-) diff --git a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs index c3546c9361..b44bda7088 100644 --- a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs @@ -173,73 +173,16 @@ namespace MediaBrowser.Providers /// The args. private void PopulateBaseItemImages(BaseItem item, ItemResolveArgs args) { - // Primary Image - var image = GetImage(item, args, "folder") ?? - GetImage(item, args, "poster") ?? - GetImage(item, args, "cover") ?? - GetImage(item, args, "default"); - - // Support plex/xbmc convention - if (image == null && item is Series) - { - image = GetImage(item, args, "show"); - } - - // Support plex/xbmc convention - if (image == null && item is Season && item.IndexNumber.HasValue) - { - var num = item.IndexNumber.Value.ToString(_usCulture); - - image = GetImage(item, args, string.Format("season-{0}", num)); - } - - // Support plex/xbmc convention - if (image == null && (item is Movie || item is MusicVideo || item is AdultVideo)) - { - image = GetImage(item, args, "movie"); - } - - // Look for a file with the same name as the item - if (image == null) - { - var name = Path.GetFileNameWithoutExtension(item.Path); - - if (!string.IsNullOrEmpty(name)) - { - image = GetImage(item, args, name) ?? - GetImage(item, args, name + "-poster"); - } - } - - if (image != null) - { - item.SetImage(ImageType.Primary, image.FullName); - } + PopulatePrimaryImage(item, args); // Logo Image - image = GetImage(item, args, "logo"); + var image = GetImage(item, args, "logo"); if (image != null) { item.SetImage(ImageType.Logo, image.FullName); } - // Banner Image - image = GetImage(item, args, "banner"); - - // Support plex/xbmc convention - if (image == null && item is Season && item.IndexNumber.HasValue) - { - var num = item.IndexNumber.Value.ToString(_usCulture); - - image = GetImage(item, args, string.Format("season-{0}-banner", num)); - } - - if (image != null) - { - item.SetImage(ImageType.Banner, image.FullName); - } - // Clearart image = GetImage(item, args, "clearart"); @@ -257,14 +200,6 @@ namespace MediaBrowser.Providers item.SetImage(ImageType.Disc, image.FullName); } - // Thumbnail Image - image = GetImage(item, args, "thumb"); - - if (image != null) - { - item.SetImage(ImageType.Thumb, image.FullName); - } - // Box Image image = GetImage(item, args, "box"); @@ -289,46 +224,166 @@ namespace MediaBrowser.Providers item.SetImage(ImageType.Menu, image.FullName); } + PopulateBanner(item, args); + PopulateThumb(item, args); + // Backdrop Image PopulateBackdrops(item, args); + PopulateScreenshots(item, args); + } - // Screenshot Image - image = GetImage(item, args, "screenshot"); + private void PopulatePrimaryImage(BaseItem item, ItemResolveArgs args) + { + // Primary Image + var image = GetImage(item, args, "folder") ?? + GetImage(item, args, "poster") ?? + GetImage(item, args, "cover") ?? + GetImage(item, args, "default"); - var screenshotFiles = new List(); + // Support plex/xbmc convention + if (image == null && item is Series) + { + image = GetImage(item, args, "show") ?? + GetImage(item, args, "season-all-poster"); + } + + // Support plex/xbmc convention + if (image == null && item is Season && item.IndexNumber.HasValue) + { + var seasonMarker = item.IndexNumber.Value == 0 + ? "-specials" + : item.IndexNumber.Value.ToString("00", _usCulture); + + // Get this one directly from the file system since we have to go up a level + var filename = "season" + seasonMarker + "-poster"; + + var path = Path.GetDirectoryName(item.Path); + + path = Path.Combine(path, filename); + + image = new FileInfo(path); + + if (!image.Exists) + { + image = null; + } + } + + // Support plex/xbmc convention + if (image == null && (item is Movie || item is MusicVideo || item is AdultVideo)) + { + image = GetImage(item, args, "movie"); + } + + // Look for a file with the same name as the item + if (image == null) + { + var name = Path.GetFileNameWithoutExtension(item.Path); + + if (!string.IsNullOrEmpty(name)) + { + image = GetImage(item, args, name) ?? + GetImage(item, args, name + "-poster"); + } + } if (image != null) { - screenshotFiles.Add(image.FullName); + item.SetImage(ImageType.Primary, image.FullName); } + } - var unfound = 0; - for (var i = 1; i <= 20; i++) + /// + /// Populates the banner. + /// + /// The item. + /// The args. + private void PopulateBanner(BaseItem item, ItemResolveArgs args) + { + // Banner Image + var image = GetImage(item, args, "banner"); + + if (image == null) { - // Screenshot Image - image = GetImage(item, args, "screenshot" + i); - - if (image != null) + // Supprt xbmc conventions + if (item is Series) { - screenshotFiles.Add(image.FullName); + image = GetImage(item, args, "season-all-banner"); } - else + else if (item is Season && item.IndexNumber.HasValue) { - unfound++; + var seasonMarker = item.IndexNumber.Value == 0 + ? "-specials" + : item.IndexNumber.Value.ToString("00", _usCulture); - if (unfound >= 3) + // Get this one directly from the file system since we have to go up a level + var filename = "season" + seasonMarker + "-banner"; + + var path = Path.GetDirectoryName(item.Path); + + path = Path.Combine(path, filename); + + image = new FileInfo(path); + + if (!image.Exists) { - break; + image = null; } } } - if (screenshotFiles.Count > 0) + if (image != null) { - item.ScreenshotImagePaths = screenshotFiles; + item.SetImage(ImageType.Banner, image.FullName); } } + /// + /// Populates the thumb. + /// + /// The item. + /// The args. + private void PopulateThumb(BaseItem item, ItemResolveArgs args) + { + // Thumbnail Image + var image = GetImage(item, args, "thumb"); + + if (image == null) + { + // Supprt xbmc conventions + if (item is Series) + { + image = GetImage(item, args, "season-all-landscape"); + } + else if (item is Season && item.IndexNumber.HasValue) + { + var seasonMarker = item.IndexNumber.Value == 0 + ? "-specials" + : item.IndexNumber.Value.ToString("00", _usCulture); + + // Get this one directly from the file system since we have to go up a level + var filename = "season" + seasonMarker + "-landscape"; + + var path = Path.GetDirectoryName(item.Path); + + path = Path.Combine(path, filename); + + image = new FileInfo(path); + + if (!image.Exists) + { + image = null; + } + } + } + + if (image != null) + { + item.SetImage(ImageType.Thumb, image.FullName); + } + + } + /// /// Populates the backdrops. /// @@ -345,6 +400,37 @@ namespace MediaBrowser.Providers PopulateBackdrops(item, args, backdropFiles, "background", "background-"); PopulateBackdrops(item, args, backdropFiles, "art", "art-"); + if (item is Series) + { + var image = GetImage(item, args, "season-all-fanart"); + + if (image != null) + { + backdropFiles.Add(image.FullName); + } + } + + if (item is Season && item.IndexNumber.HasValue) + { + var seasonMarker = item.IndexNumber.Value == 0 + ? "-specials" + : item.IndexNumber.Value.ToString("00", _usCulture); + + // Get this one directly from the file system since we have to go up a level + var filename = "season" + seasonMarker + "-fanart"; + + var path = Path.GetDirectoryName(item.Path); + + path = Path.Combine(path, filename); + + var image = new FileInfo(path); + + if (image.Exists) + { + backdropFiles.Add(image.FullName); + } + } + PopulateBackdropsFromExtraFanart(args, backdropFiles); if (backdropFiles.Count > 0) @@ -425,5 +511,49 @@ namespace MediaBrowser.Providers } } } + + /// + /// Populates the screenshots. + /// + /// The item. + /// The args. + private void PopulateScreenshots(BaseItem item, ItemResolveArgs args) + { + // Screenshot Image + var image = GetImage(item, args, "screenshot"); + + var screenshotFiles = new List(); + + if (image != null) + { + screenshotFiles.Add(image.FullName); + } + + var unfound = 0; + for (var i = 1; i <= 20; i++) + { + // Screenshot Image + image = GetImage(item, args, "screenshot" + i); + + if (image != null) + { + screenshotFiles.Add(image.FullName); + } + else + { + unfound++; + + if (unfound >= 3) + { + break; + } + } + } + + if (screenshotFiles.Count > 0) + { + item.ScreenshotImagePaths = screenshotFiles; + } + } } } diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index 1613489351..d639c67439 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs @@ -218,8 +218,6 @@ namespace MediaBrowser.Providers.TV if (!string.IsNullOrEmpty(seriesId)) { - series.SetProviderId(MetadataProviders.Tvdb, seriesId); - var seriesDataPath = GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId); await FetchSeriesData(series, seriesId, seriesDataPath, force, cancellationToken).ConfigureAwait(false); @@ -255,19 +253,25 @@ namespace MediaBrowser.Providers.TV await DownloadSeriesZip(seriesId, seriesDataPath, null, cancellationToken).ConfigureAwait(false); } - // Examine if there's no local metadata, or save local is on (to get updates) - if (isForcedRefresh || ConfigurationManager.Configuration.EnableTvDbUpdates || !HasLocalMeta(series)) + // Have to check this here since we prevent the normal enforcement through ProviderManager + if (!series.DontFetchMeta) { - var seriesXmlPath = Path.Combine(seriesDataPath, seriesXmlFilename); - var actorsXmlPath = Path.Combine(seriesDataPath, "actors.xml"); - - FetchSeriesInfo(series, seriesXmlPath, cancellationToken); - - if (!series.LockedFields.Contains(MetadataFields.Cast)) + // Examine if there's no local metadata, or save local is on (to get updates) + if (isForcedRefresh || ConfigurationManager.Configuration.EnableTvDbUpdates || !HasLocalMeta(series)) { - series.People.Clear(); + series.SetProviderId(MetadataProviders.Tvdb, seriesId); - FetchActors(series, actorsXmlPath, cancellationToken); + var seriesXmlPath = Path.Combine(seriesDataPath, seriesXmlFilename); + var actorsXmlPath = Path.Combine(seriesDataPath, "actors.xml"); + + FetchSeriesInfo(series, seriesXmlPath, cancellationToken); + + if (!series.LockedFields.Contains(MetadataFields.Cast)) + { + series.People.Clear(); + + FetchActors(series, actorsXmlPath, cancellationToken); + } } } } diff --git a/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs b/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs index ebafce4dd5..0b512839f7 100644 --- a/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs +++ b/MediaBrowser.Server.Implementations/Providers/ImageSaver.cs @@ -396,6 +396,24 @@ namespace MediaBrowser.Server.Implementations.Providers if (imageIndex.Value == 0) { + if (item is Series) + { + return new[] { Path.Combine(item.Path, "season-all-fanart" + extension) }; + } + + if (item is Season && item.IndexNumber.HasValue) + { + var seriesFolder = Path.GetDirectoryName(item.Path); + + var seasonMarker = item.IndexNumber.Value == 0 + ? "-specials" + : item.IndexNumber.Value.ToString("00", UsCulture); + + var imageFilename = "season" + seasonMarker + "-fanart" + extension; + + return new[] { Path.Combine(seriesFolder, imageFilename) }; + } + return new[] { Path.Combine(item.MetaLocation, "fanart" + extension) @@ -413,6 +431,11 @@ namespace MediaBrowser.Server.Implementations.Providers if (type == ImageType.Primary) { + if (item is Series) + { + return new[] { Path.Combine(item.Path, "season-all-poster" + extension) }; + } + if (item is Season && item.IndexNumber.HasValue) { var seriesFolder = Path.GetDirectoryName(item.Path); @@ -446,6 +469,11 @@ namespace MediaBrowser.Server.Implementations.Providers if (type == ImageType.Banner) { + if (item is Series) + { + return new[] { Path.Combine(item.Path, "season-all-banner" + extension) }; + } + if (item is Season && item.IndexNumber.HasValue) { var seriesFolder = Path.GetDirectoryName(item.Path); @@ -462,6 +490,11 @@ namespace MediaBrowser.Server.Implementations.Providers if (type == ImageType.Thumb) { + if (item is Series) + { + return new[] { Path.Combine(item.Path, "season-all-landscape" + extension) }; + } + if (item is Season && item.IndexNumber.HasValue) { var seriesFolder = Path.GetDirectoryName(item.Path); @@ -475,7 +508,7 @@ namespace MediaBrowser.Server.Implementations.Providers return new[] { Path.Combine(seriesFolder, imageFilename) }; } } - + // All other paths are the same return new[] { GetLegacySavePath(item, type, imageIndex, mimeType, true) }; }