TmdbUtils.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Net.Mime;
  5. using MediaBrowser.Model.Entities;
  6. using TMDbLib.Objects.General;
  7. namespace MediaBrowser.Providers.Plugins.Tmdb
  8. {
  9. /// <summary>
  10. /// Utilities for the TMDb provider.
  11. /// </summary>
  12. public static class TmdbUtils
  13. {
  14. /// <summary>
  15. /// URL of the TMDB instance to use.
  16. /// </summary>
  17. public const string BaseTmdbUrl = "https://www.themoviedb.org/";
  18. /// <summary>
  19. /// URL of the TMDB API instance to use.
  20. /// </summary>
  21. public const string BaseTmdbApiUrl = "https://api.themoviedb.org/";
  22. /// <summary>
  23. /// Name of the provider.
  24. /// </summary>
  25. public const string ProviderName = "TheMovieDb";
  26. /// <summary>
  27. /// API key to use when performing an API call.
  28. /// </summary>
  29. public const string ApiKey = "4219e299c89411838049ab0dab19ebd5";
  30. /// <summary>
  31. /// Maximum number of cast members to pull.
  32. /// </summary>
  33. public const int MaxCastMembers = 15;
  34. /// <summary>
  35. /// Value of the Accept header for requests to the provider.
  36. /// </summary>
  37. public static readonly string[] AcceptHeaders = { MediaTypeNames.Application.Json, "image/*" };
  38. /// <summary>
  39. /// The crew types to keep.
  40. /// </summary>
  41. public static readonly string[] WantedCrewTypes =
  42. {
  43. PersonType.Director,
  44. PersonType.Writer,
  45. PersonType.Producer
  46. };
  47. /// <summary>
  48. /// Maps the TMDB provided roles for crew members to Jellyfin roles.
  49. /// </summary>
  50. /// <param name="crew">Crew member to map against the Jellyfin person types.</param>
  51. /// <returns>The Jellyfin person type.</returns>
  52. public static string MapCrewToPersonType(Crew crew)
  53. {
  54. if (crew.Department.Equals("production", StringComparison.InvariantCultureIgnoreCase)
  55. && crew.Job.Contains("director", StringComparison.InvariantCultureIgnoreCase))
  56. {
  57. return PersonType.Director;
  58. }
  59. if (crew.Department.Equals("production", StringComparison.InvariantCultureIgnoreCase)
  60. && crew.Job.Contains("producer", StringComparison.InvariantCultureIgnoreCase))
  61. {
  62. return PersonType.Producer;
  63. }
  64. if (crew.Department.Equals("writing", StringComparison.InvariantCultureIgnoreCase))
  65. {
  66. return PersonType.Writer;
  67. }
  68. return null;
  69. }
  70. public static bool IsTrailerType(Video video)
  71. {
  72. return video.Site.Equals("youtube", StringComparison.OrdinalIgnoreCase)
  73. && (!video.Type.Equals("trailer", StringComparison.OrdinalIgnoreCase)
  74. || !video.Type.Equals("teaser", StringComparison.OrdinalIgnoreCase));
  75. }
  76. public static string GetImageLanguagesParam(string preferredLanguage)
  77. {
  78. var languages = new List<string>();
  79. if (!string.IsNullOrEmpty(preferredLanguage))
  80. {
  81. preferredLanguage = NormalizeLanguage(preferredLanguage);
  82. languages.Add(preferredLanguage);
  83. if (preferredLanguage.Length == 5) // like en-US
  84. {
  85. // Currenty, TMDB supports 2-letter language codes only
  86. // They are planning to change this in the future, thus we're
  87. // supplying both codes if we're having a 5-letter code.
  88. languages.Add(preferredLanguage.Substring(0, 2));
  89. }
  90. }
  91. languages.Add("null");
  92. if (!string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase))
  93. {
  94. languages.Add("en");
  95. }
  96. return string.Join(',', languages);
  97. }
  98. public static string NormalizeLanguage(string language)
  99. {
  100. if (string.IsNullOrEmpty(language))
  101. {
  102. return language;
  103. }
  104. // They require this to be uppercase
  105. // Everything after the hyphen must be written in uppercase due to a way TMDB wrote their api.
  106. // See here: https://www.themoviedb.org/talk/5119221d760ee36c642af4ad?page=3#56e372a0c3a3685a9e0019ab
  107. var parts = language.Split('-');
  108. if (parts.Length == 2)
  109. {
  110. language = parts[0] + "-" + parts[1].ToUpperInvariant();
  111. }
  112. return language;
  113. }
  114. public static string AdjustImageLanguage(string imageLanguage, string requestLanguage)
  115. {
  116. if (!string.IsNullOrEmpty(imageLanguage)
  117. && !string.IsNullOrEmpty(requestLanguage)
  118. && requestLanguage.Length > 2
  119. && imageLanguage.Length == 2
  120. && requestLanguage.StartsWith(imageLanguage, StringComparison.OrdinalIgnoreCase))
  121. {
  122. return requestLanguage;
  123. }
  124. return imageLanguage;
  125. }
  126. }
  127. }