aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/ApiEntryPoint.cs23
-rw-r--r--MediaBrowser.Api/Movies/MoviesService.cs29
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs11
-rw-r--r--MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs15
-rw-r--r--MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs4
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs3
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs17
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs710
-rw-r--r--MediaBrowser.Api/UserLibrary/PersonsService.cs11
-rw-r--r--MediaBrowser.Common.Implementations/BaseApplicationHost.cs11
-rw-r--r--MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs42
-rw-r--r--MediaBrowser.Controller/Channels/Channel.cs2
-rw-r--r--MediaBrowser.Controller/Channels/ChannelFolderItem.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs4
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs (renamed from MediaBrowser.Controller/Entities/UserItemsQuery.cs)12
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs8
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs6
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs105
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj2
-rw-r--r--MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs4
-rw-r--r--MediaBrowser.Dlna/Didl/DidlBuilder.cs8
-rw-r--r--MediaBrowser.Dlna/DlnaManager.cs1
-rw-r--r--MediaBrowser.Dlna/MediaBrowser.Dlna.csproj2
-rw-r--r--MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/DirectTvProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/LgTvProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/Windows81Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/Xbox360Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/XboxOneProfile.cs1
-rw-r--r--MediaBrowser.MediaInfo/MediaBrowser.MediaInfo.csproj1
-rw-r--r--MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj9
-rw-r--r--MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj9
-rw-r--r--MediaBrowser.Model/ApiClient/ConnectionResult.cs5
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs15
-rw-r--r--MediaBrowser.Model/Dlna/ProfileCondition.cs14
-rw-r--r--MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs (renamed from MediaBrowser.Dlna/Profiles/AndroidProfile.cs)64
-rw-r--r--MediaBrowser.Model/Dlna/Profiles/DefaultProfile.cs (renamed from MediaBrowser.Dlna/Profiles/DefaultProfile.cs)5
-rw-r--r--MediaBrowser.Model/Dlna/ResolutionNormalizer.cs63
-rw-r--r--MediaBrowser.Model/MediaBrowser.Model.csproj3
-rw-r--r--MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs18
-rw-r--r--MediaBrowser.Providers/MediaBrowser.Providers.csproj1
-rw-r--r--MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbImageProvider.cs124
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbProvider.cs2
-rw-r--r--MediaBrowser.Providers/People/MovieDbPersonProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/FanartSeriesProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs16
-rw-r--r--MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs16
-rw-r--r--MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs16
-rw-r--r--MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs13
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs5
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs12
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs12
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs15
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/de.json2
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json20
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json2
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json3
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json18
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json20
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json18
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json34
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/de.json2
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/es_MX.json24
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/fr.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/hr.json8
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/kk.json6
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/nl.json2
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ru.json8
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/sv.json54
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj1
-rw-r--r--MediaBrowser.Server.Mono/IO/FileSystemFactory.cs21
-rw-r--r--MediaBrowser.Server.Mono/MainWindow.cs16
-rw-r--r--MediaBrowser.Server.Mono/MediaBrowser.MediaInfo.dll.config4
-rw-r--r--MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj99
-rw-r--r--MediaBrowser.Server.Mono/Program.cs19
-rw-r--r--MediaBrowser.Server.Mono/gtk-gui/MainWindow.cs20
-rw-r--r--MediaBrowser.Server.Mono/gtk-gui/generated.cs29
-rw-r--r--MediaBrowser.Server.Mono/gtk-gui/gui.stetic20
-rw-r--r--MediaBrowser.Server.Mono/packages.config4
-rw-r--r--MediaBrowser.Server.Mono/tray.pngbin56208 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/ApplicationHost.cs18
-rw-r--r--MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs43
-rw-r--r--MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs28
-rw-r--r--MediaBrowser.ServerApplication/IO/FileSystemFactory.cs21
-rw-r--r--MediaBrowser.ServerApplication/IO/NativeFileSystem.cs4
-rw-r--r--MediaBrowser.ServerApplication/MainStartup.cs11
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj5
-rw-r--r--MediaBrowser.ServerApplication/Native/BrowserLauncher.cs6
-rw-r--r--MediaBrowser.ServerApplication/packages.config1
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj12
-rw-r--r--MediaBrowser.sln178
-rw-r--r--OpenSubtitlesHandler/OpenSubtitlesHandler.csproj2
110 files changed, 1384 insertions, 905 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs
index 435bca0b8c..2e9323e034 100644
--- a/MediaBrowser.Api/ApiEntryPoint.cs
+++ b/MediaBrowser.Api/ApiEntryPoint.cs
@@ -316,14 +316,14 @@ namespace MediaBrowser.Api
/// <param name="deleteFiles">The delete files.</param>
/// <returns>Task.</returns>
/// <exception cref="ArgumentNullException">deviceId</exception>
- internal Task KillTranscodingJobs(string deviceId, Func<string, bool> deleteFiles)
+ internal void KillTranscodingJobs(string deviceId, Func<string, bool> deleteFiles)
{
if (string.IsNullOrEmpty(deviceId))
{
throw new ArgumentNullException("deviceId");
}
- return KillTranscodingJobs(j => string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase), deleteFiles);
+ KillTranscodingJobs(j => string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase), deleteFiles);
}
/// <summary>
@@ -332,7 +332,7 @@ namespace MediaBrowser.Api
/// <param name="killJob">The kill job.</param>
/// <param name="deleteFiles">The delete files.</param>
/// <returns>Task.</returns>
- internal async Task KillTranscodingJobs(Func<TranscodingJob, bool> killJob, Func<string, bool> deleteFiles)
+ internal void KillTranscodingJobs(Func<TranscodingJob, bool> killJob, Func<string, bool> deleteFiles)
{
var jobs = new List<TranscodingJob>();
@@ -348,18 +348,9 @@ namespace MediaBrowser.Api
return;
}
- await TranscodingStartLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
-
- try
- {
- foreach (var job in jobs)
- {
- KillTranscodingJob(job, deleteFiles);
- }
- }
- finally
+ foreach (var job in jobs)
{
- TranscodingStartLock.Release();
+ KillTranscodingJob(job, deleteFiles);
}
}
@@ -501,7 +492,7 @@ namespace MediaBrowser.Api
}
catch (FileNotFoundException)
{
-
+
}
catch (IOException ex)
{
@@ -563,7 +554,7 @@ namespace MediaBrowser.Api
public long? BytesDownloaded { get; set; }
public long? BytesTranscoded { get; set; }
-
+
public long? TranscodingPositionTicks { get; set; }
public long? DownloadPositionTicks { get; set; }
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index 46b4c06722..ef86a46e8a 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -126,8 +126,14 @@ namespace MediaBrowser.Api.Movies
movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies);
+ var listEligibleForCategories = new List<BaseItem>();
+ var listEligibleForSuggestion = new List<BaseItem> ();
+
var list = movies.ToList();
+ listEligibleForCategories.AddRange(list);
+ listEligibleForSuggestion.AddRange(list);
+
if (user.Configuration.IncludeTrailersInSuggestions)
{
var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
@@ -138,17 +144,20 @@ namespace MediaBrowser.Api.Movies
}, CancellationToken.None).ConfigureAwait(false);
- var newTrailers = trailerResult.Items;
+ listEligibleForSuggestion.AddRange(trailerResult.Items);
+ }
- list.AddRange(newTrailers);
+ listEligibleForCategories = listEligibleForCategories
+ .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
+ .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
+ .ToList();
- list = list
- .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
- .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
- .ToList();
- }
+ listEligibleForSuggestion = listEligibleForSuggestion
+ .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
+ .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
+ .ToList();
- var result = GetRecommendationCategories(user, list, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
+ var result = GetRecommendationCategories(user, listEligibleForCategories, listEligibleForSuggestion, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
return ToOptimizedResult(result);
}
@@ -210,11 +219,11 @@ namespace MediaBrowser.Api.Movies
return result;
}
- private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<BaseItem> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields)
+ private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<BaseItem> allMoviesForCategories, List<BaseItem> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields)
{
var categories = new List<RecommendationDto>();
- var recentlyPlayedMovies = allMovies
+ var recentlyPlayedMovies = allMoviesForCategories
.Select(i =>
{
var userdata = _userDataRepository.GetUserData(user.Id, i.GetUserDataKey());
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index cb95049ce1..734b6a9394 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -1645,6 +1645,17 @@ namespace MediaBrowser.Api.Playback
{
state.OutputVideoCodec = GetVideoCodec(videoRequest);
state.OutputVideoBitrate = GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream);
+
+ if (state.OutputVideoBitrate.HasValue)
+ {
+ var resolution = ResolutionNormalizer.Normalize(state.OutputVideoBitrate.Value,
+ state.OutputVideoCodec,
+ videoRequest.MaxWidth,
+ videoRequest.MaxHeight);
+
+ videoRequest.MaxWidth = resolution.MaxWidth;
+ videoRequest.MaxHeight = resolution.MaxHeight;
+ }
}
ApplyDeviceProfileSettings(state);
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index 2035aff164..b99657c30f 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -139,7 +139,7 @@ namespace MediaBrowser.Api.Playback.Hls
// If the playlist doesn't already exist, startup ffmpeg
try
{
- await ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType.Hls && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase)).ConfigureAwait(false);
+ ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType.Hls && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase));
if (currentTranscodingIndex.HasValue)
{
@@ -157,7 +157,7 @@ namespace MediaBrowser.Api.Playback.Hls
throw;
}
- await WaitForMinimumSegmentCount(playlistPath, 1, cancellationTokenSource.Token).ConfigureAwait(false);
+ await WaitForMinimumSegmentCount(playlistPath, 2, cancellationTokenSource.Token).ConfigureAwait(false);
}
}
}
@@ -402,8 +402,10 @@ namespace MediaBrowser.Api.Playback.Hls
var queryStringIndex = Request.RawUrl.IndexOf('?');
var queryString = queryStringIndex == -1 ? string.Empty : Request.RawUrl.Substring(queryStringIndex);
+ var isLiveStream = (state.RunTimeTicks ?? 0) == 0;
+
// Main stream
- var playlistUrl = (state.RunTimeTicks ?? 0) > 0 ? "main.m3u8" : "live.m3u8";
+ var playlistUrl = isLiveStream ? "live.m3u8" : "main.m3u8";
playlistUrl += queryString;
var request = (GetMasterHlsVideoStream)state.Request;
@@ -418,7 +420,7 @@ namespace MediaBrowser.Api.Playback.Hls
AppendPlaylist(builder, playlistUrl, totalBitrate, subtitleGroup);
- if (EnableAdaptiveBitrateStreaming(state))
+ if (EnableAdaptiveBitrateStreaming(state, isLiveStream))
{
var requestedVideoBitrate = state.VideoRequest.VideoBitRate.Value;
@@ -482,7 +484,7 @@ namespace MediaBrowser.Api.Playback.Hls
}
}
- private bool EnableAdaptiveBitrateStreaming(StreamState state)
+ private bool EnableAdaptiveBitrateStreaming(StreamState state, bool isLiveStream)
{
// Within the local network this will likely do more harm than good.
if (Request.IsLocal || NetworkManager.IsInLocalNetwork(Request.RemoteIp))
@@ -491,13 +493,12 @@ namespace MediaBrowser.Api.Playback.Hls
}
var request = state.Request as GetMasterHlsVideoStream;
-
if (request != null && !request.EnableAdaptiveBitrateStreaming)
{
return false;
}
- if (string.IsNullOrWhiteSpace(state.MediaPath))
+ if (isLiveStream || string.IsNullOrWhiteSpace(state.MediaPath))
{
// Opening live streams is so slow it's not even worth it
return false;
diff --git a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
index a8d4c6b86f..2263a2b371 100644
--- a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
+++ b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
@@ -72,9 +72,7 @@ namespace MediaBrowser.Api.Playback.Hls
public void Delete(StopEncodingProcess request)
{
- var task = ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, path => true);
-
- Task.WaitAll(task);
+ ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, path => true);
}
/// <summary>
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
index c2b8069cb2..15a2d5c337 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using ServiceStack;
using System;
@@ -101,7 +102,7 @@ namespace MediaBrowser.Api.UserLibrary
filteredItems = FilterByLibraryItems(request, filteredItems, user, libraryItems);
- filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast<TItemType>();
+ filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending).Cast<TItemType>();
var ibnItemsArray = filteredItems.ToList();
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
index f236100147..3dcd4efbda 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
@@ -96,6 +96,21 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "IsPlayed", Description = "Optional filter by items that are played, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? IsPlayed { get; set; }
+ public string[] GetMediaTypes()
+ {
+ return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+ }
+
+ public string[] GetIncludeItemTypes()
+ {
+ return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+ }
+
+ public string[] GetExcludeItemTypes()
+ {
+ return (ExcludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+ }
+
/// <summary>
/// Gets the filters.
/// </summary>
@@ -132,7 +147,7 @@ namespace MediaBrowser.Api.UserLibrary
/// Gets the order by.
/// </summary>
/// <returns>IEnumerable{ItemSortBy}.</returns>
- public IEnumerable<string> GetOrderBy()
+ public string[] GetOrderBy()
{
var val = SortBy;
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 2ac4f5e636..011864d35e 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -16,6 +16,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Threading.Tasks;
namespace MediaBrowser.Api.UserLibrary
{
@@ -289,9 +290,9 @@ namespace MediaBrowser.Api.UserLibrary
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
- public object Get(GetItems request)
+ public async Task<object> Get(GetItems request)
{
- var result = GetItems(request);
+ var result = await GetItems(request).ConfigureAwait(false);
return ToOptimizedSerializedResultUsingCache(result);
}
@@ -301,16 +302,27 @@ namespace MediaBrowser.Api.UserLibrary
/// </summary>
/// <param name="request">The request.</param>
/// <returns>Task{ItemsResult}.</returns>
- private ItemsResult GetItems(GetItems request)
+ private async Task<ItemsResult> GetItems(GetItems request)
{
var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
- var items = GetItemsToSerialize(request, user, parentItem);
+ var result = await GetItemsToSerialize(request, user, parentItem).ConfigureAwait(false);
- items = items.AsParallel();
+ var isFiltered = result.Item2;
- items = ApplyAdditionalFilters(request, items, user);
+ if (isFiltered)
+ {
+ var currentFields = request.GetItemFields().ToList();
+
+ return new ItemsResult
+ {
+ TotalRecordCount = result.Item1.TotalRecordCount,
+ Items = result.Item1.Items.Select(i => _dtoService.GetBaseItemDto(i, currentFields, user)).ToArray()
+ };
+ }
+
+ var items = result.Item1.Items.Where(i => ApplyAdditionalFilters(request, i, user, false));
// Apply filters
// Run them starting with the ones that are likely to reduce the list the most
@@ -321,16 +333,14 @@ namespace MediaBrowser.Api.UserLibrary
items = FilterVirtualEpisodes(request, items, user);
- items = items.AsEnumerable();
-
if (CollapseBoxSetItems(request, parentItem, user))
{
items = _collectionManager.CollapseItemsWithinBoxSets(items, user);
}
items = ApplyPostCollectionCollapseFilters(request, items, user);
-
- items = ApplySortOrder(request, items, user, _libraryManager);
+
+ items = _libraryManager.Sort(items, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending);
// This must be the last filter
if (!string.IsNullOrEmpty(request.AdjacentTo))
@@ -387,8 +397,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <param name="user">The user.</param>
/// <param name="parentItem">The parent item.</param>
/// <returns>IEnumerable{BaseItem}.</returns>
- /// <exception cref="System.InvalidOperationException"></exception>
- private IEnumerable<BaseItem> GetItemsToSerialize(GetItems request, User user, BaseItem parentItem)
+ private async Task<Tuple<QueryResult<BaseItem>, bool>> GetItemsToSerialize(GetItems request, User user, BaseItem parentItem)
{
var item = string.IsNullOrEmpty(request.ParentId) ?
user == null ? _libraryManager.RootFolder : user.RootFolder :
@@ -406,19 +415,40 @@ namespace MediaBrowser.Api.UserLibrary
else if (request.Recursive)
{
- items = user == null ?
- ((Folder)item).RecursiveChildren :
- ((Folder)item).GetRecursiveChildren(user);
+ if (user == null)
+ {
+ items = ((Folder)item).RecursiveChildren;
+
+ items = _libraryManager.ReplaceVideosWithPrimaryVersions(items);
+ }
+ else
+ {
+ var result = await ((Folder)item).GetItems(GetItemsQuery(request, user));
- items = _libraryManager.ReplaceVideosWithPrimaryVersions(items);
+ return new Tuple<QueryResult<BaseItem>, bool>(result, true);
+ }
}
else
{
- items = user == null ?
- ((Folder)item).Children :
- ((Folder)item).GetChildren(user, true);
+ if (user == null)
+ {
+ items = ((Folder)item).Children;
+
+ items = _libraryManager.ReplaceVideosWithPrimaryVersions(items);
+ }
+ else
+ {
+ var userRoot = item as UserRootFolder;
+
+ if (userRoot == null)
+ {
+ var result = await ((Folder)item).GetItems(GetItemsQuery(request, user));
+
+ return new Tuple<QueryResult<BaseItem>, bool>(result, true);
+ }
- items = _libraryManager.ReplaceVideosWithPrimaryVersions(items);
+ items = ((Folder)item).GetChildren(user, true);
+ }
}
if (request.IncludeIndexContainers)
@@ -430,25 +460,72 @@ namespace MediaBrowser.Api.UserLibrary
list.AddRange(containers);
- return list.Distinct();
+ items = list.Distinct();
}
- return items;
+ return new Tuple<QueryResult<BaseItem>, bool>(new QueryResult<BaseItem>
+ {
+ Items = items.ToArray()
+
+ }, false);
}
- /// <summary>
- /// Applies sort order
- /// </summary>
- /// <param name="request">The request.</param>
- /// <param name="items">The items.</param>
- /// <param name="user">The user.</param>
- /// <param name="libraryManager">The library manager.</param>
- /// <returns>IEnumerable{BaseItem}.</returns>
- internal static IEnumerable<BaseItem> ApplySortOrder(BaseItemsRequest request, IEnumerable<BaseItem> items, User user, ILibraryManager libraryManager)
+ private InternalItemsQuery GetItemsQuery(GetItems request, User user)
{
- var orderBy = request.GetOrderBy().ToList();
+ var query = new InternalItemsQuery
+ {
+ User = user,
+ IsPlayed = request.IsPlayed,
+ MediaTypes = request.GetMediaTypes(),
+ IncludeItemTypes = request.GetIncludeItemTypes(),
+ ExcludeItemTypes = request.GetExcludeItemTypes(),
+ Recursive = request.Recursive,
+ SortBy = request.GetOrderBy(),
+ SortOrder = request.SortOrder ?? SortOrder.Ascending,
+
+ Filter = (i, u) => ApplyAdditionalFilters(request, i, u, true),
+
+ Limit = request.Limit,
+ StartIndex = request.StartIndex
+ };
+
+ foreach (var filter in request.GetFilters())
+ {
+ switch (filter)
+ {
+ case ItemFilter.Dislikes:
+ query.IsLiked = false;
+ break;
+ case ItemFilter.IsFavorite:
+ query.IsFavorite = true;
+ break;
+ case ItemFilter.IsFavoriteOrLikes:
+ query.IsFavoriteOrLiked = true;
+ break;
+ case ItemFilter.IsFolder:
+ query.IsFolder = true;
+ break;
+ case ItemFilter.IsNotFolder:
+ query.IsFolder = false;
+ break;
+ case ItemFilter.IsPlayed:
+ query.IsPlayed = true;
+ break;
+ case ItemFilter.IsRecentlyAdded:
+ break;
+ case ItemFilter.IsResumable:
+ query.IsResumable = true;
+ break;
+ case ItemFilter.IsUnplayed:
+ query.IsPlayed = false;
+ break;
+ case ItemFilter.Likes:
+ query.IsLiked = true;
+ break;
+ }
+ }
- return orderBy.Count == 0 ? items : libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending);
+ return query;
}
/// <summary>
@@ -648,36 +725,70 @@ namespace MediaBrowser.Api.UserLibrary
return items;
}
- /// <summary>
- /// Applies the additional filters.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <param name="items">The items.</param>
- /// <returns>IEnumerable{BaseItem}.</returns>
- private IEnumerable<BaseItem> ApplyAdditionalFilters(GetItems request, IEnumerable<BaseItem> items, User user)
+ private bool ApplyAdditionalFilters(GetItems request, BaseItem i, User user, bool isPreFiltered)
{
+ if (!isPreFiltered)
+ {
+ var mediaTypes = request.GetMediaTypes();
+ if (mediaTypes.Length > 0)
+ {
+ if (!(!string.IsNullOrEmpty(i.MediaType) && mediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase)))
+ {
+ return false;
+ }
+ }
+
+ if (request.IsPlayed.HasValue)
+ {
+ var val = request.IsPlayed.Value;
+ if (i.IsPlayed(user) != val)
+ {
+ return false;
+ }
+ }
+
+ // Exclude item types
+ var excluteItemTypes = request.GetExcludeItemTypes();
+ if (excluteItemTypes.Length > 0 && excluteItemTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ // Include item types
+ var includeItemTypes = request.GetIncludeItemTypes();
+ if (includeItemTypes.Length > 0 && !includeItemTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+ }
+
if (request.MinCommunityRating.HasValue)
{
var val = request.MinCommunityRating.Value;
- items = items.Where(i => i.CommunityRating.HasValue && i.CommunityRating >= val);
+ if (!(i.CommunityRating.HasValue && i.CommunityRating >= val))
+ {
+ return false;
+ }
}
if (request.MinCriticRating.HasValue)
{
var val = request.MinCriticRating.Value;
- items = items.Where(i =>
- {
- var hasCriticRating = i as IHasCriticRating;
+ var hasCriticRating = i as IHasCriticRating;
- if (hasCriticRating != null)
+ if (hasCriticRating != null)
+ {
+ if (!(hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val))
{
- return hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val;
+ return false;
}
-
+ }
+ else
+ {
return false;
- });
+ }
}
// Artists
@@ -685,12 +796,12 @@ namespace MediaBrowser.Api.UserLibrary
{
var artists = request.Artists.Split('|');
- items = items.Where(i =>
- {
- var audio = i as IHasArtist;
+ var audio = i as IHasArtist;
- return audio != null && artists.Any(audio.HasArtist);
- });
+ if (!(audio != null && artists.Any(audio.HasArtist)))
+ {
+ return false;
+ }
}
// Albums
@@ -698,37 +809,46 @@ namespace MediaBrowser.Api.UserLibrary
{
var albums = request.Albums.Split('|');
- items = items.Where(i =>
- {
- var audio = i as Audio;
+ var audio = i as Audio;
- if (audio != null)
+ if (audio != null)
+ {
+ if (!albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase)))
{
- return albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase));
+ return false;
}
+ }
- var album = i as MusicAlbum;
+ var album = i as MusicAlbum;
- if (album != null)
+ if (album != null)
+ {
+ if (!albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase)))
{
- return albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase));
+ return false;
}
+ }
- var musicVideo = i as MusicVideo;
+ var musicVideo = i as MusicVideo;
- if (musicVideo != null)
+ if (musicVideo != null)
+ {
+ if (!albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase)))
{
- return albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase));
+ return false;
}
+ }
- return false;
- });
+ return false;
}
// Min index number
if (request.MinIndexNumber.HasValue)
{
- items = items.Where(i => i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value);
+ if (!(i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value))
+ {
+ return false;
+ }
}
// Min official rating
@@ -738,24 +858,22 @@ namespace MediaBrowser.Api.UserLibrary
if (level.HasValue)
{
- items = items.Where(i =>
+ var rating = i.CustomRating;
+
+ if (string.IsNullOrEmpty(rating))
{
- var rating = i.CustomRating;
+ rating = i.OfficialRating;
+ }
- if (string.IsNullOrEmpty(rating))
- {
- rating = i.OfficialRating;
- }
+ if (!string.IsNullOrEmpty(rating))
+ {
+ var itemLevel = _localization.GetRatingLevel(rating);
- if (string.IsNullOrEmpty(rating))
+ if (!(!itemLevel.HasValue || itemLevel.Value >= level.Value))
{
- return true;
+ return false;
}
-
- var itemLevel = _localization.GetRatingLevel(rating);
-
- return !itemLevel.HasValue || itemLevel.Value >= level.Value;
- });
+ }
}
}
@@ -766,60 +884,54 @@ namespace MediaBrowser.Api.UserLibrary
if (level.HasValue)
{
- items = items.Where(i =>
+ var rating = i.CustomRating;
+
+ if (string.IsNullOrEmpty(rating))
{
- var rating = i.CustomRating;
+ rating = i.OfficialRating;
+ }
- if (string.IsNullOrEmpty(rating))
- {
- rating = i.OfficialRating;
- }
+ if (!string.IsNullOrEmpty(rating))
+ {
+ var itemLevel = _localization.GetRatingLevel(rating);
- if (string.IsNullOrEmpty(rating))
+ if (!(!itemLevel.HasValue || itemLevel.Value <= level.Value))
{
- return true;
+ return false;
}
-
- var itemLevel = _localization.GetRatingLevel(rating);
-
- return !itemLevel.HasValue || itemLevel.Value <= level.Value;
- });
+ }
}
}
- // Exclude item types
- if (!string.IsNullOrEmpty(request.ExcludeItemTypes))
- {
- var vals = request.ExcludeItemTypes.Split(',');
- items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
- }
-
- // Include item types
- if (!string.IsNullOrEmpty(request.IncludeItemTypes))
- {
- var vals = request.IncludeItemTypes.Split(',');
- items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
- }
-
// LocationTypes
if (!string.IsNullOrEmpty(request.LocationTypes))
{
var vals = request.LocationTypes.Split(',');
- items = items.Where(f => vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase));
+ if (!vals.Contains(i.LocationType.ToString(), StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
}
// ExcludeLocationTypes
if (!string.IsNullOrEmpty(request.ExcludeLocationTypes))
{
var vals = request.ExcludeLocationTypes.Split(',');
- items = items.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase));
+ if (vals.Contains(i.LocationType.ToString(), StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
}
if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater))
{
- items = items.OfType<IHasAlbumArtist>()
- .Where(i => string.Compare(request.AlbumArtistStartsWithOrGreater, i.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1)
- .Cast<BaseItem>();
+ var ok = new[] { i }.OfType<IHasAlbumArtist>()
+ .Any(p => string.Compare(request.AlbumArtistStartsWithOrGreater, p.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1);
+
+ if (!ok)
+ {
+ return false;
+ }
}
// Filter by Series Status
@@ -827,7 +939,12 @@ namespace MediaBrowser.Api.UserLibrary
{
var vals = request.SeriesStatus.Split(',');
- items = items.OfType<Series>().Where(i => i.Status.HasValue && vals.Contains(i.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase));
+ var ok = new[] { i }.OfType<Series>().Any(p => p.Status.HasValue && vals.Contains(p.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase));
+
+ if (!ok)
+ {
+ return false;
+ }
}
// Filter by Series AirDays
@@ -835,13 +952,24 @@ namespace MediaBrowser.Api.UserLibrary
{
var days = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true));
- items = items.OfType<Series>().Where(i => i.AirDays != null && days.Any(d => i.AirDays.Contains(d)));
+ var ok = new[] { i }.OfType<Series>().Any(p => p.AirDays != null && days.Any(d => p.AirDays.Contains(d)));
+
+ if (!ok)
+ {
+ return false;
+ }
}
// Filter by Video3DFormat
if (request.Is3D.HasValue)
{
- items = items.OfType<Video>().Where(i => request.Is3D.Value == i.Video3DFormat.HasValue);
+ var val = request.Is3D.Value;
+ var video = i as Video;
+
+ if (video == null || val != video.Video3DFormat.HasValue)
+ {
+ return false;
+ }
}
// Filter by VideoType
@@ -849,48 +977,60 @@ namespace MediaBrowser.Api.UserLibrary
{
var types = request.VideoTypes.Split(',');
- items = items.OfType<Video>().Where(i => types.Contains(i.VideoType.ToString(), StringComparer.OrdinalIgnoreCase));
- }
-
- if (!string.IsNullOrEmpty(request.MediaTypes))
- {
- var types = request.MediaTypes.Split(',');
-
- items = items.Where(i => !string.IsNullOrEmpty(i.MediaType) && types.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase));
+ var video = i as Video;
+ if (video == null || !types.Contains(video.VideoType.ToString(), StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
}
var imageTypes = request.GetImageTypes().ToList();
if (imageTypes.Count > 0)
{
- items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType)));
+ if (!(imageTypes.Any(imageType => HasImage(i, imageType))))
+ {
+ return false;
+ }
}
// Apply genre filter
if (!string.IsNullOrEmpty(request.Genres))
{
var vals = request.Genres.Split('|');
- items = items.Where(f => vals.Any(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)));
+ if (!(vals.Any(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))))
+ {
+ return false;
+ }
}
// Apply genre filter
if (!string.IsNullOrEmpty(request.AllGenres))
{
var vals = request.AllGenres.Split('|');
- items = items.Where(f => vals.All(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)));
+ if (!vals.All(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)))
+ {
+ return false;
+ }
}
// Apply studio filter
if (!string.IsNullOrEmpty(request.Studios))
{
var vals = request.Studios.Split('|');
- items = items.Where(f => vals.Any(v => f.Studios.Contains(v, StringComparer.OrdinalIgnoreCase)));
+ if (!vals.Any(v => i.Studios.Contains(v, StringComparer.OrdinalIgnoreCase)))
+ {
+ return false;
+ }
}
// Apply year filter
if (!string.IsNullOrEmpty(request.Years))
{
var vals = request.Years.Split(',').Select(int.Parse).ToList();
- items = items.Where(f => f.ProductionYear.HasValue && vals.Contains(f.ProductionYear.Value));
+ if (!(i.ProductionYear.HasValue && vals.Contains(i.ProductionYear.Value)))
+ {
+ return false;
+ }
}
// Apply person filter
@@ -900,316 +1040,380 @@ namespace MediaBrowser.Api.UserLibrary
if (string.IsNullOrEmpty(personTypes))
{
- items = items.Where(item => item.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)));
+ if (!(i.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase))))
+ {
+ return false;
+ }
}
else
{
var types = personTypes.Split(',');
- items = items.Where(item =>
+ var ok = new[] { i }.Any(item =>
item.People != null &&
item.People.Any(p =>
p.Name.Equals(request.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase))));
+
+ if (!ok)
+ {
+ return false;
+ }
}
}
if (request.HasTrailer.HasValue)
{
var val = request.HasTrailer.Value;
- items = items.Where(i =>
+ var trailerCount = 0;
+
+ var hasTrailers = i as IHasTrailers;
+ if (hasTrailers != null)
{
- var trailerCount = 0;
+ trailerCount = hasTrailers.LocalTrailerIds.Count;
+ }
- var hasTrailers = i as IHasTrailers;
- if (hasTrailers != null)
- {
- trailerCount = hasTrailers.LocalTrailerIds.Count;
- }
+ var ok = val ? trailerCount > 0 : trailerCount == 0;
- return val ? trailerCount > 0 : trailerCount == 0;
- });
+ if (!ok)
+ {
+ return false;
+ }
}
if (request.HasThemeSong.HasValue)
{
var filterValue = request.HasThemeSong.Value;
- items = items.Where(i =>
+ var themeCount = 0;
+ var iHasThemeMedia = i as IHasThemeMedia;
+
+ if (iHasThemeMedia != null)
{
- var themeCount = 0;
- var iHasThemeMedia = i as IHasThemeMedia;
+ themeCount = iHasThemeMedia.ThemeSongIds.Count;
+ }
+ var ok = filterValue ? themeCount > 0 : themeCount == 0;
- if (iHasThemeMedia != null)
- {
- themeCount = iHasThemeMedia.ThemeSongIds.Count;
- }
- return filterValue ? themeCount > 0 : themeCount == 0;
- });
+ if (!ok)
+ {
+ return false;
+ }
}
if (request.HasThemeVideo.HasValue)
{
var filterValue = request.HasThemeVideo.Value;
- items = items.Where(i =>
+ var themeCount = 0;
+ var iHasThemeMedia = i as IHasThemeMedia;
+
+ if (iHasThemeMedia != null)
{
- var themeCount = 0;
- var iHasThemeMedia = i as IHasThemeMedia;
+ themeCount = iHasThemeMedia.ThemeVideoIds.Count;
+ }
+ var ok = filterValue ? themeCount > 0 : themeCount == 0;
- if (iHasThemeMedia != null)
- {
- themeCount = iHasThemeMedia.ThemeVideoIds.Count;
- }
- return filterValue ? themeCount > 0 : themeCount == 0;
- });
+ if (!ok)
+ {
+ return false;
+ }
}
if (request.MinPlayers.HasValue)
{
var filterValue = request.MinPlayers.Value;
- items = items.Where(i =>
+ var game = i as Game;
+
+ if (game != null)
{
- var game = i as Game;
+ var players = game.PlayersSupported ?? 1;
- if (game != null)
- {
- var players = game.PlayersSupported ?? 1;
+ var ok = players >= filterValue;
- return players >= filterValue;
+ if (!ok)
+ {
+ return false;
}
-
+ }
+ else
+ {
return false;
- });
+ }
}
if (request.MaxPlayers.HasValue)
{
var filterValue = request.MaxPlayers.Value;
- items = items.Where(i =>
+ var game = i as Game;
+
+ if (game != null)
{
- var game = i as Game;
+ var players = game.PlayersSupported ?? 1;
- if (game != null)
- {
- var players = game.PlayersSupported ?? 1;
+ var ok = players <= filterValue;
- return players <= filterValue;
+ if (!ok)
+ {
+ return false;
}
-
+ }
+ else
+ {
return false;
- });
+ }
}
if (request.HasSpecialFeature.HasValue)
{
var filterValue = request.HasSpecialFeature.Value;
- items = items.Where(i =>
+ var movie = i as IHasSpecialFeatures;
+
+ if (movie != null)
{
- var movie = i as IHasSpecialFeatures;
+ var ok = filterValue
+ ? movie.SpecialFeatureIds.Count > 0
+ : movie.SpecialFeatureIds.Count == 0;
- if (movie != null)
+ if (!ok)
{
- return filterValue
- ? movie.SpecialFeatureIds.Count > 0
- : movie.SpecialFeatureIds.Count == 0;
+ return false;
}
-
+ }
+ else
+ {
return false;
- });
+ }
}
if (request.HasSubtitles.HasValue)
{
var val = request.HasSubtitles.Value;
- items = items.OfType<Video>().Where(i => val == i.HasSubtitles);
+ var video = i as Video;
+
+ if (video == null || val != video.HasSubtitles)
+ {
+ return false;
+ }
}
if (request.HasParentalRating.HasValue)
{
var val = request.HasParentalRating.Value;
- items = items.Where(i =>
+ var rating = i.CustomRating;
+
+ if (string.IsNullOrEmpty(rating))
{
- var rating = i.CustomRating;
+ rating = i.OfficialRating;
+ }
+ if (val)
+ {
if (string.IsNullOrEmpty(rating))
{
- rating = i.OfficialRating;
+ return false;
}
-
- if (val)
+ }
+ else
+ {
+ if (!string.IsNullOrEmpty(rating))
{
- return !string.IsNullOrEmpty(rating);
+ return false;
}
-
- return string.IsNullOrEmpty(rating);
- });
+ }
}
if (request.IsHD.HasValue)
{
var val = request.IsHD.Value;
- items = items.OfType<Video>().Where(i => i.IsHD == val);
+ var video = i as Video;
+
+ if (video == null || val != video.IsHD)
+ {
+ return false;
+ }
}
if (request.IsInBoxSet.HasValue)
{
var val = request.IsHD.Value;
- items = items.Where(i => i.Parents.OfType<BoxSet>().Any() == val);
- }
-
- if (request.IsPlayed.HasValue)
- {
- var val = request.IsPlayed.Value;
- items = items.Where(i => i.IsPlayed(user) == val);
+ if (i.Parents.OfType<BoxSet>().Any() != val)
+ {
+ return false;
+ }
}
if (request.IsUnidentified.HasValue)
{
var val = request.IsUnidentified.Value;
- items = items.Where(i => i.IsUnidentified == val);
+ if (i.IsUnidentified != val)
+ {
+ return false;
+ }
}
if (request.IsLocked.HasValue)
{
var val = request.IsLocked.Value;
- items = items.Where(i => i.IsLocked == val);
+ if (i.IsLocked != val)
+ {
+ return false;
+ }
}
if (request.ParentIndexNumber.HasValue)
{
var filterValue = request.ParentIndexNumber.Value;
- items = items.Where(i =>
- {
- var episode = i as Episode;
+ var episode = i as Episode;
- if (episode != null)
+ if (episode != null)
+ {
+ if (episode.ParentIndexNumber.HasValue && episode.ParentIndexNumber.Value != filterValue)
{
- return episode.ParentIndexNumber.HasValue && episode.ParentIndexNumber.Value == filterValue;
+ return false;
}
+ }
- var song = i as Audio;
+ var song = i as Audio;
- if (song != null)
+ if (song != null)
+ {
+ if (song.ParentIndexNumber.HasValue && song.ParentIndexNumber.Value != filterValue)
{
- return song.ParentIndexNumber.HasValue && song.ParentIndexNumber.Value == filterValue;
+ return false;
}
-
- return true;
- });
+ }
}
if (request.AiredDuringSeason.HasValue)
{
- items = Series.FilterEpisodesBySeason(items.OfType<Episode>(), request.AiredDuringSeason.Value, true);
+ var episode = i as Episode;
+
+ if (episode == null)
+ {
+ return false;
+ }
+
+ if (!Series.FilterEpisodesBySeason(new[] { episode }, request.AiredDuringSeason.Value, true).Any())
+ {
+ return false;
+ }
}
if (!string.IsNullOrEmpty(request.MinPremiereDate))
{
var date = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
- items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value >= date);
+ if (!(i.PremiereDate.HasValue && i.PremiereDate.Value >= date))
+ {
+ return false;
+ }
}
if (!string.IsNullOrEmpty(request.MaxPremiereDate))
{
var date = DateTime.Parse(request.MaxPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
- items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value <= date);
+ if (!(i.PremiereDate.HasValue && i.PremiereDate.Value <= date))
+ {
+ return false;
+ }
}
if (request.HasOverview.HasValue)
{
var filterValue = request.HasOverview.Value;
- items = items.Where(i =>
- {
- var hasValue = !string.IsNullOrEmpty(i.Overview);
+ var hasValue = !string.IsNullOrEmpty(i.Overview);
- return hasValue == filterValue;
- });
+ if (hasValue != filterValue)
+ {
+ return false;
+ }
}
if (request.HasImdbId.HasValue)
{
var filterValue = request.HasImdbId.Value;
- items = items.Where(i =>
- {
- var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb));
+ var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb));
- return hasValue == filterValue;
- });
+ if (hasValue != filterValue)
+ {
+ return false;
+ }
}
if (request.HasTmdbId.HasValue)
{
var filterValue = request.HasTmdbId.Value;
- items = items.Where(i =>
- {
- var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb));
+ var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb));
- return hasValue == filterValue;
- });
+ if (hasValue != filterValue)
+ {
+ return false;
+ }
}
if (request.HasTvdbId.HasValue)
{
var filterValue = request.HasTvdbId.Value;
- items = items.Where(i =>
- {
- var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb));
+ var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb));
- return hasValue == filterValue;
- });
+ if (hasValue != filterValue)
+ {
+ return false;
+ }
}
if (request.IsYearMismatched.HasValue)
{
var filterValue = request.IsYearMismatched.Value;
- items = items.Where(i => IsYearMismatched(i) == filterValue);
+ if (IsYearMismatched(i) != filterValue)
+ {
+ return false;
+ }
}
if (request.HasOfficialRating.HasValue)
{
var filterValue = request.HasOfficialRating.Value;
- items = items.Where(i =>
- {
- var hasValue = !string.IsNullOrEmpty(i.OfficialRating);
+ var hasValue = !string.IsNullOrEmpty(i.OfficialRating);
- return hasValue == filterValue;
- });
+ if (hasValue != filterValue)
+ {
+ return false;
+ }
}
if (request.IsPlaceHolder.HasValue)
{
var filterValue = request.IsPlaceHolder.Value;
- items = items.Where(i =>
- {
- var isPlaceHolder = false;
+ var isPlaceHolder = false;
- var hasPlaceHolder = i as ISupportsPlaceHolders;
+ var hasPlaceHolder = i as ISupportsPlaceHolders;
- if (hasPlaceHolder != null)
- {
- isPlaceHolder = hasPlaceHolder.IsPlaceHolder;
- }
+ if (hasPlaceHolder != null)
+ {
+ isPlaceHolder = hasPlaceHolder.IsPlaceHolder;
+ }
- return isPlaceHolder == filterValue;
- });
+ if (isPlaceHolder != filterValue)
+ {
+ return false;
+ }
}
- return items;
+ return true;
}
private IEnumerable<BaseItem> ApplyPostCollectionCollapseFilters(GetItems request, IEnumerable<BaseItem> items, User user)
@@ -1230,7 +1434,7 @@ namespace MediaBrowser.Api.UserLibrary
return items;
}
-
+
private bool IsYearMismatched(BaseItem item)
{
if (item.ProductionYear.HasValue)
diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs
index cf9959e535..5651f2c73f 100644
--- a/MediaBrowser.Api/UserLibrary/PersonsService.cs
+++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs
@@ -159,11 +159,14 @@ namespace MediaBrowser.Api.UserLibrary
{
var people = itemsList.SelectMany(i => i.People.OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type));
- return personTypes.Length == 0 ?
-
- people :
+ if (personTypes.Length > 0)
+ {
+ people = people.Where(p =>
+ personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) ||
+ personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase));
+ }
- people.Where(p => personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase));
+ return people;
}
}
}
diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
index c59d1a3b00..5a5d48ac27 100644
--- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
+++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
@@ -196,12 +196,15 @@ namespace MediaBrowser.Common.Implementations
/// <summary>
/// Initializes a new instance of the <see cref="BaseApplicationHost{TApplicationPathsType}"/> class.
/// </summary>
- protected BaseApplicationHost(TApplicationPathsType applicationPaths, ILogManager logManager)
+ protected BaseApplicationHost(TApplicationPathsType applicationPaths,
+ ILogManager logManager,
+ IFileSystem fileSystem)
{
FailedAssemblies = new List<string>();
ApplicationPaths = applicationPaths;
LogManager = logManager;
+ FileSystemManager = fileSystem;
ConfigurationManager = GetConfigurationManager();
}
@@ -441,7 +444,6 @@ namespace MediaBrowser.Common.Implementations
RegisterSingleInstance(TaskManager);
- FileSystemManager = CreateFileSystemManager();
RegisterSingleInstance(FileSystemManager);
HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger, FileSystemManager, ConfigurationManager);
@@ -485,11 +487,6 @@ namespace MediaBrowser.Common.Implementations
}
}
- protected virtual IFileSystem CreateFileSystemManager()
- {
- return new CommonFileSystem(Logger, true);
- }
-
/// <summary>
/// Gets a list of types within an assembly
/// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference
diff --git a/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs b/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs
index 2d67ec9756..cc89fad35d 100644
--- a/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs
+++ b/MediaBrowser.Common.Implementations/IO/CommonFileSystem.cs
@@ -15,11 +15,31 @@ namespace MediaBrowser.Common.Implementations.IO
protected ILogger Logger;
private readonly bool _supportsAsyncFileStreams;
+ private char[] _invalidFileNameChars;
- public CommonFileSystem(ILogger logger, bool supportsAsyncFileStreams)
+ public CommonFileSystem(ILogger logger, bool supportsAsyncFileStreams, bool usePresetInvalidFileNameChars)
{
Logger = logger;
_supportsAsyncFileStreams = supportsAsyncFileStreams;
+
+ SetInvalidFileNameChars(usePresetInvalidFileNameChars);
+ }
+
+ private void SetInvalidFileNameChars(bool usePresetInvalidFileNameChars)
+ {
+ // GetInvalidFileNameChars is less restrictive in Linux/Mac than Windows, this mimic Windows behavior for mono under Linux/Mac.
+
+ if (usePresetInvalidFileNameChars)
+ {
+ _invalidFileNameChars = new char[41] { '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
+ '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12',
+ '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D',
+ '\x1E', '\x1F', '\x22', '\x3C', '\x3E', '\x7C', ':', '*', '?', '\\', '/' };
+ }
+ else
+ {
+ _invalidFileNameChars = Path.GetInvalidFileNameChars();
+ }
}
/// <summary>
@@ -129,18 +149,6 @@ namespace MediaBrowser.Common.Implementations.IO
/// The space char
/// </summary>
private const char SpaceChar = ' ';
- /// <summary>
- /// The invalid file name chars
- /// </summary>
- #if __MonoCS__
- //GetInvalidFileNameChars is less restrictive in Linux/Mac than Windows, this mimic Windows behavior for mono under Linux/Mac.
- private static readonly char[] InvalidFileNameChars = new char [41] { '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
- '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12',
- '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D',
- '\x1E', '\x1F', '\x22', '\x3C', '\x3E', '\x7C', ':', '*', '?', '\\', '/' };
- #else
- private static readonly char[] InvalidFileNameChars = Path.GetInvalidFileNameChars();
- #endif
/// <summary>
/// Takes a filename and removes invalid characters
@@ -157,7 +165,7 @@ namespace MediaBrowser.Common.Implementations.IO
var builder = new StringBuilder(filename);
- foreach (var c in InvalidFileNameChars)
+ foreach (var c in _invalidFileNameChars)
{
builder = builder.Replace(c, SpaceChar);
}
@@ -300,7 +308,7 @@ namespace MediaBrowser.Common.Implementations.IO
{
throw new ArgumentNullException("path");
}
-
+
return path.IndexOf(parentPath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase) != -1;
}
@@ -310,12 +318,12 @@ namespace MediaBrowser.Common.Implementations.IO
{
throw new ArgumentNullException("path");
}
-
+
var parent = Path.GetDirectoryName(path);
if (!string.IsNullOrEmpty(parent))
{
- return false;
+ return false;
}
return true;
diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs
index 9e5a332e10..f618c8a255 100644
--- a/MediaBrowser.Controller/Channels/Channel.cs
+++ b/MediaBrowser.Controller/Channels/Channel.cs
@@ -22,7 +22,7 @@ namespace MediaBrowser.Controller.Channels
return base.IsVisible(user);
}
- public override async Task<QueryResult<BaseItem>> GetUserItems(UserItemsQuery query)
+ public override async Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
{
try
{
diff --git a/MediaBrowser.Controller/Channels/ChannelFolderItem.cs b/MediaBrowser.Controller/Channels/ChannelFolderItem.cs
index eea410fb88..5362cc1954 100644
--- a/MediaBrowser.Controller/Channels/ChannelFolderItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelFolderItem.cs
@@ -44,7 +44,7 @@ namespace MediaBrowser.Controller.Channels
return ExternalId;
}
- public override async Task<QueryResult<BaseItem>> GetUserItems(UserItemsQuery query)
+ public override async Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
{
try
{
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 6363da6960..bfec0c26e6 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -770,7 +770,7 @@ namespace MediaBrowser.Controller.Entities
return item;
}
- public virtual Task<QueryResult<BaseItem>> GetUserItems(UserItemsQuery query)
+ public virtual Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
{
var user = query.User;
@@ -783,7 +783,7 @@ namespace MediaBrowser.Controller.Entities
return Task.FromResult(result);
}
- protected QueryResult<BaseItem> SortAndFilter(IEnumerable<BaseItem> items, UserItemsQuery query)
+ protected QueryResult<BaseItem> SortAndFilter(IEnumerable<BaseItem> items, InternalItemsQuery query)
{
return UserViewBuilder.SortAndFilter(items, null, query, LibraryManager, UserDataManager);
}
diff --git a/MediaBrowser.Controller/Entities/UserItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index ca1c0115d6..91cb43291f 100644
--- a/MediaBrowser.Controller/Entities/UserItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -3,7 +3,7 @@ using System;
namespace MediaBrowser.Controller.Entities
{
- public class UserItemsQuery
+ public class InternalItemsQuery
{
public bool Recursive { get; set; }
@@ -21,15 +21,21 @@ namespace MediaBrowser.Controller.Entities
public bool? IsFolder { get; set; }
public bool? IsFavorite { get; set; }
+ public bool? IsFavoriteOrLiked { get; set; }
+ public bool? IsLiked { get; set; }
public bool? IsPlayed { get; set; }
public bool? IsResumable { get; set; }
public string[] MediaTypes { get; set; }
-
- public UserItemsQuery()
+ public string[] IncludeItemTypes { get; set; }
+ public string[] ExcludeItemTypes { get; set; }
+
+ public InternalItemsQuery()
{
SortBy = new string[] { };
MediaTypes = new string[] { };
+ IncludeItemTypes = new string[] { };
+ ExcludeItemTypes = new string[] { };
}
}
}
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index daabc0bfab..a7276e262c 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -16,8 +16,14 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class UserRootFolder : Folder
{
- public override async Task<QueryResult<BaseItem>> GetUserItems(UserItemsQuery query)
+ public override async Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
{
+ if (query.Recursive)
+ {
+ var items = query.User.RootFolder.GetRecursiveChildren(query.User);
+ return SortAndFilter(items, query);
+ }
+
var result = await UserViewManager.GetUserViews(new UserViewQuery
{
UserId = query.User.Id.ToString("N")
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index 9b26ce23cd..043c69e275 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities
public static ITVSeriesManager TVSeriesManager;
- public override Task<QueryResult<BaseItem>> GetUserItems(UserItemsQuery query)
+ public override Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
{
return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager)
.GetUserItems(this, ViewType, query);
@@ -23,7 +23,7 @@ namespace MediaBrowser.Controller.Entities
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
{
- var result = GetUserItems(new UserItemsQuery
+ var result = GetItems(new InternalItemsQuery
{
User = user
@@ -34,7 +34,7 @@ namespace MediaBrowser.Controller.Entities
public override IEnumerable<BaseItem> GetRecursiveChildren(User user, bool includeLinkedChildren = true)
{
- var result = GetUserItems(new UserItemsQuery
+ var result = GetItems(new InternalItemsQuery
{
User = user,
Recursive = true
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index b9695f8e20..8efa1b6bb4 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -39,7 +39,7 @@ namespace MediaBrowser.Controller.Entities
_tvSeriesManager = tvSeriesManager;
}
- public async Task<QueryResult<BaseItem>> GetUserItems(Folder parent, string viewType, UserItemsQuery query)
+ public async Task<QueryResult<BaseItem>> GetUserItems(Folder parent, string viewType, InternalItemsQuery query)
{
var user = query.User;
@@ -214,7 +214,7 @@ namespace MediaBrowser.Controller.Entities
return 50;
}
- private async Task<QueryResult<BaseItem>> GetMusicFolders(Folder parent, User user, UserItemsQuery query)
+ private async Task<QueryResult<BaseItem>> GetMusicFolders(Folder parent, User user, InternalItemsQuery query)
{
if (query.Recursive)
{
@@ -236,7 +236,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(list, query);
}
- private async Task<QueryResult<BaseItem>> GetMusicFavorites(Folder parent, User user, UserItemsQuery query)
+ private async Task<QueryResult<BaseItem>> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query)
{
var list = new List<BaseItem>();
@@ -249,7 +249,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(list, query);
}
- private QueryResult<BaseItem> GetMusicAlbumArtists(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMusicAlbumArtists(Folder parent, User user, InternalItemsQuery query)
{
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
@@ -273,7 +273,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(artists, query);
}
- private QueryResult<BaseItem> GetMusicArtists(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMusicArtists(Folder parent, User user, InternalItemsQuery query)
{
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
@@ -297,7 +297,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(artists, query);
}
- private QueryResult<BaseItem> GetFavoriteArtists(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteArtists(Folder parent, User user, InternalItemsQuery query)
{
var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
@@ -321,17 +321,17 @@ namespace MediaBrowser.Controller.Entities
return GetResult(artists, query);
}
- private QueryResult<BaseItem> GetMusicAlbums(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMusicAlbums(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is MusicAlbum), query);
}
- private QueryResult<BaseItem> GetMusicSongs(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMusicSongs(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is Audio.Audio), query);
}
- private QueryResult<BaseItem> GetMusicLatest(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMusicLatest(Folder parent, User user, InternalItemsQuery query)
{
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
@@ -339,7 +339,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is MusicVideo || i is Audio.Audio), GetSpecialItemsLimit(), query);
}
- private async Task<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, UserItemsQuery query)
+ private async Task<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, InternalItemsQuery query)
{
if (query.Recursive)
{
@@ -360,52 +360,52 @@ namespace MediaBrowser.Controller.Entities
return GetResult(list, query);
}
- private QueryResult<BaseItem> GetFavoriteMovies(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteMovies(Folder parent, User user, InternalItemsQuery query)
{
query.IsFavorite = true;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), query);
}
- private QueryResult<BaseItem> GetFavoriteSeries(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteSeries(Folder parent, User user, InternalItemsQuery query)
{
query.IsFavorite = true;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).Where(i => i is Series), query);
}
- private QueryResult<BaseItem> GetFavoriteEpisodes(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteEpisodes(Folder parent, User user, InternalItemsQuery query)
{
query.IsFavorite = true;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).Where(i => i is Episode), query);
}
- private QueryResult<BaseItem> GetFavoriteSongs(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteSongs(Folder parent, User user, InternalItemsQuery query)
{
query.IsFavorite = true;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music }).Where(i => i is Audio.Audio), query);
}
- private QueryResult<BaseItem> GetFavoriteAlbums(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteAlbums(Folder parent, User user, InternalItemsQuery query)
{
query.IsFavorite = true;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music }).Where(i => i is MusicAlbum), query);
}
- private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), query);
}
- private QueryResult<BaseItem> GetMovieCollections(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMovieCollections(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is BoxSet), query);
}
- private QueryResult<BaseItem> GetMovieLatest(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMovieLatest(Folder parent, User user, InternalItemsQuery query)
{
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
@@ -413,7 +413,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), GetSpecialItemsLimit(), query);
}
- private QueryResult<BaseItem> GetMovieResume(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMovieResume(Folder parent, User user, InternalItemsQuery query)
{
query.SortBy = new[] { ItemSortBy.DatePlayed, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
@@ -422,7 +422,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), GetSpecialItemsLimit(), query);
}
- private QueryResult<BaseItem> GetMovieGenres(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetMovieGenres(Folder parent, User user, InternalItemsQuery query)
{
var genres = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty })
.Where(i => i is Movie)
@@ -447,7 +447,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(genres, query);
}
- private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, UserItemsQuery query)
+ private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query)
{
if (query.Recursive)
{
@@ -469,7 +469,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(list, query);
}
- private async Task<QueryResult<BaseItem>> GetGameView(User user, Folder parent, UserItemsQuery query)
+ private async Task<QueryResult<BaseItem>> GetGameView(User user, Folder parent, InternalItemsQuery query)
{
if (query.Recursive)
{
@@ -489,7 +489,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(list, query);
}
- private QueryResult<BaseItem> GetLatestGames(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetLatestGames(Folder parent, User user, InternalItemsQuery query)
{
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
@@ -497,7 +497,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<Game>(), GetSpecialItemsLimit(), query);
}
- private QueryResult<BaseItem> GetRecentlyPlayedGames(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetRecentlyPlayedGames(Folder parent, User user, InternalItemsQuery query)
{
query.IsPlayed = true;
query.SortBy = new[] { ItemSortBy.DatePlayed, ItemSortBy.SortName };
@@ -506,14 +506,14 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<Game>(), GetSpecialItemsLimit(), query);
}
- private QueryResult<BaseItem> GetFavoriteGames(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetFavoriteGames(Folder parent, User user, InternalItemsQuery query)
{
query.IsFavorite = true;
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<Game>(), query);
}
- private QueryResult<BaseItem> GetTvLatest(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetTvLatest(Folder parent, User user, InternalItemsQuery query)
{
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
@@ -521,7 +521,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).OfType<Episode>(), GetSpecialItemsLimit(), query);
}
- private QueryResult<BaseItem> GetTvNextUp(Folder parent, UserItemsQuery query)
+ private QueryResult<BaseItem> GetTvNextUp(Folder parent, InternalItemsQuery query)
{
var parentFolders = GetMediaFolders(parent, query.User, new[] { CollectionType.TvShows, string.Empty });
@@ -536,7 +536,7 @@ namespace MediaBrowser.Controller.Entities
return result;
}
- private QueryResult<BaseItem> GetTvResume(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetTvResume(Folder parent, User user, InternalItemsQuery query)
{
query.SortBy = new[] { ItemSortBy.DatePlayed, ItemSortBy.SortName };
query.SortOrder = SortOrder.Descending;
@@ -545,12 +545,12 @@ namespace MediaBrowser.Controller.Entities
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).OfType<Episode>(), GetSpecialItemsLimit(), query);
}
- private QueryResult<BaseItem> GetTvSeries(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetTvSeries(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).OfType<Series>(), query);
}
- private QueryResult<BaseItem> GetTvGenres(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetTvGenres(Folder parent, User user, InternalItemsQuery query)
{
var genres = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty })
.OfType<Series>()
@@ -575,12 +575,12 @@ namespace MediaBrowser.Controller.Entities
return GetResult(genres, query);
}
- private QueryResult<BaseItem> GetGameSystems(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetGameSystems(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<GameSystem>(), query);
}
- private QueryResult<BaseItem> GetGameGenres(Folder parent, User user, UserItemsQuery query)
+ private QueryResult<BaseItem> GetGameGenres(Folder parent, User user, InternalItemsQuery query)
{
var genres = GetRecursiveChildren(parent, user, new[] { CollectionType.Games })
.OfType<Game>()
@@ -616,7 +616,7 @@ namespace MediaBrowser.Controller.Entities
}
private QueryResult<BaseItem> GetResult<T>(IEnumerable<T> items,
- UserItemsQuery query)
+ InternalItemsQuery query)
where T : BaseItem
{
return GetResult(items, null, query);
@@ -624,7 +624,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetResult<T>(IEnumerable<T> items,
int? totalRecordLimit,
- UserItemsQuery query)
+ InternalItemsQuery query)
where T : BaseItem
{
return SortAndFilter(items, totalRecordLimit, query, _libraryManager, _userDataManager);
@@ -632,7 +632,7 @@ namespace MediaBrowser.Controller.Entities
public static QueryResult<BaseItem> SortAndFilter(IEnumerable<BaseItem> items,
int? totalRecordLimit,
- UserItemsQuery query,
+ InternalItemsQuery query,
ILibraryManager libraryManager,
IUserDataManager userDataManager)
{
@@ -645,7 +645,7 @@ namespace MediaBrowser.Controller.Entities
public static QueryResult<BaseItem> Sort(IEnumerable<BaseItem> items,
int? totalRecordLimit,
- UserItemsQuery query,
+ InternalItemsQuery query,
ILibraryManager libraryManager)
{
var user = query.User;
@@ -676,13 +676,23 @@ namespace MediaBrowser.Controller.Entities
};
}
- private static bool Filter(BaseItem item, User user, UserItemsQuery query, IUserDataManager userDataManager)
+ private static bool Filter(BaseItem item, User user, InternalItemsQuery query, IUserDataManager userDataManager)
{
if (query.MediaTypes.Length > 0 && !query.MediaTypes.Contains(item.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
{
return false;
}
+ if (query.IncludeItemTypes.Length > 0 && !query.IncludeItemTypes.Contains(item.GetClientTypeName(), StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.ExcludeItemTypes.Length > 0 && query.ExcludeItemTypes.Contains(item.GetClientTypeName(), StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
if (query.IsFolder.HasValue && query.IsFolder.Value != item.IsFolder)
{
return false;
@@ -695,6 +705,27 @@ namespace MediaBrowser.Controller.Entities
UserItemData userData = null;
+ if (query.IsLiked.HasValue)
+ {
+ userData = userData ?? userDataManager.GetUserData(user.Id, item.GetUserDataKey());
+
+ if (!userData.Likes.HasValue || userData.Likes != query.IsLiked.Value)
+ {
+ return false;
+ }
+ }
+
+ if (query.IsFavoriteOrLiked.HasValue)
+ {
+ userData = userData ?? userDataManager.GetUserData(user.Id, item.GetUserDataKey());
+ var isFavoriteOrLiked = userData.IsFavorite || (userData.Likes ?? false);
+
+ if (isFavoriteOrLiked != query.IsFavoriteOrLiked.Value)
+ {
+ return false;
+ }
+ }
+
if (query.IsFavorite.HasValue)
{
userData = userData ?? userDataManager.GetUserData(user.Id, item.GetUserDataKey());
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index ce9e83009b..e04cc20874 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -151,6 +151,7 @@
<Compile Include="Entities\ILibraryItem.cs" />
<Compile Include="Entities\ImageSourceInfo.cs" />
<Compile Include="Entities\IMetadataContainer.cs" />
+ <Compile Include="Entities\InternalItemsQuery.cs" />
<Compile Include="Entities\ISupportsBoxSetGrouping.cs" />
<Compile Include="Entities\ISupportsPlaceHolders.cs" />
<Compile Include="Entities\ItemImageInfo.cs" />
@@ -160,7 +161,6 @@
<Compile Include="Entities\IHasAwards.cs" />
<Compile Include="Entities\Photo.cs" />
<Compile Include="Entities\PhotoAlbum.cs" />
- <Compile Include="Entities\UserItemsQuery.cs" />
<Compile Include="Entities\UserView.cs" />
<Compile Include="Entities\UserViewBuilder.cs" />
<Compile Include="FileOrganization\IFileOrganizationService.cs" />
diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
index 59b907f7d5..3f9ce66c5c 100644
--- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
+++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
@@ -341,7 +341,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
isFolder = true;
}
- return await folder.GetUserItems(new UserItemsQuery
+ return await folder.GetItems(new InternalItemsQuery
{
Limit = limit,
StartIndex = startIndex,
@@ -364,7 +364,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
sortOrders.Add(ItemSortBy.SortName);
}
- return await folder.GetUserItems(new UserItemsQuery
+ return await folder.GetItems(new InternalItemsQuery
{
Limit = limit,
StartIndex = startIndex,
diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
index 4bd300e868..28aebae79e 100644
--- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs
+++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
@@ -766,12 +766,10 @@ namespace MediaBrowser.Dlna.Didl
if (!_profile.EnableAlbumArtInDidl)
{
- if (!string.Equals(item.MediaType, MediaType.Photo, StringComparison.OrdinalIgnoreCase) && !string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase)
+ || string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
{
- if (!item.IsFolder)
- {
- return;
- }
+ return;
}
}
diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs
index 66555a90d8..dc43b90b20 100644
--- a/MediaBrowser.Dlna/DlnaManager.cs
+++ b/MediaBrowser.Dlna/DlnaManager.cs
@@ -6,6 +6,7 @@ using MediaBrowser.Controller.Drawing;
using MediaBrowser.Dlna.Profiles;
using MediaBrowser.Dlna.Server;
using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Dlna.Profiles;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using System;
diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
index 7b09a492d8..761ce52c88 100644
--- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
+++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
@@ -87,7 +87,6 @@
<Compile Include="Common\ServiceAction.cs" />
<Compile Include="PlayTo\TRANSPORTSTATE.cs" />
<Compile Include="PlayTo\uParserObject.cs" />
- <Compile Include="Profiles\AndroidProfile.cs" />
<Compile Include="Profiles\Foobar2000Profile.cs" />
<Compile Include="Profiles\MediaMonkeyProfile.cs" />
<Compile Include="Profiles\Windows81Profile.cs" />
@@ -114,7 +113,6 @@
<Compile Include="Common\DeviceIcon.cs" />
<Compile Include="PlayTo\uParser.cs" />
<Compile Include="PlayTo\uPnpNamespaces.cs" />
- <Compile Include="Profiles\DefaultProfile.cs" />
<Compile Include="Profiles\DenonAvrProfile.cs" />
<Compile Include="Profiles\LgTvProfile.cs" />
<Compile Include="Profiles\LinksysDMA2100Profile.cs" />
diff --git a/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs b/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
index f8451bdfd8..224ae7715a 100644
--- a/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs b/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs
index 585f8652e6..4c07c2827c 100644
--- a/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs b/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
index a4a7edd28a..07936688d4 100644
--- a/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs b/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
index 45cbbef6cb..1d011a2432 100644
--- a/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/LgTvProfile.cs b/MediaBrowser.Dlna/Profiles/LgTvProfile.cs
index 4ecfd3c5b9..8b887500e3 100644
--- a/MediaBrowser.Dlna/Profiles/LgTvProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/LgTvProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs b/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
index e7542ea9e5..0565f6c932 100644
--- a/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
@@ -1,6 +1,7 @@
using System.Xml.Serialization;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs b/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs
index 7163252db2..a73c6ccf4b 100644
--- a/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs b/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
index 533f4ecf49..acefc0d6d2 100644
--- a/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs b/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
index b0eef109d6..eb37fa90df 100644
--- a/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
using MediaBrowser.Model.MediaInfo;
namespace MediaBrowser.Dlna.Profiles
diff --git a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
index baaccba5a7..75b9abd5d2 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
index d2e6d7c15f..6802bf6318 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
index edf004c29e..7b6470c30f 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
index f1317d38a4..953fbfb9b4 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
index 7e23b501d7..71e0186b39 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
index aa18b37c41..b003760606 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs b/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
index e39ca9bf6d..22a3d26aa8 100644
--- a/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs b/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
index 992692b034..7833f691a7 100644
--- a/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/Windows81Profile.cs b/MediaBrowser.Dlna/Profiles/Windows81Profile.cs
index 3f74a0e882..f901e1307d 100644
--- a/MediaBrowser.Dlna/Profiles/Windows81Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/Windows81Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs b/MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs
index 163beb5041..a318b193b6 100644
--- a/MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs
@@ -1,5 +1,6 @@
using System.Xml.Serialization;
using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs b/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs
index 49e6319dc8..b741b4ca0c 100644
--- a/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs b/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
index d3e9921d70..7b04ae6d73 100644
--- a/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs b/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
index d6e1a5f3be..292ee82c6c 100644
--- a/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.MediaInfo/MediaBrowser.MediaInfo.csproj b/MediaBrowser.MediaInfo/MediaBrowser.MediaInfo.csproj
index 52941422de..715f4d311e 100644
--- a/MediaBrowser.MediaInfo/MediaBrowser.MediaInfo.csproj
+++ b/MediaBrowser.MediaInfo/MediaBrowser.MediaInfo.csproj
@@ -49,6 +49,7 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
+ <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index abd2f05bf0..73324c3a32 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -248,6 +248,15 @@
<Compile Include="..\MediaBrowser.Model\Dlna\ProfileConditionValue.cs">
<Link>Dlna\ProfileConditionValue.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\Profiles\AndroidProfile.cs">
+ <Link>Dlna\Profiles\AndroidProfile.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\Profiles\DefaultProfile.cs">
+ <Link>Dlna\Profiles\DefaultProfile.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\ResolutionNormalizer.cs">
+ <Link>Dlna\ResolutionNormalizer.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\ResponseProfile.cs">
<Link>Dlna\ResponseProfile.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index a3d92db4ae..937288567d 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -220,6 +220,15 @@
<Compile Include="..\MediaBrowser.Model\Dlna\ProfileConditionValue.cs">
<Link>Dlna\ProfileConditionValue.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\Profiles\AndroidProfile.cs">
+ <Link>Dlna\Profiles\AndroidProfile.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\Profiles\DefaultProfile.cs">
+ <Link>Dlna\Profiles\DefaultProfile.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\ResolutionNormalizer.cs">
+ <Link>Dlna\ResolutionNormalizer.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\ResponseProfile.cs">
<Link>Dlna\ResponseProfile.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model/ApiClient/ConnectionResult.cs b/MediaBrowser.Model/ApiClient/ConnectionResult.cs
index 12f89d9307..348f059b49 100644
--- a/MediaBrowser.Model/ApiClient/ConnectionResult.cs
+++ b/MediaBrowser.Model/ApiClient/ConnectionResult.cs
@@ -6,6 +6,11 @@ namespace MediaBrowser.Model.ApiClient
public ConnectionState State { get; set; }
public ServerInfo ServerInfo { get; set; }
public IApiClient ApiClient { get; set; }
+
+ public ConnectionResult()
+ {
+ State = ConnectionState.Unavailable;
+ }
}
public enum ConnectionState
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index 9d125779b8..ab5b5bc3be 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -175,7 +175,7 @@ namespace MediaBrowser.Model.Configuration
public PeopleMetadataOptions PeopleMetadataOptions { get; set; }
- public string[] SecureApps2 { get; set; }
+ public string[] InsecureApps { get; set; }
public bool SaveMetadataHidden { get; set; }
@@ -226,15 +226,12 @@ namespace MediaBrowser.Model.Configuration
PeopleMetadataOptions = new PeopleMetadataOptions();
- SecureApps2 = new[]
+ InsecureApps = new[]
{
- "Dashboard",
- "MBKinect",
- "NuVue",
- "Media Browser Theater",
-
- //"Chrome Companion",
- "MB-Classic"
+ "Roku",
+ "Chromecast",
+ "iOS",
+ "Android"
};
MetadataOptions = new[]
diff --git a/MediaBrowser.Model/Dlna/ProfileCondition.cs b/MediaBrowser.Model/Dlna/ProfileCondition.cs
index 24733426c8..9234a27136 100644
--- a/MediaBrowser.Model/Dlna/ProfileCondition.cs
+++ b/MediaBrowser.Model/Dlna/ProfileCondition.cs
@@ -20,5 +20,19 @@ namespace MediaBrowser.Model.Dlna
{
IsRequired = true;
}
+
+ public ProfileCondition(ProfileConditionType condition, ProfileConditionValue property, string value)
+ : this(condition, property, value, false)
+ {
+
+ }
+
+ public ProfileCondition(ProfileConditionType condition, ProfileConditionValue property, string value, bool isRequired)
+ {
+ Condition = condition;
+ Property = property;
+ Value = value;
+ IsRequired = isRequired;
+ }
}
} \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/AndroidProfile.cs b/MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs
index c9dc1aa2c7..09c26cb1f8 100644
--- a/MediaBrowser.Dlna/Profiles/AndroidProfile.cs
+++ b/MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs
@@ -1,7 +1,6 @@
-using MediaBrowser.Model.Dlna;
-using System.Xml.Serialization;
+using System.Xml.Serialization;
-namespace MediaBrowser.Dlna.Profiles
+namespace MediaBrowser.Model.Dlna.Profiles
{
[XmlRoot("Profile")]
public class AndroidProfile : DefaultProfile
@@ -91,33 +90,10 @@ namespace MediaBrowser.Dlna.Profiles
Type = CodecType.Video,
Conditions = new []
{
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.Width,
- Value = "1920"
- },
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.Height,
- Value = "1080"
- },
- new ProfileCondition
- {
- Condition = ProfileConditionType.NotEquals,
- Property = ProfileConditionValue.IsAnamorphic,
- Value = "true",
- IsRequired = false
- },
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.VideoBitDepth,
- Value = "8",
- IsRequired = false
- },
- // TODO: Add HasScalingMatrix != true, IsRequired false
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.Width, "1920"),
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.Height, "1080"),
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.VideoBitDepth, "8"),
+ new ProfileCondition(ProfileConditionType.NotEquals, ProfileConditionValue.IsAnamorphic, "true")
}
},
@@ -127,12 +103,7 @@ namespace MediaBrowser.Dlna.Profiles
Codec = "aac",
Conditions = new []
{
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.AudioChannels,
- Value = "2"
- }
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioChannels, "2")
}
},
@@ -142,12 +113,7 @@ namespace MediaBrowser.Dlna.Profiles
Codec = "aac",
Conditions = new []
{
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.AudioChannels,
- Value = "2"
- }
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioChannels, "2")
}
},
@@ -157,18 +123,8 @@ namespace MediaBrowser.Dlna.Profiles
Codec = "mp3",
Conditions = new []
{
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.AudioChannels,
- Value = "2"
- },
- new ProfileCondition
- {
- Condition = ProfileConditionType.LessThanEqual,
- Property = ProfileConditionValue.AudioBitrate,
- Value = "320000"
- }
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioChannels, "2"),
+ new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioBitrate, "320000")
}
}
};
diff --git a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs b/MediaBrowser.Model/Dlna/Profiles/DefaultProfile.cs
index 3c4506e4b6..d49315ab1e 100644
--- a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs
+++ b/MediaBrowser.Model/Dlna/Profiles/DefaultProfile.cs
@@ -1,7 +1,6 @@
-using MediaBrowser.Model.Dlna;
-using System.Xml.Serialization;
+using System.Xml.Serialization;
-namespace MediaBrowser.Dlna.Profiles
+namespace MediaBrowser.Model.Dlna.Profiles
{
[XmlRoot("Profile")]
public class DefaultProfile : DeviceProfile
diff --git a/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs b/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs
new file mode 100644
index 0000000000..a95de8d39d
--- /dev/null
+++ b/MediaBrowser.Model/Dlna/ResolutionNormalizer.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Model.Dlna
+{
+ public class ResolutionNormalizer
+ {
+ private static readonly List<ResolutionConfiguration> Configurations =
+ new List<ResolutionConfiguration>
+ {
+ new ResolutionConfiguration(426, 320000),
+ new ResolutionConfiguration(640, 400000),
+ new ResolutionConfiguration(720, 950000),
+ new ResolutionConfiguration(1280, 2500000)
+ };
+
+ public static ResolutionOptions Normalize(int maxBitrate,
+ string codec,
+ int? maxWidth,
+ int? maxHeight)
+ {
+ foreach (var config in Configurations)
+ {
+ if (maxBitrate <= config.MaxBitrate)
+ {
+ var originvalValue = maxWidth;
+
+ maxWidth = Math.Min(config.MaxWidth, maxWidth ?? config.MaxWidth);
+ if (!originvalValue.HasValue || originvalValue.Value != maxWidth.Value)
+ {
+ maxHeight = null;
+ }
+
+ break;
+ }
+ }
+
+ return new ResolutionOptions
+ {
+ MaxWidth = maxWidth,
+ MaxHeight = maxHeight
+ };
+ }
+ }
+
+ public class ResolutionConfiguration
+ {
+ public int MaxWidth { get; set; }
+ public int MaxBitrate { get; set; }
+
+ public ResolutionConfiguration(int maxWidth, int maxBitrate)
+ {
+ MaxWidth = maxWidth;
+ MaxBitrate = maxBitrate;
+ }
+ }
+
+ public class ResolutionOptions
+ {
+ public int? MaxWidth { get; set; }
+ public int? MaxHeight { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 484b0969ef..b0cc3986c8 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -86,6 +86,9 @@
<Compile Include="Configuration\XbmcMetadataOptions.cs" />
<Compile Include="Configuration\SubtitlePlaybackMode.cs" />
<Compile Include="Connect\UserLinkType.cs" />
+ <Compile Include="Dlna\Profiles\AndroidProfile.cs" />
+ <Compile Include="Dlna\Profiles\DefaultProfile.cs" />
+ <Compile Include="Dlna\ResolutionNormalizer.cs" />
<Compile Include="Drawing\ImageOrientation.cs" />
<Compile Include="Dto\StreamOptions.cs" />
<Compile Include="Entities\ExtraType.cs" />
diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
index 266202b969..bca0c2746c 100644
--- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
+++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
@@ -162,26 +162,14 @@ namespace MediaBrowser.Providers.BoxSets
{
var url = string.Format(GetCollectionInfo3, id, MovieDbProvider.ApiKey);
- var imageLanguages = _localization.GetCultures()
- .Select(i => i.TwoLetterISOLanguageName)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- imageLanguages.Add("null");
-
if (!string.IsNullOrEmpty(language))
{
- // If preferred language isn't english, get those images too
- if (!imageLanguages.Contains(language, StringComparer.OrdinalIgnoreCase))
- {
- imageLanguages.Add(language);
- }
-
url += string.Format("&language={0}", language);
}
+ var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language);
// Get images in english and with no language
- url += "&include_image_language=" + string.Join(",", imageLanguages.ToArray());
+ url += "&include_image_language=" + includeImageLanguageParam;
cancellationToken.ThrowIfCancellationRequested();
@@ -231,7 +219,7 @@ namespace MediaBrowser.Providers.BoxSets
if (fileInfo.Exists)
{
// If it's recent or automatic updates are enabled, don't re-download
- if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 7)
+ if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 3)
{
return _cachedTask;
}
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index cc51305463..e40533448e 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -136,6 +136,7 @@
<Compile Include="Music\MusicBrainzArtistProvider.cs" />
<Compile Include="Music\MusicExternalIds.cs" />
<Compile Include="Music\MusicVideoMetadataService.cs" />
+ <Compile Include="Omdb\OmdbImageProvider.cs" />
<Compile Include="Omdb\OmdbProvider.cs" />
<Compile Include="Omdb\OmdbItemProvider.cs" />
<Compile Include="People\MovieDbPersonImageProvider.cs" />
diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
index 3f81ae6cdd..9af0b17b78 100644
--- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
+++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
@@ -432,7 +432,7 @@ namespace MediaBrowser.Providers.Movies
if (fileInfo.Exists)
{
- if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 7)
+ if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 3)
{
return _cachedTask;
}
diff --git a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
new file mode 100644
index 0000000000..887240ed4d
--- /dev/null
+++ b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
@@ -0,0 +1,124 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Channels;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Net;
+using MediaBrowser.Model.Providers;
+using System.Collections.Generic;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Providers.Omdb
+{
+ public class OmdbImageProvider : IRemoteImageProvider, IHasOrder
+ {
+ private readonly IHttpClient _httpClient;
+
+ public OmdbImageProvider(IHttpClient httpClient)
+ {
+ _httpClient = httpClient;
+ }
+
+ public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
+ {
+ return new List<ImageType>
+ {
+ ImageType.Primary
+ };
+ }
+
+ public Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, CancellationToken cancellationToken)
+ {
+ var imdbId = item.GetProviderId(MetadataProviders.Imdb);
+
+ var list = new List<RemoteImageInfo>();
+
+ if (!string.IsNullOrWhiteSpace(imdbId))
+ {
+ list.Add(new RemoteImageInfo
+ {
+ ProviderName = Name,
+ Url = string.Format("http://img.omdbapi.com/?i={0}&apikey=82e83907", imdbId)
+ });
+ }
+
+ return Task.FromResult<IEnumerable<RemoteImageInfo>>(list);
+ }
+
+ public async Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
+ {
+ var response = await _httpClient.GetResponse(new HttpRequestOptions
+ {
+ CancellationToken = cancellationToken,
+ Url = url,
+ ResourcePool = OmdbProvider.ResourcePool
+
+ }).ConfigureAwait(false);
+
+ if (response.ContentLength == 11059)
+ {
+ throw new HttpException("File not found")
+ {
+ StatusCode = HttpStatusCode.NotFound
+ };
+ }
+
+ return response;
+ }
+
+ public string Name
+ {
+ get { return "The Open Movie Database"; }
+ }
+
+ public bool Supports(IHasImages item)
+ {
+ // Save the http requests since we know it's not currently supported
+ // TODO: Check again periodically
+ if (item is Person)
+ {
+ return false;
+ }
+
+ // Save the http requests since we know it's not currently supported
+ if (item is Series || item is Season || item is Episode)
+ {
+ return false;
+ }
+
+ var channelItem = item as IChannelMediaItem;
+
+ if (channelItem != null)
+ {
+ if (channelItem.ContentType == ChannelMediaContentType.Movie)
+ {
+ return true;
+ }
+ if (channelItem.ContentType == ChannelMediaContentType.MovieExtra)
+ {
+ if (channelItem.ExtraType == ExtraType.Trailer)
+ {
+ return true;
+ }
+ }
+ }
+
+ return item is Movie || item is Trailer;
+ }
+
+ public int Order
+ {
+ get
+ {
+ // After other internet providers, because they're better
+ // But before fallback providers like screengrab
+ return 90;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
index a92e60ee37..2d6c0e3d72 100644
--- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
@@ -12,7 +12,7 @@ namespace MediaBrowser.Providers.Omdb
{
public class OmdbProvider
{
- private static readonly SemaphoreSlim ResourcePool = new SemaphoreSlim(1, 1);
+ internal static readonly SemaphoreSlim ResourcePool = new SemaphoreSlim(1, 1);
private readonly IJsonSerializer _jsonSerializer;
private readonly IHttpClient _httpClient;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
diff --git a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs
index b5bf445bf8..dd4231f3f6 100644
--- a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs
+++ b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs
@@ -185,7 +185,7 @@ namespace MediaBrowser.Providers.People
var fileInfo = _fileSystem.GetFileSystemInfo(dataFilePath);
- if (fileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 7)
+ if (fileInfo.Exists && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 3)
{
return;
}
diff --git a/MediaBrowser.Providers/TV/FanartSeriesProvider.cs b/MediaBrowser.Providers/TV/FanartSeriesProvider.cs
index a9554d3964..57427ece7c 100644
--- a/MediaBrowser.Providers/TV/FanartSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/FanartSeriesProvider.cs
@@ -381,7 +381,7 @@ namespace MediaBrowser.Providers.TV
if (fileInfo.Exists)
{
- if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 7)
+ if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 3)
{
return;
}
diff --git a/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs
index 7979711ec0..6aa27f4968 100644
--- a/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs
+++ b/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs
@@ -214,26 +214,14 @@ namespace MediaBrowser.Providers.TV
{
var url = string.Format(GetTvInfo3, id, seasonNumber.ToString(CultureInfo.InvariantCulture), episodeNumber, MovieDbProvider.ApiKey);
- var imageLanguages = _localization.GetCultures()
- .Select(i => i.TwoLetterISOLanguageName)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- imageLanguages.Add("null");
-
if (!string.IsNullOrEmpty(language))
{
- // If preferred language isn't english, get those images too
- if (imageLanguages.Contains(language, StringComparer.OrdinalIgnoreCase))
- {
- imageLanguages.Add(language);
- }
-
url += string.Format("&language={0}", language);
}
+ var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language);
// Get images in english and with no language
- url += "&include_image_language=" + string.Join(",", imageLanguages.ToArray());
+ url += "&include_image_language=" + includeImageLanguageParam;
cancellationToken.ThrowIfCancellationRequested();
diff --git a/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs
index 49b0d67f9f..26b2711dec 100644
--- a/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs
@@ -198,26 +198,14 @@ namespace MediaBrowser.Providers.TV
{
var url = string.Format(GetTvInfo3, id, seasonNumber.ToString(CultureInfo.InvariantCulture), MovieDbProvider.ApiKey);
- var imageLanguages = _localization.GetCultures()
- .Select(i => i.TwoLetterISOLanguageName)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- imageLanguages.Add("null");
-
if (!string.IsNullOrEmpty(language))
{
- // If preferred language isn't english, get those images too
- if (imageLanguages.Contains(language, StringComparer.OrdinalIgnoreCase))
- {
- imageLanguages.Add(language);
- }
-
url += string.Format("&language={0}", language);
}
+ var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language);
// Get images in english and with no language
- url += "&include_image_language=" + string.Join(",", imageLanguages.ToArray());
+ url += "&include_image_language=" + includeImageLanguageParam;
cancellationToken.ThrowIfCancellationRequested();
diff --git a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs
index 0546701f39..d435a6ba72 100644
--- a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs
@@ -295,26 +295,14 @@ namespace MediaBrowser.Providers.TV
{
var url = string.Format(GetTvInfo3, id, MovieDbProvider.ApiKey);
- var imageLanguages = _localization.GetCultures()
- .Select(i => i.TwoLetterISOLanguageName)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- imageLanguages.Add("null");
-
if (!string.IsNullOrEmpty(language))
{
- // If preferred language isn't english, get those images too
- if (imageLanguages.Contains(language, StringComparer.OrdinalIgnoreCase))
- {
- imageLanguages.Add(language);
- }
-
url += string.Format("&language={0}", language);
}
+ var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language);
// Get images in english and with no language
- url += "&include_image_language=" + string.Join(",", imageLanguages.ToArray());
+ url += "&include_image_language=" + includeImageLanguageParam;
cancellationToken.ThrowIfCancellationRequested();
diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
index ce97b89076..206ba59224 100644
--- a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
+++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
@@ -214,13 +214,9 @@ namespace MediaBrowser.Server.Implementations.Configuration
public void DisableMetadataService(string service)
{
DisableMetadataService(typeof(Movie), Configuration, service);
- DisableMetadataService(typeof(MusicAlbum), Configuration, service);
- DisableMetadataService(typeof(MusicArtist), Configuration, service);
DisableMetadataService(typeof(Episode), Configuration, service);
DisableMetadataService(typeof(Season), Configuration, service);
DisableMetadataService(typeof(Series), Configuration, service);
- DisableMetadataService(typeof(MusicVideo), Configuration, service);
- DisableMetadataService(typeof(Trailer), Configuration, service);
DisableMetadataService(typeof(Video), Configuration, service);
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
index 95877ec0cb..98f895616b 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -43,6 +43,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
private readonly ReaderWriterLockSlim _localEndpointLock = new ReaderWriterLockSlim();
+ private readonly bool _supportsNativeWebSocket;
+
/// <summary>
/// Gets the local end points.
/// </summary>
@@ -61,10 +63,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
}
- public HttpListenerHost(IApplicationHost applicationHost, ILogManager logManager, string serviceName, string handlerPath, string defaultRedirectPath, params Assembly[] assembliesWithServices)
+ public HttpListenerHost(IApplicationHost applicationHost,
+ ILogManager logManager,
+ string serviceName,
+ string handlerPath,
+ string defaultRedirectPath,
+ bool supportsNativeWebSocket,
+ params Assembly[] assembliesWithServices)
: base(serviceName, assembliesWithServices)
{
DefaultRedirectPath = defaultRedirectPath;
+ _supportsNativeWebSocket = supportsNativeWebSocket;
HandlerPath = handlerPath;
_logger = logManager.GetLogger("HttpServer");
@@ -195,7 +204,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
{
HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First());
- _listener = NativeWebSocket.IsSupported
+ _listener = _supportsNativeWebSocket && NativeWebSocket.IsSupported
? _listener = new HttpListenerServer(_logger, OnRequestReceived)
//? _listener = new WebSocketSharpListener(_logger, OnRequestReceived)
: _listener = new WebSocketSharpListener(_logger, OnRequestReceived);
diff --git a/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs
index c7669fecb5..8cc614fe5d 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/NativeWebSocket.cs
@@ -219,11 +219,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
{
get
{
-#if __MonoCS__
- return false;
-#else
-#endif
-
if (!_supportsNativeWebSocket.HasValue)
{
try
diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
index 4b699c0184..4d2ee3f39b 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Configuration;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Session;
@@ -57,15 +58,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
}
private void ValidateUser(IRequest req, bool allowLocal,
- string[] roles)
+ IEnumerable<string> roles)
{
- //This code is executed before the service
+ // This code is executed before the service
var auth = AuthorizationContext.GetAuthorizationInfo(req);
- if (!string.IsNullOrWhiteSpace(auth.Token)
- || _config.Configuration.SecureApps2.Contains(auth.Client ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ if (!allowLocal || !req.IsLocal)
{
- if (!allowLocal || !req.IsLocal)
+ if (!_config.Configuration.InsecureApps.Contains(auth.Client ?? string.Empty, StringComparer.OrdinalIgnoreCase))
{
SessionManager.ValidateSecurityToken(auth.Token);
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
index c403c09b44..b48703a15f 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs
@@ -18,12 +18,18 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <param name="serverName">Name of the server.</param>
/// <param name="handlerPath">The handler path.</param>
/// <param name="defaultRedirectpath">The default redirectpath.</param>
+ /// <param name="supportsNativeWebSocket">if set to <c>true</c> [supports native web socket].</param>
/// <returns>IHttpServer.</returns>
- public static IHttpServer CreateServer(IApplicationHost applicationHost, ILogManager logManager, string serverName, string handlerPath, string defaultRedirectpath)
+ public static IHttpServer CreateServer(IApplicationHost applicationHost,
+ ILogManager logManager,
+ string serverName,
+ string handlerPath,
+ string defaultRedirectpath,
+ bool supportsNativeWebSocket)
{
LogManager.LogFactory = new ServerLogFactory(logManager);
-
- return new HttpListenerHost(applicationHost, logManager, serverName, handlerPath, defaultRedirectpath);
+
+ return new HttpListenerHost(applicationHost, logManager, serverName, handlerPath, defaultRedirectpath, supportsNativeWebSocket);
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index a44b57fb14..839fb3d575 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -489,9 +489,11 @@ namespace MediaBrowser.Server.Implementations.Library
public IEnumerable<BaseItem> ReplaceVideosWithPrimaryVersions(IEnumerable<BaseItem> items)
{
- return items.Select(i =>
+ var dict = new Dictionary<Guid, BaseItem>();
+
+ foreach (var item in items)
{
- var video = i as Video;
+ var video = item as Video;
if (video != null)
{
@@ -501,14 +503,15 @@ namespace MediaBrowser.Server.Implementations.Library
if (primary != null)
{
- return primary;
+ dict[primary.Id] = primary;
+ continue;
}
}
}
+ dict[item.Id] = item;
+ }
- return i;
-
- }).DistinctBy(i => i.Id);
+ return dict.Values;
}
/// <summary>
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
index f6f6c269eb..4cf8a2f220 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
@@ -593,5 +593,5 @@
"DashboardTourPlugins": "Installiere Plugins wie Internet Videoportale, Live-TV, Metadatenscanner und mehr.",
"DashboardTourNotifications": "Sende automatisch Benachrichtigungen von Serverereignissen auf dein mobiles Endger\u00e4t, per E-Mail und mehr.",
"DashboardTourScheduledTasks": "Verwalte einfach lang dauernde Aufgaben mit Hilfe von geplanten Aufgaben. Entscheide wann diese ausgef\u00fchrt werden und wie oft.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourMobile": "Die Media Browser \u00dcbersicht funktioniert auch hervorragend auf Smartphones und Tablets. Verwalte deinen Server jederzeit und \u00fcberall direkt von deiner Handfl\u00e4che aus."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
index 384558d46d..80aff6111e 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
@@ -67,7 +67,7 @@
"ButtonPlaylist": "Lista de Reprod.",
"ButtonPreviousTrack": "Pista Anterior",
"LabelEnabled": "Habilitado",
- "LabelDisabled": "Deshabilitado",
+ "LabelDisabled": "Desactivado",
"ButtonMoreInformation": "Mas Informaci\u00f3n",
"LabelNoUnreadNotifications": "No hay notificaciones sin leer.",
"ButtonViewNotifications": "Ver notificaciones",
@@ -585,13 +585,13 @@
"WebClientTourMobile1": "El cliente web funciona de maravilla en tel\u00e9fonos inteligentes y tabletas...",
"WebClientTourMobile2": "y controla f\u00e1cilmente otros dispositivos y apps de Media Browser",
"MessageEnjoyYourStay": "Disfrute su visita",
- "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.",
- "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
- "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
- "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
- "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
- "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
- "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
- "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourDashboard": "El panel de control del servidor le permite monitorear su servidor y sus usuarios. Siempre sabr\u00e1 quien est\u00e1 haciendo qu\u00e9 y donde se encuentran.",
+ "DashboardTourUsers": "Cree cuentas f\u00e1cilmente para sus amigos y familia, cada una con sus propios permisos, accesos a la biblioteca, controles parentales y m\u00e1s.",
+ "DashboardTourCinemaMode": "El modo cine trae la experiencia del cine directo a su sala de TV con la capacidad de reproducir avances e intros personalizados antes de la presentaci\u00f3n estelar.",
+ "DashboardTourChapters": "Active la generaci\u00f3n de im\u00e1genes de cap\u00edtulos de sus videos para una presentaci\u00f3n m\u00e1s agradable al desplegar.",
+ "DashboardTourSubtitles": "Descargue autom\u00e1ticamente subt\u00edtulos para sus videos en cualquier lenguaje.",
+ "DashboardTourPlugins": "Instale complementos como canales de video de Internet, TV en vivo, buscadores de metadatos y m\u00e1s.",
+ "DashboardTourNotifications": "Env\u00ede notificaciones automatizadas de eventos del servidor a sus dispositivos m\u00f3viles, correo electr\u00f3nico y m\u00e1s.",
+ "DashboardTourScheduledTasks": "Administre f\u00e1cilmente operaciones de larga duraci\u00f3n con tareas programadas. Decida cuando se ejecutar\u00e1n y con que periodicidad.",
+ "DashboardTourMobile": "El Panel de Control de Media Browser funciona excelentemente en tel\u00e9fonos inteligentes y tabletas. Administre su servidor desde la palma de su mano en todo momento y lugar."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
index 5219264bce..2bbd7ffeab 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
@@ -589,7 +589,7 @@
"DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
"DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
"DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
- "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
+ "DashboardTourSubtitles": "T\u00e9l\u00e9charger automatiquement les sous-titres pour vos vid\u00e9os dans n'importe quelle langue.",
"DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
"DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
"DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
index 4a58f31698..9c49d22d71 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -601,5 +601,6 @@
"DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
"DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
"DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere.",
+ "MessageRefreshQueued": "Refresh queued"
}
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
index a690ca01f4..46d015b446 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
@@ -585,13 +585,13 @@
"WebClientTourMobile1": "\u0492\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0456 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0434\u0430\u0440\u0434\u0430 \u0436\u04d9\u043d\u0435 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0442\u0435\u0440\u0434\u0435 \u0442\u0430\u043c\u0430\u0448\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456",
"WebClientTourMobile2": "\u0441\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0431\u0430\u0441\u049b\u0430 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b",
"MessageEnjoyYourStay": "\u0416\u0430\u0493\u044b\u043c\u0434\u044b \u0435\u0440\u043c\u0435\u043a \u0435\u0442\u0456\u04a3\u0456\u0437",
- "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.",
- "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
- "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
- "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
- "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
- "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
- "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
- "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourDashboard": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u0431\u0430\u049b\u044b\u043b\u0430\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d\u0435 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u041a\u0456\u043c \u043d\u0435 \u0456\u0441\u0442\u0435\u0433\u0435\u043d\u0456\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u0439\u0434\u0430 \u0442\u04b1\u0440\u0493\u0430\u043d\u044b\u043d \u0431\u0456\u043b\u0456\u043f \u0436\u0430\u0442\u0430\u0441\u044b\u0437.",
+ "DashboardTourUsers": "\u0414\u043e\u0441\u0442\u0430\u0440\u044b\u04a3\u044b\u0437 \u0431\u0435\u043d \u043e\u0442\u0431\u0430\u0441\u044b\u04a3\u044b\u0437 \u04d9\u0440\u049b\u0430\u0439\u0441\u044b\u043d\u0430 \u04e9\u0437\u0456\u043d\u0456\u04a3 \u049b\u04b1\u049b\u044b\u049b\u0442\u0430\u0440\u044b, \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443\u044b, \u043c\u0430\u0437\u043c\u04b1\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b \u0436\u04d9\u043d\u0435 \u0442.\u0431. \u0431\u0430\u0440 \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u043b\u0435\u0440\u0456\u043d \u0436\u0435\u04a3\u0456\u043b \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.",
+ "DashboardTourCinemaMode": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u043a\u04e9\u0440\u043d\u0435\u0443\u0434\u0456 \u0431\u0430\u0441\u0442\u044b \u049b\u0430\u0441\u0438\u0435\u0442\u0442\u0456\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u0443 \u049b\u0430\u0431\u0456\u043b\u0435\u0442\u0456\u043c\u0435\u043d \u043a\u0438\u043d\u043e \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d \u0437\u0430\u043b \u04d9\u0441\u0435\u0440\u0456\u043d \u049b\u043e\u043d\u0430\u049b\u0436\u0430\u0439\u044b\u04a3\u044b\u0437\u0493\u0430 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u0436\u0435\u0442\u043a\u0456\u0437\u0435\u0434\u0456.",
+ "DashboardTourChapters": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0434\u0456 \u049b\u0430\u0440\u0430\u0493\u0430\u043d \u043a\u0435\u0437\u0434\u0435 \u04b1\u043d\u0430\u043c\u0434\u044b\u043b\u0430\u0443 \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c \u04af\u0448\u0456\u043d \u0441\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0442\u0443\u0434\u044b\u0440\u0443\u044b\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.",
+ "DashboardTourSubtitles": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0433\u0435 \u049b\u0430\u0439 \u0442\u0456\u043b\u0434\u0435 \u0431\u043e\u043b\u0441\u044b\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u04a3\u0456\u0437.",
+ "DashboardTourPlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u0434\u0456, \u043c\u044b\u0441\u0430\u043b\u044b, \u0431\u0435\u0439\u043d\u0435\u043b\u0456\u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0430\u0440\u043d\u0430\u043b\u0430\u0440\u044b\u043d, \u044d\u0444\u0438\u0440\u043b\u0456\u043a \u0442\u0434, \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0440\u0456\u043d \u0436\u0456\u043d\u0435 \u0442.\u0431., \u043e\u0440\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.",
+ "DashboardTourNotifications": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043e\u049b\u0438\u0493\u0430\u043b\u0430\u0440\u044b \u0442\u0443\u0440\u0430\u043b\u044b \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440\u0434\u044b \u04b1\u0442\u049b\u044b\u0440 \u0436\u0430\u0431\u0434\u044b\u0493\u044b\u04a3\u044b\u0437\u0493\u0430, \u044d-\u043f\u043e\u0448\u0442\u0430\u04a3\u044b\u0437\u0493\u0430 \u0436\u04d9\u043d\u0435 \u0442.\u0431.\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
+ "DashboardTourScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u04b1\u0437\u0430\u049b \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u0435\u04a3\u0456\u043b \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u04a3\u044b\u0437. \u0411\u04b1\u043b\u0430\u0440 \u049b\u0430\u0448\u0430\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u043d\u0434\u0430\u0439 \u0436\u0438\u0456\u043b\u0456\u043a\u043f\u0435\u043d \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d\u044b\u043d \u0448\u0435\u0448\u0456\u04a3\u0456\u0437.",
+ "DashboardTourMobile": "Media Browser \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0434\u0430\u0440\u0434\u0430 \u0436\u04d9\u043d\u0435 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0442\u0435\u0440\u0434\u0435 \u0442\u0430\u043c\u0430\u0448\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456. \u0421\u0435\u0440\u0432\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430, \u04d9\u0440 \u0436\u0435\u0440\u0434\u0435 \u049b\u043e\u043b\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u0430\u043b\u0430\u049b\u0430\u043d\u044b\u043d\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u04a3\u044b\u0437."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
index f67d22e272..0bb233eb6a 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
@@ -542,7 +542,7 @@
"MediaInfoExternal": "Extern",
"MediaInfoTimestamp": "Tijdstempel",
"MediaInfoPixelFormat": "Pixel formaat",
- "MediaInfoBitDepth": "Bit depth",
+ "MediaInfoBitDepth": "Bitdiepte",
"MediaInfoSampleRate": "Samplesnelheid",
"MediaInfoBitrate": "Bitrate",
"MediaInfoChannels": "Kanalen",
@@ -585,13 +585,13 @@
"WebClientTourMobile1": "De web client werk perfect op smartphones en tablets...",
"WebClientTourMobile2": "en kan elke andere Media Browser app bedienen",
"MessageEnjoyYourStay": "Geniet van uw verblijf",
- "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.",
- "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
- "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
- "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
- "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
- "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
- "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
- "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourDashboard": "Het server-dashboard steld u in staat uw server en uw gebruikers te monitoren . U zult altijd weten wie wat doet en waar ze zijn.",
+ "DashboardTourUsers": "Maak gemakkelijk gebruikersaccounts voor uw vrienden en familie, elk met hun eigen machtigingen, bibliotheek toegang, ouderlijk toezicht en meer.",
+ "DashboardTourCinemaMode": "Cinema mode brengt de theater ervaring naar je woonkamer met de mogelijkheid om trailers en eigen intro's voor de film af te spelen",
+ "DashboardTourChapters": "Schakel hoofdstuk afbeeldingen genereren in voor uw video's voor een aantrekkelijker presentatie tijdens het kijken.",
+ "DashboardTourSubtitles": "Download automatisch ondertitels voor uw video's in een andere talen.",
+ "DashboardTourPlugins": "Installeer plugins zoals Internet videokanalen, live tv, metadata, scanners en meer.",
+ "DashboardTourNotifications": "Meldingen van de server gebeurtenissen automatisch verzenden naar uw mobiele apparaat, e-mail en meer.",
+ "DashboardTourScheduledTasks": "Beheer eenvoudig langlopende transacties met geplande taken. Beslis zelf wanneer ze worden uitgevoerd en hoe vaak.",
+ "DashboardTourMobile": "Het dashboard van Media Browser werkt geweldig op smartphones en tablets. Uw server beheren vanuit de palm van uw hand, overal en altijd."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
index 202620e14d..03910b3f1d 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
@@ -585,13 +585,13 @@
"WebClientTourMobile1": "\u0412\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u0438 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430\u0445...",
"WebClientTourMobile2": "\u0438 \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 Media Browser",
"MessageEnjoyYourStay": "\u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u044f\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f",
- "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.",
- "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
- "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
- "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
- "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
- "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
- "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
- "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourDashboard": "\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0412\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u043d\u0430\u0442\u044c, \u043a\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u043c \u0438 \u0433\u0434\u0435 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f.",
+ "DashboardTourUsers": "\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0434\u0440\u0443\u0437\u0435\u0439 \u0438 \u0447\u043b\u0435\u043d\u043e\u0432 \u0441\u0435\u043c\u044c\u0438, \u043a\u0430\u0436\u0434\u0443\u044e \u0441 \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0438 \u0442.\u0434.",
+ "DashboardTourCinemaMode": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0432 \u0432\u0430\u0448\u0443 \u0433\u043e\u0441\u0442\u0438\u043d\u0443\u044e, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c.",
+ "DashboardTourChapters": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043a \u0432\u0438\u0434\u0435\u043e, \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.",
+ "DashboardTourSubtitles": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0439\u0442\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0434\u043b\u044f \u0432\u0438\u0434\u0435\u043e \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435.",
+ "DashboardTourPlugins": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432\u0438\u0434\u0435\u043e, \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0432, \u0441\u043a\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442.\u043f.",
+ "DashboardTourNotifications": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u043d\u0430 \u0432\u0430\u0448\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u044d-\u043f\u043e\u0447\u0442\u0443 \u0438 \u0442.\u043f.",
+ "DashboardTourScheduledTasks": "\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0439\u0442\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f, \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u043e.",
+ "DashboardTourMobile": "\u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c Media Browser \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u0438 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430\u0445. \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441 \u0432\u0430\u0448\u0435\u0439 \u043b\u0430\u0434\u043e\u043d\u0438 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
index c539892ee0..f24a1161d8 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
@@ -11,7 +11,7 @@
"FileNotFound": "Kan inte hitta filen.",
"FileReadError": "Ett fel intr\u00e4ffade vid inl\u00e4sningen av filen.",
"DeleteUser": "Ta bort anv\u00e4ndare",
- "DeleteUserConfirmation": "Are you sure you wish to delete this user?",
+ "DeleteUserConfirmation": "\u00c4r du s\u00e4ker p\u00e5 att du vill radera denna anv\u00e4ndare?",
"PasswordResetHeader": "\u00c5terst\u00e4ll l\u00f6senordet",
"PasswordResetComplete": "L\u00f6senordet har \u00e5terst\u00e4llts.",
"PasswordResetConfirmation": "\u00c4r du s\u00e4ker p\u00e5 att du vill \u00e5terst\u00e4lla l\u00f6senordet?",
@@ -58,14 +58,14 @@
"ButtonMute": "Tyst",
"ButtonUnmute": "Muting av",
"ButtonStop": "Stopp",
- "ButtonNextTrack": "Next Track",
+ "ButtonNextTrack": "N\u00e4sta sp\u00e5r",
"ButtonPause": "Paus",
"ButtonPlay": "Spela upp",
"ButtonEdit": "\u00c4ndra",
"ButtonQueue": "K\u00f6",
- "ButtonPlayTrailer": "Play trailer",
+ "ButtonPlayTrailer": "Visa trailer",
"ButtonPlaylist": "Spellista",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "F\u00f6reg\u00e5ende sp\u00e5r",
"LabelEnabled": "Aktiverad",
"LabelDisabled": "Avaktiverad",
"ButtonMoreInformation": "Mer information",
@@ -121,10 +121,10 @@
"MessageConfirmItemGrouping": "Media Browser-klienter kommer automatiskt att v\u00e4lja den b\u00e4sta versionen f\u00f6r uppspelning baserat p\u00e5 enhets- och n\u00e4tverksprestanda.Vill du forts\u00e4tta?",
"HeaderResume": "\u00c5teruppta",
"HeaderMyViews": "Mina vyer",
- "HeaderLibraryFolders": "Media Folders",
+ "HeaderLibraryFolders": "Mediamappar",
"HeaderLatestMedia": "Nytillkommet",
"ButtonMoreItems": "Mer...",
- "ButtonMore": "More",
+ "ButtonMore": "Mer",
"HeaderFavoriteMovies": "Favoritfilmer",
"HeaderFavoriteShows": "Favoritserier",
"HeaderFavoriteEpisodes": "Favoritavsnitt",
@@ -136,7 +136,7 @@
"HeaderSelectTranscodingPath": "V\u00e4lj plats f\u00f6r mellanlagring vid omkodning",
"HeaderSelectImagesByNamePath": "V\u00e4lj plats f\u00f6r ImagesByName",
"HeaderSelectMetadataPath": "V\u00e4lj plats f\u00f6r metadatalagring",
- "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.",
+ "HeaderSelectServerCachePathHelp": "Bl\u00e4ddra fram till eller ange plats f\u00f6r serverns cache. Katalogen m\u00e5ste vara tillg\u00e4nglig f\u00f6r skrivning.",
"HeaderSelectTranscodingPathHelp": "Bl\u00e4ddra fram till eller ange plats f\u00f6r omkodarens mellanlagring. Katalogen m\u00e5ste vara tillg\u00e4nglig f\u00f6r skrivning.",
"HeaderSelectImagesByNamePathHelp": "Bl\u00e4ddra fram till eller ange plats f\u00f6r ImagesByName-mappen. Katalogen m\u00e5ste vara tillg\u00e4nglig f\u00f6r skrivning.",
"HeaderSelectMetadataPathHelp": "Bl\u00e4ddra fram till eller ange plats f\u00f6r lagring av metadata. Katalogen m\u00e5ste vara tillg\u00e4nglig f\u00f6r skrivning.",
@@ -319,7 +319,7 @@
"HeaderSelectPlayer": "V\u00e4lj uppspelare:",
"ButtonSelect": "V\u00e4lj",
"ButtonNew": "Nytillkommet",
- "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM playback plugin.",
+ "MessageInternetExplorerWebm": "F\u00f6r b\u00e4sta resultat med Internet Explorer, installera uppspelningstill\u00e4gget WebM.",
"HeaderVideoError": "Videofel",
"ButtonAddToPlaylist": "L\u00e4gg till i spellista",
"HeaderAddToPlaylist": "L\u00e4gg till i Spellista",
@@ -585,13 +585,13 @@
"WebClientTourMobile1": "Webbklienten fungerar perfekt p\u00e5 smarta telefoner och surfplattor...",
"WebClientTourMobile2": "och kan enkelt fj\u00e4rrstyra andra enheter och Media Browser-appar",
"MessageEnjoyYourStay": "Ha ett trevligt bes\u00f6k",
- "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.",
- "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.",
- "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
- "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.",
- "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.",
- "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.",
- "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.",
- "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.",
- "DashboardTourMobile": "The Media Browser dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere."
+ "DashboardTourDashboard": "Via serverns kontrollpanel kan du \u00f6vervaka din server och alla anv\u00e4ndare. Du kommer alltid att kunna veta vem som g\u00f6r vad och var de \u00e4r.",
+ "DashboardTourUsers": "Skapa enkelt anv\u00e4ndarkonton f\u00f6r dina v\u00e4nner och familj, alla med sina egna beh\u00f6righeter, biblioteks \u00e5tkomst, f\u00f6r\u00e4ldrakontroll och mycket mer.",
+ "DashboardTourCinemaMode": "Biol\u00e4get g\u00f6r ditt vardagsrum till en biograf genom m\u00f6jligheten att visa trailers och egna vinjetter innan filmen b\u00f6rjar.",
+ "DashboardTourChapters": "Ta fram kapitelbildrutor fr\u00e5n videofiler f\u00f6r att f\u00e5 en snyggare presentation.",
+ "DashboardTourSubtitles": "H\u00e4mta automatiskt undertexter f\u00f6r dina videor p\u00e5 alla spr\u00e5k.",
+ "DashboardTourPlugins": "Installera till\u00e4gg s\u00e5som Internetvideokanaler, live-TV, metadatah\u00e4mtare och mycket mer.",
+ "DashboardTourNotifications": "Skicka automatiskt meddelanden om serverh\u00e4ndelser till din mobiltelefon, e-post och mycket mer.",
+ "DashboardTourScheduledTasks": "Hantera enkelt tidskr\u00e4vande uppgifter med hj\u00e4lp av schemalagda aktiviteter. Best\u00e4m n\u00e4r de skall k\u00f6ras, och hur ofta.",
+ "DashboardTourMobile": "Media Browsers kontrollpanel fungerar utm\u00e4rkt p\u00e5 smarta telefoner och surfplattor. Administrera din server n\u00e4r som helst, varifr\u00e5n som helst."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/de.json b/MediaBrowser.Server.Implementations/Localization/Server/de.json
index 45ada6214c..e742cea8cc 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/de.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json
@@ -384,7 +384,7 @@
"TabAdvanced": "Erweitert",
"HeaderCinemaMode": "Kino-Modus",
"HeaderStatus": "Status",
- "HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
+ "HeaderWelcomeToMediaBrowserServerDashboard": "Willkommen zur Media Browser \u00dcbersicht",
"OptionContinuing": "Fortdauernd",
"OptionEnded": "Beendent",
"HeaderAirDays": "Ausstrahlungstage",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
index ea0e209bce..d089edd085 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
@@ -39,7 +39,7 @@
"UserCreatedWithName": "Se ha creado el usuario {0}",
"LabelYourFirstName": "Su nombre:",
"UserPasswordChangedWithName": "Se ha cambiado la contrase\u00f1a para el usuario {0}",
- "MoreUsersCanBeAddedLater": "Se pueden agregar m\u00e1s usuarios posteriormente en el panel de control.",
+ "MoreUsersCanBeAddedLater": "Se pueden agregar m\u00e1s usuarios posteriormente en el Panel de Control.",
"UserDeletedWithName": "Se ha eliminado al usuario {0}",
"UserProfilesIntro": "Media Browser incluye soporte integrado para perfiles de usuario, permiti\u00e9ndo a cada usuario tener su propia configuraci\u00f3n de pantalla, estado de reproducci\u00f3n y controles parentales.",
"MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor",
@@ -51,7 +51,7 @@
"AuthenticationSucceededWithUserName": "{0} autenticado con \u00e9xito",
"WindowsServiceIntro2": "Si utiliza el servicio de Windows, tenga en cuenta que no se puede ejecutar simult\u00e1neamiente con el icono en el \u00e1rea de notificaci\u00f3n, por lo que tendr\u00e1 que finalizar desde el icono para poder ejecutar el servicio. Adicionalmente, el servicio deber\u00e1 ser configurado con privilegios administrativos a trav\u00e9s del panel de control del servicio. Tenga en cuenta que en este momento el servicio no es capaz de actualizarse a s\u00ed mismo, por lo que las nuevas versiones requerir\u00e1n de interacci\u00f3n manual.",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesi\u00f3n de {0}",
- "WizardCompleted": "Eso es todo lo que necesitamos por ahora. Media Browser ha comenzado a recolectar informaci\u00f3n sobre su biblioteca de medios. Eche un vistazo a algunas de nuestras aplicaciones, y luego haga clic en <b>Finalizar<\/b> para ver el <b>Panel de Control<\/b>.",
+ "WizardCompleted": "\u00baEso es todo lo que necesitamos por ahora. Media Browser ha comenzado a recolectar informaci\u00f3n sobre su biblioteca de medios. Eche un vistazo a algunas de nuestras aplicaciones, y luego haga clic en <b>Finalizar<\/b> para ver el <b>Panel de Control<\/b>.",
"UserStartedPlayingItemWithValues": "{0} ha iniciado la reproducci\u00f3n de {1}",
"LabelConfigureSettings": "Configuraci\u00f3n de opciones",
"UserStoppedPlayingItemWithValues": "{0} ha detenido la reproducci\u00f3n de {1}",
@@ -294,7 +294,7 @@
"OptionBackdrop": "Imagen de Fondo",
"LabelExtractChaptersDuringLibraryScan": "Extraer im\u00e1genes de cap\u00edtulos durante el escaneo de la biblioteca",
"OptionTimeline": "L\u00ednea de Tiempo",
- "LabelExtractChaptersDuringLibraryScanHelp": "Si se habilita, las im\u00e1genes de cap\u00edtulos ser\u00e1n extra\u00eddas cuando los videos sean importados durante el escaneo de la biblioteca. Si se deshabilita, ser\u00e1n extra\u00eddas durante la ejecuci\u00f3n de la tarea programada de extracci\u00f3n de im\u00e1genes de cap\u00edtulos, permiti\u00e9ndo que el escaneo normal de la biblioteca se complete m\u00e1s r\u00e1pidamente.",
+ "LabelExtractChaptersDuringLibraryScanHelp": "Si se activa, las im\u00e1genes de cap\u00edtulos ser\u00e1n extra\u00eddas cuando los videos sean importados durante el escaneo de la biblioteca. Si se deshabilita, ser\u00e1n extra\u00eddas durante la ejecuci\u00f3n de la tarea programada de extracci\u00f3n de im\u00e1genes de cap\u00edtulos, permiti\u00e9ndo que el escaneo normal de la biblioteca se complete m\u00e1s r\u00e1pidamente.",
"OptionThumb": "Miniatura",
"LabelConnectUserName": "Nombre de Usuario\/email de Media Browser:",
"OptionBanner": "T\u00edtulo",
@@ -378,13 +378,13 @@
"OptionParentalRating": "Clasificaci\u00f3n Parental",
"LabelDisplayTrailersWithinMovieSuggestionsHelp": "Requiere la instalaci\u00f3n del canal de avances.",
"OptionPremiereDate": "Fecha de Estreno",
- "CinemaModeConfigurationHelp2": "Individual users will have the ability to disable cinema mode within their own preferences.",
+ "CinemaModeConfigurationHelp2": "Los usuarios individuales podr\u00e1n desactivar el modo cine desde sus preferencias personales.",
"TabBasic": "B\u00e1sico",
- "LabelEnableCinemaMode": "Enable cinema mode",
+ "LabelEnableCinemaMode": "Activar modo cine",
"TabAdvanced": "Avanzado",
- "HeaderCinemaMode": "Cinema Mode",
+ "HeaderCinemaMode": "Modo cine",
"HeaderStatus": "Estado",
- "HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
+ "HeaderWelcomeToMediaBrowserServerDashboard": "Bienvenido al Panel de Control de Media Browser",
"OptionContinuing": "Continuando",
"OptionEnded": "Finalizado",
"HeaderAirDays": "D\u00edas de Emisi\u00f3n",
@@ -414,8 +414,8 @@
"VisitMediaBrowserWebsite": "Visitar el Sitio Web de Media Browser",
"VisitMediaBrowserWebsiteLong": "Visite el Sitio Web de Media Browser para estar conocer las \u00faltimas not\u00edcias y mantenerse al d\u00eda con el blog de los desarrolladores.",
"OptionHideUser": "Ocultar este usuario en las pantallas de inicio de sesi\u00f3n",
- "OptionDisableUser": "Deshabilitar este usuario",
- "OptionDisableUserHelp": "Si est\u00e1 deshabilitado, el servidor no aceptar\u00e1 conexiones de este usuario. Las conexiones existentes ser\u00e1n finalizadas abruptamente.",
+ "OptionDisableUser": "Desactivar este usuario",
+ "OptionDisableUserHelp": "Si est\u00e1 desactivado, el servidor no aceptar\u00e1 conexiones de este usuario. Las conexiones existentes ser\u00e1n finalizadas abruptamente.",
"HeaderAdvancedControl": "Control Avanzado",
"LabelName": "Nombre:",
"OptionAllowUserToManageServer": "Permitir a este usuario administrar el servidor",
@@ -769,7 +769,7 @@
"OptionCelsius": "Cent\u00edgrados",
"OptionFahrenheit": "Fahrenheit",
"HeaderRequireManualLogin": "Requerir captura de nombre de usuario manual para:",
- "HeaderRequireManualLoginHelp": "Cuando se encuentra deshabilitado los clientes podr\u00edan mostrar una pantalla de inicio de sesi\u00f3n con una selecci\u00f3n visual de los usuarios.",
+ "HeaderRequireManualLoginHelp": "Cuando se encuentra desactivado los clientes podr\u00edan mostrar una pantalla de inicio de sesi\u00f3n con una selecci\u00f3n visual de los usuarios.",
"OptionOtherApps": "Otras applicaciones",
"OptionMobileApps": "Apps m\u00f3viles",
"HeaderNotificationList": "Haga clic en una notificaci\u00f3n para configurar sus opciones de envio.",
@@ -1068,7 +1068,7 @@
"LabelProtocolInfo": "Informaci\u00f3n del protocolo:",
"LabelProtocolInfoHelp": "El valor que ser\u00e1 utilizado cuando se responde a solicitudes GetProtocolInfo desde el dispositivo.",
"TabKodiMetadata": "Kodi",
- "HeaderKodiMetadataHelp": "Media Browser incluye soporte nativo para metadados NFO e im\u00e1genes de Kodi. Para habilitar o deshabilitar metadatos de Kodi, utilice la pesta\u00f1a Avanzado para configurar opciones para sus tipos de medios.",
+ "HeaderKodiMetadataHelp": "Media Browser incluye soporte nativo para metadados NFO e im\u00e1genes de Kodi. Para activar o desactivar metadatos de Kodi, utilice la pesta\u00f1a Avanzado para configurar opciones para sus tipos de medios.",
"LabelKodiMetadataUser": "A\u00f1adir usuario para monitoreo de datos de nfo\u00b4s para:",
"LabelKodiMetadataUserHelp": "Habilitar esto para mantener monitoreo de datos en sincron\u00eda entre Media Browser y Kodi.",
"LabelKodiMetadataDateFormat": "Formato de fecha de estreno:",
@@ -1079,7 +1079,7 @@
"LabelKodiMetadataEnablePathSubstitutionHelp": "Habilita la sustituci\u00f3n de trayectorias de im\u00e1genes usando la configuraci\u00f3n de sustituci\u00f3n de trayectorias del servidor.",
"LabelKodiMetadataEnablePathSubstitutionHelp2": "Ver sustituci\u00f3n de trayectoras.",
"LabelGroupChannelsIntoViews": "Desplegar los siguientes canales directamente en mis vistas:",
- "LabelGroupChannelsIntoViewsHelp": "Al habilitarse, estos canales ser\u00e1n desplegados directamente junto con otras vistas. Si permanecen deshabilitados, ser\u00e1n desplegados dentro de una vista independiente de Canales.",
+ "LabelGroupChannelsIntoViewsHelp": "Al activarse, estos canales ser\u00e1n desplegados directamente junto con otras vistas. Si permanecen deshabilitados, ser\u00e1n desplegados dentro de una vista independiente de Canales.",
"LabelDisplayCollectionsView": "Desplegar una vista de colecciones para mostrar las colecciones de pel\u00edculas",
"LabelKodiMetadataEnableExtraThumbs": "Copiar extrafanart en extrathumbs",
"LabelKodiMetadataEnableExtraThumbsHelp": "Cuando se descargan im\u00e1genes pueden ser almacenadas tanto en extrafanart como extrathumb para maximizar la compatibilidad con skins de Kodi.",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json
index c2d8231c36..445d3ed8ad 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json
@@ -380,9 +380,9 @@
"OptionPremiereDate": "Date de la premi\u00e8re",
"CinemaModeConfigurationHelp2": "Individual users will have the ability to disable cinema mode within their own preferences.",
"TabBasic": "Standard",
- "LabelEnableCinemaMode": "Enable cinema mode",
+ "LabelEnableCinemaMode": "Activer le mode cin\u00e9ma",
"TabAdvanced": "Avanc\u00e9",
- "HeaderCinemaMode": "Cinema Mode",
+ "HeaderCinemaMode": "Mode cin\u00e9ma",
"HeaderStatus": "\u00c9tat",
"HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
"OptionContinuing": "En continuation",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/hr.json b/MediaBrowser.Server.Implementations/Localization/Server/hr.json
index 9fc1eb270c..869767ba36 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/hr.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/hr.json
@@ -755,10 +755,10 @@
"LabelEnableDlnaServer": "Omogu\u0107i Dlna server",
"LabelEnableDlnaServerHelp": "Omogu\u0107i svojim UPnP ure\u0111ajima na mre\u017ei da pretra\u017euji i reproduciraju Media Browser sadr\u017eaj.",
"LabelEnableBlastAliveMessages": "Objavi poruke dostupnosti",
- "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.",
- "LabelBlastMessageInterval": "Alive message interval (seconds)",
- "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between server alive messages.",
- "LabelDefaultUser": "Default user:",
+ "LabelEnableBlastAliveMessagesHelp": "Omogu\u0107i ovo ako server nije prikazan kao siguran za druge UPnP ure\u0111aje na mre\u017ei.",
+ "LabelBlastMessageInterval": "Interval poruka dostupnosti (sekunde)",
+ "LabelBlastMessageIntervalHelp": "Odre\u0111uje trajanje u sekundama izme\u0111u svake poruke dostupnosti servera.",
+ "LabelDefaultUser": "Zadani korisnik:",
"LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.",
"TitleDlna": "DLNA",
"TitleChannels": "Channels",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json
index 44d0efb913..c4e8cf78c6 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json
@@ -29,7 +29,7 @@
"SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u043d\u0434\u044b",
"LabelYoureDone": "\u0411\u04d9\u0440\u0456 \u0434\u0430\u0439\u044b\u043d!",
"SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u043d\u0443\u044b \u0441\u04d9\u0442\u0441\u0456\u0437",
- "WelcomeToMediaBrowser": "Media Browser-\u0433\u0435 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
+ "WelcomeToMediaBrowser": "Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b\u043d\u0430 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
"LabelRunningTimeValue": "\u0406\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u0443\u0430\u049b\u044b\u0442\u044b: {0}",
"TitleMediaBrowser": "Media Browser",
"LabelIpAddressValue": "IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}",
@@ -384,7 +384,7 @@
"TabAdvanced": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430",
"HeaderCinemaMode": "\u041a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440 \u0440\u0435\u0436\u0456\u043c\u0456",
"HeaderStatus": "\u041a\u04af\u0439",
- "HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
+ "HeaderWelcomeToMediaBrowserServerDashboard": "Media Browser \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0430 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
"OptionContinuing": "\u0416\u0430\u043b\u0493\u0430\u0441\u0443\u0434\u0430",
"OptionEnded": "\u0410\u044f\u049b\u0442\u0430\u043b\u0434\u044b",
"HeaderAirDays": "\u042d\u0444\u0438\u0440 \u043a\u04af\u043d\u0434\u0435\u0440\u0456",
@@ -1007,7 +1007,7 @@
"MessageNoCollectionsAvailable": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456, \u0441\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440\u0434\u044b, \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440\u0434\u044b, \u043a\u0456\u0442\u0430\u043f\u0442\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u043e\u0439\u044b\u043d\u0434\u0430\u0440\u0434\u044b \u0436\u0435\u043a\u0435\u043b\u0435\u043d\u0433\u0435\u043d \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0436\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u0435\u0440\u0435\u0434\u0456. \u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u0430\u0441\u0430\u0439 \u0431\u0430\u0441\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \"\u0416\u0430\u0441\u0430\u0443\" \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.",
"MessageNoPlaylistsAvailable": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456 \u0431\u0456\u0440 \u043a\u0435\u0437\u0434\u0435 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u043c\u0430\u0437\u043c\u04b1\u043d \u0442\u0456\u0437\u0456\u043c\u0456\u043d \u0436\u0430\u0441\u0430\u0443\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0433\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u04af\u0441\u0442\u0435\u0443 \u04af\u0448\u0456\u043d, \u0442\u0456\u043d\u0442\u0443\u0456\u0440\u0434\u0456\u04a3 \u043e\u04a3 \u0436\u0430\u049b \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0442\u04af\u0440\u0442\u0456\u043f \u0436\u04d9\u043d\u0435 \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u044b\u04a3\u044b\u0437, \u0441\u043e\u043d\u0434\u0430 \u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443 \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
"MessageNoPlaylistItemsAvailable": "\u041e\u0441\u044b \u043e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c \u0430\u0493\u044b\u043c\u0434\u0430\u0493\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0431\u043e\u0441.",
- "HeaderWelcomeToMediaBrowserWebClient": "Media Browser \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b\u043d\u0430 \u0445\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
+ "HeaderWelcomeToMediaBrowserWebClient": "Media Browser \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442\u0456\u043d\u0435 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
"ButtonDismiss": "\u0416\u0430\u0441\u044b\u0440\u0443",
"ButtonTakeTheTour": "\u0410\u0440\u0430\u043b\u0430\u043f \u0448\u044b\u0493\u044b\u04a3\u044b\u0437",
"ButtonEditOtherUserPreferences": "\u041e\u0441\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u04e9\u04a3\u0434\u0435\u0443.",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json
index 1ca77edabe..e2eaacf714 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json
@@ -384,7 +384,7 @@
"TabAdvanced": "Geavanceerd",
"HeaderCinemaMode": "Cinema Mode",
"HeaderStatus": "Status",
- "HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
+ "HeaderWelcomeToMediaBrowserServerDashboard": "Welkom bij de Media Browser Dashboard",
"OptionContinuing": "Wordt vervolgd...",
"OptionEnded": "Gestopt",
"HeaderAirDays": "Uitzend Dagen",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json
index 0ebf014368..101b1c6527 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json
@@ -56,8 +56,8 @@
"LabelConfigureSettings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b",
"UserStoppedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440-\u0438\u0435 \u00ab{1}\u00bb \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e",
"LabelEnableVideoImageExtraction": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u0438\u0437 \u0432\u0438\u0434\u0435\u043e",
- "AppDeviceValues": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: {0}, \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e: {1}",
- "VideoImageExtractionHelp": "\u0414\u043b\u044f \u0432\u0438\u0434\u0435\u043e, \u0433\u0434\u0435 \u0435\u0449\u0451 \u200b\u200b\u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0435\u0449\u0451 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438, \u043d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.",
+ "AppDeviceValues": "\u041f\u0440\u0438\u043b-\u0438\u0435: {0}, \u0423\u0441\u0442\u0440-\u0432\u043e: {1}",
+ "VideoImageExtractionHelp": "\u0414\u043b\u044f \u0432\u0438\u0434\u0435\u043e, \u0433\u0434\u0435 \u0435\u0449\u0451 \u200b\u200b\u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0435\u0449\u0451 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438, \u043d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438.",
"ProviderValue": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a: {0}",
"LabelEnableChapterImageExtractionForMovies": "\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0441\u0446\u0435\u043d \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u043c\u043e\u0432",
"LabelChannelDownloadSizeLimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e, \u0413\u0411:",
@@ -346,7 +346,7 @@
"LabelStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:",
"LabelEnableCinemaModeFor": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0436\u0438\u043c\u0430 \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 \u0434\u043b\u044f:",
"LabelVersion": "\u0412\u0435\u0440\u0441\u0438\u044f:",
- "CinemaModeConfigurationHelp": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442, \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u0432 \u0432\u0430\u0448\u0443 \u0433\u043e\u0441\u0442\u0438\u043d\u0443\u044e, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c.",
+ "CinemaModeConfigurationHelp": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0432 \u0432\u0430\u0448\u0443 \u0433\u043e\u0441\u0442\u0438\u043d\u0443\u044e, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c.",
"LabelLastResult": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:",
"OptionTrailersFromMyMovies": "\u041e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b \u043a \u0444\u0438\u043b\u044c\u043c\u0430\u043c \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f \u0432 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435",
"OptionHasSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b",
@@ -384,7 +384,7 @@
"TabAdvanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
"HeaderCinemaMode": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430",
"HeaderStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
- "HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
+ "HeaderWelcomeToMediaBrowserServerDashboard": "\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u043c \u0432 \u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u0438 Media Browser",
"OptionContinuing": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f",
"OptionEnded": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f",
"HeaderAirDays": "\u0414\u043d\u0438 \u044d\u0444\u0438\u0440\u0430",
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json
index 97f7b8d4e1..33a5a1ca03 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json
@@ -181,7 +181,7 @@
"HeaderAlternateEpisodeNumbers": "Alternativ avsnittsnumrering",
"HeaderUploadNewImage": "Ladda upp ny bild",
"HeaderSpecialEpisodeInfo": "Info om specialavsnitt",
- "LabelDropImageHere": "Drop image here",
+ "LabelDropImageHere": "Dra bild hit",
"HeaderExternalIds": "Externa ID:n",
"ImageUploadAspectRatioHelp": "Bildf\u00f6rh\u00e5llande 1:1 rekommenderas. Endast JPG\/PNG.",
"LabelDvdSeasonNumber": "S\u00e4songsnummer p\u00e5 DVD:",
@@ -384,10 +384,10 @@
"TabAdvanced": "Avancerat",
"HeaderCinemaMode": "Biol\u00e4ge",
"HeaderStatus": "Status",
- "HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
+ "HeaderWelcomeToMediaBrowserServerDashboard": "V\u00e4lkommen till Media Browsers kontrollpanel",
"OptionContinuing": "P\u00e5g\u00e5ende",
"OptionEnded": "Avslutad",
- "HeaderAirDays": "Air Days",
+ "HeaderAirDays": "S\u00e4ndningsdagar",
"OptionSunday": "S\u00f6ndag",
"OptionMonday": "M\u00e5ndag",
"OptionTuesday": "Tisdag",
@@ -395,7 +395,7 @@
"OptionThursday": "Torsdag",
"OptionFriday": "Fredag",
"OptionSaturday": "L\u00f6rdag",
- "HeaderManagement": "Management",
+ "HeaderManagement": "Administration",
"LabelManagement": "Administration:",
"OptionMissingImdbId": "IMDB-ID saknas",
"OptionMissingTvdbId": "TVDB-ID saknas",
@@ -453,13 +453,13 @@
"ButtonSelectDirectory": "V\u00e4lj mapp",
"LabelCustomPaths": "Ange anpassade s\u00f6kv\u00e4gar d\u00e4r s\u00e5 \u00f6nskas. L\u00e4mna tomt f\u00f6r att anv\u00e4nda standardv\u00e4rdena.",
"LabelCachePath": "Plats f\u00f6r cache:",
- "LabelCachePathHelp": "Specify a custom location for server cache files, such as images.",
+ "LabelCachePathHelp": "Ange en plats f\u00f6r serverns cachefiler, t ex bilder.",
"LabelImagesByNamePath": "Plats f\u00f6r bilddatabasen (ImagesByName):",
- "LabelImagesByNamePathHelp": "Specify a custom location for downloaded actor, artist, genre and studio images.",
+ "LabelImagesByNamePathHelp": "Ange en plats f\u00f6r nerladdade sk\u00e5despelar-, artist-, genre- och studiobilder.",
"LabelMetadataPath": "Plats f\u00f6r metadata:",
- "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata, if not saving within media folders.",
+ "LabelMetadataPathHelp": "Ange en plats f\u00f6r nerladdad grafik och metadata, om du inte vill spara dessa i mediamapparna.",
"LabelTranscodingTempPath": "Mellanlagringsplats f\u00f6r omkodning:",
- "LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder. Specify a custom path, or leave empty to use the default within the server's data folder.",
+ "LabelTranscodingTempPathHelp": "Denna mapp inneh\u00e5ller tillf\u00e4lliga filer som anv\u00e4nds vid omkodning. Ange en plats f\u00f6r dessa, eller l\u00e4mna blankt f\u00f6r att anv\u00e4nda f\u00f6rvald plats.",
"TabBasics": "Grunderna",
"TabTV": "TV",
"TabGames": "Spel",
@@ -476,12 +476,12 @@
"LabelAutomaticUpdatesFanartHelp": "Om aktiverat h\u00e4mtas nya bilder automatiskt efter hand som de blir tillg\u00e4ngliga p\u00e5 fanart.tv. Befintliga bilder p\u00e5verkas ej.",
"LabelAutomaticUpdatesTmdbHelp": "Om aktiverat h\u00e4mtas nya bilder automatiskt efter hand som de blir tillg\u00e4ngliga p\u00e5 TheMovieDB.org. Befintliga bilder p\u00e5verkas ej.",
"LabelAutomaticUpdatesTvdbHelp": "Om aktiverat h\u00e4mtas nya bilder automatiskt efter hand som de blir tillg\u00e4ngliga p\u00e5 TheTVDB.com. Befintliga bilder p\u00e5verkas ej.",
- "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task at 4am. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
+ "ExtractChapterImagesHelp": "Detta m\u00f6jligg\u00f6r grafisk visning av menyer f\u00f6r val av kapitel. Processen kan vara tids- och CPU-kr\u00e4vande och beh\u00f6va flera gigabyte lagringsutrymme. Processen k\u00f6rs varje natt kl 04:00 men intervallet kan anpassas enligt \u00f6nskem\u00e5l i Schemal\u00e4ggaren. Vi rekommenderar inte att den k\u00f6rs vid tider d\u00e5 anv\u00e4ndare \u00e4r aktiva.",
"LabelMetadataDownloadLanguage": "\u00d6nskat spr\u00e5k:",
"ButtonAutoScroll": "Rulla listor automatiskt",
"LabelImageSavingConvention": "Namngivningsformat f\u00f6r bilder:",
"LabelImageSavingConventionHelp": "Media Browser kan anv\u00e4nda bilder fr\u00e5n de flesta vanliga mediaprogram. Genom att v\u00e4lja h\u00e4r kan du underl\u00e4tta anv\u00e4ndandet av Media Browser tillsammans med andra program.",
- "OptionImageSavingCompatible": "Compatible - Media Browser\/Kodi\/Plex",
+ "OptionImageSavingCompatible": "Kompatibelt - Media Browser\/Kodi\/Plex",
"OptionImageSavingStandard": "Standard - MB2",
"ButtonSignIn": "Logga in",
"TitleSignIn": "Logga in",
@@ -748,8 +748,8 @@
"ButtonRetrieveKey": "H\u00e4mta donationskod",
"LabelSupporterKey": "Donationskod (klistra in fr\u00e5n e-postmeddelandet)",
"LabelSupporterKeyHelp": "Ange din donationskod s\u00e5 att du kan b\u00f6rja anv\u00e4nda de extrafunktioner som har utvecklats inom Media Browsers anv\u00e4ndargrupper.",
- "MessageInvalidKey": "Supporter key is missing or invalid.",
- "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also be a Media Browser Supporter. Please donate and support the continued development of the core product. Thank you.",
+ "MessageInvalidKey": "Supporterkod ogiltig eller saknas.",
+ "ErrorMessageInvalidKey": "F\u00f6r att registrera premiuminneh\u00e5ll m\u00e5ste du vara Media Browser-supporter. Bidra g\u00e4rna till fortsatt utveckling av projektet genom att donera. Tack p\u00e5 f\u00f6rhand.",
"HeaderDisplaySettings": "Bildsk\u00e4rmsinst\u00e4llningar",
"TabPlayTo": "Spela upp p\u00e5",
"LabelEnableDlnaServer": "Aktivera DLNA-server",
@@ -778,9 +778,9 @@
"NotificationOptionPluginUpdateInstalled": "Till\u00e4gg har uppdaterats",
"NotificationOptionPluginInstalled": "Till\u00e4gg har installerats",
"NotificationOptionPluginUninstalled": "Till\u00e4gg har avinstallerats",
- "NotificationOptionVideoPlayback": "Video playback started",
- "NotificationOptionAudioPlayback": "Audio playback started",
- "NotificationOptionGamePlayback": "Game playback started",
+ "NotificationOptionVideoPlayback": "Videouppspelning har p\u00e5b\u00f6rjats",
+ "NotificationOptionAudioPlayback": "Ljuduppspelning har p\u00e5b\u00f6rjats",
+ "NotificationOptionGamePlayback": "Spel har startats",
"NotificationOptionVideoPlaybackStopped": "Videouppspelning stoppad",
"NotificationOptionAudioPlaybackStopped": "Ljuduppspelning stoppad",
"NotificationOptionGamePlaybackStopped": "Spel stoppat",
@@ -934,7 +934,7 @@
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Detta kr\u00e4vs f\u00f6r vissa enheter som inte kan utf\u00f6ra tidss\u00f6kning p\u00e5 ett tillfredsst\u00e4llande s\u00e4tt.",
"HeaderSubtitleDownloadingHelp": "N\u00e4r Media Browser s\u00f6ker igenom dina videofiler kan den identifiera saknade undertexter och ladda ner dem fr\u00e5n en onlinetj\u00e4nst, t ex OpenSubtitles.org.",
"HeaderDownloadSubtitlesFor": "Ladda ner undertexter f\u00f6r:",
- "MessageNoChapterProviders": "Install a chapter provider plugin such as ChapterDb to enable additional chapter options.",
+ "MessageNoChapterProviders": "Installera ett kapiteltill\u00e4gg s\u00e5som ChapterDb f\u00f6r att ge fler kapitelfunktioner.",
"LabelSkipIfGraphicalSubsPresent": "Hoppa \u00f6ver om videon redan inneh\u00e5ller grafiska undertexter",
"LabelSkipIfGraphicalSubsPresentHelp": "Om du sparar textversioner av undertexterna f\u00e5r du ett b\u00e4ttre resultat vid anv\u00e4ndning av mobila enheter.",
"TabSubtitles": "Undertexter",
@@ -942,7 +942,7 @@
"HeaderDownloadChaptersFor": "H\u00e4mta kapitelnamn f\u00f6r:",
"LabelOpenSubtitlesUsername": "Inloggnings-ID hos Open Subtitles:",
"LabelOpenSubtitlesPassword": "L\u00f6senord hos Open Subtitles:",
- "HeaderChapterDownloadingHelp": "When Media Browser scans your video files it can download friendly chapter names from the internet using chapter plugins such as ChapterDb.",
+ "HeaderChapterDownloadingHelp": "N\u00e4r Media Browser s\u00f6ker igenom dina videofiler kan den identifiera kapitelnamn och ladda ner dem med hj\u00e4lp av kapiteltill\u00e4gg s\u00e5som ChapterDb.",
"LabelPlayDefaultAudioTrack": "Anv\u00e4nd det f\u00f6rvalda ljudsp\u00e5ret oavsett spr\u00e5k",
"LabelSubtitlePlaybackMode": "Undertextl\u00e4ge:",
"LabelDownloadLanguages": "Spr\u00e5k att ladda ner:",
@@ -981,10 +981,10 @@
"OptionAuto": "Auto",
"OptionYes": "Ja",
"OptionNo": "Nej",
- "LabelHomePageSection1": "Home page section 1:",
- "LabelHomePageSection2": "Home page section 2:",
- "LabelHomePageSection3": "Home page section 3:",
- "LabelHomePageSection4": "Home page section 4:",
+ "LabelHomePageSection1": "Startsidans sektion 1:",
+ "LabelHomePageSection2": "Startsidans sektion 2:",
+ "LabelHomePageSection3": "Startsidans sektion 3:",
+ "LabelHomePageSection4": "Startsidans sektion 4:",
"OptionMyViewsButtons": "Mina vyer (knappar)",
"OptionMyViews": "Mina vyer",
"OptionMyViewsSmall": "Mina vyer (liten)",
@@ -1059,10 +1059,10 @@
"ViewTypeMusicFavoriteArtists": "Favoritartister",
"ViewTypeMusicFavoriteSongs": "Favoritl\u00e5tar",
"HeaderMyViews": "Mina vyer",
- "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:",
- "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.",
+ "LabelSelectFolderGroups": "Gruppera automatiskt inneh\u00e5ll fr\u00e5n dessa mappar i vyer, t ex Filmer, Musik eller TV:",
+ "LabelSelectFolderGroupsHelp": "Ej valda mappar kommer att visas f\u00f6r sig sj\u00e4lva i en egen vy.",
"OptionDisplayAdultContent": "Visa erotiskt inneh\u00e5ll",
- "OptionLibraryFolders": "Media folders",
+ "OptionLibraryFolders": "Mediamappar",
"TitleRemoteControl": "Fj\u00e4rrkontroll",
"OptionLatestTvRecordings": "Senaste inspelningar",
"LabelProtocolInfo": "Protokollinfo:",
@@ -1080,7 +1080,7 @@
"LabelKodiMetadataEnablePathSubstitutionHelp2": "Se \"s\u00f6kv\u00e4gsutbyte\".",
"LabelGroupChannelsIntoViews": "Visa dessa kanaler direkt i mina vyer:",
"LabelGroupChannelsIntoViewsHelp": "Om aktiverat kommer dessa kanaler att visas tillsammans med andra vyer. Annars visas de i en separat vy f\u00f6r Kanaler.",
- "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Vy som visar filmsamlingar",
"LabelKodiMetadataEnableExtraThumbs": "Kopiera extrafanart till extrathumbs",
"LabelKodiMetadataEnableExtraThumbsHelp": "N\u00e4r bilder h\u00e4mtas fr\u00e5n Internet kan de sparas i b\u00e5de extrafanart- och extrathumbs-mapparna f\u00f6r att ge maximal kompatibilitet med Kodi-skins.",
"TabServices": "Tj\u00e4nster",
@@ -1090,7 +1090,7 @@
"HeaderBrandingHelp": "Anpassa utseendet p\u00e5 Media Browser till din grupp eller f\u00f6retags \u00f6nskem\u00e5l.",
"LabelLoginDisclaimer": "Ansvarsbegr\u00e4nsning vid inloggning:",
"LabelLoginDisclaimerHelp": "Detta visas l\u00e4ngst ned p\u00e5 inloggningssidan.",
- "LabelAutomaticallyDonate": "Automatically donate this amount every month",
+ "LabelAutomaticallyDonate": "Donera detta belopp automatiskt varje m\u00e5nad",
"LabelAutomaticallyDonateHelp": "Du kan avbryta n\u00e4r som helst via ditt PayPal-konto.",
"OptionList": "Lista",
"TabDashboard": "Kontrollpanel",
@@ -1189,7 +1189,7 @@
"OptionReportArtists": "Artister",
"OptionReportAlbums": "Album",
"OptionReportAdultVideos": "Vuxen videos",
- "ButtonMore": "More",
+ "ButtonMore": "Mer",
"HeaderActivity": "Aktivitet",
"ScheduledTaskStartedWithName": "{0} startad"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index c3d376f1f3..c90c1c029a 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -93,7 +93,6 @@
<Reference Include="ServiceStack.Text">
<HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll</HintPath>
</Reference>
- <Reference Include="Mono.Posix" Condition=" '$(ConfigurationName)' == 'Release Mono' " />
<Reference Include="websocket-sharp, Version=1.0.2.508, Culture=neutral, PublicKeyToken=5660b08a1845a91e, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\WebsocketSharp\websocket-sharp.dll</HintPath>
diff --git a/MediaBrowser.Server.Mono/IO/FileSystemFactory.cs b/MediaBrowser.Server.Mono/IO/FileSystemFactory.cs
deleted file mode 100644
index 4a424a2824..0000000000
--- a/MediaBrowser.Server.Mono/IO/FileSystemFactory.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Common.Implementations.IO;
-
-namespace MediaBrowser.ServerApplication.IO
-{
- /// <summary>
- /// Class FileSystemFactory
- /// </summary>
- public static class FileSystemFactory
- {
- /// <summary>
- /// Creates the file system manager.
- /// </summary>
- /// <returns>IFileSystem.</returns>
- public static IFileSystem CreateFileSystemManager(ILogManager logManager)
- {
- return new CommonFileSystem(logManager.GetLogger("FileSystem"), false);
- }
- }
-}
diff --git a/MediaBrowser.Server.Mono/MainWindow.cs b/MediaBrowser.Server.Mono/MainWindow.cs
deleted file mode 100644
index 229f44dab9..0000000000
--- a/MediaBrowser.Server.Mono/MainWindow.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using Gtk;
-
-public partial class MainWindow: Gtk.Window
-{
- public MainWindow (): base (Gtk.WindowType.Toplevel)
- {
- Build ();
- }
-
- protected void OnDeleteEvent (object sender, DeleteEventArgs a)
- {
- Application.Quit ();
- a.RetVal = true;
- }
-}
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.MediaInfo.dll.config b/MediaBrowser.Server.Mono/MediaBrowser.MediaInfo.dll.config
index ab6cdb1a48..ce51680e44 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.MediaInfo.dll.config
+++ b/MediaBrowser.Server.Mono/MediaBrowser.MediaInfo.dll.config
@@ -1,6 +1,4 @@
<configuration>
- <dllmap dll="MediaInfo" target="./MediaInfo/linux/lib/libmediainfo.so" os="linux" wordsize="32"/>
- <dllmap dll="MediaInfo" target="./MediaInfo/linux/lib64/libmediainfo.so" os="linux" wordsize="64"/>
<dllmap dll="MediaInfo" target="./MediaInfo/osx/libmediainfo.dylib" os="osx"/>
- <dllmap dll="MediaInfo" target="libmediainfo.so" os="linux" cpu="!x86,!x86_64"/>
+ <dllmap dll="MediaInfo" target="libmediainfo.so" os="linux"/>
</configuration>
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index 5ec0e5e1c4..29c01b02c4 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -11,6 +11,8 @@
<AssemblyName>MediaBrowser.Server.Mono</AssemblyName>
<StartupObject>MediaBrowser.Server.Mono.MainClass</StartupObject>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+ <RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
@@ -43,16 +45,22 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\Mono.Posix.4.0.0.0\lib\net40\Mono.Posix.dll</HintPath>
+ </Reference>
<Reference Include="System" />
<Reference Include="ServiceStack.Interfaces">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
- <Reference Include="Mono.Posix" Condition=" '$(ConfigurationName)' == 'Release Mono' " />
<Reference Include="MediaBrowser.IsoMounting.Linux">
<HintPath>..\ThirdParty\MediaBrowser.IsoMounting.Linux\MediaBrowser.IsoMounting.Linux.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
+ <Compile Include="..\MediaBrowser.ServerApplication\IO\StartupOptions.cs">
+ <Link>IO\StartupOptions.cs</Link>
+ </Compile>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
@@ -78,13 +86,9 @@
<Compile Include="..\MediaBrowser.ServerApplication\FFMpeg\FFMpegDownloader.cs">
<Link>FFMpeg\FFMpegDownloader.cs</Link>
</Compile>
- <Compile Include="IO\FileSystemFactory.cs" />
<Compile Include="..\MediaBrowser.ServerApplication\FFMpeg\FFMpegDownloadInfo.cs">
<Link>FFMpeg\FFMpegDownloadInfo.cs</Link>
</Compile>
- <Compile Include="..\MediaBrowser.ServerApplication\IO\StartupOptions.cs">
- <Link>IO\StartupOptions.cs"</Link>
- </Compile>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
@@ -137,68 +141,59 @@
<Name>MediaBrowser.XbmcMetadata</Name>
</ProjectReference>
</ItemGroup>
+ <ItemGroup />
<ItemGroup>
- <Folder Include="EntryPoints\" />
- <Folder Include="Native\" />
- <Folder Include="FFMpeg\" />
- <Folder Include="Networking\" />
- <Folder Include="IO\" />
- </ItemGroup>
- <ItemGroup>
- <None Include="app.config" />
- </ItemGroup>
- <ItemGroup>
- <Content Include="..\ThirdParty\MediaInfo\linux\x86\libmediainfo.so">
- <Link>MediaInfo\linux\lib\libmediainfo.so</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\MediaInfo\linux\x86_64\libmediainfo.so">
- <Link>MediaInfo\linux\lib64\libmediainfo.so</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\MediaInfo\osx\libmediainfo.dylib">
- <Link>MediaInfo\osx\libmediainfo.dylib</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\libwebp\linux\x86\libwebp.so">
+ <None Include="..\thirdparty\libwebp\linux\x86\libwebp.so">
<Link>libwebp\linux\lib\libwebp.so</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\libwebp\linux\x86_64\libwebp.so">
+ </None>
+ <None Include="..\thirdparty\libwebp\linux\x86_64\libwebp.so">
<Link>libwebp\linux\lib64\libwebp.so</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\libwebp\osx\libwebp.5.dylib">
+ </None>
+ <None Include="..\thirdparty\libwebp\osx\libwebp.5.dylib">
<Link>libwebp\osx\libwebp.5.dylib</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\SQLite3\windows\x86\3.8.2\sqlite3.dll">
- <Link>sqlite3.dll</Link>
+ </None>
+ <None Include="..\thirdparty\mediainfo\osx\libmediainfo.dylib">
+ <Link>MediaInfo\osx\libmediainfo.dylib</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\SQLite3\linux\x86\3.8.2\libsqlite3.so.0.8.6">
+ </None>
+ <None Include="..\thirdparty\sqlite3\linux\x86\3.8.2\libsqlite3.so.0.8.6">
<Link>sqlite3\linux\lib\libsqlite3.so.0.8.6</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\SQLite3\linux\x86_64\3.8.2\libsqlite3.so.0.8.6">
+ </None>
+ <None Include="..\thirdparty\sqlite3\linux\x86_64\3.8.2\libsqlite3.so.0.8.6">
<Link>sqlite3\linux\lib64\libsqlite3.so.0.8.6</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\ThirdParty\SQLite3\mac\universal\3.8.2\libsqlite3.0.dylib">
+ </None>
+ <None Include="..\thirdparty\sqlite3\mac\universal\3.8.2\libsqlite3.0.dylib">
<Link>sqlite3\mac\libsqlite3.0.dylib</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="System.Data.SQLite.dll.config">
- <Link>System.Data.SQLite.dll.config</Link>
+ </None>
+ <None Include="app.config" />
+ <None Include="Imazen.WebP.dll.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="Imazen.WebP.dll.config">
- <Link>Imazen.WebP.dll.config</Link>
+ </None>
+ <None Include="MediaBrowser.MediaInfo.dll.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="MediaBrowser.MediaInfo.dll.config">
- <Link>MediaBrowser.MediaInfo.dll.config</Link>
+ </None>
+ <None Include="packages.config" />
+ <None Include="System.Data.SQLite.dll.config">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="..\ThirdParty\SQLite3\windows\x86\3.8.2\sqlite3.dll">
+ <Link>sqlite3.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
-</Project>
+ <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+ <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+ <PropertyGroup>
+ <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+ </PropertyGroup>
+ <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
+ </Target>
+</Project> \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs
index 7a1d03fb7f..c9267fd7e7 100644
--- a/MediaBrowser.Server.Mono/Program.cs
+++ b/MediaBrowser.Server.Mono/Program.cs
@@ -1,30 +1,19 @@
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Constants;
+using MediaBrowser.Common.Implementations.IO;
using MediaBrowser.Common.Implementations.Logging;
-using MediaBrowser.Common.Implementations.Updates;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations;
using MediaBrowser.ServerApplication;
-using MediaBrowser.ServerApplication.Native;
using MediaBrowser.ServerApplication.IO;
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
-using System.Threading;
-using System.Windows;
using System.Net;
using System.Net.Security;
+using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
-using System.Reflection;
-using System.Linq;
-// MONOMKBUNDLE: For the embedded version, mkbundle tool
-#if MONOMKBUNDLE
-using Mono.Unix;
-using Mono.Unix.Native;
-using System.Text;
-#endif
namespace MediaBrowser.Server.Mono
{
@@ -123,7 +112,9 @@ namespace MediaBrowser.Server.Mono
// Allow all https requests
ServicePointManager.ServerCertificateValidationCallback = _ignoreCertificates;
- _appHost = new ApplicationHost(appPaths, logManager, false, false, options, "MBServer.Mono");
+ var fileSystem = new CommonFileSystem(logManager.GetLogger("FileSystem"), false, true);
+
+ _appHost = new ApplicationHost(appPaths, logManager, false, false, options, fileSystem, "MBServer.Mono", false);
if (options.ContainsOption("-v")) {
Console.WriteLine (_appHost.ApplicationVersion.ToString());
diff --git a/MediaBrowser.Server.Mono/gtk-gui/MainWindow.cs b/MediaBrowser.Server.Mono/gtk-gui/MainWindow.cs
deleted file mode 100644
index c481dfc8c7..0000000000
--- a/MediaBrowser.Server.Mono/gtk-gui/MainWindow.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-
-// This file has been generated by the GUI designer. Do not modify.
-public partial class MainWindow
-{
- protected virtual void Build ()
- {
- global::Stetic.Gui.Initialize (this);
- // Widget MainWindow
- this.Name = "MainWindow";
- this.Title = global::Mono.Unix.Catalog.GetString ("MainWindow");
- this.WindowPosition = ((global::Gtk.WindowPosition)(4));
- if ((this.Child != null)) {
- this.Child.ShowAll ();
- }
- this.DefaultWidth = 400;
- this.DefaultHeight = 300;
- this.Show ();
- this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
- }
-}
diff --git a/MediaBrowser.Server.Mono/gtk-gui/generated.cs b/MediaBrowser.Server.Mono/gtk-gui/generated.cs
deleted file mode 100644
index 9ef3363981..0000000000
--- a/MediaBrowser.Server.Mono/gtk-gui/generated.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-
-// This file has been generated by the GUI designer. Do not modify.
-namespace Stetic
-{
- internal class Gui
- {
- private static bool initialized;
-
- internal static void Initialize (Gtk.Widget iconRenderer)
- {
- if ((Stetic.Gui.initialized == false)) {
- Stetic.Gui.initialized = true;
- }
- }
- }
-
- internal class ActionGroups
- {
- public static Gtk.ActionGroup GetActionGroup (System.Type type)
- {
- return Stetic.ActionGroups.GetActionGroup (type.FullName);
- }
-
- public static Gtk.ActionGroup GetActionGroup (string name)
- {
- return null;
- }
- }
-}
diff --git a/MediaBrowser.Server.Mono/gtk-gui/gui.stetic b/MediaBrowser.Server.Mono/gtk-gui/gui.stetic
deleted file mode 100644
index 81685442c3..0000000000
--- a/MediaBrowser.Server.Mono/gtk-gui/gui.stetic
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<stetic-interface>
- <configuration>
- <images-root-path>..</images-root-path>
- <target-gtk-version>2.12</target-gtk-version>
- </configuration>
- <import>
- <widget-library name="glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
- <widget-library name="../bin/Debug/MediaBrowser.Server.Mono.exe" internal="true" />
- </import>
- <widget class="Gtk.Window" id="MainWindow" design-size="400 300">
- <property name="MemberName" />
- <property name="Title" translatable="yes">MainWindow</property>
- <property name="WindowPosition">CenterOnParent</property>
- <signal name="DeleteEvent" handler="OnDeleteEvent" />
- <child>
- <placeholder />
- </child>
- </widget>
-</stetic-interface> \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/packages.config b/MediaBrowser.Server.Mono/packages.config
new file mode 100644
index 0000000000..120360cd44
--- /dev/null
+++ b/MediaBrowser.Server.Mono/packages.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
+</packages> \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/tray.png b/MediaBrowser.Server.Mono/tray.png
deleted file mode 100644
index 7f11000363..0000000000
--- a/MediaBrowser.Server.Mono/tray.png
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index 7f975d4d88..f08a7771b9 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -222,6 +222,8 @@ namespace MediaBrowser.ServerApplication
private readonly StartupOptions _startupOptions;
private readonly string _remotePackageName;
+ private readonly bool _supportsNativeWebSocket;
+
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationHost" /> class.
/// </summary>
@@ -230,16 +232,21 @@ namespace MediaBrowser.ServerApplication
/// <param name="supportsRunningAsService">if set to <c>true</c> [supports running as service].</param>
/// <param name="isRunningAsService">if set to <c>true</c> [is running as service].</param>
/// <param name="options">The options.</param>
+ /// <param name="fileSystem">The file system.</param>
/// <param name="remotePackageName">Name of the remote package.</param>
public ApplicationHost(ServerApplicationPaths applicationPaths,
ILogManager logManager,
bool supportsRunningAsService,
bool isRunningAsService,
- StartupOptions options, string remotePackageName)
- : base(applicationPaths, logManager)
+ StartupOptions options,
+ IFileSystem fileSystem,
+ string remotePackageName,
+ bool supportsNativeWebSocket)
+ : base(applicationPaths, logManager, fileSystem)
{
_startupOptions = options;
_remotePackageName = remotePackageName;
+ _supportsNativeWebSocket = supportsNativeWebSocket;
_isRunningAsService = isRunningAsService;
SupportsRunningAsService = supportsRunningAsService;
}
@@ -433,7 +440,7 @@ namespace MediaBrowser.ServerApplication
RegisterSingleInstance<ISearchEngine>(() => new SearchEngine(LogManager, LibraryManager, UserManager));
- HttpServer = ServerFactory.CreateServer(this, LogManager, "Media Browser", WebApplicationName, "dashboard/index.html");
+ HttpServer = ServerFactory.CreateServer(this, LogManager, "Media Browser", WebApplicationName, "dashboard/index.html", _supportsNativeWebSocket);
RegisterSingleInstance(HttpServer, false);
progress.Report(10);
@@ -548,11 +555,6 @@ namespace MediaBrowser.ServerApplication
return new NetworkManager(logger);
}
- protected override IFileSystem CreateFileSystemManager()
- {
- return FileSystemFactory.CreateFileSystemManager(LogManager);
- }
-
/// <summary>
/// Registers the media encoder.
/// </summary>
diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs
index 9070671484..01eef25d9a 100644
--- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs
+++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloadInfo.cs
@@ -1,9 +1,5 @@
-using System;
-#if __MonoCS__
-using Mono.Unix.Native;
-using System.Text.RegularExpressions;
-using System.IO;
-#endif
+using Mono.Unix.Native;
+using System;
using System.IO;
using System.Text.RegularExpressions;
@@ -33,7 +29,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg
switch (arg)
{
case "Version":
- return "20140827";
+ return "20141005";
case "FFMpegFilename":
return "ffmpeg.exe";
case "FFProbeFilename":
@@ -82,7 +78,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg
switch (arg)
{
case "Version":
- return "20140506";
+ return "20140716";
case "FFMpegFilename":
return "ffmpeg";
case "FFProbeFilename":
@@ -98,7 +94,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg
switch (arg)
{
case "Version":
- return "20140505";
+ return "20140716";
case "FFMpegFilename":
return "ffmpeg";
case "FFProbeFilename":
@@ -138,15 +134,15 @@ namespace MediaBrowser.ServerApplication.FFMpeg
{
return new[]
{
- "http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20140827-git-9e8ab36-win64-static.7z",
- "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20140827-git-9e8ab36-win64-static.7z"
+ "http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20141005-git-e079d43-win64-static.7z",
+ "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20141005-git-e079d43-win64-static.7z"
};
}
return new[]
{
- "http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20140827-git-9e8ab36-win32-static.7z",
- "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20140827-git-9e8ab36-win32-static.7z"
+ "http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20141005-git-e079d43-win32-static.7z",
+ "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/windows/ffmpeg-20141005-git-e079d43-win32-static.7z"
};
case PlatformID.Unix:
@@ -173,7 +169,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg
return new[]
{
"http://ffmpeg.gusari.org/static/32bit/ffmpeg.static.32bit.latest.tar.gz",
- "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/linux/ffmpeg.static.32bit.2014-05-06.tar.gz"
+ "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/linux/ffmpeg.static.32bit.2014-07-16.tar.gz"
};
}
@@ -182,7 +178,7 @@ namespace MediaBrowser.ServerApplication.FFMpeg
return new[]
{
"http://ffmpeg.gusari.org/static/64bit/ffmpeg.static.64bit.latest.tar.gz",
- "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/linux/ffmpeg.static.64bit.2014-05-05.tar.gz"
+ "https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/linux/ffmpeg.static.64bit.2014-07-16.tar.gz"
};
}
@@ -237,16 +233,13 @@ namespace MediaBrowser.ServerApplication.FFMpeg
private static Uname GetUnixName()
{
var uname = new Uname();
-
-#if __MonoCS__
- Utsname utsname;
- var callResult = Syscall.uname(out utsname);
- if (callResult == 0)
- {
- uname.sysname= utsname.sysname;
- uname.machine= utsname.machine;
- }
-#endif
+ Utsname utsname;
+ var callResult = Syscall.uname(out utsname);
+ if (callResult == 0)
+ {
+ uname.sysname = utsname.sysname;
+ uname.machine = utsname.machine;
+ }
return uname;
}
}
diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs
index 59c2940e66..cc289faf29 100644
--- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs
+++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs
@@ -1,20 +1,18 @@
-using System.Collections.Generic;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
+using MediaBrowser.ServerApplication.IO;
+using Mono.Unix.Native;
using System;
+using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-#if __MonoCS__
-using Mono.Unix.Native;
-#endif
-using MediaBrowser.ServerApplication.IO;
namespace MediaBrowser.ServerApplication.FFMpeg
{
@@ -228,13 +226,8 @@ namespace MediaBrowser.ServerApplication.FFMpeg
}))
{
File.Copy(file, Path.Combine(targetFolder, Path.GetFileName(file)), true);
- #if __MonoCS__
- //Linux: File permission to 666, and user's execute bit
- if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX)
- {
- Syscall.chmod(Path.Combine(targetFolder, Path.GetFileName(file)), FilePermissions.DEFFILEMODE | FilePermissions.S_IXUSR);
- }
- #endif
+
+ SetFilePermissions(targetFolder, file);
}
}
finally
@@ -243,6 +236,15 @@ namespace MediaBrowser.ServerApplication.FFMpeg
}
}
+ private void SetFilePermissions(string targetFolder, string file)
+ {
+ // Linux: File permission to 666, and user's execute bit
+ if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX)
+ {
+ Syscall.chmod(Path.Combine(targetFolder, Path.GetFileName(file)), FilePermissions.DEFFILEMODE | FilePermissions.S_IXUSR);
+ }
+ }
+
private void ExtractArchive(string archivePath, string targetPath)
{
_logger.Info("Extracting {0} to {1}", archivePath, targetPath);
diff --git a/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs b/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs
deleted file mode 100644
index 698c4b616f..0000000000
--- a/MediaBrowser.ServerApplication/IO/FileSystemFactory.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.Logging;
-
-namespace MediaBrowser.ServerApplication.IO
-{
- /// <summary>
- /// Class FileSystemFactory
- /// </summary>
- public static class FileSystemFactory
- {
- /// <summary>
- /// Creates the file system manager.
- /// </summary>
- /// <returns>IFileSystem.</returns>
- public static IFileSystem CreateFileSystemManager(ILogManager logManager)
- {
- return new NativeFileSystem(logManager.GetLogger("FileSystem"));
- }
- }
-}
diff --git a/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs b/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs
index e6a9762339..6bdd77ad18 100644
--- a/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs
+++ b/MediaBrowser.ServerApplication/IO/NativeFileSystem.cs
@@ -10,8 +10,8 @@ namespace MediaBrowser.ServerApplication.IO
{
public class NativeFileSystem : CommonFileSystem
{
- public NativeFileSystem(ILogger logger)
- : base(logger, true)
+ public NativeFileSystem(ILogger logger, bool usePresetInvalidFileNameChars)
+ : base(logger, true, usePresetInvalidFileNameChars)
{
}
diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs
index 15fd7af746..df6fd47465 100644
--- a/MediaBrowser.ServerApplication/MainStartup.cs
+++ b/MediaBrowser.ServerApplication/MainStartup.cs
@@ -209,7 +209,16 @@ namespace MediaBrowser.ServerApplication
/// <param name="options">The options.</param>
private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options)
{
- _appHost = new ApplicationHost(appPaths, logManager, true, runService, options, "MBServer");
+ var fileSystem = new NativeFileSystem(logManager.GetLogger("FileSystem"), false);
+
+ _appHost = new ApplicationHost(appPaths,
+ logManager,
+ true,
+ runService,
+ options,
+ fileSystem,
+ "MBServer",
+ true);
var initProgress = new Progress<double>();
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 33bdea0f6c..49eacf46fd 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -63,6 +63,10 @@
<Reference Include="MediaBrowser.IsoMounter">
<HintPath>..\packages\MediaBrowser.IsoMounting.3.0.69\lib\net45\MediaBrowser.IsoMounter.dll</HintPath>
</Reference>
+ <Reference Include="Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\Mono.Posix.4.0.0.0\lib\net40\Mono.Posix.dll</HintPath>
+ </Reference>
<Reference Include="NLog, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\NLog.3.1.0.0\lib\net45\NLog.dll</HintPath>
@@ -103,7 +107,6 @@
<Compile Include="FFMpeg\FFMpegDownloader.cs" />
<Compile Include="FFMpeg\FFMpegDownloadInfo.cs" />
<Compile Include="FFMpeg\FFMpegInfo.cs" />
- <Compile Include="IO\FileSystemFactory.cs" />
<Compile Include="IO\NativeFileSystem.cs" />
<Compile Include="IO\StartupOptions.cs" />
<Compile Include="Logging\LogForm.cs">
diff --git a/MediaBrowser.ServerApplication/Native/BrowserLauncher.cs b/MediaBrowser.ServerApplication/Native/BrowserLauncher.cs
index c2c64ea4d4..3105928821 100644
--- a/MediaBrowser.ServerApplication/Native/BrowserLauncher.cs
+++ b/MediaBrowser.ServerApplication/Native/BrowserLauncher.cs
@@ -116,9 +116,9 @@ namespace MediaBrowser.ServerApplication.Native
Console.WriteLine("Error launching browser");
Console.WriteLine(ex.Message);
-#if !__MonoCS__
- System.Windows.Forms.MessageBox.Show("There was an error launching your web browser. Please check your default browser settings.");
-#endif
+//#if !__MonoCS__
+// System.Windows.Forms.MessageBox.Show("There was an error launching your web browser. Please check your default browser settings.");
+//#endif
}
}
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
index 8de487fb50..bfff11677b 100644
--- a/MediaBrowser.ServerApplication/packages.config
+++ b/MediaBrowser.ServerApplication/packages.config
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MediaBrowser.IsoMounting" version="3.0.69" targetFramework="net45" />
+ <package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
<package id="NLog" version="3.1.0.0" targetFramework="net45" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index eec69c4d7e..292200bfa3 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -2209,18 +2209,6 @@
<None Include="dashboard-ui\css\fonts\RobotoBold.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
- <None Include="dashboard-ui\css\fonts\OpenSans-ExtraBold.woff">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </None>
- <None Include="dashboard-ui\css\fonts\OpenSans-Bold.woff">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </None>
- <None Include="dashboard-ui\css\fonts\OpenSans.woff">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </None>
- <None Include="dashboard-ui\css\fonts\OpenSans-Light.woff">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </None>
<None Include="dashboard-ui\css\fonts\RobotoLight.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
diff --git a/MediaBrowser.sln b/MediaBrowser.sln
index 5c04d13a65..d4fdc623ba 100644
--- a/MediaBrowser.sln
+++ b/MediaBrowser.sln
@@ -53,6 +53,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.LocalMetadata"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.MediaInfo", "MediaBrowser.MediaInfo\MediaBrowser.MediaInfo.csproj", "{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Mono", "MediaBrowser.Server.Mono\MediaBrowser.Server.Mono.csproj", "{175A9388-F352-4586-A6B4-070DED62B644}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug_Ubuntu|Any CPU = Debug_Ubuntu|Any CPU
@@ -65,6 +67,11 @@ Global
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
+ Release Mono|Any CPU = Release Mono|Any CPU
+ Release Mono|Mixed Platforms = Release Mono|Mixed Platforms
+ Release Mono|Win32 = Release Mono|Win32
+ Release Mono|x64 = Release Mono|x64
+ Release Mono|x86 = Release Mono|x86
Release_Ubuntu|Any CPU = Release_Ubuntu|Any CPU
Release_Ubuntu|Mixed Platforms = Release_Ubuntu|Mixed Platforms
Release_Ubuntu|Win32 = Release_Ubuntu|Win32
@@ -92,6 +99,13 @@ Global
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x64.ActiveCfg = Debug|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.ActiveCfg = Debug|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -122,6 +136,13 @@ Global
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x64.ActiveCfg = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.ActiveCfg = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.Build.0 = Debug|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -152,6 +173,13 @@ Global
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x64.ActiveCfg = Debug|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.ActiveCfg = Debug|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.Build.0 = Debug|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -182,6 +210,13 @@ Global
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x64.ActiveCfg = Debug|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.ActiveCfg = Debug|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.Build.0 = Debug|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -212,6 +247,13 @@ Global
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x64.ActiveCfg = Debug|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.ActiveCfg = Debug|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.Build.0 = Debug|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -241,6 +283,13 @@ Global
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Win32.ActiveCfg = Debug|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|x64.ActiveCfg = Debug|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -269,6 +318,13 @@ Global
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Win32.ActiveCfg = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x64.ActiveCfg = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -297,6 +353,13 @@ Global
{657B5410-7C3B-4806-9753-D254102CE537}.Debug|Win32.ActiveCfg = Debug|Any CPU
{657B5410-7C3B-4806-9753-D254102CE537}.Debug|x64.ActiveCfg = Debug|Any CPU
{657B5410-7C3B-4806-9753-D254102CE537}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {657B5410-7C3B-4806-9753-D254102CE537}.Release Mono|x86.ActiveCfg = Release|Any CPU
{657B5410-7C3B-4806-9753-D254102CE537}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{657B5410-7C3B-4806-9753-D254102CE537}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{657B5410-7C3B-4806-9753-D254102CE537}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -325,6 +388,13 @@ Global
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|Win32.ActiveCfg = Debug|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|x64.ActiveCfg = Debug|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|x86.ActiveCfg = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -353,6 +423,13 @@ Global
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Win32.ActiveCfg = Debug|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x64.ActiveCfg = Debug|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -381,6 +458,13 @@ Global
{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Debug|Win32.ActiveCfg = Debug|Any CPU
{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Debug|x64.ActiveCfg = Debug|Any CPU
{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release Mono|x86.ActiveCfg = Release|Any CPU
{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{D729ADB1-1C01-428D-B680-8EFACD687B2A}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -411,6 +495,14 @@ Global
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Win32.ActiveCfg = Debug|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|x64.ActiveCfg = Debug|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.ActiveCfg = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.Build.0 = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.ActiveCfg = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.Build.0 = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x86.ActiveCfg = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x86.Build.0 = Release|x86
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|x86
@@ -441,6 +533,13 @@ Global
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|Win32.ActiveCfg = Debug|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x64.ActiveCfg = Debug|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -469,6 +568,13 @@ Global
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|Win32.ActiveCfg = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x64.ActiveCfg = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -497,6 +603,13 @@ Global
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Win32.ActiveCfg = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x64.ActiveCfg = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
@@ -525,6 +638,13 @@ Global
{23499896-B135-4527-8574-C26E926EA99E}.Debug|Win32.ActiveCfg = Debug|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Debug|x64.ActiveCfg = Debug|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|x86.ActiveCfg = Release|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -553,6 +673,13 @@ Global
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Win32.ActiveCfg = Debug|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|x64.ActiveCfg = Debug|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|x86.ActiveCfg = Release|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -581,6 +708,13 @@ Global
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Debug|Win32.ActiveCfg = Debug|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Debug|x64.ActiveCfg = Debug|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release Mono|x86.ActiveCfg = Release|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release_Ubuntu|Any CPU.ActiveCfg = Release|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release_Ubuntu|Any CPU.Build.0 = Release|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -595,6 +729,50 @@ Global
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release|Win32.ActiveCfg = Release|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release|x64.ActiveCfg = Release|Any CPU
{6E4145E4-C6D4-4E4D-94F2-87188DB6E239}.Release|x86.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Any CPU.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Any CPU.Build.0 = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Mixed Platforms.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Mixed Platforms.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Win32.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|Win32.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|x64.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|x86.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug_Ubuntu|x86.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.ActiveCfg = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.ActiveCfg = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.ActiveCfg = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Any CPU.ActiveCfg = Release Mono|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Any CPU.Build.0 = Release Mono|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Mixed Platforms.ActiveCfg = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Mixed Platforms.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Win32.ActiveCfg = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|Win32.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|x64.ActiveCfg = Release Mono|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|x86.ActiveCfg = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release_Ubuntu|x86.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.Build.0 = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.ActiveCfg = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.Build.0 = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|x64.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.ActiveCfg = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj b/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
index 6180b80094..48ef32500c 100644
--- a/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
+++ b/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
@@ -119,7 +119,7 @@
<Content Include="XML-RPC\Docs\XML-RPC.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " />
+ <Import Project="$(SolutionDir)\.nuget\NuGet.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">