MovieResolver.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.Composition;
  4. using System.IO;
  5. using System.Linq;
  6. using MediaBrowser.Controller;
  7. using MediaBrowser.Controller.Events;
  8. using MediaBrowser.Controller.IO;
  9. using MediaBrowser.Controller.Resolvers;
  10. using MediaBrowser.Model.Entities;
  11. using MediaBrowser.Movies.Entities;
  12. namespace MediaBrowser.Movies.Resolvers
  13. {
  14. [Export(typeof(IBaseItemResolver))]
  15. public class MovieResolver : BaseVideoResolver<Movie>
  16. {
  17. protected override Movie Resolve(ItemResolveEventArgs args)
  18. {
  19. if (args.IsFolder && (args.VirtualFolderCollectionType ?? string.Empty).Equals("Movies", StringComparison.OrdinalIgnoreCase))
  20. {
  21. // Optimization to avoid running these tests against VF's
  22. if (args.Parent != null && args.Parent.IsRoot)
  23. {
  24. return null;
  25. }
  26. var metadataFile = args.GetFileSystemEntryByName("movie.xml", false);
  27. if (metadataFile.HasValue || Path.GetFileName(args.Path).IndexOf("[tmdbid=", StringComparison.OrdinalIgnoreCase) != -1)
  28. {
  29. return GetMovie(args) ?? new Movie();
  30. }
  31. // If it's not a boxset, the only other allowed parent type is Folder
  32. if (!(args.Parent is BoxSet))
  33. {
  34. if (args.Parent != null && args.Parent.GetType() != typeof(Folder))
  35. {
  36. return null;
  37. }
  38. }
  39. // There's no metadata or [tmdb in the path, now we will have to work some magic to see if this is a Movie
  40. if (args.Parent != null)
  41. {
  42. return GetMovie(args);
  43. }
  44. }
  45. return null;
  46. }
  47. private Movie GetMovie(ItemResolveEventArgs args)
  48. {
  49. foreach (var child in args.FileSystemChildren)
  50. {
  51. ItemResolveEventArgs childArgs = new ItemResolveEventArgs()
  52. {
  53. Path = child.Key,
  54. FileData = child.Value,
  55. FileSystemChildren = new KeyValuePair<string, WIN32_FIND_DATA>[] { }
  56. };
  57. var item = base.Resolve(childArgs);
  58. if (item != null)
  59. {
  60. return new Movie()
  61. {
  62. Path = item.Path,
  63. VideoType = item.VideoType
  64. };
  65. }
  66. }
  67. return null;
  68. }
  69. private void PopulateBonusFeatures(Movie item, ItemResolveEventArgs args)
  70. {
  71. var trailerPath = args.GetFileSystemEntryByName("specials", true);
  72. if (trailerPath.HasValue)
  73. {
  74. string[] allFiles = Directory.GetFileSystemEntries(trailerPath.Value.Key, "*", SearchOption.TopDirectoryOnly);
  75. item.SpecialFeatures = allFiles.Select(f => Kernel.Instance.ItemController.GetItem(f)).OfType<Video>();
  76. }
  77. }
  78. protected override void SetInitialItemValues(Movie item, ItemResolveEventArgs args)
  79. {
  80. base.SetInitialItemValues(item, args);
  81. PopulateBonusFeatures(item, args);
  82. }
  83. }
  84. }