diff options
21 files changed, 94 insertions, 38 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 343672877..07b24c259 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -182,7 +182,7 @@ namespace MediaBrowser.Api if (job.ActiveRequestCount == 0) { - var timerDuration = type == TranscodingJobType.Progressive ? 1000 : 120000; + var timerDuration = type == TranscodingJobType.Progressive ? 1000 : 180000; if (job.KillTimer == null) { diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index 8b01e2702..970185394 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -23,11 +23,6 @@ namespace MediaBrowser.Api.Playback.Hls [ApiMember(Name = "TimeStampOffsetMs", Description = "Optional. Alter the timestamps in the playlist by a given amount, in ms. Default is 1000.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public int TimeStampOffsetMs { get; set; } - - public GetHlsVideoStream() - { - TimeStampOffsetMs = 1000; - } } /// <summary> diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index 0cb6148cc..2bac30fe2 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -138,7 +138,12 @@ namespace MediaBrowser.Api.UserLibrary { if (!string.IsNullOrEmpty(request.NameStartsWithOrGreater)) { - items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.Name, StringComparison.CurrentCultureIgnoreCase) < 1); + items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1); + } + + if (!string.IsNullOrEmpty(request.NameLessThan)) + { + items = items.Where(i => string.Compare(request.NameLessThan, i.SortName, StringComparison.CurrentCultureIgnoreCase) == 1); } var imageTypes = request.GetImageTypes().ToList(); @@ -274,6 +279,9 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string NameStartsWithOrGreater { get; set; } + [ApiMember(Name = "NameLessThan", Description = "Optional filter by items whose name is sorted less than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string NameLessThan { get; set; } + public GetItemsByName() { Recursive = true; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 95a68c009..bcf62115c 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; +using MoreLinq; using System; using System.Collections; using System.Collections.Concurrent; @@ -1009,10 +1010,10 @@ namespace MediaBrowser.Controller.Entities continue; } - hasLinkedChildren = true; - if (child.IsVisible(user)) { + hasLinkedChildren = true; + list.Add(child); } } @@ -1058,7 +1059,7 @@ namespace MediaBrowser.Controller.Entities if (includeLinkedChildren && hasLinkedChildren) { - list = list.Distinct().ToList(); + list = list.DistinctBy(i => i.Id).ToList(); } return list; diff --git a/MediaBrowser.Controller/Library/IIntroProvider.cs b/MediaBrowser.Controller/Library/IIntroProvider.cs index f54c3a329..990fa933c 100644 --- a/MediaBrowser.Controller/Library/IIntroProvider.cs +++ b/MediaBrowser.Controller/Library/IIntroProvider.cs @@ -15,5 +15,11 @@ namespace MediaBrowser.Controller.Library /// <param name="user">The user.</param> /// <returns>IEnumerable{System.String}.</returns> IEnumerable<string> GetIntros(BaseItem item, User user); + + /// <summary> + /// Gets all intros. + /// </summary> + /// <returns>IEnumerable{System.String}.</returns> + IEnumerable<string> GetAllIntros(); } } diff --git a/MediaBrowser.Model/Querying/ItemsByNameQuery.cs b/MediaBrowser.Model/Querying/ItemsByNameQuery.cs index 1d8849648..22ed79108 100644 --- a/MediaBrowser.Model/Querying/ItemsByNameQuery.cs +++ b/MediaBrowser.Model/Querying/ItemsByNameQuery.cs @@ -67,10 +67,26 @@ namespace MediaBrowser.Model.Querying /// <value>The sort by.</value> public string[] SortBy { get; set; } + /// <summary> + /// Gets or sets the image types. + /// </summary> + /// <value>The image types.</value> public ImageType[] ImageTypes { get; set; } /// <summary> - /// Initializes a new instance of the <see cref="ItemsByNameQuery"/> class. + /// Gets or sets the name starts with or greater. + /// </summary> + /// <value>The name starts with or greater.</value> + public string NameStartsWithOrGreater { get; set; } + + /// <summary> + /// Gets or sets the name less than. + /// </summary> + /// <value>The name less than.</value> + public string NameLessThan { get; set; } + + /// <summary> + /// Initializes a new instance of the <see cref="ItemsByNameQuery" /> class. /// </summary> public ItemsByNameQuery() { diff --git a/MediaBrowser.Model/Querying/PersonsQuery.cs b/MediaBrowser.Model/Querying/PersonsQuery.cs index a859ece1f..a4b7eab71 100644 --- a/MediaBrowser.Model/Querying/PersonsQuery.cs +++ b/MediaBrowser.Model/Querying/PersonsQuery.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Model.Entities; - + namespace MediaBrowser.Model.Querying { /// <summary> diff --git a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs index 753812293..ddc15a612 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs @@ -263,6 +263,8 @@ namespace MediaBrowser.Providers.Movies var xmlPath = Path.Combine(movieDataPath, "fanart.xml"); + Directory.CreateDirectory(movieDataPath); + using (var response = await HttpClient.Get(new HttpRequestOptions { Url = url, diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 1b25dc58f..424070f70 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; +using MediaBrowser.Providers.Savers; using System; using System.Collections.Generic; using System.Globalization; @@ -15,7 +16,6 @@ using System.Net; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Providers.Savers; namespace MediaBrowser.Providers.Movies { diff --git a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs index f6c0c9208..35daaf2d2 100644 --- a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs +++ b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs @@ -46,7 +46,7 @@ namespace MediaBrowser.Providers.Movies { get { - return "9"; + return "11"; } } @@ -189,10 +189,9 @@ namespace MediaBrowser.Providers.Movies // Grab series genres because imdb data is better than tvdb. Leave movies alone // But only do it if english is the preferred language because this data will not be localized if (!item.LockedFields.Contains(MetadataFields.Genres) && - item is Series && + ShouldFetchGenres(item) && !string.IsNullOrWhiteSpace(result.Genre) && - !string.Equals(result.Genre, "n/a", StringComparison.OrdinalIgnoreCase) - && string.Equals(ConfigurationManager.Configuration.PreferredMetadataLanguage, "en")) + !string.Equals(result.Genre, "n/a", StringComparison.OrdinalIgnoreCase)) { item.Genres.Clear(); @@ -206,6 +205,17 @@ namespace MediaBrowser.Providers.Movies } } + private bool ShouldFetchGenres(BaseItem item) + { + // Only fetch if other providers didn't get anything + if (item is Trailer) + { + return item.Genres.Count == 0; + } + + return item is Series; + } + protected class RootObject { public string Title { get; set; } diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs index 131c73f38..8013ddd3c 100644 --- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs @@ -274,6 +274,8 @@ namespace MediaBrowser.Providers.Music var xmlPath = Path.Combine(artistPath, "fanart.xml"); + Directory.CreateDirectory(artistPath); + using (var response = await HttpClient.Get(new HttpRequestOptions { Url = url, diff --git a/MediaBrowser.Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Providers/TV/FanArtTVProvider.cs index 972665af7..bf0651432 100644 --- a/MediaBrowser.Providers/TV/FanArtTVProvider.cs +++ b/MediaBrowser.Providers/TV/FanArtTVProvider.cs @@ -317,6 +317,8 @@ namespace MediaBrowser.Providers.TV var xmlPath = Path.Combine(seriesDataPath, "fanart.xml"); + Directory.CreateDirectory(seriesDataPath); + using (var response = await HttpClient.Get(new HttpRequestOptions { Url = url, diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index ef315f5cb..0d2360d5b 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs @@ -238,7 +238,11 @@ namespace MediaBrowser.Providers.TV /// <returns>Task{System.Boolean}.</returns> private async Task FetchSeriesData(Series series, string seriesId, string seriesDataPath, bool isForcedRefresh, CancellationToken cancellationToken) { - var files = Directory.EnumerateFiles(seriesDataPath, "*.xml", SearchOption.TopDirectoryOnly).Select(Path.GetFileName).ToList(); + Directory.CreateDirectory(seriesDataPath); + + var files = Directory.EnumerateFiles(seriesDataPath, "*.xml", SearchOption.TopDirectoryOnly) + .Select(Path.GetFileName) + .ToList(); var seriesXmlFilename = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower() + ".xml"; diff --git a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs index 9e3799ab8..be97285c6 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs @@ -150,12 +150,16 @@ namespace MediaBrowser.Providers.TV if (!string.IsNullOrEmpty(seriesId)) { // Process images - var imagesXmlPath = Path.Combine(RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId), "banners.xml"); + var seriesDataPath = RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId); + + var imagesXmlPath = Path.Combine(seriesDataPath, "banners.xml"); if (!series.HasImage(ImageType.Primary) || !series.HasImage(ImageType.Banner) || series.BackdropImagePaths.Count == 0) { var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops; + Directory.CreateDirectory(seriesDataPath); + try { var fanartData = FetchFanartXmlData(imagesXmlPath, backdropLimit, cancellationToken); diff --git a/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs b/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs index 56296ba84..14d468a8e 100644 --- a/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs +++ b/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs @@ -69,7 +69,7 @@ namespace MediaBrowser.Server.Implementations.WebSocket _hasStarted = true; } - catch (SocketException ex) + catch (Exception ex) { _logger.ErrorException("The web socket server is unable to start on port {0} due to a Socket error. This can occasionally happen when the operating system takes longer than usual to release the IP bindings from the previous session. This can take up to five minutes. Please try waiting or rebooting the system.", ex, portNumber); @@ -119,21 +119,28 @@ namespace MediaBrowser.Server.Implementations.WebSocket GC.SuppressFinalize(this); } + private readonly object _syncLock = new object(); + /// <summary> /// Releases unmanaged and - optionally - managed resources. /// </summary> /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> protected virtual void Dispose(bool dispose) { - if (WebSocketServer != null) + lock (_syncLock) { - if (_hasStarted) + if (WebSocketServer != null) { - WebSocketServer.Stop(); + if (_hasStarted) + { + _logger.Debug("Stopping alchemy server"); + WebSocketServer.Stop(); + } + + _logger.Debug("Disposing alchemy server"); + WebSocketServer.Dispose(); + WebSocketServer = null; } - - WebSocketServer.Dispose(); - WebSocketServer = null; } } } diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs index 88def28db..fba3dd42c 100644 --- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs +++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs @@ -119,9 +119,9 @@ namespace MediaBrowser.ServerApplication.FFMpeg var files = Directory.EnumerateFiles(tempFolder, "*.exe", SearchOption.AllDirectories).ToList(); - foreach (var file in files) + foreach (var file in files.Where(i => i.IndexOf("ffprobe.exe", StringComparison.OrdinalIgnoreCase) != -1 || i.IndexOf("ffmpeg.exe", StringComparison.OrdinalIgnoreCase) != -1)) { - File.Copy(file, Path.Combine(targetFolder, Path.GetFileName(file))); + File.Copy(file, Path.Combine(targetFolder, Path.GetFileName(file)), true); } } finally diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index efc3adf56..ecd4891a9 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -119,9 +119,9 @@ <Reference Include="Hardcodet.Wpf.TaskbarNotification"> <HintPath>..\packages\Hardcodet.Wpf.TaskbarNotification.1.0.4.0\lib\net40\Hardcodet.Wpf.TaskbarNotification.dll</HintPath> </Reference> - <Reference Include="MediaBrowser.IsoMounter, Version=1.0.5021.28866, Culture=neutral, processorArchitecture=MSIL"> + <Reference Include="MediaBrowser.IsoMounter, Version=1.0.5025.12100, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\MediaBrowser.IsoMounting.3.0.60\lib\net45\MediaBrowser.IsoMounter.dll</HintPath> + <HintPath>..\packages\MediaBrowser.IsoMounting.3.0.61\lib\net45\MediaBrowser.IsoMounter.dll</HintPath> </Reference> <Reference Include="NLog, Version=2.0.1.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> @@ -129,7 +129,7 @@ </Reference> <Reference Include="pfmclrapi, Version=0.0.0.0, Culture=neutral, processorArchitecture=x86"> <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\MediaBrowser.IsoMounting.3.0.60\lib\net45\pfmclrapi.dll</HintPath> + <HintPath>..\packages\MediaBrowser.IsoMounting.3.0.61\lib\net45\pfmclrapi.dll</HintPath> </Reference> <Reference Include="ServiceStack, Version=3.9.60.0, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config index f0601d401..29b2cce5f 100644 --- a/MediaBrowser.ServerApplication/packages.config +++ b/MediaBrowser.ServerApplication/packages.config @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Hardcodet.Wpf.TaskbarNotification" version="1.0.4.0" targetFramework="net45" /> - <package id="MediaBrowser.IsoMounting" version="3.0.60" targetFramework="net45" /> + <package id="MediaBrowser.IsoMounting" version="3.0.61" targetFramework="net45" /> <package id="NLog" version="2.0.1.2" targetFramework="net45" /> <package id="ServiceStack" version="3.9.62" targetFramework="net45" /> <package id="ServiceStack.Common" version="3.9.62" targetFramework="net45" /> diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 6714bb59e..e9af79efb 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common.Internal</id> - <version>3.0.217</version> + <version>3.0.218</version> <title>MediaBrowser.Common.Internal</title> <authors>Luke</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.217" /> + <dependency id="MediaBrowser.Common" version="3.0.218" /> <dependency id="NLog" version="2.0.1.2" /> <dependency id="ServiceStack.Text" version="3.9.58" /> <dependency id="SimpleInjector" version="2.3.2" /> diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 814a4cd7e..10caee574 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common</id> - <version>3.0.217</version> + <version>3.0.218</version> <title>MediaBrowser.Common</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 894905447..80e62afb2 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata> <id>MediaBrowser.Server.Core</id> - <version>3.0.217</version> + <version>3.0.218</version> <title>Media Browser.Server.Core</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains core components required to build plugins for Media Browser Server.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.217" /> + <dependency id="MediaBrowser.Common" version="3.0.218" /> </dependencies> </metadata> <files> |
