From 6d2acc5f2c383be492ebe07b663c0db2a72d42eb Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 11 May 2013 00:10:34 -0400 Subject: [PATCH] update to latest server --- .../MediaBrowser.Plugins.Dlna.csproj | 12 +- MediaBrowser.Plugins.Dlna/packages.config | 4 +- .../MediaBrowser.Plugins.MpcHc.csproj | 8 +- MediaBrowser.Plugins.MpcHc/packages.config | 2 +- .../Configuration/PluginConfiguration.cs | 11 + ...MediaBrowser.Plugins.RottenTomatoes.csproj | 79 +++ MediaBrowser.Plugins.RottenTomatoes/Plugin.cs | 52 ++ .../Properties/AssemblyInfo.cs | 35 ++ .../Providers/RottenTomatoesMovieProvider.cs | 504 ++++++++++++++++++ .../packages.config | 5 + .../MediaBrowser.Plugins.Tmt5.csproj | 8 +- MediaBrowser.Plugins.Tmt5/packages.config | 2 +- .../MediaBrowser.Plugins.Trailers.csproj | 12 +- MediaBrowser.Plugins.Trailers/packages.config | 4 +- 14 files changed, 712 insertions(+), 26 deletions(-) create mode 100644 MediaBrowser.Plugins.RottenTomatoes/Configuration/PluginConfiguration.cs create mode 100644 MediaBrowser.Plugins.RottenTomatoes/MediaBrowser.Plugins.RottenTomatoes.csproj create mode 100644 MediaBrowser.Plugins.RottenTomatoes/Plugin.cs create mode 100644 MediaBrowser.Plugins.RottenTomatoes/Properties/AssemblyInfo.cs create mode 100644 MediaBrowser.Plugins.RottenTomatoes/Providers/RottenTomatoesMovieProvider.cs create mode 100644 MediaBrowser.Plugins.RottenTomatoes/packages.config diff --git a/MediaBrowser.Plugins.Dlna/MediaBrowser.Plugins.Dlna.csproj b/MediaBrowser.Plugins.Dlna/MediaBrowser.Plugins.Dlna.csproj index 4937976..fa750b7 100644 --- a/MediaBrowser.Plugins.Dlna/MediaBrowser.Plugins.Dlna.csproj +++ b/MediaBrowser.Plugins.Dlna/MediaBrowser.Plugins.Dlna.csproj @@ -36,17 +36,17 @@ Always - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Common.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Common.dll - + False - ..\packages\MediaBrowser.Server.Core.3.0.98\lib\net45\MediaBrowser.Controller.dll + ..\packages\MediaBrowser.Server.Core.3.0.100\lib\net45\MediaBrowser.Controller.dll - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Model.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Model.dll ..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll diff --git a/MediaBrowser.Plugins.Dlna/packages.config b/MediaBrowser.Plugins.Dlna/packages.config index afc4d4e..aa5bfbf 100644 --- a/MediaBrowser.Plugins.Dlna/packages.config +++ b/MediaBrowser.Plugins.Dlna/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/MediaBrowser.Plugins.MpcHc/MediaBrowser.Plugins.MpcHc.csproj b/MediaBrowser.Plugins.MpcHc/MediaBrowser.Plugins.MpcHc.csproj index 5ed03ca..81ad9cc 100644 --- a/MediaBrowser.Plugins.MpcHc/MediaBrowser.Plugins.MpcHc.csproj +++ b/MediaBrowser.Plugins.MpcHc/MediaBrowser.Plugins.MpcHc.csproj @@ -37,13 +37,13 @@ Always - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Common.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Common.dll - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Model.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Model.dll False diff --git a/MediaBrowser.Plugins.MpcHc/packages.config b/MediaBrowser.Plugins.MpcHc/packages.config index 3af0692..bbd493d 100644 --- a/MediaBrowser.Plugins.MpcHc/packages.config +++ b/MediaBrowser.Plugins.MpcHc/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/MediaBrowser.Plugins.RottenTomatoes/Configuration/PluginConfiguration.cs b/MediaBrowser.Plugins.RottenTomatoes/Configuration/PluginConfiguration.cs new file mode 100644 index 0000000..7337581 --- /dev/null +++ b/MediaBrowser.Plugins.RottenTomatoes/Configuration/PluginConfiguration.cs @@ -0,0 +1,11 @@ +using MediaBrowser.Model.Plugins; + +namespace MediaBrowser.Plugins.RottenTomatoes.Configuration +{ + /// + /// Class PluginConfiguration + /// + public class PluginConfiguration : BasePluginConfiguration + { + } +} diff --git a/MediaBrowser.Plugins.RottenTomatoes/MediaBrowser.Plugins.RottenTomatoes.csproj b/MediaBrowser.Plugins.RottenTomatoes/MediaBrowser.Plugins.RottenTomatoes.csproj new file mode 100644 index 0000000..e70055e --- /dev/null +++ b/MediaBrowser.Plugins.RottenTomatoes/MediaBrowser.Plugins.RottenTomatoes.csproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + {71BF266C-BFB0-4821-8909-FF21F95A4B49} + Library + Properties + MediaBrowser.Plugins.RottenTomatoes + MediaBrowser.Plugins.RottenTomatoes + v4.5 + 512 + ..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Always + + + + False + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Common.dll + + + False + ..\packages\MediaBrowser.Server.Core.3.0.100\lib\net45\MediaBrowser.Controller.dll + + + False + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Model.dll + + + + + + + + + + + + + + + + + + + + + xcopy "$(TargetPath)" "$(SolutionDir)\..\MediaBrowser\ProgramData-Server\Plugins\" /y + + + + \ No newline at end of file diff --git a/MediaBrowser.Plugins.RottenTomatoes/Plugin.cs b/MediaBrowser.Plugins.RottenTomatoes/Plugin.cs new file mode 100644 index 0000000..315f338 --- /dev/null +++ b/MediaBrowser.Plugins.RottenTomatoes/Plugin.cs @@ -0,0 +1,52 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Plugins.RottenTomatoes.Configuration; +using System.Threading; + +namespace MediaBrowser.Plugins.RottenTomatoes +{ + /// + /// Class Plugin + /// + public class Plugin : BasePlugin + { + /// + /// Apple doesn't seem to like too many simulataneous requests. + /// + public readonly SemaphoreSlim AppleTrailers = new SemaphoreSlim(1, 1); + + public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer) + : base(applicationPaths, xmlSerializer) + { + Instance = this; + } + + /// + /// Gets the name of the plugin + /// + /// The name. + public override string Name + { + get { return "Rotten Tomatoes Reviews"; } + } + + /// + /// Gets the description. + /// + /// The description. + public override string Description + { + get + { + return "Displays critic reviews from Rotten Tomatoes."; + } + } + + /// + /// Gets the instance. + /// + /// The instance. + public static Plugin Instance { get; private set; } + } +} diff --git a/MediaBrowser.Plugins.RottenTomatoes/Properties/AssemblyInfo.cs b/MediaBrowser.Plugins.RottenTomatoes/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e5e4fd5 --- /dev/null +++ b/MediaBrowser.Plugins.RottenTomatoes/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MediaBrowser.Plugins.RottenTomatoes")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MediaBrowser.Plugins.RottenTomatoes")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("99b9deee-2f49-418f-b3c3-b4390a7b3761")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.*")] diff --git a/MediaBrowser.Plugins.RottenTomatoes/Providers/RottenTomatoesMovieProvider.cs b/MediaBrowser.Plugins.RottenTomatoes/Providers/RottenTomatoesMovieProvider.cs new file mode 100644 index 0000000..a84038a --- /dev/null +++ b/MediaBrowser.Plugins.RottenTomatoes/Providers/RottenTomatoesMovieProvider.cs @@ -0,0 +1,504 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Plugins.RottenTomatoes.Providers +{ + /// + /// Class RottenTomatoesMovieProvider + /// + public class RottenTomatoesProvider : BaseMetadataProvider + { + // http://developer.rottentomatoes.com/iodocs + + private const int DailyRefreshLimit = 200; + + private const string MoviesReviews = @"movies/{1}/reviews.json?review_type=top_critic&page_limit=10&page=1&country=us&apikey={0}"; + + private readonly string[] _apiKeys = + { + // MB Server key + "x9wjnvv39ntjmt9zs95nm7bg", + + // Donated by Redshirt + "gecbjvjka5may65qmqrczk97", + + // MB Theater + "4wku9pfehuvwrrt5fyjgbert" + }; + + private const string BasicUrl = @"http://api.rottentomatoes.com/api/public/v1.0/"; + private const string MovieImdb = @"movie_alias.json?id={1}&type=imdb&apikey={0}"; + + private readonly SemaphoreSlim _rottenTomatoesResourcePool = new SemaphoreSlim(1, 1); + + private readonly SemaphoreSlim _refreshResourcePool = new SemaphoreSlim(1, 1); + + /// + /// Gets the json serializer. + /// + /// The json serializer. + protected IJsonSerializer JsonSerializer { get; private set; } + + /// + /// Gets the HTTP client. + /// + /// The HTTP client. + protected IHttpClient HttpClient { get; private set; } + + private readonly IItemRepository _itemRepo; + + private readonly string _requestHistoryPath; + + /// + /// Initializes a new instance of the class. + /// + /// The log manager. + /// The configuration manager. + /// The json serializer. + /// The HTTP client. + /// The app paths. + public RottenTomatoesProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IHttpClient httpClient, IApplicationPaths appPaths, IItemRepository itemRepo) + : base(logManager, configurationManager) + { + JsonSerializer = jsonSerializer; + HttpClient = httpClient; + _itemRepo = itemRepo; + + _requestHistoryPath = Path.Combine(appPaths.CachePath, "rotten-tomatoes"); + } + + /// + /// Gets the provider version. + /// + /// The provider version. + protected override string ProviderVersion + { + get + { + return "7"; + } + } + + /// + /// Gets a value indicating whether [requires internet]. + /// + /// true if [requires internet]; otherwise, false. + public override bool RequiresInternet + { + get + { + return true; + } + } + + /// + /// Gets a value indicating whether [refresh on version change]. + /// + /// true if [refresh on version change]; otherwise, false. + protected override bool RefreshOnVersionChange + { + get + { + return true; + } + } + + /// + /// The _configuration + /// + private List _requestHistory; + /// + /// The _configuration initialized + /// + private bool _requestHistoryInitialized; + /// + /// The _configuration sync lock + /// + private object _requestHistorySyncLock = new object(); + /// + /// Gets the user's configuration + /// + /// The configuration. + public List RequestHistory + { + get + { + // Lazy load + LazyInitializer.EnsureInitialized(ref _requestHistory, ref _requestHistoryInitialized, ref _requestHistorySyncLock, LoadRequestHistory); + return _requestHistory; + } + private set + { + _requestHistory = value; + + if (value == null) + { + _requestHistoryInitialized = false; + } + } + } + + /// + /// Gets the request history file path. + /// + /// The request history file path. + private string RequestHistoryFilePath + { + get + { + if (!Directory.Exists(_requestHistoryPath)) + { + Directory.CreateDirectory(_requestHistoryPath); + } + + return Path.Combine(_requestHistoryPath, "data.dat"); + } + } + + protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); + + /// + /// Loads the request history. + /// + /// List{DateTime}. + private List LoadRequestHistory() + { + try + { + return + File.ReadAllText(RequestHistoryFilePath) + .Split('|') + .Select(i => + { + long ticks; + + if (long.TryParse(i, NumberStyles.Any, UsCulture, out ticks)) + { + return new DateTime(ticks, DateTimeKind.Utc); + } + + return DateTime.MinValue; + }) + .ToList(); + } + catch + { + return new List(); + } + } + + private void SaveRequestHistory(IEnumerable history) + { + using (var fs = new FileStream(RequestHistoryFilePath, FileMode.Create, FileAccess.Write, FileShare.Read)) + { + using (var streamWriter = new StreamWriter(fs)) + { + var now = DateTime.UtcNow; + + var text = string.Join("|", history.Where(i => (now - i).TotalDays <= 2) + .Select(i => i.Ticks.ToString(UsCulture)) + .ToArray()); + + streamWriter.Write(text); + } + } + } + + /// + /// Supports the specified item. + /// + /// The item. + /// true if XXXX, false otherwise + public override bool Supports(BaseItem item) + { + var trailer = item as Trailer; + + if (trailer != null) + { + return !trailer.IsLocalTrailer; + } + + // Don't support local trailers + return item is Movie; + } + + /// + /// Gets the comparison data. + /// + /// The imdb id. + /// Guid. + private Guid GetComparisonData(string imdbId) + { + return string.IsNullOrEmpty(imdbId) ? Guid.Empty : imdbId.GetMD5(); + } + + /// + /// Gets the priority. + /// + /// The priority. + public override MetadataProviderPriority Priority + { + get + { + // Run after moviedb and xml providers + return MetadataProviderPriority.Last; + } + } + + /// + /// Needses the refresh internal. + /// + /// The item. + /// The provider info. + /// true if XXXX, false otherwise + protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) + { + // Refresh if rt id has changed + if (providerInfo.Data != GetComparisonData(item.GetProviderId(MetadataProviders.Imdb))) + { + return true; + } + + return base.NeedsRefreshInternal(item, providerInfo); + } + + /// + /// Fetches metadata and returns true or false indicating if any work that requires persistence was done + /// + /// The item. + /// if set to true [force]. + /// The cancellation token. + /// Task{System.Boolean}. + public override async Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) + { + await _refreshResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); + + var history = RequestHistory; + + var now = DateTime.UtcNow; + + if (history.Count(i => (now - i).TotalDays <= 1) >= DailyRefreshLimit) + { + _refreshResourcePool.Release(); + + Logger.Debug("Skipping {0} because daily request limit has been reached. Tomorrow's refresh will retrieve it.", item.Name); + + return false; + } + + try + { + await FetchAsyncInternal(item, force, cancellationToken).ConfigureAwait(false); + } + finally + { + SaveRequestHistory(history); + + _refreshResourcePool.Release(); + } + + return true; + } + + /// + /// Fetches the async internal. + /// + /// The item. + /// if set to true [force]. + /// The cancellation token. + /// Task{System.Boolean}. + private async Task FetchAsyncInternal(BaseItem item, bool force, CancellationToken cancellationToken) + { + BaseProviderInfo data; + + if (!item.ProviderData.TryGetValue(Id, out data)) + { + data = new BaseProviderInfo(); + item.ProviderData[Id] = data; + } + + var imdbId = item.GetProviderId(MetadataProviders.Imdb); + + if (string.IsNullOrEmpty(imdbId)) + { + data.Data = GetComparisonData(imdbId); + data.LastRefreshStatus = ProviderRefreshStatus.Success; + return; + } + + var apiKey = GetApiKey(); + + if (string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.RottenTomatoes))) + { + await FetchRottenTomatoesId(item, apiKey, cancellationToken).ConfigureAwait(false); + } + + RequestHistory.Add(DateTime.UtcNow); + + using (var stream = await HttpClient.Get(new HttpRequestOptions + { + Url = GetMovieReviewsUrl(item.GetProviderId(MetadataProviders.RottenTomatoes), apiKey), + ResourcePool = _rottenTomatoesResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true + + }).ConfigureAwait(false)) + { + + var result = JsonSerializer.DeserializeFromStream(stream); + + var criticReviews = result.reviews.Select(rtReview => new ItemReview + { + ReviewerName = rtReview.critic, + Publisher = rtReview.publication, + Date = DateTime.Parse(rtReview.date).ToUniversalTime(), + Caption = rtReview.quote, + Url = rtReview.links.review, + Likes = string.Equals(rtReview.freshness, "fresh", StringComparison.OrdinalIgnoreCase) + + }).ToList(); + + await _itemRepo.SaveCriticReviews(item.Id, criticReviews).ConfigureAwait(false); + } + + data.Data = GetComparisonData(item.GetProviderId(MetadataProviders.Imdb)); + data.LastRefreshStatus = ProviderRefreshStatus.Success; + SetLastRefreshed(item, DateTime.UtcNow); + } + + /// + /// Fetches the rotten tomatoes id. + /// + /// The item. + /// The API key. + /// The cancellation token. + /// Task. + private async Task FetchRottenTomatoesId(BaseItem item, string apiKey, CancellationToken cancellationToken) + { + var imdbId = item.GetProviderId(MetadataProviders.Imdb); + + RequestHistory.Add(DateTime.UtcNow); + + // Have IMDB Id + using (var stream = await HttpClient.Get(new HttpRequestOptions + { + Url = GetMovieImdbUrl(imdbId, apiKey), + ResourcePool = _rottenTomatoesResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true + + }).ConfigureAwait(false)) + { + var hit = JsonSerializer.DeserializeFromStream(stream); + + if (!string.IsNullOrEmpty(hit.id)) + { + // Got a result + item.CriticRatingSummary = hit.critics_consensus; + item.CriticRating = float.Parse(hit.ratings.critics_score); + + item.SetProviderId(MetadataProviders.RottenTomatoes, hit.id); + } + } + } + + + // Utility functions to get the URL of the API calls + + private string GetMovieReviewsUrl(string rtId, string apiKey) + { + return BasicUrl + string.Format(MoviesReviews, apiKey, rtId); + } + private string GetMovieImdbUrl(string imdbId, string apiKey) + { + return BasicUrl + string.Format(MovieImdb, apiKey, imdbId.TrimStart('t')); + } + + private string GetApiKey() + { + var index = Environment.MachineName.GetHashCode()%_apiKeys.Length; + + return _apiKeys[index]; + } + + // Data contract classes for use with the Rotten Tomatoes API + + protected class RTReviewList + { + public int total { get; set; } + public List reviews { get; set; } + } + + protected class RTReview + { + public string critic { get; set; } + public string date { get; set; } + public string freshness { get; set; } + public string publication { get; set; } + public string quote { get; set; } + public RTReviewLink links { get; set; } + public string original_score { get; set; } + } + + protected class RTReviewLink + { + public string review { get; set; } + } + + protected class RTSearchResults + { + public int total { get; set; } + public List movies { get; set; } + public RTSearchLinks links { get; set; } + public string link_template { get; set; } + } + + protected class RTSearchLinks + { + public string self { get; set; } + public string next { get; set; } + public string previous { get; set; } + } + + protected class RTMovieSearchResult + { + public string title { get; set; } + public int year { get; set; } + public string runtime { get; set; } + public string synopsis { get; set; } + public string critics_consensus { get; set; } + public string mpaa_rating { get; set; } + public string id { get; set; } + public RTRatings ratings { get; set; } + public RTAlternateIds alternate_ids { get; set; } + } + + protected class RTRatings + { + public string critics_rating { get; set; } + public string critics_score { get; set; } + } + + protected class RTAlternateIds + { + public string imdb { get; set; } + } + + } +} \ No newline at end of file diff --git a/MediaBrowser.Plugins.RottenTomatoes/packages.config b/MediaBrowser.Plugins.RottenTomatoes/packages.config new file mode 100644 index 0000000..a8d69f9 --- /dev/null +++ b/MediaBrowser.Plugins.RottenTomatoes/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/MediaBrowser.Plugins.Tmt5/MediaBrowser.Plugins.Tmt5.csproj b/MediaBrowser.Plugins.Tmt5/MediaBrowser.Plugins.Tmt5.csproj index 4ec27ab..bbc7c8b 100644 --- a/MediaBrowser.Plugins.Tmt5/MediaBrowser.Plugins.Tmt5.csproj +++ b/MediaBrowser.Plugins.Tmt5/MediaBrowser.Plugins.Tmt5.csproj @@ -37,13 +37,13 @@ Always - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Common.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Common.dll - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Model.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Model.dll False diff --git a/MediaBrowser.Plugins.Tmt5/packages.config b/MediaBrowser.Plugins.Tmt5/packages.config index 3af0692..bbd493d 100644 --- a/MediaBrowser.Plugins.Tmt5/packages.config +++ b/MediaBrowser.Plugins.Tmt5/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/MediaBrowser.Plugins.Trailers/MediaBrowser.Plugins.Trailers.csproj b/MediaBrowser.Plugins.Trailers/MediaBrowser.Plugins.Trailers.csproj index 0b05c14..6078d4e 100644 --- a/MediaBrowser.Plugins.Trailers/MediaBrowser.Plugins.Trailers.csproj +++ b/MediaBrowser.Plugins.Trailers/MediaBrowser.Plugins.Trailers.csproj @@ -35,17 +35,17 @@ Always - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Common.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Common.dll - + False - ..\packages\MediaBrowser.Server.Core.3.0.98\lib\net45\MediaBrowser.Controller.dll + ..\packages\MediaBrowser.Server.Core.3.0.100\lib\net45\MediaBrowser.Controller.dll - + False - ..\packages\MediaBrowser.Common.3.0.98\lib\net45\MediaBrowser.Model.dll + ..\packages\MediaBrowser.Common.3.0.100\lib\net45\MediaBrowser.Model.dll diff --git a/MediaBrowser.Plugins.Trailers/packages.config b/MediaBrowser.Plugins.Trailers/packages.config index a37972d..a8d69f9 100644 --- a/MediaBrowser.Plugins.Trailers/packages.config +++ b/MediaBrowser.Plugins.Trailers/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file