aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/BaseApiService.cs12
-rw-r--r--MediaBrowser.Api/ConfigurationService.cs24
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs63
-rw-r--r--MediaBrowser.Api/Images/ImageWriter.cs96
-rw-r--r--MediaBrowser.Api/ItemLookupService.cs19
-rw-r--r--MediaBrowser.Api/ItemUpdateService.cs11
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs2
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj3
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs27
-rw-r--r--MediaBrowser.Api/Playback/EndlessStreamCopy.cs32
-rw-r--r--MediaBrowser.Api/Playback/Hls/BaseHlsService.cs5
-rw-r--r--MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs21
-rw-r--r--MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs7
-rw-r--r--MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs16
-rw-r--r--MediaBrowser.Api/Sync/SyncService.cs130
-rw-r--r--MediaBrowser.Api/UserService.cs92
-rw-r--r--MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs22
-rw-r--r--MediaBrowser.Common.Implementations/Updates/InstallationManager.cs24
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj1
-rw-r--r--MediaBrowser.Common/Net/HttpRequestOptions.cs1
-rw-r--r--MediaBrowser.Common/Net/IServerManager.cs14
-rw-r--r--MediaBrowser.Common/Net/IWebSocketServer.cs32
-rw-r--r--MediaBrowser.Common/Net/MimeTypes.cs4
-rw-r--r--MediaBrowser.Controller/Channels/ChannelFolderItem.cs6
-rw-r--r--MediaBrowser.Controller/Channels/ChannelMediaInfo.cs2
-rw-r--r--MediaBrowser.Controller/Channels/IChannelFactory.cs5
-rw-r--r--MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs2
-rw-r--r--MediaBrowser.Controller/Drawing/IImageProcessor.cs7
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs9
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs9
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs9
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs2
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj1
-rw-r--r--MediaBrowser.Controller/Net/IHttpResultFactory.cs19
-rw-r--r--MediaBrowser.Controller/Net/IHttpServer.cs12
-rw-r--r--MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs15
-rw-r--r--MediaBrowser.Controller/Session/ISessionManager.cs11
-rw-r--r--MediaBrowser.Controller/Sync/ISyncManager.cs64
-rw-r--r--MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs134
-rw-r--r--MediaBrowser.Dlna/DlnaManager.cs4
-rw-r--r--MediaBrowser.Dlna/Main/DlnaEntryPoint.cs24
-rw-r--r--MediaBrowser.Dlna/MediaBrowser.Dlna.csproj11
-rw-r--r--MediaBrowser.Dlna/PlayTo/Device.cs1
-rw-r--r--MediaBrowser.Dlna/PlayTo/PlayToManager.cs271
-rw-r--r--MediaBrowser.Dlna/PlayTo/TransportCommands.cs1
-rw-r--r--MediaBrowser.Dlna/PlayTo/UpnpContainer.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/AndroidProfile.cs178
-rw-r--r--MediaBrowser.Dlna/Profiles/DefaultProfile.cs2
-rw-r--r--MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs8
-rw-r--r--MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs8
-rw-r--r--MediaBrowser.Dlna/Profiles/Windows81Profile.cs14
-rw-r--r--MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs15
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Android.xml69
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Default.xml8
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml8
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml8
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml8
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml14
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml14
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml66
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml80
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml10
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml8
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml8
-rw-r--r--MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs278
-rw-r--r--MediaBrowser.Dlna/Ssdp/DeviceDiscoveryInfo.cs21
-rw-r--r--MediaBrowser.Dlna/Ssdp/Extensions.cs (renamed from MediaBrowser.Dlna/PlayTo/Extensions.cs)2
-rw-r--r--MediaBrowser.Dlna/Ssdp/SsdpHandler.cs13
-rw-r--r--MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs11
-rw-r--r--MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs17
-rw-r--r--MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj69
-rw-r--r--MediaBrowser.Model.Portable/app.config15
-rw-r--r--MediaBrowser.Model.Portable/packages.config6
-rw-r--r--MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj27
-rw-r--r--MediaBrowser.Model/ApiClient/IApiClient.cs6
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs64
-rw-r--r--MediaBrowser.Model/Configuration/UserConfiguration.cs1
-rw-r--r--MediaBrowser.Model/Dlna/AudioOptions.cs6
-rw-r--r--MediaBrowser.Model/Dlna/DeviceProfile.cs6
-rw-r--r--MediaBrowser.Model/Dlna/StreamBuilder.cs159
-rw-r--r--MediaBrowser.Model/Dlna/StreamInfo.cs24
-rw-r--r--MediaBrowser.Model/Dlna/SubtitleProfile.cs8
-rw-r--r--MediaBrowser.Model/Dlna/TranscodingProfile.cs9
-rw-r--r--MediaBrowser.Model/Dlna/VideoOptions.cs6
-rw-r--r--MediaBrowser.Model/Dto/MediaSourceInfo.cs13
-rw-r--r--MediaBrowser.Model/Entities/CollectionType.cs3
-rw-r--r--MediaBrowser.Model/Extensions/ListHelper.cs17
-rw-r--r--MediaBrowser.Model/MediaBrowser.Model.csproj9
-rw-r--r--MediaBrowser.Model/MediaInfo/SubtitleFormat.cs1
-rw-r--r--MediaBrowser.Model/Sync/SyncJob.cs47
-rw-r--r--MediaBrowser.Model/Sync/SyncJobQuery.cs7
-rw-r--r--MediaBrowser.Model/Sync/SyncJobRequest.cs28
-rw-r--r--MediaBrowser.Model/Sync/SyncJobStatus.cs35
-rw-r--r--MediaBrowser.Model/Sync/SyncQuality.cs21
-rw-r--r--MediaBrowser.Model/Sync/SyncSchedule.cs12
-rw-r--r--MediaBrowser.Model/Sync/SyncScheduleQuery.cs7
-rw-r--r--MediaBrowser.Model/Sync/SyncScheduleRequest.cs23
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs1
-rw-r--r--MediaBrowser.Providers/MediaBrowser.Providers.csproj4
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeHelpers.cs5
-rw-r--r--MediaBrowser.Providers/Movies/MovieDbSearch.cs2
-rw-r--r--MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs3
-rw-r--r--MediaBrowser.Providers/Music/FanArtAlbumProvider.cs2
-rw-r--r--MediaBrowser.Providers/Music/FanArtArtistProvider.cs4
-rw-r--r--MediaBrowser.Providers/Music/LastFmImageProvider.cs164
-rw-r--r--MediaBrowser.Providers/Music/LastfmAlbumProvider.cs322
-rw-r--r--MediaBrowser.Providers/Music/LastfmArtistProvider.cs160
-rw-r--r--MediaBrowser.Providers/Music/LastfmHelper.cs76
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbItemProvider.cs45
-rw-r--r--MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs2
-rw-r--r--MediaBrowser.Providers/TV/TvdbSeriesProvider.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Channels/ChannelManager.cs58
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionManager.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs98
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs256
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs12
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs42
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs18
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs300
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs25
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs6
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/Extensions.cs28
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs918
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs157
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs192
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs402
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs144
-rw-r--r--MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs17
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs14
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserViewManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json185
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/da.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/de.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/el.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/es.json108
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json5
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/he.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/it.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json560
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json151
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json89
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json95
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json109
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json93
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ar.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ca.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/cs.json176
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/da.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/de.json36
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/el.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/en_GB.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/en_US.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/es.json36
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/es_ES.json30
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/es_MX.json34
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/fr.json38
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/he.json34
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/it.json32
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/kk.json44
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ko.json878
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ms.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/nb.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/nl.json38
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pl.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json46
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json36
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ru.json48
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/server.json13
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/sv.json40
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/vi.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json30
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj18
-rw-r--r--MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs5
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs59
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionManager.cs37
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs52
-rw-r--r--MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs165
-rw-r--r--MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs134
-rw-r--r--MediaBrowser.Server.Implementations/packages.config1
-rw-r--r--MediaBrowser.ServerApplication/ApplicationHost.cs30
-rw-r--r--MediaBrowser.Tests/Resolvers/TvUtilTests.cs5
-rw-r--r--MediaBrowser.WebDashboard/Api/DashboardService.cs10
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj27
-rw-r--r--MediaBrowser.sln24
-rw-r--r--Nuget/MediaBrowser.Common.Internal.nuspec4
-rw-r--r--Nuget/MediaBrowser.Common.nuspec10
-rw-r--r--Nuget/MediaBrowser.Model.Signed.nuspec6
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
-rw-r--r--README.md1
215 files changed, 8790 insertions, 2995 deletions
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index 09eb1ea41..727ee6fbc 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -125,7 +125,7 @@ namespace MediaBrowser.Api
return ResultFactory.GetStaticFileResult(Request, path);
}
- private readonly char[] _dashReplaceChars = new[] { '?', '/' };
+ private readonly char[] _dashReplaceChars = { '?', '/' };
private const char SlugChar = '-';
protected MusicArtist GetArtist(string name, ILibraryManager libraryManager)
@@ -168,6 +168,11 @@ namespace MediaBrowser.Api
{
var user = userManager.GetUserById(userId.Value);
+ if (user == null)
+ {
+ throw new ArgumentException("User not found");
+ }
+
return folder.GetRecursiveChildren(user);
}
@@ -177,6 +182,11 @@ namespace MediaBrowser.Api
{
var user = userManager.GetUserById(userId.Value);
+ if (user == null)
+ {
+ throw new ArgumentException("User not found");
+ }
+
return userManager.GetUserById(userId.Value).RootFolder.GetRecursiveChildren(user);
}
diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs
index c83028bb2..29848cfc0 100644
--- a/MediaBrowser.Api/ConfigurationService.cs
+++ b/MediaBrowser.Api/ConfigurationService.cs
@@ -122,42 +122,44 @@ namespace MediaBrowser.Api
return ToOptimizedResult(result);
}
+ const string XbmcMetadata = "Xbmc Nfo";
+ const string MediaBrowserMetadata = "Media Browser Xml";
+
public void Post(AutoSetMetadataOptions request)
{
var service = AutoDetectMetadataService();
Logger.Info("Setting preferred metadata format to " + service);
- _configurationManager.SetPreferredMetadataService(service);
+ var serviceToDisable = string.Equals(service, XbmcMetadata) ?
+ MediaBrowserMetadata :
+ XbmcMetadata;
+
+ _configurationManager.DisableMetadataService(serviceToDisable);
_configurationManager.SaveConfiguration();
}
private string AutoDetectMetadataService()
{
- const string xbmc = "Xbmc Nfo";
- const string mb = "Media Browser Xml";
-
var paths = _libraryManager.GetDefaultVirtualFolders()
.SelectMany(i => i.Locations)
.Distinct(StringComparer.OrdinalIgnoreCase)
.Select(i => new DirectoryInfo(i))
.ToList();
- if (paths.Select(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories))
- .SelectMany(i => i)
+ if (paths.SelectMany(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories))
.Any())
{
- return xbmc;
+ return XbmcMetadata;
}
- if (paths.Select(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories))
- .SelectMany(i => i)
+ if (paths.SelectMany(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories))
.Any(i => string.Equals(i.Name, "series.xml", StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, "movie.xml", StringComparison.OrdinalIgnoreCase)))
{
- return mb;
+ return MediaBrowserMetadata;
}
- return xbmc;
+ return XbmcMetadata;
}
/// <summary>
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index deaefe019..30db91da8 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -535,9 +535,6 @@ namespace MediaBrowser.Api.Images
throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", item.Name, request.Type));
}
- // See if we can avoid a file system lookup by looking for the file in ResolveArgs
- var originalFileImageDateModified = imageInfo.DateModified;
-
var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.ImageEnhancers.Where(i =>
{
try
@@ -564,25 +561,59 @@ namespace MediaBrowser.Api.Images
cacheDuration = TimeSpan.FromDays(365);
}
- // Avoid implicitly captured closure
- var currentItem = item;
- var currentRequest = request;
-
var responseHeaders = new Dictionary<string, string>
{
{"transferMode.dlna.org", "Interactive"},
{"realTimeInfo.dlna.org", "DLNA.ORG_TLAG=*"}
};
- return ToCachedResult(cacheGuid, originalFileImageDateModified, cacheDuration, () => new ImageWriter
+ return GetImageResult(item,
+ request,
+ imageInfo,
+ supportedImageEnhancers,
+ contentType,
+ cacheDuration,
+ responseHeaders)
+ .Result;
+ }
+
+ private async Task<object> GetImageResult(IHasImages item,
+ ImageRequest request,
+ ItemImageInfo image,
+ List<IImageEnhancer> enhancers,
+ string contentType,
+ TimeSpan? cacheDuration,
+ IDictionary<string,string> headers)
+ {
+ var cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art;
+
+ if (request.CropWhitespace.HasValue)
{
- Item = currentItem,
- Request = currentRequest,
- Enhancers = supportedImageEnhancers,
- Image = imageInfo,
- ImageProcessor = _imageProcessor
+ cropwhitespace = request.CropWhitespace.Value;
+ }
- }, contentType, responseHeaders);
+ var options = new ImageProcessingOptions
+ {
+ CropWhiteSpace = cropwhitespace,
+ Enhancers = enhancers,
+ Height = request.Height,
+ ImageIndex = request.Index ?? 0,
+ Image = image,
+ Item = item,
+ MaxHeight = request.MaxHeight,
+ MaxWidth = request.MaxWidth,
+ Quality = request.Quality,
+ Width = request.Width,
+ OutputFormat = request.Format,
+ AddPlayedIndicator = request.AddPlayedIndicator,
+ PercentPlayed = request.PercentPlayed,
+ UnplayedCount = request.UnplayedCount,
+ BackgroundColor = request.BackgroundColor
+ };
+
+ var file = await _imageProcessor.ProcessImage(options).ConfigureAwait(false);
+
+ return ResultFactory.GetStaticFileResult(Request, file, contentType, cacheDuration, FileShare.Read, headers);
}
private string GetMimeType(ImageOutputFormat format, string path)
@@ -603,6 +634,10 @@ namespace MediaBrowser.Api.Images
{
return Common.Net.MimeTypes.GetMimeType("i.png");
}
+ if (format == ImageOutputFormat.Webp)
+ {
+ return Common.Net.MimeTypes.GetMimeType("i.webp");
+ }
return Common.Net.MimeTypes.GetMimeType(path);
}
diff --git a/MediaBrowser.Api/Images/ImageWriter.cs b/MediaBrowser.Api/Images/ImageWriter.cs
deleted file mode 100644
index b6638d9df..000000000
--- a/MediaBrowser.Api/Images/ImageWriter.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using ServiceStack.Web;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Api.Images
-{
- /// <summary>
- /// Class ImageWriter
- /// </summary>
- public class ImageWriter : IStreamWriter, IHasOptions
- {
- public List<IImageEnhancer> Enhancers;
-
- /// <summary>
- /// Gets or sets the request.
- /// </summary>
- /// <value>The request.</value>
- public ImageRequest Request { get; set; }
- /// <summary>
- /// Gets or sets the item.
- /// </summary>
- /// <value>The item.</value>
- public IHasImages Item { get; set; }
- /// <summary>
- /// The original image date modified
- /// </summary>
- public ItemImageInfo Image;
-
- public IImageProcessor ImageProcessor { get; set; }
-
- /// <summary>
- /// The _options
- /// </summary>
- private readonly IDictionary<string, string> _options = new Dictionary<string, string>();
- /// <summary>
- /// Gets the options.
- /// </summary>
- /// <value>The options.</value>
- public IDictionary<string, string> Options
- {
- get { return _options; }
- }
-
- /// <summary>
- /// Writes to.
- /// </summary>
- /// <param name="responseStream">The response stream.</param>
- public void WriteTo(Stream responseStream)
- {
- var task = WriteToAsync(responseStream);
-
- Task.WaitAll(task);
- }
-
- /// <summary>
- /// Writes to async.
- /// </summary>
- /// <param name="responseStream">The response stream.</param>
- /// <returns>Task.</returns>
- private Task WriteToAsync(Stream responseStream)
- {
- var cropwhitespace = Request.Type == ImageType.Logo || Request.Type == ImageType.Art;
-
- if (Request.CropWhitespace.HasValue)
- {
- cropwhitespace = Request.CropWhitespace.Value;
- }
-
- var options = new ImageProcessingOptions
- {
- CropWhiteSpace = cropwhitespace,
- Enhancers = Enhancers,
- Height = Request.Height,
- ImageIndex = Request.Index ?? 0,
- Image = Image,
- Item = Item,
- MaxHeight = Request.MaxHeight,
- MaxWidth = Request.MaxWidth,
- Quality = Request.Quality,
- Width = Request.Width,
- OutputFormat = Request.Format,
- AddPlayedIndicator = Request.AddPlayedIndicator,
- PercentPlayed = Request.PercentPlayed,
- UnplayedCount = Request.UnplayedCount,
- BackgroundColor = Request.BackgroundColor
- };
-
- return ImageProcessor.ProcessImage(options, responseStream);
- }
- }
-}
diff --git a/MediaBrowser.Api/ItemLookupService.cs b/MediaBrowser.Api/ItemLookupService.cs
index a08f28533..2ce7997a1 100644
--- a/MediaBrowser.Api/ItemLookupService.cs
+++ b/MediaBrowser.Api/ItemLookupService.cs
@@ -224,16 +224,23 @@ namespace MediaBrowser.Api
}
}
- var task = item.RefreshMetadata(new MetadataRefreshOptions
+ var service = new ItemRefreshService(_libraryManager)
{
+ Logger = Logger,
+ Request = Request,
+ ResultFactory = ResultFactory,
+ SessionContext = SessionContext
+ };
+
+ service.Post(new RefreshItem
+ {
+ Id = request.Id,
MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
ImageRefreshMode = ImageRefreshMode.FullRefresh,
ReplaceAllMetadata = true,
- ReplaceAllImages = true
-
- }, CancellationToken.None);
-
- Task.WaitAll(task);
+ ReplaceAllImages = true,
+ Recursive = true
+ });
}
/// <summary>
diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index db6c6ce53..1fa1a5509 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -65,6 +65,11 @@ namespace MediaBrowser.Api
}
}
+ private DateTime NormalizeDateTime(DateTime val)
+ {
+ return DateTime.SpecifyKind(val, DateTimeKind.Utc);
+ }
+
private void UpdateItem(BaseItemDto request, BaseItem item)
{
item.Name = request.Name;
@@ -140,11 +145,11 @@ namespace MediaBrowser.Api
if (request.DateCreated.HasValue)
{
- item.DateCreated = request.DateCreated.Value.ToUniversalTime();
+ item.DateCreated = NormalizeDateTime(request.DateCreated.Value);
}
- item.EndDate = request.EndDate.HasValue ? request.EndDate.Value.ToUniversalTime() : (DateTime?)null;
- item.PremiereDate = request.PremiereDate.HasValue ? request.PremiereDate.Value.ToUniversalTime() : (DateTime?)null;
+ item.EndDate = request.EndDate.HasValue ? NormalizeDateTime(request.EndDate.Value) : (DateTime?)null;
+ item.PremiereDate = request.PremiereDate.HasValue ? NormalizeDateTime(request.PremiereDate.Value) : (DateTime?)null;
item.ProductionYear = request.ProductionYear;
item.OfficialRating = request.OfficialRating;
item.CustomRating = request.CustomRating;
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 10aa23126..f6588714e 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -220,7 +220,7 @@ namespace MediaBrowser.Api.Library
[Api(Description = "Reports that new episodes of a series have been added by an external source")]
public class PostUpdatedSeries : IReturnVoid
{
- [ApiMember(Name = "TvdbId", Description = "Tvdb Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ [ApiMember(Name = "TvdbId", Description = "Tvdb Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string TvdbId { get; set; }
}
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index 6a1e45e25..f3857ce30 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -85,7 +85,6 @@
<Compile Include="Images\ImageByNameService.cs" />
<Compile Include="Images\ImageRequest.cs" />
<Compile Include="Images\ImageService.cs" />
- <Compile Include="Images\ImageWriter.cs" />
<Compile Include="Music\InstantMixService.cs" />
<Compile Include="ItemLookupService.cs" />
<Compile Include="ItemRefreshService.cs" />
@@ -102,7 +101,6 @@
<Compile Include="PackageReviewService.cs" />
<Compile Include="PackageService.cs" />
<Compile Include="Playback\BifService.cs" />
- <Compile Include="Playback\EndlessStreamCopy.cs" />
<Compile Include="Playback\Hls\BaseHlsService.cs" />
<Compile Include="Playback\Hls\DynamicHlsService.cs" />
<Compile Include="Playback\Hls\HlsSegmentService.cs" />
@@ -123,6 +121,7 @@
<Compile Include="SearchService.cs" />
<Compile Include="SessionsService.cs" />
<Compile Include="SimilarItemsHelper.cs" />
+ <Compile Include="Sync\SyncService.cs" />
<Compile Include="SystemService.cs" />
<Compile Include="Movies\TrailersService.cs" />
<Compile Include="TvShowsService.cs" />
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 5d772527c..5cae4c3f7 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Api.Playback.Hls;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
@@ -608,7 +607,7 @@ namespace MediaBrowser.Api.Playback
}
}
- // TODO: Perhaps also use original_size=1920x800
+ // TODO: Perhaps also use original_size=1920x800 ??
return string.Format("subtitles=filename='{0}'{1},setpts=PTS -{2}/TB",
subtitlePath.Replace('\\', '/').Replace(":/", "\\:/"),
charsetParam,
@@ -818,7 +817,7 @@ namespace MediaBrowser.Api.Playback
state.MediaPath = streamInfo.Path;
state.InputProtocol = MediaProtocol.File;
- await Task.Delay(1000, cancellationTokenSource.Token).ConfigureAwait(false);
+ await Task.Delay(1500, cancellationTokenSource.Token).ConfigureAwait(false);
}
else if (!string.IsNullOrEmpty(streamInfo.Url))
{
@@ -839,7 +838,7 @@ namespace MediaBrowser.Api.Playback
state.MediaPath = streamInfo.Path;
state.InputProtocol = MediaProtocol.File;
- await Task.Delay(1000, cancellationTokenSource.Token).ConfigureAwait(false);
+ await Task.Delay(1500, cancellationTokenSource.Token).ConfigureAwait(false);
}
else if (!string.IsNullOrEmpty(streamInfo.Url))
{
@@ -944,19 +943,6 @@ namespace MediaBrowser.Api.Playback
{
await Task.Delay(100, cancellationTokenSource.Token).ConfigureAwait(false);
}
-
- // Allow a small amount of time to buffer a little
- // But not with HLS because it already has it's own wait
- if (state.IsInputVideo && TranscodingJobType != TranscodingJobType.Hls)
- {
- await Task.Delay(500, cancellationTokenSource.Token).ConfigureAwait(false);
- }
-
- // This is arbitrary, but add a little buffer time when internet streaming
- if (state.InputProtocol != MediaProtocol.File)
- {
- await Task.Delay(2500, cancellationTokenSource.Token).ConfigureAwait(false);
- }
}
private async void StartStreamingLog(StreamState state, Stream source, Stream target)
@@ -1459,11 +1445,6 @@ namespace MediaBrowser.Api.Playback
state.RunTimeTicks = recording.RunTimeTicks;
- if (recording.RecordingInfo.Status == RecordingStatus.InProgress)
- {
- await Task.Delay(1000, cancellationToken).ConfigureAwait(false);
- }
-
state.OutputAudioSync = "1000";
state.InputVideoSync = "-1";
state.InputAudioSync = "1";
diff --git a/MediaBrowser.Api/Playback/EndlessStreamCopy.cs b/MediaBrowser.Api/Playback/EndlessStreamCopy.cs
deleted file mode 100644
index 40586261f..000000000
--- a/MediaBrowser.Api/Playback/EndlessStreamCopy.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Api.Playback
-{
- public class EndlessStreamCopy
- {
- public async Task CopyStream(Stream source, Stream target, CancellationToken cancellationToken)
- {
- long position = 0;
-
- while (!cancellationToken.IsCancellationRequested)
- {
- await source.CopyToAsync(target, 81920, cancellationToken).ConfigureAwait(false);
-
- var fsPosition = source.Position;
-
- var bytesRead = fsPosition - position;
-
- //Logger.Debug("Streamed {0} bytes from file {1}", bytesRead, path);
-
- if (bytesRead == 0)
- {
- await Task.Delay(100, cancellationToken).ConfigureAwait(false);
- }
-
- position = fsPosition;
- }
- }
- }
-}
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index 8eff75533..317c4455a 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -104,7 +104,10 @@ namespace MediaBrowser.Api.Playback.Hls
}
else
{
- await ApiEntryPoint.Instance.KillTranscodingJobs(state.Request.DeviceId, TranscodingJobType.Hls, p => true, false).ConfigureAwait(false);
+ if (!string.IsNullOrWhiteSpace(state.Request.DeviceId))
+ {
+ await ApiEntryPoint.Instance.KillTranscodingJobs(state.Request.DeviceId, TranscodingJobType.Hls, p => true, false).ConfigureAwait(false);
+ }
// If the playlist doesn't already exist, startup ffmpeg
try
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index 6657bf6de..a098d26da 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -342,7 +342,7 @@ namespace MediaBrowser.Api.Playback.Hls
AppendPlaylist(builder, playlistUrl, totalBitrate);
- if (state.VideoRequest.VideoBitRate.HasValue)
+ if (EnableAdaptiveBitrateStreaming(state))
{
var requestedVideoBitrate = state.VideoRequest.VideoBitRate.Value;
@@ -360,6 +360,17 @@ namespace MediaBrowser.Api.Playback.Hls
return builder.ToString();
}
+ private bool EnableAdaptiveBitrateStreaming(StreamState state)
+ {
+ if (string.IsNullOrWhiteSpace(state.MediaPath))
+ {
+ // Opening live streams is so slow it's not even worth it
+ return false;
+ }
+
+ return state.VideoRequest.VideoBitRate.HasValue;
+ }
+
private void AppendPlaylist(StringBuilder builder, string url, int bitrate)
{
builder.AppendLine("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=" + bitrate.ToString(UsCulture));
@@ -368,8 +379,8 @@ namespace MediaBrowser.Api.Playback.Hls
private int GetBitrateVariation(int bitrate)
{
- // By default, vary by just 200k
- var variation = 200000;
+ // By default, vary by just 100k
+ var variation = 100000;
if (bitrate >= 10000000)
{
@@ -391,6 +402,10 @@ namespace MediaBrowser.Api.Playback.Hls
{
variation = 300000;
}
+ else if (bitrate >= 600000)
+ {
+ variation = 200000;
+ }
return variation;
}
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index dd8960649..80428269b 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -149,7 +149,7 @@ namespace MediaBrowser.Api.Playback.Progressive
using (state)
{
- return ResultFactory.GetStaticFileResult(Request, state.MediaPath, contentType, FileShare.Read, responseHeaders, isHeadRequest);
+ return ResultFactory.GetStaticFileResult(Request, state.MediaPath, contentType, null, FileShare.Read, responseHeaders, isHeadRequest);
}
}
@@ -160,7 +160,7 @@ namespace MediaBrowser.Api.Playback.Progressive
try
{
- return ResultFactory.GetStaticFileResult(Request, outputPath, contentType, FileShare.Read, responseHeaders, isHeadRequest);
+ return ResultFactory.GetStaticFileResult(Request, outputPath, contentType, null, FileShare.Read, responseHeaders, isHeadRequest);
}
finally
{
@@ -285,7 +285,8 @@ namespace MediaBrowser.Api.Playback.Progressive
state.Dispose();
}
- var result = new ProgressiveStreamWriter(outputPath, Logger, FileSystem);
+ var job = ApiEntryPoint.Instance.GetTranscodingJob(outputPath, TranscodingJobType.Progressive);
+ var result = new ProgressiveStreamWriter(outputPath, Logger, FileSystem, job);
result.Options["Content-Type"] = contentType;
diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
index 36ae7f100..a4c55443c 100644
--- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
+++ b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
@@ -12,6 +12,7 @@ namespace MediaBrowser.Api.Playback.Progressive
private string Path { get; set; }
private ILogger Logger { get; set; }
private readonly IFileSystem _fileSystem;
+ private readonly TranscodingJob _job;
/// <summary>
/// The _options
@@ -32,11 +33,12 @@ namespace MediaBrowser.Api.Playback.Progressive
/// <param name="path">The path.</param>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
- public ProgressiveStreamWriter(string path, ILogger logger, IFileSystem fileSystem)
+ public ProgressiveStreamWriter(string path, ILogger logger, IFileSystem fileSystem, TranscodingJob job)
{
Path = path;
Logger = logger;
_fileSystem = fileSystem;
+ _job = job;
}
/// <summary>
@@ -59,7 +61,8 @@ namespace MediaBrowser.Api.Playback.Progressive
{
try
{
- await new ProgressiveFileCopier(_fileSystem).StreamFile(Path, responseStream).ConfigureAwait(false);
+ await new ProgressiveFileCopier(_fileSystem, _job)
+ .StreamFile(Path, responseStream).ConfigureAwait(false);
}
catch
{
@@ -77,10 +80,12 @@ namespace MediaBrowser.Api.Playback.Progressive
public class ProgressiveFileCopier
{
private readonly IFileSystem _fileSystem;
+ private readonly TranscodingJob _job;
- public ProgressiveFileCopier(IFileSystem fileSystem)
+ public ProgressiveFileCopier(IFileSystem fileSystem, TranscodingJob job)
{
_fileSystem = fileSystem;
+ _job = job;
}
public async Task StreamFile(string path, Stream outputStream)
@@ -102,7 +107,10 @@ namespace MediaBrowser.Api.Playback.Progressive
if (bytesRead == 0)
{
- eofCount++;
+ if (_job == null || _job.HasExited)
+ {
+ eofCount++;
+ }
await Task.Delay(100).ConfigureAwait(false);
}
else
diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs
new file mode 100644
index 000000000..57b5fa3f9
--- /dev/null
+++ b/MediaBrowser.Api/Sync/SyncService.cs
@@ -0,0 +1,130 @@
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Sync;
+using ServiceStack;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Api.Sync
+{
+ [Route("/Sync/Jobs/{Id}", "DELETE", Summary = "Cancels a sync job.")]
+ public class CancelSyncJob : IReturnVoid
+ {
+ [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string Id { get; set; }
+ }
+
+ [Route("/Sync/Schedules/{Id}", "DELETE", Summary = "Cancels a sync job.")]
+ public class CancelSyncSchedule : IReturnVoid
+ {
+ [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string Id { get; set; }
+ }
+
+ [Route("/Sync/Jobs/{Id}", "GET", Summary = "Gets a sync job.")]
+ public class GetSyncJob : IReturn<SyncJob>
+ {
+ [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string Id { get; set; }
+ }
+
+ [Route("/Sync/Schedules/{Id}", "GET", Summary = "Gets a sync job.")]
+ public class GetSyncSchedule : IReturn<SyncSchedule>
+ {
+ [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string Id { get; set; }
+ }
+
+ [Route("/Sync/Jobs", "GET", Summary = "Gets sync jobs.")]
+ public class GetSyncJobs : IReturn<QueryResult<SyncJob>>
+ {
+ }
+
+ [Route("/Sync/Schedules", "GET", Summary = "Gets sync schedules.")]
+ public class GetSyncSchedules : IReturn<QueryResult<SyncSchedule>>
+ {
+ }
+
+ [Route("/Sync/Jobs", "POST", Summary = "Gets sync jobs.")]
+ public class CreateSyncJob : SyncJobRequest
+ {
+ }
+
+ [Route("/Sync/Schedules", "POST", Summary = "Gets sync schedules.")]
+ public class CreateSyncSchedule : SyncScheduleRequest
+ {
+ }
+
+ [Authenticated]
+ public class SyncService : BaseApiService
+ {
+ private readonly ISyncManager _syncManager;
+
+ public SyncService(ISyncManager syncManager)
+ {
+ _syncManager = syncManager;
+ }
+
+ public object Get(GetSyncJobs request)
+ {
+ var result = _syncManager.GetJobs(new SyncJobQuery
+ {
+
+ });
+
+ return ToOptimizedResult(result);
+ }
+
+ public object Get(GetSyncSchedules request)
+ {
+ var result = _syncManager.GetSchedules(new SyncScheduleQuery
+ {
+
+ });
+
+ return ToOptimizedResult(result);
+ }
+
+ public object Get(GetSyncJob request)
+ {
+ var result = _syncManager.GetJob(request.Id);
+
+ return ToOptimizedResult(result);
+ }
+
+ public object Get(GetSyncSchedule request)
+ {
+ var result = _syncManager.GetSchedule(request.Id);
+
+ return ToOptimizedResult(result);
+ }
+
+ public void Delete(CancelSyncJob request)
+ {
+ var task = _syncManager.CancelJob(request.Id);
+
+ Task.WaitAll(task);
+ }
+
+ public void Delete(CancelSyncSchedule request)
+ {
+ var task = _syncManager.CancelSchedule(request.Id);
+
+ Task.WaitAll(task);
+ }
+
+ public void Post(CreateSyncJob request)
+ {
+ var task = _syncManager.CreateJob(request);
+
+ Task.WaitAll(task);
+ }
+
+ public void Post(CreateSyncSchedule request)
+ {
+ var task = _syncManager.CreateSchedule(request);
+
+ Task.WaitAll(task);
+ }
+ }
+}
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index 0edd013df..b7a43c237 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
@@ -11,6 +12,7 @@ using ServiceStack.Text.Controller;
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Net;
using System.Threading.Tasks;
namespace MediaBrowser.Api
@@ -168,6 +170,7 @@ namespace MediaBrowser.Api
private readonly IDtoService _dtoService;
private readonly ISessionManager _sessionMananger;
private readonly IServerConfigurationManager _config;
+ private readonly INetworkManager _networkManager;
public IAuthorizationContext AuthorizationContext { get; set; }
@@ -178,12 +181,13 @@ namespace MediaBrowser.Api
/// <param name="dtoService">The dto service.</param>
/// <param name="sessionMananger">The session mananger.</param>
/// <exception cref="System.ArgumentNullException">xmlSerializer</exception>
- public UserService(IUserManager userManager, IDtoService dtoService, ISessionManager sessionMananger, IServerConfigurationManager config)
+ public UserService(IUserManager userManager, IDtoService dtoService, ISessionManager sessionMananger, IServerConfigurationManager config, INetworkManager networkManager)
{
_userManager = userManager;
_dtoService = dtoService;
_sessionMananger = sessionMananger;
_config = config;
+ _networkManager = networkManager;
}
public object Get(GetPublicUsers request)
@@ -200,18 +204,65 @@ namespace MediaBrowser.Api
});
}
- // TODO: Add or is authenticated
- if (_sessionMananger.IsInLocalNetwork(Request.RemoteIp))
+ // TODO: Uncomment this once all clients can handle an empty user list.
+ return Get(new GetUsers
{
- return Get(new GetUsers
+ IsHidden = false,
+ IsDisabled = false
+ });
+
+ //// TODO: Add or is authenticated
+ //if (Request.IsLocal || IsInLocalNetwork(Request.RemoteIp))
+ //{
+ // return Get(new GetUsers
+ // {
+ // IsHidden = false,
+ // IsDisabled = false
+ // });
+ //}
+
+ //// Return empty when external
+ //return ToOptimizedResult(new List<UserDto>());
+ }
+
+ private bool IsInLocalNetwork(string remoteEndpoint)
+ {
+ if (string.IsNullOrWhiteSpace(remoteEndpoint))
+ {
+ throw new ArgumentNullException("remoteEndpoint");
+ }
+
+ IPAddress address;
+ if (!IPAddress.TryParse(remoteEndpoint, out address))
+ {
+ return true;
+ }
+
+ const int lengthMatch = 4;
+
+ if (remoteEndpoint.Length >= lengthMatch)
+ {
+ var prefix = remoteEndpoint.Substring(0, lengthMatch);
+
+ if (_networkManager.GetLocalIpAddresses()
+ .Any(i => i.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)))
{
- IsHidden = false,
- IsDisabled = false
- });
+ return true;
+ }
}
- // Return empty when external
- return ToOptimizedResult(new List<UserDto>());
+ // Private address space:
+ // http://en.wikipedia.org/wiki/Private_network
+
+ return
+
+ // If url was requested with computer name, we may see this
+ remoteEndpoint.IndexOf("::", StringComparison.OrdinalIgnoreCase) != -1 ||
+
+ remoteEndpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) ||
+ remoteEndpoint.StartsWith("192.", StringComparison.OrdinalIgnoreCase) ||
+ remoteEndpoint.StartsWith("172.", StringComparison.OrdinalIgnoreCase) ||
+ remoteEndpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase);
}
/// <summary>
@@ -273,6 +324,10 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("User not found");
}
+ var revokeTask = _sessionMananger.RevokeUserTokens(user.Id.ToString("N"));
+
+ Task.WaitAll(revokeTask);
+
var task = _userManager.DeleteUser(user);
Task.WaitAll(task);
@@ -302,8 +357,25 @@ namespace MediaBrowser.Api
{
var auth = AuthorizationContext.GetAuthorizationInfo(Request);
+ if (string.IsNullOrWhiteSpace(auth.Client))
+ {
+ auth.Client = "Unknown app";
+ }
+ if (string.IsNullOrWhiteSpace(auth.Device))
+ {
+ auth.Device = "Unknown device";
+ }
+ if (string.IsNullOrWhiteSpace(auth.Version))
+ {
+ auth.Version = "Unknown version";
+ }
+ if (string.IsNullOrWhiteSpace(auth.DeviceId))
+ {
+ auth.DeviceId = "Unknown device id";
+ }
+
var result = _sessionMananger.AuthenticateNewSession(request.Username, request.Password, auth.Client, auth.Version,
- auth.DeviceId, auth.Device, Request.RemoteIp).Result;
+ auth.DeviceId, auth.Device, Request.RemoteIp, Request.IsLocal).Result;
return ToOptimizedResult(result);
}
diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
index 5efb39cbc..11a5cdf08 100644
--- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
+++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
@@ -107,7 +107,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
return client;
}
- private PropertyInfo _httpBehaviorPropertyInfo;
private WebRequest GetRequest(HttpRequestOptions options, string method, bool enableHttpCompression)
{
var request = (HttpWebRequest)WebRequest.Create(options.Url);
@@ -118,7 +117,11 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
- request.KeepAlive = options.EnableKeepAlive;
+ if (options.EnableKeepAlive)
+ {
+ request.KeepAlive = true;
+ }
+
request.Method = method;
request.Pipelined = true;
request.Timeout = 20000;
@@ -133,21 +136,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
request.Referer = options.Referer;
}
-#if !__MonoCS__
- if (options.EnableKeepAlive)
- {
- // This is a hack to prevent KeepAlive from getting disabled internally by the HttpWebRequest
- // May need to remove this for mono
- var sp = request.ServicePoint;
- if (_httpBehaviorPropertyInfo == null)
- {
- _httpBehaviorPropertyInfo = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
- }
-
- _httpBehaviorPropertyInfo.SetValue(sp, (byte)0, null);
- }
-#endif
-
return request;
}
diff --git a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
index 751ff55a5..e4c88e656 100644
--- a/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
+++ b/MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
@@ -177,17 +177,27 @@ namespace MediaBrowser.Common.Implementations.Updates
{
if (_lastPackageListResult != null)
{
- // Let dev users get results more often for testing purposes
- var cacheLength = _config.CommonConfiguration.SystemUpdateLevel == PackageVersionClass.Dev
- ? TimeSpan.FromMinutes(3)
- : TimeSpan.FromHours(6);
+ TimeSpan cacheLength;
+
+ switch (_config.CommonConfiguration.SystemUpdateLevel)
+ {
+ case PackageVersionClass.Beta:
+ cacheLength = TimeSpan.FromMinutes(30);
+ break;
+ case PackageVersionClass.Dev:
+ cacheLength = TimeSpan.FromMinutes(3);
+ break;
+ default:
+ cacheLength = TimeSpan.FromHours(6);
+ break;
+ }
if ((DateTime.UtcNow - _lastPackageListResult.Item2) < cacheLength)
{
return _lastPackageListResult.Item1;
}
}
-
+
using (var json = await _httpClient.Get(Constants.Constants.MbAdminUrl + "service/MB3Packages.json", cancellationToken).ConfigureAwait(false))
{
cancellationToken.ThrowIfCancellationRequested();
@@ -274,7 +284,7 @@ namespace MediaBrowser.Common.Implementations.Updates
{
var packages = await GetAvailablePackages(CancellationToken.None).ConfigureAwait(false);
- var package = packages.FirstOrDefault(p => string.Equals(p.guid, guid ?? "none", StringComparison.OrdinalIgnoreCase))
+ var package = packages.FirstOrDefault(p => string.Equals(p.guid, guid ?? "none", StringComparison.OrdinalIgnoreCase))
?? packages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase));
if (package == null)
@@ -310,7 +320,7 @@ namespace MediaBrowser.Common.Implementations.Updates
/// <returns>PackageVersionInfo.</returns>
public PackageVersionInfo GetLatestCompatibleVersion(IEnumerable<PackageInfo> availablePackages, string name, string guid, Version currentServerVersion, PackageVersionClass classification = PackageVersionClass.Release)
{
- var package = availablePackages.FirstOrDefault(p => string.Equals(p.guid, guid ?? "none", StringComparison.OrdinalIgnoreCase))
+ var package = availablePackages.FirstOrDefault(p => string.Equals(p.guid, guid ?? "none", StringComparison.OrdinalIgnoreCase))
?? availablePackages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase));
if (package == null)
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index 9d5984317..f1f8ebca4 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -78,7 +78,6 @@
<Compile Include="Net\INetworkManager.cs" />
<Compile Include="Net\IWebSocket.cs" />
<Compile Include="Net\IWebSocketConnection.cs" />
- <Compile Include="Net\IWebSocketServer.cs" />
<Compile Include="Net\MimeTypes.cs" />
<Compile Include="Net\WebSocketConnectEventArgs.cs" />
<Compile Include="Net\WebSocketMessageInfo.cs" />
diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs
index 3cba84334..a2b42dedb 100644
--- a/MediaBrowser.Common/Net/HttpRequestOptions.cs
+++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs
@@ -106,7 +106,6 @@ namespace MediaBrowser.Common.Net
{
EnableHttpCompression = true;
BufferContent = true;
- EnableKeepAlive = true;
RequestHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
diff --git a/MediaBrowser.Common/Net/IServerManager.cs b/MediaBrowser.Common/Net/IServerManager.cs
index f81c99ac6..f6ac0ab68 100644
--- a/MediaBrowser.Common/Net/IServerManager.cs
+++ b/MediaBrowser.Common/Net/IServerManager.cs
@@ -11,12 +11,6 @@ namespace MediaBrowser.Common.Net
public interface IServerManager : IDisposable
{
/// <summary>
- /// Gets a value indicating whether [supports web socket].
- /// </summary>
- /// <value><c>true</c> if [supports web socket]; otherwise, <c>false</c>.</value>
- bool SupportsNativeWebSocket { get; }
-
- /// <summary>
/// Gets the web socket port number.
/// </summary>
/// <value>The web socket port number.</value>
@@ -26,13 +20,7 @@ namespace MediaBrowser.Common.Net
/// Starts this instance.
/// </summary>
/// <param name="urlPrefixes">The URL prefixes.</param>
- /// <param name="enableHttpLogging">if set to <c>true</c> [enable HTTP logging].</param>
- void Start(IEnumerable<string> urlPrefixes, bool enableHttpLogging);
-
- /// <summary>
- /// Starts the web socket server.
- /// </summary>
- void StartWebSocketServer();
+ void Start(IEnumerable<string> urlPrefixes);
/// <summary>
/// Sends a message to all clients currently connected via a web socket
diff --git a/MediaBrowser.Common/Net/IWebSocketServer.cs b/MediaBrowser.Common/Net/IWebSocketServer.cs
deleted file mode 100644
index 187e03e09..000000000
--- a/MediaBrowser.Common/Net/IWebSocketServer.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-
-namespace MediaBrowser.Common.Net
-{
- /// <summary>
- /// Interface IWebSocketServer
- /// </summary>
- public interface IWebSocketServer : IDisposable
- {
- /// <summary>
- /// Starts the specified port number.
- /// </summary>
- /// <param name="portNumber">The port number.</param>
- void Start(int portNumber);
-
- /// <summary>
- /// Stops this instance.
- /// </summary>
- void Stop();
-
- /// <summary>
- /// Occurs when [web socket connected].
- /// </summary>
- event EventHandler<WebSocketConnectEventArgs> WebSocketConnected;
-
- /// <summary>
- /// Gets the port.
- /// </summary>
- /// <value>The port.</value>
- int Port { get; }
- }
-}
diff --git a/MediaBrowser.Common/Net/MimeTypes.cs b/MediaBrowser.Common/Net/MimeTypes.cs
index dcac5e7ba..0740bf6d1 100644
--- a/MediaBrowser.Common/Net/MimeTypes.cs
+++ b/MediaBrowser.Common/Net/MimeTypes.cs
@@ -143,6 +143,10 @@ namespace MediaBrowser.Common.Net
{
return "image/png";
}
+ if (ext.Equals(".webp", StringComparison.OrdinalIgnoreCase))
+ {
+ return "image/webp";
+ }
if (ext.Equals(".ico", StringComparison.OrdinalIgnoreCase))
{
return "image/vnd.microsoft.icon";
diff --git a/MediaBrowser.Controller/Channels/ChannelFolderItem.cs b/MediaBrowser.Controller/Channels/ChannelFolderItem.cs
index afc6493e4..d6e315fd1 100644
--- a/MediaBrowser.Controller/Channels/ChannelFolderItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelFolderItem.cs
@@ -15,7 +15,6 @@ namespace MediaBrowser.Controller.Channels
public ChannelFolderType ChannelFolderType { get; set; }
public string OriginalImageUrl { get; set; }
- public List<string> Tags { get; set; }
protected override bool GetBlockUnratedValue(UserConfiguration config)
{
@@ -31,11 +30,6 @@ namespace MediaBrowser.Controller.Channels
}
}
- public ChannelFolderItem()
- {
- Tags = new List<string>();
- }
-
public override string GetUserDataKey()
{
return ExternalId;
diff --git a/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs b/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs
index 64b480414..f16fd1120 100644
--- a/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs
+++ b/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs
@@ -29,6 +29,8 @@ namespace MediaBrowser.Controller.Channels
public MediaProtocol Protocol { get; set; }
+ public long? RunTimeTicks { get; set; }
+
public ChannelMediaInfo()
{
RequiredHttpHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
diff --git a/MediaBrowser.Controller/Channels/IChannelFactory.cs b/MediaBrowser.Controller/Channels/IChannelFactory.cs
index e275227ff..c7ed92586 100644
--- a/MediaBrowser.Controller/Channels/IChannelFactory.cs
+++ b/MediaBrowser.Controller/Channels/IChannelFactory.cs
@@ -6,4 +6,9 @@ namespace MediaBrowser.Controller.Channels
{
IEnumerable<IChannel> GetChannels();
}
+
+ public interface IFactoryChannel
+ {
+
+ }
} \ No newline at end of file
diff --git a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
index c3d1796f9..aac8cda2e 100644
--- a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
+++ b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
@@ -31,6 +31,6 @@ namespace MediaBrowser.Controller.Configuration
/// Sets the preferred metadata service.
/// </summary>
/// <param name="service">The service.</param>
- void SetPreferredMetadataService(string service);
+ void DisableMetadataService(string service);
}
}
diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
index 51466c4f9..a0128f111 100644
--- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs
+++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
@@ -73,6 +73,13 @@ namespace MediaBrowser.Controller.Drawing
/// <param name="toStream">To stream.</param>
/// <returns>Task.</returns>
Task ProcessImage(ImageProcessingOptions options, Stream toStream);
+
+ /// <summary>
+ /// Processes the image.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task.</returns>
+ Task<string> ProcessImage(ImageProcessingOptions options);
/// <summary>
/// Gets the enhanced image.
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
index 9ddd10f4a..695b1fd57 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
@@ -11,7 +11,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// <summary>
/// Class MusicAlbum
/// </summary>
- public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags, IHasLookupInfo<AlbumInfo>
+ public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<AlbumInfo>
{
public List<Guid> SoundtrackIds { get; set; }
@@ -19,7 +19,6 @@ namespace MediaBrowser.Controller.Entities.Audio
{
Artists = new List<string>();
SoundtrackIds = new List<Guid>();
- Tags = new List<string>();
}
[IgnoreDataMember]
@@ -66,12 +65,6 @@ namespace MediaBrowser.Controller.Entities.Audio
}
/// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
- /// <summary>
/// Gets the tracks.
/// </summary>
/// <value>The tracks.</value>
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 0a5d8eec0..1544da7bc 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -13,16 +13,9 @@ namespace MediaBrowser.Controller.Entities.Audio
/// <summary>
/// Class MusicArtist
/// </summary>
- public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations, IHasLookupInfo<ArtistInfo>
+ public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasProductionLocations, IHasLookupInfo<ArtistInfo>
{
public bool IsAccessedByName { get; set; }
-
- /// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
public List<string> ProductionLocations { get; set; }
public override bool IsFolder
@@ -60,7 +53,6 @@ namespace MediaBrowser.Controller.Entities.Audio
public MusicArtist()
{
- Tags = new List<string>();
ProductionLocations = new List<string>();
}
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index b886cef19..12afe26b6 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -21,12 +21,13 @@ namespace MediaBrowser.Controller.Entities
/// <summary>
/// Class Folder
/// </summary>
- public class Folder : BaseItem, IHasThemeMedia
+ public class Folder : BaseItem, IHasThemeMedia, IHasTags
{
public static IUserManager UserManager { get; set; }
public List<Guid> ThemeSongIds { get; set; }
public List<Guid> ThemeVideoIds { get; set; }
+ public List<string> Tags { get; set; }
public Folder()
{
@@ -34,6 +35,7 @@ namespace MediaBrowser.Controller.Entities
ThemeSongIds = new List<Guid>();
ThemeVideoIds = new List<Guid>();
+ Tags = new List<string>();
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index b0cb549f4..0d2be9f74 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -14,13 +14,12 @@ namespace MediaBrowser.Controller.Entities.Movies
/// <summary>
/// Class BoxSet
/// </summary>
- public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer
+ public class BoxSet : Folder, IHasTrailers, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer
{
public BoxSet()
{
RemoteTrailers = new List<MediaUrl>();
LocalTrailerIds = new List<Guid>();
- Tags = new List<string>();
DisplayOrder = ItemSortBy.PremiereDate;
Keywords = new List<string>();
@@ -38,7 +37,6 @@ namespace MediaBrowser.Controller.Entities.Movies
/// Gets or sets the tags.
/// </summary>
/// <value>The tags.</value>
- public List<string> Tags { get; set; }
public List<string> Keywords { get; set; }
public string PreferredMetadataLanguage { get; set; }
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index 8271a3df2..0d934ad0a 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -7,8 +7,15 @@ namespace MediaBrowser.Controller.Entities
/// <summary>
/// Class Studio
/// </summary>
- public class Studio : BaseItem, IItemByName
+ public class Studio : BaseItem, IItemByName, IHasTags
{
+ public List<string> Tags { get; set; }
+
+ public Studio()
+ {
+ Tags = new List<string>();
+ }
+
/// <summary>
/// Gets the user data key.
/// </summary>
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index a9a2b024f..9c2ed27bb 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// <summary>
/// Class Series
/// </summary>
- public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>
+ public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>
{
public List<Guid> SpecialFeatureIds { get; set; }
public List<Guid> SoundtrackIds { get; set; }
@@ -36,7 +36,6 @@ namespace MediaBrowser.Controller.Entities.TV
SoundtrackIds = new List<Guid>();
RemoteTrailers = new List<MediaUrl>();
LocalTrailerIds = new List<Guid>();
- Tags = new List<string>();
DisplaySpecialsWithSeasons = true;
}
@@ -52,12 +51,6 @@ namespace MediaBrowser.Controller.Entities.TV
public string DisplayOrder { get; set; }
/// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
- /// <summary>
/// Gets or sets the status.
/// </summary>
/// <value>The status.</value>
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 4d50e61ae..5685edc81 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -326,7 +326,7 @@ namespace MediaBrowser.Controller.Entities
{
if ((i.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
- return !string.Equals(i.FullName, path, StringComparison.OrdinalIgnoreCase) && EntityResolutionHelper.IsMultiPartFolder(i.FullName) && EntityResolutionHelper.IsMultiPartFile(i.Name);
+ return !string.Equals(i.FullName, path, StringComparison.OrdinalIgnoreCase) && EntityResolutionHelper.IsMultiPartFolder(i.FullName);
}
return false;
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 1c60ea8e6..fb50deb66 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -319,6 +319,7 @@
<Compile Include="Sorting\SortExtensions.cs" />
<Compile Include="Subtitles\SubtitleResponse.cs" />
<Compile Include="Subtitles\SubtitleSearchRequest.cs" />
+ <Compile Include="Sync\ISyncManager.cs" />
<Compile Include="Themes\IAppThemeManager.cs" />
<Compile Include="Themes\InternalThemeImage.cs" />
</ItemGroup>
diff --git a/MediaBrowser.Controller/Net/IHttpResultFactory.cs b/MediaBrowser.Controller/Net/IHttpResultFactory.cs
index f7984c32c..665c1f8d9 100644
--- a/MediaBrowser.Controller/Net/IHttpResultFactory.cs
+++ b/MediaBrowser.Controller/Net/IHttpResultFactory.cs
@@ -80,9 +80,13 @@ namespace MediaBrowser.Controller.Net
/// <param name="responseHeaders">The response headers.</param>
/// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
/// <returns>System.Object.</returns>
- object GetStaticResult(IRequest requestContext, Guid cacheKey, DateTime? lastDateModified,
- TimeSpan? cacheDuration, string contentType, Func<Task<Stream>> factoryFn,
- IDictionary<string, string> responseHeaders = null, bool isHeadRequest = false);
+ object GetStaticResult(IRequest requestContext,
+ Guid cacheKey,
+ DateTime? lastDateModified,
+ TimeSpan? cacheDuration,
+ string contentType, Func<Task<Stream>> factoryFn,
+ IDictionary<string, string> responseHeaders = null,
+ bool isHeadRequest = false);
/// <summary>
/// Gets the static file result.
@@ -101,11 +105,18 @@ namespace MediaBrowser.Controller.Net
/// <param name="requestContext">The request context.</param>
/// <param name="path">The path.</param>
/// <param name="contentType">Type of the content.</param>
+ /// <param name="cacheCuration">The cache curation.</param>
/// <param name="fileShare">The file share.</param>
/// <param name="responseHeaders">The response headers.</param>
/// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
/// <returns>System.Object.</returns>
- object GetStaticFileResult(IRequest requestContext, string path, string contentType, FileShare fileShare = FileShare.Read, IDictionary<string, string> responseHeaders = null, bool isHeadRequest = false);
+ object GetStaticFileResult(IRequest requestContext,
+ string path,
+ string contentType,
+ TimeSpan? cacheCuration = null,
+ FileShare fileShare = FileShare.Read,
+ IDictionary<string, string> responseHeaders = null,
+ bool isHeadRequest = false);
/// <summary>
/// Gets the optimized serialized result using cache.
diff --git a/MediaBrowser.Controller/Net/IHttpServer.cs b/MediaBrowser.Controller/Net/IHttpServer.cs
index 20f07c74d..5b179d479 100644
--- a/MediaBrowser.Controller/Net/IHttpServer.cs
+++ b/MediaBrowser.Controller/Net/IHttpServer.cs
@@ -22,12 +22,6 @@ namespace MediaBrowser.Controller.Net
void StartServer(IEnumerable<string> urlPrefixes);
/// <summary>
- /// Gets a value indicating whether [supports web sockets].
- /// </summary>
- /// <value><c>true</c> if [supports web sockets]; otherwise, <c>false</c>.</value>
- bool SupportsWebSockets { get; }
-
- /// <summary>
/// Gets the local end points.
/// </summary>
/// <value>The local end points.</value>
@@ -39,12 +33,6 @@ namespace MediaBrowser.Controller.Net
void Stop();
/// <summary>
- /// Gets or sets a value indicating whether [enable HTTP request logging].
- /// </summary>
- /// <value><c>true</c> if [enable HTTP request logging]; otherwise, <c>false</c>.</value>
- bool EnableHttpRequestLogging { get; set; }
-
- /// <summary>
/// Occurs when [web socket connected].
/// </summary>
event EventHandler<WebSocketConnectEventArgs> WebSocketConnected;
diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs
index 42178c44c..ff94ceff3 100644
--- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs
+++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs
@@ -15,6 +15,21 @@ namespace MediaBrowser.Controller.Resolvers
public static class EntityResolutionHelper
{
/// <summary>
+ /// Any folder named in this list will be ignored - can be added to at runtime for extensibility
+ /// </summary>
+ public static readonly List<string> IgnoreFolders = new List<string>
+ {
+ "metadata",
+ "ps3_update",
+ "ps3_vprm",
+ "extrafanart",
+ "extrathumbs",
+ ".actors",
+ ".wd_tv"
+
+ };
+
+ /// <summary>
/// Any extension in this list is considered a video file - can be added to at runtime for extensibility
/// </summary>
public static List<string> VideoFileExtensions = new List<string>
diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs
index c8ae0e6a7..e37a13923 100644
--- a/MediaBrowser.Controller/Session/ISessionManager.cs
+++ b/MediaBrowser.Controller/Session/ISessionManager.cs
@@ -218,6 +218,7 @@ namespace MediaBrowser.Controller.Session
/// <param name="deviceId">The device identifier.</param>
/// <param name="deviceName">Name of the device.</param>
/// <param name="remoteEndPoint">The remote end point.</param>
+ /// <param name="isLocal">if set to <c>true</c> [is local].</param>
/// <returns>Task{SessionInfo}.</returns>
Task<AuthenticationResult> AuthenticateNewSession(string username,
string password,
@@ -225,7 +226,8 @@ namespace MediaBrowser.Controller.Session
string appVersion,
string deviceId,
string deviceName,
- string remoteEndPoint);
+ string remoteEndPoint,
+ bool isLocal);
/// <summary>
/// Reports the capabilities.
@@ -282,12 +284,5 @@ namespace MediaBrowser.Controller.Session
/// <param name="id">The identifier.</param>
/// <returns>Task.</returns>
Task RevokeToken(string id);
-
- /// <summary>
- /// Determines whether the specified remote endpoint is local.
- /// </summary>
- /// <param name="remoteEndpoint">The remote endpoint.</param>
- /// <returns><c>true</c> if the specified remote endpoint is local; otherwise, <c>false</c>.</returns>
- bool IsInLocalNetwork(string remoteEndpoint);
}
} \ No newline at end of file
diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs
new file mode 100644
index 000000000..63a5d8a7c
--- /dev/null
+++ b/MediaBrowser.Controller/Sync/ISyncManager.cs
@@ -0,0 +1,64 @@
+using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Sync;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Sync
+{
+ public interface ISyncManager
+ {
+ /// <summary>
+ /// Creates the job.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ /// <returns>Task.</returns>
+ Task<List<SyncJob>> CreateJob(SyncJobRequest request);
+
+ /// <summary>
+ /// Creates the schedule.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ /// <returns>Task.</returns>
+ Task<SyncSchedule> CreateSchedule(SyncScheduleRequest request);
+
+ /// <summary>
+ /// Gets the jobs.
+ /// </summary>
+ /// <returns>QueryResult&lt;SyncJob&gt;.</returns>
+ QueryResult<SyncJob> GetJobs(SyncJobQuery query);
+
+ /// <summary>
+ /// Gets the schedules.
+ /// </summary>
+ /// <returns>QueryResult&lt;SyncSchedule&gt;.</returns>
+ QueryResult<SyncSchedule> GetSchedules(SyncScheduleQuery query);
+
+ /// <summary>
+ /// Gets the job.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>SyncJob.</returns>
+ SyncJob GetJob(string id);
+
+ /// <summary>
+ /// Gets the schedule.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>SyncSchedule.</returns>
+ SyncSchedule GetSchedule(string id);
+
+ /// <summary>
+ /// Cancels the job.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task CancelJob(string id);
+
+ /// <summary>
+ /// Cancels the schedule.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task CancelSchedule(string id);
+ }
+}
diff --git a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
new file mode 100644
index 000000000..847d856fb
--- /dev/null
+++ b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
@@ -0,0 +1,134 @@
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Dlna.PlayTo;
+using MediaBrowser.Dlna.Ssdp;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Events;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Dlna.Channels
+{
+ public class DlnaChannelFactory : IChannelFactory, IDisposable
+ {
+ private DeviceDiscovery _deviceDiscovery;
+
+ private readonly object _syncLock = new object();
+ private readonly List<Device> _servers = new List<Device>();
+
+ public static DlnaChannelFactory Instance;
+
+ public DlnaChannelFactory()
+ {
+ Instance = this;
+ }
+
+ internal void Start(DeviceDiscovery deviceDiscovery)
+ {
+ _deviceDiscovery = deviceDiscovery;
+ deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered;
+ }
+
+ void deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<DeviceDiscoveryInfo> e)
+ {
+ var usn = e.Argument.Usn;
+ var nt = e.Argument.Nt;
+
+ // It has to report that it's a media renderer
+ if (usn.IndexOf("ContentDirectory:", StringComparison.OrdinalIgnoreCase) == -1 &&
+ nt.IndexOf("ContentDirectory:", StringComparison.OrdinalIgnoreCase) == -1)
+ {
+ return;
+ }
+
+ if (_servers.Any(i => usn.IndexOf(i.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1))
+ {
+ return;
+ }
+
+ lock (_syncLock)
+ {
+ _servers.Add(e.Argument.Device);
+ }
+ }
+
+ public IEnumerable<IChannel> GetChannels()
+ {
+ return _servers.Select(i => new ServerChannel(i)).ToList();
+ }
+
+ public void Dispose()
+ {
+ if (_deviceDiscovery != null)
+ {
+ _deviceDiscovery.DeviceDiscovered -= deviceDiscovery_DeviceDiscovered;
+ }
+ }
+ }
+
+ public class ServerChannel : IChannel, IFactoryChannel
+ {
+ private readonly Device _device;
+
+ public ServerChannel(Device device)
+ {
+ _device = device;
+ }
+
+ public string Name
+ {
+ get { return _device.Properties.Name; }
+ }
+
+ public string Description
+ {
+ get { return _device.Properties.ModelDescription; }
+ }
+
+ public string DataVersion
+ {
+ get { return "1"; }
+ }
+
+ public string HomePageUrl
+ {
+ get { return _device.Properties.ModelUrl; }
+ }
+
+ public ChannelParentalRating ParentalRating
+ {
+ get { return ChannelParentalRating.GeneralAudience; }
+ }
+
+ public InternalChannelFeatures GetChannelFeatures()
+ {
+ return new InternalChannelFeatures
+ {
+
+ };
+ }
+
+ public bool IsEnabledFor(string userId)
+ {
+ return true;
+ }
+
+ public Task<ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(new ChannelItemResult());
+ }
+
+ public Task<DynamicImageResponse> GetChannelImage(ImageType type, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(new DynamicImageResponse());
+ }
+
+ public IEnumerable<ImageType> GetSupportedChannelImages()
+ {
+ return new List<ImageType>();
+ }
+ }
+}
diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs
index 21476c5d9..333521bb5 100644
--- a/MediaBrowser.Dlna/DlnaManager.cs
+++ b/MediaBrowser.Dlna/DlnaManager.cs
@@ -75,6 +75,10 @@ namespace MediaBrowser.Dlna
new LgTvProfile(),
new Foobar2000Profile(),
new MediaMonkeyProfile(),
+ new Windows81Profile(),
+ //new WindowsMediaCenterProfile(),
+ new WindowsPhoneProfile(),
+ new AndroidProfile(),
new DefaultProfile()
};
diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
index 5f2c1c49a..e2772b036 100644
--- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
+++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
@@ -9,6 +9,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Session;
+using MediaBrowser.Dlna.Channels;
using MediaBrowser.Dlna.PlayTo;
using MediaBrowser.Dlna.Ssdp;
using MediaBrowser.Model.Logging;
@@ -35,6 +36,7 @@ namespace MediaBrowser.Dlna.Main
private readonly IImageProcessor _imageProcessor;
private SsdpHandler _ssdpHandler;
+ private DeviceDiscovery _deviceDiscovery;
private readonly List<Guid> _registeredServerIds = new List<Guid>();
private bool _dlnaServerStarted;
@@ -60,6 +62,8 @@ namespace MediaBrowser.Dlna.Main
ReloadComponents();
_config.NamedConfigurationUpdated += _config_NamedConfigurationUpdated;
+
+ DlnaChannelFactory.Instance.Start(_deviceDiscovery);
}
void _config_NamedConfigurationUpdated(object sender, ConfigurationUpdateEventArgs e)
@@ -104,10 +108,14 @@ namespace MediaBrowser.Dlna.Main
_ssdpHandler = new SsdpHandler(_logger, _config, GenerateServerSignature());
_ssdpHandler.Start();
+
+ _deviceDiscovery = new DeviceDiscovery(_logger, _config, _httpClient, _ssdpHandler);
+
+ _deviceDiscovery.Start();
}
catch (Exception ex)
{
- _logger.ErrorException("Error starting Dlna server", ex);
+ _logger.ErrorException("Error starting ssdp handlers", ex);
}
}
@@ -115,6 +123,15 @@ namespace MediaBrowser.Dlna.Main
{
try
{
+ _deviceDiscovery.Dispose();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error disposing device discovery", ex);
+ }
+
+ try
+ {
_ssdpHandler.Dispose();
}
catch (Exception ex)
@@ -192,16 +209,15 @@ namespace MediaBrowser.Dlna.Main
try
{
_manager = new PlayToManager(_logger,
- _config,
_sessionManager,
- _httpClient,
_itemRepo,
_libraryManager,
_userManager,
_dlnaManager,
_appHost,
_imageProcessor,
- _ssdpHandler);
+ _ssdpHandler,
+ _deviceDiscovery);
_manager.Start();
}
diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
index 94f9c0391..ec8527738 100644
--- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
+++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
@@ -51,6 +51,7 @@
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
+ <Compile Include="Channels\DlnaChannelFactory.cs" />
<Compile Include="ConfigurationExtension.cs" />
<Compile Include="ConnectionManager\ConnectionManager.cs" />
<Compile Include="ConnectionManager\ConnectionManagerXmlBuilder.cs" />
@@ -71,7 +72,8 @@
<Compile Include="Common\DeviceService.cs" />
<Compile Include="Didl\DidlBuilder.cs" />
<Compile Include="PlayTo\PlayToController.cs" />
- <Compile Include="PlayTo\Extensions.cs" />
+ <Compile Include="Ssdp\DeviceDiscoveryInfo.cs" />
+ <Compile Include="Ssdp\Extensions.cs" />
<Compile Include="PlayTo\PlaybackProgressEventArgs.cs" />
<Compile Include="PlayTo\PlaybackStoppedEventArgs.cs" />
<Compile Include="PlayTo\PlaylistItem.cs">
@@ -82,6 +84,7 @@
<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" />
@@ -97,6 +100,7 @@
<Compile Include="Service\ServiceXmlBuilder.cs" />
<Compile Include="Ssdp\Datagram.cs" />
<Compile Include="Server\DescriptionXmlBuilder.cs" />
+ <Compile Include="Ssdp\DeviceDiscovery.cs" />
<Compile Include="Ssdp\SsdpHelper.cs" />
<Compile Include="PlayTo\SsdpHttpClient.cs" />
<Compile Include="Common\StateVariable.cs" />
@@ -174,6 +178,11 @@
<ItemGroup>
<EmbeddedResource Include="Profiles\Xml\MediaMonkey.xml" />
</ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Profiles\Xml\Android.xml" />
+ <EmbeddedResource Include="Profiles\Xml\Windows 8 RT.xml" />
+ <EmbeddedResource Include="Profiles\Xml\Windows Phone.xml" />
+ </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.Dlna/PlayTo/Device.cs b/MediaBrowser.Dlna/PlayTo/Device.cs
index 058074027..045217a57 100644
--- a/MediaBrowser.Dlna/PlayTo/Device.cs
+++ b/MediaBrowser.Dlna/PlayTo/Device.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Dlna.Common;
+using MediaBrowser.Dlna.Ssdp;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
diff --git a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
index 1f8c33ee7..165f788e8 100644
--- a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
+++ b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
@@ -1,51 +1,39 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Session;
using MediaBrowser.Dlna.Ssdp;
+using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
-using System.Net.NetworkInformation;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
namespace MediaBrowser.Dlna.PlayTo
{
class PlayToManager : IDisposable
{
- private bool _disposed;
private readonly ILogger _logger;
private readonly ISessionManager _sessionManager;
- private readonly IHttpClient _httpClient;
- private readonly CancellationTokenSource _tokenSource;
private readonly IItemRepository _itemRepository;
private readonly ILibraryManager _libraryManager;
private readonly IUserManager _userManager;
private readonly IDlnaManager _dlnaManager;
- private readonly IServerConfigurationManager _config;
private readonly IServerApplicationHost _appHost;
private readonly IImageProcessor _imageProcessor;
private readonly SsdpHandler _ssdpHandler;
+ private readonly DeviceDiscovery _deviceDiscovery;
- public PlayToManager(ILogger logger, IServerConfigurationManager config, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepository, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, SsdpHandler ssdpHandler)
+ public PlayToManager(ILogger logger, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, SsdpHandler ssdpHandler, DeviceDiscovery deviceDiscovery)
{
- _tokenSource = new CancellationTokenSource();
-
_logger = logger;
_sessionManager = sessionManager;
- _httpClient = httpClient;
_itemRepository = itemRepository;
_libraryManager = libraryManager;
_userManager = userManager;
@@ -53,118 +41,21 @@ namespace MediaBrowser.Dlna.PlayTo
_appHost = appHost;
_imageProcessor = imageProcessor;
_ssdpHandler = ssdpHandler;
- _config = config;
+ _deviceDiscovery = deviceDiscovery;
}
public void Start()
{
- foreach (var network in GetNetworkInterfaces())
- {
- _logger.Debug("Found interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus);
-
- if (!network.SupportsMulticast || OperationalStatus.Up != network.OperationalStatus || !network.GetIPProperties().MulticastAddresses.Any())
- continue;
-
- var ipV4 = network.GetIPProperties().GetIPv4Properties();
- if (null == ipV4)
- continue;
-
- var localIp = network.GetIPProperties().UnicastAddresses
- .Where(i => i.Address.AddressFamily == AddressFamily.InterNetwork)
- .Select(i => i.Address)
- .FirstOrDefault();
-
- if (localIp != null)
- {
- try
- {
- CreateListener(localIp, ipV4.Index);
- }
- catch (Exception e)
- {
- _logger.ErrorException("Failed to Initilize Socket", e);
- }
- }
- }
- }
-
- private IEnumerable<NetworkInterface> GetNetworkInterfaces()
- {
- try
- {
- return NetworkInterface.GetAllNetworkInterfaces();
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in GetAllNetworkInterfaces", ex);
- return new List<NetworkInterface>();
- }
+ _deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
}
- /// <summary>
- /// Creates a socket for the interface and listends for data.
- /// </summary>
- /// <param name="localIp">The local ip.</param>
- /// <param name="networkInterfaceIndex">Index of the network interface.</param>
- private void CreateListener(IPAddress localIp, int networkInterfaceIndex)
+ async void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<DeviceDiscoveryInfo> e)
{
- Task.Factory.StartNew(async (o) =>
- {
- try
- {
- var socket = GetMulticastSocket(networkInterfaceIndex);
+ var device = e.Argument.Device;
+ var localIp = e.Argument.LocalIpAddress;
- var endPoint = new IPEndPoint(localIp, 1900);
-
- socket.Bind(endPoint);
-
- _logger.Info("Creating SSDP listener on {0}, network interface index {1}", localIp, networkInterfaceIndex);
-
- var receiveBuffer = new byte[64000];
-
- CreateNotifier(socket);
-
- while (!_tokenSource.IsCancellationRequested)
- {
- var receivedBytes = await socket.ReceiveAsync(receiveBuffer, 0, 64000);
-
- if (receivedBytes > 0)
- {
- var args = SsdpHelper.ParseSsdpResponse(receiveBuffer, endPoint);
-
- TryCreateController(args, localIp);
- }
- }
-
- _logger.Info("SSDP listener - Task completed");
- }
- catch (OperationCanceledException)
- {
- }
- catch (Exception e)
- {
- _logger.ErrorException("Error in listener", e);
- }
-
- }, _tokenSource.Token, TaskCreationOptions.LongRunning);
- }
-
- private void TryCreateController(SsdpMessageEventArgs args, IPAddress localIp)
- {
- string nts;
- args.Headers.TryGetValue("NTS", out nts);
-
- string usn;
- if (!args.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
-
- string nt;
- if (!args.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
-
- // Don't create a new controller when a device is indicating it's shutting down
- if (string.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase))
- {
- return;
- }
+ var usn = e.Argument.Usn;
+ var nt = e.Argument.Nt;
// It has to report that it's a media renderer
if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1 &&
@@ -172,126 +63,16 @@ namespace MediaBrowser.Dlna.PlayTo
{
return;
}
-
- // Need to be able to download device description
- string location;
- if (!args.Headers.TryGetValue("Location", out location) ||
- string.IsNullOrEmpty(location))
- {
- return;
- }
-
- if (_config.GetDlnaConfiguration().EnableDebugLogging)
- {
- var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value));
- var headerText = string.Join(",", headerTexts.ToArray());
-
- _logger.Debug("{0} PlayTo message received from {1}. Headers: {2}", args.Method, args.EndPoint, headerText);
- }
if (_sessionManager.Sessions.Any(i => usn.IndexOf(i.DeviceId, StringComparison.OrdinalIgnoreCase) != -1))
{
return;
- }
-
- Task.Run(async () =>
- {
- try
- {
- await CreateController(new Uri(location), localIp).ConfigureAwait(false);
- }
- catch (OperationCanceledException)
- {
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error creating play to controller", ex);
- }
- });
- }
-
- private void CreateNotifier(IPAddress localIp)
- {
- Task.Factory.StartNew(async (o) =>
- {
- try
- {
- while (true)
- {
- _ssdpHandler.SendRendererSearchMessage(new IPEndPoint(localIp, 1900));
-
- var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;
-
- await Task.Delay(delay, _tokenSource.Token).ConfigureAwait(false);
- }
- }
- catch (OperationCanceledException)
- {
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in notifier", ex);
- }
-
- }, _tokenSource.Token, TaskCreationOptions.LongRunning);
-
- }
-
- private void CreateNotifier(Socket socket)
- {
- Task.Factory.StartNew(async (o) =>
+ }
+
+ if (device.RendererCommands != null)
{
- try
- {
- var msg = new SsdpMessageBuilder().BuildRendererDiscoveryMessage();
- var request = Encoding.UTF8.GetBytes(msg);
-
- while (true)
- {
- socket.SendTo(request, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));
+ var uri = e.Argument.Uri;
- var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;
-
- await Task.Delay(delay).ConfigureAwait(false);
- }
- }
- catch (OperationCanceledException)
- {
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in notifier", ex);
- }
-
- }, _tokenSource.Token, TaskCreationOptions.LongRunning);
-
- }
-
- /// <summary>
- /// Gets a socket configured for SDDP multicasting.
- /// </summary>
- /// <returns></returns>
- private Socket GetMulticastSocket(int networkInterfaceIndex)
- {
- var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
- socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.255.255.250"), networkInterfaceIndex));
- socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 4);
- return socket;
- }
-
- /// <summary>
- /// Creates a new DlnaSessionController.
- /// and logs the session in SessionManager
- /// </summary>
- /// <param name="uri">The URI.</param>
- /// <returns></returns>
- private async Task CreateController(Uri uri, IPAddress localIp)
- {
- var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
-
- if (device != null && device.RendererCommands != null)
- {
var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null)
.ConfigureAwait(false);
@@ -301,14 +82,14 @@ namespace MediaBrowser.Dlna.PlayTo
{
var serverAddress = GetServerAddress(localIp);
- sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
- _sessionManager,
- _itemRepository,
- _libraryManager,
- _logger,
- _dlnaManager,
- _userManager,
- _imageProcessor,
+ sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
+ _sessionManager,
+ _itemRepository,
+ _libraryManager,
+ _logger,
+ _dlnaManager,
+ _userManager,
+ _imageProcessor,
_ssdpHandler,
serverAddress);
@@ -353,11 +134,7 @@ namespace MediaBrowser.Dlna.PlayTo
public void Dispose()
{
- if (!_disposed)
- {
- _disposed = true;
- _tokenSource.Cancel();
- }
+ _deviceDiscovery.DeviceDiscovered -= _deviceDiscovery_DeviceDiscovered;
}
}
}
diff --git a/MediaBrowser.Dlna/PlayTo/TransportCommands.cs b/MediaBrowser.Dlna/PlayTo/TransportCommands.cs
index 31e25a367..c49767cfb 100644
--- a/MediaBrowser.Dlna/PlayTo/TransportCommands.cs
+++ b/MediaBrowser.Dlna/PlayTo/TransportCommands.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Dlna.Common;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
+using MediaBrowser.Dlna.Ssdp;
namespace MediaBrowser.Dlna.PlayTo
{
diff --git a/MediaBrowser.Dlna/PlayTo/UpnpContainer.cs b/MediaBrowser.Dlna/PlayTo/UpnpContainer.cs
index 95bafc1fb..e044d6b30 100644
--- a/MediaBrowser.Dlna/PlayTo/UpnpContainer.cs
+++ b/MediaBrowser.Dlna/PlayTo/UpnpContainer.cs
@@ -1,5 +1,6 @@
using System;
using System.Xml.Linq;
+using MediaBrowser.Dlna.Ssdp;
namespace MediaBrowser.Dlna.PlayTo
{
diff --git a/MediaBrowser.Dlna/Profiles/AndroidProfile.cs b/MediaBrowser.Dlna/Profiles/AndroidProfile.cs
new file mode 100644
index 000000000..c9dc1aa2c
--- /dev/null
+++ b/MediaBrowser.Dlna/Profiles/AndroidProfile.cs
@@ -0,0 +1,178 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class AndroidProfile : DefaultProfile
+ {
+ public AndroidProfile()
+ {
+ Name = "Android";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Protocol = "hls",
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video,
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Streaming
+ },
+ new TranscodingProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video,
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Static
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4,aac",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "flac",
+ AudioCodec = "flac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ogg",
+ AudioCodec = "vorbis",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif,bmp",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ 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 CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Audio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Audio,
+ Codec = "mp3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioBitrate,
+ Value = "320000"
+ }
+ }
+ }
+ };
+
+ }
+ }
+}
diff --git a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs
index 8885eddfc..9a1992b65 100644
--- a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs
@@ -27,6 +27,8 @@ namespace MediaBrowser.Dlna.Profiles
MaxAlbumArtHeight = 512;
MaxAlbumArtWidth = 512;
+ MaxBitrate = 8000000;
+
TranscodingProfiles = new[]
{
new TranscodingProfile
diff --git a/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs b/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
index 26229b62b..d12b3598c 100644
--- a/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
@@ -192,6 +192,14 @@ namespace MediaBrowser.Dlna.Profiles
}
}
};
+
+ SoftSubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt"
+ }
+ };
}
}
}
diff --git a/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs b/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
index d9581ff2c..b90c906fb 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.MediaInfo;
namespace MediaBrowser.Dlna.Profiles
{
@@ -338,6 +339,13 @@ namespace MediaBrowser.Dlna.Profiles
}
};
+ SoftSubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "smi"
+ }
+ };
}
}
}
diff --git a/MediaBrowser.Dlna/Profiles/Windows81Profile.cs b/MediaBrowser.Dlna/Profiles/Windows81Profile.cs
index 5e74884a2..921019f8e 100644
--- a/MediaBrowser.Dlna/Profiles/Windows81Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/Windows81Profile.cs
@@ -30,7 +30,8 @@ namespace MediaBrowser.Dlna.Profiles
VideoCodec = "h264",
AudioCodec = "aac",
Type = DlnaProfileType.Video,
- VideoProfile = "Baseline"
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Streaming
},
new TranscodingProfile
{
@@ -38,7 +39,16 @@ namespace MediaBrowser.Dlna.Profiles
VideoCodec = "h264",
AudioCodec = "aac",
Type = DlnaProfileType.Video,
- VideoProfile = "Baseline"
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Streaming
+ },
+ new TranscodingProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264",
+ AudioCodec = "aac,ac3,eac3",
+ Type = DlnaProfileType.Video,
+ Context = EncodingContext.Static
}
};
diff --git a/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs b/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs
index 66949c533..49e6319dc 100644
--- a/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/WindowsPhoneProfile.cs
@@ -25,7 +25,8 @@ namespace MediaBrowser.Dlna.Profiles
VideoCodec = "h264",
AudioCodec = "aac",
Type = DlnaProfileType.Video,
- VideoProfile = "Baseline"
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Streaming
},
new TranscodingProfile
{
@@ -33,7 +34,17 @@ namespace MediaBrowser.Dlna.Profiles
VideoCodec = "h264",
AudioCodec = "aac",
Type = DlnaProfileType.Video,
- VideoProfile = "Baseline"
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Streaming
+ },
+ new TranscodingProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video,
+ VideoProfile = "Baseline",
+ Context = EncodingContext.Static
}
};
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Android.xml b/MediaBrowser.Dlna/Profiles/Xml/Android.xml
new file mode 100644
index 000000000..e3630bf5e
--- /dev/null
+++ b/MediaBrowser.Dlna/Profiles/Xml/Android.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <Name>Android</Name>
+ <FriendlyName>Media Browser</FriendlyName>
+ <Manufacturer>Media Browser</Manufacturer>
+ <ManufacturerUrl>http://mediabrowser.tv/</ManufacturerUrl>
+ <ModelName>Media Browser</ModelName>
+ <ModelDescription>Media Browser</ModelDescription>
+ <ModelNumber>Media Browser</ModelNumber>
+ <ModelUrl>http://mediabrowser.tv/</ModelUrl>
+ <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+ <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
+ <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
+ <AlbumArtPn>JPEG_SM</AlbumArtPn>
+ <MaxAlbumArtWidth>512</MaxAlbumArtWidth>
+ <MaxAlbumArtHeight>512</MaxAlbumArtHeight>
+ <MaxIconWidth xsi:nil="true" />
+ <MaxIconHeight xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
+ <XDlnaDoc>DMS-1.50</XDlnaDoc>
+ <ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
+ <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+ <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+ <RequiresPlainFolders>false</RequiresPlainFolders>
+ <XmlRootAttributes />
+ <DirectPlayProfiles>
+ <DirectPlayProfile container="mp4" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" />
+ <DirectPlayProfile container="mp4,aac" audioCodec="aac" type="Audio" />
+ <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+ <DirectPlayProfile container="flac" audioCodec="flac" type="Audio" />
+ <DirectPlayProfile container="ogg" audioCodec="vorbis" type="Audio" />
+ <DirectPlayProfile container="jpeg,png,gif,bmp" type="Photo" />
+ </DirectPlayProfiles>
+ <TranscodingProfiles>
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" protocol="hls" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Streaming" />
+ <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Static" />
+ </TranscodingProfiles>
+ <ContainerProfiles />
+ <CodecProfiles>
+ <CodecProfile type="Video">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+ <ProfileCondition condition="NotEquals" property="IsAnamorphic" value="true" isRequired="false" />
+ <ProfileCondition condition="LessThanEqual" property="VideoBitDepth" value="8" isRequired="false" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="VideoAudio" codec="aac">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="Audio" codec="aac">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="Audio" codec="mp3">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="AudioBitrate" value="320000" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ </CodecProfiles>
+ <ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
+</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Default.xml b/MediaBrowser.Dlna/Profiles/Xml/Default.xml
index a94938ecd..07ffc1d2e 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Default.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Default.xml
@@ -16,7 +16,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -28,10 +28,12 @@
<DirectPlayProfile container="avi,mp4" type="Video" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles />
<CodecProfiles />
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
index 7c6ba70de..a9fdca710 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
@@ -21,7 +21,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -32,10 +32,12 @@
<DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles />
<CodecProfiles />
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml b/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
index fe1e945b7..c9d17e4a2 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
@@ -22,7 +22,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>10</TimelineOffsetSeconds>
@@ -37,9 +37,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -72,4 +72,6 @@
</CodecProfile>
</CodecProfiles>
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
index f14417168..6b09e7f94 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
@@ -20,7 +20,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -32,10 +32,12 @@
<DirectPlayProfile container="avi,mp4,mkv,ts" type="Video" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles />
<CodecProfiles />
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml
index 902d749f0..4bcd86b27 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml
@@ -22,7 +22,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -38,10 +38,12 @@
<DirectPlayProfile container="ogg" audioCodec="vorbis" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles />
<CodecProfiles />
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml b/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
index 2bc2bf4c4..9e0763d14 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>10</TimelineOffsetSeconds>
@@ -45,9 +45,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -67,4 +67,10 @@
</CodecProfile>
</CodecProfiles>
<ResponseProfiles />
+ <SoftSubtitleProfiles>
+ <SubtitleProfile>
+ <Format>srt</Format>
+ </SubtitleProfile>
+ </SoftSubtitleProfiles>
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml b/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
index 964e49ed6..cb901910d 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
@@ -22,7 +22,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -45,9 +45,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -105,4 +105,10 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles>
+ <SubtitleProfile>
+ <Format>smi</Format>
+ </SubtitleProfile>
+ </SoftSubtitleProfiles>
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
index 3a7e99eaa..6ef76a5a9 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
@@ -22,7 +22,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -43,9 +43,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -70,4 +70,6 @@
</CodecProfile>
</CodecProfiles>
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
index 61b5d1a05..2ae79f7d6 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
@@ -24,7 +24,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -42,9 +42,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="mpeg2video" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="mpeg2video" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -98,4 +98,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
index a50fdb68e..29cbf0e6a 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo>
@@ -40,9 +40,9 @@
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -106,4 +106,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
index dd381a5b6..01d332e1c 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
@@ -43,9 +43,9 @@
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -109,4 +109,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
index 57d822d41..0f1b2b140 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
@@ -45,9 +45,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -92,4 +92,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
index 6f5679fee..b1f3aabc9 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
@@ -50,9 +50,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -92,4 +92,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
index 494cedff7..2371e1474 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
@@ -36,9 +36,9 @@
<DirectPlayProfile container="avi,mp4" type="Video" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -92,4 +92,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml b/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
index 5f57fa9ed..89714d9bc 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>5</TimelineOffsetSeconds>
@@ -46,9 +46,9 @@
<DirectPlayProfile container="jpeg,png,gif,bmp,tiff" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Photo">
@@ -77,4 +77,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml
new file mode 100644
index 000000000..fbc6b6bc8
--- /dev/null
+++ b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <Name>Windows 8/RT</Name>
+ <Identification>
+ <Manufacturer>Microsoft SDK Customer</Manufacturer>
+ <Headers />
+ </Identification>
+ <FriendlyName>Media Browser</FriendlyName>
+ <Manufacturer>Media Browser</Manufacturer>
+ <ManufacturerUrl>http://mediabrowser.tv/</ManufacturerUrl>
+ <ModelName>Media Browser</ModelName>
+ <ModelDescription>Media Browser</ModelDescription>
+ <ModelNumber>Media Browser</ModelNumber>
+ <ModelUrl>http://mediabrowser.tv/</ModelUrl>
+ <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+ <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
+ <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
+ <AlbumArtPn>JPEG_SM</AlbumArtPn>
+ <MaxAlbumArtWidth>512</MaxAlbumArtWidth>
+ <MaxAlbumArtHeight>512</MaxAlbumArtHeight>
+ <MaxIconWidth xsi:nil="true" />
+ <MaxIconHeight xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
+ <XDlnaDoc>DMS-1.50</XDlnaDoc>
+ <ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
+ <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+ <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+ <RequiresPlainFolders>false</RequiresPlainFolders>
+ <XmlRootAttributes />
+ <DirectPlayProfiles>
+ <DirectPlayProfile container="mp4,mov" audioCodec="aac,ac3,eac3,mp3,pcm" videoCodec="h264,mpeg4" type="Video" />
+ <DirectPlayProfile container="ts" audioCodec="aac,ac3,eac3,mp3,mp2,pcm" videoCodec="h264" type="Video" />
+ <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
+ <DirectPlayProfile container="avi" audioCodec="mp3,ac3,eac3,mp2,pcm" videoCodec="mpeg4,msmpeg4,mjpeg" type="Video" />
+ <DirectPlayProfile container="mp4" audioCodec="aac" type="Audio" />
+ <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+ <DirectPlayProfile container="jpeg" type="Photo" />
+ </DirectPlayProfiles>
+ <TranscodingProfiles>
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" protocol="hls" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Streaming" />
+ <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac,ac3,eac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Static" />
+ </TranscodingProfiles>
+ <ContainerProfiles />
+ <CodecProfiles>
+ <CodecProfile type="Video">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="VideoBitDepth" value="8" isRequired="false" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="VideoAudio" codec="aac,eac3">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="8" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="VideoAudio" codec="ac3">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ </CodecProfiles>
+ <ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
+</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml
new file mode 100644
index 000000000..a05ad3123
--- /dev/null
+++ b/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <Name>Windows Phone</Name>
+ <FriendlyName>Media Browser</FriendlyName>
+ <Manufacturer>Media Browser</Manufacturer>
+ <ManufacturerUrl>http://mediabrowser.tv/</ManufacturerUrl>
+ <ModelName>Media Browser</ModelName>
+ <ModelDescription>Media Browser</ModelDescription>
+ <ModelNumber>Media Browser</ModelNumber>
+ <ModelUrl>http://mediabrowser.tv/</ModelUrl>
+ <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+ <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
+ <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
+ <AlbumArtPn>JPEG_SM</AlbumArtPn>
+ <MaxAlbumArtWidth>512</MaxAlbumArtWidth>
+ <MaxAlbumArtHeight>512</MaxAlbumArtHeight>
+ <MaxIconWidth xsi:nil="true" />
+ <MaxIconHeight xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
+ <XDlnaDoc>DMS-1.50</XDlnaDoc>
+ <ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
+ <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+ <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+ <RequiresPlainFolders>false</RequiresPlainFolders>
+ <XmlRootAttributes />
+ <DirectPlayProfiles>
+ <DirectPlayProfile container="mp4,mov" audioCodec="aac,mp3" videoCodec="h264" type="Video" />
+ <DirectPlayProfile container="mp4,avi" audioCodec="aac,mp3" videoCodec="mpeg4,msmpeg4" type="Video" />
+ <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
+ <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+ <DirectPlayProfile container="mp4,aac" audioCodec="aac" type="Audio" />
+ <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+ <DirectPlayProfile container="jpeg,png,gif,bmp" type="Photo" />
+ </DirectPlayProfiles>
+ <TranscodingProfiles>
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" protocol="hls" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Streaming" />
+ <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Streaming" />
+ <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="Baseline" context="Static" />
+ </TranscodingProfiles>
+ <ContainerProfiles />
+ <CodecProfiles>
+ <CodecProfile type="Video">
+ <Conditions>
+ <ProfileCondition condition="NotEquals" property="IsAnamorphic" value="true" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="Video" codec="h264">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="Width" value="800" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="Height" value="480" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="1000000" isRequired="false" />
+ <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="24" isRequired="false" />
+ <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="Video">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="Width" value="800" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="Height" value="480" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="1000000" isRequired="false" />
+ <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="24" isRequired="false" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="VideoAudio">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioBitrate" value="128000" isRequired="true" />
+ <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ <CodecProfile type="Audio">
+ <Conditions>
+ <ProfileCondition condition="LessThanEqual" property="AudioBitrate" value="128000" isRequired="true" />
+ </Conditions>
+ </CodecProfile>
+ </CodecProfiles>
+ <ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
+</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml b/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
index 27dcef1e4..fa0f10e26 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
@@ -23,7 +23,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>40</TimelineOffsetSeconds>
@@ -40,9 +40,9 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="asf" type="Video" videoCodec="wmv2" audioCodec="wmav2" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Bytes" />
- <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="asf" type="Video" videoCodec="wmv2" audioCodec="wmav2" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Bytes" context="Streaming" />
+ <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Video" container="mp4,mov">
@@ -99,4 +99,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml b/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
index 1de77c64f..0c83fce07 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
@@ -21,7 +21,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -39,8 +39,8 @@
<DirectPlayProfile container="jpeg" type="Photo" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles>
<ContainerProfile type="Video" container="mp4,mov">
@@ -89,4 +89,6 @@
<Conditions />
</ResponseProfile>
</ResponseProfiles>
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
index 60fb7cba6..5d50274a7 100644
--- a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
+++ b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
@@ -22,7 +22,7 @@
<MaxAlbumArtHeight>512</MaxAlbumArtHeight>
<MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" />
- <MaxBitrate xsi:nil="true" />
+ <MaxBitrate>8000000</MaxBitrate>
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
@@ -38,10 +38,12 @@
<DirectPlayProfile container="ogg" audioCodec="vorbis" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
- <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" />
+ <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
+ <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
</TranscodingProfiles>
<ContainerProfiles />
<CodecProfiles />
<ResponseProfiles />
+ <SoftSubtitleProfiles />
+ <ExternalSubtitleProfiles />
</Profile> \ No newline at end of file
diff --git a/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs b/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
new file mode 100644
index 000000000..aca164092
--- /dev/null
+++ b/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
@@ -0,0 +1,278 @@
+using MediaBrowser.Common.Events;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Dlna.PlayTo;
+using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Dlna.Ssdp
+{
+ public class DeviceDiscovery : IDisposable
+ {
+ private bool _disposed;
+
+ private readonly ILogger _logger;
+ private readonly IServerConfigurationManager _config;
+ private readonly SsdpHandler _ssdpHandler;
+ private readonly CancellationTokenSource _tokenSource;
+ private readonly IHttpClient _httpClient;
+
+ public event EventHandler<GenericEventArgs<DeviceDiscoveryInfo>> DeviceDiscovered;
+
+ public DeviceDiscovery(ILogger logger, IServerConfigurationManager config, IHttpClient httpClient, SsdpHandler ssdpHandler)
+ {
+ _tokenSource = new CancellationTokenSource();
+
+ _logger = logger;
+ _config = config;
+ _httpClient = httpClient;
+ _ssdpHandler = ssdpHandler;
+ }
+
+ public void Start()
+ {
+ //_ssdpHandler.MessageReceived += _ssdpHandler_MessageReceived;
+
+ foreach (var network in GetNetworkInterfaces())
+ {
+ _logger.Debug("Found interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus);
+
+ if (!network.SupportsMulticast || OperationalStatus.Up != network.OperationalStatus || !network.GetIPProperties().MulticastAddresses.Any())
+ continue;
+
+ var ipV4 = network.GetIPProperties().GetIPv4Properties();
+ if (null == ipV4)
+ continue;
+
+ var localIp = network.GetIPProperties().UnicastAddresses
+ .Where(i => i.Address.AddressFamily == AddressFamily.InterNetwork)
+ .Select(i => i.Address)
+ .FirstOrDefault();
+
+ if (localIp != null)
+ {
+ try
+ {
+ CreateListener(localIp, ipV4.Index);
+ }
+ catch (Exception e)
+ {
+ _logger.ErrorException("Failed to Initilize Socket", e);
+ }
+ }
+ }
+ }
+
+ void _ssdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e)
+ {
+ }
+
+ private IEnumerable<NetworkInterface> GetNetworkInterfaces()
+ {
+ try
+ {
+ return NetworkInterface.GetAllNetworkInterfaces();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in GetAllNetworkInterfaces", ex);
+ return new List<NetworkInterface>();
+ }
+ }
+ private void CreateListener(IPAddress localIp, int networkInterfaceIndex)
+ {
+ Task.Factory.StartNew(async (o) =>
+ {
+ try
+ {
+ var socket = GetMulticastSocket(networkInterfaceIndex);
+
+ var endPoint = new IPEndPoint(localIp, 1900);
+
+ socket.Bind(endPoint);
+
+ _logger.Info("Creating SSDP listener on {0}, network interface index {1}", localIp, networkInterfaceIndex);
+
+ var receiveBuffer = new byte[64000];
+
+ CreateNotifier(localIp);
+
+ while (!_tokenSource.IsCancellationRequested)
+ {
+ var receivedBytes = await socket.ReceiveAsync(receiveBuffer, 0, 64000);
+
+ if (receivedBytes > 0)
+ {
+ var args = SsdpHelper.ParseSsdpResponse(receiveBuffer, endPoint);
+
+ TryCreateDevice(args, localIp);
+ }
+ }
+
+ _logger.Info("SSDP listener - Task completed");
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ catch (Exception e)
+ {
+ _logger.ErrorException("Error in listener", e);
+ }
+
+ }, _tokenSource.Token, TaskCreationOptions.LongRunning);
+ }
+
+ private void CreateNotifier(IPAddress localIp)
+ {
+ Task.Factory.StartNew(async (o) =>
+ {
+ try
+ {
+ while (true)
+ {
+ _ssdpHandler.SendSearchMessage(new IPEndPoint(localIp, 1900));
+
+ var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;
+
+ await Task.Delay(delay, _tokenSource.Token).ConfigureAwait(false);
+ }
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in notifier", ex);
+ }
+
+ }, _tokenSource.Token, TaskCreationOptions.LongRunning);
+
+ }
+
+ private void CreateNotifier(Socket socket)
+ {
+ Task.Factory.StartNew(async (o) =>
+ {
+ try
+ {
+ var msg = new SsdpMessageBuilder().BuildRendererDiscoveryMessage();
+ var request = Encoding.UTF8.GetBytes(msg);
+
+ while (true)
+ {
+ socket.SendTo(request, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));
+
+ var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;
+
+ await Task.Delay(delay).ConfigureAwait(false);
+ }
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in notifier", ex);
+ }
+
+ }, _tokenSource.Token, TaskCreationOptions.LongRunning);
+
+ }
+
+ private Socket GetMulticastSocket(int networkInterfaceIndex)
+ {
+ var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+ socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
+ socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.255.255.250"), networkInterfaceIndex));
+ socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 4);
+ return socket;
+ }
+
+ private async void TryCreateDevice(SsdpMessageEventArgs args, IPAddress localIp)
+ {
+ string nts;
+ args.Headers.TryGetValue("NTS", out nts);
+
+ string usn;
+ if (!args.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
+
+ string nt;
+ if (!args.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
+
+ // Ignore when a device is indicating it's shutting down
+ if (string.Equals(nts, "ssdp:byebye", StringComparison.OrdinalIgnoreCase))
+ {
+ return;
+ }
+
+ // Need to be able to download device description
+ string location;
+ if (!args.Headers.TryGetValue("Location", out location) ||
+ string.IsNullOrEmpty(location))
+ {
+ return;
+ }
+
+ if (_config.GetDlnaConfiguration().EnableDebugLogging)
+ {
+ var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value));
+ var headerText = string.Join(",", headerTexts.ToArray());
+
+ _logger.Debug("{0} Device message received from {1}. Headers: {2}", args.Method, args.EndPoint, headerText);
+ }
+
+ try
+ {
+ await TryCreateDevice(new Uri(location), localIp, usn, nt).ConfigureAwait(false);
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error creating play to controller", ex);
+ }
+ }
+
+ private async Task TryCreateDevice(Uri uri, IPAddress localIp, string usn, string nt)
+ {
+ var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
+
+ if (device != null)
+ {
+ EventHelper.FireEventIfNotNull(DeviceDiscovered, this, new GenericEventArgs<DeviceDiscoveryInfo>
+ {
+ Argument = new DeviceDiscoveryInfo
+ {
+ Device = device,
+ LocalIpAddress = localIp,
+ Uri = uri,
+ Usn = usn,
+ Nt = nt
+ }
+
+ }, _logger);
+ }
+ }
+
+ public void Dispose()
+ {
+ _ssdpHandler.MessageReceived -= _ssdpHandler_MessageReceived;
+
+ if (!_disposed)
+ {
+ _disposed = true;
+ _tokenSource.Cancel();
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Dlna/Ssdp/DeviceDiscoveryInfo.cs b/MediaBrowser.Dlna/Ssdp/DeviceDiscoveryInfo.cs
new file mode 100644
index 000000000..e9de45522
--- /dev/null
+++ b/MediaBrowser.Dlna/Ssdp/DeviceDiscoveryInfo.cs
@@ -0,0 +1,21 @@
+using MediaBrowser.Dlna.PlayTo;
+using System;
+using System.Net;
+
+namespace MediaBrowser.Dlna.Ssdp
+{
+ public class DeviceDiscoveryInfo
+ {
+ public Device Device { get; set; }
+
+ /// <summary>
+ /// The server's ip address that the device responded to
+ /// </summary>
+ public IPAddress LocalIpAddress { get; set; }
+
+ public Uri Uri { get; set; }
+
+ public string Usn { get; set; }
+ public string Nt { get; set; }
+ }
+}
diff --git a/MediaBrowser.Dlna/PlayTo/Extensions.cs b/MediaBrowser.Dlna/Ssdp/Extensions.cs
index 05003a65b..12589e80f 100644
--- a/MediaBrowser.Dlna/PlayTo/Extensions.cs
+++ b/MediaBrowser.Dlna/Ssdp/Extensions.cs
@@ -5,7 +5,7 @@ using System.Net.Sockets;
using System.Threading.Tasks;
using System.Xml.Linq;
-namespace MediaBrowser.Dlna.PlayTo
+namespace MediaBrowser.Dlna.Ssdp
{
public static class Extensions
{
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
index 0455dd674..7002e566d 100644
--- a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
+++ b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
@@ -84,20 +84,15 @@ namespace MediaBrowser.Dlna.Ssdp
ReloadAliveNotifier();
}
- public void SendRendererSearchMessage(IPEndPoint localIp)
- {
- SendSearchMessage("urn:schemas-upnp-org:device:MediaRenderer:1", "3", localIp);
- }
-
- public void SendSearchMessage(string deviceSearchType, string mx, IPEndPoint localIp)
+ public void SendSearchMessage(IPEndPoint localIp)
{
var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
values["HOST"] = "239.255.255.250:1900";
values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2";
- values["ST"] = deviceSearchType;
+ values["ST"] = "ssdp:all";
values["MAN"] = "\"ssdp:discover\"";
- values["MX"] = mx;
+ values["MX"] = "10";
SendDatagram("M-SEARCH * HTTP/1.1", values, localIp);
}
@@ -271,7 +266,7 @@ namespace MediaBrowser.Dlna.Ssdp
var headerTexts = args.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value));
var headerText = string.Join(",", headerTexts.ToArray());
- _logger.Debug("{0} message received from {1}. Headers: {2}", args.Method, args.EndPoint, headerText);
+ _logger.Debug("{0} message received from {1} on {3}. Headers: {2}", args.Method, args.EndPoint, headerText, _socket.LocalEndPoint);
}
OnMessageReceived(args);
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs b/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs
index 1ba8a50ec..0eff6ad6f 100644
--- a/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs
+++ b/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs
@@ -32,9 +32,9 @@ namespace MediaBrowser.Dlna.Ssdp
values["HOST"] = "239.255.255.250:1900";
values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2";
- values["ST"] = deviceSearchType;
- values["MAN"] = "\"ssdp:discover\"";
- values["MX"] = mx;
+ values["ST"] = "ssdp:all";
+ values["MAN"] = "ssdp:discover";
+ values["MX"] = "10";
return BuildMessage(header, values);
}
@@ -43,5 +43,10 @@ namespace MediaBrowser.Dlna.Ssdp
{
return BuildDiscoveryMessage("urn:schemas-upnp-org:device:MediaRenderer:1", "3");
}
+
+ public string BuildMediaServerDiscoveryMessage()
+ {
+ return BuildDiscoveryMessage("urn:schemas-upnp-org:device:MediaRenderer:1", "3");
+ }
}
}
diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
index f1e7426aa..f40020c84 100644
--- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
@@ -1,11 +1,11 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
namespace MediaBrowser.LocalMetadata.Images
{
@@ -53,7 +53,12 @@ namespace MediaBrowser.LocalMetadata.Images
return parentPathFiles
.Where(i =>
{
- if (BaseItem.SupportedImageExtensions.Contains(i.Extension))
+ if ((i.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+ {
+ return false;
+ }
+
+ if (BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase))
{
var currentNameWithoutExtension = Path.GetFileNameWithoutExtension(i.Name);
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index 326b86546..c33e00944 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -11,12 +11,32 @@
<RootNamespace>MediaBrowser.Model</RootNamespace>
<AssemblyName>MediaBrowser.Model</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
- <TargetFrameworkProfile>Profile104</TargetFrameworkProfile>
+ <TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<FodyPath>..\packages\Fody.1.19.1.0</FodyPath>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>4.0</OldToolsVersion>
+ <PublishUrl>publish\</PublishUrl>
+ <Install>true</Install>
+ <InstallFrom>Disk</InstallFrom>
+ <UpdateEnabled>false</UpdateEnabled>
+ <UpdateMode>Foreground</UpdateMode>
+ <UpdateInterval>7</UpdateInterval>
+ <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+ <UpdatePeriodically>false</UpdatePeriodically>
+ <UpdateRequired>false</UpdateRequired>
+ <MapFileExtensions>true</MapFileExtensions>
+ <ApplicationRevision>0</ApplicationRevision>
+ <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+ <IsWebBootstrapper>false</IsWebBootstrapper>
+ <UseApplicationTrust>false</UseApplicationTrust>
+ <BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -37,6 +57,7 @@
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included -->
+ <None Include="app.config" />
<None Include="Fody.targets" />
<None Include="packages.config" />
</ItemGroup>
@@ -52,13 +73,13 @@
<Private>False</Private>
</Reference>
<Reference Include="System.IO">
- <HintPath>..\packages\Microsoft.Bcl.1.1.9\lib\portable-net40+sl4+win8+wp71+wpa81\System.IO.dll</HintPath>
+ <HintPath>..\packages\Microsoft.Bcl.1.1.8\lib\portable-net40+sl5+win8+wp8+wpa81\System.IO.dll</HintPath>
</Reference>
<Reference Include="System.Runtime">
- <HintPath>..\packages\Microsoft.Bcl.1.1.9\lib\portable-net40+sl4+win8+wp71+wpa81\System.Runtime.dll</HintPath>
+ <HintPath>..\packages\Microsoft.Bcl.1.1.8\lib\portable-net40+sl5+win8+wp8+wpa81\System.Runtime.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks">
- <HintPath>..\packages\Microsoft.Bcl.1.1.9\lib\portable-net40+sl4+win8+wp71+wpa81\System.Threading.Tasks.dll</HintPath>
+ <HintPath>..\packages\Microsoft.Bcl.1.1.8\lib\portable-net40+sl5+win8+wp8+wpa81\System.Threading.Tasks.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -248,6 +269,9 @@
<Compile Include="..\MediaBrowser.Model\Dlna\StreamInfo.cs">
<Link>Dlna\StreamInfo.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\SubtitleProfile.cs">
+ <Link>Dlna\SubtitleProfile.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\TranscodeSeekInfo.cs">
<Link>Dlna\TranscodeSeekInfo.cs</Link>
</Compile>
@@ -821,6 +845,30 @@
<Compile Include="..\MediaBrowser.Model\Session\UserDataChangeInfo.cs">
<Link>Session\UserDataChangeInfo.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
+ <Link>Sync\SyncJob.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobQuery.cs">
+ <Link>Sync\SyncJobQuery.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobRequest.cs">
+ <Link>Sync\SyncJobRequest.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobStatus.cs">
+ <Link>Sync\SyncJobStatus.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncQuality.cs">
+ <Link>Sync\SyncQuality.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncSchedule.cs">
+ <Link>Sync\SyncSchedule.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncScheduleQuery.cs">
+ <Link>Sync\SyncScheduleQuery.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncScheduleRequest.cs">
+ <Link>Sync\SyncScheduleRequest.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\System\LogFile.cs">
<Link>System\LogFile.cs</Link>
</Compile>
@@ -889,7 +937,18 @@
<ItemGroup>
<Content Include="FodyWeavers.xml" />
</ItemGroup>
- <ItemGroup />
+ <ItemGroup>
+ <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ </ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>if $(ConfigurationName) == Release (
diff --git a/MediaBrowser.Model.Portable/app.config b/MediaBrowser.Model.Portable/app.config
new file mode 100644
index 000000000..3c7378292
--- /dev/null
+++ b/MediaBrowser.Model.Portable/app.config
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-2.6.8.0" newVersion="2.6.8.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-2.6.8.0" newVersion="2.6.8.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration> \ No newline at end of file
diff --git a/MediaBrowser.Model.Portable/packages.config b/MediaBrowser.Model.Portable/packages.config
index 88efb3074..4d54d0baf 100644
--- a/MediaBrowser.Model.Portable/packages.config
+++ b/MediaBrowser.Model.Portable/packages.config
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Fody" version="1.19.1.0" targetFramework="portable-win+net45+sl40+wp71" developmentDependency="true" />
- <package id="Microsoft.Bcl" version="1.1.9" targetFramework="portable-net45+sl40+wp71+win" />
- <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="portable-net45+sl40+wp71+win" />
- <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="portable-net45+sl40+wp71+win" />
+ <package id="Microsoft.Bcl" version="1.1.8" targetFramework="portable-net45+sl50+win+wp80" />
+ <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="portable-net45+sl50+win+wp80" />
+ <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="portable-net45+sl50+win+wp80" />
<package id="PropertyChanged.Fody" version="1.41.0.0" targetFramework="portable-net45+sl40+wp71+win" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 782e8524d..22eb008d1 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -232,6 +232,9 @@
<Compile Include="..\MediaBrowser.Model\Dlna\StreamInfo.cs">
<Link>Dlna\StreamInfo.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Dlna\SubtitleProfile.cs">
+ <Link>Dlna\SubtitleProfile.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\TranscodeSeekInfo.cs">
<Link>Dlna\TranscodeSeekInfo.cs</Link>
</Compile>
@@ -799,6 +802,30 @@
<Compile Include="..\MediaBrowser.Model\Session\UserDataChangeInfo.cs">
<Link>Session\UserDataChangeInfo.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
+ <Link>Sync\SyncJob.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobQuery.cs">
+ <Link>Sync\SyncJobQuery.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobRequest.cs">
+ <Link>Sync\SyncJobRequest.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobStatus.cs">
+ <Link>Sync\SyncJobStatus.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncQuality.cs">
+ <Link>Sync\SyncQuality.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncSchedule.cs">
+ <Link>Sync\SyncSchedule.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncScheduleQuery.cs">
+ <Link>Sync\SyncScheduleQuery.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncScheduleRequest.cs">
+ <Link>Sync\SyncScheduleRequest.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\System\LogFile.cs">
<Link>System\LogFile.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 74a3314b7..80a9ec3c4 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -93,6 +93,12 @@ namespace MediaBrowser.Model.ApiClient
Task ReportCapabilities(ClientCapabilities capabilities, CancellationToken cancellationToken);
/// <summary>
+ /// Logouts this instance.
+ /// </summary>
+ /// <returns>Task.</returns>
+ Task Logout();
+
+ /// <summary>
/// Gets the index of the game players.
/// </summary>
/// <param name="userId">The user id.</param>
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index d9404ce29..904c7bcdd 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Notifications;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Notifications;
using MediaBrowser.Model.Weather;
using System;
@@ -22,12 +23,6 @@ namespace MediaBrowser.Model.Configuration
public WeatherUnits WeatherUnit { get; set; }
/// <summary>
- /// Gets or sets a value indicating whether [enable HTTP level logging].
- /// </summary>
- /// <value><c>true</c> if [enable HTTP level logging]; otherwise, <c>false</c>.</value>
- public bool EnableHttpLevelLogging { get; set; }
-
- /// <summary>
/// Gets or sets a value indicating whether [enable u pn p].
/// </summary>
/// <value><c>true</c> if [enable u pn p]; otherwise, <c>false</c>.</value>
@@ -222,7 +217,6 @@ namespace MediaBrowser.Model.Configuration
ImageSavingConvention = ImageSavingConvention.Compatible;
HttpServerPortNumber = 8096;
LegacyWebSocketPortNumber = 8945;
- EnableHttpLevelLogging = true;
EnableDashboardResponseCaching = true;
EnableAutomaticRestart = true;
@@ -261,8 +255,58 @@ namespace MediaBrowser.Model.Configuration
MetadataOptions = new[]
{
new MetadataOptions(1, 1280) {ItemType = "Book"},
- new MetadataOptions(1, 1280) {ItemType = "MusicAlbum"},
- new MetadataOptions(1, 1280) {ItemType = "MusicArtist"},
+
+ new MetadataOptions(1, 1280)
+ {
+ ItemType = "MusicAlbum",
+ ImageOptions = new []
+ {
+ new ImageOption
+ {
+ Limit = 1,
+ MinWidth = 1280,
+ Type = ImageType.Backdrop
+ },
+
+ // Don't download this by default as it's rarely used.
+ new ImageOption
+ {
+ Limit = 0,
+ Type = ImageType.Disc
+ }
+ }
+ },
+
+ new MetadataOptions(1, 1280)
+ {
+ ItemType = "MusicArtist",
+ ImageOptions = new []
+ {
+ new ImageOption
+ {
+ Limit = 1,
+ MinWidth = 1280,
+ Type = ImageType.Backdrop
+ },
+
+ // Don't download this by default
+ // They do look great, but most artists won't have them, which means a banner view isn't really possible
+ new ImageOption
+ {
+ Limit = 0,
+ Type = ImageType.Banner
+ },
+
+ // Don't download this by default
+ // Generally not used
+ new ImageOption
+ {
+ Limit = 0,
+ Type = ImageType.Art
+ }
+ }
+ },
+
new MetadataOptions(0, 1280) {ItemType = "Season"}
};
diff --git a/MediaBrowser.Model/Configuration/UserConfiguration.cs b/MediaBrowser.Model/Configuration/UserConfiguration.cs
index 0834452fb..1afc9a191 100644
--- a/MediaBrowser.Model/Configuration/UserConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/UserConfiguration.cs
@@ -93,6 +93,7 @@ namespace MediaBrowser.Model.Configuration
BlockUnratedItems = new UnratedItem[] { };
ExcludeFoldersFromGrouping = new string[] { };
+ DisplayCollectionsView = true;
}
}
}
diff --git a/MediaBrowser.Model/Dlna/AudioOptions.cs b/MediaBrowser.Model/Dlna/AudioOptions.cs
index d04133a3d..6e630ee55 100644
--- a/MediaBrowser.Model/Dlna/AudioOptions.cs
+++ b/MediaBrowser.Model/Dlna/AudioOptions.cs
@@ -29,5 +29,11 @@ namespace MediaBrowser.Model.Dlna
/// The application's configured quality setting
/// </summary>
public int? MaxBitrate { get; set; }
+
+ /// <summary>
+ /// Gets or sets the context.
+ /// </summary>
+ /// <value>The context.</value>
+ public EncodingContext Context { get; set; }
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs
index deaa30714..4040b57f9 100644
--- a/MediaBrowser.Model/Dlna/DeviceProfile.cs
+++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs
@@ -89,6 +89,9 @@ namespace MediaBrowser.Model.Dlna
public CodecProfile[] CodecProfiles { get; set; }
public ResponseProfile[] ResponseProfiles { get; set; }
+ public SubtitleProfile[] SoftSubtitleProfiles { get; set; }
+ public SubtitleProfile[] ExternalSubtitleProfiles { get; set; }
+
public DeviceProfile()
{
DirectPlayProfiles = new DirectPlayProfile[] { };
@@ -97,6 +100,9 @@ namespace MediaBrowser.Model.Dlna
CodecProfiles = new CodecProfile[] { };
ContainerProfiles = new ContainerProfile[] { };
+ SoftSubtitleProfiles = new SubtitleProfile[] { };
+ ExternalSubtitleProfiles = new SubtitleProfile[] { };
+
XmlRootAttributes = new XmlAttribute[] { };
SupportedMediaTypes = "Audio,Photo,Video";
diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs
index 8aadd428f..57dedf6cf 100644
--- a/MediaBrowser.Model/Dlna/StreamBuilder.cs
+++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs
@@ -9,6 +9,8 @@ namespace MediaBrowser.Model.Dlna
{
public class StreamBuilder
{
+ private string[] _serverTextSubtitleOutputs = new string[] { "srt", "vtt" };
+
public StreamInfo BuildAudioItem(AudioOptions options)
{
ValidateAudioInput(options);
@@ -48,16 +50,13 @@ namespace MediaBrowser.Model.Dlna
List<MediaSourceInfo> mediaSources = options.MediaSources;
- // If the client wants a specific media soure, filter now
+ // If the client wants a specific media source, filter now
if (!string.IsNullOrEmpty(options.MediaSourceId))
{
- // Avoid implicitly captured closure
- string mediaSourceId = options.MediaSourceId;
-
var newMediaSources = new List<MediaSourceInfo>();
foreach (MediaSourceInfo i in mediaSources)
{
- if (StringHelper.EqualsIgnoreCase(i.Id, mediaSourceId))
+ if (StringHelper.EqualsIgnoreCase(i.Id, options.MediaSourceId))
newMediaSources.Add(i);
}
@@ -171,7 +170,7 @@ namespace MediaBrowser.Model.Dlna
TranscodingProfile transcodingProfile = null;
foreach (TranscodingProfile i in options.Profile.TranscodingProfiles)
{
- if (i.Type == playlistItem.MediaType)
+ if (i.Type == playlistItem.MediaType && i.Context == options.Context)
{
transcodingProfile = i;
break;
@@ -217,12 +216,9 @@ namespace MediaBrowser.Model.Dlna
playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue);
}
- // Honor requested max bitrate
- if (maxBitrateSetting.HasValue)
+ if (!playlistItem.AudioBitrate.HasValue)
{
- int currentValue = playlistItem.AudioBitrate ?? maxBitrateSetting.Value;
-
- playlistItem.AudioBitrate = Math.Min(maxBitrateSetting.Value, currentValue);
+ playlistItem.AudioBitrate = 128000;
}
}
@@ -239,12 +235,17 @@ namespace MediaBrowser.Model.Dlna
RunTimeTicks = item.RunTimeTicks
};
- MediaStream audioStream = item.DefaultAudioStream;
+ int? audioStreamIndex = options.AudioStreamIndex ?? item.DefaultAudioStreamIndex;
+ playlistItem.SubtitleStreamIndex = options.SubtitleStreamIndex ?? item.DefaultSubtitleStreamIndex;
+
+ MediaStream audioStream = audioStreamIndex.HasValue ? item.GetMediaStream(MediaStreamType.Audio, audioStreamIndex.Value) : null;
+ MediaStream subtitleStream = playlistItem.SubtitleStreamIndex.HasValue ? item.GetMediaStream(MediaStreamType.Subtitle, playlistItem.SubtitleStreamIndex.Value) : null;
+
MediaStream videoStream = item.VideoStream;
int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
- if (IsEligibleForDirectPlay(item, options, maxBitrateSetting))
+ if (IsEligibleForDirectPlay(item, maxBitrateSetting, subtitleStream, options))
{
// See if it can be direct played
DirectPlayProfile directPlay = GetVideoDirectPlayProfile(options.Profile, item, videoStream, audioStream);
@@ -254,6 +255,11 @@ namespace MediaBrowser.Model.Dlna
playlistItem.IsDirectStream = true;
playlistItem.Container = item.Container;
+ if (subtitleStream != null)
+ {
+ playlistItem.SubtitleDeliveryMethod = GetDirectStreamSubtitleDeliveryMethod(subtitleStream, options);
+ }
+
return playlistItem;
}
}
@@ -262,7 +268,7 @@ namespace MediaBrowser.Model.Dlna
TranscodingProfile transcodingProfile = null;
foreach (TranscodingProfile i in options.Profile.TranscodingProfiles)
{
- if (i.Type == playlistItem.MediaType)
+ if (i.Type == playlistItem.MediaType && i.Context == options.Context)
{
transcodingProfile = i;
break;
@@ -271,6 +277,11 @@ namespace MediaBrowser.Model.Dlna
if (transcodingProfile != null)
{
+ if (subtitleStream != null)
+ {
+ playlistItem.SubtitleDeliveryMethod = GetTranscodedSubtitleDeliveryMethod(subtitleStream, options);
+ }
+
playlistItem.IsDirectStream = false;
playlistItem.Container = transcodingProfile.Container;
playlistItem.EstimateContentLength = transcodingProfile.EstimateContentLength;
@@ -278,8 +289,7 @@ namespace MediaBrowser.Model.Dlna
playlistItem.AudioCodec = transcodingProfile.AudioCodec.Split(',')[0];
playlistItem.VideoCodec = transcodingProfile.VideoCodec;
playlistItem.Protocol = transcodingProfile.Protocol;
- playlistItem.AudioStreamIndex = options.AudioStreamIndex ?? item.DefaultAudioStreamIndex;
- playlistItem.SubtitleStreamIndex = options.SubtitleStreamIndex ?? item.DefaultSubtitleStreamIndex;
+ playlistItem.AudioStreamIndex = audioStreamIndex;
List<ProfileCondition> videoTranscodingConditions = new List<ProfileCondition>();
foreach (CodecProfile i in options.Profile.CodecProfiles)
@@ -317,12 +327,9 @@ namespace MediaBrowser.Model.Dlna
playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue);
}
- // Honor requested max bitrate
- if (options.MaxAudioTranscodingBitrate.HasValue)
+ if (!playlistItem.AudioBitrate.HasValue)
{
- int currentValue = playlistItem.AudioBitrate ?? options.MaxAudioTranscodingBitrate.Value;
-
- playlistItem.AudioBitrate = Math.Min(options.MaxAudioTranscodingBitrate.Value, currentValue);
+ playlistItem.AudioBitrate = GetAudioBitrate(playlistItem.TargetAudioChannels, playlistItem.TargetAudioCodec);
}
// Honor max rate
@@ -339,15 +346,22 @@ namespace MediaBrowser.Model.Dlna
playlistItem.VideoBitrate = Math.Min(videoBitrate, currentValue);
}
+ }
- // Hate to hard-code this, but it's still probably better than being subjected to encoder defaults
- if (!playlistItem.VideoBitrate.HasValue)
+ return playlistItem;
+ }
+
+ private int GetAudioBitrate(int? channels, string codec)
+ {
+ if (channels.HasValue)
+ {
+ if (channels.Value >= 5)
{
- playlistItem.VideoBitrate = 5000000;
+ return 320000;
}
}
- return playlistItem;
+ return 128000;
}
private DirectPlayProfile GetVideoDirectPlayProfile(DeviceProfile profile,
@@ -473,16 +487,105 @@ namespace MediaBrowser.Model.Dlna
return directPlay;
}
- private bool IsEligibleForDirectPlay(MediaSourceInfo item, VideoOptions options, int? maxBitrate)
+ private bool IsEligibleForDirectPlay(MediaSourceInfo item,
+ int? maxBitrate,
+ MediaStream subtitleStream,
+ VideoOptions options)
{
- if (options.SubtitleStreamIndex.HasValue)
+ if (subtitleStream != null)
{
- return false;
+ if (!subtitleStream.IsTextSubtitleStream)
+ {
+ return false;
+ }
+
+ SubtitleDeliveryMethod subtitleMethod = GetDirectStreamSubtitleDeliveryMethod(subtitleStream, options);
+
+ if (subtitleMethod != SubtitleDeliveryMethod.External && subtitleMethod != SubtitleDeliveryMethod.Direct)
+ {
+ return false;
+ }
}
return IsAudioEligibleForDirectPlay(item, maxBitrate);
}
+ private SubtitleDeliveryMethod GetDirectStreamSubtitleDeliveryMethod(MediaStream subtitleStream,
+ VideoOptions options)
+ {
+ if (subtitleStream.IsTextSubtitleStream)
+ {
+ string subtitleFormat = NormalizeSubtitleFormat(subtitleStream.Codec);
+
+ bool supportsDirect = ContainsSubtitleFormat(options.Profile.SoftSubtitleProfiles, new[] { subtitleFormat });
+
+ if (supportsDirect)
+ {
+ return SubtitleDeliveryMethod.Direct;
+ }
+
+ // See if the device can retrieve the subtitles externally
+ bool supportsSubsExternally = options.Context == EncodingContext.Streaming &&
+ ContainsSubtitleFormat(options.Profile.ExternalSubtitleProfiles, _serverTextSubtitleOutputs);
+
+ if (supportsSubsExternally)
+ {
+ return SubtitleDeliveryMethod.External;
+ }
+ }
+
+ return SubtitleDeliveryMethod.Encode;
+ }
+
+ private SubtitleDeliveryMethod GetTranscodedSubtitleDeliveryMethod(MediaStream subtitleStream,
+ VideoOptions options)
+ {
+ if (subtitleStream.IsTextSubtitleStream)
+ {
+ // See if the device can retrieve the subtitles externally
+ bool supportsSubsExternally = options.Context == EncodingContext.Streaming &&
+ ContainsSubtitleFormat(options.Profile.ExternalSubtitleProfiles, _serverTextSubtitleOutputs);
+
+ if (supportsSubsExternally)
+ {
+ return SubtitleDeliveryMethod.External;
+ }
+
+ // See if the device can retrieve the subtitles externally
+ bool supportsEmbedded = ContainsSubtitleFormat(options.Profile.SoftSubtitleProfiles, _serverTextSubtitleOutputs);
+
+ if (supportsEmbedded)
+ {
+ return SubtitleDeliveryMethod.Embed;
+ }
+ }
+
+ return SubtitleDeliveryMethod.Encode;
+ }
+
+ private string NormalizeSubtitleFormat(string codec)
+ {
+ if (StringHelper.EqualsIgnoreCase(codec, "subrip"))
+ {
+ return SubtitleFormat.SRT;
+ }
+
+ return codec;
+ }
+
+ private bool ContainsSubtitleFormat(SubtitleProfile[] profiles, string[] formats)
+ {
+ foreach (SubtitleProfile profile in profiles)
+ {
+ if (ListHelper.ContainsIgnoreCase(formats, profile.Format))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private bool IsAudioEligibleForDirectPlay(MediaSourceInfo item, int? maxBitrate)
{
// Honor the max bitrate setting
diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs
index e5e013b2a..96aa2167f 100644
--- a/MediaBrowser.Model/Dlna/StreamInfo.cs
+++ b/MediaBrowser.Model/Dlna/StreamInfo.cs
@@ -58,6 +58,8 @@ namespace MediaBrowser.Model.Dlna
public MediaSourceInfo MediaSource { get; set; }
+ public SubtitleDeliveryMethod SubtitleDeliveryMethod { get; set; }
+
public string MediaSourceId
{
get
@@ -108,7 +110,7 @@ namespace MediaBrowser.Model.Dlna
item.VideoCodec ?? string.Empty,
item.AudioCodec ?? string.Empty,
item.AudioStreamIndex.HasValue ? StringHelper.ToStringCultureInvariant(item.AudioStreamIndex.Value) : string.Empty,
- item.SubtitleStreamIndex.HasValue ? StringHelper.ToStringCultureInvariant(item.SubtitleStreamIndex.Value) : string.Empty,
+ item.SubtitleStreamIndex.HasValue && item.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External ? StringHelper.ToStringCultureInvariant(item.SubtitleStreamIndex.Value) : string.Empty,
item.VideoBitrate.HasValue ? StringHelper.ToStringCultureInvariant(item.VideoBitrate.Value) : string.Empty,
item.AudioBitrate.HasValue ? StringHelper.ToStringCultureInvariant(item.AudioBitrate.Value) : string.Empty,
item.MaxAudioChannels.HasValue ? StringHelper.ToStringCultureInvariant(item.MaxAudioChannels.Value) : string.Empty,
@@ -427,4 +429,24 @@ namespace MediaBrowser.Model.Dlna
}
}
}
+
+ public enum SubtitleDeliveryMethod
+ {
+ /// <summary>
+ /// The encode
+ /// </summary>
+ Encode = 0,
+ /// <summary>
+ /// Internal format is supported natively
+ /// </summary>
+ Direct = 1,
+ /// <summary>
+ /// The embed
+ /// </summary>
+ Embed = 2,
+ /// <summary>
+ /// The external
+ /// </summary>
+ External = 3
+ }
}
diff --git a/MediaBrowser.Model/Dlna/SubtitleProfile.cs b/MediaBrowser.Model/Dlna/SubtitleProfile.cs
new file mode 100644
index 000000000..ec38d96ae
--- /dev/null
+++ b/MediaBrowser.Model/Dlna/SubtitleProfile.cs
@@ -0,0 +1,8 @@
+
+namespace MediaBrowser.Model.Dlna
+{
+ public class SubtitleProfile
+ {
+ public string Format { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/Dlna/TranscodingProfile.cs b/MediaBrowser.Model/Dlna/TranscodingProfile.cs
index 51f4bfe61..976f8e8d1 100644
--- a/MediaBrowser.Model/Dlna/TranscodingProfile.cs
+++ b/MediaBrowser.Model/Dlna/TranscodingProfile.cs
@@ -32,6 +32,9 @@ namespace MediaBrowser.Model.Dlna
[XmlAttribute("videoProfile")]
public string VideoProfile { get; set; }
+ [XmlAttribute("context")]
+ public EncodingContext Context { get; set; }
+
public List<string> GetAudioCodecs()
{
List<string> list = new List<string>();
@@ -42,4 +45,10 @@ namespace MediaBrowser.Model.Dlna
return list;
}
}
+
+ public enum EncodingContext
+ {
+ Streaming = 0,
+ Static = 1
+ }
}
diff --git a/MediaBrowser.Model/Dlna/VideoOptions.cs b/MediaBrowser.Model/Dlna/VideoOptions.cs
index 39a5ab1b1..041d2cd5d 100644
--- a/MediaBrowser.Model/Dlna/VideoOptions.cs
+++ b/MediaBrowser.Model/Dlna/VideoOptions.cs
@@ -7,11 +7,5 @@
{
public int? AudioStreamIndex { get; set; }
public int? SubtitleStreamIndex { get; set; }
- public int? MaxAudioTranscodingBitrate { get; set; }
-
- public VideoOptions()
- {
- MaxAudioTranscodingBitrate = 128000;
- }
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/Dto/MediaSourceInfo.cs b/MediaBrowser.Model/Dto/MediaSourceInfo.cs
index cf5518db0..46c51ed8b 100644
--- a/MediaBrowser.Model/Dto/MediaSourceInfo.cs
+++ b/MediaBrowser.Model/Dto/MediaSourceInfo.cs
@@ -103,6 +103,19 @@ namespace MediaBrowser.Model.Dto
return null;
}
}
+
+ public MediaStream GetMediaStream(MediaStreamType type, int index)
+ {
+ foreach (MediaStream i in MediaStreams)
+ {
+ if (i.Type == type && i.Index == index)
+ {
+ return i;
+ }
+ }
+
+ return null;
+ }
}
public enum MediaSourceType
diff --git a/MediaBrowser.Model/Entities/CollectionType.cs b/MediaBrowser.Model/Entities/CollectionType.cs
index 1aae2a89c..5a9526d95 100644
--- a/MediaBrowser.Model/Entities/CollectionType.cs
+++ b/MediaBrowser.Model/Entities/CollectionType.cs
@@ -1,5 +1,4 @@
-
-namespace MediaBrowser.Model.Entities
+namespace MediaBrowser.Model.Entities
{
public static class CollectionType
{
diff --git a/MediaBrowser.Model/Extensions/ListHelper.cs b/MediaBrowser.Model/Extensions/ListHelper.cs
index d929866bd..741f07469 100644
--- a/MediaBrowser.Model/Extensions/ListHelper.cs
+++ b/MediaBrowser.Model/Extensions/ListHelper.cs
@@ -24,5 +24,22 @@ namespace MediaBrowser.Model.Extensions
return list.Contains(value, StringComparer.OrdinalIgnoreCase);
}
+
+ public static bool ContainsAnyIgnoreCase(string[] list, string[] values)
+ {
+ if (values == null)
+ {
+ throw new ArgumentNullException("values");
+ }
+
+ foreach (string val in values)
+ {
+ if (ContainsIgnoreCase(list, val))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
}
}
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 4d4ca8e20..a2f2b1318 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -89,6 +89,7 @@
<Compile Include="Configuration\MetadataOptions.cs" />
<Compile Include="Configuration\MetadataPluginSummary.cs" />
<Compile Include="Configuration\MetadataPluginType.cs" />
+ <Compile Include="Dlna\SubtitleProfile.cs" />
<Compile Include="Notifications\NotificationOption.cs" />
<Compile Include="Notifications\NotificationOptions.cs" />
<Compile Include="Notifications\NotificationType.cs" />
@@ -295,6 +296,14 @@
<Compile Include="Session\SessionInfoDto.cs" />
<Compile Include="Session\SessionUserInfo.cs" />
<Compile Include="Session\UserDataChangeInfo.cs" />
+ <Compile Include="Sync\SyncJob.cs" />
+ <Compile Include="Sync\SyncJobQuery.cs" />
+ <Compile Include="Sync\SyncJobRequest.cs" />
+ <Compile Include="Sync\SyncJobStatus.cs" />
+ <Compile Include="Sync\SyncQuality.cs" />
+ <Compile Include="Sync\SyncSchedule.cs" />
+ <Compile Include="Sync\SyncScheduleQuery.cs" />
+ <Compile Include="Sync\SyncScheduleRequest.cs" />
<Compile Include="System\LogFile.cs" />
<Compile Include="Themes\AppTheme.cs" />
<Compile Include="Themes\AppThemeInfo.cs" />
diff --git a/MediaBrowser.Model/MediaInfo/SubtitleFormat.cs b/MediaBrowser.Model/MediaInfo/SubtitleFormat.cs
index 30eb50825..7e9cdf53f 100644
--- a/MediaBrowser.Model/MediaInfo/SubtitleFormat.cs
+++ b/MediaBrowser.Model/MediaInfo/SubtitleFormat.cs
@@ -7,5 +7,6 @@
public const string ASS = "ass";
public const string VTT = "vtt";
public const string SUB = "sub";
+ public const string SMI = "smi";
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/Sync/SyncJob.cs b/MediaBrowser.Model/Sync/SyncJob.cs
new file mode 100644
index 000000000..09049a196
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncJob.cs
@@ -0,0 +1,47 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncJob
+ {
+ /// <summary>
+ /// Gets or sets the identifier.
+ /// </summary>
+ /// <value>The identifier.</value>
+ public string Id { get; set; }
+ /// <summary>
+ /// Gets or sets the device identifier.
+ /// </summary>
+ /// <value>The device identifier.</value>
+ public string DeviceId { get; set; }
+ /// <summary>
+ /// Gets or sets the item identifier.
+ /// </summary>
+ /// <value>The item identifier.</value>
+ public string ItemId { get; set; }
+ /// <summary>
+ /// Gets or sets the quality.
+ /// </summary>
+ /// <value>The quality.</value>
+ public SyncQuality Quality { get; set; }
+ /// <summary>
+ /// Gets or sets the status.
+ /// </summary>
+ /// <value>The status.</value>
+ public SyncJobStatus Status { get; set; }
+ /// <summary>
+ /// Gets or sets the current progress.
+ /// </summary>
+ /// <value>The current progress.</value>
+ public double? CurrentProgress { get; set; }
+ /// <summary>
+ /// Gets or sets the synchronize rule identifier.
+ /// </summary>
+ /// <value>The synchronize rule identifier.</value>
+ public string SyncScheduleId { get; set; }
+ /// <summary>
+ /// Gets or sets the transcoded path.
+ /// </summary>
+ /// <value>The transcoded path.</value>
+ public string TranscodedPath { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncJobQuery.cs b/MediaBrowser.Model/Sync/SyncJobQuery.cs
new file mode 100644
index 000000000..f41544db9
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncJobQuery.cs
@@ -0,0 +1,7 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncJobQuery
+ {
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncJobRequest.cs b/MediaBrowser.Model/Sync/SyncJobRequest.cs
new file mode 100644
index 000000000..9871f976d
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncJobRequest.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncJobRequest
+ {
+ /// <summary>
+ /// Gets or sets the device identifier.
+ /// </summary>
+ /// <value>The device identifier.</value>
+ public List<string> DeviceIds { get; set; }
+ /// <summary>
+ /// Gets or sets the item identifier.
+ /// </summary>
+ /// <value>The item identifier.</value>
+ public string ItemId { get; set; }
+ /// <summary>
+ /// Gets or sets the quality.
+ /// </summary>
+ /// <value>The quality.</value>
+ public SyncQuality Quality { get; set; }
+
+ public SyncJobRequest()
+ {
+ DeviceIds = new List<string>();
+ }
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncJobStatus.cs b/MediaBrowser.Model/Sync/SyncJobStatus.cs
new file mode 100644
index 000000000..2a216fe04
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncJobStatus.cs
@@ -0,0 +1,35 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public enum SyncJobStatus
+ {
+ /// <summary>
+ /// The queued
+ /// </summary>
+ Queued = 0,
+ /// <summary>
+ /// The transcoding
+ /// </summary>
+ Transcoding = 1,
+ /// <summary>
+ /// The transcoding failed
+ /// </summary>
+ TranscodingFailed = 2,
+ /// <summary>
+ /// The transcoding completed
+ /// </summary>
+ TranscodingCompleted = 3,
+ /// <summary>
+ /// The transfering
+ /// </summary>
+ Transfering = 4,
+ /// <summary>
+ /// The transfer failed
+ /// </summary>
+ TransferFailed = 4,
+ /// <summary>
+ /// The completed
+ /// </summary>
+ Completed = 6
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncQuality.cs b/MediaBrowser.Model/Sync/SyncQuality.cs
new file mode 100644
index 000000000..f915e2768
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncQuality.cs
@@ -0,0 +1,21 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public enum SyncQuality
+ {
+ /// <summary>
+ /// The good
+ /// </summary>
+ Good = 0,
+
+ /// <summary>
+ /// The better
+ /// </summary>
+ Better = 1,
+
+ /// <summary>
+ /// The best
+ /// </summary>
+ Best = 2
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncSchedule.cs b/MediaBrowser.Model/Sync/SyncSchedule.cs
new file mode 100644
index 000000000..297cbd145
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncSchedule.cs
@@ -0,0 +1,12 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncSchedule
+ {
+ /// <summary>
+ /// Gets or sets the identifier.
+ /// </summary>
+ /// <value>The identifier.</value>
+ public string Id { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncScheduleQuery.cs b/MediaBrowser.Model/Sync/SyncScheduleQuery.cs
new file mode 100644
index 000000000..b704a358c
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncScheduleQuery.cs
@@ -0,0 +1,7 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncScheduleQuery
+ {
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncScheduleRequest.cs b/MediaBrowser.Model/Sync/SyncScheduleRequest.cs
new file mode 100644
index 000000000..e1ba4b115
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncScheduleRequest.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncScheduleRequest
+ {
+ /// <summary>
+ /// Gets or sets the device identifier.
+ /// </summary>
+ /// <value>The device identifier.</value>
+ public List<string> DeviceIds { get; set; }
+ /// <summary>
+ /// Gets or sets the quality.
+ /// </summary>
+ /// <value>The quality.</value>
+ public SyncQuality Quality { get; set; }
+
+ public SyncScheduleRequest()
+ {
+ DeviceIds = new List<string>();
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 335fb9769..b84d060d7 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -339,7 +339,6 @@ namespace MediaBrowser.Providers.Manager
break;
}
- failedProviderCount++;
Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name);
}
catch (OperationCanceledException)
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index fe22d4c99..9a26101a1 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -126,7 +126,6 @@
<Compile Include="Music\AudioDbExternalIds.cs" />
<Compile Include="Music\AudioMetadataService.cs" />
<Compile Include="Music\Extensions.cs" />
- <Compile Include="Music\LastfmArtistProvider.cs" />
<Compile Include="Music\MovieDbMusicVideoProvider.cs" />
<Compile Include="Music\MusicBrainzArtistProvider.cs" />
<Compile Include="Music\MusicExternalIds.cs" />
@@ -138,11 +137,8 @@
<Compile Include="Movies\FanArtMovieUpdatesPostScanTask.cs" />
<Compile Include="Movies\MovieDbProvider.cs" />
<Compile Include="Music\FanArtUpdatesPostScanTask.cs" />
- <Compile Include="Music\LastfmAlbumProvider.cs" />
- <Compile Include="Music\LastfmHelper.cs" />
<Compile Include="Music\FanArtAlbumProvider.cs" />
<Compile Include="Music\FanArtArtistProvider.cs" />
- <Compile Include="Music\LastFmImageProvider.cs" />
<Compile Include="Music\MusicBrainzAlbumProvider.cs" />
<Compile Include="Music\SoundtrackPostScanTask.cs" />
<Compile Include="People\PersonMetadataService.cs" />
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeHelpers.cs b/MediaBrowser.Providers/MediaInfo/FFProbeHelpers.cs
index 49c7ebec8..2044979e4 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeHelpers.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeHelpers.cs
@@ -12,6 +12,11 @@ namespace MediaBrowser.Providers.MediaInfo
/// <param name="result">The result.</param>
public static void NormalizeFFProbeResult(InternalMediaInfoResult result)
{
+ if (result == null)
+ {
+ throw new ArgumentNullException("result");
+ }
+
if (result.format != null && result.format.tags != null)
{
result.format.tags = ConvertDictionaryToCaseInSensitive(result.format.tags);
diff --git a/MediaBrowser.Providers/Movies/MovieDbSearch.cs b/MediaBrowser.Providers/Movies/MovieDbSearch.cs
index b8f176454..85a0d5fa1 100644
--- a/MediaBrowser.Providers/Movies/MovieDbSearch.cs
+++ b/MediaBrowser.Providers/Movies/MovieDbSearch.cs
@@ -147,7 +147,7 @@ namespace MediaBrowser.Providers.Movies
Name = i.title ?? i.original_title ?? i.name,
ImageUrl = string.IsNullOrWhiteSpace(i.poster_path) ? null : baseImageUrl + i.poster_path
};
-
+
if (!string.IsNullOrWhiteSpace(i.release_date))
{
DateTime r;
diff --git a/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs b/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
index a9b3d8e11..ab9ac2331 100644
--- a/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
+++ b/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
@@ -86,6 +87,8 @@ namespace MediaBrowser.Providers.Music
item.SetProviderId(MetadataProviders.MusicBrainzAlbumArtist, result.strMusicBrainzArtistID);
item.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, result.strMusicBrainzID);
+
+ item.Overview = (result.strDescriptionEN ?? string.Empty).StripHtml();
}
public string Name
diff --git a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
index ccab30bc6..94d682f44 100644
--- a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
+++ b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
@@ -67,7 +67,7 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrEmpty(artistMusicBrainzId))
{
- await FanartArtistProvider.Current.EnsureMovieXml(artistMusicBrainzId, cancellationToken).ConfigureAwait(false);
+ await FanartArtistProvider.Current.EnsureArtistXml(artistMusicBrainzId, cancellationToken).ConfigureAwait(false);
var artistXmlPath = FanartArtistProvider.GetArtistXmlPath(_config.CommonApplicationPaths, artistMusicBrainzId);
diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
index b9916dfba..a8df95fd1 100644
--- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
+++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
@@ -79,7 +79,7 @@ namespace MediaBrowser.Providers.Music
if (!String.IsNullOrEmpty(artistMusicBrainzId))
{
- await EnsureMovieXml(artistMusicBrainzId, cancellationToken).ConfigureAwait(false);
+ await EnsureArtistXml(artistMusicBrainzId, cancellationToken).ConfigureAwait(false);
var artistXmlPath = GetArtistXmlPath(_config.CommonApplicationPaths, artistMusicBrainzId);
@@ -390,7 +390,7 @@ namespace MediaBrowser.Providers.Music
}
private readonly Task _cachedTask = Task.FromResult(true);
- internal Task EnsureMovieXml(string musicBrainzId, CancellationToken cancellationToken)
+ internal Task EnsureArtistXml(string musicBrainzId, CancellationToken cancellationToken)
{
var xmlPath = GetArtistXmlPath(_config.ApplicationPaths, musicBrainzId);
diff --git a/MediaBrowser.Providers/Music/LastFmImageProvider.cs b/MediaBrowser.Providers/Music/LastFmImageProvider.cs
deleted file mode 100644
index b55a97351..000000000
--- a/MediaBrowser.Providers/Music/LastFmImageProvider.cs
+++ /dev/null
@@ -1,164 +0,0 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Providers.Music
-{
- public class LastfmImageProvider : IRemoteImageProvider, IHasOrder
- {
- private readonly IHttpClient _httpClient;
- private readonly IServerConfigurationManager _config;
-
- public LastfmImageProvider(IHttpClient httpClient, IServerConfigurationManager config)
- {
- _httpClient = httpClient;
- _config = config;
- }
-
- public string Name
- {
- get { return ProviderName; }
- }
-
- public static string ProviderName
- {
- get { return "last.fm"; }
- }
-
- public bool Supports(IHasImages item)
- {
- return item is MusicAlbum || item is MusicArtist;
- }
-
- public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
- {
- return new List<ImageType>
- {
- ImageType.Primary
- };
- }
-
- public Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, CancellationToken cancellationToken)
- {
- var list = new List<RemoteImageInfo>();
-
- RemoteImageInfo info = null;
-
- var musicBrainzId = item is MusicAlbum ?
- item.GetProviderId(MetadataProviders.MusicBrainzAlbum) :
- item.GetProviderId(MetadataProviders.MusicBrainzArtist);
-
- if (!string.IsNullOrEmpty(musicBrainzId))
- {
- var cachePath = Path.Combine(_config.ApplicationPaths.CachePath, "lastfm", musicBrainzId, "image.txt");
-
- try
- {
- var parts = File.ReadAllText(cachePath).Split('|');
-
- info = GetInfo(parts.FirstOrDefault(), parts.LastOrDefault());
- }
- catch (DirectoryNotFoundException)
- {
- }
- catch (FileNotFoundException)
- {
- }
- }
-
- if (info == null)
- {
- var musicBrainzReleaseGroupId = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
-
- if (!string.IsNullOrEmpty(musicBrainzReleaseGroupId))
- {
- var cachePath = Path.Combine(_config.ApplicationPaths.CachePath, "lastfm", musicBrainzReleaseGroupId, "image.txt");
-
- try
- {
- var parts = File.ReadAllText(cachePath).Split('|');
-
- info = GetInfo(parts.FirstOrDefault(), parts.LastOrDefault());
- }
- catch (DirectoryNotFoundException)
- {
- }
- catch (FileNotFoundException)
- {
- }
- }
- }
-
- if (info != null)
- {
- list.Add(info);
- }
-
- // The only info we have is size
- return Task.FromResult<IEnumerable<RemoteImageInfo>>(list.OrderByDescending(i => i.Width ?? 0));
- }
-
- private RemoteImageInfo GetInfo(string url, string size)
- {
- if (string.IsNullOrEmpty(url))
- {
- return null;
- }
-
- var info = new RemoteImageInfo
- {
- ProviderName = Name,
- Url = url,
- Type = ImageType.Primary
- };
-
- if (string.Equals(size, "mega", StringComparison.OrdinalIgnoreCase))
- {
-
- }
- else if (string.Equals(size, "extralarge", StringComparison.OrdinalIgnoreCase))
- {
-
- }
- else if (string.Equals(size, "large", StringComparison.OrdinalIgnoreCase))
- {
-
- }
- else if (string.Equals(size, "medium", StringComparison.OrdinalIgnoreCase))
- {
-
- }
-
- return info;
- }
-
- public int Order
- {
- get
- {
- // After all others
- return 3;
- }
- }
-
- public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
- {
- return _httpClient.GetResponse(new HttpRequestOptions
- {
- CancellationToken = cancellationToken,
- Url = url,
- ResourcePool = LastfmArtistProvider.LastfmResourcePool
- });
- }
- }
-}
diff --git a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs
deleted file mode 100644
index 846539748..000000000
--- a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs
+++ /dev/null
@@ -1,322 +0,0 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
-using MoreLinq;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Providers.Music
-{
- public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
- {
- private readonly IJsonSerializer _json;
- private readonly IHttpClient _httpClient;
-
- private readonly IServerConfigurationManager _config;
- private readonly ILogger _logger;
-
- public LastfmAlbumProvider(IHttpClient httpClient, IJsonSerializer json, IServerConfigurationManager config, ILogger logger)
- {
- _httpClient = httpClient;
- _json = json;
- _config = config;
- _logger = logger;
- }
-
- public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
- {
- return new List<RemoteSearchResult>();
- }
-
- public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
- {
- var result = new MetadataResult<MusicAlbum>();
-
- var lastFmData = await GetAlbumResult(id, cancellationToken).ConfigureAwait(false);
-
- if (lastFmData != null && lastFmData.album != null)
- {
- result.HasMetadata = true;
- result.Item = new MusicAlbum();
- ProcessAlbumData(result.Item, lastFmData.album);
- }
-
- return result;
- }
-
- private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumInfo item, CancellationToken cancellationToken)
- {
- // Try album release Id
- var id = item.GetReleaseId();
- if (!string.IsNullOrEmpty(id))
- {
- var result = await GetAlbumResult(id, cancellationToken).ConfigureAwait(false);
-
- if (result != null && result.album != null)
- {
- return result;
- }
- }
-
- // Try album release group Id
- id = item.GetReleaseGroupId();
- if (!string.IsNullOrEmpty(id))
- {
- var result = await GetAlbumResult(id, cancellationToken).ConfigureAwait(false);
-
- if (result != null && result.album != null)
- {
- return result;
- }
- }
-
- var albumArtist = item.GetAlbumArtist();
- // Get each song, distinct by the combination of AlbumArtist and Album
- var songs = item.SongInfos.DistinctBy(i => (i.AlbumArtists.FirstOrDefault() ?? string.Empty) + (i.Album ?? string.Empty), StringComparer.OrdinalIgnoreCase).ToList();
-
- foreach (var song in songs.Where(song => !string.IsNullOrEmpty(song.Album) && !string.IsNullOrEmpty(song.AlbumArtists.FirstOrDefault())))
- {
- var result = await GetAlbumResult(song.AlbumArtists.FirstOrDefault(), song.Album, cancellationToken).ConfigureAwait(false);
-
- if (result != null && result.album != null)
- {
- return result;
- }
- }
-
- if (string.IsNullOrEmpty(albumArtist))
- {
- return null;
- }
-
- return await GetAlbumResult(albumArtist, item.Name, cancellationToken);
- }
-
- private async Task<LastfmGetAlbumResult> GetAlbumResult(string artist, string album, CancellationToken cancellationToken)
- {
- // Get albu info using artist and album name
- var url = LastfmArtistProvider.RootUrl + string.Format("method=album.getInfo&artist={0}&album={1}&api_key={2}&format=json", UrlEncode(artist), UrlEncode(album), LastfmArtistProvider.ApiKey);
-
- using (var json = await _httpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = LastfmArtistProvider.LastfmResourcePool,
- CancellationToken = cancellationToken,
- EnableHttpCompression = false
-
- }).ConfigureAwait(false))
- {
- using (var reader = new StreamReader(json))
- {
- var jsonText = await reader.ReadToEndAsync().ConfigureAwait(false);
-
- // Fix their bad json
- jsonText = jsonText.Replace("\"#text\"", "\"url\"");
-
- return _json.DeserializeFromString<LastfmGetAlbumResult>(jsonText);
- }
- }
- }
-
- private async Task<LastfmGetAlbumResult> GetAlbumResult(string musicbraizId, CancellationToken cancellationToken)
- {
- // Get albu info using artist and album name
- var url = LastfmArtistProvider.RootUrl + string.Format("method=album.getInfo&mbid={0}&api_key={1}&format=json", musicbraizId, LastfmArtistProvider.ApiKey);
-
- using (var json = await _httpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = LastfmArtistProvider.LastfmResourcePool,
- CancellationToken = cancellationToken,
- EnableHttpCompression = false
-
- }).ConfigureAwait(false))
- {
- return _json.DeserializeFromStream<LastfmGetAlbumResult>(json);
- }
- }
-
- private void ProcessAlbumData(MusicAlbum item, LastfmAlbum data)
- {
- var overview = data.wiki != null ? data.wiki.content : null;
-
- if (!item.LockedFields.Contains(MetadataFields.Overview))
- {
- item.Overview = overview;
- }
-
- // Only grab the date here if the album doesn't already have one, since id3 tags are preferred
- DateTime release;
-
- if (DateTime.TryParse(data.releasedate, out release))
- {
- // Lastfm sends back null as sometimes 1901, other times 0
- if (release.Year > 1901)
- {
- if (!item.PremiereDate.HasValue)
- {
- item.PremiereDate = release;
- }
-
- if (!item.ProductionYear.HasValue)
- {
- item.ProductionYear = release.Year;
- }
- }
- }
-
- string imageSize;
- var url = LastfmHelper.GetImageUrl(data, out imageSize);
-
- var musicBrainzId = item.GetProviderId(MetadataProviders.MusicBrainzAlbum) ??
- item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
-
- if (!string.IsNullOrEmpty(musicBrainzId) && !string.IsNullOrEmpty(url))
- {
- LastfmHelper.SaveImageInfo(_config.ApplicationPaths, _logger, musicBrainzId, url, imageSize);
- }
- }
-
- /// <summary>
- /// Encodes an URL.
- /// </summary>
- /// <param name="name">The name.</param>
- /// <returns>System.String.</returns>
- private string UrlEncode(string name)
- {
- return WebUtility.UrlEncode(name);
- }
-
- public string Name
- {
- get { return "last.fm"; }
- }
-
- public int Order
- {
- get
- {
- // After fanart & audiodb
- return 2;
- }
- }
-
- public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
- }
-
- #region Result Objects
-
- public class LastfmStats
- {
- public string listeners { get; set; }
- public string playcount { get; set; }
- }
-
- public class LastfmTag
- {
- public string name { get; set; }
- public string url { get; set; }
- }
-
-
- public class LastfmTags
- {
- public List<LastfmTag> tag { get; set; }
- }
-
- public class LastfmFormationInfo
- {
- public string yearfrom { get; set; }
- public string yearto { get; set; }
- }
-
- public class LastFmBio
- {
- public string published { get; set; }
- public string summary { get; set; }
- public string content { get; set; }
- public string placeformed { get; set; }
- public string yearformed { get; set; }
- public List<LastfmFormationInfo> formationlist { get; set; }
- }
-
- public class LastFmImage
- {
- public string url { get; set; }
- public string size { get; set; }
- }
-
- public class LastfmArtist : IHasLastFmImages
- {
- public string name { get; set; }
- public string mbid { get; set; }
- public string url { get; set; }
- public string streamable { get; set; }
- public string ontour { get; set; }
- public LastfmStats stats { get; set; }
- public List<LastfmArtist> similar { get; set; }
- public LastfmTags tags { get; set; }
- public LastFmBio bio { get; set; }
- public List<LastFmImage> image { get; set; }
- }
-
-
- public class LastfmAlbum : IHasLastFmImages
- {
- public string name { get; set; }
- public string artist { get; set; }
- public string id { get; set; }
- public string mbid { get; set; }
- public string releasedate { get; set; }
- public int listeners { get; set; }
- public int playcount { get; set; }
- public LastfmTags toptags { get; set; }
- public LastFmBio wiki { get; set; }
- public List<LastFmImage> image { get; set; }
- }
-
- public interface IHasLastFmImages
- {
- List<LastFmImage> image { get; set; }
- }
-
- public class LastfmGetAlbumResult
- {
- public LastfmAlbum album { get; set; }
- }
-
- public class LastfmGetArtistResult
- {
- public LastfmArtist artist { get; set; }
- }
-
- public class Artistmatches
- {
- public List<LastfmArtist> artist { get; set; }
- }
-
- public class LastfmArtistSearchResult
- {
- public Artistmatches artistmatches { get; set; }
- }
-
- public class LastfmArtistSearchResults
- {
- public LastfmArtistSearchResult results { get; set; }
- }
-
- #endregion
-}
diff --git a/MediaBrowser.Providers/Music/LastfmArtistProvider.cs b/MediaBrowser.Providers/Music/LastfmArtistProvider.cs
deleted file mode 100644
index a2aa9d719..000000000
--- a/MediaBrowser.Providers/Music/LastfmArtistProvider.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Net;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Providers.Music
-{
- public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>, IHasOrder
- {
- private readonly IJsonSerializer _json;
- private readonly IHttpClient _httpClient;
-
- internal static readonly SemaphoreSlim LastfmResourcePool = new SemaphoreSlim(4, 4);
-
- internal const string RootUrl = @"http://ws.audioscrobbler.com/2.0/?";
- internal static string ApiKey = "7b76553c3eb1d341d642755aecc40a33";
-
- private readonly IServerConfigurationManager _config;
- private readonly ILogger _logger;
-
- public LastfmArtistProvider(IHttpClient httpClient, IJsonSerializer json, IServerConfigurationManager config, ILogger logger)
- {
- _httpClient = httpClient;
- _json = json;
- _config = config;
- _logger = logger;
- }
-
- public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
- {
- return new List<RemoteSearchResult>();
- }
-
- public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo id, CancellationToken cancellationToken)
- {
- var result = new MetadataResult<MusicArtist>();
-
- var musicBrainzId = id.GetMusicBrainzArtistId();
-
- if (!String.IsNullOrWhiteSpace(musicBrainzId))
- {
- cancellationToken.ThrowIfCancellationRequested();
-
- result.Item = new MusicArtist();
- result.HasMetadata = true;
-
- await FetchLastfmData(result.Item, musicBrainzId, cancellationToken).ConfigureAwait(false);
- }
-
- return result;
- }
-
- protected async Task FetchLastfmData(MusicArtist item, string musicBrainzId, CancellationToken cancellationToken)
- {
- // Get artist info with provided id
- var url = RootUrl + String.Format("method=artist.getInfo&mbid={0}&api_key={1}&format=json", UrlEncode(musicBrainzId), ApiKey);
-
- LastfmGetArtistResult result;
-
- using (var json = await _httpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = LastfmResourcePool,
- CancellationToken = cancellationToken,
- EnableHttpCompression = false
-
- }).ConfigureAwait(false))
- {
- using (var reader = new StreamReader(json))
- {
- var jsonText = await reader.ReadToEndAsync().ConfigureAwait(false);
-
- // Fix their bad json
- jsonText = jsonText.Replace("\"#text\"", "\"url\"");
-
- result = _json.DeserializeFromString<LastfmGetArtistResult>(jsonText);
- }
- }
-
- if (result != null && result.artist != null)
- {
- ProcessArtistData(item, result.artist, musicBrainzId);
- }
- }
-
- private void ProcessArtistData(MusicArtist artist, LastfmArtist data, string musicBrainzId)
- {
- var yearFormed = 0;
-
- if (data.bio != null)
- {
- Int32.TryParse(data.bio.yearformed, out yearFormed);
- if (!artist.LockedFields.Contains(MetadataFields.Overview))
- {
- artist.Overview = (data.bio.content ?? string.Empty).StripHtml();
- }
- if (!string.IsNullOrEmpty(data.bio.placeformed) && !artist.LockedFields.Contains(MetadataFields.ProductionLocations))
- {
- artist.AddProductionLocation(data.bio.placeformed);
- }
- }
-
- if (yearFormed > 0)
- {
- artist.PremiereDate = new DateTime(yearFormed, 1, 1, 0, 0, 0, DateTimeKind.Utc);
-
- artist.ProductionYear = yearFormed;
- }
-
- string imageSize;
- var url = LastfmHelper.GetImageUrl(data, out imageSize);
-
- if (!string.IsNullOrEmpty(musicBrainzId) && !string.IsNullOrEmpty(url))
- {
- LastfmHelper.SaveImageInfo(_config.ApplicationPaths, _logger, musicBrainzId, url, imageSize);
- }
- }
-
- /// <summary>
- /// Encodes an URL.
- /// </summary>
- /// <param name="name">The name.</param>
- /// <returns>System.String.</returns>
- private string UrlEncode(string name)
- {
- return WebUtility.UrlEncode(name);
- }
-
- public string Name
- {
- get { return "last.fm"; }
- }
-
- public int Order
- {
- get
- {
- // After fanart & audiodb
- return 2;
- }
- }
-
- public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
- }
-}
diff --git a/MediaBrowser.Providers/Music/LastfmHelper.cs b/MediaBrowser.Providers/Music/LastfmHelper.cs
deleted file mode 100644
index 7c83cec6b..000000000
--- a/MediaBrowser.Providers/Music/LastfmHelper.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Model.Logging;
-using System;
-using System.IO;
-using System.Linq;
-
-namespace MediaBrowser.Providers.Music
-{
- public static class LastfmHelper
- {
- public static string GetImageUrl(IHasLastFmImages data, out string size)
- {
- size = null;
-
- if (data.image == null)
- {
- return null;
- }
-
- var validImages = data.image
- .Where(i => !string.IsNullOrWhiteSpace(i.url))
- .ToList();
-
- var img = validImages
- .FirstOrDefault(i => string.Equals(i.size, "mega", StringComparison.OrdinalIgnoreCase)) ??
- data.image.FirstOrDefault(i => string.Equals(i.size, "extralarge", StringComparison.OrdinalIgnoreCase)) ??
- data.image.FirstOrDefault(i => string.Equals(i.size, "large", StringComparison.OrdinalIgnoreCase)) ??
- data.image.FirstOrDefault(i => string.Equals(i.size, "medium", StringComparison.OrdinalIgnoreCase)) ??
- data.image.FirstOrDefault();
-
- if (img != null)
- {
- size = img.size;
- return img.url;
- }
-
- return null;
- }
-
- public static void SaveImageInfo(IApplicationPaths appPaths, ILogger logger, string musicBrainzId, string url, string size)
- {
- if (appPaths == null)
- {
- throw new ArgumentNullException("appPaths");
- }
- if (string.IsNullOrEmpty(musicBrainzId))
- {
- throw new ArgumentNullException("musicBrainzId");
- }
- if (string.IsNullOrEmpty(url))
- {
- throw new ArgumentNullException("url");
- }
-
- var cachePath = Path.Combine(appPaths.CachePath, "lastfm", musicBrainzId, "image.txt");
-
- try
- {
- if (string.IsNullOrEmpty(url))
- {
- File.Delete(cachePath);
- }
- else
- {
- Directory.CreateDirectory(Path.GetDirectoryName(cachePath));
- File.WriteAllText(cachePath, url + "|" + size);
- }
- }
- catch (IOException ex)
- {
- // Don't fail if this is unable to write
- logger.ErrorException("Error saving to {0}", ex, cachePath);
- }
- }
- }
-}
diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
index 76d93d946..08e9a3abf 100644
--- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
@@ -57,22 +57,27 @@ namespace MediaBrowser.Providers.Omdb
Item = new Series()
};
- var imdbId = info.GetProviderId(MetadataProviders.Imdb);
-
var searchResult = await GetSeriesImdbId(info, cancellationToken).ConfigureAwait(false);
- result.Item.Name = searchResult.Item3;
+ result.Item.Name = searchResult.Item4;
- if (string.IsNullOrEmpty(imdbId))
+ if (!string.IsNullOrEmpty(searchResult.Item1))
{
- imdbId = searchResult.Item1;
+ result.Item.SetProviderId(MetadataProviders.Imdb, searchResult.Item1);
+ }
- if (!string.IsNullOrEmpty(searchResult.Item2))
- {
- result.Item.SetProviderId(MetadataProviders.Tvdb, searchResult.Item2);
- }
+ if (!string.IsNullOrEmpty(searchResult.Item2))
+ {
+ result.Item.SetProviderId(MetadataProviders.Tmdb, searchResult.Item2);
}
-
- if (!string.IsNullOrEmpty(imdbId))
+
+ if (!string.IsNullOrEmpty(searchResult.Item3))
+ {
+ result.Item.SetProviderId(MetadataProviders.Tvdb, searchResult.Item3);
+ }
+
+ var imdbId = result.Item.GetProviderId(MetadataProviders.Imdb);
+
+ if (!string.IsNullOrEmpty(info.GetProviderId(MetadataProviders.Imdb)))
{
result.Item.SetProviderId(MetadataProviders.Imdb, imdbId);
result.HasMetadata = true;
@@ -148,16 +153,26 @@ namespace MediaBrowser.Providers.Omdb
return new Tuple<string, string, string>(imdb, tmdb, name);
}
- private async Task<Tuple<string, string, string>> GetSeriesImdbId(SeriesInfo info, CancellationToken cancellationToken)
+ private async Task<Tuple<string, string, string, string>> GetSeriesImdbId(SeriesInfo info, CancellationToken cancellationToken)
{
- var result = await TvdbSeriesProvider.Current.GetMetadata(info, cancellationToken)
- .ConfigureAwait(false);
+ //var result = await TvdbSeriesProvider.Current.GetMetadata(info, cancellationToken)
+ // .ConfigureAwait(false);
+
+ //var imdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Imdb) : null;
+ //var tvdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Tvdb) : null;
+ //var name = result.HasMetadata ? result.Item.Name : null;
+
+ //return new Tuple<string, string, string>(imdb, tvdb, name);
+
+ var result = await MovieDbSeriesProvider.Current.GetMetadata(info, cancellationToken)
+ .ConfigureAwait(false);
var imdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Imdb) : null;
+ var tmdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Tmdb) : null;
var tvdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Tvdb) : null;
var name = result.HasMetadata ? result.Item.Name : null;
- return new Tuple<string, string, string>(imdb, tvdb, name);
+ return new Tuple<string, string, string, string>(imdb, tmdb, tvdb, name);
}
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs
index c690fbd84..c25fbee6f 100644
--- a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs
+++ b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs
@@ -265,7 +265,7 @@ namespace MediaBrowser.Providers.Subtitles
var hasCopy = hash;
return results.Where(x => x.SubBad == "0" && mediaFilter(x))
- .OrderBy(x => x.MovieHash == hash)
+ .OrderBy(x => (x.MovieHash == hash ? 0 : 1))
.ThenBy(x => Math.Abs(long.Parse(x.MovieByteSize, _usCulture) - movieByteSize))
.ThenByDescending(x => int.Parse(x.SubDownloadsCnt, _usCulture))
.ThenByDescending(x => double.Parse(x.SubRating, _usCulture))
diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
index 6ca548829..acff0231f 100644
--- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
@@ -223,7 +223,7 @@ namespace MediaBrowser.Providers.TV
var download = false;
var automaticUpdatesEnabled = _config.Configuration.EnableTvDbUpdates;
- const int cacheDays = 3;
+ const int cacheDays = 2;
var seriesFile = files.FirstOrDefault(i => string.Equals(seriesXmlFilename, i.Name, StringComparison.OrdinalIgnoreCase));
// No need to check age if automatic updates are enabled
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
index c02ad177f..28cbd20e0 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
@@ -28,7 +28,6 @@ namespace MediaBrowser.Server.Implementations.Channels
{
private IChannel[] _channels;
private IChannelFactory[] _factories;
- private List<Channel> _channelEntities = new List<Channel>();
private readonly IUserManager _userManager;
private readonly IUserDataManager _userDataManager;
@@ -63,13 +62,13 @@ namespace MediaBrowser.Server.Implementations.Channels
{
get
{
- return TimeSpan.FromDays(1);
+ return TimeSpan.FromHours(12);
}
}
public void AddParts(IEnumerable<IChannel> channels, IEnumerable<IChannelFactory> factories)
{
- _channels = channels.ToArray();
+ _channels = channels.Where(i => !(i is IFactoryChannel)).ToArray();
_factories = factories.ToArray();
}
@@ -113,7 +112,10 @@ namespace MediaBrowser.Server.Implementations.Channels
? null
: _userManager.GetUserById(new Guid(query.UserId));
- var channels = _channelEntities.OrderBy(i => i.SortName).ToList();
+ var channels = GetAllChannels()
+ .Select(GetChannelEntity)
+ .OrderBy(i => i.SortName)
+ .ToList();
if (query.SupportsLatestItems.HasValue)
{
@@ -167,8 +169,6 @@ namespace MediaBrowser.Server.Implementations.Channels
{
var allChannelsList = GetAllChannels().ToList();
- var list = new List<Channel>();
-
var numComplete = 0;
foreach (var channelInfo in allChannelsList)
@@ -179,8 +179,6 @@ namespace MediaBrowser.Server.Implementations.Channels
{
var item = await GetChannel(channelInfo, cancellationToken).ConfigureAwait(false);
- list.Add(item);
-
_libraryManager.RegisterItem(item);
}
catch (OperationCanceledException)
@@ -199,16 +197,28 @@ namespace MediaBrowser.Server.Implementations.Channels
progress.Report(100 * percent);
}
- _channelEntities = list.ToList();
progress.Report(100);
}
+ private Channel GetChannelEntity(IChannel channel)
+ {
+ var item = GetChannel(GetInternalChannelId(channel.Name).ToString("N"));
+
+ if (item == null)
+ {
+ item = GetChannel(channel, CancellationToken.None).Result;
+
+ _libraryManager.RegisterItem(item);
+ }
+
+ return item;
+ }
+
public async Task<IEnumerable<MediaSourceInfo>> GetChannelItemMediaSources(string id, CancellationToken cancellationToken)
{
var item = (IChannelMediaItem)_libraryManager.GetItemById(id);
- var channelGuid = new Guid(item.ChannelId);
- var channel = _channelEntities.First(i => i.Id == channelGuid);
+ var channel = GetChannel(item.ChannelId);
var channelPlugin = GetChannelProvider(channel);
var requiresCallback = channelPlugin as IRequiresMediaInfoCallback;
@@ -385,7 +395,7 @@ namespace MediaBrowser.Server.Implementations.Channels
var val = width.Value;
var res = list
- .OrderBy(i => i.Width.HasValue && i.Width.Value <= val)
+ .OrderBy(i => (i.Width.HasValue && i.Width.Value <= val ? 0 : 1))
.ThenBy(i => Math.Abs((i.Width ?? 0) - val))
.ThenByDescending(i => i.Width ?? 0)
.ThenBy(list.IndexOf)
@@ -484,7 +494,8 @@ namespace MediaBrowser.Server.Implementations.Channels
public IEnumerable<ChannelFeatures> GetAllChannelFeatures()
{
- return _channelEntities
+ return GetAllChannels()
+ .Select(GetChannelEntity)
.OrderBy(i => i.SortName)
.Select(i => GetChannelFeatures(i.Id.ToString("N")));
}
@@ -542,7 +553,7 @@ namespace MediaBrowser.Server.Implementations.Channels
throw new ArgumentException("User not found.");
}
- var channels = _channels;
+ var channels = GetAllChannels();
if (query.ChannelIds.Length > 0)
{
@@ -603,8 +614,8 @@ namespace MediaBrowser.Server.Implementations.Channels
var itemTasks = items.Select(i =>
{
var channelProvider = i.Item1;
- var channel = GetChannel(GetInternalChannelId(channelProvider.Name).ToString("N"));
- return GetChannelItemEntity(i.Item2, channelProvider, channel, token);
+ var internalChannelId = GetInternalChannelId(channelProvider.Name);
+ return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token);
});
var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false);
@@ -696,7 +707,7 @@ namespace MediaBrowser.Server.Implementations.Channels
? null
: _userManager.GetUserById(new Guid(query.UserId));
- var channels = _channels;
+ var channels = GetAllChannels();
if (query.ChannelIds.Length > 0)
{
@@ -761,8 +772,8 @@ namespace MediaBrowser.Server.Implementations.Channels
var itemTasks = items.Select(i =>
{
var channelProvider = i.Item1;
- var channel = GetChannel(GetInternalChannelId(channelProvider.Name).ToString("N"));
- return GetChannelItemEntity(i.Item2, channelProvider, channel, token);
+ var internalChannelId = GetInternalChannelId(channelProvider.Name);
+ return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token);
});
var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false);
@@ -837,9 +848,8 @@ namespace MediaBrowser.Server.Implementations.Channels
public async Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
{
- var queryChannelId = query.ChannelId;
// Get the internal channel entity
- var channel = _channelEntities.First(i => i.Id == new Guid(queryChannelId));
+ var channel = GetChannel(query.ChannelId);
// Find the corresponding channel provider plugin
var channelProvider = GetChannelProvider(channel);
@@ -886,7 +896,7 @@ namespace MediaBrowser.Server.Implementations.Channels
var providerTotalRecordCount = providerLimit.HasValue ? itemsResult.TotalRecordCount : null;
- var tasks = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel, cancellationToken));
+ var tasks = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken));
var internalItems = await Task.WhenAll(tasks).ConfigureAwait(false);
@@ -1086,7 +1096,7 @@ namespace MediaBrowser.Server.Implementations.Channels
(channelProvider.Name ?? string.Empty) + "16";
}
- private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Channel internalChannel, CancellationToken cancellationToken)
+ private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken)
{
BaseItem item;
Guid id;
@@ -1158,7 +1168,7 @@ namespace MediaBrowser.Server.Implementations.Channels
channelItem.OriginalImageUrl = info.ImageUrl;
channelItem.ExternalId = info.Id;
- channelItem.ChannelId = internalChannel.Id.ToString("N");
+ channelItem.ChannelId = internalChannelId.ToString("N");
channelItem.ChannelItemType = info.Type;
if (isNew)
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index 7bc7838c6..8e51e1d7d 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -191,7 +191,7 @@ namespace MediaBrowser.Server.Implementations.Collections
if (fireEvent)
{
- EventHelper.FireEventIfNotNull(ItemsRemovedFromCollection, this, new CollectionModifiedEventArgs
+ EventHelper.FireEventIfNotNull(ItemsAddedToCollection, this, new CollectionModifiedEventArgs
{
Collection = collection,
ItemsChanged = itemList
diff --git a/MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs b/MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs
index 07c86ed31..aaa02c720 100644
--- a/MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs
+++ b/MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs
@@ -26,7 +26,7 @@ namespace MediaBrowser.Server.Implementations.Collections
public override bool IsHiddenFromUser(User user)
{
- return true;
+ return !user.Configuration.DisplayCollectionsView;
}
public override string CollectionType
diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
index 404c333c2..18117c100 100644
--- a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
+++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
@@ -211,7 +211,7 @@ namespace MediaBrowser.Server.Implementations.Configuration
}
}
- public void SetPreferredMetadataService(string service)
+ public void DisableMetadataService(string service)
{
DisableMetadataService(typeof(Movie), Configuration, service);
DisableMetadataService(typeof(MusicAlbum), Configuration, service);
diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
index 86bd6b731..09071cbf9 100644
--- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
@@ -118,14 +118,19 @@ namespace MediaBrowser.Server.Implementations.Drawing
public async Task ProcessImage(ImageProcessingOptions options, Stream toStream)
{
- if (options == null)
+ var file = await ProcessImage(options).ConfigureAwait(false);
+
+ using (var fileStream = _fileSystem.GetFileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, true))
{
- throw new ArgumentNullException("options");
+ await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
}
+ }
- if (toStream == null)
+ public async Task<string> ProcessImage(ImageProcessingOptions options)
+ {
+ if (options == null)
{
- throw new ArgumentNullException("toStream");
+ throw new ArgumentNullException("options");
}
var originalImagePath = options.Image.Path;
@@ -133,11 +138,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
if (options.HasDefaultOptions() && options.Enhancers.Count == 0 && !options.CropWhiteSpace)
{
// Just spit out the original file if all the options are default
- using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
- {
- await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
- return;
- }
+ return originalImagePath;
}
var dateModified = options.Image.DateModified;
@@ -166,30 +167,13 @@ namespace MediaBrowser.Server.Implementations.Drawing
if (options.HasDefaultOptionsWithoutSize() && newSize.Equals(originalImageSize) && options.Enhancers.Count == 0)
{
// Just spit out the original file if the new size equals the old
- using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
- {
- await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
- return;
- }
+ return originalImagePath;
}
var quality = options.Quality ?? 90;
var cacheFilePath = GetCacheFilePath(originalImagePath, newSize, quality, dateModified, options.OutputFormat, options.AddPlayedIndicator, options.PercentPlayed, options.UnplayedCount, options.BackgroundColor);
- try
- {
- using (var fileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
- {
- await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
- return;
- }
- }
- catch (IOException)
- {
- // Cache file doesn't exist or is currently being written to
- }
-
var semaphore = GetLock(cacheFilePath);
await semaphore.WaitAsync().ConfigureAwait(false);
@@ -197,17 +181,12 @@ namespace MediaBrowser.Server.Implementations.Drawing
// Check again in case of lock contention
try
{
- using (var fileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
+ if (File.Exists(cacheFilePath))
{
- await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
semaphore.Release();
- return;
+ return cacheFilePath;
}
}
- catch (IOException)
- {
- // Cache file doesn't exist or is currently being written to
- }
catch
{
semaphore.Release();
@@ -218,37 +197,6 @@ namespace MediaBrowser.Server.Implementations.Drawing
{
var hasPostProcessing = !string.IsNullOrEmpty(options.BackgroundColor) || options.UnplayedCount.HasValue || options.AddPlayedIndicator || options.PercentPlayed.HasValue;
- //if (!hasPostProcessing)
- //{
- // using (var outputStream = await _mediaEncoder.EncodeImage(new ImageEncodingOptions
- // {
- // InputPath = originalImagePath,
- // MaxHeight = options.MaxHeight,
- // MaxWidth = options.MaxWidth,
- // Height = options.Height,
- // Width = options.Width,
- // Quality = options.Quality,
- // Format = options.OutputFormat == ImageOutputFormat.Original ? Path.GetExtension(originalImagePath).TrimStart('.') : options.OutputFormat.ToString().ToLower()
-
- // }, CancellationToken.None).ConfigureAwait(false))
- // {
- // using (var outputMemoryStream = new MemoryStream())
- // {
- // // Save to the memory stream
- // await outputStream.CopyToAsync(outputMemoryStream).ConfigureAwait(false);
-
- // var bytes = outputMemoryStream.ToArray();
-
- // await toStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
-
- // // kick off a task to cache the result
- // await CacheResizedImage(cacheFilePath, bytes).ConfigureAwait(false);
- // }
-
- // return;
- // }
- //}
-
using (var fileStream = _fileSystem.GetFileStream(originalImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
{
// Copy to memory stream to avoid Image locking file
@@ -289,18 +237,16 @@ namespace MediaBrowser.Server.Implementations.Drawing
var outputFormat = GetOutputFormat(originalImage, options.OutputFormat);
- using (var outputMemoryStream = new MemoryStream())
+ Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath));
+
+ // Save to the cache location
+ using (var cacheFileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, false))
{
// Save to the memory stream
- thumbnail.Save(outputFormat, outputMemoryStream, quality);
-
- var bytes = outputMemoryStream.ToArray();
-
- await toStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
-
- // kick off a task to cache the result
- await CacheResizedImage(cacheFilePath, bytes).ConfigureAwait(false);
+ thumbnail.Save(outputFormat, cacheFileStream, quality);
}
+
+ return cacheFilePath;
}
}
@@ -324,9 +270,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
{
try
{
- var parentPath = Path.GetDirectoryName(cacheFilePath);
-
- Directory.CreateDirectory(parentPath);
+ Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath));
// Save to the cache location
using (var cacheFileStream = _fileSystem.GetFileStream(cacheFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, true))
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
index 340149182..62a43751d 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -5,6 +5,8 @@ using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;
+using MediaBrowser.Server.Implementations.HttpServer.NetListener;
+using MediaBrowser.Server.Implementations.HttpServer.SocketSharp;
using ServiceStack;
using ServiceStack.Api.Swagger;
using ServiceStack.Host;
@@ -17,7 +19,6 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using System.Net;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
@@ -34,17 +35,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer
private readonly List<IRestfulService> _restServices = new List<IRestfulService>();
- private HttpListener Listener { get; set; }
- protected bool IsStarted = false;
+ private IHttpListener _listener;
- private readonly AutoResetEvent _listenForNextRequest = new AutoResetEvent(false);
private readonly SmartThreadPool _threadPoolManager;
+ private const int IdleTimeout = 300;
- private const int IdleTimeout = 300;
-
private readonly ContainerAdapter _containerAdapter;
- private readonly ConcurrentDictionary<string, string> _localEndPoints = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
public event EventHandler<WebSocketConnectEventArgs> WebSocketConnected;
/// <summary>
@@ -53,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <value>The local end points.</value>
public IEnumerable<string> LocalEndPoints
{
- get { return _localEndPoints.Keys.ToList(); }
+ get { return _listener == null ? new List<string>() : _listener.LocalEndPoints; }
}
public HttpListenerHost(IApplicationHost applicationHost, ILogManager logManager, string serviceName, string handlerPath, string defaultRedirectPath, params Assembly[] assembliesWithServices)
@@ -148,175 +145,40 @@ namespace MediaBrowser.Server.Implementations.HttpServer
public override ServiceStackHost Start(string listeningAtUrlBase)
{
- StartListener(Listen);
+ StartListener();
return this;
}
/// <summary>
/// Starts the Web Service
/// </summary>
- private void StartListener(WaitCallback listenCallback)
+ private void StartListener()
{
- // *** Already running - just leave it in place
- if (IsStarted)
- return;
-
- if (Listener == null)
- Listener = new HttpListener();
-
HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First());
- foreach (var prefix in UrlPrefixes)
- {
- _logger.Info("Adding HttpListener prefix " + prefix);
- Listener.Prefixes.Add(prefix);
- }
-
- IsStarted = true;
- _logger.Info("Starting HttpListner");
- Listener.Start();
- _logger.Info("HttpListener started");
+ _listener = NativeWebSocket.IsSupported
+ ? _listener = new HttpListenerServer(_logger, _threadPoolManager)
+ : _listener = new WebSocketSharpListener(_logger, _threadPoolManager);
- ThreadPool.QueueUserWorkItem(listenCallback);
- }
+ _listener.WebSocketHandler = WebSocketHandler;
+ _listener.ErrorHandler = ErrorHandler;
+ _listener.RequestHandler = RequestHandler;
- private bool IsListening
- {
- get { return this.IsStarted && this.Listener != null && this.Listener.IsListening; }
+ _listener.Start(UrlPrefixes);
}
- // Loop here to begin processing of new requests.
- private void Listen(object state)
+ private void WebSocketHandler(WebSocketConnectEventArgs args)
{
- while (IsListening)
+ if (WebSocketConnected != null)
{
- if (Listener == null) return;
-
- try
- {
- Listener.BeginGetContext(ListenerCallback, Listener);
- _listenForNextRequest.WaitOne();
- }
- catch (Exception ex)
- {
- _logger.Error("Listen()", ex);
- return;
- }
- if (Listener == null) return;
+ WebSocketConnected(this, args);
}
}
- // Handle the processing of a request in here.
- private void ListenerCallback(IAsyncResult asyncResult)
+ private void ErrorHandler(Exception ex, IRequest httpReq)
{
- var listener = asyncResult.AsyncState as HttpListener;
- HttpListenerContext context;
-
- if (listener == null) return;
- var isListening = listener.IsListening;
-
try
{
- if (!isListening)
- {
- _logger.Debug("Ignoring ListenerCallback() as HttpListener is no longer listening"); return;
- }
- // The EndGetContext() method, as with all Begin/End asynchronous methods in the .NET Framework,
- // blocks until there is a request to be processed or some type of data is available.
- context = listener.EndGetContext(asyncResult);
- }
- catch (Exception ex)
- {
- // You will get an exception when httpListener.Stop() is called
- // because there will be a thread stopped waiting on the .EndGetContext()
- // method, and again, that is just the way most Begin/End asynchronous
- // methods of the .NET Framework work.
- var errMsg = ex + ": " + IsListening;
- _logger.Warn(errMsg);
- return;
- }
- finally
- {
- // Once we know we have a request (or exception), we signal the other thread
- // so that it calls the BeginGetContext() (or possibly exits if we're not
- // listening any more) method to start handling the next incoming request
- // while we continue to process this request on a different thread.
- _listenForNextRequest.Set();
- }
-
- _threadPoolManager.QueueWorkItem(() => InitTask(context));
- }
-
- public virtual void InitTask(HttpListenerContext context)
- {
- try
- {
- var task = this.ProcessRequestAsync(context);
- task.ContinueWith(x => HandleError(x.Exception, context), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent);
-
- if (task.Status == TaskStatus.Created)
- {
- task.RunSynchronously();
- }
- }
- catch (Exception ex)
- {
- HandleError(ex, context);
- }
- }
-
- /// <summary>
- /// Logs the HTTP request.
- /// </summary>
- /// <param name="request">The request.</param>
- private void LogHttpRequest(HttpListenerRequest request)
- {
- var endpoint = request.LocalEndPoint;
-
- if (endpoint != null)
- {
- var address = endpoint.ToString();
-
- _localEndPoints.GetOrAdd(address, address);
- }
-
- if (EnableHttpRequestLogging)
- {
- LoggerUtils.LogRequest(_logger, request);
- }
- }
-
- /// <summary>
- /// Processes the web socket request.
- /// </summary>
- /// <param name="ctx">The CTX.</param>
- /// <returns>Task.</returns>
- private async Task ProcessWebSocketRequest(HttpListenerContext ctx)
- {
-#if !__MonoCS__
- try
- {
- var webSocketContext = await ctx.AcceptWebSocketAsync(null).ConfigureAwait(false);
- if (WebSocketConnected != null)
- {
- WebSocketConnected(this, new WebSocketConnectEventArgs { WebSocket = new NativeWebSocket(webSocketContext.WebSocket, _logger), Endpoint = ctx.Request.RemoteEndPoint.ToString() });
- }
- }
- catch (Exception ex)
- {
- _logger.ErrorException("AcceptWebSocketAsync error", ex);
- ctx.Response.StatusCode = 500;
- ctx.Response.Close();
- }
-#endif
- }
-
- private void HandleError(Exception ex, HttpListenerContext context)
- {
- try
- {
- var operationName = context.Request.GetOperationName();
- var httpReq = GetRequest(context, operationName);
var httpRes = httpReq.Response;
if (httpRes.IsClosed)
@@ -366,84 +228,55 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
}
- private static ListenerRequest GetRequest(HttpListenerContext httpContext, string operationName)
- {
- var req = new ListenerRequest(httpContext, operationName, RequestAttributes.None);
- req.RequestAttributes = req.GetAttributes();
-
- return req;
- }
-
/// <summary>
/// Shut down the Web Service
/// </summary>
public void Stop()
{
- if (Listener != null)
+ if (_listener != null)
{
- foreach (var prefix in UrlPrefixes)
- {
- Listener.Prefixes.Remove(prefix);
- }
-
- Listener.Close();
+ _listener.Stop();
}
}
/// <summary>
/// Overridable method that can be used to implement a custom hnandler
/// </summary>
- /// <param name="context"></param>
- protected Task ProcessRequestAsync(HttpListenerContext context)
+ /// <param name="httpReq">The HTTP req.</param>
+ /// <param name="url">The URL.</param>
+ /// <returns>Task.</returns>
+ protected Task RequestHandler(IHttpRequest httpReq, Uri url)
{
- var request = context.Request;
-
- LogHttpRequest(request);
+ var date = DateTime.Now;
- if (request.IsWebSocketRequest)
- {
- return ProcessWebSocketRequest(context);
- }
+ var httpRes = httpReq.Response;
- var localPath = request.Url.LocalPath;
+ var operationName = httpReq.OperationName;
+ var localPath = url.LocalPath;
if (string.Equals(localPath, "/" + HandlerPath + "/", StringComparison.OrdinalIgnoreCase))
{
- context.Response.Redirect(DefaultRedirectPath);
- context.Response.Close();
+ httpRes.RedirectToUrl(DefaultRedirectPath);
return Task.FromResult(true);
}
if (string.Equals(localPath, "/" + HandlerPath, StringComparison.OrdinalIgnoreCase))
{
- context.Response.Redirect(HandlerPath + "/" + DefaultRedirectPath);
- context.Response.Close();
+ httpRes.RedirectToUrl(HandlerPath + "/" + DefaultRedirectPath);
return Task.FromResult(true);
}
if (string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase))
{
- context.Response.Redirect(HandlerPath + "/" + DefaultRedirectPath);
- context.Response.Close();
+ httpRes.RedirectToUrl(HandlerPath + "/" + DefaultRedirectPath);
return Task.FromResult(true);
}
if (string.IsNullOrEmpty(localPath))
{
- context.Response.Redirect("/" + HandlerPath + "/" + DefaultRedirectPath);
- context.Response.Close();
+ httpRes.RedirectToUrl("/" + HandlerPath + "/" + DefaultRedirectPath);
return Task.FromResult(true);
}
- var date = DateTime.Now;
-
- if (string.IsNullOrEmpty(context.Request.RawUrl))
- return ((object)null).AsTaskResult();
-
- var operationName = context.Request.GetOperationName();
-
- var httpReq = GetRequest(context, operationName);
- var httpRes = httpReq.Response;
var handler = HttpHandlerFactory.GetHandler(httpReq);
- var url = request.Url.ToString();
var remoteIp = httpReq.RemoteIp;
var serviceStackHandler = handler as IServiceStackHandler;
@@ -460,19 +293,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer
task.ContinueWith(x => httpRes.Close(), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent);
//Matches Exceptions handled in HttpListenerBase.InitTask()
- var statusCode = httpRes.StatusCode;
+ var urlString = url.ToString();
task.ContinueWith(x =>
{
+ var statusCode = httpRes.StatusCode;
+
var duration = DateTime.Now - date;
- if (EnableHttpRequestLogging)
- {
- LoggerUtils.LogResponse(_logger, statusCode, url, remoteIp, duration);
- }
+ LoggerUtils.LogResponse(_logger, statusCode, urlString, remoteIp, duration);
}, TaskContinuationOptions.None);
-
return task;
}
@@ -481,12 +312,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
/// <summary>
- /// Gets or sets a value indicating whether [enable HTTP request logging].
- /// </summary>
- /// <value><c>true</c> if [enable HTTP request logging]; otherwise, <c>false</c>.</value>
- public bool EnableHttpRequestLogging { get; set; }
-
- /// <summary>
/// Adds the rest handlers.
/// </summary>
/// <param name="services">The services.</param>
@@ -530,8 +355,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
if (disposing)
{
- _threadPoolManager.Dispose();
-
+ _threadPoolManager.Dispose();
+
Stop();
}
@@ -551,10 +376,5 @@ namespace MediaBrowser.Server.Implementations.HttpServer
UrlPrefixes = urlPrefixes.ToList();
Start(UrlPrefixes.First());
}
-
- public bool SupportsWebSockets
- {
- get { return NativeWebSocket.IsSupported; }
- }
}
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs
index 8831d635c..6a60e5ea6 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs
@@ -306,11 +306,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer
throw new ArgumentNullException("path");
}
- return GetStaticFileResult(requestContext, path, MimeTypes.GetMimeType(path), fileShare, responseHeaders, isHeadRequest);
+ return GetStaticFileResult(requestContext, path, MimeTypes.GetMimeType(path), null, fileShare, responseHeaders, isHeadRequest);
}
- public object GetStaticFileResult(IRequest requestContext, string path, string contentType,
- FileShare fileShare = FileShare.Read, IDictionary<string, string> responseHeaders = null,
+ public object GetStaticFileResult(IRequest requestContext,
+ string path,
+ string contentType,
+ TimeSpan? cacheCuration = null,
+ FileShare fileShare = FileShare.Read,
+ IDictionary<string, string> responseHeaders = null,
bool isHeadRequest = false)
{
if (string.IsNullOrEmpty(path))
@@ -327,7 +331,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
var cacheKey = path + dateModified.Ticks;
- return GetStaticResult(requestContext, cacheKey.GetMD5(), dateModified, null, contentType, () => Task.FromResult(GetFileStream(path, fileShare)), responseHeaders, isHeadRequest);
+ return GetStaticResult(requestContext, cacheKey.GetMD5(), dateModified, cacheCuration, contentType, () => Task.FromResult(GetFileStream(path, fileShare)), responseHeaders, isHeadRequest);
}
/// <summary>
diff --git a/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs
new file mode 100644
index 000000000..1d80a263c
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/IHttpListener.cs
@@ -0,0 +1,42 @@
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net;
+using ServiceStack.Web;
+using System;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Server.Implementations.HttpServer
+{
+ public interface IHttpListener : IDisposable
+ {
+ IEnumerable<string> LocalEndPoints { get; }
+
+ /// <summary>
+ /// Gets or sets the error handler.
+ /// </summary>
+ /// <value>The error handler.</value>
+ Action<Exception, IRequest> ErrorHandler { get; set; }
+
+ /// <summary>
+ /// Gets or sets the request handler.
+ /// </summary>
+ /// <value>The request handler.</value>
+ Func<IHttpRequest, Uri, Task> RequestHandler { get; set; }
+
+ /// <summary>
+ /// Gets or sets the web socket handler.
+ /// </summary>
+ /// <value>The web socket handler.</value>
+ Action<WebSocketConnectEventArgs> WebSocketHandler { get; set; }
+
+ /// <summary>
+ /// Starts this instance.
+ /// </summary>
+ /// <param name="urlPrefixes">The URL prefixes.</param>
+ void Start(IEnumerable<string> urlPrefixes);
+
+ /// <summary>
+ /// Stops this instance.
+ /// </summary>
+ void Stop();
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
index 19d2f9c45..955c4ed2d 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
@@ -8,24 +8,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
public static class LoggerUtils
{
/// <summary>
- /// Logs the request.
- /// </summary>
- /// <param name="logger">The logger.</param>
- /// <param name="request">The request.</param>
- public static void LogRequest(ILogger logger, HttpListenerRequest request)
- {
- var log = new StringBuilder();
-
- //var headers = string.Join(",", request.Headers.AllKeys.Where(i => !string.Equals(i, "cookie", StringComparison.OrdinalIgnoreCase) && !string.Equals(i, "Referer", StringComparison.OrdinalIgnoreCase)).Select(k => k + "=" + request.Headers[k]));
-
- //log.AppendLine("Ip: " + request.RemoteEndPoint + ". Headers: " + headers);
-
- var type = request.IsWebSocketRequest ? "Web Socket" : "HTTP " + request.HttpMethod;
-
- logger.LogMultiline(type + " " + request.Url, LogSeverity.Debug, log);
- }
-
- /// <summary>
/// Logs the response.
/// </summary>
/// <param name="logger">The logger.</param>
diff --git a/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs b/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs
new file mode 100644
index 000000000..7f766129e
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/NetListener/HttpListenerServer.cs
@@ -0,0 +1,300 @@
+using System.Text;
+using Amib.Threading;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Model.Logging;
+using ServiceStack;
+using ServiceStack.Host.HttpListener;
+using ServiceStack.Web;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.NetListener
+{
+ public class HttpListenerServer : IHttpListener
+ {
+ private readonly ILogger _logger;
+ private HttpListener _listener;
+ private readonly AutoResetEvent _listenForNextRequest = new AutoResetEvent(false);
+ private readonly SmartThreadPool _threadPoolManager;
+
+ public System.Action<Exception, IRequest> ErrorHandler { get; set; }
+ public Action<WebSocketConnectEventArgs> WebSocketHandler { get; set; }
+ public System.Func<IHttpRequest, Uri, Task> RequestHandler { get; set; }
+
+ private readonly ConcurrentDictionary<string, string> _localEndPoints = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+
+ public HttpListenerServer(ILogger logger, SmartThreadPool threadPoolManager)
+ {
+ _logger = logger;
+
+ _threadPoolManager = threadPoolManager;
+ }
+
+ /// <summary>
+ /// Gets the local end points.
+ /// </summary>
+ /// <value>The local end points.</value>
+ public IEnumerable<string> LocalEndPoints
+ {
+ get { return _localEndPoints.Keys.ToList(); }
+ }
+
+ private List<string> UrlPrefixes { get; set; }
+
+ public void Start(IEnumerable<string> urlPrefixes)
+ {
+ UrlPrefixes = urlPrefixes.ToList();
+
+ if (_listener == null)
+ _listener = new System.Net.HttpListener();
+
+ //HostContext.Config.HandlerFactoryPath = ListenerRequest.GetHandlerPathIfAny(UrlPrefixes.First());
+
+ foreach (var prefix in UrlPrefixes)
+ {
+ _logger.Info("Adding HttpListener prefix " + prefix);
+ _listener.Prefixes.Add(prefix);
+ }
+
+ _listener.Start();
+
+ ThreadPool.QueueUserWorkItem(Listen);
+ }
+
+ private bool IsListening
+ {
+ get { return _listener != null && _listener.IsListening; }
+ }
+
+ // Loop here to begin processing of new requests.
+ private void Listen(object state)
+ {
+ while (IsListening)
+ {
+ if (_listener == null) return;
+
+ try
+ {
+ _listener.BeginGetContext(ListenerCallback, _listener);
+ _listenForNextRequest.WaitOne();
+ }
+ catch (Exception ex)
+ {
+ _logger.Error("Listen()", ex);
+ return;
+ }
+ if (_listener == null) return;
+ }
+ }
+
+ // Handle the processing of a request in here.
+ private void ListenerCallback(IAsyncResult asyncResult)
+ {
+ var listener = asyncResult.AsyncState as HttpListener;
+ HttpListenerContext context;
+
+ if (listener == null) return;
+ var isListening = listener.IsListening;
+
+ try
+ {
+ if (!isListening)
+ {
+ _logger.Debug("Ignoring ListenerCallback() as HttpListener is no longer listening"); return;
+ }
+ // The EndGetContext() method, as with all Begin/End asynchronous methods in the .NET Framework,
+ // blocks until there is a request to be processed or some type of data is available.
+ context = listener.EndGetContext(asyncResult);
+ }
+ catch (Exception ex)
+ {
+ // You will get an exception when httpListener.Stop() is called
+ // because there will be a thread stopped waiting on the .EndGetContext()
+ // method, and again, that is just the way most Begin/End asynchronous
+ // methods of the .NET Framework work.
+ var errMsg = ex + ": " + IsListening;
+ _logger.Warn(errMsg);
+ return;
+ }
+ finally
+ {
+ // Once we know we have a request (or exception), we signal the other thread
+ // so that it calls the BeginGetContext() (or possibly exits if we're not
+ // listening any more) method to start handling the next incoming request
+ // while we continue to process this request on a different thread.
+ _listenForNextRequest.Set();
+ }
+
+ _threadPoolManager.QueueWorkItem(() => InitTask(context));
+ }
+
+ private void InitTask(HttpListenerContext context)
+ {
+ try
+ {
+ var task = this.ProcessRequestAsync(context);
+ task.ContinueWith(x => HandleError(x.Exception, context), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent);
+
+ if (task.Status == TaskStatus.Created)
+ {
+ task.RunSynchronously();
+ }
+ }
+ catch (Exception ex)
+ {
+ HandleError(ex, context);
+ }
+ }
+
+ private Task ProcessRequestAsync(HttpListenerContext context)
+ {
+ var request = context.Request;
+
+ LogHttpRequest(request);
+
+ if (request.IsWebSocketRequest)
+ {
+ return ProcessWebSocketRequest(context);
+ }
+
+ if (string.IsNullOrEmpty(context.Request.RawUrl))
+ return ((object)null).AsTaskResult();
+
+ var operationName = context.Request.GetOperationName();
+
+ var httpReq = GetRequest(context, operationName);
+
+ return RequestHandler(httpReq, request.Url);
+ }
+
+ /// <summary>
+ /// Processes the web socket request.
+ /// </summary>
+ /// <param name="ctx">The CTX.</param>
+ /// <returns>Task.</returns>
+ private async Task ProcessWebSocketRequest(HttpListenerContext ctx)
+ {
+#if !__MonoCS__
+ try
+ {
+ var webSocketContext = await ctx.AcceptWebSocketAsync(null).ConfigureAwait(false);
+
+ if (WebSocketHandler != null)
+ {
+ WebSocketHandler(new WebSocketConnectEventArgs
+ {
+ WebSocket = new NativeWebSocket(webSocketContext.WebSocket, _logger),
+ Endpoint = ctx.Request.RemoteEndPoint.ToString()
+ });
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("AcceptWebSocketAsync error", ex);
+ ctx.Response.StatusCode = 500;
+ ctx.Response.Close();
+ }
+#endif
+ }
+
+ private void HandleError(Exception ex, HttpListenerContext context)
+ {
+ var operationName = context.Request.GetOperationName();
+ var httpReq = GetRequest(context, operationName);
+
+ if (ErrorHandler != null)
+ {
+ ErrorHandler(ex, httpReq);
+ }
+ }
+
+ private static ListenerRequest GetRequest(HttpListenerContext httpContext, string operationName)
+ {
+ var req = new ListenerRequest(httpContext, operationName, RequestAttributes.None);
+ req.RequestAttributes = req.GetAttributes();
+
+ return req;
+ }
+
+ /// <summary>
+ /// Logs the HTTP request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ private void LogHttpRequest(HttpListenerRequest request)
+ {
+ var endpoint = request.LocalEndPoint;
+
+ if (endpoint != null)
+ {
+ var address = endpoint.ToString();
+
+ _localEndPoints.GetOrAdd(address, address);
+ }
+
+ LogRequest(_logger, request);
+ }
+
+ /// <summary>
+ /// Logs the request.
+ /// </summary>
+ /// <param name="logger">The logger.</param>
+ /// <param name="request">The request.</param>
+ private static void LogRequest(ILogger logger, HttpListenerRequest request)
+ {
+ var log = new StringBuilder();
+
+ //var headers = string.Join(",", request.Headers.AllKeys.Where(i => !string.Equals(i, "cookie", StringComparison.OrdinalIgnoreCase) && !string.Equals(i, "Referer", StringComparison.OrdinalIgnoreCase)).Select(k => k + "=" + request.Headers[k]));
+
+ //log.AppendLine("Ip: " + request.RemoteEndPoint + ". Headers: " + headers);
+
+ var type = request.IsWebSocketRequest ? "Web Socket" : "HTTP " + request.HttpMethod;
+
+ logger.LogMultiline(type + " " + request.Url, LogSeverity.Debug, log);
+ }
+
+ public void Stop()
+ {
+ if (_listener != null)
+ {
+ foreach (var prefix in UrlPrefixes)
+ {
+ _listener.Prefixes.Remove(prefix);
+ }
+
+ _listener.Close();
+ }
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ }
+
+ private bool _disposed;
+ private readonly object _disposeLock = new object();
+ protected virtual void Dispose(bool disposing)
+ {
+ if (_disposed) return;
+
+ lock (_disposeLock)
+ {
+ if (_disposed) return;
+
+ if (disposing)
+ {
+ _threadPoolManager.Dispose();
+
+ Stop();
+ }
+
+ //release unmanaged resources here...
+ _disposed = true;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs b/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
index ac1621709..e0a5764d5 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/ResponseFilter.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Model.Logging;
+using MediaBrowser.Server.Implementations.HttpServer.SocketSharp;
using ServiceStack;
using ServiceStack.Web;
using System;
@@ -66,13 +67,23 @@ namespace MediaBrowser.Server.Implementations.HttpServer
if (length > 0)
{
- var response = (HttpListenerResponse)res.OriginalResponse;
-
- response.ContentLength64 = length;
-
- // Disable chunked encoding. Technically this is only needed when using Content-Range, but
- // anytime we know the content length there's no need for it
- response.SendChunked = false;
+ res.SetContentLength(length);
+
+ var listenerResponse = res.OriginalResponse as HttpListenerResponse;
+
+ if (listenerResponse != null)
+ {
+ // Disable chunked encoding. Technically this is only needed when using Content-Range, but
+ // anytime we know the content length there's no need for it
+ listenerResponse.SendChunked = false;
+ return;
+ }
+
+ var sharpResponse = res as WebSocketSharpResponse;
+ if (sharpResponse != null)
+ {
+ sharpResponse.SendChunked = false;
+ }
}
}
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
index 2d7c798ad..1933cc716 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
@@ -66,6 +66,12 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
? null
: UserManager.GetUserById(new Guid(auth.UserId));
+ if (user == null & !string.IsNullOrWhiteSpace(auth.UserId))
+ {
+ // TODO: Re-enable
+ //throw new ArgumentException("User with Id " + auth.UserId + " not found");
+ }
+
if (user != null && user.Configuration.IsDisabled)
{
throw new UnauthorizedAccessException("User account has been disabled.");
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/Extensions.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/Extensions.cs
new file mode 100644
index 000000000..63d57b6be
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/Extensions.cs
@@ -0,0 +1,28 @@
+using System;
+using MediaBrowser.Model.Logging;
+using WebSocketSharp.Net;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
+{
+ public static class Extensions
+ {
+ public static string GetOperationName(this HttpListenerRequest request)
+ {
+ return request.Url.Segments[request.Url.Segments.Length - 1];
+ }
+
+ public static void CloseOutputStream(this HttpListenerResponse response, ILogger logger)
+ {
+ try
+ {
+ response.OutputStream.Flush();
+ response.OutputStream.Close();
+ response.Close();
+ }
+ catch (Exception ex)
+ {
+ logger.ErrorException("Error in HttpListenerResponseWrapper: " + ex.Message, ex);
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs
new file mode 100644
index 000000000..226d97b3c
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/RequestMono.cs
@@ -0,0 +1,918 @@
+using System;
+using System.Collections.Specialized;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using System.Web;
+using ServiceStack.Web;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
+{
+ public partial class WebSocketSharpRequest : IHttpRequest
+ {
+ static internal string GetParameter(string header, string attr)
+ {
+ int ap = header.IndexOf(attr);
+ if (ap == -1)
+ return null;
+
+ ap += attr.Length;
+ if (ap >= header.Length)
+ return null;
+
+ char ending = header[ap];
+ if (ending != '"')
+ ending = ' ';
+
+ int end = header.IndexOf(ending, ap + 1);
+ if (end == -1)
+ return (ending == '"') ? null : header.Substring(ap);
+
+ return header.Substring(ap + 1, end - ap - 1);
+ }
+
+ void LoadMultiPart()
+ {
+ string boundary = GetParameter(ContentType, "; boundary=");
+ if (boundary == null)
+ return;
+
+ var input = GetSubStream(InputStream);
+
+ //DB: 30/01/11 - Hack to get around non-seekable stream and received HTTP request
+ //Not ending with \r\n?
+ var ms = new MemoryStream(32 * 1024);
+ input.CopyTo(ms);
+ input = ms;
+ ms.WriteByte((byte)'\r');
+ ms.WriteByte((byte)'\n');
+
+ input.Position = 0;
+
+ //Uncomment to debug
+ //var content = new StreamReader(ms).ReadToEnd();
+ //Console.WriteLine(boundary + "::" + content);
+ //input.Position = 0;
+
+ var multi_part = new HttpMultipart(input, boundary, ContentEncoding);
+
+ HttpMultipart.Element e;
+ while ((e = multi_part.ReadNextElement()) != null)
+ {
+ if (e.Filename == null)
+ {
+ byte[] copy = new byte[e.Length];
+
+ input.Position = e.Start;
+ input.Read(copy, 0, (int)e.Length);
+
+ form.Add(e.Name, (e.Encoding ?? ContentEncoding).GetString(copy));
+ }
+ else
+ {
+ //
+ // We use a substream, as in 2.x we will support large uploads streamed to disk,
+ //
+ HttpPostedFile sub = new HttpPostedFile(e.Filename, e.ContentType, input, e.Start, e.Length);
+ files.AddFile(e.Name, sub);
+ }
+ }
+ EndSubStream(input);
+ }
+
+ public NameValueCollection Form
+ {
+ get
+ {
+ if (form == null)
+ {
+ form = new WebROCollection();
+ files = new HttpFileCollection();
+
+ if (IsContentType("multipart/form-data", true))
+ LoadMultiPart();
+ else if (
+ IsContentType("application/x-www-form-urlencoded", true))
+ LoadWwwForm();
+
+ form.Protect();
+ }
+
+#if NET_4_0
+ if (validateRequestNewMode && !checked_form) {
+ // Setting this before calling the validator prevents
+ // possible endless recursion
+ checked_form = true;
+ ValidateNameValueCollection ("Form", query_string_nvc, RequestValidationSource.Form);
+ } else
+#endif
+ if (validate_form && !checked_form)
+ {
+ checked_form = true;
+ ValidateNameValueCollection("Form", form);
+ }
+
+ return form;
+ }
+ }
+
+
+ protected bool validate_cookies, validate_query_string, validate_form;
+ protected bool checked_cookies, checked_query_string, checked_form;
+
+ static void ThrowValidationException(string name, string key, string value)
+ {
+ string v = "\"" + value + "\"";
+ if (v.Length > 20)
+ v = v.Substring(0, 16) + "...\"";
+
+ string msg = String.Format("A potentially dangerous Request.{0} value was " +
+ "detected from the client ({1}={2}).", name, key, v);
+
+ throw new HttpRequestValidationException(msg);
+ }
+
+ static void ValidateNameValueCollection(string name, NameValueCollection coll)
+ {
+ if (coll == null)
+ return;
+
+ foreach (string key in coll.Keys)
+ {
+ string val = coll[key];
+ if (val != null && val.Length > 0 && IsInvalidString(val))
+ ThrowValidationException(name, key, val);
+ }
+ }
+
+ internal static bool IsInvalidString(string val)
+ {
+ int validationFailureIndex;
+
+ return IsInvalidString(val, out validationFailureIndex);
+ }
+
+ internal static bool IsInvalidString(string val, out int validationFailureIndex)
+ {
+ validationFailureIndex = 0;
+
+ int len = val.Length;
+ if (len < 2)
+ return false;
+
+ char current = val[0];
+ for (int idx = 1; idx < len; idx++)
+ {
+ char next = val[idx];
+ // See http://secunia.com/advisories/14325
+ if (current == '<' || current == '\xff1c')
+ {
+ if (next == '!' || next < ' '
+ || (next >= 'a' && next <= 'z')
+ || (next >= 'A' && next <= 'Z'))
+ {
+ validationFailureIndex = idx - 1;
+ return true;
+ }
+ }
+ else if (current == '&' && next == '#')
+ {
+ validationFailureIndex = idx - 1;
+ return true;
+ }
+
+ current = next;
+ }
+
+ return false;
+ }
+
+ public void ValidateInput()
+ {
+ validate_cookies = true;
+ validate_query_string = true;
+ validate_form = true;
+ }
+
+ bool IsContentType(string ct, bool starts_with)
+ {
+ if (ct == null || ContentType == null) return false;
+
+ if (starts_with)
+ return StrUtils.StartsWith(ContentType, ct, true);
+
+ return String.Compare(ContentType, ct, true, Helpers.InvariantCulture) == 0;
+ }
+
+
+
+
+
+ void LoadWwwForm()
+ {
+ using (Stream input = GetSubStream(InputStream))
+ {
+ using (StreamReader s = new StreamReader(input, ContentEncoding))
+ {
+ StringBuilder key = new StringBuilder();
+ StringBuilder value = new StringBuilder();
+ int c;
+
+ while ((c = s.Read()) != -1)
+ {
+ if (c == '=')
+ {
+ value.Length = 0;
+ while ((c = s.Read()) != -1)
+ {
+ if (c == '&')
+ {
+ AddRawKeyValue(key, value);
+ break;
+ }
+ else
+ value.Append((char)c);
+ }
+ if (c == -1)
+ {
+ AddRawKeyValue(key, value);
+ return;
+ }
+ }
+ else if (c == '&')
+ AddRawKeyValue(key, value);
+ else
+ key.Append((char)c);
+ }
+ if (c == -1)
+ AddRawKeyValue(key, value);
+
+ EndSubStream(input);
+ }
+ }
+ }
+
+ void AddRawKeyValue(StringBuilder key, StringBuilder value)
+ {
+ string decodedKey = HttpUtility.UrlDecode(key.ToString(), ContentEncoding);
+ form.Add(decodedKey,
+ HttpUtility.UrlDecode(value.ToString(), ContentEncoding));
+
+ key.Length = 0;
+ value.Length = 0;
+ }
+
+ WebROCollection form;
+
+ HttpFileCollection files;
+
+ public sealed class HttpFileCollection : NameObjectCollectionBase
+ {
+ internal HttpFileCollection()
+ {
+ }
+
+ internal void AddFile(string name, HttpPostedFile file)
+ {
+ BaseAdd(name, file);
+ }
+
+ public void CopyTo(Array dest, int index)
+ {
+ /* XXX this is kind of gross and inefficient
+ * since it makes a copy of the superclass's
+ * list */
+ object[] values = BaseGetAllValues();
+ values.CopyTo(dest, index);
+ }
+
+ public string GetKey(int index)
+ {
+ return BaseGetKey(index);
+ }
+
+ public HttpPostedFile Get(int index)
+ {
+ return (HttpPostedFile)BaseGet(index);
+ }
+
+ public HttpPostedFile Get(string key)
+ {
+ return (HttpPostedFile)BaseGet(key);
+ }
+
+ public HttpPostedFile this[string key]
+ {
+ get
+ {
+ return Get(key);
+ }
+ }
+
+ public HttpPostedFile this[int index]
+ {
+ get
+ {
+ return Get(index);
+ }
+ }
+
+ public string[] AllKeys
+ {
+ get
+ {
+ return BaseGetAllKeys();
+ }
+ }
+ }
+ class WebROCollection : NameValueCollection
+ {
+ bool got_id;
+ int id;
+
+ public bool GotID
+ {
+ get { return got_id; }
+ }
+
+ public int ID
+ {
+ get { return id; }
+ set
+ {
+ got_id = true;
+ id = value;
+ }
+ }
+ public void Protect()
+ {
+ IsReadOnly = true;
+ }
+
+ public void Unprotect()
+ {
+ IsReadOnly = false;
+ }
+
+ public override string ToString()
+ {
+ StringBuilder result = new StringBuilder();
+ foreach (string key in AllKeys)
+ {
+ if (result.Length > 0)
+ result.Append('&');
+
+ if (key != null && key.Length > 0)
+ {
+ result.Append(key);
+ result.Append('=');
+ }
+ result.Append(Get(key));
+ }
+
+ return result.ToString();
+ }
+ }
+
+ public sealed class HttpPostedFile
+ {
+ string name;
+ string content_type;
+ Stream stream;
+
+ class ReadSubStream : Stream
+ {
+ Stream s;
+ long offset;
+ long end;
+ long position;
+
+ public ReadSubStream(Stream s, long offset, long length)
+ {
+ this.s = s;
+ this.offset = offset;
+ this.end = offset + length;
+ position = offset;
+ }
+
+ public override void Flush()
+ {
+ }
+
+ public override int Read(byte[] buffer, int dest_offset, int count)
+ {
+ if (buffer == null)
+ throw new ArgumentNullException("buffer");
+
+ if (dest_offset < 0)
+ throw new ArgumentOutOfRangeException("dest_offset", "< 0");
+
+ if (count < 0)
+ throw new ArgumentOutOfRangeException("count", "< 0");
+
+ int len = buffer.Length;
+ if (dest_offset > len)
+ throw new ArgumentException("destination offset is beyond array size");
+ // reordered to avoid possible integer overflow
+ if (dest_offset > len - count)
+ throw new ArgumentException("Reading would overrun buffer");
+
+ if (count > end - position)
+ count = (int)(end - position);
+
+ if (count <= 0)
+ return 0;
+
+ s.Position = position;
+ int result = s.Read(buffer, dest_offset, count);
+ if (result > 0)
+ position += result;
+ else
+ position = end;
+
+ return result;
+ }
+
+ public override int ReadByte()
+ {
+ if (position >= end)
+ return -1;
+
+ s.Position = position;
+ int result = s.ReadByte();
+ if (result < 0)
+ position = end;
+ else
+ position++;
+
+ return result;
+ }
+
+ public override long Seek(long d, SeekOrigin origin)
+ {
+ long real;
+ switch (origin)
+ {
+ case SeekOrigin.Begin:
+ real = offset + d;
+ break;
+ case SeekOrigin.End:
+ real = end + d;
+ break;
+ case SeekOrigin.Current:
+ real = position + d;
+ break;
+ default:
+ throw new ArgumentException();
+ }
+
+ long virt = real - offset;
+ if (virt < 0 || virt > Length)
+ throw new ArgumentException();
+
+ position = s.Seek(real, SeekOrigin.Begin);
+ return position;
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NotSupportedException();
+ }
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ throw new NotSupportedException();
+ }
+
+ public override bool CanRead
+ {
+ get { return true; }
+ }
+ public override bool CanSeek
+ {
+ get { return true; }
+ }
+ public override bool CanWrite
+ {
+ get { return false; }
+ }
+
+ public override long Length
+ {
+ get { return end - offset; }
+ }
+
+ public override long Position
+ {
+ get
+ {
+ return position - offset;
+ }
+ set
+ {
+ if (value > Length)
+ throw new ArgumentOutOfRangeException();
+
+ position = Seek(value, SeekOrigin.Begin);
+ }
+ }
+ }
+
+ internal HttpPostedFile(string name, string content_type, Stream base_stream, long offset, long length)
+ {
+ this.name = name;
+ this.content_type = content_type;
+ this.stream = new ReadSubStream(base_stream, offset, length);
+ }
+
+ public string ContentType
+ {
+ get
+ {
+ return (content_type);
+ }
+ }
+
+ public int ContentLength
+ {
+ get
+ {
+ return (int)stream.Length;
+ }
+ }
+
+ public string FileName
+ {
+ get
+ {
+ return (name);
+ }
+ }
+
+ public Stream InputStream
+ {
+ get
+ {
+ return (stream);
+ }
+ }
+
+ public void SaveAs(string filename)
+ {
+ byte[] buffer = new byte[16 * 1024];
+ long old_post = stream.Position;
+
+ try
+ {
+ File.Delete(filename);
+ using (FileStream fs = File.Create(filename))
+ {
+ stream.Position = 0;
+ int n;
+
+ while ((n = stream.Read(buffer, 0, 16 * 1024)) != 0)
+ {
+ fs.Write(buffer, 0, n);
+ }
+ }
+ }
+ finally
+ {
+ stream.Position = old_post;
+ }
+ }
+ }
+
+ class Helpers
+ {
+ public static readonly CultureInfo InvariantCulture = CultureInfo.InvariantCulture;
+ }
+
+ internal sealed class StrUtils
+ {
+ StrUtils() { }
+
+ public static bool StartsWith(string str1, string str2)
+ {
+ return StartsWith(str1, str2, false);
+ }
+
+ public static bool StartsWith(string str1, string str2, bool ignore_case)
+ {
+ int l2 = str2.Length;
+ if (l2 == 0)
+ return true;
+
+ int l1 = str1.Length;
+ if (l2 > l1)
+ return false;
+
+ return (0 == String.Compare(str1, 0, str2, 0, l2, ignore_case, Helpers.InvariantCulture));
+ }
+
+ public static bool EndsWith(string str1, string str2)
+ {
+ return EndsWith(str1, str2, false);
+ }
+
+ public static bool EndsWith(string str1, string str2, bool ignore_case)
+ {
+ int l2 = str2.Length;
+ if (l2 == 0)
+ return true;
+
+ int l1 = str1.Length;
+ if (l2 > l1)
+ return false;
+
+ return (0 == String.Compare(str1, l1 - l2, str2, 0, l2, ignore_case, Helpers.InvariantCulture));
+ }
+ }
+
+ class HttpMultipart
+ {
+
+ public class Element
+ {
+ public string ContentType;
+ public string Name;
+ public string Filename;
+ public Encoding Encoding;
+ public long Start;
+ public long Length;
+
+ public override string ToString()
+ {
+ return "ContentType " + ContentType + ", Name " + Name + ", Filename " + Filename + ", Start " +
+ Start.ToString() + ", Length " + Length.ToString();
+ }
+ }
+
+ Stream data;
+ string boundary;
+ byte[] boundary_bytes;
+ byte[] buffer;
+ bool at_eof;
+ Encoding encoding;
+ StringBuilder sb;
+
+ const byte HYPHEN = (byte)'-', LF = (byte)'\n', CR = (byte)'\r';
+
+ // See RFC 2046
+ // In the case of multipart entities, in which one or more different
+ // sets of data are combined in a single body, a "multipart" media type
+ // field must appear in the entity's header. The body must then contain
+ // one or more body parts, each preceded by a boundary delimiter line,
+ // and the last one followed by a closing boundary delimiter line.
+ // After its boundary delimiter line, each body part then consists of a
+ // header area, a blank line, and a body area. Thus a body part is
+ // similar to an RFC 822 message in syntax, but different in meaning.
+
+ public HttpMultipart(Stream data, string b, Encoding encoding)
+ {
+ this.data = data;
+ //DB: 30/01/11: cannot set or read the Position in HttpListener in Win.NET
+ //var ms = new MemoryStream(32 * 1024);
+ //data.CopyTo(ms);
+ //this.data = ms;
+
+ boundary = b;
+ boundary_bytes = encoding.GetBytes(b);
+ buffer = new byte[boundary_bytes.Length + 2]; // CRLF or '--'
+ this.encoding = encoding;
+ sb = new StringBuilder();
+ }
+
+ string ReadLine()
+ {
+ // CRLF or LF are ok as line endings.
+ bool got_cr = false;
+ int b = 0;
+ sb.Length = 0;
+ while (true)
+ {
+ b = data.ReadByte();
+ if (b == -1)
+ {
+ return null;
+ }
+
+ if (b == LF)
+ {
+ break;
+ }
+ got_cr = (b == CR);
+ sb.Append((char)b);
+ }
+
+ if (got_cr)
+ sb.Length--;
+
+ return sb.ToString();
+
+ }
+
+ static string GetContentDispositionAttribute(string l, string name)
+ {
+ int idx = l.IndexOf(name + "=\"");
+ if (idx < 0)
+ return null;
+ int begin = idx + name.Length + "=\"".Length;
+ int end = l.IndexOf('"', begin);
+ if (end < 0)
+ return null;
+ if (begin == end)
+ return "";
+ return l.Substring(begin, end - begin);
+ }
+
+ string GetContentDispositionAttributeWithEncoding(string l, string name)
+ {
+ int idx = l.IndexOf(name + "=\"");
+ if (idx < 0)
+ return null;
+ int begin = idx + name.Length + "=\"".Length;
+ int end = l.IndexOf('"', begin);
+ if (end < 0)
+ return null;
+ if (begin == end)
+ return "";
+
+ string temp = l.Substring(begin, end - begin);
+ byte[] source = new byte[temp.Length];
+ for (int i = temp.Length - 1; i >= 0; i--)
+ source[i] = (byte)temp[i];
+
+ return encoding.GetString(source);
+ }
+
+ bool ReadBoundary()
+ {
+ try
+ {
+ string line = ReadLine();
+ while (line == "")
+ line = ReadLine();
+ if (line[0] != '-' || line[1] != '-')
+ return false;
+
+ if (!StrUtils.EndsWith(line, boundary, false))
+ return true;
+ }
+ catch
+ {
+ }
+
+ return false;
+ }
+
+ string ReadHeaders()
+ {
+ string s = ReadLine();
+ if (s == "")
+ return null;
+
+ return s;
+ }
+
+ bool CompareBytes(byte[] orig, byte[] other)
+ {
+ for (int i = orig.Length - 1; i >= 0; i--)
+ if (orig[i] != other[i])
+ return false;
+
+ return true;
+ }
+
+ long MoveToNextBoundary()
+ {
+ long retval = 0;
+ bool got_cr = false;
+
+ int state = 0;
+ int c = data.ReadByte();
+ while (true)
+ {
+ if (c == -1)
+ return -1;
+
+ if (state == 0 && c == LF)
+ {
+ retval = data.Position - 1;
+ if (got_cr)
+ retval--;
+ state = 1;
+ c = data.ReadByte();
+ }
+ else if (state == 0)
+ {
+ got_cr = (c == CR);
+ c = data.ReadByte();
+ }
+ else if (state == 1 && c == '-')
+ {
+ c = data.ReadByte();
+ if (c == -1)
+ return -1;
+
+ if (c != '-')
+ {
+ state = 0;
+ got_cr = false;
+ continue; // no ReadByte() here
+ }
+
+ int nread = data.Read(buffer, 0, buffer.Length);
+ int bl = buffer.Length;
+ if (nread != bl)
+ return -1;
+
+ if (!CompareBytes(boundary_bytes, buffer))
+ {
+ state = 0;
+ data.Position = retval + 2;
+ if (got_cr)
+ {
+ data.Position++;
+ got_cr = false;
+ }
+ c = data.ReadByte();
+ continue;
+ }
+
+ if (buffer[bl - 2] == '-' && buffer[bl - 1] == '-')
+ {
+ at_eof = true;
+ }
+ else if (buffer[bl - 2] != CR || buffer[bl - 1] != LF)
+ {
+ state = 0;
+ data.Position = retval + 2;
+ if (got_cr)
+ {
+ data.Position++;
+ got_cr = false;
+ }
+ c = data.ReadByte();
+ continue;
+ }
+ data.Position = retval + 2;
+ if (got_cr)
+ data.Position++;
+ break;
+ }
+ else
+ {
+ // state == 1
+ state = 0; // no ReadByte() here
+ }
+ }
+
+ return retval;
+ }
+
+ public Element ReadNextElement()
+ {
+ if (at_eof || ReadBoundary())
+ return null;
+
+ Element elem = new Element();
+ string header;
+ while ((header = ReadHeaders()) != null)
+ {
+ if (StrUtils.StartsWith(header, "Content-Disposition:", true))
+ {
+ elem.Name = GetContentDispositionAttribute(header, "name");
+ elem.Filename = StripPath(GetContentDispositionAttributeWithEncoding(header, "filename"));
+ }
+ else if (StrUtils.StartsWith(header, "Content-Type:", true))
+ {
+ elem.ContentType = header.Substring("Content-Type:".Length).Trim();
+ elem.Encoding = GetEncoding(elem.ContentType);
+ }
+ }
+
+ long start = 0;
+ start = data.Position;
+ elem.Start = start;
+ long pos = MoveToNextBoundary();
+ if (pos == -1)
+ return null;
+
+ elem.Length = pos - start;
+ return elem;
+ }
+
+ static string StripPath(string path)
+ {
+ if (path == null || path.Length == 0)
+ return path;
+
+ if (path.IndexOf(":\\") != 1 && !path.StartsWith("\\\\"))
+ return path;
+ return path.Substring(path.LastIndexOf('\\') + 1);
+ }
+ }
+
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs
new file mode 100644
index 000000000..412789240
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs
@@ -0,0 +1,157 @@
+using System.Text;
+using MediaBrowser.Common.Events;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using WebSocketMessageType = MediaBrowser.Model.Net.WebSocketMessageType;
+using WebSocketState = MediaBrowser.Model.Net.WebSocketState;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
+{
+ public class SharpWebSocket : IWebSocket
+ {
+ /// <summary>
+ /// The logger
+ /// </summary>
+ private readonly ILogger _logger;
+
+ public event EventHandler<EventArgs> Closed;
+
+ /// <summary>
+ /// Gets or sets the web socket.
+ /// </summary>
+ /// <value>The web socket.</value>
+ private WebSocketSharp.WebSocket WebSocket { get; set; }
+
+ private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="NativeWebSocket" /> class.
+ /// </summary>
+ /// <param name="socket">The socket.</param>
+ /// <param name="logger">The logger.</param>
+ /// <exception cref="System.ArgumentNullException">socket</exception>
+ public SharpWebSocket(WebSocketSharp.WebSocket socket, ILogger logger)
+ {
+ if (socket == null)
+ {
+ throw new ArgumentNullException("socket");
+ }
+
+ if (logger == null)
+ {
+ throw new ArgumentNullException("logger");
+ }
+
+ _logger = logger;
+ WebSocket = socket;
+
+ socket.OnMessage += socket_OnMessage;
+ socket.OnClose += socket_OnClose;
+ socket.OnError += socket_OnError;
+
+ WebSocket.ConnectAsServer();
+ }
+
+ void socket_OnError(object sender, WebSocketSharp.ErrorEventArgs e)
+ {
+ EventHelper.FireEventIfNotNull(Closed, this, EventArgs.Empty, _logger);
+ }
+
+ void socket_OnClose(object sender, WebSocketSharp.CloseEventArgs e)
+ {
+ EventHelper.FireEventIfNotNull(Closed, this, EventArgs.Empty, _logger);
+ }
+
+ void socket_OnMessage(object sender, WebSocketSharp.MessageEventArgs e)
+ {
+ if (OnReceive != null)
+ {
+ OnReceiveBytes(e.RawData);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the state.
+ /// </summary>
+ /// <value>The state.</value>
+ public WebSocketState State
+ {
+ get
+ {
+ WebSocketState commonState;
+
+ if (!Enum.TryParse(WebSocket.ReadyState.ToString(), true, out commonState))
+ {
+ _logger.Warn("Unrecognized WebSocketState: {0}", WebSocket.ReadyState.ToString());
+ }
+
+ return commonState;
+ }
+ }
+
+ /// <summary>
+ /// Sends the async.
+ /// </summary>
+ /// <param name="bytes">The bytes.</param>
+ /// <param name="type">The type.</param>
+ /// <param name="endOfMessage">if set to <c>true</c> [end of message].</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task.</returns>
+ public Task SendAsync(byte[] bytes, WebSocketMessageType type, bool endOfMessage, CancellationToken cancellationToken)
+ {
+ System.Net.WebSockets.WebSocketMessageType nativeType;
+
+ if (!Enum.TryParse(type.ToString(), true, out nativeType))
+ {
+ _logger.Warn("Unrecognized WebSocketMessageType: {0}", type.ToString());
+ }
+
+ var completionSource = new TaskCompletionSource<bool>();
+
+ WebSocket.SendAsync(Encoding.UTF8.GetString(bytes), res => completionSource.TrySetResult(true));
+
+ return completionSource.Task;
+ }
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public void Dispose()
+ {
+ Dispose(true);
+ }
+
+ /// <summary>
+ /// Releases unmanaged and - optionally - managed resources.
+ /// </summary>
+ /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
+ protected virtual void Dispose(bool dispose)
+ {
+ if (dispose)
+ {
+ WebSocket.OnMessage -= socket_OnMessage;
+ WebSocket.OnClose -= socket_OnClose;
+ WebSocket.OnError -= socket_OnError;
+
+ _cancellationTokenSource.Cancel();
+
+ WebSocket.Close();
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the receive action.
+ /// </summary>
+ /// <value>The receive action.</value>
+ public Action<byte[]> OnReceiveBytes { get; set; }
+
+ /// <summary>
+ /// Gets or sets the on receive.
+ /// </summary>
+ /// <value>The on receive.</value>
+ public Action<string> OnReceive { get; set; }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
new file mode 100644
index 000000000..cf756d9f2
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
@@ -0,0 +1,192 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Amib.Threading;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Model.Logging;
+using ServiceStack;
+using ServiceStack.Web;
+using WebSocketSharp.Net;
+using WebSocketSharp.Server;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
+{
+ public class WebSocketSharpListener : IHttpListener
+ {
+ private readonly ConcurrentDictionary<string, string> _localEndPoints = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+ private WebSocketSharp.Server.HttpServer _httpsv;
+
+ private readonly ILogger _logger;
+ private readonly SmartThreadPool _threadPoolManager;
+
+ public WebSocketSharpListener(ILogger logger, SmartThreadPool threadPoolManager)
+ {
+ _logger = logger;
+ _threadPoolManager = threadPoolManager;
+ }
+
+ public IEnumerable<string> LocalEndPoints
+ {
+ get { return _localEndPoints.Keys.ToList(); }
+ }
+
+ public System.Action<Exception, IRequest> ErrorHandler { get; set; }
+
+ public System.Func<IHttpRequest, Uri, Task> RequestHandler { get; set; }
+
+ public Action<WebSocketConnectEventArgs> WebSocketHandler { get; set; }
+
+ public void Start(IEnumerable<string> urlPrefixes)
+ {
+ _httpsv = new WebSocketSharp.Server.HttpServer(8096, false, urlPrefixes.First());
+
+ _httpsv.OnRequest += _httpsv_OnRequest;
+
+ _httpsv.Start();
+ }
+
+ void _httpsv_OnRequest(object sender, HttpRequestEventArgs e)
+ {
+ _threadPoolManager.QueueWorkItem(() => InitTask(e.Context));
+ }
+
+ private void InitTask(HttpListenerContext context)
+ {
+ try
+ {
+ var task = this.ProcessRequestAsync(context);
+ task.ContinueWith(x => HandleError(x.Exception, context), TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent);
+
+ if (task.Status == TaskStatus.Created)
+ {
+ task.RunSynchronously();
+ }
+ }
+ catch (Exception ex)
+ {
+ HandleError(ex, context);
+ }
+ }
+
+ private Task ProcessRequestAsync(HttpListenerContext context)
+ {
+ var request = context.Request;
+
+ LogHttpRequest(request);
+
+ if (request.IsWebSocketRequest)
+ {
+ ProcessWebSocketRequest(context);
+ return Task.FromResult(true);
+ }
+
+ if (string.IsNullOrEmpty(context.Request.RawUrl))
+ return ((object)null).AsTaskResult();
+
+ var httpReq = GetRequest(context);
+
+ return RequestHandler(httpReq, request.Url);
+ }
+
+ /// <summary>
+ /// Logs the HTTP request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ private void LogHttpRequest(HttpListenerRequest request)
+ {
+ var endpoint = request.LocalEndPoint;
+
+ if (endpoint != null)
+ {
+ var address = endpoint.ToString();
+
+ _localEndPoints.GetOrAdd(address, address);
+ }
+
+ LogRequest(_logger, request);
+ }
+
+ private void ProcessWebSocketRequest(HttpListenerContext ctx)
+ {
+ try
+ {
+ var webSocketContext = ctx.AcceptWebSocket(null, null);
+
+ if (WebSocketHandler != null)
+ {
+ WebSocketHandler(new WebSocketConnectEventArgs
+ {
+ WebSocket = new SharpWebSocket(webSocketContext.WebSocket, _logger),
+ Endpoint = ctx.Request.RemoteEndPoint.ToString()
+ });
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("AcceptWebSocketAsync error", ex);
+ ctx.Response.StatusCode = 500;
+ ctx.Response.Close();
+ }
+ }
+
+ private IHttpRequest GetRequest(HttpListenerContext httpContext)
+ {
+ var operationName = httpContext.Request.GetOperationName();
+
+ var req = new WebSocketSharpRequest(httpContext, operationName, RequestAttributes.None, _logger);
+ req.RequestAttributes = req.GetAttributes();
+
+ return req;
+ }
+
+ /// <summary>
+ /// Logs the request.
+ /// </summary>
+ /// <param name="logger">The logger.</param>
+ /// <param name="request">The request.</param>
+ private static void LogRequest(ILogger logger, HttpListenerRequest request)
+ {
+ var log = new StringBuilder();
+
+ //var headers = string.Join(",", request.Headers.AllKeys.Where(i => !string.Equals(i, "cookie", StringComparison.OrdinalIgnoreCase) && !string.Equals(i, "Referer", StringComparison.OrdinalIgnoreCase)).Select(k => k + "=" + request.Headers[k]));
+
+ //log.AppendLine("Ip: " + request.RemoteEndPoint + ". Headers: " + headers);
+
+ var type = request.IsWebSocketRequest ? "Web Socket" : "HTTP " + request.HttpMethod;
+
+ logger.LogMultiline(type + " " + request.Url, LogSeverity.Debug, log);
+ }
+
+ private void HandleError(Exception ex, HttpListenerContext context)
+ {
+ var httpReq = GetRequest(context);
+
+ if (ErrorHandler != null)
+ {
+ ErrorHandler(ex, httpReq);
+ }
+ }
+
+ public void Stop()
+ {
+ _httpsv.Stop();
+ }
+
+ private readonly object _disposeLock = new object();
+ public void Dispose()
+ {
+ lock (_disposeLock)
+ {
+ if (_httpsv != null)
+ {
+ _httpsv.OnRequest -= _httpsv_OnRequest;
+ _httpsv.Stop();
+ _httpsv = null;
+ }
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
new file mode 100644
index 000000000..7a5f6fbdc
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
@@ -0,0 +1,402 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Funq;
+using MediaBrowser.Model.Logging;
+using ServiceStack;
+using ServiceStack.Host;
+using ServiceStack.Web;
+using WebSocketSharp.Net;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
+{
+ public partial class WebSocketSharpRequest : IHttpRequest
+ {
+ public Container Container { get; set; }
+ private readonly HttpListenerRequest request;
+ private readonly IHttpResponse response;
+
+ public WebSocketSharpRequest(HttpListenerContext httpContext, string operationName, RequestAttributes requestAttributes, ILogger logger)
+ {
+ this.OperationName = operationName;
+ this.RequestAttributes = requestAttributes;
+ this.request = httpContext.Request;
+ this.response = new WebSocketSharpResponse(logger, httpContext.Response);
+
+ this.RequestPreferences = new RequestPreferences(this);
+ }
+
+ public HttpListenerRequest HttpRequest
+ {
+ get { return request; }
+ }
+
+ public object OriginalRequest
+ {
+ get { return request; }
+ }
+
+ public IResponse Response
+ {
+ get { return response; }
+ }
+
+ public IHttpResponse HttpResponse
+ {
+ get { return response; }
+ }
+
+ public RequestAttributes RequestAttributes { get; set; }
+
+ public IRequestPreferences RequestPreferences { get; private set; }
+
+ public T TryResolve<T>()
+ {
+ if (typeof(T) == typeof(IHttpRequest))
+ throw new Exception("You don't need to use IHttpRequest.TryResolve<IHttpRequest> to resolve itself");
+
+ if (typeof(T) == typeof(IHttpResponse))
+ throw new Exception("Resolve IHttpResponse with 'Response' property instead of IHttpRequest.TryResolve<IHttpResponse>");
+
+ return Container == null
+ ? HostContext.TryResolve<T>()
+ : Container.TryResolve<T>();
+ }
+
+ public string OperationName { get; set; }
+
+ public object Dto { get; set; }
+
+ public string GetRawBody()
+ {
+ if (bufferedStream != null)
+ {
+ return bufferedStream.ToArray().FromUtf8Bytes();
+ }
+
+ using (var reader = new StreamReader(InputStream))
+ {
+ return reader.ReadToEnd();
+ }
+ }
+
+ public string RawUrl
+ {
+ get { return request.RawUrl; }
+ }
+
+ public string AbsoluteUri
+ {
+ get { return request.Url.AbsoluteUri.TrimEnd('/'); }
+ }
+
+ public string UserHostAddress
+ {
+ get { return request.UserHostAddress; }
+ }
+
+ public string XForwardedFor
+ {
+ get
+ {
+ return String.IsNullOrEmpty(request.Headers[HttpHeaders.XForwardedFor]) ? null : request.Headers[HttpHeaders.XForwardedFor];
+ }
+ }
+
+ public int? XForwardedPort
+ {
+ get
+ {
+ return string.IsNullOrEmpty(request.Headers[HttpHeaders.XForwardedPort]) ? (int?)null : int.Parse(request.Headers[HttpHeaders.XForwardedPort]);
+ }
+ }
+
+ public string XForwardedProtocol
+ {
+ get
+ {
+ return string.IsNullOrEmpty(request.Headers[HttpHeaders.XForwardedProtocol]) ? null : request.Headers[HttpHeaders.XForwardedProtocol];
+ }
+ }
+
+ public string XRealIp
+ {
+ get
+ {
+ return String.IsNullOrEmpty(request.Headers[HttpHeaders.XRealIp]) ? null : request.Headers[HttpHeaders.XRealIp];
+ }
+ }
+
+ private string remoteIp;
+ public string RemoteIp
+ {
+ get
+ {
+ return remoteIp ??
+ (remoteIp = XForwardedFor ??
+ (XRealIp ??
+ ((request.RemoteEndPoint != null) ? request.RemoteEndPoint.Address.ToString() : null)));
+ }
+ }
+
+ public bool IsSecureConnection
+ {
+ get { return request.IsSecureConnection || XForwardedProtocol == "https"; }
+ }
+
+ public string[] AcceptTypes
+ {
+ get { return request.AcceptTypes; }
+ }
+
+ private Dictionary<string, object> items;
+ public Dictionary<string, object> Items
+ {
+ get { return items ?? (items = new Dictionary<string, object>()); }
+ }
+
+ private string responseContentType;
+ public string ResponseContentType
+ {
+ get
+ {
+ return responseContentType
+ ?? (responseContentType = this.GetResponseContentType());
+ }
+ set
+ {
+ this.responseContentType = value;
+ HasExplicitResponseContentType = true;
+ }
+ }
+
+ public bool HasExplicitResponseContentType { get; private set; }
+
+ private string pathInfo;
+ public string PathInfo
+ {
+ get
+ {
+ if (this.pathInfo == null)
+ {
+ var mode = HostContext.Config.HandlerFactoryPath;
+
+ var pos = request.RawUrl.IndexOf("?");
+ if (pos != -1)
+ {
+ var path = request.RawUrl.Substring(0, pos);
+ this.pathInfo = HttpRequestExtensions.GetPathInfo(
+ path,
+ mode,
+ mode ?? "");
+ }
+ else
+ {
+ this.pathInfo = request.RawUrl;
+ }
+
+ this.pathInfo = this.pathInfo.UrlDecode();
+ this.pathInfo = NormalizePathInfo(pathInfo, mode);
+ }
+ return this.pathInfo;
+ }
+ }
+
+ private Dictionary<string, System.Net.Cookie> cookies;
+ public IDictionary<string, System.Net.Cookie> Cookies
+ {
+ get
+ {
+ if (cookies == null)
+ {
+ cookies = new Dictionary<string, System.Net.Cookie>();
+ for (var i = 0; i < this.request.Cookies.Count; i++)
+ {
+ var httpCookie = this.request.Cookies[i];
+ cookies[httpCookie.Name] = new System.Net.Cookie(httpCookie.Name, httpCookie.Value, httpCookie.Path, httpCookie.Domain);
+ }
+ }
+
+ return cookies;
+ }
+ }
+
+ public string UserAgent
+ {
+ get { return request.UserAgent; }
+ }
+
+ private NameValueCollectionWrapper headers;
+ public INameValueCollection Headers
+ {
+ get { return headers ?? (headers = new NameValueCollectionWrapper(request.Headers)); }
+ }
+
+ private NameValueCollectionWrapper queryString;
+ public INameValueCollection QueryString
+ {
+ get { return queryString ?? (queryString = new NameValueCollectionWrapper(HttpUtility.ParseQueryString(request.Url.Query))); }
+ }
+
+ private NameValueCollectionWrapper formData;
+ public INameValueCollection FormData
+ {
+ get { return formData ?? (formData = new NameValueCollectionWrapper(this.Form)); }
+ }
+
+ public bool IsLocal
+ {
+ get { return request.IsLocal; }
+ }
+
+ private string httpMethod;
+ public string HttpMethod
+ {
+ get
+ {
+ return httpMethod
+ ?? (httpMethod = Param(HttpHeaders.XHttpMethodOverride)
+ ?? request.HttpMethod);
+ }
+ }
+
+ public string Verb
+ {
+ get { return HttpMethod; }
+ }
+
+ public string Param(string name)
+ {
+ return Headers[name]
+ ?? QueryString[name]
+ ?? FormData[name];
+ }
+
+ public string ContentType
+ {
+ get { return request.ContentType; }
+ }
+
+ public Encoding contentEncoding;
+ public Encoding ContentEncoding
+ {
+ get { return contentEncoding ?? request.ContentEncoding; }
+ set { contentEncoding = value; }
+ }
+
+ public Uri UrlReferrer
+ {
+ get { return request.UrlReferrer; }
+ }
+
+ public static Encoding GetEncoding(string contentTypeHeader)
+ {
+ var param = GetParameter(contentTypeHeader, "charset=");
+ if (param == null) return null;
+ try
+ {
+ return Encoding.GetEncoding(param);
+ }
+ catch (ArgumentException)
+ {
+ return null;
+ }
+ }
+
+ public bool UseBufferedStream
+ {
+ get { return bufferedStream != null; }
+ set
+ {
+ bufferedStream = value
+ ? bufferedStream ?? new MemoryStream(request.InputStream.ReadFully())
+ : null;
+ }
+ }
+
+ private MemoryStream bufferedStream;
+ public Stream InputStream
+ {
+ get { return bufferedStream ?? request.InputStream; }
+ }
+
+ public long ContentLength
+ {
+ get { return request.ContentLength64; }
+ }
+
+ private IHttpFile[] httpFiles;
+ public IHttpFile[] Files
+ {
+ get
+ {
+ if (httpFiles == null)
+ {
+ if (files == null)
+ return httpFiles = new IHttpFile[0];
+
+ httpFiles = new IHttpFile[files.Count];
+ for (var i = 0; i < files.Count; i++)
+ {
+ var reqFile = files[i];
+
+ httpFiles[i] = new HttpFile
+ {
+ ContentType = reqFile.ContentType,
+ ContentLength = reqFile.ContentLength,
+ FileName = reqFile.FileName,
+ InputStream = reqFile.InputStream,
+ };
+ }
+ }
+ return httpFiles;
+ }
+ }
+
+ static Stream GetSubStream(Stream stream)
+ {
+ if (stream is MemoryStream)
+ {
+ var other = (MemoryStream)stream;
+ try
+ {
+ return new MemoryStream(other.GetBuffer(), 0, (int)other.Length, false, true);
+ }
+ catch (UnauthorizedAccessException)
+ {
+ return new MemoryStream(other.ToArray(), 0, (int)other.Length, false, true);
+ }
+ }
+
+ return stream;
+ }
+
+ static void EndSubStream(Stream stream)
+ {
+ }
+
+ public static string GetHandlerPathIfAny(string listenerUrl)
+ {
+ if (listenerUrl == null) return null;
+ var pos = listenerUrl.IndexOf("://", StringComparison.InvariantCultureIgnoreCase);
+ if (pos == -1) return null;
+ var startHostUrl = listenerUrl.Substring(pos + "://".Length);
+ var endPos = startHostUrl.IndexOf('/');
+ if (endPos == -1) return null;
+ var endHostUrl = startHostUrl.Substring(endPos + 1);
+ return String.IsNullOrEmpty(endHostUrl) ? null : endHostUrl.TrimEnd('/');
+ }
+
+ public static string NormalizePathInfo(string pathInfo, string handlerPath)
+ {
+ if (handlerPath != null && pathInfo.TrimStart('/').StartsWith(
+ handlerPath, StringComparison.InvariantCultureIgnoreCase))
+ {
+ return pathInfo.TrimStart('/').Substring(handlerPath.Length);
+ }
+
+ return pathInfo;
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
new file mode 100644
index 000000000..2e3828512
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
@@ -0,0 +1,144 @@
+using System;
+using System.IO;
+using System.Net;
+using MediaBrowser.Model.Logging;
+using ServiceStack;
+using ServiceStack.Host;
+using ServiceStack.Web;
+using HttpListenerResponse = WebSocketSharp.Net.HttpListenerResponse;
+
+namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
+{
+ public class WebSocketSharpResponse : IHttpResponse
+ {
+ private readonly ILogger _logger;
+ private readonly HttpListenerResponse response;
+
+ public WebSocketSharpResponse(ILogger logger, HttpListenerResponse response)
+ {
+ _logger = logger;
+ this.response = response;
+ }
+
+ public bool UseBufferedStream { get; set; }
+
+ public object OriginalResponse
+ {
+ get { return response; }
+ }
+
+ public int StatusCode
+ {
+ get { return this.response.StatusCode; }
+ set { this.response.StatusCode = value; }
+ }
+
+ public string StatusDescription
+ {
+ get { return this.response.StatusDescription; }
+ set { this.response.StatusDescription = value; }
+ }
+
+ public string ContentType
+ {
+ get { return response.ContentType; }
+ set { response.ContentType = value; }
+ }
+
+ public ICookies Cookies { get; set; }
+
+ public void AddHeader(string name, string value)
+ {
+ if (string.Equals(name, "Content-Type", StringComparison.OrdinalIgnoreCase))
+ {
+ ContentType = value;
+ return;
+ }
+
+ response.AddHeader(name, value);
+ }
+
+ public void Redirect(string url)
+ {
+ response.Redirect(url);
+ }
+
+ public Stream OutputStream
+ {
+ get { return response.OutputStream; }
+ }
+
+ public object Dto { get; set; }
+
+ public void Write(string text)
+ {
+ try
+ {
+ var bOutput = System.Text.Encoding.UTF8.GetBytes(text);
+ response.ContentLength64 = bOutput.Length;
+
+ var outputStream = response.OutputStream;
+ outputStream.Write(bOutput, 0, bOutput.Length);
+ Close();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Could not WriteTextToResponse: " + ex.Message, ex);
+ throw;
+ }
+ }
+
+ public void Close()
+ {
+ if (!this.IsClosed)
+ {
+ this.IsClosed = true;
+
+ try
+ {
+ this.response.CloseOutputStream(_logger);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error closing HttpListener output stream", ex);
+ }
+ }
+ }
+
+ public void End()
+ {
+ Close();
+ }
+
+ public void Flush()
+ {
+ response.OutputStream.Flush();
+ }
+
+ public bool IsClosed
+ {
+ get;
+ private set;
+ }
+
+ public void SetContentLength(long contentLength)
+ {
+ //you can happily set the Content-Length header in Asp.Net
+ //but HttpListener will complain if you do - you have to set ContentLength64 on the response.
+ //workaround: HttpListener throws "The parameter is incorrect" exceptions when we try to set the Content-Length header
+ response.ContentLength64 = contentLength;
+ }
+
+ public void SetCookie(Cookie cookie)
+ {
+ var cookieStr = cookie.AsHeaderValue();
+ response.Headers.Add(HttpHeaders.SetCookie, cookieStr);
+ }
+
+ public bool SendChunked
+ {
+ get { return response.SendChunked; }
+ set { response.SendChunked = value; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
index 17118f4b4..8229c8a2f 100644
--- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
+++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
@@ -14,21 +14,6 @@ namespace MediaBrowser.Server.Implementations.Library
/// </summary>
public class CoreResolutionIgnoreRule : IResolverIgnoreRule
{
- /// <summary>
- /// Any folder named in this list will be ignored - can be added to at runtime for extensibility
- /// </summary>
- private static readonly Dictionary<string, string> IgnoreFolders = new List<string>
- {
- "metadata",
- "ps3_update",
- "ps3_vprm",
- "extrafanart",
- "extrathumbs",
- ".actors",
- ".wd_tv"
-
- }.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
-
private readonly IFileSystem _fileSystem;
public CoreResolutionIgnoreRule(IFileSystem fileSystem)
@@ -78,7 +63,7 @@ namespace MediaBrowser.Server.Implementations.Library
if (args.IsDirectory)
{
// Ignore any folders in our list
- if (IgnoreFolders.ContainsKey(filename))
+ if (EntityResolutionHelper.IgnoreFolders.Contains(filename, StringComparer.OrdinalIgnoreCase))
{
return true;
}
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 905e6e676..f3e6fcdba 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -6,11 +6,11 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Model.Logging;
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
@@ -79,29 +79,29 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
if (string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<Trailer>(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, false, false);
+ return FindMovie<Trailer>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, false, false);
}
if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<MusicVideo>(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, false, false);
+ return FindMovie<MusicVideo>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, false, false);
}
if (string.Equals(collectionType, CollectionType.AdultVideos, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<AdultVideo>(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, true, false);
+ return FindMovie<AdultVideo>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, true, false);
}
if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<Video>(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, true, false);
+ return FindMovie<Video>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, true, false);
}
if (string.IsNullOrEmpty(collectionType) ||
string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase) ||
string.Equals(collectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<Movie>(args.Path, args.Parent, args.FileSystemChildren, args.DirectoryService, true, true);
+ return FindMovie<Movie>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, true, true);
}
return null;
@@ -187,7 +187,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
/// <param name="directoryService">The directory service.</param>
/// <param name="supportMultiFileItems">if set to <c>true</c> [support multi file items].</param>
/// <returns>Movie.</returns>
- private T FindMovie<T>(string path, Folder parent, IEnumerable<FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsMultipleSources)
+ private T FindMovie<T>(string path, Folder parent, List<FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsMultipleSources)
where T : Video, new()
{
var movies = new List<T>();
diff --git a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
index dd2978b17..73afa22e3 100644
--- a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
@@ -10,12 +10,12 @@ using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Library;
+using MediaBrowser.Model.Querying;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Model.Querying;
namespace MediaBrowser.Server.Implementations.Library
{
@@ -82,7 +82,7 @@ namespace MediaBrowser.Server.Implementations.Library
list.Add(await GetUserView(CollectionType.Games, user, string.Empty, cancellationToken).ConfigureAwait(false));
}
- if (user.Configuration.DisplayCollectionsView ||
+ if (user.Configuration.DisplayCollectionsView &&
recursiveChildren.OfType<BoxSet>().Any())
{
list.Add(await GetUserView(CollectionType.BoxSets, user, CollectionType.BoxSets, cancellationToken).ConfigureAwait(false));
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
index 294e293b7..eb1334c10 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "\u0627\u064a\u0642\u0627\u0641",
+ "OptionOn": "\u062a\u0634\u063a\u064a\u0644",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "\u0632\u0645\u0646 \u0627\u0644\u062a\u0634\u063a\u064a\u0644",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json
index 740d1f6e7..f31718893 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Apagat",
+ "OptionOn": "Enc\u00e8s",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Runtime",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
index b9b3df10f..a7f714175 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
@@ -27,20 +27,19 @@
"BrowsePluginCatalogMessage": "Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 pluginy.",
"MessageKeyEmailedTo": "Key emailed to {0}.",
"MessageKeysLinked": "Keys linked.",
- "HeaderConfirmation": "Confirmation",
+ "HeaderConfirmation": "Potvrzen\u00ed",
"MessageKeyUpdated": "Thank you. Your supporter key has been updated.",
"MessageKeyRemoved": "Thank you. Your supporter key has been removed.",
"ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",
- "HeaderSearch": "Search",
- "LabelArtist": "Artist",
- "LabelMovie": "Movie",
- "LabelMusicVideo": "Music Video",
- "LabelEpisode": "Episode",
- "LabelSeries": "Series",
+ "HeaderSearch": "Vyhled\u00e1v\u00e1n\u00ed",
+ "LabelArtist": "Um\u011blec",
+ "LabelMovie": "Film",
+ "LabelMusicVideo": "Hudebn\u00ed video",
+ "LabelEpisode": "Epizoda",
+ "LabelSeries": "S\u00e9rie",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
- "LabelCancelled": "(cancelled)",
- "LabelFailed": "(failed)",
+ "LabelCancelled": "(zru\u0161eno)",
+ "LabelFailed": "(ne\u00fasp\u011b\u0161n\u00e9)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",
@@ -58,39 +57,40 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "P\u0159ehr\u00e1t",
"ButtonEdit": "Upravit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "P\u0159edchod\u00ed stopa",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
"LabelNoUnreadNotifications": "No unread notifications.",
- "ButtonViewNotifications": "View notifications",
- "ButtonMarkTheseRead": "Mark these read",
- "ButtonClose": "Close",
+ "ButtonViewNotifications": "Zobrazit notifikace",
+ "ButtonMarkTheseRead": "Ozna\u010dit jako p\u0159e\u010dten\u00e9",
+ "ButtonClose": "Zav\u0159\u00edt",
"LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.",
- "MessageInvalidUser": "Invalid user or password.",
+ "MessageInvalidUser": "Neplatn\u00e9 u\u017eivatelsk\u00e9 jm\u00e9no nebo heslo.",
"HeaderAllRecordings": "V\u0161echna nahr\u00e1v\u00e1n\u00ed",
- "RecommendationBecauseYouLike": "Because you like {0}",
- "RecommendationBecauseYouWatched": "Because you watched {0}",
- "RecommendationDirectedBy": "Directed by {0}",
+ "RecommendationBecauseYouLike": "Proto\u017ee se v\u00e1m l\u00edb\u00ed {0}",
+ "RecommendationBecauseYouWatched": "Proto\u017ee jste sledovali {0}",
+ "RecommendationDirectedBy": "Re\u017e\u00edrov\u00e1no {0}",
"RecommendationStarring": "Starring {0}",
"HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation",
"MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?",
"MessageRecordingCancelled": "Recording cancelled.",
"HeaderConfirmSeriesCancellation": "Confirm Series Cancellation",
"MessageConfirmSeriesCancellation": "Are you sure you wish to cancel this series?",
- "MessageSeriesCancelled": "Series cancelled.",
+ "MessageSeriesCancelled": "S\u00e9rie zru\u0161ena.",
"HeaderConfirmRecordingDeletion": "Confirm Recording Deletion",
"MessageConfirmRecordingDeletion": "Are you sure you wish to delete this recording?",
"MessageRecordingDeleted": "Recording deleted.",
- "ButonCancelRecording": "Cancel Recording",
- "MessageRecordingSaved": "Recording saved.",
+ "ButonCancelRecording": "Zru\u0161it nahr\u00e1v\u00e1n\u00ed",
+ "MessageRecordingSaved": "Nahr\u00e1van\u00ed ulo\u017eeno",
"OptionSunday": "Ned\u011ble",
"OptionMonday": "Pond\u011bl\u00ed",
"OptionTuesday": "\u00dater\u00fd",
@@ -98,34 +98,33 @@
"OptionThursday": "\u010ctvrtek",
"OptionFriday": "P\u00e1tek",
"OptionSaturday": "Sobota",
- "HeaderConfirmDeletion": "Confirm Deletion",
+ "HeaderConfirmDeletion": "Potvrdit smaz\u00e1n\u00ed",
"MessageConfirmPathSubstitutionDeletion": "Are you sure you wish to delete this path substitution?",
- "LiveTvUpdateAvailable": "(Update available)",
- "LabelVersionUpToDate": "Up to date!",
+ "LiveTvUpdateAvailable": "(Aktualizace dostupn\u00e1)",
+ "LabelVersionUpToDate": "Aktu\u00e1ln\u00ed!",
"ButtonResetTuner": "Reset tuner",
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
- "StatusRecording": "Recording",
+ "StatusRecording": "Nahr\u00e1v\u00e1n\u00ed",
"StatusWatching": "Watching",
"StatusRecordingProgram": "Recording {0}",
"StatusWatchingProgram": "Watching {0}",
"HeaderSplitMedia": "Split Media Apart",
"MessageConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?",
- "HeaderError": "Error",
+ "HeaderError": "Chyba",
"MessagePleaseSelectOneItem": "Please select at least one item.",
"MessagePleaseSelectTwoItems": "Please select at least two items.",
"MessageTheFollowingItemsWillBeGrouped": "The following titles will be grouped into one item:",
"MessageConfirmItemGrouping": "Media Browser clients will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?",
"HeaderResume": "Pozastavit",
"HeaderMyViews": "My Views",
- "HeaderLibraryFolders": "Media Folders",
+ "HeaderLibraryFolders": "Slo\u017eky m\u00e9di\u00ed",
"HeaderLatestMedia": "Latest Media",
- "ButtonMore": "More...",
- "HeaderFavoriteMovies": "Favorite Movies",
+ "ButtonMore": "V\u00edce...",
+ "HeaderFavoriteMovies": "Obl\u00edben\u00e9 filmy",
"HeaderFavoriteShows": "Favorite Shows",
"HeaderFavoriteEpisodes": "Favorite Episodes",
"HeaderFavoriteGames": "Favorite Games",
@@ -147,15 +146,15 @@
"ButtonRemove": "Odstranit",
"LabelChapterDownloaders": "Chapter downloaders:",
"LabelChapterDownloadersHelp": "Enable and rank your preferred chapter downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.",
- "HeaderFavoriteAlbums": "Favorite Albums",
+ "HeaderFavoriteAlbums": "Obl\u00edben\u00e1 alba",
"HeaderLatestChannelMedia": "Latest Channel Items",
"ButtonOrganizeFile": "Organize File",
- "ButtonDeleteFile": "Delete File",
+ "ButtonDeleteFile": "Smazat soubor",
"HeaderOrganizeFile": "Organize File",
- "HeaderDeleteFile": "Delete File",
- "StatusSkipped": "Skipped",
- "StatusFailed": "Failed",
- "StatusSuccess": "Success",
+ "HeaderDeleteFile": "Smazat soubor",
+ "StatusSkipped": "P\u0159esko\u010deno",
+ "StatusFailed": "Chyba",
+ "StatusSuccess": "\u00dasp\u011bch",
"MessageFileWillBeDeleted": "The following file will be deleted:",
"MessageSureYouWishToProceed": "Are you sure you wish to proceed?",
"MessageDuplicatesWillBeDeleted": "In addition the following dupliates will be deleted:",
@@ -168,7 +167,7 @@
"HeaderShutdown": "Shutdown",
"MessageConfirmRestart": "Are you sure you wish to restart Media Browser Server?",
"MessageConfirmShutdown": "Are you sure you wish to shutdown Media Browser Server?",
- "ButtonUpdateNow": "Update Now",
+ "ButtonUpdateNow": "Aktualizujte te\u010f",
"NewVersionOfSomethingAvailable": "A new version of {0} is available!",
"VersionXIsAvailableForDownload": "Version {0} is now available for download.",
"LabelVersionNumber": "Version {0}",
@@ -181,7 +180,7 @@
"LabelRunningOnPort": "Running on port {0}.",
"LabelRunningOnPorts": "Running on ports {0} and {1}.",
"HeaderLatestFromChannel": "Latest from {0}",
- "ButtonDownload": "Download",
+ "ButtonDownload": "St\u00e1hnout",
"LabelUnknownLanaguage": "Unknown language",
"HeaderCurrentSubtitles": "Current Subtitles",
"MessageDownloadQueued": "The download has been queued.",
@@ -196,18 +195,18 @@
"ButtonNetwork": "Network",
"MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
"HeaderMenu": "Menu",
- "ButtonOpen": "Open",
+ "ButtonOpen": "Otev\u0159\u00edt",
"ButtonOpenInNewTab": "Open in new tab",
"ButtonShuffle": "Shuffle",
"ButtonInstantMix": "Instant mix",
- "ButtonResume": "Resume",
+ "ButtonResume": "Pokra\u010dovat",
"HeaderScenes": "Sc\u00e9ny",
"HeaderAudioTracks": "Audio Tracks",
- "HeaderSubtitles": "Subtitles",
+ "HeaderSubtitles": "Titulky",
"HeaderVideoQuality": "Video Quality",
"MessageErrorPlayingVideo": "There was an error playing the video.",
"MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
- "ButtonHome": "Home",
+ "ButtonHome": "Dom\u016f",
"ButtonDashboard": "Dashboard",
"ButtonReports": "Reports",
"ButtonMetadataManager": "Metadata Manager",
@@ -215,20 +214,104 @@
"HeaderName": "N\u00e1zev",
"HeaderAlbum": "Album",
"HeaderAlbumArtist": "Album Artist",
- "HeaderArtist": "Artist",
+ "HeaderArtist": "Um\u011blec",
"LabelAddedOnDate": "Added {0}",
"ButtonStart": "Start",
"HeaderChannels": "Kan\u00e1ly",
"HeaderMediaFolders": "Slo\u017eky m\u00e9di\u00ed",
"HeaderBlockItemsWithNoRating": "Block items with no rating information:",
"OptionBlockOthers": "Others",
- "OptionBlockTvShows": "TV Shows",
- "OptionBlockTrailers": "Trailers",
- "OptionBlockMusic": "Music",
- "OptionBlockMovies": "Movies",
- "OptionBlockBooks": "Books",
- "OptionBlockGames": "Games",
+ "OptionBlockTvShows": "Televizn\u00ed po\u0159ady",
+ "OptionBlockTrailers": "Upout\u00e1vky",
+ "OptionBlockMusic": "Hudba",
+ "OptionBlockMovies": "Filmy",
+ "OptionBlockBooks": "Knihy",
+ "OptionBlockGames": "Hry",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ukon\u010deno",
+ "OptionContinuing": "Pokra\u010dov\u00e1n\u00ed",
+ "OptionOff": "Vypnout",
+ "OptionOn": "Zapnout",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Rodi\u010dovsk\u00e9 hodnocen\u00ed",
+ "OptionPeople": "People",
+ "OptionRuntime": "D\u00e9lka",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Pokro\u010dil\u00e9",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Titulky",
+ "ButtonScenes": "Sc\u00e9ny",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json
index 21ceabda5..2b70bf74e 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Afspil",
"ButtonEdit": "Rediger",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "F\u00e6rdig",
+ "OptionContinuing": "Fors\u00e6ttes",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Varighed",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanceret",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Undertekster",
+ "ButtonScenes": "Scener",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
index 546c8c1c4..be4cf1bbf 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Serie",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(abgebrochen)",
"LabelFailed": "(fehlgeschlagen)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "Unbekannte Sprache",
"ButtonMute": "Stumm",
"ButtonUnmute": "Unmute",
+ "ButtonStop": "Stop",
"ButtonNextTrack": "N\u00e4chster Track",
"ButtonPause": "Pause",
"ButtonPlay": "Abspielen",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Tuner zur\u00fccksetzen",
"MessageConfirmResetTuner": "sind Sie sicher, dass Sie diesen Tuner zur\u00fccksetzen wollen? Alle aktiven Wiedergaben und Aufnahmen werden sofort beendet.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "Alle Channel",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Jederzeit",
"StatusRecording": "Aufnehmen",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Beendent",
+ "OptionContinuing": "Fortdauernd",
+ "OptionOff": "Aus",
+ "OptionOn": "Ein",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Altersfreigabe",
+ "OptionPeople": "People",
+ "OptionRuntime": "Dauer",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "Alle Channel",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Neu starten",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Erweitert",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Untertitel",
+ "ButtonScenes": "Szenen",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
index 4c441571d..a033dcbc9 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "\u03c3\u03b2\u03b7\u03c3\u03c4\u03cc\u03c2",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Runtime",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json
index a3f0038c7..59dbb63e6 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Runtime",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json
index 9ae851d95..a0fc056bc 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Runtime",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json
index 1073d16cf..5c199c8ea 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episodio",
"LabelSeries": "Series",
"LabelStopping": "Deteniendo",
- "ButtonStop": "Detener",
"LabelCancelled": "(cancelado)",
"LabelFailed": "(fracasado)",
"LabelAbortedByServerShutdown": "(Abortado por cierre del servidor)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Idioma desconocido",
"ButtonMute": "Silencio",
"ButtonUnmute": "Activar audio",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Detener",
+ "ButtonNextTrack": "Pista siguiente",
"ButtonPause": "Pausa",
"ButtonPlay": "Reproducir",
"ButtonEdit": "Editar",
"ButtonQueue": "En cola",
"ButtonPlayTrailer": "Reproducir trailer",
"ButtonPlaylist": "Lista de reproducci\u00f3n",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Pista anterior",
"LabelEnabled": "Activado",
"LabelDisabled": "Desactivado",
"ButtonMoreInformation": "M\u00e1s informaci\u00f3n",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reinicio del sintonizador",
"MessageConfirmResetTuner": "\u00bfEst\u00e1 seguro que desea reiniciar este sintonizador? Cualquier reproducci\u00f3n o grabaci\u00f3n activa se detendr\u00e1 inmediatamente.",
"ButtonCancelSeries": "Cancelar serie",
- "LabelAllChannels": "Todos los canales",
"HeaderSeriesRecordings": "Grabaciones de series",
"LabelAnytime": "A cualquier hora",
"StatusRecording": "Grabando",
@@ -215,5 +214,104 @@
"HeaderName": "Nombre",
"HeaderAlbum": "Album",
"HeaderAlbumArtist": "Artista del album",
- "HeaderArtist": "Artista"
+ "HeaderArtist": "Artista",
+ "LabelAddedOnDate": "A\u00f1adido {0}",
+ "ButtonStart": "Inicio",
+ "HeaderChannels": "Canales",
+ "HeaderMediaFolders": "Carpetas de medios",
+ "HeaderBlockItemsWithNoRating": "Bloquear elementos sin informaci\u00f3n de clasificaci\u00f3n:",
+ "OptionBlockOthers": "Otros",
+ "OptionBlockTvShows": "Tv Shows",
+ "OptionBlockTrailers": "Trailers",
+ "OptionBlockMusic": "M\u00fasica",
+ "OptionBlockMovies": "Pel\u00edculas",
+ "OptionBlockBooks": "Libros",
+ "OptionBlockGames": "Juegos",
+ "OptionBlockLiveTvPrograms": "Programas de TV en vivo",
+ "OptionBlockLiveTvChannels": "Canales de Tv en vivo",
+ "OptionBlockChannelContent": "Contenido de canales de Internet",
+ "ButtonRevoke": "Revocar",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Finalizado",
+ "OptionContinuing": "Continuando",
+ "OptionOff": "Apagado",
+ "OptionOn": "Encendido",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Clasificaci\u00f3n parental",
+ "OptionPeople": "People",
+ "OptionRuntime": "Tiempo",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "Todos los canales",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Reiniciar",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Servidor",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avanzado",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subt\u00edtulos",
+ "ButtonScenes": "Escenas",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json
index 55fbf236d..c6efa636a 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_ES.json
@@ -230,5 +230,8 @@
"OptionBlockGames": "Juegos",
"OptionBlockLiveTvPrograms": "Programas de TV en vivo",
"OptionBlockLiveTvChannels": "Canales de Tv en vivo",
- "OptionBlockChannelContent": "Contenido de canales de Internet"
+ "OptionBlockChannelContent": "Contenido de canales de Internet",
+ "ButtonRevoke": "Revocar",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key"
} \ 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 3f87eeaae..1ca3aa56d 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episodio",
"LabelSeries": "Series",
"LabelStopping": "Deteniendo",
- "ButtonStop": "Detener",
"LabelCancelled": "(cancelado)",
"LabelFailed": "(fall\u00f3)",
"LabelAbortedByServerShutdown": "(Abortada por apagado del servidor)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "Idioma Desconocido",
"ButtonMute": "Mudo",
"ButtonUnmute": "Quitar mudo",
+ "ButtonStop": "Detener",
"ButtonNextTrack": "Pista Siguiente",
"ButtonPause": "Pausar",
"ButtonPlay": "Reproducir",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Resetear Sintonizador",
"MessageConfirmResetTuner": "\u00bfEstas seguro de que deseas restablecer las configuraciones de este sintonizador? Cualquier reproducci\u00f3n o grabaci\u00f3n sera interrumpida abruptamente.",
"ButtonCancelSeries": "Cancelar Series",
- "LabelAllChannels": "Todos los canales",
"HeaderSeriesRecordings": "Grabaciones de Series",
"LabelAnytime": "Cuando sea",
"StatusRecording": "Grabando",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Juegos",
"OptionBlockLiveTvPrograms": "Programas de TV en Vivo",
"OptionBlockLiveTvChannels": "Canales de TV en Vivo",
- "OptionBlockChannelContent": "Contenido de Canales de Internet"
+ "OptionBlockChannelContent": "Contenido de Canales de Internet",
+ "ButtonRevoke": "Revocar",
+ "MessageConfirmRevokeApiKey": "\u00bfEst\u00e1 seguro de querer revocar esta llave de API?",
+ "HeaderConfirmRevokeApiKey": "Revocar llave de API",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Finalizado",
+ "OptionContinuing": "Continuando",
+ "OptionOff": "No",
+ "OptionOn": "Si",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Clasificaci\u00f3n Parental",
+ "OptionPeople": "People",
+ "OptionRuntime": "Duraci\u00f3n",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "Todos los canales",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Reiniciar",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Servidor",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadatos",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avanzado",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subt\u00edtulos",
+ "ButtonScenes": "Escenas",
+ "ButtonQuality": "Quality"
} \ 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 7a020ab30..0919afc7d 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
@@ -38,7 +38,6 @@
"LabelEpisode": "\u00c9pisode",
"LabelSeries": "S\u00e9ries",
"LabelStopping": "En cours d'arr\u00eat",
- "ButtonStop": "Arr\u00eat",
"LabelCancelled": "(annull\u00e9)",
"LabelFailed": "(\u00e9chou\u00e9)",
"LabelAbortedByServerShutdown": "(Annul\u00e9 par fermeture du serveur)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "Langue inconnue",
"ButtonMute": "Sourdine",
"ButtonUnmute": "D\u00e9sactiver sourdine",
+ "ButtonStop": "Arr\u00eat",
"ButtonNextTrack": "Piste suivante",
"ButtonPause": "Pause",
"ButtonPlay": "Lire",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Red\u00e9marrer tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Annuler s\u00e9ries",
- "LabelAllChannels": "Toutes les cha\u00eenes",
"HeaderSeriesRecordings": "Enregistrements de s\u00e9ries",
"LabelAnytime": "N'importe quelle heure",
"StatusRecording": "En cours d'enregistrement",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Termin\u00e9",
+ "OptionContinuing": "En cours",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Note d'\u00e9valuation de contr\u00f4le parental",
+ "OptionPeople": "People",
+ "OptionRuntime": "Dur\u00e9e",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "Toutes les cha\u00eenes",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Red\u00e9marrer",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Serveur",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "M\u00e9tadonn\u00e9es",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avanc\u00e9",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Sous-titres",
+ "ButtonScenes": "Sc\u00e8nes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json
index 59f4d83e9..6310881f2 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "\u05e0\u05d2\u05df",
"ButtonEdit": "\u05e2\u05e8\u05d5\u05da",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "\u05d4\u05e1\u05ea\u05d9\u05d9\u05dd",
+ "OptionContinuing": "\u05de\u05de\u05e9\u05d9\u05da",
+ "OptionOff": "\u05db\u05d1\u05d5\u05d9",
+ "OptionOn": "\u05e4\u05d5\u05e2\u05dc",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "\u05d3\u05d9\u05e8\u05d5\u05d2 \u05d1\u05e7\u05e8\u05ea \u05d4\u05d5\u05e8\u05d9\u05dd",
+ "OptionPeople": "People",
+ "OptionRuntime": "\u05de\u05e9\u05da",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "\u05d4\u05ea\u05d7\u05e8 \u05de\u05d7\u05d3\u05e9",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "\u05e9\u05e8\u05ea",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "\u05de\u05ea\u05e7\u05d3\u05dd",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json
index 8ef22a770..96e71a971 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episodio",
"LabelSeries": "Serie",
"LabelStopping": "Sto fermando",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancellato)",
"LabelFailed": "(fallito)",
"LabelAbortedByServerShutdown": "(Interrotto dalla chiusura del server)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "(linguaggio sconosciuto)",
"ButtonMute": "Muto",
"ButtonUnmute": "Togli muto",
+ "ButtonStop": "Stop",
"ButtonNextTrack": "Prossimo",
"ButtonPause": "Pausa",
"ButtonPlay": "Riproduci",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Riavvia Scheda TV",
"MessageConfirmResetTuner": "Sei sicuro di voler ripristinare questo sintonizzatore? Tutti i giocatori attivi o registrazioni saranno bruscamente fermato.",
"ButtonCancelSeries": "Serie cancellate",
- "LabelAllChannels": "Tutti i canali",
"HeaderSeriesRecordings": "Serie registrate",
"LabelAnytime": "Qualsiasi ora",
"StatusRecording": "Registrazione",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Finito",
+ "OptionContinuing": "In corso",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Voto Genitori",
+ "OptionPeople": "People",
+ "OptionRuntime": "Durata",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "Tutti i canali",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Riavvia",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avanzato",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Sottotitoli",
+ "ButtonScenes": "Scene",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
index a69a7b124..187bcb59f 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -1,240 +1,324 @@
{
"SettingsSaved": "Settings saved.",
- "AddUser": "Add User",
- "Users": "Users",
- "Delete": "Delete",
- "Administrator": "Administrator",
- "Password": "Password",
- "DeleteImage": "Delete Image",
- "DeleteImageConfirmation": "Are you sure you wish to delete this image?",
- "FileReadCancelled": "The file read has been canceled.",
- "FileNotFound": "File not found.",
- "FileReadError": "An error occurred while reading the file.",
- "DeleteUser": "Delete User",
- "DeleteUserConfirmation": "Are you sure you wish to delete {0}?",
- "PasswordResetHeader": "Password Reset",
- "PasswordResetComplete": "The password has been reset.",
- "PasswordResetConfirmation": "Are you sure you wish to reset the password?",
- "PasswordSaved": "Password saved.",
- "PasswordMatchError": "Password and password confirmation must match.",
- "OptionRelease": "Official Release",
- "OptionBeta": "Beta",
- "OptionDev": "Dev (Unstable)",
- "UninstallPluginHeader": "Uninstall Plugin",
- "UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
- "NoPluginConfigurationMessage": "This plugin has nothing to configure.",
- "NoPluginsInstalledMessage": "You have no plugins installed.",
- "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.",
- "MessageKeyEmailedTo": "Key emailed to {0}.",
- "MessageKeysLinked": "Keys linked.",
- "HeaderConfirmation": "Confirmation",
- "MessageKeyUpdated": "Thank you. Your supporter key has been updated.",
- "MessageKeyRemoved": "Thank you. Your supporter key has been removed.",
- "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",
- "HeaderSearch": "Search",
- "LabelArtist": "Artist",
- "LabelMovie": "Movie",
- "LabelMusicVideo": "Music Video",
- "LabelEpisode": "Episode",
- "LabelSeries": "Series",
- "LabelStopping": "Stopping",
- "ButtonStop": "Stop",
- "LabelCancelled": "(cancelled)",
- "LabelFailed": "(failed)",
- "LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
- "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
- "HeaderDeleteTaskTrigger": "Delete Task Trigger",
- "HeaderTaskTriggers": "Task Triggers",
- "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?",
- "MessageNoPluginsInstalled": "You have no plugins installed.",
- "LabelVersionInstalled": "{0} installed",
- "LabelNumberReviews": "{0} Reviews",
- "LabelFree": "Free",
- "HeaderSelectAudio": "Select Audio",
- "HeaderSelectSubtitles": "Select Subtitles",
- "LabelDefaultStream": "(Default)",
- "LabelForcedStream": "(Forced)",
- "LabelDefaultForcedStream": "(Default/Forced)",
- "LabelUnknownLanguage": "Unknown language",
- "ButtonMute": "Mute",
- "ButtonUnmute": "Unmute",
- "ButtonStop": "Stop",
- "ButtonNextTrack": "Next Track",
- "ButtonPause": "Pause",
- "ButtonPlay": "Play",
- "ButtonEdit": "Edit",
- "ButtonQueue": "Queue",
- "ButtonPlayTrailer": "Play trailer",
- "ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
- "LabelEnabled": "Enabled",
- "LabelDisabled": "Disabled",
- "ButtonMoreInformation": "More Information",
- "LabelNoUnreadNotifications": "No unread notifications.",
- "ButtonViewNotifications": "View notifications",
- "ButtonMarkTheseRead": "Mark these read",
- "ButtonClose": "Close",
- "LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.",
- "MessageInvalidUser": "Invalid user or password.",
- "HeaderAllRecordings": "All Recordings",
- "RecommendationBecauseYouLike": "Because you like {0}",
- "RecommendationBecauseYouWatched": "Because you watched {0}",
- "RecommendationDirectedBy": "Directed by {0}",
- "RecommendationStarring": "Starring {0}",
- "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation",
- "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?",
- "MessageRecordingCancelled": "Recording cancelled.",
- "HeaderConfirmSeriesCancellation": "Confirm Series Cancellation",
- "MessageConfirmSeriesCancellation": "Are you sure you wish to cancel this series?",
- "MessageSeriesCancelled": "Series cancelled.",
- "HeaderConfirmRecordingDeletion": "Confirm Recording Deletion",
- "MessageConfirmRecordingDeletion": "Are you sure you wish to delete this recording?",
- "MessageRecordingDeleted": "Recording deleted.",
- "ButonCancelRecording": "Cancel Recording",
- "MessageRecordingSaved": "Recording saved.",
- "OptionSunday": "Sunday",
- "OptionMonday": "Monday",
- "OptionTuesday": "Tuesday",
- "OptionWednesday": "Wednesday",
- "OptionThursday": "Thursday",
- "OptionFriday": "Friday",
- "OptionSaturday": "Saturday",
- "HeaderConfirmDeletion": "Confirm Deletion",
- "MessageConfirmPathSubstitutionDeletion": "Are you sure you wish to delete this path substitution?",
- "LiveTvUpdateAvailable": "(Update available)",
- "LabelVersionUpToDate": "Up to date!",
- "ButtonResetTuner": "Reset tuner",
- "HeaderResetTuner": "Reset Tuner",
- "MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
- "ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
- "HeaderSeriesRecordings": "Series Recordings",
- "LabelAnytime": "Any time",
- "StatusRecording": "Recording",
- "StatusWatching": "Watching",
- "StatusRecordingProgram": "Recording {0}",
- "StatusWatchingProgram": "Watching {0}",
- "HeaderSplitMedia": "Split Media Apart",
- "MessageConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?",
- "HeaderError": "Error",
- "MessagePleaseSelectOneItem": "Please select at least one item.",
- "MessagePleaseSelectTwoItems": "Please select at least two items.",
- "MessageTheFollowingItemsWillBeGrouped": "The following titles will be grouped into one item:",
- "MessageConfirmItemGrouping": "Media Browser clients will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?",
- "HeaderResume": "Resume",
- "HeaderMyViews": "My Views",
- "HeaderLibraryFolders": "Media Folders",
- "HeaderLatestMedia": "Latest Media",
- "ButtonMore": "More...",
- "HeaderFavoriteMovies": "Favorite Movies",
- "HeaderFavoriteShows": "Favorite Shows",
- "HeaderFavoriteEpisodes": "Favorite Episodes",
- "HeaderFavoriteGames": "Favorite Games",
- "HeaderRatingsDownloads": "Rating / Downloads",
- "HeaderConfirmProfileDeletion": "Confirm Profile Deletion",
- "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?",
- "HeaderSelectServerCachePath": "Select Server Cache Path",
- "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path",
- "HeaderSelectImagesByNamePath": "Select Images By Name Path",
- "HeaderSelectMetadataPath": "Select Metadata Path",
- "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable. The location of this folder will directly impact server performance and should ideally be placed on a solid state drive.",
- "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.",
- "HeaderSelectImagesByNamePathHelp": "Browse or enter the path to your items by name folder. The folder must be writeable.",
- "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.",
- "HeaderSelectChannelDownloadPath": "Select Channel Download Path",
- "HeaderSelectChannelDownloadPathHelp": "Browse or enter the path to use for storing channel cache files. The folder must be writeable.",
- "OptionNewCollection": "New...",
- "ButtonAdd": "Add",
- "ButtonRemove": "Remove",
- "LabelChapterDownloaders": "Chapter downloaders:",
- "LabelChapterDownloadersHelp": "Enable and rank your preferred chapter downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.",
- "HeaderFavoriteAlbums": "Favorite Albums",
- "HeaderLatestChannelMedia": "Latest Channel Items",
- "ButtonOrganizeFile": "Organize File",
- "ButtonDeleteFile": "Delete File",
- "HeaderOrganizeFile": "Organize File",
- "HeaderDeleteFile": "Delete File",
- "StatusSkipped": "Skipped",
- "StatusFailed": "Failed",
- "StatusSuccess": "Success",
- "MessageFileWillBeDeleted": "The following file will be deleted:",
- "MessageSureYouWishToProceed": "Are you sure you wish to proceed?",
- "MessageDuplicatesWillBeDeleted": "In addition the following dupliates will be deleted:",
- "MessageFollowingFileWillBeMovedFrom": "The following file will be moved from:",
- "MessageDestinationTo": "to:",
- "HeaderSelectWatchFolder": "Select Watch Folder",
- "HeaderSelectWatchFolderHelp": "Browse or enter the path to your watch folder. The folder must be writeable.",
- "OrganizePatternResult": "Result: {0}",
- "HeaderRestart": "Restart",
- "HeaderShutdown": "Shutdown",
- "MessageConfirmRestart": "Are you sure you wish to restart Media Browser Server?",
- "MessageConfirmShutdown": "Are you sure you wish to shutdown Media Browser Server?",
- "ButtonUpdateNow": "Update Now",
- "NewVersionOfSomethingAvailable": "A new version of {0} is available!",
- "VersionXIsAvailableForDownload": "Version {0} is now available for download.",
- "LabelVersionNumber": "Version {0}",
- "LabelPlayMethodTranscoding": "Transcoding",
- "LabelPlayMethodDirectStream": "Direct Streaming",
- "LabelPlayMethodDirectPlay": "Direct Playing",
- "LabelAudioCodec": "Audio: {0}",
- "LabelVideoCodec": "Video: {0}",
- "LabelRemoteAccessUrl": "Remote access: {0}",
- "LabelRunningOnPort": "Running on port {0}.",
- "LabelRunningOnPorts": "Running on ports {0} and {1}.",
- "HeaderLatestFromChannel": "Latest from {0}",
- "ButtonDownload": "Download",
- "LabelUnknownLanaguage": "Unknown language",
- "HeaderCurrentSubtitles": "Current Subtitles",
- "MessageDownloadQueued": "The download has been queued.",
- "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?",
- "ButtonRemoteControl": "Remote Control",
- "HeaderLatestTvRecordings": "Latest Recordings",
- "ButtonOk": "Ok",
- "ButtonCancel": "Cancel",
- "ButtonRefresh": "Refresh",
- "LabelCurrentPath": "Current path:",
- "HeaderSelectMediaPath": "Select Media Path",
- "ButtonNetwork": "Network",
- "MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
- "HeaderMenu": "Menu",
- "ButtonOpen": "Open",
- "ButtonOpenInNewTab": "Open in new tab",
- "ButtonShuffle": "Shuffle",
- "ButtonInstantMix": "Instant mix",
- "ButtonResume": "Resume",
- "HeaderScenes": "Scenes",
- "HeaderAudioTracks": "Audio Tracks",
- "LabelUnknownLanguage": "Unknown language",
- "HeaderSubtitles": "Subtitles",
- "HeaderVideoQuality": "Video Quality",
- "MessageErrorPlayingVideo": "There was an error playing the video.",
- "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
- "ButtonHome": "Home",
- "ButtonDashboard": "Dashboard",
- "ButtonReports": "Reports",
- "ButtonMetadataManager": "Metadata Manager",
- "HeaderTime": "Time",
- "HeaderName": "Name",
- "HeaderAlbum": "Album",
- "HeaderAlbumArtist": "Album Artist",
- "HeaderArtist": "Artist",
- "LabelAddedOnDate": "Added {0}",
- "ButtonStart": "Start",
- "ButtonStop": "Stop",
- "HeaderChannels": "Channels",
- "HeaderMediaFolders": "Media Folders",
- "HeaderBlockItemsWithNoRating": "Block items with no rating information:",
- "OptionBlockOthers": "Others",
- "OptionBlockTvShows": "TV Shows",
- "OptionBlockTrailers": "Trailers",
- "OptionBlockMusic": "Music",
- "OptionBlockMovies": "Movies",
- "OptionBlockBooks": "Books",
- "OptionBlockGames": "Games",
- "OptionBlockLiveTvPrograms": "Live TV Programs",
- "OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content",
- "ButtonRevoke": "Revoke",
- "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
- "HeaderConfirmRevokeApiKey": "Revoke Api Key"
-} \ No newline at end of file
+ "AddUser": "Add User",
+ "Users": "Users",
+ "Delete": "Delete",
+ "Administrator": "Administrator",
+ "Password": "Password",
+ "DeleteImage": "Delete Image",
+ "DeleteImageConfirmation": "Are you sure you wish to delete this image?",
+ "FileReadCancelled": "The file read has been canceled.",
+ "FileNotFound": "File not found.",
+ "FileReadError": "An error occurred while reading the file.",
+ "DeleteUser": "Delete User",
+ "DeleteUserConfirmation": "Are you sure you wish to delete {0}?",
+ "PasswordResetHeader": "Password Reset",
+ "PasswordResetComplete": "The password has been reset.",
+ "PasswordResetConfirmation": "Are you sure you wish to reset the password?",
+ "PasswordSaved": "Password saved.",
+ "PasswordMatchError": "Password and password confirmation must match.",
+ "OptionRelease": "Official Release",
+ "OptionBeta": "Beta",
+ "OptionDev": "Dev (Unstable)",
+ "UninstallPluginHeader": "Uninstall Plugin",
+ "UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
+ "NoPluginConfigurationMessage": "This plugin has nothing to configure.",
+ "NoPluginsInstalledMessage": "You have no plugins installed.",
+ "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.",
+ "MessageKeyEmailedTo": "Key emailed to {0}.",
+ "MessageKeysLinked": "Keys linked.",
+ "HeaderConfirmation": "Confirmation",
+ "MessageKeyUpdated": "Thank you. Your supporter key has been updated.",
+ "MessageKeyRemoved": "Thank you. Your supporter key has been removed.",
+ "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.",
+ "HeaderSearch": "Search",
+ "LabelArtist": "Artist",
+ "LabelMovie": "Movie",
+ "LabelMusicVideo": "Music Video",
+ "LabelEpisode": "Episode",
+ "LabelSeries": "Series",
+ "LabelStopping": "Stopping",
+ "LabelCancelled": "(cancelled)",
+ "LabelFailed": "(failed)",
+ "LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
+ "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
+ "HeaderDeleteTaskTrigger": "Delete Task Trigger",
+ "HeaderTaskTriggers": "Task Triggers",
+ "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?",
+ "MessageNoPluginsInstalled": "You have no plugins installed.",
+ "LabelVersionInstalled": "{0} installed",
+ "LabelNumberReviews": "{0} Reviews",
+ "LabelFree": "Free",
+ "HeaderSelectAudio": "Select Audio",
+ "HeaderSelectSubtitles": "Select Subtitles",
+ "LabelDefaultStream": "(Default)",
+ "LabelForcedStream": "(Forced)",
+ "LabelDefaultForcedStream": "(Default/Forced)",
+ "LabelUnknownLanguage": "Unknown language",
+ "ButtonMute": "Mute",
+ "ButtonUnmute": "Unmute",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next Track",
+ "ButtonPause": "Pause",
+ "ButtonPlay": "Play",
+ "ButtonEdit": "Edit",
+ "ButtonQueue": "Queue",
+ "ButtonPlayTrailer": "Play trailer",
+ "ButtonPlaylist": "Playlist",
+ "ButtonPreviousTrack": "Previous Track",
+ "LabelEnabled": "Enabled",
+ "LabelDisabled": "Disabled",
+ "ButtonMoreInformation": "More Information",
+ "LabelNoUnreadNotifications": "No unread notifications.",
+ "ButtonViewNotifications": "View notifications",
+ "ButtonMarkTheseRead": "Mark these read",
+ "ButtonClose": "Close",
+ "LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.",
+ "MessageInvalidUser": "Invalid user or password.",
+ "HeaderAllRecordings": "All Recordings",
+ "RecommendationBecauseYouLike": "Because you like {0}",
+ "RecommendationBecauseYouWatched": "Because you watched {0}",
+ "RecommendationDirectedBy": "Directed by {0}",
+ "RecommendationStarring": "Starring {0}",
+ "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation",
+ "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?",
+ "MessageRecordingCancelled": "Recording cancelled.",
+ "HeaderConfirmSeriesCancellation": "Confirm Series Cancellation",
+ "MessageConfirmSeriesCancellation": "Are you sure you wish to cancel this series?",
+ "MessageSeriesCancelled": "Series cancelled.",
+ "HeaderConfirmRecordingDeletion": "Confirm Recording Deletion",
+ "MessageConfirmRecordingDeletion": "Are you sure you wish to delete this recording?",
+ "MessageRecordingDeleted": "Recording deleted.",
+ "ButonCancelRecording": "Cancel Recording",
+ "MessageRecordingSaved": "Recording saved.",
+ "OptionSunday": "Sunday",
+ "OptionMonday": "Monday",
+ "OptionTuesday": "Tuesday",
+ "OptionWednesday": "Wednesday",
+ "OptionThursday": "Thursday",
+ "OptionFriday": "Friday",
+ "OptionSaturday": "Saturday",
+ "HeaderConfirmDeletion": "Confirm Deletion",
+ "MessageConfirmPathSubstitutionDeletion": "Are you sure you wish to delete this path substitution?",
+ "LiveTvUpdateAvailable": "(Update available)",
+ "LabelVersionUpToDate": "Up to date!",
+ "ButtonResetTuner": "Reset tuner",
+ "HeaderResetTuner": "Reset Tuner",
+ "MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
+ "ButtonCancelSeries": "Cancel Series",
+ "HeaderSeriesRecordings": "Series Recordings",
+ "LabelAnytime": "Any time",
+ "StatusRecording": "Recording",
+ "StatusWatching": "Watching",
+ "StatusRecordingProgram": "Recording {0}",
+ "StatusWatchingProgram": "Watching {0}",
+ "HeaderSplitMedia": "Split Media Apart",
+ "MessageConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?",
+ "HeaderError": "Error",
+ "MessagePleaseSelectOneItem": "Please select at least one item.",
+ "MessagePleaseSelectTwoItems": "Please select at least two items.",
+ "MessageTheFollowingItemsWillBeGrouped": "The following titles will be grouped into one item:",
+ "MessageConfirmItemGrouping": "Media Browser clients will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?",
+ "HeaderResume": "Resume",
+ "HeaderMyViews": "My Views",
+ "HeaderLibraryFolders": "Media Folders",
+ "HeaderLatestMedia": "Latest Media",
+ "ButtonMore": "More...",
+ "HeaderFavoriteMovies": "Favorite Movies",
+ "HeaderFavoriteShows": "Favorite Shows",
+ "HeaderFavoriteEpisodes": "Favorite Episodes",
+ "HeaderFavoriteGames": "Favorite Games",
+ "HeaderRatingsDownloads": "Rating / Downloads",
+ "HeaderConfirmProfileDeletion": "Confirm Profile Deletion",
+ "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?",
+ "HeaderSelectServerCachePath": "Select Server Cache Path",
+ "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path",
+ "HeaderSelectImagesByNamePath": "Select Images By Name Path",
+ "HeaderSelectMetadataPath": "Select Metadata Path",
+ "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable. The location of this folder will directly impact server performance and should ideally be placed on a solid state drive.",
+ "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.",
+ "HeaderSelectImagesByNamePathHelp": "Browse or enter the path to your items by name folder. The folder must be writeable.",
+ "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.",
+ "HeaderSelectChannelDownloadPath": "Select Channel Download Path",
+ "HeaderSelectChannelDownloadPathHelp": "Browse or enter the path to use for storing channel cache files. The folder must be writeable.",
+ "OptionNewCollection": "New...",
+ "ButtonAdd": "Add",
+ "ButtonRemove": "Remove",
+ "LabelChapterDownloaders": "Chapter downloaders:",
+ "LabelChapterDownloadersHelp": "Enable and rank your preferred chapter downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.",
+ "HeaderFavoriteAlbums": "Favorite Albums",
+ "HeaderLatestChannelMedia": "Latest Channel Items",
+ "ButtonOrganizeFile": "Organize File",
+ "ButtonDeleteFile": "Delete File",
+ "HeaderOrganizeFile": "Organize File",
+ "HeaderDeleteFile": "Delete File",
+ "StatusSkipped": "Skipped",
+ "StatusFailed": "Failed",
+ "StatusSuccess": "Success",
+ "MessageFileWillBeDeleted": "The following file will be deleted:",
+ "MessageSureYouWishToProceed": "Are you sure you wish to proceed?",
+ "MessageDuplicatesWillBeDeleted": "In addition the following dupliates will be deleted:",
+ "MessageFollowingFileWillBeMovedFrom": "The following file will be moved from:",
+ "MessageDestinationTo": "to:",
+ "HeaderSelectWatchFolder": "Select Watch Folder",
+ "HeaderSelectWatchFolderHelp": "Browse or enter the path to your watch folder. The folder must be writeable.",
+ "OrganizePatternResult": "Result: {0}",
+ "HeaderRestart": "Restart",
+ "HeaderShutdown": "Shutdown",
+ "MessageConfirmRestart": "Are you sure you wish to restart Media Browser Server?",
+ "MessageConfirmShutdown": "Are you sure you wish to shutdown Media Browser Server?",
+ "ButtonUpdateNow": "Update Now",
+ "NewVersionOfSomethingAvailable": "A new version of {0} is available!",
+ "VersionXIsAvailableForDownload": "Version {0} is now available for download.",
+ "LabelVersionNumber": "Version {0}",
+ "LabelPlayMethodTranscoding": "Transcoding",
+ "LabelPlayMethodDirectStream": "Direct Streaming",
+ "LabelPlayMethodDirectPlay": "Direct Playing",
+ "LabelAudioCodec": "Audio: {0}",
+ "LabelVideoCodec": "Video: {0}",
+ "LabelRemoteAccessUrl": "Remote access: {0}",
+ "LabelRunningOnPort": "Running on port {0}.",
+ "LabelRunningOnPorts": "Running on ports {0} and {1}.",
+ "HeaderLatestFromChannel": "Latest from {0}",
+ "ButtonDownload": "Download",
+ "LabelUnknownLanaguage": "Unknown language",
+ "HeaderCurrentSubtitles": "Current Subtitles",
+ "MessageDownloadQueued": "The download has been queued.",
+ "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?",
+ "ButtonRemoteControl": "Remote Control",
+ "HeaderLatestTvRecordings": "Latest Recordings",
+ "ButtonOk": "Ok",
+ "ButtonCancel": "Cancel",
+ "ButtonRefresh": "Refresh",
+ "LabelCurrentPath": "Current path:",
+ "HeaderSelectMediaPath": "Select Media Path",
+ "ButtonNetwork": "Network",
+ "MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
+ "HeaderMenu": "Menu",
+ "ButtonOpen": "Open",
+ "ButtonOpenInNewTab": "Open in new tab",
+ "ButtonShuffle": "Shuffle",
+ "ButtonInstantMix": "Instant mix",
+ "ButtonResume": "Resume",
+ "HeaderScenes": "Scenes",
+ "HeaderAudioTracks": "Audio Tracks",
+ "LabelUnknownLanguage": "Unknown language",
+ "HeaderSubtitles": "Subtitles",
+ "HeaderVideoQuality": "Video Quality",
+ "MessageErrorPlayingVideo": "There was an error playing the video.",
+ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
+ "ButtonHome": "Home",
+ "ButtonDashboard": "Dashboard",
+ "ButtonReports": "Reports",
+ "ButtonMetadataManager": "Metadata Manager",
+ "HeaderTime": "Time",
+ "HeaderName": "Name",
+ "HeaderAlbum": "Album",
+ "HeaderAlbumArtist": "Album Artist",
+ "HeaderArtist": "Artist",
+ "LabelAddedOnDate": "Added {0}",
+ "ButtonStart": "Start",
+ "HeaderChannels": "Channels",
+ "HeaderMediaFolders": "Media Folders",
+ "HeaderBlockItemsWithNoRating": "Block items with no rating information:",
+ "OptionBlockOthers": "Others",
+ "OptionBlockTvShows": "TV Shows",
+ "OptionBlockTrailers": "Trailers",
+ "OptionBlockMusic": "Music",
+ "OptionBlockMovies": "Movies",
+ "OptionBlockBooks": "Books",
+ "OptionBlockGames": "Games",
+ "OptionBlockLiveTvPrograms": "Live TV Programs",
+ "OptionBlockLiveTvChannels": "Live TV Channels",
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "DeleteImageConfirmation": "Are you sure you wish to delete this image?",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "HeaderMediaFolders": "Media Folders",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Runtime",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "ButtonRefresh": "Refresh",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonMute": "Mute",
+ "ButtonUnmute": "Unmute",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality",
+ "HeaderNotifications": "Notifications"
+}
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
index 22d1d91a3..a15a12878 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
@@ -38,7 +38,6 @@
"LabelEpisode": "\u042d\u043f\u0438\u0437\u043e\u0434",
"LabelSeries": "\u0421\u0435\u0440\u0438\u0430\u043b",
"LabelStopping": "\u0422\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0443\u0434\u0430",
- "ButtonStop": "\u0422\u043e\u049b\u0442\u0430\u0442\u0443",
"LabelCancelled": "(\u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b)",
"LabelFailed": "(\u0441\u04d9\u0442\u0441\u0456\u0437)",
"LabelAbortedByServerShutdown": "(\u0421\u0435\u0440\u0432\u0435\u0440 \u0436\u04b1\u043c\u044b\u0441\u044b \u0430\u044f\u049b\u0442\u0430\u043b\u0443\u044b\u043d\u0430 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b \u04af\u0437\u0456\u043b\u0434\u0456)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "\u0411\u0435\u043b\u0433\u0456\u0441\u0456\u0437 \u0442\u0456\u043b",
"ButtonMute": "\u0414\u044b\u0431\u044b\u0441\u0442\u044b \u04e9\u0448\u0456\u0440\u0443",
"ButtonUnmute": "\u0414\u044b\u0431\u044b\u0441\u0442\u044b \u049b\u043e\u0441\u0443",
+ "ButtonStop": "\u0422\u043e\u049b\u0442\u0430\u0442\u0443",
"ButtonNextTrack": "\u041a\u0435\u043b\u0435\u0441\u0456 \u0436\u043e\u043b\u0448\u044b\u049b",
"ButtonPause": "\u04ae\u0437\u0456\u043b\u0456\u0441",
"ButtonPlay": "\u041e\u0439\u043d\u0430\u0442\u0443",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "\u0422\u044e\u043d\u0435\u0440\u0434\u0456 \u044b\u0441\u044b\u0440\u0443",
"MessageConfirmResetTuner": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u0442\u044e\u043d\u0435\u0440\u0434\u0456 \u044b\u0441\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435? \u04d8\u0440 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440 \u043d\u0435\u043c\u0435\u0441\u0435 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440 \u043a\u0435\u043d\u0435\u0442\u0442\u0435\u043d \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0430\u0434\u044b.",
"ButtonCancelSeries": "\u0421\u0435\u0440\u0438\u0430\u043b\u0434\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
- "LabelAllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440",
"HeaderSeriesRecordings": "\u0421\u0435\u0440\u0438\u0430\u043b \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b",
"LabelAnytime": "\u04d8\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430",
"StatusRecording": "\u0416\u0430\u0437\u0431\u0430",
@@ -230,5 +229,89 @@
"OptionBlockGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440",
"OptionBlockLiveTvPrograms": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414-\u0442\u0430\u0440\u0430\u0442\u044b\u043c\u0434\u0430\u0440",
"OptionBlockLiveTvChannels": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414-\u0430\u0440\u043d\u0430\u043b\u0430\u0440",
- "OptionBlockChannelContent": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0430\u0440\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b"
+ "OptionBlockChannelContent": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0430\u0440\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b",
+ "ButtonRevoke": "\u0411\u0430\u0441 \u0442\u0430\u0440\u0442\u0443",
+ "MessageConfirmRevokeApiKey": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b API \u043a\u0456\u043b\u0442\u0456\u043d\u0435\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435? \u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u043c\u0435\u043d Media Browser \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u049b\u043e\u0441\u044b\u043b\u044b\u043c \u043a\u0435\u043d\u0435\u0442 \u04af\u0437\u0456\u043b\u0435\u0434\u0456.",
+ "HeaderConfirmRevokeApiKey": "API \u043a\u0456\u043b\u0442\u0456\u043d\u0435\u043d \u0431\u0430\u0441 \u0442\u0430\u0440\u0442\u0443",
+ "ValueContainer": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440: {0}",
+ "ValueAudioCodec": "\u0414\u044b\u0431\u044b\u0441 \u043a\u043e\u0434\u0435\u0433\u0456: {0}",
+ "ValueVideoCodec": "\u0411\u0435\u0439\u043d\u0435 \u043a\u043e\u0434\u0435\u0433\u0456: {0}",
+ "ValueCodec": "\u041a\u043e\u0434\u0435\u043a: {0}",
+ "ValueConditions": "\u0428\u0430\u0440\u0442\u0442\u0430\u0440: {0}",
+ "LabelAll": "\u0411\u0430\u0440\u043b\u044b\u049b",
+ "HeaderDeleteImage": "\u0421\u0443\u0440\u0435\u0442\u0442\u0456 \u0436\u043e\u044e",
+ "MessageFileNotFound": "\u0424\u0430\u0439\u043b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.",
+ "MessageFileReadError": "\u041e\u0441\u044b \u0444\u0430\u0439\u043b\u0434\u044b \u043e\u049b\u044b\u0493\u0430\u043d\u0434\u0430 \u049b\u0430\u0442\u0435 \u043f\u0430\u0439\u0434\u0430 \u0431\u043e\u043b\u0434\u044b.",
+ "ButtonNextPage": "\u041a\u0435\u043b\u0435\u0441\u0456 \u0431\u0435\u0442",
+ "ButtonPreviousPage": "\u0410\u043b\u0434\u044b\u043d\u0493\u044b \u0431\u0435\u0442",
+ "ButtonMoveLeft": "\u0421\u043e\u043b\u0493\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0443",
+ "ButtonMoveRight": "\u041e\u04a3\u0493\u0430 \u0436\u044b\u043b\u0436\u044b\u0442\u0443",
+ "ButtonBrowseOnlineImages": "\u0416\u0435\u043b\u0456\u0434\u0435\u0433\u0456 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0448\u043e\u043b\u0443",
+ "HeaderDeleteItem": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0456 \u0436\u043e\u044e",
+ "ConfirmDeleteItem": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0456 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0434\u0430\u043d \u0436\u043e\u044e \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?",
+ "MessagePleaseEnterNameOrId": "\u0410\u0442\u044b\u043d \u043d\u0435\u043c\u0435\u0441\u0435 \u0441\u044b\u0440\u0442\u049b\u044b ID \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437.",
+ "MessageValueNotCorrect": "\u0415\u043d\u0433\u0456\u0437\u0456\u043b\u0433\u0435\u043d \u043c\u04d9\u043d \u0434\u04b1\u0440\u044b\u0441 \u0435\u043c\u0435\u0441. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.",
+ "MessageItemSaved": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.",
+ "OptionEnded": "\u0410\u044f\u049b\u0442\u0430\u043b\u0434\u044b",
+ "OptionContinuing": "\u0416\u0430\u043b\u0493\u0430\u0441\u0443\u0434\u0430",
+ "OptionOff": "\u04e8\u0448\u0456\u0440",
+ "OptionOn": "\u049a\u043e\u0441",
+ "HeaderFields": "\u04e8\u0440\u0456\u0441\u0442\u0435\u0440",
+ "HeaderFieldsHelp": "\u049a\u04b1\u0440\u0441\u0430\u0443\u043b\u0430\u0443 \u04af\u0448\u0456\u043d \u0436\u04d9\u043d\u0435 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u04e9\u0437\u0433\u0435\u0440\u0442\u0443\u0456\u043d\u0435 \u0442\u044b\u0439\u044b\u043c \u0441\u0430\u043b\u0443 \u04af\u0448\u0456\u043d, \u04e9\u0440\u0456\u0441\u0442\u0456 \"\u04e8\u0428\u0406\u0420\" \u0442\u0430\u0440\u0430\u043f\u044b\u043d\u0430 \u0441\u044b\u0440\u0493\u0430\u0442\u044b\u04a3\u044b\u0437.",
+ "HeaderLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414",
+ "MissingLocalTrailer": "\u0416\u0435\u0440\u0433\u0456\u043b\u0456\u043a\u0442\u0456 \u0442\u0440\u0435\u0439\u043b\u0435\u0440 \u0436\u043e\u049b.",
+ "MissingPrimaryImage": "\u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u0441\u0443\u0440\u0435\u0442 \u0436\u043e\u049b.",
+ "MissingBackdropImage": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442 \u0436\u043e\u049b.",
+ "MissingLogoImage": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f \u0441\u0443\u0440\u0435\u0442\u0456 \u0436\u043e\u049b.",
+ "MissingEpisode": "\u042d\u043f\u0438\u0437\u043e\u0434 \u0436\u043e\u049b.",
+ "OptionScreenshots": "\u042d\u043a\u0440\u0430\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456",
+ "OptionBackdrops": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440",
+ "OptionImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440",
+ "OptionKeywords": "\u041a\u0456\u043b\u0442 \u0441\u04e9\u0437\u0434\u0435\u0440",
+ "OptionTags": "\u0422\u0435\u0433\u0442\u0435\u0440",
+ "OptionStudios": "\u0421\u0442\u0443\u0434\u0438\u044f\u043b\u0430\u0440",
+ "OptionName": "\u0410\u0442\u044b",
+ "OptionOverview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443",
+ "OptionGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440",
+ "OptionParentalRating": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442",
+ "OptionPeople": "\u0410\u0434\u0430\u043c\u0434\u0430\u0440",
+ "OptionRuntime": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443 \u0443\u0430\u049b\u044b\u0442\u044b",
+ "OptionProductionLocations": "\u04e8\u043d\u0434\u0456\u0440\u0443 \u043e\u0440\u044b\u043d\u0434\u0430\u0440\u044b",
+ "OptionBirthLocation": "\u0422\u0443\u0493\u0430\u043d \u043e\u0440\u043d\u044b",
+ "LabelAllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440",
+ "LabelLiveProgram": "\u0422\u0406\u041a\u0415\u041b\u0415\u0419 \u042d\u0424\u0418\u0420",
+ "LabelNewProgram": "\u0416\u0410\u04a2\u0410",
+ "LabelPremiereProgram": "\u0422\u04b0\u0421\u0410\u0423\u041a\u0415\u0421\u0415\u0420\u0406",
+ "HeaderChangeFolderType": "\u049a\u0430\u043b\u0442\u0430 \u0442\u04af\u0440\u0456\u043d \u04e9\u0437\u0433\u0435\u0440\u0442\u0443",
+ "HeaderChangeFolderTypeHelp": "\u049a\u0430\u043b\u0442\u0430 \u0442\u04af\u0440\u0456\u043d \u04e9\u0437\u0433\u0435\u0440\u0442\u0443 \u04af\u0448\u0456\u043d, \u0430\u043b\u0430\u0441\u0442\u0430\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0436\u0438\u043d\u0430\u049b\u0442\u044b \u0436\u0430\u04a3\u0430 \u0442\u04af\u0440\u0456\u043c\u0435\u043d \u049b\u0430\u0439\u0442\u0430 \u049b\u04b1\u0440\u044b\u04a3\u044b\u0437.",
+ "HeaderAlert": "\u0415\u0441\u043a\u0435\u0440\u0442\u0443",
+ "MessagePleaseRestart": "\u0416\u0430\u04a3\u0430\u0440\u0442\u0443\u0434\u044b \u0430\u044f\u049b\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.",
+ "ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
+ "MessagePleaseRefreshPage": "\u0416\u0430\u04a3\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u043b\u0430\u0440\u0434\u044b \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u0431\u0435\u0442\u0442\u0456 \u049b\u0430\u0439\u0442\u0430 \u0436\u04af\u043a\u0442\u0435\u04a3\u0456\u0437.",
+ "ButtonHide": "\u0416\u0430\u0441\u044b\u0440\u0443",
+ "MessageSettingsSaved": "\u0422\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.",
+ "ButtonSignOut": "\u0428\u044b\u0493\u0443",
+ "ButtonMyProfile": "\u041c\u0435\u043d\u0456\u04a3 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b\u043c",
+ "ButtonMyPreferences": "\u041c\u0435\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043c",
+ "MessageBrowserDoesNotSupportWebSockets": "\u041e\u0441\u044b \u0448\u043e\u043b\u0493\u044b\u0448 \u0432\u0435\u0431-\u0441\u043e\u043a\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u049b\u043e\u043b\u0434\u0430\u043c\u0430\u0439\u0434\u044b. \u0410\u043d\u0430\u0493\u04b1\u0440\u043b\u044b\u043c \u0442\u0438\u0456\u043c\u0434\u0456 \u0436\u04b1\u043c\u044b\u0441 \u04af\u0448\u0456\u043d, \u0436\u0430\u04a3\u0430 \u0448\u043e\u043b\u0493\u044b\u0448 \u0430\u0440\u049b\u044b\u043b\u044b, \u043c\u044b\u0441\u0430\u043b\u044b, Chrome, Firefox, IE10+, Safari (iOS) \u043d\u0435 Opera, \u04d9\u0440\u0435\u043a\u0435\u0442 \u0436\u0430\u0441\u0430\u04a3\u044b\u0437",
+ "LabelInstallingPackage": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u0434\u0430",
+ "LabelPackageInstallCompleted": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u044b \u0430\u044f\u049b\u0442\u0430\u043b\u0434\u044b.",
+ "LabelPackageInstallFailed": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u044b \u0441\u04d9\u0442\u0441\u0456\u0437.",
+ "LabelPackageInstallCancelled": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.",
+ "TabServer": "\u0421\u0435\u0440\u0432\u0435\u0440",
+ "TabUsers": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440",
+ "TabLibrary": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430",
+ "TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414",
+ "TabAutoOrganize": "\u0410\u0432\u0442\u043e\u04b1\u0439\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u0440\u0443",
+ "TabPlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440",
+ "TabAdvanced": "\u041a\u0435\u04a3\u0435\u0439\u0442\u0456\u043b\u0433\u0435\u043d\u0434\u0435\u0440",
+ "TabHelp": "\u0410\u043d\u044b\u049b\u0442\u0430\u043c\u0430",
+ "TabScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b",
+ "ButtonFullscreen": "\u0422\u043e\u043b\u044b\u049b \u044d\u043a\u0440\u0430\u043d",
+ "ButtonAudioTracks": "\u0414\u044b\u0431\u044b\u0441 \u0436\u043e\u043b\u0448\u044b\u0493\u044b",
+ "ButtonSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440",
+ "ButtonScenes": "\u0421\u0430\u0445\u043d\u0430\u043b\u0430\u0440",
+ "ButtonQuality": "\u0421\u0430\u043f\u0430"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json
index b863a6c6e..30a6b8e26 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Runtime",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json
index acf1182f7..6f726759d 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Avsluttet",
+ "OptionContinuing": "Fortsetter",
+ "OptionOff": "Av",
+ "OptionOn": "P\u00e5",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Spilletid",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avansert",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ 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 e11fd37be..3f0d01084 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Aflevering",
"LabelSeries": "Series",
"LabelStopping": "Stoppen",
- "ButtonStop": "Stop",
"LabelCancelled": "(Geannuleerd)",
"LabelFailed": "(Mislukt)",
"LabelAbortedByServerShutdown": "(Afgebroken door afsluiten van de server)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "Onbekende taal",
"ButtonMute": "Dempen",
"ButtonUnmute": "Dempen opheffen",
+ "ButtonStop": "Stop",
"ButtonNextTrack": "Volgend nummer",
"ButtonPause": "Pauze",
"ButtonPlay": "Afspelen",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Weet u zeker dat u deze tuner wilt resetten? Alle actieve spelers of opnamen zullen direct worden gestaakt.",
"ButtonCancelSeries": "Annuleren Series",
- "LabelAllChannels": "Alle kanalen",
"HeaderSeriesRecordings": "Serie Opnames",
"LabelAnytime": "Elke keer",
"StatusRecording": "Opname",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Spellen",
"OptionBlockLiveTvPrograms": "Live TV Programma's",
"OptionBlockLiveTvChannels": "Live TV Kanalen",
- "OptionBlockChannelContent": "Internet kanaal Inhoud"
+ "OptionBlockChannelContent": "Internet kanaal Inhoud",
+ "ButtonRevoke": "Herroepen",
+ "MessageConfirmRevokeApiKey": "Weet u zeker dat u deze api-sleutel intrekt? Verbinding van de toepassing met Media Browser zal abrupt worden be\u00ebindigd.",
+ "HeaderConfirmRevokeApiKey": "Intrekken Api Sleutel",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Voorwaarden: {0}",
+ "LabelAll": "Alles",
+ "HeaderDeleteImage": "Afbeelding verwijderen",
+ "MessageFileNotFound": "Bestand niet gevonden.",
+ "MessageFileReadError": "Er is een fout opgetreden bij het lezen van dit bestand.",
+ "ButtonNextPage": "Volgende pagina",
+ "ButtonPreviousPage": "Vorige Pagina",
+ "ButtonMoveLeft": "Verplaats naar links",
+ "ButtonMoveRight": "Verplaats naar rechts",
+ "ButtonBrowseOnlineImages": "Blader door online afbeeldingen",
+ "HeaderDeleteItem": "Item verwijderen",
+ "ConfirmDeleteItem": "Weet u zeker dat u dit item uit uw bibliotheek wilt verwijderen?",
+ "MessagePleaseEnterNameOrId": "Voer een naam of een externe Id in",
+ "MessageValueNotCorrect": "De ingevoerde waarde is niet correct. Probeer het opnieuw.",
+ "MessageItemSaved": "Item opgeslagen.",
+ "OptionEnded": "Gestopt",
+ "OptionContinuing": "Wordt vervolgd...",
+ "OptionOff": "Uit",
+ "OptionOn": "Aan",
+ "HeaderFields": "Velden",
+ "HeaderFieldsHelp": "Schuiven naar 'uit' om het te vergrendelen en om te voorkomen dat het de gegevens worden gewijzigd.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Lokale trailer ontbreekt.",
+ "MissingPrimaryImage": "Primaire afbeelding ontbreekt.",
+ "MissingBackdropImage": "Achtergrondafbeelding ontbreekt.",
+ "MissingLogoImage": "Logo ontbreekt.",
+ "MissingEpisode": "Ontbrekende aflevering.",
+ "OptionScreenshots": "Schermopnamen",
+ "OptionBackdrops": "Achtergronden",
+ "OptionImages": "Afbeeldingen",
+ "OptionKeywords": "Trefwoorden",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Naam",
+ "OptionOverview": "Overzicht",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Kijkwijzer classificatie",
+ "OptionPeople": "Personen",
+ "OptionRuntime": "Speelduur",
+ "OptionProductionLocations": "Productie Locaties",
+ "OptionBirthLocation": "Geboorte Locatie",
+ "LabelAllChannels": "Alle kanalen",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NIEUW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Verander Maptype",
+ "HeaderChangeFolderTypeHelp": "Als u het type map wilt wijzigen, verwijder het dan en maak dan een nieuwe collectie met het nieuwe type.",
+ "HeaderAlert": "Waarschuwing",
+ "MessagePleaseRestart": "Herstart om update te voltooien.",
+ "ButtonRestart": "Herstart",
+ "MessagePleaseRefreshPage": "Vernieuw deze pagina om nieuwe updates te ontvangen van de server.",
+ "ButtonHide": "Verbergen",
+ "MessageSettingsSaved": "Instellingen opgeslagen.",
+ "ButtonSignOut": "Afmelden",
+ "ButtonMyProfile": "Mijn profiel",
+ "ButtonMyPreferences": "Mijn Voorkeuren",
+ "MessageBrowserDoesNotSupportWebSockets": "Deze browser ondersteunt geen web sockets. Voor een betere ervaring, probeer een nieuwere browser zoals Chrome, Firefox, IE10 +, Safari (iOS) of Opera.",
+ "LabelInstallingPackage": "Installeren van {0}",
+ "LabelPackageInstallCompleted": "{0} installatie voltooid.",
+ "LabelPackageInstallFailed": "{0} installatie is mislukt.",
+ "LabelPackageInstallCancelled": "{0} installatie geannuleerd.",
+ "TabServer": "Server",
+ "TabUsers": "Gebruikers",
+ "TabLibrary": "Bibliotheek",
+ "TabMetadata": "Metagegevens",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Automatisch-Organiseren",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Geavanceerd",
+ "TabHelp": "Hulp",
+ "TabScheduledTasks": "Geplande taken",
+ "ButtonFullscreen": "Volledig scherm",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Ondertitels",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Kwaliteit"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json
index 729e20b31..b97935dde 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Ocena rodzicielska",
+ "OptionPeople": "People",
+ "OptionRuntime": "D\u0142ugo\u015b\u0107 filmu",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Zaawansowane",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json
index 16407aa48..367e971d8 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json
@@ -6,7 +6,7 @@
"Administrator": "Administrador",
"Password": "Senha",
"DeleteImage": "Apagar Imagem",
- "DeleteImageConfirmation": "Tem certeza que deseja apagar esta imagem?",
+ "DeleteImageConfirmation": "Deseja realmente apagar esta imagem?",
"FileReadCancelled": "A leitura do arquivo foi cancelada.",
"FileNotFound": "Arquivo n\u00e3o encontrado.",
"FileReadError": "Ocorreu um erro ao ler o arquivo.",
@@ -38,14 +38,13 @@
"LabelEpisode": "Epis\u00f3dio",
"LabelSeries": "S\u00e9ries",
"LabelStopping": "Parando",
- "ButtonStop": "Parar",
"LabelCancelled": "(cancelado)",
"LabelFailed": "(falhou)",
"LabelAbortedByServerShutdown": "(Abortada pelo desligamento do servidor)",
"LabelScheduledTaskLastRan": "\u00daltima execu\u00e7\u00e3o {0}, demorando {1}.",
"HeaderDeleteTaskTrigger": "Excluir Disparador da Tarefa",
"HeaderTaskTriggers": "Disparadores de Tarefa",
- "MessageDeleteTaskTrigger": "Tem certeza que deseja excluir este disparador de tarefa?",
+ "MessageDeleteTaskTrigger": "Deseja realmente excluir este disparador de tarefa?",
"MessageNoPluginsInstalled": "Voc\u00ea n\u00e3o possui plugins instalados.",
"LabelVersionInstalled": "{0} instalado",
"LabelNumberReviews": "{0} Cr\u00edticas",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Idioma desconhecido",
"ButtonMute": "Mudo",
"ButtonUnmute": "Remover Mudo",
- "ButtonNextTrack": "Pr\u00f3xima faixa",
+ "ButtonStop": "Parar",
+ "ButtonNextTrack": "Pr\u00f3xima Faixa",
"ButtonPause": "Pausar",
"ButtonPlay": "Reproduzir",
"ButtonEdit": "Editar",
- "ButtonQueue": "Fila",
+ "ButtonQueue": "Adicionar \u00e0 fila",
"ButtonPlayTrailer": "Reproduzir trailer",
"ButtonPlaylist": "Lista reprodu\u00e7\u00e3o",
- "ButtonPreviousTrack": "Faixa anterior",
+ "ButtonPreviousTrack": "Faixa Anterior",
"LabelEnabled": "Ativada",
"LabelDisabled": "Desativada",
"ButtonMoreInformation": "Mais informa\u00e7\u00f5es",
@@ -81,13 +81,13 @@
"RecommendationDirectedBy": "Dirigido por {0}",
"RecommendationStarring": "Estrelando {0}",
"HeaderConfirmRecordingCancellation": "Confirmar Cancelamento da Grava\u00e7\u00e3o",
- "MessageConfirmRecordingCancellation": "Tem certeza que deseja cancelar esta grava\u00e7\u00e3o?",
+ "MessageConfirmRecordingCancellation": "Deseja realmente cancelar esta grava\u00e7\u00e3o?",
"MessageRecordingCancelled": "Grava\u00e7\u00e3o cancelada.",
"HeaderConfirmSeriesCancellation": "Confirmar Cancelamento da S\u00e9rie",
- "MessageConfirmSeriesCancellation": "Tem certeza que deseja cancelar esta s\u00e9rie?",
+ "MessageConfirmSeriesCancellation": "Deseja realmente cancelar esta s\u00e9rie?",
"MessageSeriesCancelled": "S\u00e9rie cancelada.",
"HeaderConfirmRecordingDeletion": "Confirmar Exclus\u00e3o da Grava\u00e7\u00e3o",
- "MessageConfirmRecordingDeletion": "Tem certeza que deseja excluir esta grava\u00e7\u00e3o?",
+ "MessageConfirmRecordingDeletion": "Deseja realmente excluir esta grava\u00e7\u00e3o?",
"MessageRecordingDeleted": "Grava\u00e7\u00e3o exclu\u00edda.",
"ButonCancelRecording": "Cancelar Grava\u00e7\u00e3o",
"MessageRecordingSaved": "Grava\u00e7\u00e3o salva.",
@@ -99,14 +99,13 @@
"OptionFriday": "Sexta-feira",
"OptionSaturday": "S\u00e1bado",
"HeaderConfirmDeletion": "Confirmar Exclus\u00e3o",
- "MessageConfirmPathSubstitutionDeletion": "Tem certeza que deseja excluir esta substitui\u00e7\u00e3o de caminho?",
+ "MessageConfirmPathSubstitutionDeletion": "Deseja realmente excluir esta substitui\u00e7\u00e3o de caminho?",
"LiveTvUpdateAvailable": "(Atualiza\u00e7\u00e3o dispon\u00edvel)",
"LabelVersionUpToDate": "Atualizado!",
"ButtonResetTuner": "Reiniciar sintonizador",
"HeaderResetTuner": "Reiniciar Sintonizador",
- "MessageConfirmResetTuner": "Tem certeza que deseja reiniciar este sintonizador? Qualquer reprodutor ativo ser\u00e1 abruptamente parado.",
+ "MessageConfirmResetTuner": "Deseja realmente reiniciar este sintonizador? Qualquer reprodutor ativo ser\u00e1 abruptamente parado.",
"ButtonCancelSeries": "Cancelar S\u00e9rie",
- "LabelAllChannels": "Todos os canais",
"HeaderSeriesRecordings": "Grava\u00e7\u00f5es de S\u00e9ries",
"LabelAnytime": "Qualquer hora",
"StatusRecording": "Gravando",
@@ -114,12 +113,12 @@
"StatusRecordingProgram": "Gravando {0}",
"StatusWatchingProgram": "Assistindo {0}",
"HeaderSplitMedia": "Separar M\u00eddia",
- "MessageConfirmSplitMedia": "Tem certeza que deseja dividir as fontes de m\u00eddia em itens separados?",
+ "MessageConfirmSplitMedia": "Deseja realmente dividir as fontes de m\u00eddia em itens separados?",
"HeaderError": "Erro",
"MessagePleaseSelectOneItem": "Por favor selecione pelo menos um item.",
"MessagePleaseSelectTwoItems": "Por favor selecione pelo menos dois itens.",
"MessageTheFollowingItemsWillBeGrouped": "Os seguintes t\u00edtulos ser\u00e3o agrupados em um \u00fanico item:",
- "MessageConfirmItemGrouping": "Os clientes do Media Browser escolher\u00e3o automaticamente a vers\u00e3o ideal para reproduzir com base no performance do dispositivo e da rede. Tem certeza que deseja continuar?",
+ "MessageConfirmItemGrouping": "Os clientes do Media Browser escolher\u00e3o automaticamente a vers\u00e3o ideal para reproduzir com base no performance do dispositivo e da rede. Deseja realmente continuar?",
"HeaderResume": "Retomar",
"HeaderMyViews": "Minhas Visualiza\u00e7\u00f5es",
"HeaderLibraryFolders": "Pastas de M\u00eddias",
@@ -131,7 +130,7 @@
"HeaderFavoriteGames": "Jogos Favoritos",
"HeaderRatingsDownloads": "Critica \/ Downloads",
"HeaderConfirmProfileDeletion": "Confirmar Exclus\u00e3o do Perfil",
- "MessageConfirmProfileDeletion": "Tem certeza que deseja excluir este perfil?",
+ "MessageConfirmProfileDeletion": "Deseja realmente excluir este perfil?",
"HeaderSelectServerCachePath": "Selecione o Caminho do Cache do Servidor",
"HeaderSelectTranscodingPath": "Selecione o Caminho Tempor\u00e1rio da Transcodifica\u00e7\u00e3o",
"HeaderSelectImagesByNamePath": "Selecione o Caminho da Images By Name",
@@ -142,7 +141,7 @@
"HeaderSelectMetadataPathHelp": "Localize ou digite o caminho que voc\u00ea gostaria de armazenar os metadados. A pasta deve ser grav\u00e1vel.",
"HeaderSelectChannelDownloadPath": "Selecione o Caminho para Download do Canal.",
"HeaderSelectChannelDownloadPathHelp": "Localize ou digite o caminho a ser usado para armazenamento de arquivos de cache do canal. A pasta deve permitir escrita.",
- "OptionNewCollection": "Novo...",
+ "OptionNewCollection": "Nova...",
"ButtonAdd": "Adicionar",
"ButtonRemove": "Remover",
"LabelChapterDownloaders": "Downloaders de cap\u00edtulos:",
@@ -157,7 +156,7 @@
"StatusFailed": "Com Falha",
"StatusSuccess": "Sucesso",
"MessageFileWillBeDeleted": "Ser\u00e1 exclu\u00eddo o seguinte arquivo:",
- "MessageSureYouWishToProceed": "Tem certeza de que deseja prosseguir?",
+ "MessageSureYouWishToProceed": "Deseja realmente prosseguir?",
"MessageDuplicatesWillBeDeleted": "Adicionalmente as seguintes c\u00f3pias ser\u00e3o exclu\u00eddas:",
"MessageFollowingFileWillBeMovedFrom": "Os seguintes arquivos ser\u00e3o movidos de:",
"MessageDestinationTo": "para:",
@@ -166,8 +165,8 @@
"OrganizePatternResult": "Resultado: {0}",
"HeaderRestart": "Reiniciar",
"HeaderShutdown": "Terminar",
- "MessageConfirmRestart": "Tem certeza de que deseja reiniciar o Servidor Media Browser?",
- "MessageConfirmShutdown": "Tem certeza de que deseja terminar o Servidor Media Browser?",
+ "MessageConfirmRestart": "Deseja realmente reiniciar o Servidor Media Browser?",
+ "MessageConfirmShutdown": "Deseja realmente desligar o Servidor Media Browser?",
"ButtonUpdateNow": "Atualizar Agora",
"NewVersionOfSomethingAvailable": "Est\u00e1 dispon\u00edvel uma nova vers\u00e3o de {0}!",
"VersionXIsAvailableForDownload": "A vers\u00e3o {0} est\u00e1 dispon\u00edvel para download.",
@@ -178,14 +177,14 @@
"LabelAudioCodec": "\u00c1udio: {0}",
"LabelVideoCodec": "V\u00eddeo: {0}",
"LabelRemoteAccessUrl": "Acesso Remoto: {0}",
- "LabelRunningOnPort": "Dispon\u00edvel na porta {0}.",
+ "LabelRunningOnPort": "Executando na porta {0}.",
"LabelRunningOnPorts": "Dispon\u00edvel nas portas {0} e {1}.",
- "HeaderLatestFromChannel": "\u00daltimo desde {0}",
+ "HeaderLatestFromChannel": "Mais recentes de {0}",
"ButtonDownload": "Download",
"LabelUnknownLanaguage": "Idioma desconhecido",
"HeaderCurrentSubtitles": "Legendas Atuais",
"MessageDownloadQueued": "O download foi enfileirado.",
- "MessageAreYouSureDeleteSubtitles": "Tem certeza que deseja excluir este arquivo de legendas?",
+ "MessageAreYouSureDeleteSubtitles": "Deseja realmente excluir este arquivo de legendas?",
"ButtonRemoteControl": "Controle Remoto",
"HeaderLatestTvRecordings": "\u00daltimas Grava\u00e7\u00f5es",
"ButtonOk": "Ok",
@@ -216,19 +215,103 @@
"HeaderAlbum": "\u00c1lbum",
"HeaderAlbumArtist": "Artista do \u00c1lbum",
"HeaderArtist": "Artista",
- "LabelAddedOnDate": "Added {0}",
- "ButtonStart": "Start",
+ "LabelAddedOnDate": "Adicionado {0}",
+ "ButtonStart": "Iniciar",
"HeaderChannels": "Canais",
"HeaderMediaFolders": "Pastas de M\u00eddia",
- "HeaderBlockItemsWithNoRating": "Block items with no rating information:",
- "OptionBlockOthers": "Others",
- "OptionBlockTvShows": "TV Shows",
+ "HeaderBlockItemsWithNoRating": "Bloquear itens sem informa\u00e7\u00e3o de classifica\u00e7\u00e3o:",
+ "OptionBlockOthers": "Outros",
+ "OptionBlockTvShows": "S\u00e9ries",
"OptionBlockTrailers": "Trailers",
- "OptionBlockMusic": "Music",
- "OptionBlockMovies": "Movies",
- "OptionBlockBooks": "Books",
- "OptionBlockGames": "Games",
- "OptionBlockLiveTvPrograms": "Live TV Programs",
- "OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockMusic": "M\u00fasica",
+ "OptionBlockMovies": "Filmes",
+ "OptionBlockBooks": "Livros",
+ "OptionBlockGames": "Jogos",
+ "OptionBlockLiveTvPrograms": "Programas de TV ao vivo",
+ "OptionBlockLiveTvChannels": "Canais de TV ao vivo",
+ "OptionBlockChannelContent": "Conte\u00fado do Canal de Internet",
+ "ButtonRevoke": "Revogar",
+ "MessageConfirmRevokeApiKey": "Deseja realmente revogar esta chave da api? A conex\u00e3o da aplica\u00e7\u00e3o com o Media Browser ser\u00e1 abruptamente encerrada.",
+ "HeaderConfirmRevokeApiKey": "Revogar Chave da Api",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Codec de \u00c1udio: {0}",
+ "ValueVideoCodec": "Codec de V\u00eddeo: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Condi\u00e7\u00f5es: {0}",
+ "LabelAll": "Todos",
+ "HeaderDeleteImage": "Apagar Imagem",
+ "MessageFileNotFound": "Arquivo n\u00e3o encontrado.",
+ "MessageFileReadError": "Ocorreu um erro ao ler este arquivo.",
+ "ButtonNextPage": "Pr\u00f3xima P\u00e1gina",
+ "ButtonPreviousPage": "P\u00e1gina Anterior",
+ "ButtonMoveLeft": "Mover \u00e0 esquerda",
+ "ButtonMoveRight": "Mover \u00e0 direita",
+ "ButtonBrowseOnlineImages": "Procurar imagens online",
+ "HeaderDeleteItem": "Apagar item",
+ "ConfirmDeleteItem": "Deseja realmente apagar este item de sua biblioteca?",
+ "MessagePleaseEnterNameOrId": "Por favor, digite um nome ou Id externo.",
+ "MessageValueNotCorrect": "O valor digitado n\u00e3o est\u00e1 correto. Por favor, tente novamente.",
+ "MessageItemSaved": "Item salvo.",
+ "OptionEnded": "Finalizada",
+ "OptionContinuing": "Em Exibi\u00e7\u00e3o",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Campos",
+ "HeaderFieldsHelp": "Deslize um campo para 'off' para bloquear e evitar que seus dados sejam alterados.",
+ "HeaderLiveTV": "TV ao Vivo",
+ "MissingLocalTrailer": "Faltando trailer local.",
+ "MissingPrimaryImage": "Faltando imagem principal.",
+ "MissingBackdropImage": "Faltando imagem de fundo.",
+ "MissingLogoImage": "Faltando imagem do logo.",
+ "MissingEpisode": "Faltando epis\u00f3dio.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Imagens de Fundo",
+ "OptionImages": "Imagens",
+ "OptionKeywords": "Palavras-chave",
+ "OptionTags": "Tags",
+ "OptionStudios": "Est\u00fadios",
+ "OptionName": "Nome",
+ "OptionOverview": "Descri\u00e7\u00e3o",
+ "OptionGenres": "G\u00eaneros",
+ "OptionParentalRating": "Classifica\u00e7\u00e3o Parental",
+ "OptionPeople": "Pessoas",
+ "OptionRuntime": "Dura\u00e7\u00e3o",
+ "OptionProductionLocations": "Locais de Produ\u00e7\u00e3o",
+ "OptionBirthLocation": "Local de Nascimento",
+ "LabelAllChannels": "Todos os canais",
+ "LabelLiveProgram": "AO VIVO",
+ "LabelNewProgram": "NOVO",
+ "LabelPremiereProgram": "ESTR\u00c9IA",
+ "HeaderChangeFolderType": "Alterar Tipo de Pasta",
+ "HeaderChangeFolderTypeHelp": "Para alterar o tipo de pasta, por favor remova e reconstrua a cole\u00e7\u00e3o com o novo tipo.",
+ "HeaderAlert": "Alerta",
+ "MessagePleaseRestart": "Por favor, reinicie para finalizar a atualiza\u00e7\u00e3o.",
+ "ButtonRestart": "Reiniciar",
+ "MessagePleaseRefreshPage": "Por favor, atualize esta p\u00e1gina para receber novas atualiza\u00e7\u00f5es do servidor.",
+ "ButtonHide": "Ocultar",
+ "MessageSettingsSaved": "Ajustes salvos.",
+ "ButtonSignOut": "Sair",
+ "ButtonMyProfile": "Meu Perfil",
+ "ButtonMyPreferences": "Minhas Prefer\u00eancias",
+ "MessageBrowserDoesNotSupportWebSockets": "Este navegador n\u00e3o suporta web sockets. Para uma melhor experi\u00eancia, tente um navegador mais atual como o Chrome, Firefox, IE10+, Safari (iOS) ou Opera.",
+ "LabelInstallingPackage": "Instalando {0}",
+ "LabelPackageInstallCompleted": "Instala\u00e7\u00e3o de {0} completa.",
+ "LabelPackageInstallFailed": "Instala\u00e7\u00e3o de {0} falhou.",
+ "LabelPackageInstallCancelled": "Instala\u00e7\u00e3o de {0} cancelada.",
+ "TabServer": "Servidor",
+ "TabUsers": "Usu\u00e1rios",
+ "TabLibrary": "Biblioteca",
+ "TabMetadata": "Metadados",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "TV ao Vivo",
+ "TabAutoOrganize": "Auto-Organizar",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avan\u00e7ado",
+ "TabHelp": "Ajuda",
+ "TabScheduledTasks": "Tarefas Agendadas",
+ "ButtonFullscreen": "Tela Cheia",
+ "ButtonAudioTracks": "Faixas de \u00c1udio",
+ "ButtonSubtitles": "Legendas",
+ "ButtonScenes": "Cenas",
+ "ButtonQuality": "Qualidade"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json
index 9ca378a91..c7f7c0f69 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Parar",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
+ "ButtonStop": "Parar",
"ButtonNextTrack": "Pr\u00f3xima Faixa",
"ButtonPause": "Pausar",
"ButtonPlay": "Reproduzir",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Terminado",
+ "OptionContinuing": "A Continuar",
+ "OptionOff": "Desligado",
+ "OptionOn": "Ligado",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Classifica\u00e7\u00e3o Parental",
+ "OptionPeople": "People",
+ "OptionRuntime": "Dura\u00e7\u00e3o",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Reiniciar",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Servidor",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadados",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avan\u00e7ado",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Legendas",
+ "ButtonScenes": "Cenas",
+ "ButtonQuality": "Quality"
} \ 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 20eede541..a7d6690f0 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
@@ -38,7 +38,6 @@
"LabelEpisode": "\u042d\u043f\u0438\u0437\u043e\u0434",
"LabelSeries": "\u0421\u0435\u0440\u0438\u0430\u043b",
"LabelStopping": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e",
- "ButtonStop": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
"LabelCancelled": "(\u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e)",
"LabelFailed": "(\u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e)",
"LabelAbortedByServerShutdown": "(\u041f\u0440\u0435\u0440\u0432\u0430\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "\u041d\u0435\u043e\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a",
"ButtonMute": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0432\u0443\u043a",
"ButtonUnmute": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0432\u0443\u043a",
+ "ButtonStop": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
"ButtonNextTrack": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0434\u043e\u0440\u043e\u0436\u043a\u0430",
"ButtonPause": "\u041f\u0430\u0443\u0437\u0430",
"ButtonPlay": "\u0412\u043e\u0441\u043f\u0440",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "\u0421\u0431\u0440\u043e\u0441 \u0442\u044e\u043d\u0435\u0440\u0430",
"MessageConfirmResetTuner": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u044e\u043d\u0435\u0440? \u041b\u044e\u0431\u044b\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043b\u0435\u0439\u0435\u0440\u044b \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b.",
"ButtonCancelSeries": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u044e",
- "LabelAllChannels": "\u0412\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b",
"HeaderSeriesRecordings": "\u0417\u0430\u043f\u0438\u0441\u0438 \u0441\u0435\u0440\u0438\u0439",
"LabelAnytime": "\u041b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f",
"StatusRecording": "\u0417\u0430\u043f\u0438\u0441\u044c",
@@ -168,7 +167,7 @@
"HeaderShutdown": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b",
"MessageConfirmRestart": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Media Browser Server?",
"MessageConfirmShutdown": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 Media Browser Server?",
- "ButtonUpdateNow": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441",
+ "ButtonUpdateNow": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e",
"NewVersionOfSomethingAvailable": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f {0}!",
"VersionXIsAvailableForDownload": "\u0412\u0435\u0440\u0441\u0438\u044f {0} \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.",
"LabelVersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}",
@@ -177,7 +176,7 @@
"LabelPlayMethodDirectPlay": "\u041f\u0440\u044f\u043c\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435",
"LabelAudioCodec": "\u0410\u0443\u0434\u0438\u043e: {0}",
"LabelVideoCodec": "\u0412\u0438\u0434\u0435\u043e: {0}",
- "LabelRemoteAccessUrl": "\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: {0}",
+ "LabelRemoteAccessUrl": "\u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430: {0}",
"LabelRunningOnPort": "\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {0}.",
"LabelRunningOnPorts": "\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u0445 {0} \u0438 {1}.",
"HeaderLatestFromChannel": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u0438\u0437 {0}",
@@ -210,7 +209,7 @@
"ButtonHome": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f",
"ButtonDashboard": "\u041f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430",
"ButtonReports": "\u041e\u0442\u0447\u0451\u0442\u044b",
- "ButtonMetadataManager": "\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445",
+ "ButtonMetadataManager": "\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
"HeaderTime": "\u0412\u0440\u0435\u043c\u044f",
"HeaderName": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
"HeaderAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c",
@@ -230,5 +229,89 @@
"OptionBlockGames": "\u0418\u0433\u0440\u044b",
"OptionBlockLiveTvPrograms": "\u042d\u0444\u0438\u0440\u043d\u044b\u0435 \u0442\u0435\u043b\u0435\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438",
"OptionBlockLiveTvChannels": "\u042d\u0444\u0438\u0440\u043d\u044b\u0435 \u0422\u0412-\u043a\u0430\u043d\u0430\u043b\u044b",
- "OptionBlockChannelContent": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432"
+ "OptionBlockChannelContent": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432",
+ "ButtonRevoke": "\u041e\u0442\u043e\u0437\u0432\u0430\u0442\u044c",
+ "MessageConfirmRevokeApiKey": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API? \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u043a\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u043e.",
+ "HeaderConfirmRevokeApiKey": "\u041e\u0442\u0437\u044b\u0432 \u043a\u043b\u044e\u0447\u0430 API",
+ "ValueContainer": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440: {0}",
+ "ValueAudioCodec": "\u0410\u0443\u0434\u0438\u043e \u043a\u043e\u0434\u0435\u043a: {0}",
+ "ValueVideoCodec": "\u0412\u0438\u0434\u0435\u043e \u043a\u043e\u0434\u0435\u043a: {0}",
+ "ValueCodec": "\u041a\u043e\u0434\u0435\u043a: {0}",
+ "ValueConditions": "\u0423\u0441\u043b\u043e\u0432\u0438\u044f: {0}",
+ "LabelAll": "\u0412\u0441\u0435",
+ "HeaderDeleteImage": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0430",
+ "MessageFileNotFound": "\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.",
+ "MessageFileReadError": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.",
+ "ButtonNextPage": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",
+ "ButtonPreviousPage": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",
+ "ButtonMoveLeft": "\u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043b\u0435\u0432\u043e",
+ "ButtonMoveRight": "\u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e",
+ "ButtonBrowseOnlineImages": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d \u0440\u0438\u0441\u0443\u043d\u043a\u0438",
+ "HeaderDeleteItem": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
+ "ConfirmDeleteItem": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438?",
+ "MessagePleaseEnterNameOrId": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 ID.",
+ "MessageValueNotCorrect": "\u0412\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.",
+ "MessageItemSaved": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d.",
+ "OptionEnded": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e",
+ "OptionContinuing": "\u041f\u0440\u043e\u0434\u043b\u0435\u043d\u043e",
+ "OptionOff": "\u0412\u044b\u043a\u043b",
+ "OptionOn": "\u0412\u043a\u043b",
+ "HeaderFields": "\u041f\u043e\u043b\u044f",
+ "HeaderFieldsHelp": "\u041f\u0435\u0440\u0435\u0434\u0432\u0438\u043d\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u043d\u0430 \"\u0412\u042b\u041a\u041b\", \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445.",
+ "HeaderLiveTV": "\u0422\u0412 \u044d\u0444\u0438\u0440",
+ "MissingLocalTrailer": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0435\u0439\u043b\u0435\u0440.",
+ "MissingPrimaryImage": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a.",
+ "MissingBackdropImage": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0437\u0430\u0434\u043d\u0438\u043a\u0430.",
+ "MissingLogoImage": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u0430.",
+ "MissingEpisode": "\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u044d\u043f\u0438\u0437\u043e\u0434.",
+ "OptionScreenshots": "\u0421\u043d\u0438\u043c\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430",
+ "OptionBackdrops": "\u0417\u0430\u0434\u043d\u0438\u043a\u0438",
+ "OptionImages": "\u0420\u0438\u0441\u0443\u043d\u043a\u0438",
+ "OptionKeywords": "\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430",
+ "OptionTags": "\u0422\u0435\u0433\u0438",
+ "OptionStudios": "\u0421\u0442\u0443\u0434\u0438\u0438",
+ "OptionName": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
+ "OptionOverview": "\u041e\u0431\u043e\u0437\u0440\u0435\u043d\u0438\u0435",
+ "OptionGenres": "\u0416\u0430\u043d\u0440\u044b",
+ "OptionParentalRating": "\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f",
+ "OptionPeople": "\u041b\u044e\u0434\u0438",
+ "OptionRuntime": "\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c",
+ "OptionProductionLocations": "\u041c\u0435\u0441\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430",
+ "OptionBirthLocation": "\u041c\u0435\u0441\u0442\u043e \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f",
+ "LabelAllChannels": "\u0412\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b",
+ "LabelLiveProgram": "\u041f\u0420\u042f\u041c\u041e\u0419 \u042d\u0424\u0418\u0420",
+ "LabelNewProgram": "\u041d\u041e\u0412\u041e\u0415",
+ "LabelPremiereProgram": "\u041f\u0420\u0415\u041c\u042c\u0415\u0420\u0410",
+ "HeaderChangeFolderType": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u043f\u0430\u043f\u043a\u0438",
+ "HeaderChangeFolderTypeHelp": "\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u043f\u0430\u043f\u043a\u0438, \u0443\u0434\u0430\u043b\u0438\u0442\u0435 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0441 \u043d\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u043e\u043c.",
+ "HeaderAlert": "\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435",
+ "MessagePleaseRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435.",
+ "ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c",
+ "MessagePleaseRefreshPage": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
+ "ButtonHide": "\u0421\u043a\u0440\u044b\u0442\u044c",
+ "MessageSettingsSaved": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u044b\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430.",
+ "ButtonSignOut": "\u0412\u044b\u0439\u0442\u0438",
+ "ButtonMyProfile": "\u041c\u043e\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c",
+ "ButtonMyPreferences": "\u041c\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
+ "MessageBrowserDoesNotSupportWebSockets": "\u0414\u0430\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0431-\u0441\u043e\u043a\u0435\u0442\u044b. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0441 \u043d\u043e\u0432\u044b\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Chrome, Firefox, IE10+, Safari (iOS) \u0438\u043b\u0438 Opera.",
+ "LabelInstallingPackage": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f {0}",
+ "LabelPackageInstallCompleted": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.",
+ "LabelPackageInstallFailed": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {0} \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430.",
+ "LabelPackageInstallCancelled": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {0} \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430.",
+ "TabServer": "\u0421\u0435\u0440\u0432\u0435\u0440",
+ "TabUsers": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
+ "TabLibrary": "\u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430",
+ "TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435",
+ "TabDLNA": "DLNA-\u0440\u0435\u0436\u0438\u043c",
+ "TabLiveTV": "\u0422\u0412 \u044d\u0444\u0438\u0440",
+ "TabAutoOrganize": "\u0410\u0432\u0442\u043e\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
+ "TabPlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b",
+ "TabAdvanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435",
+ "TabHelp": "\u0421\u043f\u0440\u0430\u0432\u043a\u0430",
+ "TabScheduledTasks": "\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a",
+ "ButtonFullscreen": "\u041f\u043e\u043b\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d",
+ "ButtonAudioTracks": "\u0410\u0443\u0434\u0438\u043e \u0434\u043e\u0440\u043e\u0436\u043a\u0438",
+ "ButtonSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b",
+ "ButtonScenes": "\u0421\u0446\u0435\u043d\u044b",
+ "ButtonQuality": "\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e"
} \ 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 153160c4a..a0ee4fdaf 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Avsnitt",
"LabelSeries": "Serie",
"LabelStopping": "Avbryter",
- "ButtonStop": "Stopp",
"LabelCancelled": "(avbr\u00f6ts)",
"LabelFailed": "(misslyckades)",
"LabelAbortedByServerShutdown": "(avbr\u00f6ts eftersom servern st\u00e4ngdes av)",
@@ -58,6 +57,7 @@
"LabelUnknownLanguage": "Ok\u00e4nt spr\u00e5k",
"ButtonMute": "Tyst",
"ButtonUnmute": "Muting av",
+ "ButtonStop": "Stopp",
"ButtonNextTrack": "N\u00e4sta sp\u00e5r",
"ButtonPause": "Paus",
"ButtonPlay": "Spela upp",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "\u00c5terst\u00e4ll mottagare",
"MessageConfirmResetTuner": "Vill du verkligen \u00e5terst\u00e4lla den h\u00e4r mottagaren? Alla aktiva uppspelare och inspelningar kommer att avbrytas utan f\u00f6rvarning.",
"ButtonCancelSeries": "Avbryt serieinspelning",
- "LabelAllChannels": "Alla kanaler",
"HeaderSeriesRecordings": "Serieinspelningar",
"LabelAnytime": "N\u00e4r som helst",
"StatusRecording": "Inspelning p\u00e5g\u00e5r",
@@ -216,19 +215,103 @@
"HeaderAlbum": "Album",
"HeaderAlbumArtist": "Albumartist",
"HeaderArtist": "Artist",
- "LabelAddedOnDate": "Added {0}",
+ "LabelAddedOnDate": "{0} tillagd",
"ButtonStart": "Start",
"HeaderChannels": "Kanaler",
"HeaderMediaFolders": "Mediamappar",
- "HeaderBlockItemsWithNoRating": "Block items with no rating information:",
- "OptionBlockOthers": "Others",
- "OptionBlockTvShows": "TV Shows",
+ "HeaderBlockItemsWithNoRating": "Blockera objekt utan \u00e5ldersgr\u00e4ns:",
+ "OptionBlockOthers": "\u00d6vrigt",
+ "OptionBlockTvShows": "TV-serier",
"OptionBlockTrailers": "Trailers",
- "OptionBlockMusic": "Music",
- "OptionBlockMovies": "Movies",
- "OptionBlockBooks": "Books",
- "OptionBlockGames": "Games",
- "OptionBlockLiveTvPrograms": "Live TV Programs",
- "OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockMusic": "Musik",
+ "OptionBlockMovies": "Filmer",
+ "OptionBlockBooks": "B\u00f6cker",
+ "OptionBlockGames": "Spel",
+ "OptionBlockLiveTvPrograms": "TV-program",
+ "OptionBlockLiveTvChannels": "TV-kanaler",
+ "OptionBlockChannelContent": "Kanalinneh\u00e5ll fr\u00e5n Internet",
+ "ButtonRevoke": "\u00c5terkalla",
+ "MessageConfirmRevokeApiKey": "\u00c4r du s\u00e4ker p\u00e5 att du vill \u00e5terkalla den h\u00e4r API-nyckeln? Programmets anslutning till Media Browser kommer att avbrytas omg\u00e5ende.",
+ "HeaderConfirmRevokeApiKey": "\u00c5terkalla API-nyckel",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Avslutad",
+ "OptionContinuing": "P\u00e5g\u00e5ende",
+ "OptionOff": "Av",
+ "OptionOn": "P\u00e5",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "F\u00f6r\u00e4ldraklassning",
+ "OptionPeople": "People",
+ "OptionRuntime": "Speltid",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "Alla kanaler",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Starta om",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "Server",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Avancerat",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Undertexter",
+ "ButtonScenes": "Scener",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json
index 7405894d4..b9b21645b 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "Ended",
+ "OptionContinuing": "Continuing",
+ "OptionOff": "Off",
+ "OptionOn": "On",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPeople": "People",
+ "OptionRuntime": "Th\u1eddi gian ph\u00e1t",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "M\u00e1y ch\u1ee7",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "Metadata",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "Advanced",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json
index 1da78b98d..5408f0b91 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json
@@ -38,7 +38,6 @@
"LabelEpisode": "Episode",
"LabelSeries": "Series",
"LabelStopping": "Stopping",
- "ButtonStop": "Stop",
"LabelCancelled": "(cancelled)",
"LabelFailed": "(failed)",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
@@ -58,14 +57,15 @@
"LabelUnknownLanguage": "Unknown language",
"ButtonMute": "Mute",
"ButtonUnmute": "Unmute",
- "ButtonNextTrack": "Next Track",
+ "ButtonStop": "Stop",
+ "ButtonNextTrack": "Next track",
"ButtonPause": "Pause",
"ButtonPlay": "\u64ad\u653e",
"ButtonEdit": "\u7de8\u8f2f",
"ButtonQueue": "Queue",
"ButtonPlayTrailer": "Play trailer",
"ButtonPlaylist": "Playlist",
- "ButtonPreviousTrack": "Previous Track",
+ "ButtonPreviousTrack": "Previous track",
"LabelEnabled": "Enabled",
"LabelDisabled": "Disabled",
"ButtonMoreInformation": "More Information",
@@ -106,7 +106,6 @@
"HeaderResetTuner": "Reset Tuner",
"MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.",
"ButtonCancelSeries": "Cancel Series",
- "LabelAllChannels": "All channels",
"HeaderSeriesRecordings": "Series Recordings",
"LabelAnytime": "Any time",
"StatusRecording": "Recording",
@@ -230,5 +229,89 @@
"OptionBlockGames": "Games",
"OptionBlockLiveTvPrograms": "Live TV Programs",
"OptionBlockLiveTvChannels": "Live TV Channels",
- "OptionBlockChannelContent": "Internet Channel Content"
+ "OptionBlockChannelContent": "Internet Channel Content",
+ "ButtonRevoke": "Revoke",
+ "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Media Browser will be abruptly terminated.",
+ "HeaderConfirmRevokeApiKey": "Revoke Api Key",
+ "ValueContainer": "Container: {0}",
+ "ValueAudioCodec": "Audio Codec: {0}",
+ "ValueVideoCodec": "Video Codec: {0}",
+ "ValueCodec": "Codec: {0}",
+ "ValueConditions": "Conditions: {0}",
+ "LabelAll": "All",
+ "HeaderDeleteImage": "Delete Image",
+ "MessageFileNotFound": "File not found.",
+ "MessageFileReadError": "An error occurred reading this file.",
+ "ButtonNextPage": "Next Page",
+ "ButtonPreviousPage": "Previous Page",
+ "ButtonMoveLeft": "Move left",
+ "ButtonMoveRight": "Move right",
+ "ButtonBrowseOnlineImages": "Browse online images",
+ "HeaderDeleteItem": "Delete Item",
+ "ConfirmDeleteItem": "Are you sure you wish to delete this item from your library?",
+ "MessagePleaseEnterNameOrId": "Please enter a name or an external Id.",
+ "MessageValueNotCorrect": "The value entered is not correct. Please try again.",
+ "MessageItemSaved": "Item saved.",
+ "OptionEnded": "\u5b8c\u7d50",
+ "OptionContinuing": "\u6301\u7e8c",
+ "OptionOff": "\u95dc\u9589",
+ "OptionOn": "\u958b\u555f",
+ "HeaderFields": "Fields",
+ "HeaderFieldsHelp": "Slide a field to 'off' to lock it and prevent it's data from being changed.",
+ "HeaderLiveTV": "Live TV",
+ "MissingLocalTrailer": "Missing local trailer.",
+ "MissingPrimaryImage": "Missing primary image.",
+ "MissingBackdropImage": "Missing backdrop image.",
+ "MissingLogoImage": "Missing logo image.",
+ "MissingEpisode": "Missing episode.",
+ "OptionScreenshots": "Screenshots",
+ "OptionBackdrops": "Backdrops",
+ "OptionImages": "Images",
+ "OptionKeywords": "Keywords",
+ "OptionTags": "Tags",
+ "OptionStudios": "Studios",
+ "OptionName": "Name",
+ "OptionOverview": "Overview",
+ "OptionGenres": "Genres",
+ "OptionParentalRating": "\u5bb6\u9577\u8a55\u7d1a",
+ "OptionPeople": "People",
+ "OptionRuntime": "\u64ad\u653e\u9577\u5ea6",
+ "OptionProductionLocations": "Production Locations",
+ "OptionBirthLocation": "Birth Location",
+ "LabelAllChannels": "All channels",
+ "LabelLiveProgram": "LIVE",
+ "LabelNewProgram": "NEW",
+ "LabelPremiereProgram": "PREMIERE",
+ "HeaderChangeFolderType": "Change Folder Type",
+ "HeaderChangeFolderTypeHelp": "To change the folder type, please remove and rebuild the collection with the new type.",
+ "HeaderAlert": "Alert",
+ "MessagePleaseRestart": "Please restart to finish updating.",
+ "ButtonRestart": "Restart",
+ "MessagePleaseRefreshPage": "Please refresh this page to receive new updates from the server.",
+ "ButtonHide": "Hide",
+ "MessageSettingsSaved": "Settings saved.",
+ "ButtonSignOut": "Sign Out",
+ "ButtonMyProfile": "My Profile",
+ "ButtonMyPreferences": "My Preferences",
+ "MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
+ "LabelInstallingPackage": "Installing {0}",
+ "LabelPackageInstallCompleted": "{0} installation completed.",
+ "LabelPackageInstallFailed": "{0} installation failed.",
+ "LabelPackageInstallCancelled": "{0} installation cancelled.",
+ "TabServer": "\u4f3a\u670d\u5668",
+ "TabUsers": "Users",
+ "TabLibrary": "Library",
+ "TabMetadata": "\u5a92\u9ad4\u8cc7\u6599",
+ "TabDLNA": "DLNA",
+ "TabLiveTV": "Live TV",
+ "TabAutoOrganize": "Auto-Organize",
+ "TabPlugins": "Plugins",
+ "TabAdvanced": "\u9032\u968e",
+ "TabHelp": "Help",
+ "TabScheduledTasks": "Scheduled Tasks",
+ "ButtonFullscreen": "Fullscreen",
+ "ButtonAudioTracks": "Audio Tracks",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonScenes": "Scenes",
+ "ButtonQuality": "Quality"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ar.json b/MediaBrowser.Server.Implementations/Localization/Server/ar.json
index ecb6abd64..59438e2b5 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ca.json b/MediaBrowser.Server.Implementations/Localization/Server/ca.json
index 35f607be1..1de1534e7 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/cs.json b/MediaBrowser.Server.Implementations/Localization/Server/cs.json
index 5d25ef870..507045cbb 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json
@@ -64,7 +64,7 @@
"LabelAudioLanguagePreference": "Up\u0159ednost\u0148ovan\u00fd jazyk videa:",
"LabelSubtitleLanguagePreference": "Up\u0159ednost\u0148ovan\u00fd jazyk titulk\u016f:",
"OptionDefaultSubtitles": "Default",
- "OptionOnlyForcedSubtitles": "Only forced subtitles",
+ "OptionOnlyForcedSubtitles": "Pouze vynucen\u00e9 titulky",
"OptionAlwaysPlaySubtitles": "Always play subtitles",
"OptionNoSubtitles": "No Subtitles",
"OptionDefaultSubtitlesHelp": "Subtitles matching the language preference will be loaded when the audio is in a foreign language.",
@@ -85,7 +85,7 @@
"LibraryAccessHelp": "Vyberte slo\u017eky m\u00e9di\u00ed pro sd\u00edlen\u00ed s t\u00edmto u\u017eivatelem. Administr\u00e1to\u0159i budou moci editovat v\u0161echny slo\u017eky pomoc\u00ed metadata mana\u017eeru.",
"ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.",
"ButtonDeleteImage": "Odstranit obr\u00e1zek",
- "LabelSelectUsers": "Select users:",
+ "LabelSelectUsers": "Vyberte u\u017eivatele:",
"ButtonUpload": "Nahr\u00e1t",
"HeaderUploadNewImage": "Nahr\u00e1t nov\u00fd obr\u00e1zek",
"LabelDropImageHere": "P\u0159esu\u0148te obr\u00e1zek zde",
@@ -169,8 +169,8 @@
"Option3D": "3D",
"LabelFeatures": "Vlastnosti:",
"LabelService": "Service:",
- "LabelStatus": "Status:",
- "LabelVersion": "Version:",
+ "LabelStatus": "Stav:",
+ "LabelVersion": "Verze:",
"LabelLastResult": "Last result:",
"OptionHasSubtitles": "Titulky",
"OptionHasTrailer": "Uk\u00e1zka\/trailer",
@@ -262,7 +262,7 @@
"LabelMetadataPath": "Adres\u00e1\u0159 pro metadata:",
"LabelMetadataPathHelp": "Tato slo\u017eka obsahuje metadata a obaly film\u016f. Pokud nen\u00ed nastaveno ukl\u00e1d\u00e1n\u00ed do slo\u017eky s m\u00e9dii.",
"LabelTranscodingTempPath": "Adres\u00e1\u0159 p\u0159ek\u00f3dov\u00e1n\u00ed:",
- "LabelTranscodingTempPathHelp": "Tato slo\u017eka obsahuje soubory pot\u0159ebn\u00e9 pro p\u0159ek\u00f3dov\u00e1n\u00ed vide\u00ed.",
+ "LabelTranscodingTempPathHelp": "Tato slo\u017eka obsahuje soubory pot\u0159ebn\u00e9 pro p\u0159ek\u00f3dov\u00e1n\u00ed vide\u00ed. Zadejte vlastn\u00ed cestu, nebo ponechte pr\u00e1zdn\u00e9 pro pou\u017eit\u00ed v\u00fdchoz\u00ed datov\u00e9 slo\u017eky serveru.",
"TabBasics": "Z\u00e1klady",
"TabTV": "Tv",
"TabGames": "Hry",
@@ -284,8 +284,8 @@
"ButtonAutoScroll": "Automatick\u00e9 posouv\u00e1n\u00ed",
"LabelImageSavingConvention": "Konvence ukl\u00e1d\u00e1n\u00ed obr\u00e1zk\u016f:",
"LabelImageSavingConventionHelp": "Media Browser rozpozn\u00e1 obr\u00e1zky z v\u011bt\u0161iny velk\u00fdch medi\u00e1ln\u00edch aplikac\u00ed. Nastavte v p\u0159\u00edpad\u011b, \u017ee vyu\u017e\u00edv\u00e1te jin produkt.",
- "OptionImageSavingCompatible": "Kompatibiln\u00ed - MB3\/Plex\/XBMC",
- "OptionImageSavingStandard": "Standardn\u00ed - MB3\/MB2",
+ "OptionImageSavingCompatible": "Kompatibiln\u00ed - Media Browser\/XBMC\/Plex",
+ "OptionImageSavingStandard": "Standardn\u00ed - MB2",
"ButtonSignIn": "P\u0159ihl\u00e1sit se",
"TitleSignIn": "P\u0159ihl\u00e1sit se",
"HeaderPleaseSignIn": "Pros\u00edme, p\u0159ihlaste se",
@@ -470,7 +470,7 @@
"LabelMinResumePercentageHelp": "Tituly budou ozna\u010deny jako \"nep\u0159ehr\u00e1no\", pokud budou zastaveny p\u0159ed t\u00edmto \u010dasem.",
"LabelMaxResumePercentageHelp": "Tituly budou ozna\u010deny jako \"p\u0159ehr\u00e1no\", pokud budou zastaveny po tomto \u010dase",
"LabelMinResumeDurationHelp": "Tituly krat\u0161\u00ed, ne\u017e tento \u010das nebudou pozastaviteln\u00e9.",
- "TitleAutoOrganize": "Auto-Organize",
+ "TitleAutoOrganize": "Automatick\u00e9 uspo\u0159\u00e1dan\u00ed",
"TabActivityLog": "Z\u00e1znam \u010dinnosti",
"HeaderName": "N\u00e1zev",
"HeaderDate": "Datum",
@@ -479,9 +479,9 @@
"HeaderProgram": "Program",
"HeaderClients": "Klienti",
"LabelCompleted": "Hotovo",
- "LabelFailed": "Failed",
+ "LabelFailed": "Chyba",
"LabelSkipped": "P\u0159esko\u010deno",
- "HeaderEpisodeOrganization": "Episode Organization",
+ "HeaderEpisodeOrganization": "Organizace epizod",
"LabelSeries": "Series:",
"LabelSeasonNumber": "\u010c\u00edslo s\u00e9rie",
"LabelEpisodeNumber": "\u010c\u00edslo epizody",
@@ -527,10 +527,10 @@
"ButtonRestartNow": "Restartovat nyn\u00ed",
"ButtonRestart": "Restart",
"ButtonShutdown": "Vypnout",
- "ButtonUpdateNow": "Update Now",
- "PleaseUpdateManually": "Please shutdown the server and update manually.",
+ "ButtonUpdateNow": "Aktualizujte te\u010f",
+ "PleaseUpdateManually": "Pros\u00edm, vypn\u011bte server a aktualizujte ru\u010dne.",
"NewServerVersionAvailable": "Je dostupn\u00e1 nov\u00e1 verze programu Media Browser!",
- "ServerUpToDate": "Media Browser Server is up to date",
+ "ServerUpToDate": "Media Browser server je aktu\u00e1ln\u00ed.",
"ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.",
"LabelComponentsUpdated": "The following components have been installed or updated:",
"MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.",
@@ -552,18 +552,18 @@
"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.",
"HeaderDisplaySettings": "Display Settings",
- "TabPlayTo": "Play To",
+ "TabPlayTo": "P\u0159ehr\u00e1vat do",
"LabelEnableDlnaServer": "Enable Dlna server",
"LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Media Browser content.",
"LabelEnableBlastAliveMessages": "Blast alive messages",
"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:",
+ "LabelDefaultUser": "V\u00fdchoz\u00ed u\u017eivatel",
"LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.",
"TitleDlna": "DLNA",
"TitleChannels": "Channels",
- "HeaderServerSettings": "Server Settings",
+ "HeaderServerSettings": "Nastaven\u00ed serveru",
"LabelWeatherDisplayLocation": "Weather display location:",
"LabelWeatherDisplayLocationHelp": "US zip code \/ City, State, Country \/ City, Country",
"LabelWeatherDisplayUnit": "Weather display unit:",
@@ -590,47 +590,47 @@
"NotificationOptionNewLibraryContent": "New content added",
"NotificationOptionNewLibraryContentMultiple": "New content added (multiple)",
"SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.",
- "NotificationOptionServerRestartRequired": "Server restart required",
+ "NotificationOptionServerRestartRequired": "Je vy\u017eadov\u00e1n restart serveru",
"LabelNotificationEnabled": "Enable this notification",
"LabelMonitorUsers": "Monitor activity from:",
"LabelSendNotificationToUsers": "Send the notification to:",
"UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.",
"LabelUseNotificationServices": "Use the following services:",
- "CategoryUser": "User",
+ "CategoryUser": "U\u017eivatel:",
"CategorySystem": "System",
"CategoryApplication": "Application",
"CategoryPlugin": "Plugin",
"LabelMessageTitle": "Message title:",
"LabelAvailableTokens": "Available tokens:",
"AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.",
- "OptionAllUsers": "All users",
- "OptionAdminUsers": "Administrators",
+ "OptionAllUsers": "V\u0161ichni u\u017eivatel\u00e9",
+ "OptionAdminUsers": "Administr\u00e1to\u0159i",
"OptionCustomUsers": "Custom",
- "ButtonArrowUp": "Up",
- "ButtonArrowDown": "Down",
- "ButtonArrowLeft": "Left",
- "ButtonArrowRight": "Right",
- "ButtonBack": "Back",
+ "ButtonArrowUp": "Nahoru",
+ "ButtonArrowDown": "Dol\u016f",
+ "ButtonArrowLeft": "Vlevo",
+ "ButtonArrowRight": "Vpravo",
+ "ButtonBack": "Zp\u011bt",
"ButtonInfo": "Info",
"ButtonOsd": "On screen display",
"ButtonPageUp": "Page Up",
"ButtonPageDown": "Page Down",
"PageAbbreviation": "PG",
- "ButtonHome": "Home",
- "ButtonSettings": "Settings",
- "ButtonTakeScreenshot": "Capture Screenshot",
+ "ButtonHome": "Dom\u016f",
+ "ButtonSettings": "Nastaven\u00ed",
+ "ButtonTakeScreenshot": "Zachytit obrazovku",
"ButtonLetterUp": "Letter Up",
"ButtonLetterDown": "Letter Down",
"PageButtonAbbreviation": "PG",
"LetterButtonAbbreviation": "A",
"TabNowPlaying": "Now Playing",
- "TabNavigation": "Navigation",
+ "TabNavigation": "Navigace",
"TabControls": "Controls",
"ButtonFullscreen": "Toggle fullscreen",
- "ButtonScenes": "Scenes",
- "ButtonSubtitles": "Subtitles",
- "ButtonAudioTracks": "Audio tracks",
- "ButtonPreviousTrack": "Previous track",
+ "ButtonScenes": "Sc\u00e9ny",
+ "ButtonSubtitles": "Titulky",
+ "ButtonAudioTracks": "Audio stopy",
+ "ButtonPreviousTrack": "P\u0159edchod\u00ed stopa",
"ButtonNextTrack": "Next track",
"ButtonStop": "Stop",
"ButtonPause": "Pause",
@@ -646,11 +646,11 @@
"LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.",
"LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.",
"HeaderResponseProfile": "Response Profile",
- "LabelType": "Type:",
+ "LabelType": "Typ:",
"LabelProfileContainer": "Container:",
- "LabelProfileVideoCodecs": "Video codecs:",
- "LabelProfileAudioCodecs": "Audio codecs:",
- "LabelProfileCodecs": "Codecs:",
+ "LabelProfileVideoCodecs": "Video kodeky:",
+ "LabelProfileAudioCodecs": "Audio kodeky:",
+ "LabelProfileCodecs": "Kodeky:",
"HeaderDirectPlayProfile": "Direct Play Profile",
"HeaderTranscodingProfile": "Transcoding Profile",
"HeaderCodecProfile": "Codec Profile",
@@ -660,7 +660,7 @@
"OptionProfileVideo": "Video",
"OptionProfileAudio": "Audio",
"OptionProfileVideoAudio": "Video Audio",
- "OptionProfilePhoto": "Photo",
+ "OptionProfilePhoto": "Fotografie",
"LabelUserLibrary": "User library:",
"LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.",
"OptionPlainStorageFolders": "Display all folders as plain storage folders",
@@ -668,7 +668,7 @@
"OptionPlainVideoItems": "Display all videos as plain video items",
"OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".",
"LabelSupportedMediaTypes": "Supported Media Types:",
- "TabIdentification": "Identification",
+ "TabIdentification": "Identifikace",
"TabDirectPlay": "Direct Play",
"TabContainers": "Containers",
"TabCodecs": "Codecs",
@@ -693,8 +693,8 @@
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
"LabelFriendlyName": "Friendly name",
- "LabelManufacturer": "Manufacturer",
- "LabelManufacturerUrl": "Manufacturer url",
+ "LabelManufacturer": "V\u00fdrobce",
+ "LabelManufacturerUrl": "Web v\u00fdrobce",
"LabelModelName": "Model name",
"LabelModelNumber": "Model number",
"LabelModelDescription": "Model description",
@@ -712,9 +712,9 @@
"LabelSonyAggregationFlags": "Sony aggregation flags:",
"LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.",
"LabelTranscodingContainer": "Container:",
- "LabelTranscodingVideoCodec": "Video codec:",
- "LabelTranscodingVideoProfile": "Video profile:",
- "LabelTranscodingAudioCodec": "Audio codec:",
+ "LabelTranscodingVideoCodec": "Video kodek:",
+ "LabelTranscodingVideoProfile": "Video profil:",
+ "LabelTranscodingAudioCodec": "Audio kodek:",
"OptionEnableM2tsMode": "Enable M2ts mode",
"OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.",
"OptionEstimateContentLength": "Estimate content length when transcoding",
@@ -723,10 +723,10 @@
"HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.",
"HeaderDownloadSubtitlesFor": "Download subtitles for:",
"MessageNoChapterProviders": "Install a chapter provider plugin such as ChapterDb to enable additional chapter options.",
- "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles",
+ "LabelSkipIfGraphicalSubsPresent": "P\u0159esko\u010dit, pokud video ji\u017e obsahuje grafick\u00e9 titulky",
"LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.",
- "TabSubtitles": "Subtitles",
- "TabChapters": "Chapters",
+ "TabSubtitles": "Titulky",
+ "TabChapters": "Kapitoly",
"HeaderDownloadChaptersFor": "Download chapter names for:",
"LabelOpenSubtitlesUsername": "Open Subtitles username:",
"LabelOpenSubtitlesPassword": "Open Subtitles password:",
@@ -734,7 +734,7 @@
"LabelPlayDefaultAudioTrack": "Play default audio track regardless of language",
"LabelSubtitlePlaybackMode": "Subtitle mode:",
"LabelDownloadLanguages": "Download languages:",
- "ButtonRegister": "Register",
+ "ButtonRegister": "Registrovat",
"LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language",
"LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.",
"HeaderSendMessage": "Send Message",
@@ -744,29 +744,28 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
"ValueSeriesNameUnderscore": "Series_name",
"ValueEpisodeNamePeriod": "Episode.name",
"ValueEpisodeNameUnderscore": "Episode_name",
- "HeaderTypeText": "Enter Text",
+ "HeaderTypeText": "Vlo\u017ete text",
"LabelTypeText": "Text",
- "HeaderSearchForSubtitles": "Search for Subtitles",
+ "HeaderSearchForSubtitles": "Vyhledat titulky",
"MessageNoSubtitleSearchResultsFound": "No search results founds.",
"TabDisplay": "Display",
- "TabLanguages": "Languages",
- "TabWebClient": "Web Client",
+ "TabLanguages": "Jazyky",
+ "TabWebClient": "Web klient",
"LabelEnableThemeSongs": "Enable theme songs",
- "LabelEnableBackdrops": "Enable backdrops",
+ "LabelEnableBackdrops": "Povolit kulisy",
"LabelEnableThemeSongsHelp": "If enabled, theme songs will be played in the background while browsing the library.",
"LabelEnableBackdropsHelp": "If enabled, backdrops will be displayed in the background of some pages while browsing the library.",
- "HeaderHomePage": "Home Page",
+ "HeaderHomePage": "Hlavn\u00ed str\u00e1nka",
"HeaderSettingsForThisDevice": "Settings for This Device",
"OptionAuto": "Auto",
- "OptionYes": "Yes",
- "OptionNo": "No",
+ "OptionYes": "Ano",
+ "OptionNo": "Ne",
"LabelHomePageSection1": "Home page section one:",
"LabelHomePageSection2": "Home page section two:",
"LabelHomePageSection3": "Home page section three:",
@@ -774,7 +773,7 @@
"OptionMyViewsButtons": "My views (buttons)",
"OptionMyViews": "My views",
"OptionMyViewsSmall": "My views (small)",
- "OptionResumablemedia": "Resume",
+ "OptionResumablemedia": "Pokra\u010dovat",
"OptionLatestMedia": "Latest media",
"OptionLatestChannelMedia": "Latest channel items",
"HeaderLatestChannelItems": "Latest Channel Items",
@@ -784,14 +783,14 @@
"HeaderMetadataManager": "Metadata Manager",
"HeaderPreferences": "Preferences",
"MessageLoadingChannels": "Loading channel content...",
- "ButtonMarkRead": "Mark Read",
+ "ButtonMarkRead": "Ozna\u010dit jako p\u0159e\u010dten\u00e9",
"OptionDefaultSort": "Default",
- "OptionCommunityMostWatchedSort": "Most Watched",
+ "OptionCommunityMostWatchedSort": "Nejsledovan\u011bj\u0161\u00ed",
"TabNextUp": "Next Up",
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
"MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the New button to start creating Collections.",
"HeaderWelcomeToMediaBrowserWebClient": "Welcome to the Media Browser Web Client",
- "ButtonDismiss": "Dismiss",
+ "ButtonDismiss": "Zam\u00edtnout",
"MessageLearnHowToCustomize": "Learn how to customize this page to your own personal tastes. Click your user icon in the top right corner of the screen to view and update your preferences.",
"ButtonEditOtherUserPreferences": "Edit this user's personal preferences.",
"LabelChannelStreamQuality": "Preferred internet stream quality:",
@@ -805,19 +804,19 @@
"LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.",
"ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.",
"LabelSelectCollection": "Select collection:",
- "ViewTypeMovies": "Movies",
- "ViewTypeTvShows": "TV",
- "ViewTypeGames": "Games",
- "ViewTypeMusic": "Music",
- "ViewTypeBoxSets": "Collections",
- "ViewTypeChannels": "Channels",
- "ViewTypeLiveTV": "Live TV",
+ "ViewTypeMovies": "Filmy",
+ "ViewTypeTvShows": "Televize",
+ "ViewTypeGames": "Hry",
+ "ViewTypeMusic": "Hudba",
+ "ViewTypeBoxSets": "Kolekce",
+ "ViewTypeChannels": "Kan\u00e1ly",
+ "ViewTypeLiveTV": "\u017div\u00e1 TV",
"HeaderOtherDisplaySettings": "Display Settings",
"HeaderMyViews": "My Views",
"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.",
"OptionDisplayAdultContent": "Display adult content",
- "OptionLibraryFolders": "Media folders",
+ "OptionLibraryFolders": "Slo\u017eky m\u00e9di\u00ed",
"TitleRemoteControl": "Remote Control",
"OptionLatestTvRecordings": "Latest recordings",
"LabelProtocolInfo": "Protocol info:",
@@ -835,24 +834,45 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
- "TabServices": "Services",
- "TabLogs": "Logs",
+ "TabServices": "Slu\u017eby",
+ "TabLogs": "Z\u00e1znamy",
"HeaderServerLogFiles": "Server log files:",
"TabBranding": "Branding",
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
- "OptionList": "List",
+ "OptionList": "Seznam",
"TabDashboard": "Dashboard",
"TitleServer": "Server",
"LabelCache": "Cache:",
- "LabelLogs": "Logs:",
- "LabelMetadata": "Metadata:",
- "LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelLogs": "Z\u00e1znamy:",
+ "LabelMetadata": "Metadata",
+ "LabelImagesByName": "Obr\u00e1zky dle n\u00e1zvu:",
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "U\u017eivatel",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/da.json b/MediaBrowser.Server.Implementations/Localization/Server/da.json
index 8f7bca786..55c296948 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/da.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ 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 033829986..cfb0924d2 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/de.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json
@@ -479,10 +479,10 @@
"HeaderProgram": "Programm",
"HeaderClients": "Clients",
"LabelCompleted": "Fertiggestellt",
- "LabelFailed": "Failed",
+ "LabelFailed": "Gescheitert",
"LabelSkipped": "\u00dcbersprungen",
"HeaderEpisodeOrganization": "Episodensortierung",
- "LabelSeries": "Series:",
+ "LabelSeries": "Serien:",
"LabelSeasonNumber": "Staffelnummer",
"LabelEpisodeNumber": "Episodennummer",
"LabelEndingEpisodeNumber": "Ending episode number",
@@ -630,8 +630,8 @@
"ButtonScenes": "Szenen",
"ButtonSubtitles": "Untertitel",
"ButtonAudioTracks": "Audiospuren",
- "ButtonPreviousTrack": "Previous track",
- "ButtonNextTrack": "Next track",
+ "ButtonPreviousTrack": "Vorheriger Track",
+ "ButtonNextTrack": "N\u00e4chster Track",
"ButtonStop": "Stop",
"ButtonPause": "Pause",
"LabelGroupMoviesIntoCollections": "Gruppiere Filme in Collections",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Andere",
"LabelEpisodeName": "Episodentitel",
"LabelSeriesName": "Serientitel",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/el.json b/MediaBrowser.Server.Implementations/Localization/Server/el.json
index fb43d1877..b6c94c512 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/el.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
index 202a37682..48a5cc004 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json
index 764685deb..16700e356 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es.json b/MediaBrowser.Server.Implementations/Localization/Server/es.json
index 6800f91e8..45b3b5c78 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/es.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json
@@ -93,8 +93,8 @@
"MessageNothingHere": "Nada aqu\u00ed.",
"MessagePleaseEnsureInternetMetadata": "Por favor aseg\u00farese que la descarga de metadata de internet esta habilitada",
"TabSuggested": "Sugerencia",
- "TabLatest": "\u00daltima",
- "TabUpcoming": "Siguiente",
+ "TabLatest": "Novedades",
+ "TabUpcoming": "Pr\u00f3ximos",
"TabShows": "Programas",
"TabEpisodes": "Episodios",
"TabGenres": "G\u00e9neros",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Mostrar plugins para:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Otros",
"LabelEpisodeName": "Nombre episodio",
"LabelSeriesName": "Nombre de la serie",
"ValueSeriesNamePeriod": "Series.name",
@@ -846,5 +845,34 @@
"LabelLoginDisclaimer": "Login renuncia:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
"LabelAutomaticallyDonate": "Donar autom\u00e1ticamente esta cantidad cada mes",
- "LabelAutomaticallyDonateHelp": "Usted puede cancelar en cualquier momento desde su cuenta de PayPal."
+ "LabelAutomaticallyDonateHelp": "Usted puede cancelar en cualquier momento desde su cuenta de PayPal.",
+ "OptionList": "Lista",
+ "TabDashboard": "Panel de control",
+ "TitleServer": "Servidor",
+ "LabelCache": "Cach\u00e9:",
+ "LabelLogs": "Registros:",
+ "LabelMetadata": "Metadatos:",
+ "LabelImagesByName": "Im\u00e1genes por nombre:",
+ "LabelTranscodingTemporaryFiles": "Archivos temporales de transcodificaci\u00f3n:",
+ "HeaderLatestMusic": "\u00daltima m\u00fasica",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Keys de Api",
+ "HeaderApiKeysHelp": "Se requieren aplicaciones externas para tener una clave de API con el fin de comunicarse con Media Browser. Las claves son emitidas al iniciar una sesi\u00f3n con una cuenta de Media Browser, o mediante la introducci\u00f3n manualmente de una clave en la aplicaci\u00f3n.",
+ "HeaderApiKey": "Clave Api",
+ "HeaderApp": "App",
+ "HeaderDevice": "Dispositivo",
+ "HeaderUser": "Usuario",
+ "HeaderDateIssued": "Fecha de emisi\u00f3n",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json b/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json
index 5a631a8d6..02412b97f 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/es_ES.json
@@ -847,12 +847,26 @@
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
"LabelAutomaticallyDonate": "Donar autom\u00e1ticamente esta cantidad cada mes",
"LabelAutomaticallyDonateHelp": "Usted puede cancelar en cualquier momento desde su cuenta de PayPal.",
- "OptionList": "List",
- "TabDashboard": "Dashboard",
- "TitleServer": "Server",
- "LabelCache": "Cache:",
- "LabelLogs": "Logs:",
- "LabelMetadata": "Metadata:",
- "LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "OptionList": "Lista",
+ "TabDashboard": "Panel de control",
+ "TitleServer": "Servidor",
+ "LabelCache": "Cach\u00e9:",
+ "LabelLogs": "Registros:",
+ "LabelMetadata": "Metadatos:",
+ "LabelImagesByName": "Im\u00e1genes por nombre:",
+ "LabelTranscodingTemporaryFiles": "Archivos temporales de transcodificaci\u00f3n:",
+ "HeaderLatestMusic": "\u00daltima m\u00fasica",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Keys de Api",
+ "HeaderApiKeysHelp": "Se requieren aplicaciones externas para tener una clave de API con el fin de comunicarse con Media Browser. Las claves son emitidas al iniciar una sesi\u00f3n con una cuenta de Media Browser, o mediante la introducci\u00f3n manualmente de una clave en la aplicaci\u00f3n.",
+ "HeaderApiKey": "Clave Api",
+ "HeaderApp": "App",
+ "HeaderDevice": "Dispositivo",
+ "HeaderUser": "Usuario",
+ "HeaderDateIssued": "Fecha de emisi\u00f3n",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
index e5390cef5..733e37706 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
@@ -630,8 +630,8 @@
"ButtonScenes": "Escenas",
"ButtonSubtitles": "Subt\u00edtulos",
"ButtonAudioTracks": "Pistas de audio",
- "ButtonPreviousTrack": "Pista anterior",
- "ButtonNextTrack": "Pista siguiente",
+ "ButtonPreviousTrack": "Pista Anterior",
+ "ButtonNextTrack": "Pista Siguiente",
"ButtonStop": "Detener",
"ButtonPause": "Pausar",
"LabelGroupMoviesIntoCollections": "Agrupar pel\u00edculas en colecciones",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Desplegar complementos para:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Otros",
"LabelEpisodeName": "Nombre del episodio",
"LabelSeriesName": "Nombre de la serie",
"ValueSeriesNamePeriod": "Nombre.serie",
@@ -835,17 +834,17 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "Ver sustituci\u00f3n de rutas.",
"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.",
- "LabelDisplayCollectionsView": "Desplegar una Vista de colecciones para mostrar las colecciones de pel\u00edculas",
+ "LabelDisplayCollectionsView": "Desplegar una vista de colecciones para mostrar las colecciones de pel\u00edculas",
"LabelXbmcMetadataEnableExtraThumbs": "Copiar extrafanart en extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "Cuando se descargan im\u00e1genes \u00e9stas pueden ser almacenadas en extrafanart y extrathumbs para una m\u00e1xima compatibilidad con los skins de Xbmc.",
"TabServices": "Servicios",
- "TabLogs": "Registros",
+ "TabLogs": "Bit\u00e1coras",
"HeaderServerLogFiles": "Archivos de registro del servidor:",
"TabBranding": "Establecer Marca",
"HeaderBrandingHelp": "Personaliza la apariencia de Media Browser para ajustarla a las necesidades de tu grupo u organizaci\u00f3n.",
"LabelLoginDisclaimer": "Aviso de Inicio de Sesi\u00f3n:",
"LabelLoginDisclaimerHelp": "Esto se mostrara al final de la pagina de inicio de sesi\u00f3n.",
- "LabelAutomaticallyDonate": "Donar autom\u00e1ticamente esta cantidad cada mes",
+ "LabelAutomaticallyDonate": "Donar autom\u00e1ticamente esta cantidad cada seis meses",
"LabelAutomaticallyDonateHelp": "Puedes cancelarlo en cualquier momento por medio de tu cuenta PayPal.",
"OptionList": "Lista",
"TabDashboard": "Panel de Control",
@@ -854,5 +853,26 @@
"LabelLogs": "Bit\u00e1coras:",
"LabelMetadata": "Metadatos:",
"LabelImagesByName": "Im\u00e1genes por nombre:",
- "LabelTranscodingTemporaryFiles": "Archivos temporales de transcodificaci\u00f3n:"
+ "LabelTranscodingTemporaryFiles": "Archivos temporales de transcodificaci\u00f3n:",
+ "HeaderLatestMusic": "M\u00fasica Reciente",
+ "HeaderBranding": "Establecer Marca",
+ "HeaderApiKeys": "Llaves de API",
+ "HeaderApiKeysHelp": "Las aplicaciones externas requieren de una llave de API para comunicarse con Media Browser. Las llaves son otorgadas al iniciar sesi\u00f3n con una cuenta de Media Browser; o bien, otorgando manualmente una llave a la aplicaci\u00f3n.",
+ "HeaderApiKey": "Llave de API",
+ "HeaderApp": "App",
+ "HeaderDevice": "Dispositivo",
+ "HeaderUser": "Usuario",
+ "HeaderDateIssued": "Fecha de Emisi\u00f3n",
+ "LabelChapterName": "Cap\u00edtulo {0}",
+ "HeaderNewApiKey": "Nueva llave de API",
+ "LabelAppName": "Nombre del App",
+ "LabelAppNameExample": "Ejemplo: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Otorgar a la aplicaci\u00f3n persmiso para comunicarse con Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fr.json b/MediaBrowser.Server.Implementations/Localization/Server/fr.json
index 90a412bfc..ccfccea6a 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json
@@ -396,7 +396,7 @@
"HeaderCastCrew": "\u00c9quipe de tournage",
"HeaderAdditionalParts": "Parties Additionelles",
"ButtonSplitVersionsApart": "S\u00e9parer les versions",
- "ButtonPlayTrailer": "Trailer",
+ "ButtonPlayTrailer": "Bande-annonce",
"LabelMissing": "Manquant(s)",
"LabelOffline": "Hors ligne",
"PathSubstitutionHelp": "Les substitutions de chemins d'acc\u00e8s sont utilis\u00e9es pour faire correspondre un chemin d'acc\u00e8s du serveur \u00e0 un chemin d'acc\u00e8s accessible par les clients. En autorisant un acc\u00e8s direct aux m\u00e9dias du serveur, les clients pourront les lire directement du r\u00e9seau et \u00e9viter l'utilisation inutiles des ressources du serveur en demandant du transcodage.",
@@ -479,10 +479,10 @@
"HeaderProgram": "Programme",
"HeaderClients": "Clients",
"LabelCompleted": "Compl\u00e9t\u00e9",
- "LabelFailed": "Failed",
+ "LabelFailed": "\u00c9chec",
"LabelSkipped": "Saut\u00e9",
"HeaderEpisodeOrganization": "Organisation d'\u00e9pisodes",
- "LabelSeries": "Series:",
+ "LabelSeries": "S\u00e9ries:",
"LabelSeasonNumber": "Num\u00e9ro de saison",
"LabelEpisodeNumber": "Num\u00e9ro d'\u00e9pisode",
"LabelEndingEpisodeNumber": "Num\u00e9ro d'\u00e9pisode se terminant",
@@ -630,8 +630,8 @@
"ButtonScenes": "Sc\u00e8nes",
"ButtonSubtitles": "Sous-titres",
"ButtonAudioTracks": "Piste audio",
- "ButtonPreviousTrack": "Previous track",
- "ButtonNextTrack": "Next track",
+ "ButtonPreviousTrack": "Piste pr\u00e9c\u00e9dante",
+ "ButtonNextTrack": "Piste suivante",
"ButtonStop": "Arr\u00eat",
"ButtonPause": "Pause",
"LabelGroupMoviesIntoCollections": "Grouper les films en collections",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Afficher les plugins pour:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theatre",
- "TabOtherPlugins": "Autres",
"LabelEpisodeName": "Nom d'\u00e9pisode",
"LabelSeriesName": "Nom de s\u00e9ries",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/he.json b/MediaBrowser.Server.Implementations/Localization/Server/he.json
index 7ab9173ae..473b2523f 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/he.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json
@@ -396,7 +396,7 @@
"HeaderCastCrew": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd \u05d5\u05e6\u05d5\u05d5\u05ea",
"HeaderAdditionalParts": "\u05d7\u05dc\u05e7\u05d9\u05dd \u05e0\u05d5\u05e1\u05e4\u05d9\u05dd",
"ButtonSplitVersionsApart": "\u05e4\u05e6\u05dc \u05d2\u05e8\u05e1\u05d0\u05d5\u05ea \u05d1\u05e0\u05e4\u05e8\u05d3",
- "ButtonPlayTrailer": "Trailer",
+ "ButtonPlayTrailer": "\u05d8\u05e8\u05d9\u05d9\u05dc\u05e8\u05d9\u05dd",
"LabelMissing": "\u05d7\u05e1\u05e8",
"LabelOffline": "\u05dc\u05d0 \u05de\u05e7\u05d5\u05d5\u05df",
"PathSubstitutionHelp": "\u05e0\u05ea\u05d9\u05d1\u05d9\u05dd \u05d7\u05dc\u05d5\u05e4\u05d9\u05d9\u05dd \u05d4\u05dd \u05dc\u05e6\u05d5\u05e8\u05da \u05de\u05d9\u05e4\u05d5\u05d9 \u05e0\u05ea\u05d9\u05d1\u05d9\u05dd \u05d1\u05e9\u05e8\u05ea \u05dc\u05e0\u05ea\u05d9\u05d1\u05d9\u05dd \u05e9\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d9\u05db\u05d5\u05dc\u05d9\u05dd \u05dc\u05d2\u05e9\u05ea \u05d0\u05dc\u05d9\u05d4\u05dd. \u05e2\u05dc \u05d9\u05d3\u05d9 \u05d4\u05e8\u05e9\u05d0\u05d4 \u05dc\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d2\u05d9\u05e9\u05d4 \u05d9\u05e9\u05d9\u05e8\u05d4 \u05dc\u05de\u05d3\u05d9\u05d4 \u05d1\u05e9\u05e8\u05ea \u05d0\u05dd \u05d9\u05db\u05d5\u05dc\u05d9\u05dd \u05dc\u05e0\u05d2\u05df \u05d0\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d9\u05e9\u05d9\u05e8\u05d5\u05ea \u05e2\u05dc \u05d2\u05d1\u05d9 \u05d4\u05e8\u05e9\u05ea \u05d5\u05dc\u05d4\u05d9\u05de\u05e0\u05e2 \u05de\u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05de\u05e9\u05d0\u05d1\u05d9 \u05d4\u05e9\u05e8\u05ea \u05dc\u05e6\u05d5\u05e8\u05da \u05e7\u05d9\u05d3\u05d5\u05d3 \u05d5\u05e9\u05d9\u05d3\u05d5\u05e8.",
@@ -479,10 +479,10 @@
"HeaderProgram": "\u05ea\u05d5\u05db\u05e0\u05d4",
"HeaderClients": "\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd",
"LabelCompleted": "\u05d4\u05d5\u05e9\u05dc\u05dd",
- "LabelFailed": "Failed",
+ "LabelFailed": "\u05e0\u05db\u05e9\u05dc",
"LabelSkipped": "\u05d3\u05d5\u05dc\u05d2",
"HeaderEpisodeOrganization": "\u05d0\u05d9\u05e8\u05d2\u05d5\u05df \u05e4\u05e8\u05e7\u05d9\u05dd",
- "LabelSeries": "Series:",
+ "LabelSeries": "\u05e1\u05d3\u05e8\u05d4:",
"LabelSeasonNumber": "\u05de\u05e1\u05e4\u05e8 \u05e2\u05d5\u05e0\u05d4:",
"LabelEpisodeNumber": "\u05de\u05e1\u05e4\u05e8 \u05e4\u05e8\u05e7:",
"LabelEndingEpisodeNumber": "\u05de\u05e1\u05e4\u05e8 \u05e1\u05d9\u05d5\u05dd \u05e4\u05e8\u05e7:",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/it.json b/MediaBrowser.Server.Implementations/Localization/Server/it.json
index 026772da5..77d265bd4 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/it.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json
@@ -479,10 +479,10 @@
"HeaderProgram": "Programma",
"HeaderClients": "Dispositivi",
"LabelCompleted": "Completato",
- "LabelFailed": "Failed",
+ "LabelFailed": "Fallito",
"LabelSkipped": "Saltato",
"HeaderEpisodeOrganization": "Organizzazione Episodi",
- "LabelSeries": "Series:",
+ "LabelSeries": "Serie:",
"LabelSeasonNumber": "Numero Stagione:",
"LabelEpisodeNumber": "Numero Episodio:",
"LabelEndingEpisodeNumber": "Ultimo Episodio Numero:",
@@ -630,8 +630,8 @@
"ButtonScenes": "Scene",
"ButtonSubtitles": "Sottotitoli",
"ButtonAudioTracks": "Traccia Audio",
- "ButtonPreviousTrack": "Previous track",
- "ButtonNextTrack": "Next track",
+ "ButtonPreviousTrack": "Precedente",
+ "ButtonNextTrack": "Prossimo",
"ButtonStop": "Stop",
"ButtonPause": "Pausa",
"LabelGroupMoviesIntoCollections": "Raggruppa i film nelle collection",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Mostra plugin per:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Altri",
"LabelEpisodeName": "Nome episodio",
"LabelSeriesName": "Nome serie",
"ValueSeriesNamePeriod": "Nome Serie",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/kk.json b/MediaBrowser.Server.Implementations/Localization/Server/kk.json
index 8ec25aea4..caee46351 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json
@@ -30,7 +30,7 @@
"LabelEnableVideoImageExtraction": "\u0411\u0435\u0439\u043d\u0435 \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443\u0434\u044b \u049b\u043e\u0441\u0443",
"VideoImageExtractionHelp": "\u04d8\u043b\u0456 \u0434\u0435 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456 \u0436\u043e\u049b, \u0436\u04d9\u043d\u0435 \u043e\u043b\u0430\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u04af\u0448\u0456\u043d. \u0411\u04b1\u043b \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u043d\u044b\u04a3 \u0431\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443\u0456 \u04af\u0448\u0456\u043d \u049b\u043e\u0441\u044b\u043c\u0448\u0430 \u0443\u0430\u049b\u044b\u0442 \u04af\u0441\u0442\u0435\u0439\u0434\u0456, \u0431\u0456\u0440\u0430\u049b \u043d\u04d9\u0442\u0438\u0436\u0435\u0441\u0456\u043d\u0434\u0435 \u04b1\u043d\u0430\u043c\u0434\u044b\u043b\u0430\u0443 \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c \u0431\u043e\u043b\u0430\u0434\u044b.",
"LabelEnableChapterImageExtractionForMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440 \u04af\u0448\u0456\u043d \u0441\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443\u0434\u044b \u049b\u043e\u0441\u0443",
- "LabelChapterImageExtractionForMoviesHelp": "\u0421\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0441\u0430\u0445\u043d\u0430 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0433\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0441\u044b\u0437\u0431\u0430\u043b\u044b\u049b \u043c\u04d9\u0437\u0456\u0440\u043b\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043f\u0440\u043e\u0446\u0435\u0441 \u0431\u0430\u044f\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0434\u044b \u0442\u043e\u0437\u0434\u044b\u0440\u0430\u0442\u044b\u043d \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u0430\u0437 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u043a\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d. \u0411\u04b1\u043b \u0442\u04af\u043d\u0433\u0456 4:00 \u0441\u0430\u0493\u0430\u0442\u044b\u043d\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456, \u0434\u0435\u0433\u0435\u043d\u043c\u0435\u043d \u0431\u04b1\u043b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0434\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0434\u0456. \u0411\u04b1\u043b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u0430\u0440\u0431\u0430\u043b\u0430\u0441 \u0441\u0430\u0493\u0430\u0442\u0442\u0430\u0440\u044b\u043d\u0434\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
+ "LabelChapterImageExtractionForMoviesHelp": "\u0421\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0441\u0430\u0445\u043d\u0430 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0433\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0441\u044b\u0437\u0431\u0430\u043b\u044b\u049b \u043c\u04d9\u0437\u0456\u0440\u043b\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043f\u0440\u043e\u0446\u0435\u0441 \u0431\u0430\u044f\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0434\u044b \u0442\u043e\u0437\u0434\u044b\u0440\u0430\u0442\u044b\u043d \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u0430\u0437 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u043a\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d. \u0411\u04b1\u043b \u0442\u04af\u043d\u0433\u0456 4:00 \u0441\u0430\u0493\u0430\u0442\u044b\u043d\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456, \u0434\u0435\u0433\u0435\u043d\u043c\u0435\u043d \u0431\u04b1\u043b \u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0434\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0434\u0456. \u0411\u04b1\u043b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u0430\u0440\u0431\u0430\u043b\u0430\u0441 \u0441\u0430\u0493\u0430\u0442\u0442\u0430\u0440\u044b\u043d\u0434\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelEnableAutomaticPortMapping": "\u041f\u043e\u0440\u0442 \u0430\u0432\u0442\u043e\u0441\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443\u044b\u043d \u049b\u043e\u0441\u0443",
"LabelEnableAutomaticPortMappingHelp": "UPnP \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443\u0434\u044b \u0436\u0435\u04a3\u0456\u043b\u0434\u0435\u0442\u0443 \u04af\u0448\u0456\u043d \u0440\u043e\u0443\u0442\u0435\u0440\u0434\u0456 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043a\u0435\u0439\u0431\u0456\u0440 \u0440\u043e\u0443\u0442\u0435\u0440 \u04b1\u043b\u0433\u0456\u043b\u0435\u0440\u0456\u043c\u0435\u043d \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u043c\u0435\u0439\u0442\u0456\u043d\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"ButtonOk": "\u0416\u0430\u0440\u0430\u0439\u0434\u044b",
@@ -151,7 +151,7 @@
"OptionVideoBitrate": "\u0411\u0435\u0439\u043d\u0435 \u049b\u0430\u0440\u049b\u044b\u043d\u044b",
"OptionResumable": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0430\u043b\u0430\u0442\u044b\u043d",
"ScheduledTasksHelp": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u044b\u043d \u043b\u0430\u0439\u044b\u049b\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437.",
- "ScheduledTasksTitle": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440",
+ "ScheduledTasksTitle": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b",
"TabMyPlugins": "\u041c\u0435\u043d\u0456\u04a3 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u0456\u043c",
"TabCatalog": "\u041a\u0430\u0442\u0430\u043b\u043e\u0433",
"PluginsTitle": "\u041f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440",
@@ -201,7 +201,7 @@
"HeaderManagement": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a:",
"OptionMissingImdbId": "IMDb Id \u0436\u043e\u049b",
"OptionMissingTvdbId": "TheTVDB Id \u0436\u043e\u049b",
- "OptionMissingOverview": "\u0428\u043e\u043b\u0443 \u0436\u043e\u049b",
+ "OptionMissingOverview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443 \u0436\u043e\u049b",
"OptionFileMetadataYearMismatch": "\u0424\u0430\u0439\u043b\/\u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0436\u044b\u043b\u044b \u0441\u04d9\u0439\u043a\u0435\u0441 \u0435\u043c\u0435\u0441",
"TabGeneral": "\u0416\u0430\u043b\u043f\u044b",
"TitleSupport": "\u049a\u043e\u043b\u0434\u0430\u0443",
@@ -279,7 +279,7 @@
"LabelAutomaticUpdatesFanartHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 fanart.tv \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelAutomaticUpdatesTmdbHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 TheMovieDB.org \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelAutomaticUpdatesTvdbHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u0430\u04a3\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 TheTVDB.com \u0434\u0435\u0440\u0435\u049b\u043e\u0440\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u043e\u0439\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0430\u0440 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0430\u0443\u044b\u0441\u0442\u044b\u0440\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
- "ExtractChapterImagesHelp": "\u0421\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0441\u0430\u0445\u043d\u0430 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0433\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0441\u044b\u0437\u0431\u0430\u043b\u044b\u049b \u043c\u04d9\u0437\u0456\u0440\u043b\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043f\u0440\u043e\u0446\u0435\u0441 \u0431\u0430\u044f\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0434\u044b \u0442\u043e\u0437\u0434\u044b\u0440\u0430\u0442\u044b\u043d \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u0430\u0437 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u043a\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d. \u0411\u04b1\u043b \u0442\u04af\u043d\u0433\u0456 4:00 \u0441\u0430\u0493\u0430\u0442\u044b\u043d\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456, \u0434\u0435\u0433\u0435\u043d\u043c\u0435\u043d \u0431\u04b1\u043b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0434\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0434\u0456. \u0411\u04b1\u043b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u0430\u0440\u0431\u0430\u043b\u0430\u0441 \u0441\u0430\u0493\u0430\u0442\u0442\u0430\u0440\u044b\u043d\u0434\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0442\u043a\u0456\u0437\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
+ "ExtractChapterImagesHelp": "\u0421\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0448\u044b\u0493\u0430\u0440\u044b\u043f \u0430\u043b\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0441\u0430\u0445\u043d\u0430 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0433\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0441\u044b\u0437\u0431\u0430\u043b\u044b\u049b \u043c\u04d9\u0437\u0456\u0440\u043b\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u0411\u04b1\u043b \u043f\u0440\u043e\u0446\u0435\u0441 \u0431\u0430\u044f\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0434\u044b \u0442\u043e\u0437\u0434\u044b\u0440\u0430\u0442\u044b\u043d \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u0430\u0437 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u043a\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d. \u041e\u043b \u0431\u0435\u0439\u043d\u0435\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0442\u0430\u0431\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0436\u04d9\u043d\u0435 \u0442\u0430\u04a3\u0493\u044b 4:00 \u0441\u0430\u0493\u0430\u0442\u044b\u043d\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456. \u041e\u0440\u044b\u043d\u0434\u0430\u0443 \u043a\u0435\u0441\u0442\u0435\u0441\u0456 \u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443\u0448\u044b \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0434\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0434\u0456. \u0411\u04b1\u043b \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u0430\u0440\u0431\u0430\u043b\u0430\u0441 \u0441\u0430\u0493\u0430\u0442\u0442\u0430\u0440\u044b\u043d\u0434\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0442\u043a\u0456\u0437\u0443 \u04b1\u0441\u044b\u043d\u044b\u043b\u043c\u0430\u0439\u0434\u044b.",
"LabelMetadataDownloadLanguage": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:",
"ButtonAutoScroll": "\u0410\u0432\u0442\u043e\u0430\u0439\u043d\u0430\u043b\u0434\u044b\u0440\u0443",
"LabelImageSavingConvention": "\u0421\u0443\u0440\u0435\u0442 \u0441\u0430\u049b\u0442\u0430\u0443 \u043a\u0435\u043b\u0456\u0441\u0456\u043c\u0456:",
@@ -533,7 +533,7 @@
"ServerUpToDate": "Media Browser Server \u043a\u04af\u0439\u0456: \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0493\u0430\u043d",
"ErrorConnectingToMediaBrowserRepository": "\u0410\u043b\u044b\u0441\u0442\u0430\u0493\u044b Media Browser \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0456\u043d\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430 \u049b\u0430\u0442\u0435 \u0431\u043e\u043b\u0434\u044b.",
"LabelComponentsUpdated": "\u041a\u0435\u043b\u0435\u0441\u0456 \u049b\u04b1\u0440\u0430\u043c\u0434\u0430\u0441\u0442\u0430\u0440 \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b \u043d\u0435 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b:",
- "MessagePleaseRestartServerToFinishUpdating": "\u04e8\u0437\u0433\u0435\u0440\u0442\u0443\u043b\u0435\u0440 \u049b\u043e\u043b\u0434\u0430\u043d\u0443\u044b\u043d \u0430\u044f\u049b\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437",
+ "MessagePleaseRestartServerToFinishUpdating": "\u0416\u0430\u04a3\u0430\u0440\u0442\u0443\u043b\u0430\u0440\u0434\u044b\u04a3 \u049b\u043e\u043b\u0434\u0430\u043d\u0443\u044b\u043d \u0430\u044f\u049b\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437",
"LabelDownMixAudioScale": "\u041a\u0435\u043c\u0456\u0442\u0456\u043b\u0456\u043f \u043c\u0438\u043a\u0448\u0435\u0440\u043b\u0435\u043d\u0433\u0435\u043d \u0434\u044b\u0431\u044b\u0441 \u0434\u0435\u04a3\u0433\u0435\u0439\u0456\u043d \u0440\u0435\u0442\u0442\u0435\u0443:",
"LabelDownMixAudioScaleHelp": "\u041a\u0435\u0440\u0456 \u0430\u0440\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u044b\u043b\u0493\u0430\u043d\u0434\u0430 \u0434\u044b\u0431\u044b\u0441 \u04af\u043d\u0434\u0456\u043b\u0456\u0433\u0456\u043d \u043a\u04e9\u0442\u0435\u0440\u0443. \u0411\u0430\u0441\u0442\u0430\u043f\u049b\u044b \u0434\u0435\u04a3\u0433\u0435\u0439 \u043c\u04d9\u043d\u0456\u043d \u04e9\u0437\u0433\u0435\u0440\u0442\u043f\u0435\u0443 \u04af\u0448\u0456\u043d 1 \u0441\u0430\u043d\u044b\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u04a3\u044b\u0437..",
"ButtonLinkKeys": "\u041a\u0456\u043b\u0442\u0442\u0435\u0440\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0443",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "\u041f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u0434\u0456 \u043c\u044b\u043d\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "\u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440",
"LabelEpisodeName": "\u042d\u043f\u0438\u0437\u043e\u0434 \u0430\u0442\u044b",
"LabelSeriesName": "\u0421\u0435\u0440\u0438\u0430\u043b \u0430\u0442\u044b",
"ValueSeriesNamePeriod": "\u0421\u0435\u0440\u0438\u0430\u043b.\u0430\u0442\u044b",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "\u0416\u043e\u043b \u0430\u043b\u043c\u0430\u0441\u0442\u044b\u0440\u0443\u0434\u044b \u049b\u0430\u0440\u0430\u0443.",
"LabelGroupChannelsIntoViews": "\u041c\u0435\u043d\u0456\u04a3 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0456\u043c\u0434\u0435 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043a\u0435\u043b\u0435\u0441\u0456 \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443:",
"LabelGroupChannelsIntoViewsHelp": "\u0415\u0433\u0435\u0440 \u049b\u043e\u0441\u044b\u043b\u0441\u0430, \u043e\u0441\u044b \u0430\u0440\u043d\u0430\u043b\u0430\u0440 \u0431\u0430\u0441\u049b\u0430 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0441\u0430, \u043e\u043b\u0430\u0440 \u0431\u04e9\u043b\u0435\u043a \u0410\u0440\u043d\u0430\u043b\u0430\u0440 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456.",
- "LabelDisplayCollectionsView": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440 \u0436\u0438\u043d\u0430\u049b\u0442\u0430\u0440\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04af\u0448\u0456\u043d \u0416\u0438\u043d\u0430\u049b\u0442\u0430\u0440 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0456\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443",
+ "LabelDisplayCollectionsView": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440 \u0436\u0438\u043d\u0430\u049b\u0442\u0430\u0440\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04af\u0448\u0456\u043d \u0436\u0438\u043d\u0430\u049b\u0442\u0430\u0440 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0456\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443",
"LabelXbmcMetadataEnableExtraThumbs": "\u04d8\u0434\u0435\u043f\u043a\u0456 extrafanart \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d extrathumbs \u0456\u0448\u0456\u043d\u0435 \u043a\u04e9\u0448\u0456\u0440\u0443",
"LabelXbmcMetadataEnableExtraThumbsHelp": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u0433\u0435\u043d \u043a\u0435\u0437\u0434\u0435, \u043e\u043b\u0430\u0440 Xbmc \u049b\u0430\u0431\u044b\u0493\u044b\u043c\u0435\u043d \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0441\u0438\u044b\u0441\u044b\u043c\u0434\u044b\u0493\u044b \u04af\u0448\u0456\u043d extrafanart \u0436\u04d9\u043d\u0435 extrathumbs \u0435\u043a\u0435\u0443\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u043b\u0430\u0434\u044b.",
"TabServices": "\u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440",
@@ -845,14 +844,35 @@
"HeaderBrandingHelp": "\u0422\u043e\u0431\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u043d\u0435 \u04b1\u0439\u044b\u043c\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u043c\u04b1\u049b\u0442\u0430\u0436\u0434\u044b\u049b\u0442\u0430\u0440\u044b\u043d\u0430 \u04af\u0439\u043b\u0435\u0441\u0456\u043c\u0434\u0456 Media Browser \u0431\u0435\u0437\u0435\u043d\u0434\u0456\u0440\u0443\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u0443.",
"LabelLoginDisclaimer": "\u041a\u0456\u0440\u0433\u0435\u043d\u0434\u0435\u0433\u0456 \u0435\u0441\u043a\u0435\u0440\u0442\u0443:",
"LabelLoginDisclaimerHelp": "\u0411\u04b1\u043b \u043a\u0456\u0440\u0443 \u0431\u0435\u0442\u0456\u043d\u0456\u04a3 \u0442\u04e9\u043c\u0435\u043d\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456.",
- "LabelAutomaticallyDonate": "\u041e\u0441\u044b \u0441\u043e\u043c\u0430\u043d\u044b \u0430\u0439 \u0441\u0430\u0439\u044b\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0441\u044b\u0439\u043b\u0430\u0443",
+ "LabelAutomaticallyDonate": "\u041e\u0441\u044b \u0441\u043e\u043c\u0430\u043d\u044b \u04d9\u0440 \u0430\u043b\u0442\u044b \u0430\u0439 \u0441\u0430\u0439\u044b\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0441\u044b\u0439\u043b\u0430\u0443",
"LabelAutomaticallyDonateHelp": "PayPal \u0435\u0441\u0435\u043f \u0448\u043e\u0442\u044b\u04a3\u044b\u0437 \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0434\u043e\u0493\u0430\u0440\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u04a3\u0456\u0437 \u0431\u0430\u0440.",
- "OptionList": "List",
- "TabDashboard": "Dashboard",
- "TitleServer": "Server",
+ "OptionList": "\u0422\u0456\u0437\u0456\u043c",
+ "TabDashboard": "\u0411\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b",
+ "TitleServer": "\u0421\u0435\u0440\u0432\u0435\u0440",
"LabelCache": "Cache:",
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u043c\u0443\u0437\u044b\u043a\u0430",
+ "HeaderBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u04a3\u0433",
+ "HeaderApiKeys": "API \u043a\u0456\u043b\u0442\u0442\u0435\u0440\u0456",
+ "HeaderApiKeysHelp": "\u0421\u044b\u0440\u0442\u049b\u044b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440 Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443 \u04af\u0448\u0456\u043d API \u043a\u0456\u043b\u0442\u0456 \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456. \u041a\u0456\u043b\u0442\u0442\u0435\u0440 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0435 \u043a\u0456\u0440\u0433\u0435\u043d\u0434\u0435, \u043d\u0435\u043c\u0435\u0441\u0435 \u043a\u0456\u043b\u0442\u0442\u0456 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0493\u0430 \u049b\u043e\u043b\u043c\u0435\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0456\u043b\u0433\u0435\u043d\u0434\u0435 \u0431\u0435\u0440\u0456\u043b\u0435\u0434\u0456.",
+ "HeaderApiKey": "API \u043a\u0456\u043b\u0442\u0456",
+ "HeaderApp": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430",
+ "HeaderDevice": "\u0416\u0430\u0431\u0434\u044b\u049b",
+ "HeaderUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b",
+ "HeaderDateIssued": "\u0411\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043a\u04af\u043d-\u0430\u0439\u044b",
+ "LabelChapterName": "{0}-\u0441\u0430\u0445\u043d\u0430",
+ "HeaderNewApiKey": "\u0416\u0430\u04a3\u0430 API \u043a\u0456\u043b\u0442\u0456",
+ "LabelAppName": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0430\u0442\u044b",
+ "LabelAppNameExample": "\u041c\u044b\u0441\u0430\u043b\u044b: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443 \u049b\u04b1\u049b\u044b\u049b\u044b\u0493\u044b \u04af\u0448\u0456\u043d \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443.",
+ "HeaderHttpHeaders": "HTTP \u04af\u0441\u0442\u0456\u04a3\u0433\u0456 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u043c\u0435\u043b\u0435\u0440\u0456",
+ "HeaderIdentificationHeader": "\u0410\u043d\u044b\u049b\u0442\u0430\u0443\u0434\u044b\u04a3 \u04af\u0441\u0442\u0456\u04a3\u0433\u0456 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u043c\u0435\u0441\u0456",
+ "LabelValue": "\u041c\u04d9\u043d\u0456:",
+ "LabelMatchType": "\u0421\u04d9\u0439\u043a\u0435\u0441 \u0442\u04af\u0440\u0456:",
+ "OptionEquals": "\u0422\u0435\u04a3",
+ "OptionRegex": "\u04b0\u0434\u0430\u0439\u044b \u04e9\u0440\u043d\u0435\u043a",
+ "OptionSubstring": "\u0406\u0448\u043a\u0456 \u0436\u043e\u043b"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ko.json b/MediaBrowser.Server.Implementations/Localization/Server/ko.json
new file mode 100644
index 000000000..18cc943e1
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ko.json
@@ -0,0 +1,878 @@
+{
+ "LabelExit": "Schweinsteiger",
+ "LabelVisitCommunity": "Visit Community",
+ "LabelGithubWiki": "Github Wiki",
+ "LabelSwagger": "Swagger",
+ "LabelStandard": "Standard",
+ "LabelViewApiDocumentation": "View Api Documentation",
+ "LabelBrowseLibrary": "Browse Library",
+ "LabelConfigureMediaBrowser": "Configure Media Browser",
+ "LabelOpenLibraryViewer": "Open Library Viewer",
+ "LabelRestartServer": "Restart Server",
+ "LabelShowLogWindow": "Show Log Window",
+ "LabelPrevious": "Previous",
+ "LabelFinish": "Finish",
+ "LabelNext": "Next",
+ "LabelYoureDone": "You're Done!",
+ "WelcomeToMediaBrowser": "Welcome to Media Browser!",
+ "TitleMediaBrowser": "Media Browser",
+ "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.",
+ "TellUsAboutYourself": "Tell us about yourself",
+ "LabelYourFirstName": "Your first name:",
+ "MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.",
+ "UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.",
+ "LabelWindowsService": "Windows Service",
+ "AWindowsServiceHasBeenInstalled": "A Windows Service has been installed.",
+ "WindowsServiceIntro1": "Media Browser Server normally runs as a desktop application with a tray icon, but if you prefer to run it as a background service, it can be started from the windows services control panel instead.",
+ "WindowsServiceIntro2": "If using the windows service, please note that it cannot be run at the same time as the tray icon, so you'll need to exit the tray in order to run the service. The service will also need to be configured with administrative privileges via the control panel. Please note that at this time the service is unable to self-update, so new versions will require manual interaction.",
+ "WizardCompleted": "That's all we need for now. Media Browser has begun collecting information about your media library. Check out some of our apps, and then click <b>Finish<\/b> to view the <b>Dashboard<\/b>.",
+ "LabelConfigureSettings": "Configure settings",
+ "LabelEnableVideoImageExtraction": "Enable video image extraction",
+ "VideoImageExtractionHelp": "For videos that don't already have images, and that we're unable to find internet images for. This will add some additional time to the initial library scan but will result in a more pleasing presentation.",
+ "LabelEnableChapterImageExtractionForMovies": "Extract chapter image extraction for Movies",
+ "LabelChapterImageExtractionForMoviesHelp": "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 as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
+ "LabelEnableAutomaticPortMapping": "Enable automatic port mapping",
+ "LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.",
+ "ButtonOk": "Ok",
+ "ButtonCancel": "Cancel",
+ "ButtonNew": "New",
+ "HeaderSetupLibrary": "Setup your media library",
+ "ButtonAddMediaFolder": "Add media folder",
+ "LabelFolderType": "Folder type:",
+ "MediaFolderHelpPluginRequired": "* Requires the use of a plugin, e.g. GameBrowser or MB Bookshelf.",
+ "ReferToMediaLibraryWiki": "Refer to the media library wiki.",
+ "LabelCountry": "Country:",
+ "LabelLanguage": "Language:",
+ "HeaderPreferredMetadataLanguage": "Preferred metadata language:",
+ "LabelSaveLocalMetadata": "Save artwork and metadata into media folders",
+ "LabelSaveLocalMetadataHelp": "Saving artwork and metadata directly into media folders will put them in a place where they can be easily edited.",
+ "LabelDownloadInternetMetadata": "Download artwork and metadata from the internet",
+ "LabelDownloadInternetMetadataHelp": "Media Browser can download information about your media to enable rich presentations.",
+ "TabPreferences": "Preferences",
+ "TabPassword": "Password",
+ "TabLibraryAccess": "Library Access",
+ "TabImage": "Image",
+ "TabProfile": "Profile",
+ "TabMetadata": "Metadata",
+ "TabImages": "Images",
+ "TabNotifications": "Notifications",
+ "TabCollectionTitles": "Titles",
+ "LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
+ "LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
+ "HeaderVideoPlaybackSettings": "Video Playback Settings",
+ "HeaderPlaybackSettings": "Playback Settings",
+ "LabelAudioLanguagePreference": "Audio language preference:",
+ "LabelSubtitleLanguagePreference": "Subtitle language preference:",
+ "OptionDefaultSubtitles": "Default",
+ "OptionOnlyForcedSubtitles": "Only forced subtitles",
+ "OptionAlwaysPlaySubtitles": "Always play subtitles",
+ "OptionNoSubtitles": "No Subtitles",
+ "OptionDefaultSubtitlesHelp": "Subtitles matching the language preference will be loaded when the audio is in a foreign language.",
+ "OptionOnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.",
+ "OptionAlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.",
+ "OptionNoSubtitlesHelp": "Subtitles will not be loaded by default.",
+ "TabProfiles": "Profiles",
+ "TabSecurity": "Security",
+ "ButtonAddUser": "Add User",
+ "ButtonSave": "Save",
+ "ButtonResetPassword": "Reset Password",
+ "LabelNewPassword": "New password:",
+ "LabelNewPasswordConfirm": "New password confirm:",
+ "HeaderCreatePassword": "Create Password",
+ "LabelCurrentPassword": "Current password:",
+ "LabelMaxParentalRating": "Maximum allowed parental rating:",
+ "MaxParentalRatingHelp": "Content with a higher rating will be hidden from this user.",
+ "LibraryAccessHelp": "Select the media folders to share with this user. Administrators will be able to edit all folders using the metadata manager.",
+ "ChannelAccessHelp": "Select the channels to share with this user. Administrators will be able to edit all channels using the metadata manager.",
+ "ButtonDeleteImage": "Delete Image",
+ "LabelSelectUsers": "Select users:",
+ "ButtonUpload": "Upload",
+ "HeaderUploadNewImage": "Upload New Image",
+ "LabelDropImageHere": "Drop Image Here",
+ "ImageUploadAspectRatioHelp": "1:1 Aspect Ratio Recommended. JPG\/PNG only.",
+ "MessageNothingHere": "Nothing here.",
+ "MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.",
+ "TabSuggested": "Suggested",
+ "TabLatest": "Latest",
+ "TabUpcoming": "Upcoming",
+ "TabShows": "Shows",
+ "TabEpisodes": "Episodes",
+ "TabGenres": "Genres",
+ "TabPeople": "People",
+ "TabNetworks": "Networks",
+ "HeaderUsers": "Users",
+ "HeaderFilters": "Filters:",
+ "ButtonFilter": "Filter",
+ "OptionFavorite": "Favorites",
+ "OptionLikes": "Likes",
+ "OptionDislikes": "Dislikes",
+ "OptionActors": "Actors",
+ "OptionGuestStars": "Guest Stars",
+ "OptionDirectors": "Directors",
+ "OptionWriters": "Writers",
+ "OptionProducers": "Producers",
+ "HeaderResume": "Resume",
+ "HeaderNextUp": "Next Up",
+ "NoNextUpItemsMessage": "None found. Start watching your shows!",
+ "HeaderLatestEpisodes": "Latest Episodes",
+ "HeaderPersonTypes": "Person Types:",
+ "TabSongs": "Songs",
+ "TabAlbums": "Albums",
+ "TabArtists": "Artists",
+ "TabAlbumArtists": "Album Artists",
+ "TabMusicVideos": "Music Videos",
+ "ButtonSort": "Sort",
+ "HeaderSortBy": "Sort By:",
+ "HeaderSortOrder": "Sort Order:",
+ "OptionPlayed": "Played",
+ "OptionUnplayed": "Unplayed",
+ "OptionAscending": "Ascending",
+ "OptionDescending": "Descending",
+ "OptionRuntime": "Runtime",
+ "OptionReleaseDate": "Release Date",
+ "OptionPlayCount": "Play Count",
+ "OptionDatePlayed": "Date Played",
+ "OptionDateAdded": "Date Added",
+ "OptionAlbumArtist": "Album Artist",
+ "OptionArtist": "Artist",
+ "OptionAlbum": "Album",
+ "OptionTrackName": "Track Name",
+ "OptionCommunityRating": "Community Rating",
+ "OptionNameSort": "Name",
+ "OptionFolderSort": "Folders",
+ "OptionBudget": "Budget",
+ "OptionRevenue": "Revenue",
+ "OptionPoster": "Poster",
+ "OptionBackdrop": "Backdrop",
+ "OptionTimeline": "Timeline",
+ "OptionThumb": "Thumb",
+ "OptionBanner": "Banner",
+ "OptionCriticRating": "Critic Rating",
+ "OptionVideoBitrate": "Video Bitrate",
+ "OptionResumable": "Resumable",
+ "ScheduledTasksHelp": "Click a task to adjust its schedule.",
+ "ScheduledTasksTitle": "Scheduled Tasks",
+ "TabMyPlugins": "My Plugins",
+ "TabCatalog": "Catalog",
+ "PluginsTitle": "Plugins",
+ "HeaderAutomaticUpdates": "Automatic Updates",
+ "HeaderNowPlaying": "Now Playing",
+ "HeaderLatestAlbums": "Latest Albums",
+ "HeaderLatestSongs": "Latest Songs",
+ "HeaderRecentlyPlayed": "Recently Played",
+ "HeaderFrequentlyPlayed": "Frequently Played",
+ "DevBuildWarning": "Dev builds are the bleeding edge. Released often, these build have not been tested. The application may crash and entire features may not work at all.",
+ "LabelVideoType": "Video Type:",
+ "OptionBluray": "Bluray",
+ "OptionDvd": "Dvd",
+ "OptionIso": "Iso",
+ "Option3D": "3D",
+ "LabelFeatures": "Features:",
+ "LabelService": "Service:",
+ "LabelStatus": "Status:",
+ "LabelVersion": "Version:",
+ "LabelLastResult": "Last result:",
+ "OptionHasSubtitles": "Subtitles",
+ "OptionHasTrailer": "Trailer",
+ "OptionHasThemeSong": "Theme Song",
+ "OptionHasThemeVideo": "Theme Video",
+ "TabMovies": "Movies",
+ "TabStudios": "Studios",
+ "TabTrailers": "Trailers",
+ "HeaderLatestMovies": "Latest Movies",
+ "HeaderLatestTrailers": "Latest Trailers",
+ "OptionHasSpecialFeatures": "Special Features",
+ "OptionImdbRating": "IMDb Rating",
+ "OptionParentalRating": "Parental Rating",
+ "OptionPremiereDate": "Premiere Date",
+ "TabBasic": "Basic",
+ "TabAdvanced": "Advanced",
+ "HeaderStatus": "Status",
+ "OptionContinuing": "Continuing",
+ "OptionEnded": "Ended",
+ "HeaderAirDays": "Air Days:",
+ "OptionSunday": "Sunday",
+ "OptionMonday": "Monday",
+ "OptionTuesday": "Tuesday",
+ "OptionWednesday": "Wednesday",
+ "OptionThursday": "Thursday",
+ "OptionFriday": "Friday",
+ "OptionSaturday": "Saturday",
+ "HeaderManagement": "Management:",
+ "OptionMissingImdbId": "Missing IMDb Id",
+ "OptionMissingTvdbId": "Missing TheTVDB Id",
+ "OptionMissingOverview": "Missing Overview",
+ "OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched",
+ "TabGeneral": "General",
+ "TitleSupport": "Support",
+ "TabLog": "Log",
+ "TabAbout": "About",
+ "TabSupporterKey": "Supporter Key",
+ "TabBecomeSupporter": "Become a Supporter",
+ "MediaBrowserHasCommunity": "Media Browser has a thriving community of users and contributors.",
+ "CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Media Browser.",
+ "SearchKnowledgeBase": "Search the Knowledge Base",
+ "VisitTheCommunity": "Visit the Community",
+ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site",
+ "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.",
+ "OptionHideUser": "Hide this user from login screens",
+ "OptionDisableUser": "Disable this user",
+ "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.",
+ "HeaderAdvancedControl": "Advanced Control",
+ "LabelName": "Name:",
+ "OptionAllowUserToManageServer": "Allow this user to manage the server",
+ "HeaderFeatureAccess": "Feature Access",
+ "OptionAllowMediaPlayback": "Allow media playback",
+ "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
+ "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+ "OptionAllowManageLiveTv": "Allow management of live tv recordings",
+ "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
+ "OptionMissingTmdbId": "Missing Tmdb Id",
+ "OptionIsHD": "HD",
+ "OptionIsSD": "SD",
+ "OptionMetascore": "Metascore",
+ "ButtonSelect": "Select",
+ "ButtonSearch": "Search",
+ "ButtonGroupVersions": "Group Versions",
+ "ButtonAddToCollection": "Add to Collection",
+ "PismoMessage": "Utilizing Pismo File Mount through a donated license.",
+ "TangibleSoftwareMessage": "Utilizing Tangible Solutions Java\/C# converters through a donated license.",
+ "HeaderCredits": "Credits",
+ "PleaseSupportOtherProduces": "Please support other free products we utilize:",
+ "VersionNumber": "Version {0}",
+ "TabPaths": "Paths",
+ "TabServer": "Server",
+ "TabTranscoding": "Transcoding",
+ "TitleAdvanced": "Advanced",
+ "LabelAutomaticUpdateLevel": "Automatic update level",
+ "OptionRelease": "Official Release",
+ "OptionBeta": "Beta",
+ "OptionDev": "Dev (Unstable)",
+ "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates",
+ "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods, when no users are active.",
+ "LabelEnableDebugLogging": "Enable debug logging",
+ "LabelRunServerAtStartup": "Run server at startup",
+ "LabelRunServerAtStartupHelp": "This will start the tray icon on windows startup. To start the windows service, uncheck this and run the service from the windows control panel. Please note that you cannot run both at the same time, so you will need to exit the tray icon before starting the service.",
+ "ButtonSelectDirectory": "Select Directory",
+ "LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.",
+ "LabelCachePath": "Cache path:",
+ "LabelCachePathHelp": "This folder contains server cache files, such as images.",
+ "LabelImagesByNamePath": "Images by name path:",
+ "LabelImagesByNamePathHelp": "This folder contains downloaded actor, artist, genre and studio images.",
+ "LabelMetadataPath": "Metadata path:",
+ "LabelMetadataPathHelp": "This location contains downloaded artwork and metadata that is not configured to be stored in media folders.",
+ "LabelTranscodingTempPath": "Transcoding temporary path:",
+ "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.",
+ "TabBasics": "Basics",
+ "TabTV": "TV",
+ "TabGames": "Games",
+ "TabMusic": "Music",
+ "TabOthers": "Others",
+ "HeaderExtractChapterImagesFor": "Extract chapter images for:",
+ "OptionMovies": "Movies",
+ "OptionEpisodes": "Episodes",
+ "OptionOtherVideos": "Other Videos",
+ "TitleMetadata": "Metadata",
+ "LabelAutomaticUpdatesFanart": "Enable automatic updates from FanArt.tv",
+ "LabelAutomaticUpdatesTmdb": "Enable automatic updates from TheMovieDB.org",
+ "LabelAutomaticUpdatesTvdb": "Enable automatic updates from TheTVDB.com",
+ "LabelAutomaticUpdatesFanartHelp": "If enabled, new images will be downloaded automatically as they're added to fanart.tv. Existing images will not be replaced.",
+ "LabelAutomaticUpdatesTmdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheMovieDB.org. Existing images will not be replaced.",
+ "LabelAutomaticUpdatesTvdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheTVDB.com. Existing images will not be replaced.",
+ "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.",
+ "LabelMetadataDownloadLanguage": "Preferred download language:",
+ "ButtonAutoScroll": "Auto-scroll",
+ "LabelImageSavingConvention": "Image saving convention:",
+ "LabelImageSavingConventionHelp": "Media Browser recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.",
+ "OptionImageSavingCompatible": "Compatible - Media Browser\/Xbmc\/Plex",
+ "OptionImageSavingStandard": "Standard - MB2",
+ "ButtonSignIn": "Sign In",
+ "TitleSignIn": "Sign In",
+ "HeaderPleaseSignIn": "Please sign in",
+ "LabelUser": "User:",
+ "LabelPassword": "Password:",
+ "ButtonManualLogin": "Manual Login",
+ "PasswordLocalhostMessage": "Passwords are not required when logging in from localhost.",
+ "TabGuide": "Guide",
+ "TabChannels": "Channels",
+ "TabCollections": "Collections",
+ "HeaderChannels": "Channels",
+ "TabRecordings": "Recordings",
+ "TabScheduled": "Scheduled",
+ "TabSeries": "Series",
+ "TabFavorites": "Favorites",
+ "TabMyLibrary": "My Library",
+ "ButtonCancelRecording": "Cancel Recording",
+ "HeaderPrePostPadding": "Pre\/Post Padding",
+ "LabelPrePaddingMinutes": "Pre-padding minutes:",
+ "OptionPrePaddingRequired": "Pre-padding is required in order to record.",
+ "LabelPostPaddingMinutes": "Post-padding minutes:",
+ "OptionPostPaddingRequired": "Post-padding is required in order to record.",
+ "HeaderWhatsOnTV": "What's On",
+ "HeaderUpcomingTV": "Upcoming TV",
+ "TabStatus": "Status",
+ "TabSettings": "Settings",
+ "ButtonRefreshGuideData": "Refresh Guide Data",
+ "OptionPriority": "Priority",
+ "OptionRecordOnAllChannels": "Record program on all channels",
+ "OptionRecordAnytime": "Record program at any time",
+ "OptionRecordOnlyNewEpisodes": "Record only new episodes",
+ "HeaderDays": "Days",
+ "HeaderActiveRecordings": "Active Recordings",
+ "HeaderLatestRecordings": "Latest Recordings",
+ "HeaderAllRecordings": "All Recordings",
+ "ButtonPlay": "Play",
+ "ButtonEdit": "Edit",
+ "ButtonRecord": "Record",
+ "ButtonDelete": "Delete",
+ "ButtonRemove": "Remove",
+ "OptionRecordSeries": "Record Series",
+ "HeaderDetails": "Details",
+ "TitleLiveTV": "Live TV",
+ "LabelNumberOfGuideDays": "Number of days of guide data to download:",
+ "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
+ "LabelActiveService": "Active Service:",
+ "LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.",
+ "OptionAutomatic": "Auto",
+ "LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.",
+ "LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.",
+ "LabelCustomizeOptionsPerMediaType": "Customize for media type:",
+ "OptionDownloadThumbImage": "Thumb",
+ "OptionDownloadMenuImage": "Menu",
+ "OptionDownloadLogoImage": "Logo",
+ "OptionDownloadBoxImage": "Box",
+ "OptionDownloadDiscImage": "Disc",
+ "OptionDownloadBannerImage": "Banner",
+ "OptionDownloadBackImage": "Back",
+ "OptionDownloadArtImage": "Art",
+ "OptionDownloadPrimaryImage": "Primary",
+ "HeaderFetchImages": "Fetch Images:",
+ "HeaderImageSettings": "Image Settings",
+ "TabOther": "Other",
+ "LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:",
+ "LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:",
+ "LabelMinBackdropDownloadWidth": "Minimum backdrop download width:",
+ "LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:",
+ "ButtonAddScheduledTaskTrigger": "Add Task Trigger",
+ "HeaderAddScheduledTaskTrigger": "Add Task Trigger",
+ "ButtonAdd": "Add",
+ "LabelTriggerType": "Trigger Type:",
+ "OptionDaily": "Daily",
+ "OptionWeekly": "Weekly",
+ "OptionOnInterval": "On an interval",
+ "OptionOnAppStartup": "On application startup",
+ "OptionAfterSystemEvent": "After a system event",
+ "LabelDay": "Day:",
+ "LabelTime": "Time:",
+ "LabelEvent": "Event:",
+ "OptionWakeFromSleep": "Wake from sleep",
+ "LabelEveryXMinutes": "Every:",
+ "HeaderTvTuners": "Tuners",
+ "HeaderGallery": "Gallery",
+ "HeaderLatestGames": "Latest Games",
+ "HeaderRecentlyPlayedGames": "Recently Played Games",
+ "TabGameSystems": "Game Systems",
+ "TitleMediaLibrary": "Media Library",
+ "TabFolders": "Folders",
+ "TabPathSubstitution": "Path Substitution",
+ "LabelSeasonZeroDisplayName": "Season 0 display name:",
+ "LabelEnableRealtimeMonitor": "Enable real time monitoring",
+ "LabelEnableRealtimeMonitorHelp": "Changes will be processed immediately, on supported file systems.",
+ "ButtonScanLibrary": "Scan Library",
+ "HeaderNumberOfPlayers": "Players:",
+ "OptionAnyNumberOfPlayers": "Any",
+ "Option1Player": "1+",
+ "Option2Player": "2+",
+ "Option3Player": "3+",
+ "Option4Player": "4+",
+ "HeaderMediaFolders": "Media Folders",
+ "HeaderThemeVideos": "Theme Videos",
+ "HeaderThemeSongs": "Theme Songs",
+ "HeaderScenes": "Scenes",
+ "HeaderAwardsAndReviews": "Awards and Reviews",
+ "HeaderSoundtracks": "Soundtracks",
+ "HeaderMusicVideos": "Music Videos",
+ "HeaderSpecialFeatures": "Special Features",
+ "HeaderCastCrew": "Cast & Crew",
+ "HeaderAdditionalParts": "Additional Parts",
+ "ButtonSplitVersionsApart": "Split Versions Apart",
+ "ButtonPlayTrailer": "Trailer",
+ "LabelMissing": "Missing",
+ "LabelOffline": "Offline",
+ "PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.",
+ "HeaderFrom": "From",
+ "HeaderTo": "To",
+ "LabelFrom": "From:",
+ "LabelFromHelp": "Example: D:\\Movies (on the server)",
+ "LabelTo": "To:",
+ "LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)",
+ "ButtonAddPathSubstitution": "Add Substitution",
+ "OptionSpecialEpisode": "Specials",
+ "OptionMissingEpisode": "Missing Episodes",
+ "OptionUnairedEpisode": "Unaired Episodes",
+ "OptionEpisodeSortName": "Episode Sort Name",
+ "OptionSeriesSortName": "Series Name",
+ "OptionTvdbRating": "Tvdb Rating",
+ "HeaderTranscodingQualityPreference": "Transcoding Quality Preference:",
+ "OptionAutomaticTranscodingHelp": "The server will decide quality and speed",
+ "OptionHighSpeedTranscodingHelp": "Lower quality, but faster encoding",
+ "OptionHighQualityTranscodingHelp": "Higher quality, but slower encoding",
+ "OptionMaxQualityTranscodingHelp": "Best quality with slower encoding and high CPU usage",
+ "OptionHighSpeedTranscoding": "Higher speed",
+ "OptionHighQualityTranscoding": "Higher quality",
+ "OptionMaxQualityTranscoding": "Max quality",
+ "OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging",
+ "OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.",
+ "OptionUpscaling": "Allow clients to request upscaled video",
+ "OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.",
+ "EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.",
+ "HeaderAddTitles": "Add Titles",
+ "LabelEnableDlnaPlayTo": "Enable DLNA Play To",
+ "LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.",
+ "LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
+ "LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.",
+ "LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
+ "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Media Browser.",
+ "HeaderCustomDlnaProfiles": "Custom Profiles",
+ "HeaderSystemDlnaProfiles": "System Profiles",
+ "CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.",
+ "SystemDlnaProfilesHelp": "System profiles are read-only. Changes to a system profile will be saved to a new custom profile.",
+ "TitleDashboard": "Dashboard",
+ "TabHome": "Home",
+ "TabInfo": "Info",
+ "HeaderLinks": "Links",
+ "HeaderSystemPaths": "System Paths",
+ "LinkCommunity": "Community",
+ "LinkGithub": "Github",
+ "LinkApiDocumentation": "Api Documentation",
+ "LabelFriendlyServerName": "Friendly server name:",
+ "LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.",
+ "LabelPreferredDisplayLanguage": "Preferred display language",
+ "LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
+ "LabelReadHowYouCanContribute": "Read about how you can contribute.",
+ "HeaderNewCollection": "New Collection",
+ "HeaderAddToCollection": "Add to Collection",
+ "ButtonSubmit": "Submit",
+ "NewCollectionNameExample": "Example: Star Wars Collection",
+ "OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
+ "ButtonCreate": "Create",
+ "LabelHttpServerPortNumber": "Http server port number:",
+ "LabelWebSocketPortNumber": "Web socket port number:",
+ "LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.",
+ "LabelExternalDDNS": "External DDNS:",
+ "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.",
+ "TabResume": "Resume",
+ "TabWeather": "Weather",
+ "TitleAppSettings": "App Settings",
+ "LabelMinResumePercentage": "Min resume percentage:",
+ "LabelMaxResumePercentage": "Max resume percentage:",
+ "LabelMinResumeDuration": "Min resume duration (seconds):",
+ "LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time",
+ "LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time",
+ "LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable",
+ "TitleAutoOrganize": "Auto-Organize",
+ "TabActivityLog": "Activity Log",
+ "HeaderName": "Name",
+ "HeaderDate": "Date",
+ "HeaderSource": "Source",
+ "HeaderDestination": "Destination",
+ "HeaderProgram": "Program",
+ "HeaderClients": "Clients",
+ "LabelCompleted": "Completed",
+ "LabelFailed": "Failed",
+ "LabelSkipped": "Skipped",
+ "HeaderEpisodeOrganization": "Episode Organization",
+ "LabelSeries": "Series:",
+ "LabelSeasonNumber": "Season number",
+ "LabelEpisodeNumber": "Episode number",
+ "LabelEndingEpisodeNumber": "Ending episode number",
+ "LabelEndingEpisodeNumberHelp": "Only required for multi-episode files",
+ "HeaderSupportTheTeam": "Support the Media Browser Team",
+ "LabelSupportAmount": "Amount (USD)",
+ "HeaderSupportTheTeamHelp": "Help ensure the continued development of this project by donating. A portion of all donations will be contributed to other free tools we depend on.",
+ "ButtonEnterSupporterKey": "Enter supporter key",
+ "DonationNextStep": "Once complete, please return and enter your supporter key, which you will receive by email.",
+ "AutoOrganizeHelp": "Auto-organize monitors your download folders for new files and moves them to your media directories.",
+ "AutoOrganizeTvHelp": "TV file organizing will only add episodes to existing series. It will not create new series folders.",
+ "OptionEnableEpisodeOrganization": "Enable new episode organization",
+ "LabelWatchFolder": "Watch folder:",
+ "LabelWatchFolderHelp": "The server will poll this folder during the 'Organize new media files' scheduled task.",
+ "ButtonViewScheduledTasks": "View scheduled tasks",
+ "LabelMinFileSizeForOrganize": "Minimum file size (MB):",
+ "LabelMinFileSizeForOrganizeHelp": "Files under this size will be ignored.",
+ "LabelSeasonFolderPattern": "Season folder pattern:",
+ "LabelSeasonZeroFolderName": "Season zero folder name:",
+ "HeaderEpisodeFilePattern": "Episode file pattern",
+ "LabelEpisodePattern": "Episode pattern:",
+ "LabelMultiEpisodePattern": "Multi-Episode pattern:",
+ "HeaderSupportedPatterns": "Supported Patterns",
+ "HeaderTerm": "Term",
+ "HeaderPattern": "Pattern",
+ "HeaderResult": "Result",
+ "LabelDeleteEmptyFolders": "Delete empty folders after organizing",
+ "LabelDeleteEmptyFoldersHelp": "Enable this to keep the download directory clean.",
+ "LabelDeleteLeftOverFiles": "Delete left over files with the following extensions:",
+ "LabelDeleteLeftOverFilesHelp": "Separate with ;. For example: .nfo;.txt",
+ "OptionOverwriteExistingEpisodes": "Overwrite existing episodes",
+ "LabelTransferMethod": "Transfer method",
+ "OptionCopy": "Copy",
+ "OptionMove": "Move",
+ "LabelTransferMethodHelp": "Copy or move files from the watch folder",
+ "HeaderLatestNews": "Latest News",
+ "HeaderHelpImproveMediaBrowser": "Help Improve Media Browser",
+ "HeaderRunningTasks": "Running Tasks",
+ "HeaderActiveDevices": "Active Devices",
+ "HeaderPendingInstallations": "Pending Installations",
+ "HeaerServerInformation": "Server Information",
+ "ButtonRestartNow": "Restart Now",
+ "ButtonRestart": "Restart",
+ "ButtonShutdown": "Shutdown",
+ "ButtonUpdateNow": "Update Now",
+ "PleaseUpdateManually": "Please shutdown the server and update manually.",
+ "NewServerVersionAvailable": "A new version of Media Browser Server is available!",
+ "ServerUpToDate": "Media Browser Server is up to date",
+ "ErrorConnectingToMediaBrowserRepository": "There was an error connecting to the remote Media Browser repository.",
+ "LabelComponentsUpdated": "The following components have been installed or updated:",
+ "MessagePleaseRestartServerToFinishUpdating": "Please restart the server to finish applying updates.",
+ "LabelDownMixAudioScale": "Audio boost when downmixing:",
+ "LabelDownMixAudioScaleHelp": "Boost audio when downmixing. Set to 1 to preserve original volume value.",
+ "ButtonLinkKeys": "Link Keys",
+ "LabelOldSupporterKey": "Old supporter key",
+ "LabelNewSupporterKey": "New supporter key",
+ "HeaderMultipleKeyLinking": "Multiple Key Linking",
+ "MultipleKeyLinkingHelp": "If you have more than one supporter key, use this form to link the old key's registrations with your new one.",
+ "LabelCurrentEmailAddress": "Current email address",
+ "LabelCurrentEmailAddressHelp": "The current email address to which your new key was sent.",
+ "HeaderForgotKey": "Forgot Key",
+ "LabelEmailAddress": "Email address",
+ "LabelSupporterEmailAddress": "The email address that was used to purchase the key.",
+ "ButtonRetrieveKey": "Retrieve Key",
+ "LabelSupporterKey": "Supporter Key (paste from email)",
+ "LabelSupporterKeyHelp": "Enter your supporter key to start enjoying additional benefits the community has developed for Media Browser.",
+ "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.",
+ "HeaderDisplaySettings": "Display Settings",
+ "TabPlayTo": "Play To",
+ "LabelEnableDlnaServer": "Enable Dlna server",
+ "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Media Browser content.",
+ "LabelEnableBlastAliveMessages": "Blast alive messages",
+ "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:",
+ "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.",
+ "TitleDlna": "DLNA",
+ "TitleChannels": "Channels",
+ "HeaderServerSettings": "Server Settings",
+ "LabelWeatherDisplayLocation": "Weather display location:",
+ "LabelWeatherDisplayLocationHelp": "US zip code \/ City, State, Country \/ City, Country",
+ "LabelWeatherDisplayUnit": "Weather display unit:",
+ "OptionCelsius": "Celsius",
+ "OptionFahrenheit": "Fahrenheit",
+ "HeaderRequireManualLogin": "Require manual username entry for:",
+ "HeaderRequireManualLoginHelp": "When disabled clients may present a login screen with a visual selection of users.",
+ "OptionOtherApps": "Other apps",
+ "OptionMobileApps": "Mobile apps",
+ "HeaderNotificationList": "Click on a notification to configure it's sending options.",
+ "NotificationOptionApplicationUpdateAvailable": "Application update available",
+ "NotificationOptionApplicationUpdateInstalled": "Application update installed",
+ "NotificationOptionPluginUpdateInstalled": "Plugin update installed",
+ "NotificationOptionPluginInstalled": "Plugin installed",
+ "NotificationOptionPluginUninstalled": "Plugin uninstalled",
+ "NotificationOptionVideoPlayback": "Video playback started",
+ "NotificationOptionAudioPlayback": "Audio playback started",
+ "NotificationOptionGamePlayback": "Game playback started",
+ "NotificationOptionVideoPlaybackStopped": "Video playback stopped",
+ "NotificationOptionAudioPlaybackStopped": "Audio playback stopped",
+ "NotificationOptionGamePlaybackStopped": "Game playback stopped",
+ "NotificationOptionTaskFailed": "Scheduled task failure",
+ "NotificationOptionInstallationFailed": "Installation failure",
+ "NotificationOptionNewLibraryContent": "New content added",
+ "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)",
+ "SendNotificationHelp": "By default, notifications are delivered to the dashboard inbox. Browse the plugin catalog to install additional notification options.",
+ "NotificationOptionServerRestartRequired": "Server restart required",
+ "LabelNotificationEnabled": "Enable this notification",
+ "LabelMonitorUsers": "Monitor activity from:",
+ "LabelSendNotificationToUsers": "Send the notification to:",
+ "UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.",
+ "LabelUseNotificationServices": "Use the following services:",
+ "CategoryUser": "User",
+ "CategorySystem": "System",
+ "CategoryApplication": "Application",
+ "CategoryPlugin": "Plugin",
+ "LabelMessageTitle": "Message title:",
+ "LabelAvailableTokens": "Available tokens:",
+ "AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.",
+ "OptionAllUsers": "All users",
+ "OptionAdminUsers": "Administrators",
+ "OptionCustomUsers": "Custom",
+ "ButtonArrowUp": "Up",
+ "ButtonArrowDown": "Down",
+ "ButtonArrowLeft": "Left",
+ "ButtonArrowRight": "Right",
+ "ButtonBack": "Back",
+ "ButtonInfo": "Info",
+ "ButtonOsd": "On screen display",
+ "ButtonPageUp": "Page Up",
+ "ButtonPageDown": "Page Down",
+ "PageAbbreviation": "PG",
+ "ButtonHome": "Home",
+ "ButtonSettings": "Settings",
+ "ButtonTakeScreenshot": "Capture Screenshot",
+ "ButtonLetterUp": "Letter Up",
+ "ButtonLetterDown": "Letter Down",
+ "PageButtonAbbreviation": "PG",
+ "LetterButtonAbbreviation": "A",
+ "TabNowPlaying": "Now Playing",
+ "TabNavigation": "Navigation",
+ "TabControls": "Controls",
+ "ButtonFullscreen": "Toggle fullscreen",
+ "ButtonScenes": "Scenes",
+ "ButtonSubtitles": "Subtitles",
+ "ButtonAudioTracks": "Audio tracks",
+ "ButtonPreviousTrack": "Previous track",
+ "ButtonNextTrack": "Next track",
+ "ButtonStop": "Stop",
+ "ButtonPause": "Pause",
+ "LabelGroupMoviesIntoCollections": "Group movies into collections",
+ "LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.",
+ "NotificationOptionPluginError": "Plugin failure",
+ "ButtonVolumeUp": "Volume up",
+ "ButtonVolumeDown": "Volume down",
+ "ButtonMute": "Mute",
+ "HeaderLatestMedia": "Latest Media",
+ "OptionSpecialFeatures": "Special Features",
+ "HeaderCollections": "Collections",
+ "LabelProfileCodecsHelp": "Separated by comma. This can be left empty to apply to all codecs.",
+ "LabelProfileContainersHelp": "Separated by comma. This can be left empty to apply to all containers.",
+ "HeaderResponseProfile": "Response Profile",
+ "LabelType": "Type:",
+ "LabelProfileContainer": "Container:",
+ "LabelProfileVideoCodecs": "Video codecs:",
+ "LabelProfileAudioCodecs": "Audio codecs:",
+ "LabelProfileCodecs": "Codecs:",
+ "HeaderDirectPlayProfile": "Direct Play Profile",
+ "HeaderTranscodingProfile": "Transcoding Profile",
+ "HeaderCodecProfile": "Codec Profile",
+ "HeaderCodecProfileHelp": "Codec profiles indicate the limitations of a device when playing specific codecs. If a limitation applies then the media will be transcoded, even if the codec is configured for direct play.",
+ "HeaderContainerProfile": "Container Profile",
+ "HeaderContainerProfileHelp": "Container profiles indicate the limitations of a device when playing specific formats. If a limitation applies then the media will be transcoded, even if the format is configured for direct play.",
+ "OptionProfileVideo": "Video",
+ "OptionProfileAudio": "Audio",
+ "OptionProfileVideoAudio": "Video Audio",
+ "OptionProfilePhoto": "Photo",
+ "LabelUserLibrary": "User library:",
+ "LabelUserLibraryHelp": "Select which user library to display to the device. Leave empty to inherit the default setting.",
+ "OptionPlainStorageFolders": "Display all folders as plain storage folders",
+ "OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".",
+ "OptionPlainVideoItems": "Display all videos as plain video items",
+ "OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".",
+ "LabelSupportedMediaTypes": "Supported Media Types:",
+ "TabIdentification": "Identification",
+ "TabDirectPlay": "Direct Play",
+ "TabContainers": "Containers",
+ "TabCodecs": "Codecs",
+ "TabResponses": "Responses",
+ "HeaderProfileInformation": "Profile Information",
+ "LabelEmbedAlbumArtDidl": "Embed album art in Didl",
+ "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.",
+ "LabelAlbumArtPN": "Album art PN:",
+ "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.",
+ "LabelAlbumArtMaxWidth": "Album art max width:",
+ "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.",
+ "LabelAlbumArtMaxHeight": "Album art max height:",
+ "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.",
+ "LabelIconMaxWidth": "Icon max width:",
+ "LabelIconMaxWidthHelp": "Max resolution of icons exposed via upnp:icon.",
+ "LabelIconMaxHeight": "Icon max height:",
+ "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.",
+ "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.",
+ "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
+ "LabelMaxBitrate": "Max bitrate:",
+ "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
+ "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
+ "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
+ "LabelFriendlyName": "Friendly name",
+ "LabelManufacturer": "Manufacturer",
+ "LabelManufacturerUrl": "Manufacturer url",
+ "LabelModelName": "Model name",
+ "LabelModelNumber": "Model number",
+ "LabelModelDescription": "Model description",
+ "LabelModelUrl": "Model url",
+ "LabelSerialNumber": "Serial number",
+ "LabelDeviceDescription": "Device description",
+ "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.",
+ "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.",
+ "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.",
+ "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.",
+ "LabelXDlnaCap": "X-Dlna cap:",
+ "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.",
+ "LabelXDlnaDoc": "X-Dlna doc:",
+ "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.",
+ "LabelSonyAggregationFlags": "Sony aggregation flags:",
+ "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.",
+ "LabelTranscodingContainer": "Container:",
+ "LabelTranscodingVideoCodec": "Video codec:",
+ "LabelTranscodingVideoProfile": "Video profile:",
+ "LabelTranscodingAudioCodec": "Audio codec:",
+ "OptionEnableM2tsMode": "Enable M2ts mode",
+ "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.",
+ "OptionEstimateContentLength": "Estimate content length when transcoding",
+ "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding",
+ "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.",
+ "HeaderSubtitleDownloadingHelp": "When Media Browser scans your video files it can search for missing subtitles, and download them using a subtitle provider such as OpenSubtitles.org.",
+ "HeaderDownloadSubtitlesFor": "Download subtitles for:",
+ "MessageNoChapterProviders": "Install a chapter provider plugin such as ChapterDb to enable additional chapter options.",
+ "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains graphical subtitles",
+ "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery to mobile clients.",
+ "TabSubtitles": "Subtitles",
+ "TabChapters": "Chapters",
+ "HeaderDownloadChaptersFor": "Download chapter names for:",
+ "LabelOpenSubtitlesUsername": "Open Subtitles username:",
+ "LabelOpenSubtitlesPassword": "Open Subtitles password:",
+ "HeaderChapterDownloadingHelp": "When Media Browser scans your video files it can download friendly chapter names from the internet using chapter plugins such as ChapterDb.",
+ "LabelPlayDefaultAudioTrack": "Play default audio track regardless of language",
+ "LabelSubtitlePlaybackMode": "Subtitle mode:",
+ "LabelDownloadLanguages": "Download languages:",
+ "ButtonRegister": "Register",
+ "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language",
+ "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.",
+ "HeaderSendMessage": "Send Message",
+ "ButtonSend": "Send",
+ "LabelMessageText": "Message text:",
+ "MessageNoAvailablePlugins": "No available plugins.",
+ "LabelDisplayPluginsFor": "Display plugins for:",
+ "PluginTabMediaBrowserClassic": "MB Classic",
+ "PluginTabMediaBrowserTheater": "MB Theater",
+ "LabelEpisodeName": "Episode name",
+ "LabelSeriesName": "Series name",
+ "ValueSeriesNamePeriod": "Series.name",
+ "ValueSeriesNameUnderscore": "Series_name",
+ "ValueEpisodeNamePeriod": "Episode.name",
+ "ValueEpisodeNameUnderscore": "Episode_name",
+ "HeaderTypeText": "Enter Text",
+ "LabelTypeText": "Text",
+ "HeaderSearchForSubtitles": "Search for Subtitles",
+ "MessageNoSubtitleSearchResultsFound": "No search results founds.",
+ "TabDisplay": "Display",
+ "TabLanguages": "Languages",
+ "TabWebClient": "Web Client",
+ "LabelEnableThemeSongs": "Enable theme songs",
+ "LabelEnableBackdrops": "Enable backdrops",
+ "LabelEnableThemeSongsHelp": "If enabled, theme songs will be played in the background while browsing the library.",
+ "LabelEnableBackdropsHelp": "If enabled, backdrops will be displayed in the background of some pages while browsing the library.",
+ "HeaderHomePage": "Home Page",
+ "HeaderSettingsForThisDevice": "Settings for This Device",
+ "OptionAuto": "Auto",
+ "OptionYes": "Yes",
+ "OptionNo": "No",
+ "LabelHomePageSection1": "Home page section one:",
+ "LabelHomePageSection2": "Home page section two:",
+ "LabelHomePageSection3": "Home page section three:",
+ "LabelHomePageSection4": "Home page section four:",
+ "OptionMyViewsButtons": "My views (buttons)",
+ "OptionMyViews": "My views",
+ "OptionMyViewsSmall": "My views (small)",
+ "OptionResumablemedia": "Resume",
+ "OptionLatestMedia": "Latest media",
+ "OptionLatestChannelMedia": "Latest channel items",
+ "HeaderLatestChannelItems": "Latest Channel Items",
+ "OptionNone": "None",
+ "HeaderLiveTv": "Live TV",
+ "HeaderReports": "Reports",
+ "HeaderMetadataManager": "Metadata Manager",
+ "HeaderPreferences": "Preferences",
+ "MessageLoadingChannels": "Loading channel content...",
+ "ButtonMarkRead": "Mark Read",
+ "OptionDefaultSort": "Default",
+ "OptionCommunityMostWatchedSort": "Most Watched",
+ "TabNextUp": "Next Up",
+ "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
+ "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the New button to start creating Collections.",
+ "HeaderWelcomeToMediaBrowserWebClient": "Welcome to the Media Browser Web Client",
+ "ButtonDismiss": "Dismiss",
+ "MessageLearnHowToCustomize": "Learn how to customize this page to your own personal tastes. Click your user icon in the top right corner of the screen to view and update your preferences.",
+ "ButtonEditOtherUserPreferences": "Edit this user's personal preferences.",
+ "LabelChannelStreamQuality": "Preferred internet stream quality:",
+ "LabelChannelStreamQualityHelp": "In a low bandwidth environment, limiting quality can help ensure a smooth streaming experience.",
+ "OptionBestAvailableStreamQuality": "Best available",
+ "LabelEnableChannelContentDownloadingFor": "Enable channel content downloading for:",
+ "LabelEnableChannelContentDownloadingForHelp": "Some channels support downloading content prior to viewing. Enable this in low bandwidth enviornments to download channel content during off hours. Content is downloaded as part of the channel download scheduled task.",
+ "LabelChannelDownloadPath": "Channel content download path:",
+ "LabelChannelDownloadPathHelp": "Specify a custom download path if desired. Leave empty to download to an internal program data folder.",
+ "LabelChannelDownloadAge": "Delete content after: (days)",
+ "LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.",
+ "ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.",
+ "LabelSelectCollection": "Select collection:",
+ "ViewTypeMovies": "Movies",
+ "ViewTypeTvShows": "TV",
+ "ViewTypeGames": "Games",
+ "ViewTypeMusic": "Music",
+ "ViewTypeBoxSets": "Collections",
+ "ViewTypeChannels": "Channels",
+ "ViewTypeLiveTV": "Live TV",
+ "HeaderOtherDisplaySettings": "Display Settings",
+ "HeaderMyViews": "My Views",
+ "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.",
+ "OptionDisplayAdultContent": "Display adult content",
+ "OptionLibraryFolders": "Media folders",
+ "TitleRemoteControl": "Remote Control",
+ "OptionLatestTvRecordings": "Latest recordings",
+ "LabelProtocolInfo": "Protocol info:",
+ "LabelProtocolInfoHelp": "The value that will be used when responding to GetProtocolInfo requests from the device.",
+ "TabXbmcMetadata": "Xbmc",
+ "HeaderXbmcMetadataHelp": "Media Browser includes native support for Xbmc Nfo metadata and images. To enable or disable Xbmc metadata, use the Advanced tab to configure options for your media types.",
+ "LabelXbmcMetadataUser": "Add user watch data to nfo's for:",
+ "LabelXbmcMetadataUserHelp": "Enable this to keep watch data in sync between Media Browser and Xbmc.",
+ "LabelXbmcMetadataDateFormat": "Release date format:",
+ "LabelXbmcMetadataDateFormatHelp": "All dates within nfo's will be read and written to using this format.",
+ "LabelXbmcMetadataSaveImagePaths": "Save image paths within nfo files",
+ "LabelXbmcMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Xbmc guidelines.",
+ "LabelXbmcMetadataEnablePathSubstitution": "Enable path substitution",
+ "LabelXbmcMetadataEnablePathSubstitutionHelp": "Enables path substitution of image paths using the server's path substitution settings.",
+ "LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
+ "LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
+ "LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
+ "LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
+ "LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
+ "TabServices": "Services",
+ "TabLogs": "Logs",
+ "HeaderServerLogFiles": "Server log files:",
+ "TabBranding": "Branding",
+ "HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
+ "LabelLoginDisclaimer": "Login disclaimer:",
+ "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
+ "LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
+ "OptionList": "List",
+ "TabDashboard": "Dashboard",
+ "TitleServer": "Server",
+ "LabelCache": "Cache:",
+ "LabelLogs": "Logs:",
+ "LabelMetadata": "Metadata:",
+ "LabelImagesByName": "Images by name:",
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
+} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ms.json b/MediaBrowser.Server.Implementations/Localization/Server/ms.json
index cbde8c27c..f90a35018 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nb.json b/MediaBrowser.Server.Implementations/Localization/Server/nb.json
index 1bf329cd2..94927eb12 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/nl.json b/MediaBrowser.Server.Implementations/Localization/Server/nl.json
index e7094e288..7f1545c2b 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json
@@ -630,8 +630,8 @@
"ButtonScenes": "Scenes",
"ButtonSubtitles": "Ondertitels",
"ButtonAudioTracks": "Audio tracks",
- "ButtonPreviousTrack": "Vorige track",
- "ButtonNextTrack": "Volgende track",
+ "ButtonPreviousTrack": "Vorig nummer",
+ "ButtonNextTrack": "Volgend nummer",
"ButtonStop": "Stop",
"ButtonPause": "Pauze",
"LabelGroupMoviesIntoCollections": "Groepeer films in verzamelingen",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Toon plugins voor:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Overig",
"LabelEpisodeName": "Naam aflevering",
"LabelSeriesName": "Naam serie",
"ValueSeriesNamePeriod": "Naam.Serie",
@@ -838,7 +837,7 @@
"LabelDisplayCollectionsView": "Toon Collecties in Mijn Overzichten om film collecties te tonen",
"LabelXbmcMetadataEnableExtraThumbs": "Kopieer extrafanart naar extrathunms",
"LabelXbmcMetadataEnableExtraThumbsHelp": "Als er afbeeldingen gedownload worden kunnen deze in extrafanart en extrathumbs worden opgeslagen voor maximale compatibiliteit met XBMC skins",
- "TabServices": "diensten",
+ "TabServices": "Meta Diensten",
"TabLogs": "Logboeken",
"HeaderServerLogFiles": "Server logboek bestanden:",
"TabBranding": "Huisstijl",
@@ -847,12 +846,33 @@
"LabelLoginDisclaimerHelp": "Dit wordt onderaan de login pagina weergegeven.",
"LabelAutomaticallyDonate": "Doneer dit bedrag automatisch per maand",
"LabelAutomaticallyDonateHelp": "U kunt dit via uw PayPal account op elk moment annuleren.",
- "OptionList": "List",
+ "OptionList": "Lijst",
"TabDashboard": "Dashboard",
"TitleServer": "Server",
"LabelCache": "Cache:",
- "LabelLogs": "Logs:",
- "LabelMetadata": "Metadata:",
- "LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelLogs": "Logboeken:",
+ "LabelMetadata": "Metagegevens:",
+ "LabelImagesByName": "Afbeeldingen op naam:",
+ "LabelTranscodingTemporaryFiles": "Tijdelijke transcodeer bestanden:",
+ "HeaderLatestMusic": "Nieuwste muziek",
+ "HeaderBranding": "Huisstijl",
+ "HeaderApiKeys": "Api Sleutels",
+ "HeaderApiKeysHelp": "Externe applicaties zijn verplicht om een \u200b\u200bAPI-sleutel te hebben om te communiceren met Media Browser. De sleuteloverdracht vindt plaats door in te loggen met een Media Browser account, of door het handmatig invoeren van een sleutel.",
+ "HeaderApiKey": "Api Sleutel",
+ "HeaderApp": "Applicatie",
+ "HeaderDevice": "Apparaat",
+ "HeaderUser": "Gebruiker",
+ "HeaderDateIssued": "Datum uitgegeven",
+ "LabelChapterName": "Hoofdstuk {0}",
+ "HeaderNewApiKey": "Nieuwe API-sleutel",
+ "LabelAppName": "Applicatie Naam",
+ "LabelAppNameExample": "Voorbeeld: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Verleen een applicatie toestemming om te communiceren met Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identificatie Header",
+ "LabelValue": "Waarde:",
+ "LabelMatchType": "Type overeenkomst:",
+ "OptionEquals": "Is gelijk aan",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Subtekenreeks"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pl.json b/MediaBrowser.Server.Implementations/Localization/Server/pl.json
index aad8274bf..43444b689 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
index ea1ed0400..e60c7b3c3 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
@@ -35,7 +35,7 @@
"LabelEnableAutomaticPortMappingHelp": "UPnP permite uma configura\u00e7\u00e3o automatizada do roteador para acesso remoto f\u00e1cil. Isto pode n\u00e3o funcionar em alguns modelos de roteadores.",
"ButtonOk": "Ok",
"ButtonCancel": "Cancelar",
- "ButtonNew": "Novo",
+ "ButtonNew": "Nova",
"HeaderSetupLibrary": "Configurar sua biblioteca de m\u00eddias",
"ButtonAddMediaFolder": "Adicionar pasta de m\u00eddias",
"LabelFolderType": "Tipo de pasta:",
@@ -279,7 +279,7 @@
"LabelAutomaticUpdatesFanartHelp": "Se ativado, novas imagens ser\u00e3o automaticamente transferidas ao serem adicionadas ao fanart.tv. As Imagens atuais n\u00e3o ser\u00e3o substitu\u00eddas.",
"LabelAutomaticUpdatesTmdbHelp": "Se ativado, novas imagens ser\u00e3o automaticamente transferidas ao serem adicionadas ao TheMovieDB.org. As Imagens atuais n\u00e3o ser\u00e3o substitu\u00eddas.",
"LabelAutomaticUpdatesTvdbHelp": "Se ativado, novas imagens ser\u00e3o automaticamente transferidas ao serem adicionadas ao TheTVDB.com. As Imagens atuais n\u00e3o ser\u00e3o substitu\u00eddas.",
- "ExtractChapterImagesHelp": "Extrair imagens de cap\u00edtulos permitir\u00e1 aos clientes exibir menus gr\u00e1ficos de sele\u00e7\u00e3o de cenas. O processo pode ser lento, uso intensivo de cpu e pode exigir bastante espa\u00e7o em disco. Ele ser\u00e1 executado \u00e0s 4:00hs, embora isto possa ser configur\u00e1vel na \u00e1rea de tarefas agendadas. N\u00e3o \u00e9 recomendado executar esta tarefa durante as horas de pico de uso.",
+ "ExtractChapterImagesHelp": "Extrair imagens de cap\u00edtulos permitir\u00e1 aos clientes exibir menus gr\u00e1ficos de sele\u00e7\u00e3o de cenas. O processo pode ser lento, demandar uso intensivo de cpu e pode exigir bastante espa\u00e7o em disco. Ele ser\u00e1 executado quando os v\u00eddeos forem descobertos e tamb\u00e9m como uma tarefa agendada executada \u00e0s 4 da manh\u00e3. O agendamento pode ser configurado na \u00e1rea de tarefas agendadas. N\u00e3o \u00e9 recomendado executar esta tarefa durante as horas de pico de uso.",
"LabelMetadataDownloadLanguage": "Idioma preferido para download:",
"ButtonAutoScroll": "Auto-rolagem",
"LabelImageSavingConvention": "Conven\u00e7\u00e3o para salvar a imagem:",
@@ -630,8 +630,8 @@
"ButtonScenes": "Cenas",
"ButtonSubtitles": "Legendas",
"ButtonAudioTracks": "Faixas de \u00e1udio",
- "ButtonPreviousTrack": "Faixa anterior",
- "ButtonNextTrack": "Pr\u00f3xima faixa",
+ "ButtonPreviousTrack": "Faixa Anterior",
+ "ButtonNextTrack": "Pr\u00f3xima Faixa",
"ButtonStop": "Parar",
"ButtonPause": "Pausar",
"LabelGroupMoviesIntoCollections": "Agrupar filmes nas cole\u00e7\u00f5es",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Exibir plugins para:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Outros",
"LabelEpisodeName": "Nome do epis\u00f3dio",
"LabelSeriesName": "Nome da s\u00e9rie",
"ValueSeriesNamePeriod": "Nome.s\u00e9rie",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "Ver substitui\u00e7\u00e3o de caminho.",
"LabelGroupChannelsIntoViews": "Exibir os seguintes canais diretamente dentro de minhas visualiza\u00e7\u00f5es:",
"LabelGroupChannelsIntoViewsHelp": "Se ativado, estes canais ser\u00e3o exibidos imediatamente ao lado de outras visualiza\u00e7\u00f5es. Se desativado, eles ser\u00e3o exibidos dentro de uma visualiza\u00e7\u00e3o separada de Canais.",
- "LabelDisplayCollectionsView": "Exibir uma visualiza\u00e7\u00e3o de Cole\u00e7\u00f5es para mostrar colet\u00e2neas de filmes",
+ "LabelDisplayCollectionsView": "Exibir uma visualiza\u00e7\u00e3o de cole\u00e7\u00f5es para mostrar colet\u00e2neas de filmes",
"LabelXbmcMetadataEnableExtraThumbs": "Copiar extrafanart para dentro de extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "Ao fazer o download de imagens elas podem ser salvas em ambas extrafanart e extrathumbs para uma maior compatibilidade com a skin do Xbmc.",
"TabServices": "Servi\u00e7os",
@@ -845,14 +844,35 @@
"HeaderBrandingHelp": "Personalizar a apar\u00eancia do Media Browser para as necessidades de seu grupo ou organiza\u00e7\u00e3o.",
"LabelLoginDisclaimer": "Aviso legal no login:",
"LabelLoginDisclaimerHelp": "Isto ser\u00e1 exibido na parte inferior da p\u00e1gina de login.",
- "LabelAutomaticallyDonate": "Doar automaticamente esta quantidade a cada m\u00eas",
- "LabelAutomaticallyDonateHelp": "Voc\u00ea pode cancelar a qualquer hora atrav\u00e9s de sua conta do PayPal.",
- "OptionList": "List",
- "TabDashboard": "Dashboard",
- "TitleServer": "Server",
+ "LabelAutomaticallyDonate": "Doar automaticamente esta quantidade a cada seis meses",
+ "LabelAutomaticallyDonateHelp": "Voc\u00ea pode cancelar a qualquer momento atrav\u00e9s de sua conta do PayPal.",
+ "OptionList": "Lista",
+ "TabDashboard": "Painel",
+ "TitleServer": "Servidor",
"LabelCache": "Cache:",
"LabelLogs": "Logs:",
- "LabelMetadata": "Metadata:",
+ "LabelMetadata": "Metadados:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Arquivos tempor\u00e1rios da transcodifica\u00e7\u00e3o:",
+ "HeaderLatestMusic": "M\u00fasicas Recentes",
+ "HeaderBranding": "Marca",
+ "HeaderApiKeys": "Chaves da Api",
+ "HeaderApiKeysHelp": "Aplica\u00e7\u00f5es externas necessitam possuir uma chave da Api para se comunicar com o Media Browser. Chaves s\u00e3o emitidas ao logar com uma conta do Media Browser ou ao conceder manualmente uma chave \u00e0 aplica\u00e7\u00e3o",
+ "HeaderApiKey": "Chave da Api",
+ "HeaderApp": "App",
+ "HeaderDevice": "Dispositivo",
+ "HeaderUser": "Usu\u00e1rio",
+ "HeaderDateIssued": "Data da Emiss\u00e3o",
+ "LabelChapterName": "Cap\u00edtulo {0}",
+ "HeaderNewApiKey": "Nova Chave da Api",
+ "LabelAppName": "Nome da app",
+ "LabelAppNameExample": "Exemplo: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Conceder permiss\u00e3o a uma aplica\u00e7\u00e3o para se comunicar com o Media Browser.",
+ "HeaderHttpHeaders": "Cabe\u00e7alhos de Http",
+ "HeaderIdentificationHeader": "Cabe\u00e7alho de Identifica\u00e7\u00e3o",
+ "LabelValue": "Valor:",
+ "LabelMatchType": "Tipo de correspond\u00eancia",
+ "OptionEquals": "Igual",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
index dfc818e7d..c53ecd9d8 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
@@ -479,10 +479,10 @@
"HeaderProgram": "Programa",
"HeaderClients": "Clientes",
"LabelCompleted": "Terminado",
- "LabelFailed": "Failed",
+ "LabelFailed": "Falhou",
"LabelSkipped": "Ignorado",
"HeaderEpisodeOrganization": "Organiza\u00e7\u00e3o dos Epis\u00f3dios",
- "LabelSeries": "Series:",
+ "LabelSeries": "S\u00e9rie:",
"LabelSeasonNumber": "N\u00famero da temporada",
"LabelEpisodeNumber": "N\u00famero do epis\u00f3dio",
"LabelEndingEpisodeNumber": "N\u00famero do epis\u00f3dio final",
@@ -630,8 +630,8 @@
"ButtonScenes": "Cenas",
"ButtonSubtitles": "Legendas",
"ButtonAudioTracks": "Faixas de \u00e1udio",
- "ButtonPreviousTrack": "Previous track",
- "ButtonNextTrack": "Next track",
+ "ButtonPreviousTrack": "Faixa Anterior",
+ "ButtonNextTrack": "Pr\u00f3xima Faixa",
"ButtonStop": "Parar",
"ButtonPause": "Pausar",
"LabelGroupMoviesIntoCollections": "Group movies into collections",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Exibir extens\u00f5es para:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Outros",
"LabelEpisodeName": "Nome do epis\u00f3dio",
"LabelSeriesName": "Nome da s\u00e9rie",
"ValueSeriesNamePeriod": "Nome.da.s\u00e9rie",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ru.json b/MediaBrowser.Server.Implementations/Localization/Server/ru.json
index eb58b98bc..7d9e83cbc 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json
@@ -30,7 +30,7 @@
"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",
"VideoImageExtractionHelp": "\u0414\u043b\u044f \u0432\u0438\u0434\u0435\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0451 \u200b\u200b\u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0431\u043b\u043e\u0436\u043a\u0438, \u0438 \u0434\u043b\u044f \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 \u0442\u0430\u043a\u043e\u0432\u044b\u0445. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438 \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0434\u043b\u044f \u0433\u043b\u0430\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.",
"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",
- "LabelChapterImageExtractionForMoviesHelp": "\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0446\u0435\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0430 4:00 \u0443\u0442\u0440\u0430, \u043e\u0434\u043d\u0430\u043a\u043e, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u041d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a.",
+ "LabelChapterImageExtractionForMoviesHelp": "\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0446\u0435\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0430 4:00 \u0443\u0442\u0440\u0430, \u043e\u0434\u043d\u0430\u043a\u043e, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u041d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a.",
"LabelEnableAutomaticPortMapping": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u043e\u0432",
"LabelEnableAutomaticPortMappingHelp": "UPnP \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432.",
"ButtonOk": "\u041e\u041a",
@@ -151,7 +151,7 @@
"OptionVideoBitrate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u043e",
"OptionResumable": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u043c\u044b\u0435",
"ScheduledTasksHelp": "\u0429\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435.",
- "ScheduledTasksTitle": "\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f",
+ "ScheduledTasksTitle": "\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a",
"TabMyPlugins": "\u041c\u043e\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u044b",
"TabCatalog": "\u041a\u0430\u0442\u0430\u043b\u043e\u0433",
"PluginsTitle": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b",
@@ -217,7 +217,7 @@
"VisitMediaBrowserWebsiteLong": "\u041f\u043e\u0441\u0435\u0449\u0430\u0439\u0442\u0435 \u0441\u0430\u0439\u0442 Media Browser, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043f\u0435\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0431\u043b\u043e\u0433 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.",
"OptionHideUser": "\u0421\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0432\u0445\u043e\u0434\u0430",
"OptionDisableUser": "\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
- "OptionDisableUserHelp": "\u041f\u0440\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u044b.",
+ "OptionDisableUserHelp": "\u041f\u0440\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0437\u043a\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u044b.",
"HeaderAdvancedControl": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
"LabelName": "\u0418\u043c\u044f:",
"OptionAllowUserToManageServer": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c",
@@ -279,7 +279,7 @@
"LabelAutomaticUpdatesFanartHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043d\u043e\u0432\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 fanart.tv. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f.",
"LabelAutomaticUpdatesTmdbHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043d\u043e\u0432\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 TheMovieDB.org. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f.",
"LabelAutomaticUpdatesTvdbHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043d\u043e\u0432\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 TheTVDB.com. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f.",
- "ExtractChapterImagesHelp": "\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0446\u0435\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043d\u0430 4:00 \u0443\u0442\u0440\u0430, \u043e\u0434\u043d\u0430\u043a\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u041d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a.",
+ "ExtractChapterImagesHelp": "\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0446\u0435\u043d\u044b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u0444\u0430\u0439\u043b\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 4:00 \u0443\u0442\u0440\u0430, \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u041d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u044b \u043f\u0438\u043a.",
"LabelMetadataDownloadLanguage": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:",
"ButtonAutoScroll": "\u0410\u0432\u0442\u043e\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430",
"LabelImageSavingConvention": "\u0424\u043e\u0440\u043c\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432:",
@@ -479,7 +479,7 @@
"HeaderProgram": "\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430",
"HeaderClients": "\u041a\u043b\u0438\u0435\u043d\u0442\u044b",
"LabelCompleted": "\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e",
- "LabelFailed": "\u041d\u0435\u0443\u0434\u0430\u0447\u0430",
+ "LabelFailed": "\u041d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e",
"LabelSkipped": "\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043e",
"HeaderEpisodeOrganization": "\u0420\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u0430",
"LabelSeries": "\u0421\u0435\u0440\u0438\u0430\u043b:",
@@ -524,10 +524,10 @@
"HeaderActiveDevices": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
"HeaderPendingInstallations": "\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438",
"HeaerServerInformation": "\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0435",
- "ButtonRestartNow": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441",
+ "ButtonRestartNow": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e",
"ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c",
"ButtonShutdown": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443",
- "ButtonUpdateNow": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441",
+ "ButtonUpdateNow": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e",
"PleaseUpdateManually": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.",
"NewServerVersionAvailable": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Media Browser Server!",
"ServerUpToDate": "Media Browser Server - \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "\u0414\u0440\u0443\u0433\u0438\u0435",
"LabelEpisodeName": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u0430",
"LabelSeriesName": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0430",
"ValueSeriesNamePeriod": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435.\u0441\u0435\u0440\u0438\u0430\u043b\u0430",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439.",
"LabelGroupChannelsIntoViews": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u041c\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u044b:",
"LabelGroupChannelsIntoViewsHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u041a\u0430\u043d\u0430\u043b\u044b.",
- "LabelDisplayCollectionsView": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0444\u0438\u043b\u044c\u043c\u043e\u0432",
+ "LabelDisplayCollectionsView": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0444\u0438\u043b\u044c\u043c\u043e\u0432",
"LabelXbmcMetadataEnableExtraThumbs": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c extrafanart \u0432 extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "\u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432, \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 extrafanart \u0438 extrathumbs \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439 Xbmc.",
"TabServices": "\u0421\u043b\u0443\u0436\u0431\u044b",
@@ -845,14 +844,35 @@
"HeaderBrandingHelp": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 Media Browser \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.",
"LabelLoginDisclaimer": "\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u0430:",
"LabelLoginDisclaimerHelp": "\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.",
- "LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u0440\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446",
+ "LabelAutomaticallyDonate": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u0440\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432",
"LabelAutomaticallyDonateHelp": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u044e \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c PayPal.",
- "OptionList": "List",
- "TabDashboard": "Dashboard",
- "TitleServer": "Server",
+ "OptionList": "\u0421\u043f\u0438\u0441\u043e\u043a",
+ "TabDashboard": "\u041f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430",
+ "TitleServer": "\u0421\u0435\u0440\u0432\u0435\u0440",
"LabelCache": "Cache:",
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "\u041d\u043e\u0432\u0438\u043d\u043a\u0438 \u043c\u0443\u0437\u044b\u043a\u0438",
+ "HeaderBranding": "\u0411\u0440\u0435\u043d\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",
+ "HeaderApiKeys": "\u041a\u043b\u044e\u0447\u0438 API",
+ "HeaderApiKeysHelp": "\u0412\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447 API, \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Media Browser. \u041a\u043b\u044e\u0447\u0438 \u0432\u044b\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0441 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e Media Browser, \u0438\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e.",
+ "HeaderApiKey": "\u041a\u043b\u044e\u0447 API",
+ "HeaderApp": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435",
+ "HeaderDevice": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+ "HeaderUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c",
+ "HeaderDateIssued": "\u0414\u0430\u0442\u0430 \u0432\u044b\u0434\u0430\u0447\u0438",
+ "LabelChapterName": "\u0421\u0446\u0435\u043d\u0430 {0}",
+ "HeaderNewApiKey": "\u041d\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 API",
+ "LabelAppName": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f",
+ "LabelAppNameExample": "\u041f\u0440\u0438\u043c\u0435\u0440: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Media Browser.",
+ "HeaderHttpHeaders": "HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438",
+ "HeaderIdentificationHeader": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
+ "LabelValue": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435:",
+ "LabelMatchType": "\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f:",
+ "OptionEquals": "\u0420\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f",
+ "OptionRegex": "\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
+ "OptionSubstring": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json
index 96b80d143..741bc52ca 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/server.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json
@@ -755,7 +755,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -859,7 +858,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -882,5 +881,13 @@
"HeaderNewApiKey": "New Api Key",
"LabelAppName": "App name",
"LabelAppNameExample": "Example: Sickbeard, NzbDrone",
- "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser."
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "ButtonEnterSupporterKey": "Enter supporter key",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json
index 810629422..75e204f68 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json
@@ -479,10 +479,10 @@
"HeaderProgram": "Program",
"HeaderClients": "Klienter",
"LabelCompleted": "Klar",
- "LabelFailed": "Failed",
+ "LabelFailed": "Misslyckades",
"LabelSkipped": "Hoppades \u00f6ver",
"HeaderEpisodeOrganization": "Katalogisering av avsnitt",
- "LabelSeries": "Series:",
+ "LabelSeries": "Serie:",
"LabelSeasonNumber": "S\u00e4songsnummer:",
"LabelEpisodeNumber": "Avsnittsnummer:",
"LabelEndingEpisodeNumber": "Avslutande avsnittsnummer:",
@@ -630,8 +630,8 @@
"ButtonScenes": "Scener",
"ButtonSubtitles": "Undertexter",
"ButtonAudioTracks": "Ljudsp\u00e5r",
- "ButtonPreviousTrack": "Previous track",
- "ButtonNextTrack": "Next track",
+ "ButtonPreviousTrack": "F\u00f6reg\u00e5ende sp\u00e5r",
+ "ButtonNextTrack": "N\u00e4sta sp\u00e5r",
"ButtonStop": "Stopp",
"ButtonPause": "Paus",
"LabelGroupMoviesIntoCollections": "Gruppera filmer i samlingsboxar",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Visa till\u00e4gg f\u00f6r:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "\u00d6vriga",
"LabelEpisodeName": "Avsnittstitel",
"LabelSeriesName": "Serietitel",
"ValueSeriesNamePeriod": "Series.name",
@@ -847,12 +846,33 @@
"LabelLoginDisclaimerHelp": "Detta visas l\u00e4ngst ned p\u00e5 inloggningssidan.",
"LabelAutomaticallyDonate": "Donera automatiskt detta belopp varje m\u00e5nad",
"LabelAutomaticallyDonateHelp": "Du kan avbryta n\u00e4r som helst via ditt PayPal-konto.",
- "OptionList": "List",
- "TabDashboard": "Dashboard",
+ "OptionList": "Lista",
+ "TabDashboard": "Kontrollpanel",
"TitleServer": "Server",
"LabelCache": "Cache:",
- "LabelLogs": "Logs:",
- "LabelMetadata": "Metadata:",
+ "LabelLogs": "Loggfiler:",
+ "LabelMetadata": "Metadata",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Tillf\u00e4lliga omkodningsfiler:",
+ "HeaderLatestMusic": "Nytillkommen musik",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "API-nycklar",
+ "HeaderApiKeysHelp": "Externa program m\u00e5ste ha en API-nyckel f\u00f6r att kommunicera med Media Browser. Nycklar skapas genom inloggning med ett Media Browser-konto eller genom att manuellt tilldela ett program en nyckel.",
+ "HeaderApiKey": "API-nyckel",
+ "HeaderApp": "App",
+ "HeaderDevice": "Enhet",
+ "HeaderUser": "Anv\u00e4ndare",
+ "HeaderDateIssued": "Utgivningsdatum",
+ "LabelChapterName": "Kapitel {0}",
+ "HeaderNewApiKey": "Ny API-nyckel",
+ "LabelAppName": "Appens namn",
+ "LabelAppNameExample": "Exempel: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Till\u00e5t en app att kommunicera med Media Browser",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/vi.json b/MediaBrowser.Server.Implementations/Localization/Server/vi.json
index 0da205c7b..cc5a77433 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/vi.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/vi.json
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
index 78c7689c3..c2c8f5002 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
@@ -396,7 +396,7 @@
"HeaderCastCrew": "\u62cd\u651d\u4eba\u54e1\u53ca\u6f14\u54e1",
"HeaderAdditionalParts": "\u9644\u52a0\u90e8\u4efd",
"ButtonSplitVersionsApart": "Split Versions Apart",
- "ButtonPlayTrailer": "Trailer",
+ "ButtonPlayTrailer": "\u9810\u544a",
"LabelMissing": "\u7f3a\u5c11",
"LabelOffline": "\u96e2\u7dda",
"PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.",
@@ -744,7 +744,6 @@
"LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater",
- "TabOtherPlugins": "Others",
"LabelEpisodeName": "Episode name",
"LabelSeriesName": "Series name",
"ValueSeriesNamePeriod": "Series.name",
@@ -835,7 +834,7 @@
"LabelXbmcMetadataEnablePathSubstitutionHelp2": "See path substitution.",
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
- "LabelDisplayCollectionsView": "Display a Collections view to show movie collections",
+ "LabelDisplayCollectionsView": "Display a collections view to show movie collections",
"LabelXbmcMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
"LabelXbmcMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Xbmc skin compatibility.",
"TabServices": "Services",
@@ -845,7 +844,7 @@
"HeaderBrandingHelp": "Customize the appearance of Media Browser to fit the needs of your group or organization.",
"LabelLoginDisclaimer": "Login disclaimer:",
"LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.",
- "LabelAutomaticallyDonate": "Automatically donate this amount each month",
+ "LabelAutomaticallyDonate": "Automatically donate this amount every six months",
"LabelAutomaticallyDonateHelp": "You can cancel at any time via your PayPal account.",
"OptionList": "List",
"TabDashboard": "Dashboard",
@@ -854,5 +853,26 @@
"LabelLogs": "Logs:",
"LabelMetadata": "Metadata:",
"LabelImagesByName": "Images by name:",
- "LabelTranscodingTemporaryFiles": "Transcoding temporary files:"
+ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:",
+ "HeaderLatestMusic": "Latest Music",
+ "HeaderBranding": "Branding",
+ "HeaderApiKeys": "Api Keys",
+ "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Media Browser. Keys are issued by logging in with a Media Browser account, or by manually granting the application a key.",
+ "HeaderApiKey": "Api Key",
+ "HeaderApp": "App",
+ "HeaderDevice": "Device",
+ "HeaderUser": "User",
+ "HeaderDateIssued": "Date Issued",
+ "LabelChapterName": "Chapter {0}",
+ "HeaderNewApiKey": "New Api Key",
+ "LabelAppName": "App name",
+ "LabelAppNameExample": "Example: Sickbeard, NzbDrone",
+ "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Media Browser.",
+ "HeaderHttpHeaders": "Http Headers",
+ "HeaderIdentificationHeader": "Identification Header",
+ "LabelValue": "Value:",
+ "LabelMatchType": "Match type:",
+ "OptionEquals": "Equals",
+ "OptionRegex": "Regex",
+ "OptionSubstring": "Substring"
} \ 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 376a95e04..38600922b 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -45,9 +45,6 @@
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Alchemy">
- <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
- </Reference>
<Reference Include="Mono.Nat, Version=1.2.20.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Mono.Nat.1.2.20.0\lib\net40\Mono.Nat.dll</HintPath>
@@ -96,6 +93,9 @@
<HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="Mono.Posix" Condition=" '$(ConfigurationName)' == 'Release Mono' " />
+ <Reference Include="websocket-sharp">
+ <HintPath>..\ThirdParty\WebsocketSharp\websocket-sharp.dll</HintPath>
+ </Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
@@ -134,6 +134,8 @@
<Compile Include="EntryPoints\ServerEventNotifier.cs" />
<Compile Include="EntryPoints\UserDataChangeNotifier.cs" />
<Compile Include="FileOrganization\OrganizerScheduledTask.cs" />
+ <Compile Include="HttpServer\NetListener\HttpListenerServer.cs" />
+ <Compile Include="HttpServer\IHttpListener.cs" />
<Compile Include="HttpServer\Security\AuthorizationContext.cs" />
<Compile Include="HttpServer\ContainerAdapter.cs" />
<Compile Include="HttpServer\GetSwaggerResource.cs" />
@@ -149,9 +151,15 @@
<Compile Include="HttpServer\ServerLogFactory.cs" />
<Compile Include="HttpServer\ServerLogger.cs" />
<Compile Include="HttpServer\Security\SessionContext.cs" />
+ <Compile Include="HttpServer\SocketSharp\SharpWebSocket.cs" />
<Compile Include="HttpServer\StreamWriter.cs" />
<Compile Include="HttpServer\SwaggerService.cs" />
<Compile Include="Drawing\ImageProcessor.cs" />
+ <Compile Include="HttpServer\SocketSharp\Extensions.cs" />
+ <Compile Include="HttpServer\SocketSharp\RequestMono.cs" />
+ <Compile Include="HttpServer\SocketSharp\WebSocketSharpListener.cs" />
+ <Compile Include="HttpServer\SocketSharp\WebSocketSharpRequest.cs" />
+ <Compile Include="HttpServer\SocketSharp\WebSocketSharpResponse.cs" />
<Compile Include="IO\LibraryMonitor.cs" />
<Compile Include="Library\CoreResolutionIgnoreRule.cs" />
<Compile Include="Library\LibraryManager.cs" />
@@ -261,11 +269,10 @@
<Compile Include="Persistence\SqliteUserRepository.cs" />
<Compile Include="Sorting\StudioComparer.cs" />
<Compile Include="Sorting\VideoBitRateComparer.cs" />
+ <Compile Include="Sync\SyncManager.cs" />
<Compile Include="Themes\AppThemeManager.cs" />
<Compile Include="Udp\UdpMessageReceivedEventArgs.cs" />
<Compile Include="Udp\UdpServer.cs" />
- <Compile Include="WebSocket\AlchemyServer.cs" />
- <Compile Include="WebSocket\AlchemyWebSocket.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj">
@@ -356,6 +363,7 @@
<EmbeddedResource Include="Localization\Server\pl.json" />
<EmbeddedResource Include="Localization\JavaScript\es_ES.json" />
<EmbeddedResource Include="Localization\Server\es_ES.json" />
+ <EmbeddedResource Include="Localization\Server\ko.json" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
diff --git a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs
index b832f3a06..7286846db 100644
--- a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs
+++ b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs
@@ -94,8 +94,9 @@ namespace MediaBrowser.Server.Implementations.Notifications
{
var config = GetConfiguration();
- return _userManager.Users.Where(i => config.IsEnabledToSendToUser(request.NotificationType, i.Id.ToString("N"), i.Configuration))
- .Select(i => i.Id.ToString("N"));
+ return _userManager.Users
+ .Where(i => config.IsEnabledToSendToUser(request.NotificationType, i.Id.ToString("N"), i.Configuration))
+ .Select(i => i.Id.ToString("N"));
}
return request.UserIds;
diff --git a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
index e66b87b0c..6f14bb322 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
@@ -46,12 +46,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
}
/// <summary>
- /// Gets or sets the external web socket server.
- /// </summary>
- /// <value>The external web socket server.</value>
- private IWebSocketServer ExternalWebSocketServer { get; set; }
-
- /// <summary>
/// The _logger
/// </summary>
private readonly ILogger _logger;
@@ -68,21 +62,12 @@ namespace MediaBrowser.Server.Implementations.ServerManager
private IServerConfigurationManager ConfigurationManager { get; set; }
/// <summary>
- /// Gets a value indicating whether [supports web socket].
- /// </summary>
- /// <value><c>true</c> if [supports web socket]; otherwise, <c>false</c>.</value>
- public bool SupportsNativeWebSocket
- {
- get { return HttpServer != null && HttpServer.SupportsWebSockets; }
- }
-
- /// <summary>
/// Gets the web socket port number.
/// </summary>
/// <value>The web socket port number.</value>
public int WebSocketPortNumber
{
- get { return SupportsNativeWebSocket ? ConfigurationManager.Configuration.HttpServerPortNumber : ConfigurationManager.Configuration.LegacyWebSocketPortNumber; }
+ get { return ConfigurationManager.Configuration.HttpServerPortNumber; }
}
/// <summary>
@@ -123,43 +108,21 @@ namespace MediaBrowser.Server.Implementations.ServerManager
/// <summary>
/// Starts this instance.
/// </summary>
- public void Start(IEnumerable<string> urlPrefixes, bool enableHttpLogging)
- {
- ReloadHttpServer(urlPrefixes, enableHttpLogging);
- }
-
- public void StartWebSocketServer()
- {
- if (!SupportsNativeWebSocket)
- {
- ReloadExternalWebSocketServer(ConfigurationManager.Configuration.LegacyWebSocketPortNumber);
- }
- }
-
- /// <summary>
- /// Starts the external web socket server.
- /// </summary>
- private void ReloadExternalWebSocketServer(int portNumber)
+ public void Start(IEnumerable<string> urlPrefixes)
{
- DisposeExternalWebSocketServer();
-
- ExternalWebSocketServer = _applicationHost.Resolve<IWebSocketServer>();
-
- ExternalWebSocketServer.Start(portNumber);
- ExternalWebSocketServer.WebSocketConnected += HttpServer_WebSocketConnected;
+ ReloadHttpServer(urlPrefixes);
}
/// <summary>
/// Restarts the Http Server, or starts it if not currently running
/// </summary>
- private void ReloadHttpServer(IEnumerable<string> urlPrefixes, bool enableHttpLogging)
+ private void ReloadHttpServer(IEnumerable<string> urlPrefixes)
{
_logger.Info("Loading Http Server");
try
{
HttpServer = _applicationHost.Resolve<IHttpServer>();
- HttpServer.EnableHttpRequestLogging = enableHttpLogging;
HttpServer.StartServer(urlPrefixes);
}
catch (SocketException ex)
@@ -326,8 +289,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
HttpServer.WebSocketConnected -= HttpServer_WebSocketConnected;
HttpServer.Dispose();
}
-
- DisposeExternalWebSocketServer();
}
/// <summary>
@@ -352,18 +313,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
}
/// <summary>
- /// Disposes the external web socket server.
- /// </summary>
- private void DisposeExternalWebSocketServer()
- {
- if (ExternalWebSocketServer != null)
- {
- _logger.Info("Disposing {0}", ExternalWebSocketServer.GetType().Name);
- ExternalWebSocketServer.Dispose();
- }
- }
-
- /// <summary>
/// Adds the web socket listeners.
/// </summary>
/// <param name="listeners">The listeners.</param>
diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
index 1d1910e40..754f63cbd 100644
--- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs
+++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
@@ -1207,18 +1207,20 @@ namespace MediaBrowser.Server.Implementations.Session
/// <param name="deviceId">The device identifier.</param>
/// <param name="deviceName">Name of the device.</param>
/// <param name="remoteEndPoint">The remote end point.</param>
+ /// <param name="isLocal">if set to <c>true</c> [is local].</param>
/// <returns>Task{SessionInfo}.</returns>
/// <exception cref="System.UnauthorizedAccessException">Invalid user or password entered.</exception>
- /// <exception cref="UnauthorizedAccessException"></exception>
+ /// <exception cref="UnauthorizedAccessException">Invalid user or password entered.</exception>
public async Task<AuthenticationResult> AuthenticateNewSession(string username,
string password,
string clientType,
string appVersion,
string deviceId,
string deviceName,
- string remoteEndPoint)
+ string remoteEndPoint,
+ bool isLocal)
{
- var result = (IsLocalhost(remoteEndPoint) && string.Equals(clientType, "Dashboard", StringComparison.OrdinalIgnoreCase)) ||
+ var result = (isLocal && string.Equals(clientType, "Dashboard", StringComparison.OrdinalIgnoreCase)) ||
await _userManager.AuthenticateUser(username, password).ConfigureAwait(false);
if (!result)
@@ -1337,35 +1339,6 @@ namespace MediaBrowser.Server.Implementations.Session
return Logout(token);
}
- private bool IsLocalhost(string remoteEndpoint)
- {
- if (string.IsNullOrWhiteSpace(remoteEndpoint))
- {
- throw new ArgumentNullException("remoteEndpoint");
- }
-
- return remoteEndpoint.IndexOf("localhost", StringComparison.OrdinalIgnoreCase) != -1 ||
- remoteEndpoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) ||
- remoteEndpoint.StartsWith("::", StringComparison.OrdinalIgnoreCase);
- }
-
- public bool IsInLocalNetwork(string remoteEndpoint)
- {
- if (string.IsNullOrWhiteSpace(remoteEndpoint))
- {
- throw new ArgumentNullException("remoteEndpoint");
- }
-
- // Private address space:
- // http://en.wikipedia.org/wiki/Private_network
-
- return IsLocalhost(remoteEndpoint) ||
- remoteEndpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) ||
- remoteEndpoint.StartsWith("192.", StringComparison.OrdinalIgnoreCase) ||
- remoteEndpoint.StartsWith("172.", StringComparison.OrdinalIgnoreCase) ||
- remoteEndpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase);
- }
-
/// <summary>
/// Reports the capabilities.
/// </summary>
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
new file mode 100644
index 000000000..373b30a41
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -0,0 +1,52 @@
+using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Sync;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Server.Implementations.Sync
+{
+ public class SyncManager : ISyncManager
+ {
+ public Task<List<SyncJob>> CreateJob(SyncJobRequest request)
+ {
+ throw new NotImplementedException();
+ }
+
+ public Task<SyncSchedule> CreateSchedule(SyncScheduleRequest request)
+ {
+ throw new NotImplementedException();
+ }
+
+ public QueryResult<SyncJob> GetJobs(SyncJobQuery query)
+ {
+ throw new NotImplementedException();
+ }
+
+ public QueryResult<SyncSchedule> GetSchedules(SyncScheduleQuery query)
+ {
+ throw new NotImplementedException();
+ }
+
+ public Task CancelJob(string id)
+ {
+ throw new NotImplementedException();
+ }
+
+ public Task CancelSchedule(string id)
+ {
+ throw new NotImplementedException();
+ }
+
+ public SyncJob GetJob(string id)
+ {
+ throw new NotImplementedException();
+ }
+
+ public SyncSchedule GetSchedule(string id)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs b/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs
deleted file mode 100644
index 454dff4b9..000000000
--- a/MediaBrowser.Server.Implementations/WebSocket/AlchemyServer.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-using Alchemy;
-using Alchemy.Classes;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Net;
-#if __MonoCS__
-using Mono.Unix.Native;
-#endif
-
-namespace MediaBrowser.Server.Implementations.WebSocket
-{
- /// <summary>
- /// Class AlchemyServer
- /// </summary>
- public class AlchemyServer : IWebSocketServer
- {
- /// <summary>
- /// Occurs when [web socket connected].
- /// </summary>
- public event EventHandler<WebSocketConnectEventArgs> WebSocketConnected;
-
- /// <summary>
- /// Gets or sets the web socket server.
- /// </summary>
- /// <value>The web socket server.</value>
- private WebSocketServer WebSocketServer { get; set; }
-
- /// <summary>
- /// The _logger
- /// </summary>
- private readonly ILogger _logger;
-
- private bool _hasStopped;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="AlchemyServer" /> class.
- /// </summary>
- /// <param name="logger">The logger.</param>
- /// <exception cref="System.ArgumentNullException">logger</exception>
- public AlchemyServer(ILogger logger)
- {
- if (logger == null)
- {
- throw new ArgumentNullException("logger");
- }
- _logger = logger;
- }
-
- /// <summary>
- /// Gets the port.
- /// </summary>
- /// <value>The port.</value>
- public int Port { get; private set; }
-
- /// <summary>
- /// Starts the specified port number.
- /// </summary>
- /// <param name="portNumber">The port number.</param>
- public void Start(int portNumber)
- {
- _logger.Info("Starting Alchemy web socket server on port {0}", portNumber);
-
- try
- {
- WebSocketServer = new WebSocketServer(portNumber, IPAddress.Any)
- {
- OnConnected = OnAlchemyWebSocketClientConnected,
- TimeOut = TimeSpan.FromHours(24)
- };
-
- #if __MonoCS__
- //Linux: port below 1024 require root or cap_net_bind_service
- if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX)
- {
- if (Syscall.getuid() == 0)
- {
- WebSocketServer.FlashAccessPolicyEnabled = true;
- }
- else
- {
- WebSocketServer.FlashAccessPolicyEnabled = false;
- }
- }
- #endif
- WebSocketServer.Start();
- }
- catch (Exception ex)
- {
- _logger.ErrorException("The web socket server is unable to start on port {0} due to a Socket error. This can occasionally happen when the operating system takes longer than usual to release the IP bindings from the previous session. This can take up to five minutes. Please try waiting or rebooting the system.", ex, portNumber);
-
- throw;
- }
-
- Port = portNumber;
-
- _logger.Info("Alchemy Web Socket Server started");
- }
-
- /// <summary>
- /// Called when [alchemy web socket client connected].
- /// </summary>
- /// <param name="context">The context.</param>
- private void OnAlchemyWebSocketClientConnected(UserContext context)
- {
- if (_hasStopped)
- {
- return;
- }
-
- if (WebSocketConnected != null)
- {
- var socket = new AlchemyWebSocket(context, _logger);
-
- WebSocketConnected(this, new WebSocketConnectEventArgs
- {
- WebSocket = socket,
- Endpoint = context.ClientAddress.ToString()
- });
- }
- }
-
- /// <summary>
- /// Stops this instance.
- /// </summary>
- public void Stop()
- {
- if (WebSocketServer != null)
- {
- WebSocketServer.Stop();
- }
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- private readonly object _syncLock = new object();
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- _hasStopped = true;
-
- lock (_syncLock)
- {
- if (WebSocketServer != null)
- {
- _logger.Debug("Disposing alchemy server");
-
- WebSocketServer.Dispose();
- WebSocketServer = null;
- }
- }
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs b/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs
deleted file mode 100644
index 35c5e780b..000000000
--- a/MediaBrowser.Server.Implementations/WebSocket/AlchemyWebSocket.cs
+++ /dev/null
@@ -1,134 +0,0 @@
-using Alchemy.Classes;
-using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Net;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Server.Implementations.WebSocket
-{
- /// <summary>
- /// Class AlchemyWebSocket
- /// </summary>
- public class AlchemyWebSocket : IWebSocket
- {
- /// <summary>
- /// The logger
- /// </summary>
- private readonly ILogger _logger;
-
- public event EventHandler<EventArgs> Closed;
-
- /// <summary>
- /// Gets or sets the web socket.
- /// </summary>
- /// <value>The web socket.</value>
- private UserContext UserContext { get; set; }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="AlchemyWebSocket" /> class.
- /// </summary>
- /// <param name="context">The context.</param>
- /// <param name="logger">The logger.</param>
- /// <exception cref="System.ArgumentNullException">context</exception>
- public AlchemyWebSocket(UserContext context, ILogger logger)
- {
- if (context == null)
- {
- throw new ArgumentNullException("context");
- }
-
- _logger = logger;
- UserContext = context;
-
- context.SetOnDisconnect(OnDisconnected);
- context.SetOnReceive(OnReceiveContext);
-
- _logger.Info("Client connected from {0}", context.ClientAddress);
- }
-
- /// <summary>
- /// The _disconnected
- /// </summary>
- private bool _disconnected;
- /// <summary>
- /// Gets or sets the state.
- /// </summary>
- /// <value>The state.</value>
- public WebSocketState State
- {
- get { return _disconnected ? WebSocketState.Closed : WebSocketState.Open; }
- }
-
- /// <summary>
- /// Called when [disconnected].
- /// </summary>
- /// <param name="context">The context.</param>
- private void OnDisconnected(UserContext context)
- {
- _disconnected = true;
-
- EventHelper.FireEventIfNotNull(Closed, this, EventArgs.Empty, _logger);
- }
-
- /// <summary>
- /// Called when [receive].
- /// </summary>
- /// <param name="context">The context.</param>
- private void OnReceiveContext(UserContext context)
- {
- if (OnReceive != null)
- {
- var json = context.DataFrame.ToString();
-
- OnReceive(json);
- }
- }
-
- private readonly Task _cachedTask = Task.FromResult(true);
- /// <summary>
- /// Sends the async.
- /// </summary>
- /// <param name="bytes">The bytes.</param>
- /// <param name="type">The type.</param>
- /// <param name="endOfMessage">if set to <c>true</c> [end of message].</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task.</returns>
- public Task SendAsync(byte[] bytes, WebSocketMessageType type, bool endOfMessage, CancellationToken cancellationToken)
- {
- UserContext.Send(bytes);
-
- return _cachedTask;
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- }
-
- /// <summary>
- /// Gets or sets the receive action.
- /// </summary>
- /// <value>The receive action.</value>
- public Action<byte[]> OnReceiveBytes { get; set; }
-
- /// <summary>
- /// Gets or sets the on receive.
- /// </summary>
- /// <value>The on receive.</value>
- public Action<string> OnReceive { get; set; }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index c22d3bec3..907500ae3 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="Alchemy" version="2.2.1" targetFramework="net45" />
<package id="Mono.Nat" version="1.2.20.0" targetFramework="net45" />
<package id="morelinq" version="1.0.16006" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.91.3" targetFramework="net45" />
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index 96e38b2d4..3d6865f85 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -33,6 +33,7 @@ using MediaBrowser.Controller.Security;
using MediaBrowser.Controller.Session;
using MediaBrowser.Controller.Sorting;
using MediaBrowser.Controller.Subtitles;
+using MediaBrowser.Controller.Sync;
using MediaBrowser.Controller.Themes;
using MediaBrowser.Dlna;
using MediaBrowser.Dlna.ConnectionManager;
@@ -69,8 +70,8 @@ using MediaBrowser.Server.Implementations.Persistence;
using MediaBrowser.Server.Implementations.Security;
using MediaBrowser.Server.Implementations.ServerManager;
using MediaBrowser.Server.Implementations.Session;
+using MediaBrowser.Server.Implementations.Sync;
using MediaBrowser.Server.Implementations.Themes;
-using MediaBrowser.Server.Implementations.WebSocket;
using MediaBrowser.ServerApplication.EntryPoints;
using MediaBrowser.ServerApplication.FFMpeg;
using MediaBrowser.ServerApplication.IO;
@@ -331,15 +332,13 @@ namespace MediaBrowser.ServerApplication
private void ApplyDefaultMetadataSettings()
{
- if (!ServerConfigurationManager.Configuration.DefaultMetadataSettingsApplied)
+ if (!ServerConfigurationManager.Configuration.DefaultMetadataSettingsApplied &&
+ ServerConfigurationManager.Configuration.IsStartupWizardCompleted)
{
// Make sure xbmc metadata is disabled for existing users.
- // New users can just take the defaults.
- var service = ServerConfigurationManager.Configuration.IsStartupWizardCompleted
- ? "Xbmc Nfo"
- : "Media Browser Xml";
+ // New users will be handled by the startup wizard.
- ServerConfigurationManager.SetPreferredMetadataService(service);
+ ServerConfigurationManager.DisableMetadataService("Xbmc Nfo");
}
ServerConfigurationManager.Configuration.DefaultMetadataSettingsApplied = true;
@@ -517,8 +516,6 @@ namespace MediaBrowser.ServerApplication
LocalizationManager = new LocalizationManager(ServerConfigurationManager, FileSystemManager, JsonSerializer);
RegisterSingleInstance(LocalizationManager);
- RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger));
-
RegisterSingleInstance<IBlurayExaminer>(() => new BdInfoExaminer());
UserDataManager = new UserDataManager(LogManager);
@@ -631,6 +628,8 @@ namespace MediaBrowser.ServerApplication
MediaEncoder, ChapterManager);
RegisterSingleInstance(EncodingManager);
+ RegisterSingleInstance<ISyncManager>(new SyncManager());
+
var authContext = new AuthorizationContext();
RegisterSingleInstance<IAuthorizationContext>(authContext);
RegisterSingleInstance<ISessionContext>(new SessionContext(UserManager, authContext, SessionManager));
@@ -849,7 +848,7 @@ namespace MediaBrowser.ServerApplication
{
try
{
- ServerManager.Start(HttpServerUrlPrefixes, ServerConfigurationManager.Configuration.EnableHttpLevelLogging);
+ ServerManager.Start(HttpServerUrlPrefixes);
}
catch (Exception ex)
{
@@ -866,8 +865,6 @@ namespace MediaBrowser.ServerApplication
throw;
}
}
-
- ServerManager.StartWebSocketServer();
}
/// <summary>
@@ -879,17 +876,10 @@ namespace MediaBrowser.ServerApplication
{
base.OnConfigurationUpdated(sender, e);
- HttpServer.EnableHttpRequestLogging = ServerConfigurationManager.Configuration.EnableHttpLevelLogging;
-
if (!HttpServer.UrlPrefixes.SequenceEqual(HttpServerUrlPrefixes, StringComparer.OrdinalIgnoreCase))
{
NotifyPendingRestart();
}
-
- else if (!ServerManager.SupportsNativeWebSocket && ServerManager.WebSocketPortNumber != ServerConfigurationManager.Configuration.LegacyWebSocketPortNumber)
- {
- NotifyPendingRestart();
- }
}
/// <summary>
@@ -1022,7 +1012,7 @@ namespace MediaBrowser.ServerApplication
Version = ApplicationVersion.ToString(),
IsNetworkDeployed = CanSelfUpdate,
WebSocketPortNumber = ServerManager.WebSocketPortNumber,
- SupportsNativeWebSocket = ServerManager.SupportsNativeWebSocket,
+ SupportsNativeWebSocket = true,
FailedPluginAssemblies = FailedAssemblies.ToList(),
InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToList(),
CompletedInstallations = InstallationManager.CompletedInstallations.ToList(),
diff --git a/MediaBrowser.Tests/Resolvers/TvUtilTests.cs b/MediaBrowser.Tests/Resolvers/TvUtilTests.cs
index c10dcd3c5..725a5edcb 100644
--- a/MediaBrowser.Tests/Resolvers/TvUtilTests.cs
+++ b/MediaBrowser.Tests/Resolvers/TvUtilTests.cs
@@ -9,6 +9,8 @@ namespace MediaBrowser.Tests.Resolvers
[TestMethod]
public void TestGetEpisodeNumberFromFile()
{
+ Assert.AreEqual(03, TVUtils.GetEpisodeNumberFromFile(@"S02E03 blah.avi", true));
+
Assert.AreEqual(02, TVUtils.GetEpisodeNumberFromFile(@"Season 1\01x02 blah.avi", true));
Assert.AreEqual(02, TVUtils.GetEpisodeNumberFromFile(@"Season 1\S01x02 blah.avi", true));
Assert.AreEqual(02, TVUtils.GetEpisodeNumberFromFile(@"Season 1\S01E02 blah.avi", true));
@@ -140,6 +142,9 @@ namespace MediaBrowser.Tests.Resolvers
[TestMethod]
public void TestGetSeasonNumberFromPath() {
+
+ Assert.AreEqual(02, TVUtils.GetSeasonNumberFromEpisodeFile(@"\Show\Season 02\S02E03 blah.avi"));
+
Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1"));
Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1"));
Assert.AreEqual(1, TVUtils.GetSeasonNumberFromPath(@"\Drive\Season 1"));
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index 186cf9fe3..b50cb254f 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -426,9 +426,7 @@ namespace MediaBrowser.WebDashboard.Api
var files = new[]
{
"scripts/all.js" + versionString,
- "thirdparty/jstree1.0/jquery.jstree.min.js",
- "thirdparty/jquery.unveil-custom.js",
- "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"
+ "thirdparty/jstree1.0/jquery.jstree.min.js"
};
var tags = files.Select(s => string.Format("<script src=\"{0}\"></script>", s)).ToArray();
@@ -451,6 +449,9 @@ namespace MediaBrowser.WebDashboard.Api
await AppendResource(memoryStream, "thirdparty/jquery-2.0.3.min.js", newLineBytes).ConfigureAwait(false);
await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.3/jquery.mobile-1.4.3.min.js", newLineBytes).ConfigureAwait(false);
+ await AppendResource(memoryStream, "thirdparty/jquery.unveil-custom.js", newLineBytes).ConfigureAwait(false);
+ await AppendResource(memoryStream, "thirdparty/cast_sender.js", newLineBytes).ConfigureAwait(false);
+
await AppendLocalization(memoryStream).ConfigureAwait(false);
await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false);
@@ -521,6 +522,7 @@ namespace MediaBrowser.WebDashboard.Api
"mediacontroller.js",
"chromecast.js",
"backdrops.js",
+ "sync.js",
"mediaplayer.js",
"mediaplayer-video.js",
@@ -585,8 +587,6 @@ namespace MediaBrowser.WebDashboard.Api
"livetvstatus.js",
"livetvtimers.js",
- "localsettings.js",
-
"loginpage.js",
"logpage.js",
"medialibrarypage.js",
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index e08da4e00..176094b75 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -158,6 +158,9 @@
<Content Include="dashboard-ui\css\images\clients\amazon.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\css\images\clients\chrome_companion.png">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\css\images\clients\mediaportal.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -278,9 +281,6 @@
<Content Include="dashboard-ui\css\images\media\play.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\media\tvflyout.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\librarymenu.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -461,21 +461,9 @@
<Content Include="dashboard-ui\css\images\items\searchhintsv2\tv.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\media\audioflyout.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\media\chapterflyout.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\css\images\media\qualityflyout.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\media\selected.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="dashboard-ui\css\images\media\subtitleflyout.png">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\css\images\rotten.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -674,9 +662,6 @@
<Content Include="dashboard-ui\scripts\librarypathmapping.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\scripts\localsettings.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\scripts\metadatachapters.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -785,6 +770,9 @@
<Content Include="dashboard-ui\scripts\serversecurity.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\scripts\sync.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\scripts\thememediaplayer.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -806,6 +794,9 @@
<Content Include="dashboard-ui\serversecurity.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\thirdparty\cast_sender.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\thirdparty\jquery-2.0.3.min.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
diff --git a/MediaBrowser.sln b/MediaBrowser.sln
index f8c1701bb..36bce0dfd 100644
--- a/MediaBrowser.sln
+++ b/MediaBrowser.sln
@@ -1,16 +1,8 @@

Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj", "{5624B7B5-B5A7-41D8-9F10-CC5611109619}"
-EndProject
+# Visual Studio 2013
+VisualStudioVersion = 12.0.30501.0
+MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F0E0E64C-2A6F-4E35-9533-D53AC07C2CD1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8C5D6ABC-D277-407B-8061-3AA04251D539}"
@@ -25,6 +17,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget (2)", ".nuget (2)",
.nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj", "{5624B7B5-B5A7-41D8-9F10-CC5611109619}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common.Implementations", "MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj", "{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Implementations", "MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj", "{2E781478-814D-4A48-9D80-BFF206441A65}"
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index 1df5ab37f..92f7fa355 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
- <version>3.0.415</version>
+ <version>3.0.418</version>
<title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.415" />
+ <dependency id="MediaBrowser.Common" version="3.0.418" />
<dependency id="NLog" version="2.1.0" />
<dependency id="SimpleInjector" version="2.5.0" />
<dependency id="sharpcompress" version="0.10.2" />
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index f8ea1e935..4cb876d65 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
-<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
- <version>3.0.415</version>
+ <version>3.0.418</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,10 +12,10 @@
<description>Contains common model objects and interfaces used by all Media Browser solutions.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <group targetFramework=".NETFramework4.5"/>
- <group targetFramework=".NETFramework3.5"/>
+ <group targetFramework=".NETFramework4.5" />
+ <group targetFramework=".NETFramework3.5" />
<group targetFramework=".NETPortable0.0-net45+sl4+wp71+win8">
- <dependency id="Microsoft.Bcl.Async" version="1.0.16" />
+ <dependency id="Microsoft.Bcl.Async" version="1.0.168" />
</group>
</dependencies>
</metadata>
diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec
index 8c5bc7126..597a29b7c 100644
--- a/Nuget/MediaBrowser.Model.Signed.nuspec
+++ b/Nuget/MediaBrowser.Model.Signed.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Model.Signed</id>
- <version>3.0.415</version>
+ <version>3.0.418</version>
<title>MediaBrowser.Model - Signed Edition</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -14,9 +14,7 @@
<dependencies>
<group targetFramework=".NETFramework4.5"/>
<group targetFramework=".NETFramework3.5"/>
- <group targetFramework=".NETPortable0.0-net45+sl4+wp71+win8">
- <dependency id="Microsoft.Bcl.Async" version="1.0.16" />
- </group>
+ <group targetFramework=".NETPortable0.0-net45+sl4+wp71+win8"/>
</dependencies>
</metadata>
<files>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 6de3eb821..05863d47a 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
- <version>3.0.415</version>
+ <version>3.0.418</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.415" />
+ <dependency id="MediaBrowser.Common" version="3.0.418" />
</dependencies>
</metadata>
<files>
diff --git a/README.md b/README.md
index 93bacc325..601f9395e 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,6 @@ We have several client apps released and in production:
- [Windows 8](http://apps.microsoft.com/windows/en-us/app/media-browser/ad55a2f0-9897-47bd-8944-bed3aefd5d06 "Windows 8.1")
- [Xbmc](http://addons.xbmc.org/show/plugin.video.xbmb3c "Xbmc")
-#### [Now with 60+ active contributors!](https://github.com/MediaBrowser/MediaBrowser/blob/master/CONTRIBUTORS.md "Now with 60+ active contributors!")
## New Users ##