PhotoProvider.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using MediaBrowser.Controller.Drawing;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Library;
  4. using MediaBrowser.Controller.Providers;
  5. using MediaBrowser.Model.Entities;
  6. using MediaBrowser.Model.Logging;
  7. using System;
  8. using System.Globalization;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace MediaBrowser.Providers.Photos
  12. {
  13. public class PhotoProvider : ICustomMetadataProvider<Photo>, IHasChangeMonitor
  14. {
  15. private readonly ILogger _logger;
  16. private readonly IImageProcessor _imageProcessor;
  17. public PhotoProvider(ILogger logger, IImageProcessor imageProcessor)
  18. {
  19. _logger = logger;
  20. _imageProcessor = imageProcessor;
  21. }
  22. public Task<ItemUpdateType> FetchAsync(Photo item, IDirectoryService directoryService, CancellationToken cancellationToken)
  23. {
  24. item.SetImagePath(ImageType.Primary, item.Path);
  25. item.SetImagePath(ImageType.Backdrop, item.Path);
  26. if (item.Path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || item.Path.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase))
  27. {
  28. try
  29. {
  30. using (var reader = new ExifReader(item.Path))
  31. {
  32. double aperture = 0;
  33. double shutterSpeed = 0;
  34. DateTime dateTaken;
  35. string manufacturer;
  36. string model;
  37. reader.GetTagValue(ExifTags.FNumber, out aperture);
  38. reader.GetTagValue(ExifTags.ExposureTime, out shutterSpeed);
  39. reader.GetTagValue(ExifTags.DateTimeOriginal, out dateTaken);
  40. reader.GetTagValue(ExifTags.Make, out manufacturer);
  41. reader.GetTagValue(ExifTags.Model, out model);
  42. if (dateTaken > DateTime.MinValue)
  43. {
  44. item.DateCreated = dateTaken;
  45. item.PremiereDate = dateTaken;
  46. item.ProductionYear = dateTaken.Year;
  47. }
  48. var cameraModel = manufacturer ?? string.Empty;
  49. cameraModel += " ";
  50. cameraModel += model ?? string.Empty;
  51. var size = _imageProcessor.GetImageSize(item.Path);
  52. var xResolution = size.Width;
  53. var yResolution = size.Height;
  54. item.Overview = "Taken " + dateTaken.ToString("F") + "\n" +
  55. (!string.IsNullOrWhiteSpace(cameraModel) ? "With a " + cameraModel : "") +
  56. (aperture > 0 && shutterSpeed > 0 ? " at f" + aperture.ToString(CultureInfo.InvariantCulture) + " and " + PhotoHelper.Dec2Frac(shutterSpeed) + "s" : "") + "\n"
  57. + (xResolution > 0 ? "\n<br/>Resolution: " + xResolution + "x" + yResolution : "");
  58. }
  59. }
  60. catch (Exception e)
  61. {
  62. _logger.ErrorException("Image Provider - Error reading image tag for {0}", e, item.Path);
  63. }
  64. }
  65. //// Get additional tags from xmp
  66. //try
  67. //{
  68. // using (var fs = new FileStream(item.Path, FileMode.Open, FileAccess.Read))
  69. // {
  70. // var bf = BitmapFrame.Create(fs);
  71. // if (bf != null)
  72. // {
  73. // var data = (BitmapMetadata)bf.Metadata;
  74. // if (data != null)
  75. // {
  76. // DateTime dateTaken;
  77. // var cameraModel = "";
  78. // DateTime.TryParse(data.DateTaken, out dateTaken);
  79. // if (dateTaken > DateTime.MinValue) item.DateCreated = dateTaken;
  80. // cameraModel = data.CameraModel;
  81. // item.PremiereDate = dateTaken;
  82. // item.ProductionYear = dateTaken.Year;
  83. // item.Overview = "Taken " + dateTaken.ToString("F") + "\n" +
  84. // (cameraModel != "" ? "With a " + cameraModel : "") +
  85. // (aperture > 0 && shutterSpeed > 0 ? " at f" + aperture.ToString(CultureInfo.InvariantCulture) + " and " + PhotoHelper.Dec2Frac(shutterSpeed) + "s" : "") + "\n"
  86. // + (bf.Width > 0 ? "\n<br/>Resolution: " + (int)bf.Width + "x" + (int)bf.Height : "");
  87. // var photo = item as Photo;
  88. // if (data.Keywords != null) item.Genres = photo.Tags = new List<string>(data.Keywords);
  89. // item.Name = !string.IsNullOrWhiteSpace(data.Title) ? data.Title : item.Name;
  90. // item.CommunityRating = data.Rating;
  91. // if (!string.IsNullOrWhiteSpace(data.Subject)) photo.AddTagline(data.Subject);
  92. // }
  93. // }
  94. // }
  95. //}
  96. //catch (NotSupportedException)
  97. //{
  98. // // No problem - move on
  99. //}
  100. //catch (Exception e)
  101. //{
  102. // _logger.ErrorException("Error trying to read extended data from {0}", e, item.Path);
  103. //}
  104. const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport;
  105. return Task.FromResult(result);
  106. }
  107. public string Name
  108. {
  109. get { return "Embedded Information"; }
  110. }
  111. public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date)
  112. {
  113. return item.DateModified > date;
  114. }
  115. }
  116. }