ItemController.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using MediaBrowser.Controller.Entities;
  2. using MediaBrowser.Controller.IO;
  3. using MediaBrowser.Controller.Resolvers;
  4. using MediaBrowser.Common.Extensions;
  5. using System;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Threading.Tasks;
  11. namespace MediaBrowser.Controller.Library
  12. {
  13. public class ItemController
  14. {
  15. /// <summary>
  16. /// Resolves a path into a BaseItem
  17. /// </summary>
  18. public async Task<BaseItem> GetItem(string path, Folder parent = null, WIN32_FIND_DATA? fileInfo = null, bool allowInternetProviders = true)
  19. {
  20. var args = new ItemResolveEventArgs
  21. {
  22. FileInfo = fileInfo ?? FileData.GetFileData(path),
  23. Parent = parent,
  24. Cancel = false,
  25. Path = path
  26. };
  27. // Gather child folder and files
  28. if (args.IsDirectory)
  29. {
  30. args.FileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray();
  31. bool isVirtualFolder = parent != null && parent.IsRoot;
  32. args = FileSystemHelper.FilterChildFileSystemEntries(args, isVirtualFolder);
  33. }
  34. else
  35. {
  36. args.FileSystemChildren = new WIN32_FIND_DATA[] { };
  37. }
  38. // Check to see if we should resolve based on our contents
  39. if (!EntityResolutionHelper.ShouldResolvePathContents(args))
  40. {
  41. return null;
  42. }
  43. BaseItem item = Kernel.Instance.ResolveItem(args);
  44. return item;
  45. }
  46. /// <summary>
  47. /// Gets a Person
  48. /// </summary>
  49. public Task<Person> GetPerson(string name)
  50. {
  51. return GetImagesByNameItem<Person>(Kernel.Instance.ApplicationPaths.PeoplePath, name);
  52. }
  53. /// <summary>
  54. /// Gets a Studio
  55. /// </summary>
  56. public Task<Studio> GetStudio(string name)
  57. {
  58. return GetImagesByNameItem<Studio>(Kernel.Instance.ApplicationPaths.StudioPath, name);
  59. }
  60. /// <summary>
  61. /// Gets a Genre
  62. /// </summary>
  63. public Task<Genre> GetGenre(string name)
  64. {
  65. return GetImagesByNameItem<Genre>(Kernel.Instance.ApplicationPaths.GenrePath, name);
  66. }
  67. /// <summary>
  68. /// Gets a Year
  69. /// </summary>
  70. public Task<Year> GetYear(int value)
  71. {
  72. return GetImagesByNameItem<Year>(Kernel.Instance.ApplicationPaths.YearPath, value.ToString());
  73. }
  74. private readonly ConcurrentDictionary<string, object> ImagesByNameItemCache = new ConcurrentDictionary<string, object>(StringComparer.OrdinalIgnoreCase);
  75. /// <summary>
  76. /// Generically retrieves an IBN item
  77. /// </summary>
  78. private Task<T> GetImagesByNameItem<T>(string path, string name)
  79. where T : BaseEntity, new()
  80. {
  81. name = FileData.GetValidFilename(name);
  82. path = Path.Combine(path, name);
  83. // Look for it in the cache, if it's not there, create it
  84. if (!ImagesByNameItemCache.ContainsKey(path))
  85. {
  86. ImagesByNameItemCache[path] = CreateImagesByNameItem<T>(path, name);
  87. }
  88. return ImagesByNameItemCache[path] as Task<T>;
  89. }
  90. /// <summary>
  91. /// Creates an IBN item based on a given path
  92. /// </summary>
  93. private async Task<T> CreateImagesByNameItem<T>(string path, string name)
  94. where T : BaseEntity, new()
  95. {
  96. var item = new T { };
  97. item.Name = name;
  98. item.Id = path.GetMD5();
  99. if (!Directory.Exists(path))
  100. {
  101. Directory.CreateDirectory(path);
  102. }
  103. item.DateCreated = Directory.GetCreationTimeUtc(path);
  104. item.DateModified = Directory.GetLastWriteTimeUtc(path);
  105. var args = new ItemResolveEventArgs { };
  106. args.FileInfo = FileData.GetFileData(path);
  107. args.FileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray();
  108. await Kernel.Instance.ExecuteMetadataProviders(item).ConfigureAwait(false);
  109. return item;
  110. }
  111. }
  112. }