2
0

XbmcImageSaver.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. using MediaBrowser.Controller.Entities;
  2. using MediaBrowser.Controller.Entities.Audio;
  3. using MediaBrowser.Controller.Entities.TV;
  4. using MediaBrowser.Controller.Providers;
  5. using MediaBrowser.Model.Drawing;
  6. using MediaBrowser.Model.Entities;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Globalization;
  10. using System.IO;
  11. using System.Linq;
  12. namespace MediaBrowser.XbmcMetadata.Images
  13. {
  14. public class XbmcImageSaver : IImageFileSaver
  15. {
  16. private readonly CultureInfo _usCulture = new CultureInfo("en-US");
  17. public IEnumerable<string> GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index)
  18. {
  19. var season = item as Season;
  20. if (!SupportsItem(item, type, season))
  21. {
  22. return new string[] { };
  23. }
  24. var extension = "." + format.ToString().ToLower();
  25. // Backdrop paths
  26. if (type == ImageType.Backdrop)
  27. {
  28. if (index == 0)
  29. {
  30. if (item.IsInMixedFolder)
  31. {
  32. return new[] { GetSavePathForItemInMixedFolder(item, type, "fanart", extension) };
  33. }
  34. if (season != null && season.IndexNumber.HasValue)
  35. {
  36. var seriesFolder = season.SeriesPath;
  37. var seasonMarker = season.IndexNumber.Value == 0
  38. ? "-specials"
  39. : season.IndexNumber.Value.ToString("00", _usCulture);
  40. var imageFilename = "season" + seasonMarker + "-fanart" + extension;
  41. return new[] { Path.Combine(seriesFolder, imageFilename) };
  42. }
  43. return new[]
  44. {
  45. Path.Combine(item.ContainingFolderPath, "fanart" + extension)
  46. };
  47. }
  48. if (item.IsInMixedFolder)
  49. {
  50. return new[] { GetSavePathForItemInMixedFolder(item, type, "fanart" + index.ToString(_usCulture), extension) };
  51. }
  52. var extraFanartFilename = GetBackdropSaveFilename(item.GetImages(ImageType.Backdrop), "fanart", "fanart", index);
  53. return new[]
  54. {
  55. Path.Combine(item.ContainingFolderPath, "extrafanart", extraFanartFilename + extension),
  56. Path.Combine(item.ContainingFolderPath, "extrathumbs", "thumb" + index.ToString(_usCulture) + extension)
  57. };
  58. }
  59. if (type == ImageType.Primary)
  60. {
  61. if (season != null && season.IndexNumber.HasValue)
  62. {
  63. var seriesFolder = season.SeriesPath;
  64. var seasonMarker = season.IndexNumber.Value == 0
  65. ? "-specials"
  66. : season.IndexNumber.Value.ToString("00", _usCulture);
  67. var imageFilename = "season" + seasonMarker + "-poster" + extension;
  68. return new[] { Path.Combine(seriesFolder, imageFilename) };
  69. }
  70. if (item is Episode)
  71. {
  72. var seasonFolder = Path.GetDirectoryName(item.Path);
  73. var imageFilename = Path.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension;
  74. return new[] { Path.Combine(seasonFolder, imageFilename) };
  75. }
  76. if (item.IsInMixedFolder || item is MusicVideo)
  77. {
  78. return new[] { GetSavePathForItemInMixedFolder(item, type, string.Empty, extension) };
  79. }
  80. if (item is MusicAlbum || item is MusicArtist)
  81. {
  82. return new[] { Path.Combine(item.ContainingFolderPath, "folder" + extension) };
  83. }
  84. return new[] { Path.Combine(item.ContainingFolderPath, "poster" + extension) };
  85. }
  86. if (type == ImageType.Banner)
  87. {
  88. if (season != null && season.IndexNumber.HasValue)
  89. {
  90. var seriesFolder = season.SeriesPath;
  91. var seasonMarker = season.IndexNumber.Value == 0
  92. ? "-specials"
  93. : season.IndexNumber.Value.ToString("00", _usCulture);
  94. var imageFilename = "season" + seasonMarker + "-banner" + extension;
  95. return new[] { Path.Combine(seriesFolder, imageFilename) };
  96. }
  97. }
  98. if (type == ImageType.Thumb)
  99. {
  100. if (season != null && season.IndexNumber.HasValue)
  101. {
  102. var seriesFolder = season.SeriesPath;
  103. var seasonMarker = season.IndexNumber.Value == 0
  104. ? "-specials"
  105. : season.IndexNumber.Value.ToString("00", _usCulture);
  106. var imageFilename = "season" + seasonMarker + "-landscape" + extension;
  107. return new[] { Path.Combine(seriesFolder, imageFilename) };
  108. }
  109. if (item.IsInMixedFolder)
  110. {
  111. return new[] { GetSavePathForItemInMixedFolder(item, type, "landscape", extension) };
  112. }
  113. return new[] { Path.Combine(item.ContainingFolderPath, "landscape" + extension) };
  114. }
  115. return GetStandardSavePaths(item, type, index, extension);
  116. }
  117. private IEnumerable<string> GetStandardSavePaths(IHasImages item, ImageType type, int imageIndex, string extension)
  118. {
  119. string filename;
  120. switch (type)
  121. {
  122. case ImageType.Art:
  123. filename = "clearart";
  124. break;
  125. case ImageType.BoxRear:
  126. filename = "back";
  127. break;
  128. case ImageType.Disc:
  129. filename = item is MusicAlbum ? "cdart" : "disc";
  130. break;
  131. case ImageType.Screenshot:
  132. filename = GetBackdropSaveFilename(item.GetImages(type), "screenshot", "screenshot", imageIndex);
  133. break;
  134. default:
  135. filename = type.ToString().ToLower();
  136. break;
  137. }
  138. string path = null;
  139. if (item.IsInMixedFolder)
  140. {
  141. path = GetSavePathForItemInMixedFolder(item, type, filename, extension);
  142. }
  143. if (string.IsNullOrEmpty(path))
  144. {
  145. path = Path.Combine(item.ContainingFolderPath, filename + extension);
  146. }
  147. if (string.IsNullOrEmpty(path))
  148. {
  149. return new string[] { };
  150. }
  151. return new[] { path };
  152. }
  153. private string GetSavePathForItemInMixedFolder(IHasImages item, ImageType type, string imageFilename, string extension)
  154. {
  155. if (type == ImageType.Primary)
  156. {
  157. imageFilename = "poster";
  158. }
  159. var folder = Path.GetDirectoryName(item.Path);
  160. return Path.Combine(folder, Path.GetFileNameWithoutExtension(item.Path) + "-" + imageFilename + extension);
  161. }
  162. private bool SupportsItem(IHasImages item, ImageType type, Season season)
  163. {
  164. if (item.IsOwnedItem || item is Audio || item is User)
  165. {
  166. return false;
  167. }
  168. if (type != ImageType.Primary && item is Episode)
  169. {
  170. return false;
  171. }
  172. if (!item.SupportsLocalMetadata)
  173. {
  174. return false;
  175. }
  176. var locationType = item.LocationType;
  177. if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
  178. {
  179. var allowSaving = false;
  180. // If season is virtual under a physical series, save locally if using compatible convention
  181. if (season != null)
  182. {
  183. var series = season.Series;
  184. if (series != null && series.SupportsLocalMetadata)
  185. {
  186. allowSaving = true;
  187. }
  188. }
  189. if (!allowSaving)
  190. {
  191. return false;
  192. }
  193. }
  194. return true;
  195. }
  196. private string GetBackdropSaveFilename(IEnumerable<ItemImageInfo> images, string zeroIndexFilename, string numberedIndexPrefix, int? index)
  197. {
  198. if (index.HasValue && index.Value == 0)
  199. {
  200. return zeroIndexFilename;
  201. }
  202. var filenames = images.Select(i => Path.GetFileNameWithoutExtension(i.Path)).ToList();
  203. var current = 1;
  204. while (filenames.Contains(numberedIndexPrefix + current.ToString(_usCulture), StringComparer.OrdinalIgnoreCase))
  205. {
  206. current++;
  207. }
  208. return numberedIndexPrefix + current.ToString(_usCulture);
  209. }
  210. public string Name
  211. {
  212. get { return "Emby/Plex/Xbmc Images"; }
  213. }
  214. }
  215. }