aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/Devices/DeviceService.cs28
-rw-r--r--MediaBrowser.Api/Music/InstantMixService.cs17
-rw-r--r--MediaBrowser.Api/Session/SessionsService.cs11
-rw-r--r--MediaBrowser.Controller/Collections/CollectionCreationOptions.cs2
-rw-r--r--MediaBrowser.Controller/Devices/IDeviceManager.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs20
-rw-r--r--MediaBrowser.Controller/Entities/Share.cs15
-rw-r--r--MediaBrowser.Controller/Library/IMusicManager.cs8
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj1
-rw-r--r--MediaBrowser.Controller/Persistence/IUserRepository.cs6
-rw-r--r--MediaBrowser.Controller/Playlists/Playlist.cs19
-rw-r--r--MediaBrowser.Controller/Providers/BaseItemXmlParser.cs78
-rw-r--r--MediaBrowser.Controller/Sync/ISyncManager.cs10
-rw-r--r--MediaBrowser.Controller/Sync/ISyncRepository.cs5
-rw-r--r--MediaBrowser.Dlna/DlnaManager.cs5
-rw-r--r--MediaBrowser.Dlna/MediaBrowser.Dlna.csproj5
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Android.xml84
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml78
-rw-r--r--MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml86
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs12
-rw-r--r--MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs5
-rw-r--r--MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs23
-rw-r--r--MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj12
-rw-r--r--MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj12
-rw-r--r--MediaBrowser.Model/Devices/DeviceQuery.cs17
-rw-r--r--MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs167
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs6
-rw-r--r--MediaBrowser.Model/MediaBrowser.Model.csproj4
-rw-r--r--MediaBrowser.Model/Querying/ItemFields.cs5
-rw-r--r--MediaBrowser.Model/Session/ClientCapabilities.cs5
-rw-r--r--MediaBrowser.Model/Sync/SyncJobItem.cs13
-rw-r--r--MediaBrowser.Model/Sync/SyncJobItemQuery.cs27
-rw-r--r--MediaBrowser.Model/Sync/SyncJobItemStatus.cs12
-rw-r--r--MediaBrowser.Model/Sync/SyncJobQuery.cs5
-rw-r--r--MediaBrowser.Model/Sync/SyncJobStatus.cs7
-rw-r--r--MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs5
-rw-r--r--MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs11
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionManager.cs9
-rw-r--r--MediaBrowser.Server.Implementations/Devices/DeviceManager.cs28
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs9
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs19
-rw-r--r--MediaBrowser.Server.Implementations/Library/MusicManager.cs13
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs2
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs7
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/da.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/de.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/el.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/es.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/he.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/it.json33
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json16
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json39
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json19
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ar.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ca.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/cs.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/da.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/de.json16
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/el.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/en_GB.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/en_US.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/es.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/es_MX.json8
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/fi.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/fr.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/he.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/hr.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/it.json36
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/kk.json62
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ko.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ms.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/nb.json28
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/nl.json10
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pl.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json8
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/ru.json10
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/server.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/sv.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/tr.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/vi.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json4
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json4
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj1
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs9
-rw-r--r--MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs7
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs334
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs101
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncRepository.cs125
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs62
-rw-r--r--MediaBrowser.Server.Startup.Common/ApplicationHost.cs3
-rw-r--r--MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj1
-rw-r--r--MediaBrowser.Server.Startup.Common/Migrations/DeleteDlnaProfiles.cs42
-rw-r--r--MediaBrowser.Tests/Dlna/StreamBuilderTests.cs78
-rw-r--r--MediaBrowser.Tests/MediaBrowser.Tests.csproj1
-rw-r--r--MediaBrowser.WebDashboard/Api/PackageCreator.cs3
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj10
118 files changed, 1741 insertions, 803 deletions
diff --git a/MediaBrowser.Api/Devices/DeviceService.cs b/MediaBrowser.Api/Devices/DeviceService.cs
index 135397308..ab0a4a4b2 100644
--- a/MediaBrowser.Api/Devices/DeviceService.cs
+++ b/MediaBrowser.Api/Devices/DeviceService.cs
@@ -1,25 +1,19 @@
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Devices;
+using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
using ServiceStack;
using ServiceStack.Web;
-using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Threading.Tasks;
namespace MediaBrowser.Api.Devices
{
[Route("/Devices", "GET", Summary = "Gets all devices")]
[Authenticated(Roles = "Admin")]
- public class GetDevices : IReturn<List<DeviceInfo>>
+ public class GetDevices : DeviceQuery, IReturn<QueryResult<DeviceInfo>>
{
- [ApiMember(Name = "SupportsContentUploading", Description = "SupportsContentUploading", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public bool? SupportsContentUploading { get; set; }
-
- [ApiMember(Name = "SupportsDeviceId", Description = "SupportsDeviceId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public bool? SupportsDeviceId { get; set; }
}
[Route("/Devices", "DELETE", Summary = "Deletes a device")]
@@ -112,23 +106,7 @@ namespace MediaBrowser.Api.Devices
public object Get(GetDevices request)
{
- var devices = _deviceManager.GetDevices();
-
- if (request.SupportsContentUploading.HasValue)
- {
- var val = request.SupportsContentUploading.Value;
-
- devices = devices.Where(i => _deviceManager.GetCapabilities(i.Id).SupportsContentUploading == val);
- }
-
- if (request.SupportsDeviceId.HasValue)
- {
- var val = request.SupportsDeviceId.Value;
-
- devices = devices.Where(i => _deviceManager.GetCapabilities(i.Id).SupportsDeviceId == val);
- }
-
- return ToOptimizedResult(devices.ToList());
+ return ToOptimizedResult(_deviceManager.GetDevices(request));
}
public object Get(GetCameraUploads request)
diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs
index f34242242..43fd0894b 100644
--- a/MediaBrowser.Api/Music/InstantMixService.cs
+++ b/MediaBrowser.Api/Music/InstantMixService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
+using MediaBrowser.Controller.Playlists;
using MediaBrowser.Model.Querying;
using ServiceStack;
using System.Collections.Generic;
@@ -20,6 +21,11 @@ namespace MediaBrowser.Api.Music
{
}
+ [Route("/Playlists/{Id}/InstantMix", "GET", Summary = "Creates an instant playlist based on a given playlist")]
+ public class GetInstantMixFromPlaylist : BaseGetSimilarItemsFromItem
+ {
+ }
+
[Route("/Artists/{Name}/InstantMix", "GET", Summary = "Creates an instant playlist based on a given artist")]
public class GetInstantMixFromArtist : BaseGetSimilarItems
{
@@ -109,6 +115,17 @@ namespace MediaBrowser.Api.Music
return GetResult(items, user, request);
}
+ public object Get(GetInstantMixFromPlaylist request)
+ {
+ var playlist = (Playlist)_libraryManager.GetItemById(request.Id);
+
+ var user = _userManager.GetUserById(request.UserId.Value);
+
+ var items = _musicManager.GetInstantMixFromPlaylist(playlist, user);
+
+ return GetResult(items, user, request);
+ }
+
public object Get(GetInstantMixFromMusicGenre request)
{
var user = _userManager.GetUserById(request.UserId.Value);
diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs
index 551771338..df50255ab 100644
--- a/MediaBrowser.Api/Session/SessionsService.cs
+++ b/MediaBrowser.Api/Session/SessionsService.cs
@@ -239,8 +239,11 @@ namespace MediaBrowser.Api.Session
[ApiMember(Name = "SupportsContentUploading", Description = "Determines whether camera upload is supported.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")]
public bool SupportsContentUploading { get; set; }
- [ApiMember(Name = "SupportsDeviceId", Description = "Determines whether the device supports a unique identifier.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")]
- public bool SupportsDeviceId { get; set; }
+ [ApiMember(Name = "SupportsSync", Description = "Determines whether sync is supported.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")]
+ public bool SupportsSync { get; set; }
+
+ [ApiMember(Name = "SupportsUniqueIdentifier", Description = "Determines whether the device supports a unique identifier.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")]
+ public bool SupportsUniqueIdentifier { get; set; }
}
[Route("/Sessions/Logout", "POST", Summary = "Reports that a session has ended")]
@@ -521,7 +524,9 @@ namespace MediaBrowser.Api.Session
SupportsContentUploading = request.SupportsContentUploading,
- SupportsDeviceId = request.SupportsDeviceId
+ SupportsSync = request.SupportsSync,
+
+ SupportsUniqueIdentifier = request.SupportsUniqueIdentifier
});
}
}
diff --git a/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs b/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs
index 74ae42095..4a2d39066 100644
--- a/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs
+++ b/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs
@@ -15,11 +15,13 @@ namespace MediaBrowser.Controller.Collections
public Dictionary<string, string> ProviderIds { get; set; }
public List<Guid> ItemIdList { get; set; }
+ public List<Guid> UserIds { get; set; }
public CollectionCreationOptions()
{
ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
ItemIdList = new List<Guid>();
+ UserIds = new List<Guid>();
}
}
}
diff --git a/MediaBrowser.Controller/Devices/IDeviceManager.cs b/MediaBrowser.Controller/Devices/IDeviceManager.cs
index af184e6e9..efd24336a 100644
--- a/MediaBrowser.Controller/Devices/IDeviceManager.cs
+++ b/MediaBrowser.Controller/Devices/IDeviceManager.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
@@ -58,8 +59,9 @@ namespace MediaBrowser.Controller.Devices
/// <summary>
/// Gets the devices.
/// </summary>
+ /// <param name="query">The query.</param>
/// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns>
- IEnumerable<DeviceInfo> GetDevices();
+ QueryResult<DeviceInfo> GetDevices(DeviceQuery query);
/// <summary>
/// Deletes the device.
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index 731226ede..9dc600675 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -15,8 +15,10 @@ namespace MediaBrowser.Controller.Entities.Movies
/// <summary>
/// Class BoxSet
/// </summary>
- public class BoxSet : Folder, IHasTrailers, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer
+ public class BoxSet : Folder, IHasTrailers, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer, IHasShares
{
+ public List<Share> Shares { get; set; }
+
public BoxSet()
{
RemoteTrailers = new List<MediaUrl>();
@@ -25,6 +27,7 @@ namespace MediaBrowser.Controller.Entities.Movies
DisplayOrder = ItemSortBy.PremiereDate;
Keywords = new List<string>();
+ Shares = new List<Share>();
}
protected override bool FilterLinkedChildrenPerUser
@@ -160,5 +163,20 @@ namespace MediaBrowser.Controller.Entities.Movies
progress.Report(100);
}
+
+ public override bool IsVisible(User user)
+ {
+ if (base.IsVisible(user))
+ {
+ var userId = user.Id.ToString("N");
+
+ return Shares.Any(i => string.Equals(userId, i.UserId, StringComparison.OrdinalIgnoreCase)) ||
+
+ // Need to support this for boxsets created prior to the creation of Shares
+ Shares.Count == 0;
+ }
+
+ return false;
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Share.cs b/MediaBrowser.Controller/Entities/Share.cs
new file mode 100644
index 000000000..e194f6238
--- /dev/null
+++ b/MediaBrowser.Controller/Entities/Share.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Entities
+{
+ public interface IHasShares
+ {
+ List<Share> Shares { get; set; }
+ }
+
+ public class Share
+ {
+ public string UserId { get; set; }
+ public bool CanEdit { get; set; }
+ }
+}
diff --git a/MediaBrowser.Controller/Library/IMusicManager.cs b/MediaBrowser.Controller/Library/IMusicManager.cs
index 192ce2e83..f66f18401 100644
--- a/MediaBrowser.Controller/Library/IMusicManager.cs
+++ b/MediaBrowser.Controller/Library/IMusicManager.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Playlists;
using System.Collections.Generic;
namespace MediaBrowser.Controller.Library
@@ -28,6 +29,13 @@ namespace MediaBrowser.Controller.Library
/// <returns>IEnumerable{Audio}.</returns>
IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user);
/// <summary>
+ /// Gets the instant mix from playlist.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="user">The user.</param>
+ /// <returns>IEnumerable&lt;Audio&gt;.</returns>
+ IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user);
+ /// <summary>
/// Gets the instant mix from genre.
/// </summary>
/// <param name="genres">The genres.</param>
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index dbff88fd8..c198a58d4 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -162,6 +162,7 @@
<Compile Include="Entities\IHasAwards.cs" />
<Compile Include="Entities\Photo.cs" />
<Compile Include="Entities\PhotoAlbum.cs" />
+ <Compile Include="Entities\Share.cs" />
<Compile Include="Entities\UserView.cs" />
<Compile Include="Entities\UserViewBuilder.cs" />
<Compile Include="FileOrganization\IFileOrganizationService.cs" />
diff --git a/MediaBrowser.Controller/Persistence/IUserRepository.cs b/MediaBrowser.Controller/Persistence/IUserRepository.cs
index 0241b8c03..80961a369 100644
--- a/MediaBrowser.Controller/Persistence/IUserRepository.cs
+++ b/MediaBrowser.Controller/Persistence/IUserRepository.cs
@@ -11,12 +11,6 @@ namespace MediaBrowser.Controller.Persistence
public interface IUserRepository : IRepository
{
/// <summary>
- /// Opens the connection to the repository
- /// </summary>
- /// <returns>Task.</returns>
- Task Initialize();
-
- /// <summary>
/// Deletes the user.
/// </summary>
/// <param name="user">The user.</param>
diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs
index 75e1bbde7..e48cddaaa 100644
--- a/MediaBrowser.Controller/Playlists/Playlist.cs
+++ b/MediaBrowser.Controller/Playlists/Playlist.cs
@@ -11,10 +11,17 @@ using System.Runtime.Serialization;
namespace MediaBrowser.Controller.Playlists
{
- public class Playlist : Folder
+ public class Playlist : Folder, IHasShares
{
public string OwnerUserId { get; set; }
+ public List<Share> Shares { get; set; }
+
+ public Playlist()
+ {
+ Shares = new List<Share>();
+ }
+
[IgnoreDataMember]
protected override bool FilterLinkedChildrenPerUser
{
@@ -166,7 +173,15 @@ namespace MediaBrowser.Controller.Playlists
public override bool IsVisible(User user)
{
- return base.IsVisible(user) && string.Equals(user.Id.ToString("N"), OwnerUserId);
+ if (base.IsVisible(user))
+ {
+ var userId = user.Id.ToString("N");
+
+ return Shares.Any(i => string.Equals(userId, i.UserId, StringComparison.OrdinalIgnoreCase)) ||
+ string.Equals(OwnerUserId, userId, StringComparison.OrdinalIgnoreCase);
+ }
+
+ return false;
}
}
}
diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
index 307ab3cb8..a37f7eb8a 100644
--- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
+++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
@@ -819,6 +819,19 @@ namespace MediaBrowser.Controller.Providers
break;
}
+ case "Shares":
+ {
+ using (var subtree = reader.ReadSubtree())
+ {
+ var hasShares = item as IHasShares;
+ if (hasShares != null)
+ {
+ FetchFromSharesNode(subtree, hasShares);
+ }
+ }
+ break;
+ }
+
case "Format3D":
{
var video = item as Video;
@@ -853,6 +866,71 @@ namespace MediaBrowser.Controller.Providers
}
}
+ private void FetchFromSharesNode(XmlReader reader, IHasShares item)
+ {
+ reader.MoveToContent();
+
+ while (reader.Read())
+ {
+ if (reader.NodeType == XmlNodeType.Element)
+ {
+ switch (reader.Name)
+ {
+ case "Share":
+ {
+ using (var subtree = reader.ReadSubtree())
+ {
+ var share = GetShareFromNode(subtree);
+ if (share != null)
+ {
+ item.Shares.Add(share);
+ }
+ }
+ break;
+ }
+
+ default:
+ reader.Skip();
+ break;
+ }
+ }
+ }
+ }
+
+ private Share GetShareFromNode(XmlReader reader)
+ {
+ var share = new Share();
+
+ reader.MoveToContent();
+
+ while (reader.Read())
+ {
+ if (reader.NodeType == XmlNodeType.Element)
+ {
+ switch (reader.Name)
+ {
+ case "UserId":
+ {
+ share.UserId = reader.ReadElementContentAsString();
+ break;
+ }
+
+ case "CanEdit":
+ {
+ share.CanEdit = string.Equals(reader.ReadElementContentAsString(), true.ToString(), StringComparison.OrdinalIgnoreCase);
+ break;
+ }
+
+ default:
+ reader.Skip();
+ break;
+ }
+ }
+ }
+
+ return share;
+ }
+
private void FetchFromCountriesNode(XmlReader reader, T item)
{
reader.MoveToContent();
diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs
index 1d5ab7d3e..31c3c0c6d 100644
--- a/MediaBrowser.Controller/Sync/ISyncManager.cs
+++ b/MediaBrowser.Controller/Sync/ISyncManager.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Sync;
using System.Collections.Generic;
@@ -27,7 +28,7 @@ namespace MediaBrowser.Controller.Sync
/// <param name="id">The identifier.</param>
/// <returns>SyncJob.</returns>
SyncJob GetJob(string id);
-
+
/// <summary>
/// Cancels the job.
/// </summary>
@@ -51,5 +52,12 @@ namespace MediaBrowser.Controller.Sync
/// <param name="item">The item.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
bool SupportsSync(BaseItem item);
+
+ /// <summary>
+ /// Gets the device profile.
+ /// </summary>
+ /// <param name="targetId">The target identifier.</param>
+ /// <returns>DeviceProfile.</returns>
+ DeviceProfile GetDeviceProfile(string targetId);
}
}
diff --git a/MediaBrowser.Controller/Sync/ISyncRepository.cs b/MediaBrowser.Controller/Sync/ISyncRepository.cs
index d0cf87182..f1bcd7f07 100644
--- a/MediaBrowser.Controller/Sync/ISyncRepository.cs
+++ b/MediaBrowser.Controller/Sync/ISyncRepository.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Sync;
-using System.Collections.Generic;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Sync
@@ -66,8 +65,8 @@ namespace MediaBrowser.Controller.Sync
/// <summary>
/// Gets the job items.
/// </summary>
- /// <param name="jobId">The job identifier.</param>
+ /// <param name="query">The query.</param>
/// <returns>IEnumerable&lt;SyncJobItem&gt;.</returns>
- IEnumerable<SyncJobItem> GetJobItems(string jobId);
+ QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query);
}
}
diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs
index fad23ae42..7517cea50 100644
--- a/MediaBrowser.Dlna/DlnaManager.cs
+++ b/MediaBrowser.Dlna/DlnaManager.cs
@@ -523,10 +523,9 @@ namespace MediaBrowser.Dlna
new LgTvProfile(),
new Foobar2000Profile(),
new MediaMonkeyProfile(),
- new Windows81Profile(),
+ //new Windows81Profile(),
//new WindowsMediaCenterProfile(),
- new WindowsPhoneProfile(),
- new AndroidProfile(),
+ //new WindowsPhoneProfile(),
new DirectTvProfile(),
new DishHopperJoeyProfile(),
new DefaultProfile(),
diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
index ece3da2dc..7871946cb 100644
--- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
+++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
@@ -181,11 +181,6 @@
<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>
- <ItemGroup>
<EmbeddedResource Include="Images\logo240.jpg" />
<EmbeddedResource Include="Images\logo240.png" />
</ItemGroup>
diff --git a/MediaBrowser.Dlna/Profiles/Xml/Android.xml b/MediaBrowser.Dlna/Profiles/Xml/Android.xml
deleted file mode 100644
index 56a229869..000000000
--- a/MediaBrowser.Dlna/Profiles/Xml/Android.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?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>
- <EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
- <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
- <AlbumArtPn>JPEG_SM</AlbumArtPn>
- <MaxAlbumArtWidth>480</MaxAlbumArtWidth>
- <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
- <MaxIconWidth>48</MaxIconWidth>
- <MaxIconHeight>48</MaxIconHeight>
- <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
- <MaxStaticBitrate>8000000</MaxStaticBitrate>
- <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
- <MusicSyncBitrate>128000</MusicSyncBitrate>
- <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>
- <SupportsDirectRemoteContent>false</SupportsDirectRemoteContent>
- <SupportsCustomHttpHeaders>false</SupportsCustomHttpHeaders>
- <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" context="Streaming" />
- <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Static" />
- </TranscodingProfiles>
- <ContainerProfiles />
- <CodecProfiles>
- <CodecProfile type="Video" codec="h264">
- <Conditions>
- <ProfileCondition condition="EqualsAny" property="VideoProfile" value="baseline|constrained baseline" isRequired="false" />
- <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="false" />
- <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="false" />
- <ProfileCondition condition="LessThanEqual" property="VideoBitDepth" value="8" isRequired="false" />
- <ProfileCondition condition="NotEquals" property="IsAnamorphic" value="true" isRequired="false" />
- <ProfileCondition condition="Equals" property="IsCabac" value="true" isRequired="false" />
- </Conditions>
- </CodecProfile>
- <CodecProfile type="Video">
- <Conditions>
- <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="false" />
- <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="false" />
- <ProfileCondition condition="LessThanEqual" property="VideoBitDepth" value="8" isRequired="false" />
- <ProfileCondition condition="NotEquals" property="IsAnamorphic" value="true" isRequired="false" />
- </Conditions>
- </CodecProfile>
- <CodecProfile type="VideoAudio" codec="aac">
- <Conditions>
- <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="false" />
- </Conditions>
- </CodecProfile>
- <CodecProfile type="Audio" codec="aac">
- <Conditions>
- <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="false" />
- </Conditions>
- </CodecProfile>
- <CodecProfile type="Audio" codec="mp3">
- <Conditions>
- <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="false" />
- <ProfileCondition condition="LessThanEqual" property="AudioBitrate" value="320000" isRequired="false" />
- </Conditions>
- </CodecProfile>
- </CodecProfiles>
- <ResponseProfiles />
- <SubtitleProfiles />
-</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
deleted file mode 100644
index 9283cf91a..000000000
--- a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?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>
- <EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
- <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
- <AlbumArtPn>JPEG_SM</AlbumArtPn>
- <MaxAlbumArtWidth>480</MaxAlbumArtWidth>
- <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
- <MaxIconWidth>48</MaxIconWidth>
- <MaxIconHeight>48</MaxIconHeight>
- <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
- <MaxStaticBitrate>8000000</MaxStaticBitrate>
- <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
- <MusicSyncBitrate>128000</MusicSyncBitrate>
- <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>
- <SupportsDirectRemoteContent>false</SupportsDirectRemoteContent>
- <SupportsCustomHttpHeaders>false</SupportsCustomHttpHeaders>
- <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" context="Streaming" />
- <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" 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="Video" codec="h264">
- <Conditions>
- <ProfileCondition condition="EqualsAny" property="VideoProfile" value="baseline|constrained baseline" 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 />
- <SubtitleProfiles>
- <SubtitleProfile format="vtt" method="External" />
- </SubtitleProfiles>
-</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
deleted file mode 100644
index efa52208b..000000000
--- a/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?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>
- <EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
- <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
- <AlbumArtPn>JPEG_SM</AlbumArtPn>
- <MaxAlbumArtWidth>480</MaxAlbumArtWidth>
- <MaxAlbumArtHeight>480</MaxAlbumArtHeight>
- <MaxIconWidth>48</MaxIconWidth>
- <MaxIconHeight>48</MaxIconHeight>
- <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
- <MaxStaticBitrate>8000000</MaxStaticBitrate>
- <MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
- <MusicSyncBitrate>128000</MusicSyncBitrate>
- <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>
- <SupportsDirectRemoteContent>false</SupportsDirectRemoteContent>
- <SupportsCustomHttpHeaders>false</SupportsCustomHttpHeaders>
- <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" context="Streaming" />
- <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
- <TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" 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" />
- <ProfileCondition condition="EqualsAny" property="VideoProfile" value="baseline|constrained baseline" isRequired="false" />
- </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 />
- <SubtitleProfiles />
-</Profile> \ No newline at end of file
diff --git a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
index c7f974200..a12724ff7 100644
--- a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
@@ -2,7 +2,9 @@
using MediaBrowser.Controller.Playlists;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Logging;
+using System;
using System.Collections.Generic;
+using System.Linq;
using System.Xml;
namespace MediaBrowser.LocalMetadata.Parsers
@@ -20,7 +22,15 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
case "OwnerUserId":
{
- item.OwnerUserId = reader.ReadElementContentAsString();
+ var userId = reader.ReadElementContentAsString();
+ if (!item.Shares.Any(i => string.Equals(userId, i.UserId, StringComparison.OrdinalIgnoreCase)))
+ {
+ item.Shares.Add(new Share
+ {
+ UserId = userId,
+ CanEdit = true
+ });
+ }
break;
}
diff --git a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
index 16c437381..76ef4d4bf 100644
--- a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
@@ -57,11 +57,6 @@ namespace MediaBrowser.LocalMetadata.Savers
builder.Append("<Item>");
- if (!string.IsNullOrEmpty(playlist.OwnerUserId))
- {
- builder.Append("<OwnerUserId>" + SecurityElement.Escape(playlist.OwnerUserId) + "</OwnerUserId>");
- }
-
if (!string.IsNullOrEmpty(playlist.PlaylistMediaType))
{
builder.Append("<PlaylistMediaType>" + SecurityElement.Escape(playlist.PlaylistMediaType) + "</PlaylistMediaType>");
diff --git a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
index 93876f474..3e11c994b 100644
--- a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
+++ b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
@@ -645,6 +645,29 @@ namespace MediaBrowser.LocalMetadata.Savers
{
AddLinkedChildren(playlist, builder, "PlaylistItems", "PlaylistItem");
}
+
+ var hasShares = item as IHasShares;
+ if (hasShares != null)
+ {
+
+ }
+ }
+
+ public static void AddShares(IHasShares item, StringBuilder builder)
+ {
+ builder.Append("<Shares>");
+
+ foreach (var share in item.Shares)
+ {
+ builder.Append("<Share>");
+
+ builder.Append("<UserId>" + SecurityElement.Escape(share.UserId) + "</UserId>");
+ builder.Append("<CanEdit>" + SecurityElement.Escape(share.CanEdit.ToString().ToLower()) + "</CanEdit>");
+
+ builder.Append("</Share>");
+ }
+
+ builder.Append("</Shares>");
}
public static void AddChapters(Video item, StringBuilder builder, IItemRepository repository)
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index bcd6e08f1..f2497c5a9 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -275,6 +275,9 @@
<Compile Include="..\MediaBrowser.Model\Devices\DeviceOptions.cs">
<Link>Devices\DeviceOptions.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Devices\DeviceQuery.cs">
+ <Link>Devices\DeviceQuery.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Devices\DevicesOptions.cs">
<Link>Devices\DevicesOptions.cs</Link>
</Compile>
@@ -347,9 +350,6 @@
<Compile Include="..\MediaBrowser.Model\Dlna\ProfileConditionValue.cs">
<Link>Dlna\ProfileConditionValue.cs</Link>
</Compile>
- <Compile Include="..\MediaBrowser.Model\Dlna\Profiles\AndroidProfile.cs">
- <Link>Dlna\Profiles\AndroidProfile.cs</Link>
- </Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\Profiles\DefaultProfile.cs">
<Link>Dlna\Profiles\DefaultProfile.cs</Link>
</Compile>
@@ -1034,6 +1034,12 @@
<Compile Include="..\MediaBrowser.Model\Sync\SyncJobItem.cs">
<Link>Sync\SyncJobItem.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobItemQuery.cs">
+ <Link>SyncJobItemQuery.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobItemStatus.cs">
+ <Link>Sync\SyncJobItemStatus.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Sync\SyncJobQuery.cs">
<Link>Sync\SyncJobQuery.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 55d18c1b3..b44accb7a 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -240,6 +240,9 @@
<Compile Include="..\MediaBrowser.Model\Devices\DeviceOptions.cs">
<Link>Devices\DeviceOptions.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Devices\DeviceQuery.cs">
+ <Link>Devices\DeviceQuery.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Devices\DevicesOptions.cs">
<Link>Devices\DevicesOptions.cs</Link>
</Compile>
@@ -312,9 +315,6 @@
<Compile Include="..\MediaBrowser.Model\Dlna\ProfileConditionValue.cs">
<Link>Dlna\ProfileConditionValue.cs</Link>
</Compile>
- <Compile Include="..\MediaBrowser.Model\Dlna\Profiles\AndroidProfile.cs">
- <Link>Dlna\Profiles\AndroidProfile.cs</Link>
- </Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\Profiles\DefaultProfile.cs">
<Link>Dlna\Profiles\DefaultProfile.cs</Link>
</Compile>
@@ -993,6 +993,12 @@
<Compile Include="..\MediaBrowser.Model\Sync\SyncJobItem.cs">
<Link>Sync\SyncJobItem.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobItemQuery.cs">
+ <Link>Sync\SyncJobItemQuery.cs</Link>
+ </Compile>
+ <Compile Include="..\MediaBrowser.Model\Sync\SyncJobItemStatus.cs">
+ <Link>Sync\SyncJobItemStatus.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Sync\SyncJobQuery.cs">
<Link>Sync\SyncJobQuery.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model/Devices/DeviceQuery.cs b/MediaBrowser.Model/Devices/DeviceQuery.cs
new file mode 100644
index 000000000..76f7117b6
--- /dev/null
+++ b/MediaBrowser.Model/Devices/DeviceQuery.cs
@@ -0,0 +1,17 @@
+
+namespace MediaBrowser.Model.Devices
+{
+ public class DeviceQuery
+ {
+ /// <summary>
+ /// Gets or sets a value indicating whether [supports content uploading].
+ /// </summary>
+ /// <value><c>null</c> if [supports content uploading] contains no value, <c>true</c> if [supports content uploading]; otherwise, <c>false</c>.</value>
+ public bool? SupportsContentUploading { get; set; }
+ /// <summary>
+ /// Gets or sets a value indicating whether [supports unique identifier].
+ /// </summary>
+ /// <value><c>null</c> if [supports unique identifier] contains no value, <c>true</c> if [supports unique identifier]; otherwise, <c>false</c>.</value>
+ public bool? SupportsUniqueIdentifier { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs b/MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs
deleted file mode 100644
index 7aa7f98db..000000000
--- a/MediaBrowser.Model/Dlna/Profiles/AndroidProfile.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-using System.Collections.Generic;
-using System.Xml.Serialization;
-
-namespace MediaBrowser.Model.Dlna.Profiles
-{
- [XmlRoot("Profile")]
- public class AndroidProfile : DefaultProfile
- {
- public AndroidProfile()
- : this(true, true, new[] { "baseline", "constrained baseline" })
- {
-
- }
-
- public AndroidProfile(bool supportsHls,
- bool supportsMpegDash,
- string[] supportedH264Profiles)
- {
- Name = "Android";
-
- List<TranscodingProfile> transcodingProfiles = new List<TranscodingProfile>();
-
- transcodingProfiles.Add(new TranscodingProfile
- {
- Container = "mp3",
- AudioCodec = "mp3",
- Type = DlnaProfileType.Audio
- });
-
- if (supportsMpegDash)
- {
-
- }
- if (supportsHls)
- {
- transcodingProfiles.Add(new TranscodingProfile
- {
- Protocol = "hls",
- Container = "ts",
- VideoCodec = "h264",
- AudioCodec = "aac",
- Type = DlnaProfileType.Video,
- Context = EncodingContext.Streaming
- });
- }
- transcodingProfiles.Add(new TranscodingProfile
- {
- Container = "mp4",
- VideoCodec = "h264",
- AudioCodec = "aac",
- Type = DlnaProfileType.Video,
- Context = EncodingContext.Static
- });
-
- TranscodingProfiles = transcodingProfiles.ToArray();
-
- 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,
- Codec= "h264",
-
- Conditions = new []
- {
- new ProfileCondition(ProfileConditionType.EqualsAny, ProfileConditionValue.VideoProfile, string.Join("|", supportedH264Profiles)),
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.Width, "1920"),
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.Height, "1080"),
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.VideoBitDepth, "8"),
- new ProfileCondition(ProfileConditionType.NotEquals, ProfileConditionValue.IsAnamorphic, "true"),
- new ProfileCondition(ProfileConditionType.Equals, ProfileConditionValue.IsCabac, "true")
- }
- },
-
- new CodecProfile
- {
- Type = CodecType.Video,
-
- Conditions = new []
- {
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.Width, "1920"),
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.Height, "1080"),
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.VideoBitDepth, "8"),
- new ProfileCondition(ProfileConditionType.NotEquals, ProfileConditionValue.IsAnamorphic, "true")
- }
- },
-
- new CodecProfile
- {
- Type = CodecType.VideoAudio,
- Codec = "aac",
- Conditions = new []
- {
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioChannels, "2")
- }
- },
-
- new CodecProfile
- {
- Type = CodecType.Audio,
- Codec = "aac",
- Conditions = new []
- {
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioChannels, "2")
- }
- },
-
- new CodecProfile
- {
- Type = CodecType.Audio,
- Codec = "mp3",
- Conditions = new []
- {
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioChannels, "2"),
- new ProfileCondition(ProfileConditionType.LessThanEqual, ProfileConditionValue.AudioBitrate, "320000")
- }
- }
- };
-
- }
- }
-}
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index b83243ba8..45f681066 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -186,6 +186,12 @@ namespace MediaBrowser.Model.Dto
/// </summary>
/// <value>The genres.</value>
public List<string> Genres { get; set; }
+
+ /// <summary>
+ /// Gets or sets the series genres.
+ /// </summary>
+ /// <value>The series genres.</value>
+ public List<string> SeriesGenres { get; set; }
/// <summary>
/// Gets or sets the community rating.
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 4825cb4cc..e370ad8e0 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -113,11 +113,11 @@
<Compile Include="Connect\PinStatusResult.cs" />
<Compile Include="Connect\UserLinkType.cs" />
<Compile Include="Devices\DeviceOptions.cs" />
+ <Compile Include="Devices\DeviceQuery.cs" />
<Compile Include="Devices\LocalFileInfo.cs" />
<Compile Include="Devices\DeviceInfo.cs" />
<Compile Include="Devices\DevicesOptions.cs" />
<Compile Include="Dlna\EncodingContext.cs" />
- <Compile Include="Dlna\Profiles\AndroidProfile.cs" />
<Compile Include="Dlna\Profiles\DefaultProfile.cs" />
<Compile Include="Dlna\ResolutionConfiguration.cs" />
<Compile Include="Dlna\ResolutionNormalizer.cs" />
@@ -365,6 +365,8 @@
<Compile Include="Sync\SyncJob.cs" />
<Compile Include="Sync\SyncJobCreationResult.cs" />
<Compile Include="Sync\SyncJobItem.cs" />
+ <Compile Include="Sync\SyncJobItemQuery.cs" />
+ <Compile Include="Sync\SyncJobItemStatus.cs" />
<Compile Include="Sync\SyncJobQuery.cs" />
<Compile Include="Sync\SyncJobRequest.cs" />
<Compile Include="Sync\SyncJobStatus.cs" />
diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs
index a5a906f95..19e30cd8a 100644
--- a/MediaBrowser.Model/Querying/ItemFields.cs
+++ b/MediaBrowser.Model/Querying/ItemFields.cs
@@ -162,6 +162,11 @@ namespace MediaBrowser.Model.Querying
ScreenshotImageTags,
/// <summary>
+ /// The series genres
+ /// </summary>
+ SeriesGenres,
+
+ /// <summary>
/// The series studio
/// </summary>
SeriesStudio,
diff --git a/MediaBrowser.Model/Session/ClientCapabilities.cs b/MediaBrowser.Model/Session/ClientCapabilities.cs
index fc0d3a1fb..f2faa0545 100644
--- a/MediaBrowser.Model/Session/ClientCapabilities.cs
+++ b/MediaBrowser.Model/Session/ClientCapabilities.cs
@@ -13,13 +13,14 @@ namespace MediaBrowser.Model.Session
public string MessageCallbackUrl { get; set; }
public bool SupportsContentUploading { get; set; }
- public bool SupportsDeviceId { get; set; }
+ public bool SupportsUniqueIdentifier { get; set; }
+ public bool SupportsSync { get; set; }
public ClientCapabilities()
{
PlayableMediaTypes = new List<string>();
SupportedCommands = new List<string>();
- SupportsDeviceId = true;
+ SupportsUniqueIdentifier = true;
}
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/Sync/SyncJobItem.cs b/MediaBrowser.Model/Sync/SyncJobItem.cs
index 141546eb5..063f7feb2 100644
--- a/MediaBrowser.Model/Sync/SyncJobItem.cs
+++ b/MediaBrowser.Model/Sync/SyncJobItem.cs
@@ -1,4 +1,5 @@
-
+using System;
+
namespace MediaBrowser.Model.Sync
{
public class SyncJobItem
@@ -37,12 +38,18 @@ namespace MediaBrowser.Model.Sync
/// Gets or sets the status.
/// </summary>
/// <value>The status.</value>
- public SyncJobStatus Status { get; set; }
+ public SyncJobItemStatus Status { get; set; }
/// <summary>
/// Gets or sets the current progress.
/// </summary>
/// <value>The current progress.</value>
- public double? CurrentProgress { get; set; }
+ public double? Progress { get; set; }
+
+ /// <summary>
+ /// Gets or sets the date created.
+ /// </summary>
+ /// <value>The date created.</value>
+ public DateTime DateCreated { get; set; }
}
}
diff --git a/MediaBrowser.Model/Sync/SyncJobItemQuery.cs b/MediaBrowser.Model/Sync/SyncJobItemQuery.cs
new file mode 100644
index 000000000..e9af642ac
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncJobItemQuery.cs
@@ -0,0 +1,27 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public class SyncJobItemQuery
+ {
+ /// <summary>
+ /// Gets or sets the start index.
+ /// </summary>
+ /// <value>The start index.</value>
+ public int? StartIndex { get; set; }
+ /// <summary>
+ /// Gets or sets the limit.
+ /// </summary>
+ /// <value>The limit.</value>
+ public int? Limit { get; set; }
+ /// <summary>
+ /// Gets or sets the job identifier.
+ /// </summary>
+ /// <value>The job identifier.</value>
+ public string JobId { get; set; }
+ /// <summary>
+ /// Gets or sets a value indicating whether this instance is completed.
+ /// </summary>
+ /// <value><c>null</c> if [is completed] contains no value, <c>true</c> if [is completed]; otherwise, <c>false</c>.</value>
+ public bool? IsCompleted { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncJobItemStatus.cs b/MediaBrowser.Model/Sync/SyncJobItemStatus.cs
new file mode 100644
index 000000000..3d0579a3c
--- /dev/null
+++ b/MediaBrowser.Model/Sync/SyncJobItemStatus.cs
@@ -0,0 +1,12 @@
+
+namespace MediaBrowser.Model.Sync
+{
+ public enum SyncJobItemStatus
+ {
+ Queued = 0,
+ Converting = 1,
+ Transferring = 2,
+ Completed = 3,
+ Failed = 4
+ }
+}
diff --git a/MediaBrowser.Model/Sync/SyncJobQuery.cs b/MediaBrowser.Model/Sync/SyncJobQuery.cs
index 74b35186e..218b3823e 100644
--- a/MediaBrowser.Model/Sync/SyncJobQuery.cs
+++ b/MediaBrowser.Model/Sync/SyncJobQuery.cs
@@ -13,5 +13,10 @@ namespace MediaBrowser.Model.Sync
/// </summary>
/// <value>The limit.</value>
public int? Limit { get; set; }
+ /// <summary>
+ /// Gets or sets a value indicating whether this instance is completed.
+ /// </summary>
+ /// <value><c>null</c> if [is completed] contains no value, <c>true</c> if [is completed]; otherwise, <c>false</c>.</value>
+ public bool? IsCompleted { get; set; }
}
}
diff --git a/MediaBrowser.Model/Sync/SyncJobStatus.cs b/MediaBrowser.Model/Sync/SyncJobStatus.cs
index 42af96509..961ccf544 100644
--- a/MediaBrowser.Model/Sync/SyncJobStatus.cs
+++ b/MediaBrowser.Model/Sync/SyncJobStatus.cs
@@ -4,9 +4,8 @@ namespace MediaBrowser.Model.Sync
public enum SyncJobStatus
{
Queued = 0,
- Converting = 1,
- Transferring = 2,
- Completed = 3,
- Cancelled = 4
+ InProgress = 1,
+ Completed = 2,
+ CompletedWithError = 3
}
}
diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
index 31136b919..062519f9d 100644
--- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
+++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
@@ -44,6 +44,11 @@ namespace MediaBrowser.Providers.BoxSets
target.LinkedChildren = list;
}
+
+ if (replaceData || target.Shares.Count == 0)
+ {
+ target.Shares = source.Shares;
+ }
}
protected override ItemUpdateType BeforeSave(BoxSet item)
diff --git a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
index 586c17d07..2e407f10c 100644
--- a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
+++ b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
@@ -7,7 +7,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using System.Linq;
namespace MediaBrowser.Providers.Playlists
{
@@ -34,18 +33,14 @@ namespace MediaBrowser.Providers.Playlists
target.PlaylistMediaType = source.PlaylistMediaType;
}
- if (replaceData || string.IsNullOrEmpty(target.OwnerUserId))
+ if (replaceData || target.Shares.Count == 0)
{
- target.OwnerUserId = source.OwnerUserId;
+ target.Shares = source.Shares;
}
if (mergeMetadataSettings)
{
- var list = source.LinkedChildren.ToList();
-
- list.AddRange(target.LinkedChildren);
-
- target.LinkedChildren = list;
+ target.LinkedChildren = source.LinkedChildren;
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index e346d6d01..9fee27db9 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -72,7 +72,12 @@ namespace MediaBrowser.Server.Implementations.Collections
DisplayMediaType = "Collection",
Path = path,
IsLocked = options.IsLocked,
- ProviderIds = options.ProviderIds
+ ProviderIds = options.ProviderIds,
+ Shares = options.UserIds.Select(i => new Share
+ {
+ UserId = i.ToString("N")
+
+ }).ToList()
};
await parentFolder.AddChild(collection, CancellationToken.None).ConfigureAwait(false);
@@ -156,7 +161,7 @@ namespace MediaBrowser.Server.Implementations.Collections
}
itemList.Add(item);
-
+
if (currentLinkedChildren.Any(i => i.Id == itemId))
{
throw new ArgumentException("Item already exists in collection");
diff --git a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
index e2c729b2d..8c67013ea 100644
--- a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
+++ b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
@@ -6,6 +6,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
@@ -28,7 +29,7 @@ namespace MediaBrowser.Server.Implementations.Devices
/// Occurs when [device options updated].
/// </summary>
public event EventHandler<GenericEventArgs<DeviceInfo>> DeviceOptionsUpdated;
-
+
public DeviceManager(IDeviceRepository repo, IUserManager userManager, IFileSystem fileSystem, ILibraryMonitor libraryMonitor, IConfigurationManager config, ILogger logger)
{
_repo = repo;
@@ -79,9 +80,30 @@ namespace MediaBrowser.Server.Implementations.Devices
return _repo.GetDevice(id);
}
- public IEnumerable<DeviceInfo> GetDevices()
+ public QueryResult<DeviceInfo> GetDevices(DeviceQuery query)
{
- return _repo.GetDevices().OrderByDescending(i => i.DateLastModified);
+ IEnumerable<DeviceInfo> devices = _repo.GetDevices().OrderByDescending(i => i.DateLastModified);
+
+ if (query.SupportsContentUploading.HasValue)
+ {
+ var val = query.SupportsContentUploading.Value;
+
+ devices = devices.Where(i => GetCapabilities(i.Id).SupportsContentUploading == val);
+ }
+
+ if (query.SupportsUniqueIdentifier.HasValue)
+ {
+ var val = query.SupportsUniqueIdentifier.Value;
+
+ devices = devices.Where(i => GetCapabilities(i.Id).SupportsUniqueIdentifier == val);
+ }
+
+ var array = devices.ToArray();
+ return new QueryResult<DeviceInfo>
+ {
+ Items = array,
+ TotalRecordCount = array.Length
+ };
}
public Task DeleteDevice(string id)
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index e1e8da5c5..a6f9f0675 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -1142,6 +1142,15 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.SeasonId = episodeSeason.Id.ToString("N");
dto.SeasonName = episodeSeason.Name;
}
+
+ if (fields.Contains(ItemFields.SeriesGenres))
+ {
+ var episodeseries = episode.Series;
+ if (episodeseries != null)
+ {
+ dto.SeriesGenres = episodeseries.Genres.ToList();
+ }
+ }
}
// Add SeriesInfo
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index e06720192..bfdfc03ba 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -736,16 +736,27 @@ namespace MediaBrowser.Server.Implementations.Library
}
private UserRootFolder _userRootFolder;
+ private readonly object _syncLock = new object();
public Folder GetUserRootFolder()
{
if (_userRootFolder == null)
{
- var userRootPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
+ lock (_syncLock)
+ {
+ if (_userRootFolder == null)
+ {
+ var userRootPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
- Directory.CreateDirectory(userRootPath);
+ Directory.CreateDirectory(userRootPath);
- _userRootFolder = GetItemById(GetNewItemId(userRootPath, typeof(UserRootFolder))) as UserRootFolder ??
- (UserRootFolder)ResolvePath(new DirectoryInfo(userRootPath));
+ _userRootFolder = GetItemById(GetNewItemId(userRootPath, typeof(UserRootFolder))) as UserRootFolder;
+
+ if (_userRootFolder == null)
+ {
+ _userRootFolder = (UserRootFolder)ResolvePath(new DirectoryInfo(userRootPath));
+ }
+ }
+ }
}
return _userRootFolder;
diff --git a/MediaBrowser.Server.Implementations/Library/MusicManager.cs b/MediaBrowser.Server.Implementations/Library/MusicManager.cs
index 7ffbab860..b8c29c19b 100644
--- a/MediaBrowser.Server.Implementations/Library/MusicManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/MusicManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Playlists;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -53,6 +54,18 @@ namespace MediaBrowser.Server.Implementations.Library
return GetInstantMixFromGenres(genres, user);
}
+ public IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user)
+ {
+ var genres = item
+ .GetRecursiveChildren(user, true)
+ .OfType<Audio>()
+ .SelectMany(i => i.Genres)
+ .Concat(item.Genres)
+ .Distinct(StringComparer.OrdinalIgnoreCase);
+
+ return GetInstantMixFromGenres(genres, user);
+ }
+
public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user)
{
var inputItems = user.RootFolder.GetRecursiveChildren(user);
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 8fceb7f53..9f714cfc5 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -168,7 +168,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<MusicVideo>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, collectionType);
+ return FindMovie<MusicVideo>(args.Path, args.Parent, args.FileSystemChildren.ToList(), args.DirectoryService, collectionType, false);
}
if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase))
diff --git a/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs b/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs
index 23fed905a..05cbfede0 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.LiveTv
{
- class RefreshChannelsScheduledTask : IScheduledTask, IConfigurableScheduledTask
+ class RefreshChannelsScheduledTask : IScheduledTask, IConfigurableScheduledTask, IHasKey
{
private readonly ILiveTvManager _liveTvManager;
@@ -59,5 +59,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
get { return true; }
}
+
+ public string Key
+ {
+ get { return "RefreshGuide"; }
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
index 81c5ef633..81f648728 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ar.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 e84d0892f..d0dfd608b 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ca.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 008c3bf27..9f2da7797 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 5aca8c406..4bd7d3103 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/da.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 257716dd5..9065404b6 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Lade G\u00e4ste ein",
"ButtonLinkMyMediaBrowserAccount": "Verkn\u00fcpfe jetzt meinen Account",
"MessageConnectAccountRequiredToInviteGuest": "Um G\u00e4ste einladen zu k\u00f6nnen, musst du zuerst deinen Media Browser Account auf diesem Server verkn\u00fcpfen.",
- "ButtonSync": "Synchronisieren"
+ "ButtonSync": "Synchronisieren",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Synchronisieren",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 ca51e93be..20c9de1ef 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 72bca0232..fec45e70c 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_GB.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 709d260b2..369299be0 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/en_US.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 2bd8ca507..d2957340c 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 bf00b5454..65ae26120 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Agregar un Invitado",
"ButtonLinkMyMediaBrowserAccount": "Enlazar mi cuenta ahora",
"MessageConnectAccountRequiredToInviteGuest": "Para poder agregar invitados primero necesitas vincular tu cuenta de Media Browser a este servidor.",
- "ButtonSync": "Sinc"
+ "ButtonSync": "Sinc",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sinc",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json
index a1fa3c2ad..e9c6263e2 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fi.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 144eb1207..b4f053338 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Inviter une personne",
"ButtonLinkMyMediaBrowserAccount": "Lier \u00e0 mon compte maintenant",
"MessageConnectAccountRequiredToInviteGuest": "Pour inviter des personnes vous devez d'abord lier votre compte Media Browser \u00e0 ce serveur.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 77ea8846d..7d268200b 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/he.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json
index 188bc25e9..ef186d800 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/hr.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 b8e95864b..8e324b335 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/it.json
@@ -25,8 +25,8 @@
"NoPluginConfigurationMessage": "Questo Plugin non \u00e8 stato configurato.",
"NoPluginsInstalledMessage": "non ci sono Plugins installati.",
"BrowsePluginCatalogMessage": "Sfoglia il catalogo dei Plugins.",
- "MessageKeyEmailedTo": "Key emailed to {0}.",
- "MessageKeysLinked": "Keys linked.",
+ "MessageKeyEmailedTo": "Chiave inviata email a {0}.",
+ "MessageKeysLinked": "Chiave Linked.",
"HeaderConfirmation": "Conferme",
"MessageKeyUpdated": "Grazie. La vostra chiave supporter \u00e8 stato aggiornato.",
"MessageKeyRemoved": "Grazie. La vostra chiave supporter \u00e8 stata rimossa.",
@@ -41,7 +41,7 @@
"LabelCancelled": "(cancellato)",
"LabelFailed": "(fallito)",
"LabelAbortedByServerShutdown": "(Interrotto dalla chiusura del server)",
- "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
+ "LabelScheduledTaskLastRan": "Ultima esecuzione {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Elimina Operazione pianificata",
"HeaderTaskTriggers": "Operazione Pianificata",
"MessageDeleteTaskTrigger": "Sei sicuro di voler cancellare questo evento?",
@@ -285,7 +285,7 @@
"LabelPremiereProgram": "PREMIERE",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Cambia il tipo di cartella",
- "HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the folder with the new type.",
+ "HeaderChangeFolderTypeHelp": "Per modificare il tipo, rimuovere e ricostruire la cartella con il nuovo tipo.",
"HeaderAlert": "Avviso",
"MessagePleaseRestart": "Si prega di riavviare per completare l'aggiornamento.",
"ButtonRestart": "Riavvia",
@@ -321,7 +321,7 @@
"ButtonSelect": "Seleziona",
"ButtonNew": "Nuovo",
"MessageInternetExplorerWebm": "Se utilizzi internet Explorer installa WebM plugin",
- "HeaderVideoError": "Video Error",
+ "HeaderVideoError": "Video Errore",
"ButtonAddToPlaylist": "Aggiungi alla playlist",
"HeaderAddToPlaylist": "Aggiungi alla playlist",
"LabelName": "Nome:",
@@ -447,7 +447,7 @@
"MessageYouHaveALifetimeMembership": "Avete un abbonamento sostenitore vita. \u00c8 possibile fornire ulteriori donazioni in una sola volta o in modo ricorrente utilizzando le seguenti opzioni. Grazie per il sostegno Media Browser.",
"MessageYouHaveAnActiveRecurringMembership": "Si dispone di un attivo {0} appartenenza. \u00c8 possibile aggiornare il vostro piano utilizzando le opzioni di seguito.",
"ButtonDelete": "Elimina",
- "HeaderMediaBrowserAccountAdded": "Media Browser Account Added",
+ "HeaderMediaBrowserAccountAdded": "Media Browser utente aggiunto",
"MessageMediaBrowserAccountAdded": "Media Browser Account Aggiunto",
"MessagePendingMediaBrowserAccountAdded": "L'account Media Browser \u00e8 stato aggiunto a questo utente. Una e-mail sar\u00e0 inviata al proprietario del conto. L'invito dovr\u00e0 essere confermato cliccando su un link all'interno della mail.",
"HeaderMediaBrowserAccountRemoved": "Account Media Browser rimosso",
@@ -533,7 +533,7 @@
"HeaderOtherItems": "Altri elmenti",
"ButtonFullReview": "Trama completa",
"ValueAsRole": "Come {0}",
- "ValueGuestStar": "Guest star",
+ "ValueGuestStar": "Personaggi famosi",
"MediaInfoSize": "Dimensione",
"MediaInfoPath": "Percorso",
"MediaInfoFormat": "Formato",
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invita Ospite",
"ButtonLinkMyMediaBrowserAccount": "Collega il mio account",
"MessageConnectAccountRequiredToInviteGuest": "Per invitare gli ospiti \u00e8 necessario collegare prima il tuo account browser media a questo server.",
- "ButtonSync": "Sinc."
+ "ButtonSync": "Sinc.",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sinc",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 5f2c7b2bc..8505ed281 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -638,5 +638,19 @@
"ButtonSync": "Sync",
"SyncMedia": "Sync Media",
"HeaderCancelSyncJob": "Cancel Sync",
- "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?"
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
}
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
index 6ad161351..a3f9dc49e 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
@@ -30,7 +30,7 @@
"HeaderConfirmation": "\u0420\u0430\u0441\u0442\u0430\u0443",
"MessageKeyUpdated": "\u049a\u043e\u043b\u0434\u0430\u0443\u0448\u044b \u043a\u0456\u043b\u0442\u0456\u04a3\u0456\u0437 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b.",
"MessageKeyRemoved": "\u049a\u043e\u043b\u0434\u0430\u0443\u0448\u044b \u043a\u0456\u043b\u0442\u0456\u04a3\u0456\u0437 \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0434\u044b.",
- "ErrorLaunchingChromecast": "Chromecast \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u0416\u0430\u0431\u0434\u044b\u0493\u044b\u04a3\u044b\u0437 \u0441\u044b\u043c\u0441\u044b\u0437 \u0436\u0435\u043b\u0456\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u044b\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0456\u04a3\u0456\u0437.",
+ "ErrorLaunchingChromecast": "Chromecast \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u04a3\u044b\u0437 \u0441\u044b\u043c\u0441\u044b\u0437 \u0436\u0435\u043b\u0456\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u044b\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0456\u04a3\u0456\u0437.",
"HeaderSearch": "\u0406\u0437\u0434\u0435\u0443",
"LabelArtist": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b",
"LabelMovie": "\u0424\u0438\u043b\u044c\u043c",
@@ -119,7 +119,7 @@
"MessagePleaseSelectOneItem": "\u0415\u04a3 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 \u0431\u0456\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0456 \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
"MessagePleaseSelectTwoItems": "\u0415\u04a3 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 \u0435\u043a\u0456 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0456 \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
"MessageTheFollowingItemsWillBeGrouped": "\u041a\u0435\u043b\u0435\u0441\u0456 \u0442\u0443\u044b\u043d\u0434\u044b\u043b\u0430\u0440 \u0431\u0456\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043a\u0435 \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b:",
- "MessageConfirmItemGrouping": "Media Browser \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0456 \u0436\u0430\u0431\u0434\u044b\u049b \u0436\u04d9\u043d\u0435 \u0436\u0435\u043b\u0456 \u04e9\u043d\u0456\u043c\u0434\u0456\u043b\u0456\u043a\u0442\u0435\u0440\u0456\u043d\u0435 \u043d\u0435\u0433\u0456\u0437\u0434\u0435\u043b\u0456\u043d\u0456\u043f \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u043e\u04a3\u0442\u0430\u0439\u043b\u044b \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u0439\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?",
+ "MessageConfirmItemGrouping": "Media Browser \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0456 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u0436\u04d9\u043d\u0435 \u0436\u0435\u043b\u0456 \u04e9\u043d\u0456\u043c\u0434\u0456\u043b\u0456\u043a\u0442\u0435\u0440\u0456\u043d\u0435 \u043d\u0435\u0433\u0456\u0437\u0434\u0435\u043b\u0456\u043d\u0456\u043f \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u043e\u04a3\u0442\u0430\u0439\u043b\u044b \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u0439\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?",
"HeaderResume": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443",
"HeaderMyViews": "\u041c\u0435\u043d\u0456\u04a3 \u0430\u0441\u043f\u0435\u043a\u0442\u0442\u0435\u0440\u0456\u043c",
"HeaderLibraryFolders": "\u0422\u0430\u0441\u0443\u0448\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b",
@@ -194,7 +194,7 @@
"LabelCurrentPath": "\u0410\u0493\u044b\u043c\u0434\u044b\u049b \u0436\u043e\u043b:",
"HeaderSelectMediaPath": "\u0422\u0430\u0441\u0443\u0448\u044b \u0436\u043e\u043b\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u0443",
"ButtonNetwork": "\u0416\u0435\u043b\u0456",
- "MessageDirectoryPickerInstruction": "\u0416\u0435\u043b\u0456 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456 \u0431\u0430\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440 \u043e\u0440\u043d\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0441\u0430, \u0436\u0435\u043b\u0456\u043b\u0456\u043a \u0436\u043e\u043b\u0434\u0430\u0440 \u049b\u043e\u043b\u043c\u0435\u043d \u0435\u043d\u0433\u0456\u0437\u0456\u043b\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d. \u041c\u044b\u0441\u0430\u043b\u044b, {0} \u043d\u0435\u043c\u0435\u0441\u0435 {1}.",
+ "MessageDirectoryPickerInstruction": "\u0416\u0435\u043b\u0456 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456 \u0431\u0430\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437 \u043e\u0440\u043d\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0441\u0430, \u0436\u0435\u043b\u0456\u043b\u0456\u043a \u0436\u043e\u043b\u0434\u0430\u0440 \u049b\u043e\u043b\u043c\u0435\u043d \u0435\u043d\u0433\u0456\u0437\u0456\u043b\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d. \u041c\u044b\u0441\u0430\u043b\u044b, {0} \u043d\u0435\u043c\u0435\u0441\u0435 {1}.",
"HeaderMenu": "\u041c\u04d9\u0437\u0456\u0440",
"ButtonOpen": "\u0410\u0448\u0443",
"ButtonOpenInNewTab": "\u0416\u0430\u04a3\u0430 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0434\u0430 \u0430\u0448\u0443",
@@ -573,18 +573,18 @@
"LabelShortRatingDescription": "\u0411\u0430\u0493\u0430\u043b\u0430\u0443\u0434\u044b\u04a3 \u049b\u044b\u0441\u049b\u0430 \u0430\u049b\u043f\u0430\u0440\u044b:",
"OptionIRecommendThisItem": "\u041e\u0441\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0456 \u04b1\u0441\u044b\u043d\u0430\u043c\u044b\u043d",
"WebClientTourContent": "\u0416\u0430\u049b\u044b\u043d\u0434\u0430 \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456, \u043a\u0435\u043b\u0435\u0441\u0456 \u044d\u043f\u0438\u0437\u043e\u0434\u0442\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u0442.\u0431. \u049b\u0430\u0440\u0430\u04a3\u044b\u0437. \u0416\u0430\u0441\u044b\u043b \u0448\u0435\u043d\u0431\u0435\u0440\u043b\u0435\u0440 \u0441\u0456\u0437\u0434\u0435 \u049b\u0430\u043d\u0448\u0430 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u043c\u0430\u0493\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440 \u0431\u0430\u0440\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456.",
- "WebClientTourMovies": "\u0492\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0456 \u0431\u0430\u0440 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0444\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456, \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0442.\u0431. \u043e\u0439\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.",
+ "WebClientTourMovies": "\u0492\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0456 \u0431\u0430\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u0444\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456, \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0442.\u0431. \u043e\u0439\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.",
"WebClientTourMouseOver": "\u041c\u0430\u04a3\u044b\u0437\u0434\u044b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u049b\u0430 \u0436\u044b\u043b\u0434\u0430\u043c \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0441\u044b\u0431\u0456\u0440 \u043f\u043e\u0441\u0442\u0435\u0440\u0434\u0456\u04a3 \u04b1\u0441\u0442\u0456\u043d\u0434\u0435 \u0442\u0456\u043d\u0442\u0443\u0440\u0434\u0456\u04a3 \u043a\u04e9\u0440\u0441\u0435\u0442\u043a\u0456\u0448\u0456\u043d \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u044b\u04a3\u044b\u0437",
"WebClientTourTapHold": "\u041c\u04d9\u0442\u0456\u043d\u043c\u04d9\u043d\u0434\u0456\u043a \u043c\u04d9\u0437\u0456\u0440 \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0441\u044b\u0431\u0456\u0440 \u043f\u043e\u0441\u0442\u0435\u0440\u0434\u0456 \u0442\u04af\u0440\u0442\u0456\u043f \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0442\u0456\u043d\u0442\u0443\u0456\u0440\u0434\u0456\u04a3 \u043e\u04a3 \u0436\u0430\u049b \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437",
"WebClientTourMetadataManager": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u0448\u044b\u0441\u044b\u043d\u0438 \u0430\u0448\u0443 \u04af\u0448\u0456\u043d \u04e8\u04a3\u0434\u0435\u0443 \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u0431\u0430\u0441\u044b\u04a3\u044b\u0437",
- "WebClientTourPlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0436\u04d9\u043d\u0435 \u043b\u0435\u0437\u0434\u0456\u043a \u049b\u043e\u0441\u043f\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u0435\u04a3\u0456\u043b \u0436\u0430\u0441\u0430\u04a3\u044b\u0437, \u0436\u04d9\u043d\u0435 \u043e\u043b\u0430\u0440\u0434\u044b \u04d9\u0440\u049b\u0430\u0439\u0441\u044b \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430 \u043e\u0439\u043d\u0430\u0442\u044b\u04a3\u044b\u0437",
+ "WebClientTourPlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0436\u04d9\u043d\u0435 \u043b\u0435\u0437\u0434\u0456\u043a \u049b\u043e\u0441\u043f\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u0435\u04a3\u0456\u043b \u0436\u0430\u0441\u0430\u04a3\u044b\u0437, \u0436\u04d9\u043d\u0435 \u043e\u043b\u0430\u0440\u0434\u044b \u04d9\u0440\u049b\u0430\u0439\u0441\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u044b\u04a3\u044b\u0437",
"WebClientTourCollections": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456 \u0431\u0456\u0440\u0433\u0435 \u0442\u043e\u043f\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u0444\u0438\u043b\u044c\u043c \u0436\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440\u044b\u043d \u0436\u0430\u0441\u0430\u04a3\u044b\u0437",
"WebClientTourUserPreferences1": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456 Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d\u0434\u0430 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u04a3\u044b\u0437\u0434\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043b\u0443 \u0436\u043e\u043b\u044b\u043d \u0442\u0435\u04a3\u0448\u0435\u0443\u0456\u043d\u0435 \u0441\u0456\u0437\u0433\u0435 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456",
"WebClientTourUserPreferences2": "\u04d8\u0440\u0431\u0456\u0440 Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b \u04af\u0448\u0456\u043d, \u0434\u044b\u0431\u044b\u0441 \u043f\u0435\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0442\u0456\u043b\u0434\u0456\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d \u0431\u0456\u0440 \u0440\u0435\u0442 \u0442\u0435\u04a3\u0448\u0435\u04a3\u0456\u0437",
"WebClientTourUserPreferences3": "\u04b0\u043d\u0430\u0442\u0443\u044b\u04a3\u044b\u0437 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0493\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0456\u043d\u0456\u04a3 \u0431\u0430\u0441\u0442\u044b \u0431\u0435\u0442\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0440\u0435\u0441\u0456\u043c\u0434\u0435\u04a3\u0456\u0437",
"WebClientTourUserPreferences4": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456, \u0442\u0430\u049b\u044b\u0440\u044b\u043f\u0442\u044b\u049b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u0441\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440\u0434\u044b \u0442\u0435\u04a3\u0448\u0435\u04a3\u0456\u0437",
"WebClientTourMobile1": "\u0492\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0456 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0434\u0430\u0440\u0434\u0430 \u0436\u04d9\u043d\u0435 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0442\u0435\u0440\u0434\u0435 \u0442\u0430\u043c\u0430\u0448\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456",
- "WebClientTourMobile2": "\u0441\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0431\u0430\u0441\u049b\u0430 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b",
+ "WebClientTourMobile2": "\u0441\u043e\u043d\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0431\u0430\u0441\u049b\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b",
"MessageEnjoyYourStay": "\u0416\u0430\u0493\u044b\u043c\u0434\u044b \u0435\u0440\u043c\u0435\u043a \u0435\u0442\u0456\u04a3\u0456\u0437",
"DashboardTourDashboard": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u0436\u04d9\u043d\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u0431\u0430\u049b\u044b\u043b\u0430\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d\u0435 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u041a\u0456\u043c \u043d\u0435 \u0456\u0441\u0442\u0435\u0433\u0435\u043d\u0456\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u0439\u0434\u0430 \u0442\u04b1\u0440\u0493\u0430\u043d\u044b\u043d \u0431\u0456\u043b\u0456\u043f \u0436\u0430\u0442\u0430\u0441\u044b\u0437.",
"DashboardTourUsers": "\u0414\u043e\u0441\u0442\u0430\u0440\u044b\u04a3\u044b\u0437 \u0431\u0435\u043d \u043e\u0442\u0431\u0430\u0441\u044b\u04a3\u044b\u0437 \u04d9\u0440\u049b\u0430\u0439\u0441\u044b\u043d\u0430 \u04e9\u0437\u0456\u043d\u0456\u04a3 \u049b\u04b1\u049b\u044b\u049b\u0442\u0430\u0440\u044b, \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443\u044b, \u043c\u0430\u0437\u043c\u04b1\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b \u0436\u04d9\u043d\u0435 \u0442.\u0431. \u0431\u0430\u0440 \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u043b\u0435\u0440\u0456\u043d \u0436\u0435\u04a3\u0456\u043b \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.",
@@ -592,14 +592,14 @@
"DashboardTourChapters": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0434\u0456 \u049b\u0430\u0440\u0430\u0493\u0430\u043d \u043a\u0435\u0437\u0434\u0435 \u04b1\u043d\u0430\u043c\u0434\u044b\u043b\u0430\u0443 \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c \u04af\u0448\u0456\u043d \u0441\u0430\u0445\u043d\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0442\u0443\u0434\u044b\u0440\u0443\u044b\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.",
"DashboardTourSubtitles": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0433\u0435 \u049b\u0430\u0439 \u0442\u0456\u043b\u0434\u0435 \u0431\u043e\u043b\u0441\u044b\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u04a3\u0456\u0437.",
"DashboardTourPlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u0434\u0456, \u043c\u044b\u0441\u0430\u043b\u044b, \u0431\u0435\u0439\u043d\u0435\u043b\u0456\u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0430\u0440\u043d\u0430\u043b\u0430\u0440\u044b\u043d, \u044d\u0444\u0438\u0440\u043b\u0456\u043a \u0442\u0434, \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0440\u0456\u043d \u0436\u0456\u043d\u0435 \u0442.\u0431., \u043e\u0440\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.",
- "DashboardTourNotifications": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043e\u049b\u0438\u0493\u0430\u043b\u0430\u0440\u044b \u0442\u0443\u0440\u0430\u043b\u044b \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440\u0434\u044b \u04b1\u0442\u049b\u044b\u0440 \u0436\u0430\u0431\u0434\u044b\u0493\u044b\u04a3\u044b\u0437\u0493\u0430, \u044d-\u043f\u043e\u0448\u0442\u0430\u04a3\u044b\u0437\u0493\u0430 \u0436\u04d9\u043d\u0435 \u0442.\u0431.\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
+ "DashboardTourNotifications": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043e\u049b\u0438\u0493\u0430\u043b\u0430\u0440\u044b \u0442\u0443\u0440\u0430\u043b\u044b \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440\u0434\u044b \u04b1\u0442\u049b\u044b\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u04a3\u044b\u0437\u0493\u0430, \u044d-\u043f\u043e\u0448\u0442\u0430\u04a3\u044b\u0437\u0493\u0430 \u0436\u04d9\u043d\u0435 \u0442.\u0431.\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.",
"DashboardTourScheduledTasks": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u04b1\u0437\u0430\u049b \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u0435\u04a3\u0456\u043b \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u04a3\u044b\u0437. \u0411\u04b1\u043b\u0430\u0440 \u049b\u0430\u0448\u0430\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u043d\u0434\u0430\u0439 \u0436\u0438\u0456\u043b\u0456\u043a\u043f\u0435\u043d \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0430\u0442\u044b\u043d\u044b\u043d \u0448\u0435\u0448\u0456\u04a3\u0456\u0437.",
"DashboardTourMobile": "Media Browser \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0434\u0430\u0440\u0434\u0430 \u0436\u04d9\u043d\u0435 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0442\u0435\u0440\u0434\u0435 \u0442\u0430\u043c\u0430\u0448\u0430 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0439\u0434\u0456. \u0421\u0435\u0440\u0432\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u04d9\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430, \u04d9\u0440 \u0436\u0435\u0440\u0434\u0435 \u049b\u043e\u043b\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u0430\u043b\u0430\u049b\u0430\u043d\u044b\u043d\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u04a3\u044b\u0437.",
"MessageRefreshQueued": "\u041a\u04e9\u043a\u0435\u0439\u0442\u0435\u0441\u0442\u0456 \u0435\u0442\u0443\u0456 \u043a\u0435\u0437\u0435\u043a\u0442\u0435",
- "TabDevices": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440",
+ "TabDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440",
"DeviceLastUsedByUserName": "{0} \u0430\u0440\u049b\u044b\u043b\u044b \u0435\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0493\u0430\u043d",
- "HeaderDeleteDevice": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u044b \u0436\u043e\u044e",
- "DeleteDeviceConfirmation": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u044b \u0436\u043e\u044e \u049b\u0430\u0436\u0435\u0442 \u043f\u0435? \u0411\u04b1\u043b \u043a\u0435\u043b\u0435\u0441\u0456 \u0440\u0435\u0442\u0442\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u043e\u0441\u044b\u0434\u0430\u043d \u043a\u0456\u0440\u0433\u0435\u043d\u0434\u0435 \u049b\u0430\u0439\u0442\u0430 \u043f\u0430\u0439\u0434\u0430 \u0431\u043e\u043b\u0430\u0434\u044b.",
+ "HeaderDeleteDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b \u0436\u043e\u044e",
+ "DeleteDeviceConfirmation": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b \u0436\u043e\u044e \u049b\u0430\u0436\u0435\u0442 \u043f\u0435? \u0411\u04b1\u043b \u043a\u0435\u043b\u0435\u0441\u0456 \u0440\u0435\u0442\u0442\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u043e\u0441\u044b\u0434\u0430\u043d \u043a\u0456\u0440\u0433\u0435\u043d\u0434\u0435 \u049b\u0430\u0439\u0442\u0430 \u043f\u0430\u0439\u0434\u0430 \u0431\u043e\u043b\u0430\u0434\u044b.",
"LabelEnableCameraUploadFor": "\u041c\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d \u043a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u0443:",
"HeaderSelectUploadPath": "\u041a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u0443 \u0436\u043e\u043b\u044b\u043d \u0442\u0430\u04a3\u0434\u0430\u0443",
"LabelEnableCameraUploadForHelp": "Media Browser \u0456\u0448\u0456\u043d\u0435 \u043a\u0456\u0440\u0433\u0435\u043d\u0434\u0435 \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u0443\u043b\u0430\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u04e9\u043d\u0434\u0456\u043a \u0440\u0435\u0436\u0456\u043c\u0456\u043d\u0434\u0435 \u04e9\u0442\u0435\u0434\u0456.",
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "\u049a\u043e\u043d\u0430\u049b\u0442\u044b \u0448\u0430\u049b\u044b\u0440\u0443",
"ButtonLinkMyMediaBrowserAccount": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u043c\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0443",
"MessageConnectAccountRequiredToInviteGuest": "\u049a\u043e\u043d\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0448\u0430\u049b\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0435\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0433\u0435 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u0440\u0443\u044b\u04a3\u044b\u0437 \u049b\u0430\u0436\u0435\u0442.",
- "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e"
+ "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 a82d2b462..89aefed9d 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ms.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 baae629e1..a5fd9bb9b 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nb.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Synk"
+ "ButtonSync": "Synk",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Synk",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 42917eacc..c8569dc9f 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Nodig gast uit",
"ButtonLinkMyMediaBrowserAccount": "Koppel mijn account nu",
"MessageConnectAccountRequiredToInviteGuest": "Om gasten uit te kunnen nodigen moet je Media Browser account aan deze server gekoppeld worden.",
- "ButtonSync": "Synchronisatie"
+ "ButtonSync": "Synchronisatie",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Synchronisatie",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 5379e137a..98a8b5947 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pl.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 30f664681..9e71e9516 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_BR.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Convidar Usu\u00e1rio",
"ButtonLinkMyMediaBrowserAccount": "Conectar minha conta agora",
"MessageConnectAccountRequiredToInviteGuest": "Para convidar usu\u00e1rios voc\u00ea necessita primeiro conectar sua conta Media Browser com este servidor.",
- "ButtonSync": "Sincronizar"
+ "ButtonSync": "Sincronizar",
+ "SyncMedia": "Sincronizar M\u00eddia",
+ "HeaderCancelSyncJob": "Cancelar Sincroniza\u00e7\u00e3o",
+ "CancelSyncJobConfirmation": "Deseja realmente cancelar esta tarefa de sincroniza\u00e7\u00e3o?",
+ "TabSync": "Sincroniza\u00e7\u00e3o",
+ "MessagePleaseSelectDeviceToSyncTo": "Por favor, selecione um dispositivo para sincronizar.",
+ "MessageSyncJobCreated": "Tarefa de sincroniza\u00e7\u00e3o criada.",
+ "LabelSyncTo": "Sincronizar para:",
+ "LabelSyncJobName": "Nome da tarefa de sincroniza\u00e7\u00e3o:",
+ "LabelQuality": "Qualidade:",
+ "OptionHigh": "Alta",
+ "OptionMedium": "M\u00e9dia",
+ "OptionLow": "Baixa",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 06c731d67..5007ae444 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sincronizar"
+ "ButtonSync": "Sincronizar",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 50ed192e9..93d4a64a3 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0441\u0442\u044f",
"ButtonLinkMyMediaBrowserAccount": "\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
"MessageConnectAccountRequiredToInviteGuest": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0439, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Media Browser \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.",
- "ButtonSync": "\u0421\u0438\u043d\u0445\u0440-\u0442\u044c"
+ "ButtonSync": "\u0421\u0438\u043d\u0445\u0440-\u0442\u044c",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "\u0421\u0438\u043d\u0445\u0440-\u0438\u044f",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 c568c8664..a0b86f576 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/sv.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Synk"
+ "ButtonSync": "Synk",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Synk",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json
index 1488fd151..e8ecf0de0 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/tr.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 2dbaa24c4..e94761156 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/vi.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json
index 3d2149464..ad9a6c6a5 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_CN.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "\u540c\u6b65"
+ "ButtonSync": "\u540c\u6b65",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "\u540c\u6b65",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 22672ff29..706299704 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/zh_TW.json
@@ -627,5 +627,22 @@
"HeaderInviteGuest": "Invite Guest",
"ButtonLinkMyMediaBrowserAccount": "Link my account now",
"MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server.",
- "ButtonSync": "Sync"
+ "ButtonSync": "Sync",
+ "SyncMedia": "Sync Media",
+ "HeaderCancelSyncJob": "Cancel Sync",
+ "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+ "TabSync": "Sync",
+ "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
+ "MessageSyncJobCreated": "Sync job created.",
+ "LabelSyncTo": "Sync to:",
+ "LabelSyncJobName": "Sync job name:",
+ "LabelQuality": "Quality:",
+ "OptionHigh": "High",
+ "OptionMedium": "Medium",
+ "OptionLow": "Low",
+ "HeaderSettings": "Settings",
+ "OptionAutomaticallySyncNewContent": "Automatically sync new content",
+ "OptionAutomaticallySyncNewContentHelp": "New content added to these folders will be automatically synced to the device.",
+ "OptionSyncUnwatchedVideosOnly": "Sync unwatched videos only",
+ "OptionSyncUnwatchedVideosOnlyHelp": "Only unwatched videos will be synced, and videos will be removed from the device as they are watched."
} \ 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 794755a50..cb66848d7 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ar.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ar.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 549d1d173..8af187392 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ca.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ca.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 d702540ac..240475943 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/cs.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/cs.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 d4895c47a..c9f2b9cc0 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/da.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/da.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 8f10acd06..e4b88c9bd 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/de.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/de.json
@@ -98,7 +98,7 @@
"TabSuggested": "Vorgeschlagen",
"TabLatest": "Neueste",
"TabUpcoming": "Bevorstehend",
- "TabShows": "Shows",
+ "TabShows": "Serien",
"TabEpisodes": "Episoden",
"TabGenres": "Genres",
"TabPeople": "Personen",
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "Laufende Aufgaben",
"HeaderActiveDevices": "Aktive Ger\u00e4te",
"HeaderPendingInstallations": "Ausstehende Installationen",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "Server Informationen",
"ButtonRestartNow": "Jetzt neustarten",
"ButtonRestart": "Neu starten",
"ButtonShutdown": "Herunterfahren",
@@ -1080,8 +1080,8 @@
"LabelVoteCount": "Stimmen:",
"LabelMetascore": "Metascore:",
"LabelCriticRating": "Kritiker Bewertung:",
- "LabelCriticRatingSummary": "Kritiker Bewertungszusammenfassung:",
- "LabelAwardSummary": "Auszeichnungszusammenfassung:",
+ "LabelCriticRatingSummary": "Kritikerbewertungen:",
+ "LabelAwardSummary": "Auszeichnungen:",
"LabelWebsite": "Website:",
"LabelTagline": "Tagline:",
"LabelOverview": "\u00dcbersicht:",
@@ -1097,7 +1097,7 @@
"LabelCustomRating": "Eigene Bewertung:",
"LabelBudget": "Budget",
"LabelRevenue": "Einnahmen ($):",
- "LabelOriginalAspectRatio": "Originales Seitenverh\u00e4ltnis:",
+ "LabelOriginalAspectRatio": "Original Seitenverh\u00e4ltnis:",
"LabelPlayers": "Schauspieler:",
"Label3DFormat": "3D Format:",
"HeaderAlternateEpisodeNumbers": "Alternative Episodennummern",
@@ -1276,6 +1276,8 @@
"HeaderAddTag": "F\u00fcge Tag hinzu",
"LabelBlockItemsWithTags": "Blockiere Inhalte mit folgenden Tags:",
"LabelTag": "Tag:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimit": "Begrenze auf ein eingebundenes Bild",
+ "LabelEnableSingleImageInDidlLimitHelp": "Einige Ger\u00e4te zeigen m\u00f6glicherweise Darstellungsfehler wenn mehrere Bilder mit Didl eingebunden wurden.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 9b44ce488..7f7213735 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/el.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/el.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 1c0a7fcb3..5b5d6f46e 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 44547808b..2230ee972 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/en_US.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/en_US.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 ada5cfc22..f4bdae125 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/es.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/es.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 7265ab453..b12373d15 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "Tareas en Ejecuci\u00f3n",
"HeaderActiveDevices": "Dispositivos Activos",
"HeaderPendingInstallations": "Instalaciones Pendientes",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "Informaci\u00f3n del Servidor",
"ButtonRestartNow": "Reiniciar Ahora",
"ButtonRestart": "Reiniciar",
"ButtonShutdown": "Apagar",
@@ -1276,6 +1276,8 @@
"HeaderAddTag": "Agregar Etiqueta",
"LabelBlockItemsWithTags": "Bloquear \u00edtems con etiquetas:",
"LabelTag": "Etiqueta:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimit": "Limitar a una sola imagen incrustada.",
+ "LabelEnableSingleImageInDidlLimitHelp": "Algunos dispositivos no renderisaran apropiadamente si hay m\u00faltiples im\u00e1genes incrustadas en el Didl",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/fi.json b/MediaBrowser.Server.Implementations/Localization/Server/fi.json
index 84cfe43bc..c23d5a708 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/fi.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/fi.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 a2f4f864d..0361928b4 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/fr.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/fr.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Bloquer les \u00e9l\u00e9ments contenant les tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 64f51f501..2e90ed5df 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/he.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/he.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/hr.json b/MediaBrowser.Server.Implementations/Localization/Server/hr.json
index 6ca9666f7..2a4612d34 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/hr.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/hr.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 cf8f7f081..b306eb372 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/it.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/it.json
@@ -5,7 +5,7 @@
"LabelSwagger": "Swagger",
"LabelStandard": "Standard",
"LabelApiDocumentation": "Api Documentation",
- "LabelDeveloperResources": "Developer Resources",
+ "LabelDeveloperResources": "Risorse programmatori",
"LabelBrowseLibrary": "Esplora la libreria",
"LabelConfigureMediaBrowser": "Configura Media Browser",
"LabelOpenLibraryViewer": "Apri visualizzatore libreria",
@@ -78,7 +78,7 @@
"ButtonAddLocalUser": "Aggiungi Utente locale",
"ButtonInviteUser": "Invita un utente",
"ButtonSave": "Salva",
- "ButtonResetPassword": "Reset Password",
+ "ButtonResetPassword": "Ripristina Password",
"LabelNewPassword": "Nuova Password:",
"LabelNewPasswordConfirm": "Nuova Password Conferma:",
"HeaderCreatePassword": "Crea Password",
@@ -110,7 +110,7 @@
"OptionLikes": "Belli",
"OptionDislikes": "Brutti",
"OptionActors": "Attori",
- "OptionGuestStars": "Guest Stars",
+ "OptionGuestStars": "Personaggi Famosi",
"OptionDirectors": "Registra",
"OptionWriters": "Scrittore",
"OptionProducers": "Produttore",
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "Operazione in corso",
"HeaderActiveDevices": "Dispositivi Connessi",
"HeaderPendingInstallations": "installazioni in coda",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "Informazioni Server",
"ButtonRestartNow": "Riavvia Adesso",
"ButtonRestart": "Riavvia",
"ButtonShutdown": "Arresta Server",
@@ -620,7 +620,7 @@
"AdditionalNotificationServices": "Sfoglia il catalogo plugin per installare i servizi di notifica aggiuntivi.",
"OptionAllUsers": "Tutti gli utenti",
"OptionAdminUsers": "Administrators",
- "OptionCustomUsers": "Custom",
+ "OptionCustomUsers": "Personalizza",
"ButtonArrowUp": "Su",
"ButtonArrowDown": "Gi\u00f9",
"ButtonArrowLeft": "Sinistra",
@@ -676,7 +676,7 @@
"HeaderCodecProfile": "Codec Profilo",
"HeaderCodecProfileHelp": "Profili Codec indicano i limiti di un dispositivo durante la riproduzione di codec specifici. Se una limitazione si applica poi saranno trascodificati media, anche se il codec \u00e8 configurato per riproduzione diretta.",
"HeaderContainerProfile": "Profilo Contenitore",
- "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.",
+ "HeaderContainerProfileHelp": "i Profili indicano i limiti di un dispositivo quando si riproduce in formati specifici. Se una limitazione si applica poi verranno transcodificati i media, anche se il formato \u00e8 configurato per la riproduzione diretta.",
"OptionProfileVideo": "Video",
"OptionProfileAudio": "Audio",
"OptionProfileVideoAudio": "Video Audio",
@@ -690,7 +690,7 @@
"LabelSupportedMediaTypes": "Tipi di media supportati:",
"TabIdentification": "identificazione",
"HeaderIdentification": "Identificazione",
- "TabDirectPlay": "Direct Play",
+ "TabDirectPlay": "Riproduzione Diretta",
"TabContainers": "contenitori",
"TabCodecs": "Codecs",
"TabResponses": "Risposte",
@@ -731,18 +731,18 @@
"LabelSerialNumber": "Numero di serie",
"LabelDeviceDescription": "Descrizione dispositivo",
"HeaderIdentificationCriteriaHelp": "Inserire almeno un criterio di identificazione.",
- "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.",
+ "HeaderDirectPlayProfileHelp": "Aggiungere \"profili riproduzione diretta\" per indicare che il dispositivo \u00e8 in grado di gestire in modo nativo.",
"HeaderTranscodingProfileHelp": "Aggiungere i profili di transcodifica per indicare quali formati da utilizzare quando \u00e8 richiesta la transcodifica.",
"HeaderResponseProfileHelp": "Profili di risposta forniscono un modo per personalizzare le informazioni inviate al dispositivo durante la riproduzione di alcuni tipi di 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.",
+ "LabelXDlnaDocHelp": "Determina il contenuto dell'elemento X_DLNACAP nella urn: schemas-DLNA-org: dispositivo 1-0 namespace.",
"LabelSonyAggregationFlags": "Sony aggregation flags:",
"LabelSonyAggregationFlagsHelp": "Determina il contenuto dell'elemento aggregationFlags nel urn: schemas-sonycom: namespace av.",
"LabelTranscodingContainer": "contenitore:",
"LabelTranscodingVideoCodec": "Video codec:",
- "LabelTranscodingVideoProfile": "Video profile:",
+ "LabelTranscodingVideoProfile": "Video profilo:",
"LabelTranscodingAudioCodec": "Audio codec:",
"OptionEnableM2tsMode": "Attiva modalit\u00e0 M2TS",
"OptionEnableM2tsModeHelp": "Attivare la modalit\u00e0 m2ts durante la codifica di mpegts.",
@@ -771,8 +771,8 @@
"LabelMessageText": "Testo del messaggio:",
"MessageNoAvailablePlugins": "Nessun plugin disponibili.",
"LabelDisplayPluginsFor": "Mostra plugin per:",
- "PluginTabMediaBrowserClassic": "MB Classic",
- "PluginTabMediaBrowserTheater": "MB Theater",
+ "PluginTabMediaBrowserClassic": "MB Classico",
+ "PluginTabMediaBrowserTheater": "MB Teatro",
"LabelEpisodeNamePlain": "Nome Episodio",
"LabelSeriesNamePlain": "Nome Serie",
"ValueSeriesNamePeriod": "Nome Serie",
@@ -939,7 +939,7 @@
"LabelMatchType": "Match type:",
"OptionEquals": "Uguale",
"OptionRegex": "Regex",
- "OptionSubstring": "Substring",
+ "OptionSubstring": "Sottostringa",
"TabView": "Vista",
"TabSort": "Ordina",
"TabFilter": "Filtra",
@@ -1135,7 +1135,7 @@
"OptionActor": "Attore",
"OptionComposer": "Compositore",
"OptionDirector": "Regista",
- "OptionGuestStar": "Guest star",
+ "OptionGuestStar": "Personaggi famosi",
"OptionProducer": "Produttore",
"OptionWriter": "Scrittore",
"LabelAirDays": "In onda da (gg):",
@@ -1160,7 +1160,7 @@
"LabelExtractChaptersDuringLibraryScan": "Estrarre immagini capitolo durante la scansione biblioteca",
"LabelExtractChaptersDuringLibraryScanHelp": "Se abilitata, le immagini capitolo verranno estratti quando i video vengono importati durante la scansione della libreria. Se disabilitata verranno estratti durante le immagini dei capitoli programmati compito, permettendo la scansione biblioteca regolare per completare pi\u00f9 velocemente.",
"LabelConnectGuestUserName": "I loro Utente o email di Media Browser",
- "LabelConnectUserName": "Media Browser username\/email:",
+ "LabelConnectUserName": "Media Browser utente\/email:",
"LabelConnectUserNameHelp": "Collega questo utente a un conto Media Browser per abilitare acceso rapido da Media Browser con qualsiasi applicazione senza dovere conoscere il indirrzo IP.",
"ButtonLearnMoreAboutMediaBrowserConnect": "Scopri di pi\u00f9 su Media Browser Connect",
"LabelExternalPlayers": "Player esterni:",
@@ -1216,7 +1216,7 @@
"HeaderCameraUploadHelp": "Caricare automaticamente foto e video presi dai vostri dispositivi mobili in Media Browser.",
"MessageNoDevicesSupportCameraUpload": "Al momento non si dispone di dispositivi che supportano il caricamento della fotocamera.",
"LabelCameraUploadPath": "Fotocamera percorso di upload:",
- "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used. If using a custom path it will also need to be added in the library setup area.",
+ "LabelCameraUploadPathHelp": "Selezionare un percorso di caricamento personalizzato, se lo si desidera. Se non specificato verr\u00e0 utilizzata una cartella predefinita. Se si utilizza un percorso personalizzato che dovr\u00e0 anche essere aggiunti nella zona di installazione della libreria.",
"LabelCreateCameraUploadSubfolder": "Creare una sottocartella per ogni dispositivo",
"LabelCreateCameraUploadSubfolderHelp": "Cartelle specifici possono essere assegnati a un dispositivo facendo clic su di esso dalla pagina Dispositivi.",
"LabelCustomDeviceDisplayName": "Nome da visualizzare:",
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 df57212fa..c017c3b8f 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/kk.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/kk.json
@@ -235,8 +235,8 @@
"OptionAllowDeleteLibraryContent": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0436\u043e\u044e \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
"OptionAllowManageLiveTv": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0436\u0430\u0437\u0443\u0434\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b\u043d\u0430 \u0440\u0443\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
"OptionAllowRemoteControlOthers": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0431\u0430\u0441\u049b\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
- "OptionAllowRemoteSharedDevices": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u043e\u0440\u0442\u0430\u049b \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
- "OptionAllowRemoteSharedDevicesHelp": "DLNA-\u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d \u043e\u0440\u0442\u0430\u049b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0435\u0441\u0435\u043f\u0442\u0435\u043b\u0456\u043d\u0435\u0434\u0456.",
+ "OptionAllowRemoteSharedDevices": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u043e\u0440\u0442\u0430\u049b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
+ "OptionAllowRemoteSharedDevicesHelp": "DLNA-\u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d \u043e\u0440\u0442\u0430\u049b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0435\u0441\u0435\u043f\u0442\u0435\u043b\u0456\u043d\u0435\u0434\u0456.",
"HeaderRemoteControl": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443",
"OptionMissingTmdbId": "TMDb Id \u0436\u043e\u049b",
"OptionIsHD": "HD",
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "\u041e\u0440\u044b\u043d\u0434\u0430\u043b\u044b\u043f \u0436\u0430\u0442\u049b\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430\u043b\u0430\u0440",
"HeaderActiveDevices": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440",
"HeaderPendingInstallations": "\u0411\u04e9\u0433\u0435\u043b\u0456\u0441 \u043e\u0440\u043d\u0430\u0442\u044b\u043c\u0434\u0430\u0440",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0456",
"ButtonRestartNow": "\u049a\u0430\u0437\u0456\u0440 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
"ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
"ButtonShutdown": "\u0416\u04b1\u043c\u044b\u0441\u0442\u044b \u0430\u044f\u049b\u0442\u0430\u0443",
@@ -674,15 +674,15 @@
"HeaderDirectPlayProfile": "\u0422\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderTranscodingProfile": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderCodecProfile": "\u041a\u043e\u0434\u0435\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
- "HeaderCodecProfileHelp": "\u041a\u043e\u0434\u0435\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043a\u043e\u0434\u0435\u043a\u0442\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u0434\u0435\u043a \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435\u0434\u0435 \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
+ "HeaderCodecProfileHelp": "\u041a\u043e\u0434\u0435\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043a\u043e\u0434\u0435\u043a\u0442\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u0434\u0435\u043a \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435\u0434\u0435 \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
"HeaderContainerProfile": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
- "HeaderContainerProfileHelp": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435\u0434\u0435 \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
+ "HeaderContainerProfileHelp": "\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u043d\u0430\u049b\u0442\u044b \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440 \u0430\u0440\u049b\u044b\u043b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u0448\u0435\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u0448\u0435\u043a\u0442\u0435\u0443 \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0441\u0430, \u0441\u043e\u043d\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0441\u0435\u0434\u0435 \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u043b\u044b\u043d\u0430\u0434\u044b.",
"OptionProfileVideo": "\u0411\u0435\u0439\u043d\u0435",
"OptionProfileAudio": "\u0414\u044b\u0431\u044b\u0441",
"OptionProfileVideoAudio": "\u0411\u0435\u0439\u043d\u0435 \u0414\u044b\u0431\u044b\u0441",
"OptionProfilePhoto": "\u0424\u043e\u0442\u043e",
"LabelUserLibrary": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0441\u044b",
- "LabelUserLibraryHelp": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u0430 \u049b\u0430\u0439 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0441\u044b\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437. \u04d8\u0434\u0435\u043f\u043a\u0456 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u04b1\u0440\u0430\u0441\u044b\u043d\u0430 \u0438\u0435\u043b\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.",
+ "LabelUserLibraryHelp": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 \u049b\u0430\u0439 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0441\u044b\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443\u0456\u043d \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437. \u04d8\u0434\u0435\u043f\u043a\u0456 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u04b1\u0440\u0430\u0441\u044b\u043d\u0430 \u0438\u0435\u043b\u0435\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.",
"OptionPlainStorageFolders": "\u0411\u0430\u0440\u043b\u044b\u049b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u0434\u044b \u0436\u0430\u0439 \u0441\u0430\u049b\u0442\u0430\u0443 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443",
"OptionPlainStorageFoldersHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0431\u0430\u0440\u043b\u044b\u049b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 DIDL \u0456\u0448\u0456\u043d\u0434\u0435 \"object.container.person.musicArtist\" \u0441\u0438\u044f\u049b\u0442\u044b \u043d\u0430\u049b\u0442\u044b\u043b\u0430\u0443 \u0442\u04af\u0440\u0456\u043d\u0456\u04a3 \u043e\u0440\u043d\u044b\u043d\u0430 \"object.container.storageFolder\" \u0431\u043e\u043b\u044b\u043f \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456.",
"OptionPlainVideoItems": "\u0411\u0430\u0440\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0434\u0456 \u0436\u0430\u0439 \u0431\u0435\u0439\u043d\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0456 \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443",
@@ -696,7 +696,7 @@
"TabResponses": "\u04ae\u043d \u049b\u0430\u0442\u0443\u043b\u0430\u0440",
"HeaderProfileInformation": "\u041f\u0440\u043e\u0444\u0430\u0439\u043b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u044b",
"LabelEmbedAlbumArtDidl": "Didl \u0456\u0448\u0456\u043d\u0435 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0435\u043d\u0434\u0456\u0440\u0443",
- "LabelEmbedAlbumArtDidlHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0493\u0430 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u04d9\u0434\u0456\u0441 \u049b\u0430\u0436\u0435\u0442. \u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0439\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437 \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
+ "LabelEmbedAlbumArtDidlHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0493\u0430 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u04d9\u0434\u0456\u0441 \u049b\u0430\u0436\u0435\u0442. \u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0439\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437 \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
"LabelAlbumArtPN": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 PN:",
"LabelAlbumArtHelp": "PN \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 \u04af\u0448\u0456\u043d upnp:albumArtURI \u0456\u0448\u0456\u043d\u0434\u0435\u0433\u0456 dlna:profileID \u0442\u04e9\u043b\u0441\u0438\u043f\u0430\u0442\u044b\u043c\u0435\u043d \u0431\u0456\u0440\u0433\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u041a\u0435\u0439\u0431\u0456\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0456\u04a3 \u04e9\u043b\u0448\u0435\u043c\u0456\u043d\u0435 \u0430\u04a3\u0493\u0430\u0440\u0443\u0441\u044b\u0437 \u043d\u0430\u049b\u0442\u044b \u043c\u04d9\u043d \u049b\u0430\u0436\u0435\u0442.",
"LabelAlbumArtMaxWidth": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d\u0456\u04a3 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0435\u043d\u0456:",
@@ -708,9 +708,9 @@
"LabelIconMaxHeight": "\u0411\u0435\u043b\u0433\u0456\u0448\u0435\u043d\u0456\u04a3 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0431\u0438\u0456\u0433\u0456:",
"LabelIconMaxHeightHelp": "upnp:icon \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d \u0431\u0435\u043b\u0433\u0456\u0448\u0435\u043b\u0435\u0440\u0456\u043d\u0456\u04a3 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u044b\u043c\u0434\u044b\u0493\u044b.",
"LabelIdentificationFieldHelp": "\u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0435\u0441\u043a\u0435\u0440\u043c\u0435\u0439\u0442\u0456\u043d \u0456\u0448\u043a\u0456 \u0436\u043e\u043b \u043d\u0435\u043c\u0435\u0441\u0435 \u04b1\u0434\u0430\u0439\u044b \u04e9\u0440\u043d\u0435\u043a.",
- "HeaderProfileServerSettingsHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d\u0434\u0435\u0440 Media Browser \u049b\u0430\u043b\u0430\u0439 \u04e9\u0437\u0456\u043d \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430 \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d\u0456\u04a3 \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b.",
+ "HeaderProfileServerSettingsHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d\u0434\u0435\u0440 Media Browser \u049b\u0430\u043b\u0430\u0439 \u04e9\u0437\u0456\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u0442\u0456\u043d\u0456\u04a3 \u0431\u0430\u0441\u049b\u0430\u0440\u0430\u0434\u044b.",
"LabelMaxBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d:",
- "LabelMaxBitrateHelp": "\u04e8\u0442\u043a\u0456\u0437\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456 \u0448\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u043e\u0440\u0442\u0430\u043b\u0430\u0440\u0434\u0430\u0493\u044b \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u044b\u043d, \u043d\u0435\u043c\u0435\u0441\u0435 \u0436\u0430\u0431\u0434\u044b\u049b\u049b\u0430 \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0441\u0430 - \u04e9\u0437 \u0448\u0435\u0433\u0456\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.",
+ "LabelMaxBitrateHelp": "\u04e8\u0442\u043a\u0456\u0437\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456 \u0448\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u043e\u0440\u0442\u0430\u043b\u0430\u0440\u0434\u0430\u0493\u044b \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u044b\u043d, \u043d\u0435\u043c\u0435\u0441\u0435 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0493\u0430 \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0441\u0430 - \u04e9\u0437 \u0448\u0435\u0433\u0456\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.",
"LabelMaxStreamingBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0430\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u049b\u0430\u0440\u049b\u044b\u043d\u044b:",
"LabelMaxStreamingBitrateHelp": "\u0410\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u049b\u0430\u0440\u049b\u044b\u043d\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.",
"LabelMaxStaticBitrate": "\u0415\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u049b\u0430\u0440\u049b\u044b\u043d\u044b:",
@@ -729,11 +729,11 @@
"LabelModelDescription": "\u041c\u043e\u0434\u0435\u043b\u044c \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b",
"LabelModelUrl": "\u041c\u043e\u0434\u0435\u043b\u044c url",
"LabelSerialNumber": "\u0421\u0435\u0440\u0438\u044f\u043b\u044b\u049b \u043d\u04e9\u043c\u0456\u0440\u0456",
- "LabelDeviceDescription": "\u0416\u0430\u0431\u0434\u044b\u049b \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b",
+ "LabelDeviceDescription": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b",
"HeaderIdentificationCriteriaHelp": "\u0415\u04a3 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 \u0430\u043d\u044b\u049b\u0442\u0430\u0443\u0434\u044b\u04a3 \u0431\u0456\u0440 \u0448\u0430\u0440\u0442\u044b\u043d \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437.",
- "HeaderDirectPlayProfileHelp": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u044b\u04a3 \u049b\u0430\u043d\u0434\u0430\u0439 \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u04d9\u0434\u0435\u043f\u043a\u0456 \u04e9\u04a3\u0434\u0435\u0442\u0435\u0442\u0456\u043d \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04b1\u0448\u0456\u043d \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043d \u049b\u043e\u0441\u0443.",
+ "HeaderDirectPlayProfileHelp": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 \u049b\u0430\u043d\u0434\u0430\u0439 \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u04d9\u0434\u0435\u043f\u043a\u0456 \u04e9\u04a3\u0434\u0435\u0442\u0435\u0442\u0456\u043d \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04b1\u0448\u0456\u043d \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043d \u049b\u043e\u0441\u0443.",
"HeaderTranscodingProfileHelp": "\u049a\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u049b\u0430\u043d\u0434\u0430\u0439 \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443 \u043c\u0456\u043d\u0434\u0435\u0442\u0456\u043b\u0456\u0433\u0456\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04b1\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043d \u049b\u043e\u0441\u0443.",
- "HeaderResponseProfileHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u04af\u043d \u049b\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u0436\u0430\u0431\u0434\u044b\u049b\u049b\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u0436\u043e\u043b \u0431\u0435\u0440\u0435\u0434\u0456.",
+ "HeaderResponseProfileHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d \u043e\u0439\u043d\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u04af\u043d \u049b\u0430\u0442\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0493\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0435\u0442\u0456\u043d \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u0436\u043e\u043b \u0431\u0435\u0440\u0435\u0434\u0456.",
"LabelXDlnaCap": "X-Dlna \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u0440\u044b:",
"LabelXDlnaCapHelp": "urn:schemas-dlna-org:device-1-0 \u0430\u0442\u0430\u0443\u043b\u0430\u0440 \u043a\u0435\u04a3\u0456\u0441\u0442\u0456\u0433\u0456\u043d\u0434\u0435\u0433\u0456 X_DLNACAP \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0456 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0430\u043d\u044b\u049b\u0442\u0430\u0439\u0434\u044b.",
"LabelXDlnaDoc": "X-Dlna \u0442\u04d9\u0441\u0456\u043c\u0456:",
@@ -748,7 +748,7 @@
"OptionEnableM2tsModeHelp": "Mpegts \u04af\u0448\u0456\u043d \u043a\u043e\u0434\u0442\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 m2ts \u0440\u0435\u0436\u0456\u043c\u0456\u043d \u049b\u043e\u0441\u0443.",
"OptionEstimateContentLength": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u043c\u0430\u0437\u043c\u04b1\u043d \u04b1\u0437\u044b\u043d\u0434\u044b\u0493\u044b\u043d \u0431\u0430\u0493\u0430\u043b\u0430\u0443",
"OptionReportByteRangeSeekingWhenTranscoding": "\u049a\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u0430\u0439\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0456\u043d \u049b\u043e\u043b\u0434\u0430\u0441\u0430 \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u0443",
- "OptionReportByteRangeSeekingWhenTranscodingHelp": "\u0411\u04b1\u043b \u0443\u0430\u049b\u044b\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0456 \u043e\u043d\u0448\u0430 \u0435\u043c\u0435\u0441 \u043a\u0435\u0439\u0431\u0456\u0440 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440 \u04af\u0448\u0456\u043d \u049b\u0430\u0436\u0435\u0442.",
+ "OptionReportByteRangeSeekingWhenTranscodingHelp": "\u0411\u04b1\u043b \u0443\u0430\u049b\u044b\u0442 \u0456\u0440\u0456\u043a\u0442\u0435\u0443\u0456 \u043e\u043d\u0448\u0430 \u0435\u043c\u0435\u0441 \u043a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440 \u04af\u0448\u0456\u043d \u049b\u0430\u0436\u0435\u0442.",
"HeaderSubtitleDownloadingHelp": "Media Browser \u0431\u0435\u0439\u043d\u0435\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0433\u0435\u043d\u0434\u0435 \u0431\u04b1\u043b \u0436\u043e\u049b \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0456\u0437\u0434\u0435\u0443 \u0436\u04d9\u043d\u0435 OpenSubtitles.org \u0441\u0438\u044f\u049b\u0442\u044b \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0436\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
"HeaderDownloadSubtitlesFor": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u043c\u044b\u043d\u0430\u0493\u0430\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443:",
"MessageNoChapterProviders": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u0441\u0430\u0445\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d ChapterDb \u0441\u0438\u044f\u049b\u0442\u044b \u0441\u0430\u0445\u043d\u0430\u043b\u0430\u0440 \u0436\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0456 \u043e\u0440\u043d\u0430\u0442\u044b\u04a3\u044b\u0437.",
@@ -794,7 +794,7 @@
"LabelEnableThemeSongsHelp": "\u0415\u0433\u0435\u0440 \u049b\u043e\u0441\u044b\u043b\u0441\u0430, \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u044b\u0493\u0430\u043d\u0434\u0430 \u0442\u0430\u049b\u044b\u0440\u044b\u043f\u0442\u044b\u049b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440 \u04e9\u04a3\u0434\u0435 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0430\u0434\u044b.",
"LabelEnableBackdropsHelp": "\u0415\u0433\u0435\u0440 \u049b\u043e\u0441\u044b\u043b\u0441\u0430, \u0430\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u044b\u0493\u0430\u043d\u0434\u0430 \u043a\u0435\u0439\u0431\u0456\u0440 \u0431\u0435\u0442\u0442\u0435\u0440\u0434\u0435 \u04e9\u04a3\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456.",
"HeaderHomePage": "\u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442",
- "HeaderSettingsForThisDevice": "\u041e\u0441\u044b \u0436\u0430\u0431\u0434\u044b\u049b\u049b\u0430 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440",
+ "HeaderSettingsForThisDevice": "\u041e\u0441\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0493\u0430 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440",
"OptionAuto": "\u0410\u0432\u0442\u043e",
"OptionYes": "\u0418\u04d9",
"OptionNo": "\u0416\u043e\u049b",
@@ -821,13 +821,13 @@
"OptionCommunityMostWatchedSort": "\u0415\u04a3 \u043a\u04e9\u043f \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d\u0434\u0430\u0440",
"TabNextUp": "\u041a\u0435\u0437\u0435\u043a\u0442\u0435\u0433\u0456\u043b\u0435\u0440",
"MessageNoMovieSuggestionsAvailable": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0444\u0438\u043b\u044c\u043c \u04b1\u0441\u044b\u043d\u044b\u0441\u0442\u0430\u0440\u044b \u0430\u0493\u044b\u043c\u0434\u0430 \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u043c\u0435\u0441. \u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456 \u049b\u0430\u0440\u0430\u0443\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u0434\u044b \u0431\u0430\u0441\u0442\u0430\u04a3\u044b\u0437, \u0441\u043e\u043d\u0434\u0430 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u04b1\u0441\u044b\u043d\u044b\u0442\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u044b \u043a\u04e9\u0440\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u043a\u0435\u043b\u0456\u04a3\u0456\u0437.",
- "MessageNoCollectionsAvailable": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456, \u0441\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440\u0434\u044b, \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440\u0434\u044b, \u043a\u0456\u0442\u0430\u043f\u0442\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u043e\u0439\u044b\u043d\u0434\u0430\u0440\u0434\u044b \u0436\u0435\u043a\u0435\u043b\u0435\u043d\u0433\u0435\u043d \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0436\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u0435\u0440\u0435\u0434\u0456. \u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u0430\u0441\u0430\u0439 \u0431\u0430\u0441\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \"\u0416\u0430\u0441\u0430\u0443\" \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.",
+ "MessageNoCollectionsAvailable": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440\u0434\u0456, \u0441\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440\u0434\u044b, \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440\u0434\u044b, \u043a\u0456\u0442\u0430\u043f\u0442\u0430\u0440\u0434\u044b \u0436\u04d9\u043d\u0435 \u043e\u0439\u044b\u043d\u0434\u0430\u0440\u0434\u044b \u0434\u0430\u0440\u0430\u043b\u0430\u043f \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0436\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a \u0431\u0435\u0440\u0435\u0434\u0456. \u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u0430\u0441\u0430\u0439 \u0431\u0430\u0441\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \"\u0416\u0430\u0441\u0430\u0443\" \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437.",
"MessageNoPlaylistsAvailable": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456 \u0431\u0456\u0440 \u043a\u0435\u0437\u0434\u0435 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u043c\u0430\u0437\u043c\u04b1\u043d \u0442\u0456\u0437\u0456\u043c\u0456\u043d \u0436\u0430\u0441\u0430\u0443\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0435\u0434\u0456. \u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0433\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u04af\u0441\u0442\u0435\u0443 \u04af\u0448\u0456\u043d, \u0442\u0456\u043d\u0442\u0443\u0456\u0440\u0434\u0456\u04a3 \u043e\u04a3 \u0436\u0430\u049b \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u0433\u0456\u043d \u0431\u0430\u0441\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0442\u04af\u0440\u0442\u0456\u043f \u0436\u04d9\u043d\u0435 \u04b1\u0441\u0442\u0430\u043f \u0442\u04b1\u0440\u044b\u04a3\u044b\u0437, \u0441\u043e\u043d\u0434\u0430 \u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435 \u04af\u0441\u0442\u0435\u0443 \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
"MessageNoPlaylistItemsAvailable": "\u041e\u0441\u044b \u043e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c \u0430\u0493\u044b\u043c\u0434\u0430\u0493\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0431\u043e\u0441.",
"HeaderWelcomeToMediaBrowserWebClient": "Media Browser \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442\u0456\u043d\u0435 \u049b\u043e\u0448 \u043a\u0435\u043b\u0434\u0456\u04a3\u0456\u0437!",
"ButtonDismiss": "\u0416\u0430\u0441\u044b\u0440\u0443",
"ButtonTakeTheTour": "\u0410\u0440\u0430\u043b\u0430\u043f \u0448\u044b\u0493\u044b\u04a3\u044b\u0437",
- "ButtonEditOtherUserPreferences": "\u041e\u0441\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b\u04a3 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b\u043d, \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0456\u043d \u0436\u04d9\u043d\u0435 \u0436\u0435\u043a\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u04e9\u04a3\u0434\u0435\u0443.",
+ "ButtonEditOtherUserPreferences": "\u041e\u0441\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b\u04a3 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b\u043d, \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0456\u043d \u0436\u04d9\u043d\u0435 \u0434\u0430\u0440\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u04e9\u04a3\u0434\u0435\u0443.",
"LabelChannelStreamQuality": "\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:",
"LabelChannelStreamQualityHelp": "\u04e8\u0442\u043a\u0456\u0437\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456 \u0442\u04e9\u043c\u0435\u043d \u043e\u0440\u0442\u0430\u0434\u0430, \u0441\u0430\u043f\u0430\u0441\u044b\u043d \u0448\u0435\u043a\u0442\u0435\u0443\u0456 \u0436\u0430\u0442\u044b\u049b\u0442\u0430\u0443 \u0430\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u04d9\u0441\u0435\u0440\u0456\u043d \u049b\u0430\u043c\u0442\u0430\u043c\u0430\u0441\u044b\u0437 \u0435\u0442\u0443\u0456\u043d\u0435 \u043a\u04e9\u043c\u0435\u043a\u0442\u0435\u0441\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.",
"OptionBestAvailableStreamQuality": "\u049a\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u04a3 \u0436\u0430\u049b\u0441\u044b",
@@ -885,7 +885,7 @@
"TitleRemoteControl": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443",
"OptionLatestTvRecordings": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440",
"LabelProtocolInfo": "\u041f\u0440\u043e\u0442\u043e\u049b\u043e\u043b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u044b:",
- "LabelProtocolInfoHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u044b\u04a3 GetProtocolInfo \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d\u0430 \u0436\u0430\u0443\u0430\u043f \u0431\u0435\u0440\u0433\u0435\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
+ "LabelProtocolInfoHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 GetProtocolInfo \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d\u0430 \u0436\u0430\u0443\u0430\u043f \u0431\u0435\u0440\u0433\u0435\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
"TabKodiMetadata": "Kodi",
"HeaderKodiMetadataHelp": "Media Browser \u0431\u0430\u0493\u0434\u0430\u0440\u043b\u0430\u043c\u0430\u0441\u044b Xbmc NFO \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0442\u0435\u0440\u0456\u043d\u0456\u04a3 \u0436\u04d9\u043d\u0435 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0456\u043d\u0456\u04a3 \u043a\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u043c\u0435 \u049b\u043e\u043b\u0434\u0430\u0443\u044b\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b. Xbmc \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443 \u043d\u0435\u043c\u0435\u0441\u0435 \u04e9\u0448\u0456\u0440\u0443 \u04af\u0448\u0456\u043d \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u0442\u0430\u0441\u0443\u0448\u044b \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.",
"LabelKodiMetadataUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b\u04a3 \u049b\u0430\u0440\u0430\u0443 \u043a\u04af\u0439\u0456\u043d NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043c\u0435\u043d \u043c\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443:",
@@ -925,7 +925,7 @@
"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",
+ "HeaderDevice": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b",
"HeaderUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b",
"HeaderDateIssued": "\u0411\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456",
"LabelChapterName": "{0}-\u0441\u0430\u0445\u043d\u0430",
@@ -1164,10 +1164,10 @@
"LabelConnectUserNameHelp": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d \u0431\u0456\u043b\u043c\u0435\u0439 \u0442\u04b1\u0440\u044b\u043f \u04d9\u0440\u049b\u0430\u0439\u0441\u044b Media Browser \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b\u043d\u0430\u043d \u043a\u0456\u0440\u0443-\u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0442\u044b \u0436\u0435\u04a3\u0456\u043b\u0434\u0435\u0442\u0443\u0456\u043d \u049b\u043e\u0441\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0435 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u044b\u04a3\u044b\u0437.",
"ButtonLearnMoreAboutMediaBrowserConnect": "Media Browser Connect \u0442\u0443\u0440\u0430\u043b\u044b \u043a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443",
"LabelExternalPlayers": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440:",
- "LabelExternalPlayersHelp": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440\u0434\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443. \u0411\u04b1\u043b \u0442\u0435\u043a \u049b\u0430\u043d\u0430 URL \u0441\u0445\u0435\u043c\u0430\u043b\u0430\u0440\u044b\u043d \u049b\u043e\u043b\u0434\u0430\u0439\u0442\u044b\u043d, \u04d9\u0434\u0435\u0442\u0442\u0435, Android \u0436\u04d9\u043d\u0435 iOS, \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u0434\u0430 \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456. \u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440, \u049b\u0430\u0493\u0438\u0434\u0430 \u0431\u043e\u0439\u044b\u043d\u0448\u0430, \u0430\u043b\u044b\u0441\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u0434\u044b \u0436\u04d9\u043d\u0435 \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443\u0434\u044b \u049b\u043e\u043b\u0434\u0430\u043c\u0430\u0439\u0434\u044b.",
+ "LabelExternalPlayersHelp": "\u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440\u0434\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443. \u0411\u04b1\u043b \u0442\u0435\u043a \u049b\u0430\u043d\u0430 URL \u0441\u0445\u0435\u043c\u0430\u043b\u0430\u0440\u044b\u043d \u049b\u043e\u043b\u0434\u0430\u0439\u0442\u044b\u043d, \u04d9\u0434\u0435\u0442\u0442\u0435, Android \u0436\u04d9\u043d\u0435 iOS, \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u0430 \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456. \u0421\u044b\u0440\u0442\u049b\u044b \u043e\u0439\u043d\u0430\u0442\u049b\u044b\u0448\u0442\u0430\u0440, \u049b\u0430\u0493\u0438\u0434\u0430 \u0431\u043e\u0439\u044b\u043d\u0448\u0430, \u0430\u043b\u044b\u0441\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u0434\u044b \u0436\u04d9\u043d\u0435 \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443\u0434\u044b \u049b\u043e\u043b\u0434\u0430\u043c\u0430\u0439\u0434\u044b.",
"HeaderSubtitleProfile": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b",
"HeaderSubtitleProfiles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b",
- "HeaderSubtitleProfilesHelp": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b \u043e\u0441\u044b \u0436\u0430\u0431\u0434\u044b\u049b \u049b\u043e\u043b\u0434\u0430\u0439\u0442\u044b\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u0439\u0434\u044b.",
+ "HeaderSubtitleProfilesHelp": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u044b \u043e\u0441\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 \u049b\u043e\u043b\u0434\u0430\u0443\u044b \u0431\u0430\u0440 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u043f\u0456\u0448\u0456\u043c\u0434\u0435\u0440\u0456\u043d \u0441\u0438\u043f\u0430\u0442\u0442\u0430\u0439\u0434\u044b.",
"LabelFormat": "\u041f\u0456\u0448\u0456\u043c:",
"LabelMethod": "\u04d8\u0434\u0456\u0441:",
"LabelDidlMode": "DIDL \u0440\u0435\u0436\u0456\u043c\u0456:",
@@ -1210,17 +1210,17 @@
"OptionDateAddedFileTime": "\u0424\u0430\u0439\u043b\u0434\u044b\u04a3 \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d \u043a\u04af\u043d\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443",
"LabelDateAddedBehaviorHelp": "\u0415\u0433\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0435 \u043c\u04d9\u043d\u0456 \u0431\u043e\u043b\u0441\u0430, \u0431\u04b1\u043b \u049b\u0430\u0439\u0441\u044b\u0431\u0456\u0440 \u043e\u0441\u044b \u043d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u04d9\u0440\u049b\u0430\u0448\u0430\u043d\u0434\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.",
"LabelNumberTrailerToPlay": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0434\u0456\u04a3 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0443 \u04af\u0448\u0456\u043d \u0441\u0430\u043d\u044b:",
- "TitleDevices": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440",
+ "TitleDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440",
"TabCameraUpload": "\u041a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u0443",
- "TabDevices": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440",
- "HeaderCameraUploadHelp": "\u04b0\u0442\u049b\u044b\u0440 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u044b\u04a3\u044b\u0437\u0431\u0435\u043d \u0442\u04af\u0441\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0444\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u043c\u0435\u043d \u0431\u0435\u0439\u043d\u0435\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b Media Browser \u0456\u0448\u0456\u043d\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u049b\u043e\u0442\u0430\u0440\u044b\u043f \u0431\u0435\u0440\u0443.",
- "MessageNoDevicesSupportCameraUpload": "\u0410\u0493\u044b\u043c\u0434\u0430 \u043a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u049b\u043e\u0442\u0430\u0440\u044b\u043f \u0431\u0435\u0440\u0435\u0442\u0456\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0436\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440\u044b\u04a3\u044b\u0437 \u0436\u043e\u049b.",
+ "TabDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440",
+ "HeaderCameraUploadHelp": "\u04b0\u0442\u049b\u044b\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0431\u0435\u043d \u0442\u04af\u0441\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0444\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u043c\u0435\u043d \u0431\u0435\u0439\u043d\u0435\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b Media Browser \u0456\u0448\u0456\u043d\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u049b\u043e\u0442\u0430\u0440\u044b\u043f \u0431\u0435\u0440\u0443.",
+ "MessageNoDevicesSupportCameraUpload": "\u0410\u0493\u044b\u043c\u0434\u0430 \u043a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u049b\u043e\u0442\u0430\u0440\u044b\u043f \u0431\u0435\u0440\u0435\u0442\u0456\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b\u04a3\u044b\u0437 \u0436\u043e\u049b.",
"LabelCameraUploadPath": "\u041a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u0443 \u0436\u043e\u043b\u044b:",
"LabelCameraUploadPathHelp": "\u049a\u0430\u043b\u0430\u0443\u044b\u04a3\u044b\u0437 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0436\u043e\u043b\u0434\u044b \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437. \u0415\u0433\u0435\u0440 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u043c\u0430\u0441\u0430, \u04d9\u0434\u0435\u043f\u043a\u0456 \u049b\u0430\u043b\u0442\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u0415\u0433\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0442\u0456\u043d \u0436\u043e\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0441\u0430, \u0431\u04b1\u043d\u044b \u0441\u043e\u043d\u0434\u0430\u0439-\u0430\u049b \u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u043d\u044b \u043e\u0440\u043d\u0430\u0442\u0443 \u0436\u04d9\u043d\u0435 \u0442\u0435\u04a3\u0448\u0435\u0443 \u0430\u0439\u043c\u0430\u0493\u044b\u043d\u0430 \u04af\u0441\u0442\u0435\u0443 \u049b\u0430\u0436\u0435\u0442.",
- "LabelCreateCameraUploadSubfolder": "\u04d8\u0440\u049b\u0430\u0439\u0441\u044b \u0436\u0430\u0431\u0434\u044b\u049b \u04af\u0448\u0456\u043d \u0456\u0448\u043a\u0456 \u049b\u0430\u043b\u0442\u0430 \u0436\u0430\u0441\u0430\u0443",
- "LabelCreateCameraUploadSubfolderHelp": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440 \u0431\u0435\u0442\u0456\u043d\u0434\u0435 \u043d\u04b1\u049b\u044b\u0493\u0430\u043d\u0434\u0430 \u0436\u0430\u0431\u0434\u044b\u049b\u049b\u0430 \u043d\u0430\u049b\u0442\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0442\u0430\u0493\u0430\u0439\u044b\u043d\u0434\u0430\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
+ "LabelCreateCameraUploadSubfolder": "\u04d8\u0440\u049b\u0430\u0439\u0441\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u04af\u0448\u0456\u043d \u0456\u0448\u043a\u0456 \u049b\u0430\u043b\u0442\u0430 \u0436\u0430\u0441\u0430\u0443",
+ "LabelCreateCameraUploadSubfolderHelp": "\u0416\u0430\u0431\u0434\u044b\u049b\u0442\u0430\u0440 \u0431\u0435\u0442\u0456\u043d\u0434\u0435 \u043d\u04b1\u049b\u044b\u0493\u0430\u043d\u0434\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0493\u0430 \u043d\u0430\u049b\u0442\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0442\u0430\u0493\u0430\u0439\u044b\u043d\u0434\u0430\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.",
"LabelCustomDeviceDisplayName": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0443 \u0430\u0442\u044b:",
- "LabelCustomDeviceDisplayNameHelp": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0442\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0430\u0442\u044b\u043d \u04b1\u0441\u044b\u043d\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0436\u0430\u0431\u0434\u044b\u049b \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u0430\u044f\u043d\u0434\u0430\u043b\u0493\u0430\u043d \u0430\u0442\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.",
+ "LabelCustomDeviceDisplayNameHelp": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0442\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0430\u0442\u044b\u043d \u04b1\u0441\u044b\u043d\u044b\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u0430\u044f\u043d\u0434\u0430\u043b\u0493\u0430\u043d \u0430\u0442\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.",
"HeaderInviteUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u0448\u0430\u049b\u044b\u0440\u0443",
"LabelConnectGuestUserNameHelp": "\u0411\u04b1\u043b \u0434\u043e\u0441\u044b\u04a3\u044b\u0437 Media Browser \u0493\u0430\u043b\u0430\u043c\u0442\u043e\u0440 \u0441\u0430\u0439\u0442\u044b\u043d\u0430 \u043a\u0456\u0440\u0433\u0435\u043d\u0434\u0435 \u049b\u043e\u043b\u0434\u0430\u043d\u0430\u0442\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0430\u0442\u044b, \u043d\u0435\u043c\u0435\u0441\u0435 \u044d-\u043f\u043e\u0448\u0442\u0430 \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b.",
"HeaderInviteUserHelp": "Media Browser Connect \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0434\u043e\u0441\u0442\u0430\u0440\u044b\u04a3\u044b\u0437\u0431\u0435\u043d \u043e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443 \u0431\u04b1\u0440\u044b\u043d\u043d\u0430\u043d \u0434\u0430 \u0436\u0435\u04a3\u0456\u043b\u0434\u0435\u0443 \u0431\u043e\u043b\u0434\u044b.",
@@ -1256,7 +1256,7 @@
"MessageNoServersAvailableToConnect": "\u049a\u043e\u0441\u044b\u043b\u0443 \u04af\u0448\u0456\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043b\u0435\u0440 \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u043c\u0435\u0441. \u0415\u0433\u0435\u0440 \u0441\u0435\u0440\u0432\u0435\u0440\u043c\u0435\u043d \u043e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443\u0493\u0430 \u0448\u0430\u049b\u044b\u0440\u044b\u043b\u0441\u0430\u04a3\u044b\u0437, \u049b\u0430\u0431\u044b\u043b\u0434\u0430\u0443\u044b\u043d \u0442\u04e9\u043c\u0435\u043d\u0434\u0435 \u043d\u0435\u043c\u0435\u0441\u0435 \u044d-\u043f\u043e\u0448\u0442\u0430\u0434\u0430\u0493\u044b \u0441\u0456\u043b\u0442\u0435\u043c\u0435\u043d\u0456 \u043d\u04b1\u049b\u044b\u043f \u043d\u0430\u049b\u0442\u044b\u043b\u0430\u04a3\u044b\u0437.",
"TitleNewUser": "\u0416\u0430\u04a3\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b",
"ButtonConfigurePassword": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u0442\u0435\u04a3\u0448\u0435\u0443",
- "HeaderDashboardUserPassword": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u044b\u049b \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0435\u0440 \u04d9\u0440 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0436\u0435\u043a\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u043b\u0430\u0434\u044b.",
+ "HeaderDashboardUserPassword": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u044b\u049b \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0435\u0440 \u04d9\u0440 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0434\u0430\u0440\u0430 \u043f\u0440\u043e\u0444\u0430\u0439\u043b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u044b\u043b\u0430\u0434\u044b.",
"HeaderLibraryAccess": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443",
"HeaderChannelAccess": "\u0410\u0440\u043d\u0430\u0493\u0430 \u049b\u0430\u0442\u044b\u043d\u0430\u0441\u0443",
"HeaderLatestItems": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440",
@@ -1276,6 +1276,8 @@
"HeaderAddTag": "\u0422\u0435\u0433\u0442\u0456 \u049b\u043e\u0441\u0443",
"LabelBlockItemsWithTags": "\u041c\u044b\u043d\u0430\u0434\u0430\u0439 \u0442\u0435\u0433\u0442\u0435\u0440\u0456 \u0431\u0430\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u0430\u0443:",
"LabelTag": "\u0422\u0435\u0433:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimit": "\u0416\u0430\u043b\u0493\u044b\u0437 \u043a\u0456\u0440\u0456\u0441\u0442\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0441\u0443\u0440\u0435\u0442\u043a\u0435 \u0448\u0435\u043a\u0442\u0435\u0443",
+ "LabelEnableSingleImageInDidlLimitHelp": "\u0415\u0433\u0435\u0440 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0443\u0440\u0435\u0442 Didl \u0456\u0448\u0456\u043d\u0435 \u043a\u0456\u0440\u0456\u0441\u0442\u0456\u0440\u0456\u043b\u0441\u0435, \u043a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u0430 \u0442\u0438\u0456\u0441\u0442\u0456 \u0442\u04af\u0440\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0431\u0435\u0439\u0434\u0456.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/ko.json b/MediaBrowser.Server.Implementations/Localization/Server/ko.json
index 9cfec64e7..a4b1ad5ba 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ko.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ko.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 7481f070e..dddcb2ef1 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ms.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ms.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 4c50c3fc2..d8351e587 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/nb.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/nb.json
@@ -1,16 +1,4 @@
{
- "TitleForgotPassword": "Glemt passord",
- "TitlePasswordReset": "Resett passord",
- "LabelPasswordRecoveryPinCode": "Pin code:",
- "HeaderPasswordReset": "Resett passord",
- "HeaderParentalRatings": "Parental Ratings",
- "HeaderVideoTypes": "Video Types",
- "HeaderYears": "Years",
- "HeaderAddTag": "Add Tag",
- "LabelBlockItemsWithTags": "Block items with tags:",
- "LabelTag": "Tag:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
"LabelExit": "Avslutt",
"LabelVisitCommunity": "Bes\u00f8k oss",
"LabelGithub": "Github",
@@ -1277,5 +1265,19 @@
"MessageGuestSharingPermissionsHelp": "De fleste funksjonene er i utgangspunktet utilgjengelig for gjester, men kan aktiveres ved behov.",
"HeaderInvitations": "Invitasjoner",
"LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.",
- "HeaderForgotPassword": "Glemt passord"
+ "HeaderForgotPassword": "Glemt passord",
+ "TitleForgotPassword": "Glemt passord",
+ "TitlePasswordReset": "Resett passord",
+ "LabelPasswordRecoveryPinCode": "Pin code:",
+ "HeaderPasswordReset": "Resett passord",
+ "HeaderParentalRatings": "Parental Ratings",
+ "HeaderVideoTypes": "Video Types",
+ "HeaderYears": "Years",
+ "HeaderAddTag": "Add Tag",
+ "LabelBlockItemsWithTags": "Block items with tags:",
+ "LabelTag": "Tag:",
+ "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 ad571f184..86369aa95 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/nl.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/nl.json
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "Actieve taken",
"HeaderActiveDevices": "Actieve apparaten",
"HeaderPendingInstallations": "In afwachting van installaties",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "Server informatie",
"ButtonRestartNow": "Nu opnieuw opstarten",
"ButtonRestart": "Herstart",
"ButtonShutdown": "Afsluiten",
@@ -1216,7 +1216,7 @@
"HeaderCameraUploadHelp": "Upload automatisch foto's en video's van je mobiele apparaten naar Media Browser.",
"MessageNoDevicesSupportCameraUpload": "Je hebt op dit moment geen apparaten die camera upload ondersteunen.",
"LabelCameraUploadPath": "Camera upload pad:",
- "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used. If using a custom path it will also need to be added in the library setup area.",
+ "LabelCameraUploadPathHelp": "Geef een eigen upload pad op, indien gewenst. Deze map moet ook aan de bibliotheek instellingen toegevoegd worden. Als er niets opgegeven is wordt de standaard map gebruikt.",
"LabelCreateCameraUploadSubfolder": "Maak een submap voor elk apparaat",
"LabelCreateCameraUploadSubfolderHelp": "Specifieke mappen kunnen aan een apparaat toegekend worden door er op te klikken in de apparaten pagina.",
"LabelCustomDeviceDisplayName": "Weergave naam:",
@@ -1276,6 +1276,8 @@
"HeaderAddTag": "Voeg tag toe",
"LabelBlockItemsWithTags": "Blokkeer items met de tag:",
"LabelTag": "Tag:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimit": "Beperk tot \u00e9\u00e9n enkele ingesloten afbeelding",
+ "LabelEnableSingleImageInDidlLimitHelp": "Sommige apparaten zullen niet goed weergeven als er meerdere afbeeldingen ingesloten zijn in Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 3648847bf..677d94d96 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/pl.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/pl.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 f04af13fb..1cc4471f9 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "Tarefas em Execu\u00e7\u00e3o",
"HeaderActiveDevices": "Dispositivos Ativos",
"HeaderPendingInstallations": "Instala\u00e7\u00f5es Pendentes",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "Informa\u00e7\u00e3o do Servidor",
"ButtonRestartNow": "Reiniciar Agora",
"ButtonRestart": "Reiniciar",
"ButtonShutdown": "Desligar",
@@ -1276,6 +1276,8 @@
"HeaderAddTag": "Adicionar Tag",
"LabelBlockItemsWithTags": "Bloquear itens com tags:",
"LabelTag": "Tag:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimit": "Limitar a uma imagem incorporada",
+ "LabelEnableSingleImageInDidlLimitHelp": "Alguns dispositivos n\u00e3o interpretar\u00e3o apropriadamente se m\u00faltiplas imagens estiverem incorporadas dentro do Didl.",
+ "TabActivity": "Atividade",
+ "TitleSync": "Sinc"
} \ 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 f104c79be..0fdcba349 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 63b6c5f46..01be724ad 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/ru.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/ru.json
@@ -539,7 +539,7 @@
"HeaderRunningTasks": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f",
"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",
- "HeaderServerInformation": "Server Information",
+ "HeaderServerInformation": "\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 \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",
@@ -1025,7 +1025,7 @@
"DeviceOfflineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u043e",
"UserOfflineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b-\u0438\u0435 \u0441 {1} \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u043e",
"SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0434\u043b\u044f {0} \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438\u0441\u044c",
- "SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0434\u043b\u044f {0} \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c",
+ "SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043a {0} \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c",
"LabelRunningTimeValue": "\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {0}",
"LabelIpAddressValue": "IP-\u0430\u0434\u0440\u0435\u0441: {0}",
"UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430",
@@ -1276,6 +1276,8 @@
"HeaderAddTag": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0433\u0430",
"LabelBlockItemsWithTags": "\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u0433\u0430\u043c\u0438:",
"LabelTag": "\u0422\u0435\u0433:",
- "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0434\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u043e\u0433\u043e \u0440\u0438\u0441\u0443\u043d\u043a\u0430",
+ "LabelEnableSingleImageInDidlLimitHelp": "\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0432\u043d\u0435\u0434\u0440\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 6da7adee1..6bb24be2b 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/server.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json
@@ -1293,5 +1293,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
}
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/sv.json b/MediaBrowser.Server.Implementations/Localization/Server/sv.json
index 7ba9b83fc..47bd0edab 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/sv.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/sv.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/tr.json b/MediaBrowser.Server.Implementations/Localization/Server/tr.json
index 68275c678..7b2c6fd1c 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/tr.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/tr.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 0f43257e4..687faab0e 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/vi.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/vi.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json b/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json
index 85e5da346..15324d40f 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 c48ad70d0..7f52d8d73 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
@@ -1277,5 +1277,7 @@
"LabelBlockItemsWithTags": "Block items with tags:",
"LabelTag": "Tag:",
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
- "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl."
+ "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
+ "TabActivity": "Activity",
+ "TitleSync": "Sync"
} \ 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 cf029df19..514b7b1f1 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -306,6 +306,7 @@
<Compile Include="Sync\SyncJobProcessor.cs" />
<Compile Include="Sync\SyncManager.cs" />
<Compile Include="Sync\SyncRepository.cs" />
+ <Compile Include="Sync\SyncScheduledTask.cs" />
<Compile Include="Themes\AppThemeManager.cs" />
<Compile Include="TV\TVSeriesManager.cs" />
<Compile Include="Udp\UdpMessageReceivedEventArgs.cs" />
diff --git a/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs b/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
index 3d0e36ead..89395a00b 100644
--- a/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
@@ -18,7 +18,7 @@ namespace MediaBrowser.Server.Implementations.Playlists
{
return base.IsVisible(user) && GetRecursiveChildren(user, false)
.OfType<Playlist>()
- .Any(i => string.Equals(i.OwnerUserId, user.Id.ToString("N")));
+ .Any(i => i.IsVisible(user));
}
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
index 852959312..8da9ba222 100644
--- a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
@@ -115,10 +115,15 @@ namespace MediaBrowser.Server.Implementations.Playlists
{
Name = name,
Parent = parentFolder,
- Path = path,
- OwnerUserId = options.UserId
+ Path = path
};
+ playlist.Shares.Add(new Share
+ {
+ UserId = options.UserId,
+ CanEdit = true
+ });
+
playlist.SetMediaType(options.MediaType);
await parentFolder.AddChild(playlist, CancellationToken.None).ConfigureAwait(false);
diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs
index 97dfb2c5d..0ac53c987 100644
--- a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs
+++ b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs
@@ -12,7 +12,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
/// <summary>
/// Class RefreshMediaLibraryTask
/// </summary>
- public class RefreshMediaLibraryTask : IScheduledTask
+ public class RefreshMediaLibraryTask : IScheduledTask, IHasKey
{
/// <summary>
/// The _library manager
@@ -88,5 +88,10 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
return "Library";
}
}
+
+ public string Key
+ {
+ get { return "RefreshLibrary"; }
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
index c7f02b3dd..1976c0540 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
@@ -1,11 +1,18 @@
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.Session;
using MediaBrowser.Model.Sync;
using MoreLinq;
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Sync
@@ -14,11 +21,17 @@ namespace MediaBrowser.Server.Implementations.Sync
{
private readonly ILibraryManager _libraryManager;
private readonly ISyncRepository _syncRepo;
+ private readonly ISyncManager _syncManager;
+ private readonly ILogger _logger;
+ private readonly IUserManager _userManager;
- public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo)
+ public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager)
{
_libraryManager = libraryManager;
_syncRepo = syncRepo;
+ _syncManager = syncManager;
+ _logger = logger;
+ _userManager = userManager;
}
public void ProcessJobItem(SyncJob job, SyncJobItem jobItem, SyncTarget target)
@@ -28,13 +41,21 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task EnsureJobItems(SyncJob job)
{
- var items = GetItemsForSync(job.RequestedItemIds)
- .ToList();
+ var user = _userManager.GetUserById(job.UserId);
- var jobItems = _syncRepo.GetJobItems(job.Id)
+ if (user == null)
+ {
+ throw new InvalidOperationException("Cannot proceed with sync because user no longer exists.");
+ }
+
+ var items = GetItemsForSync(job.RequestedItemIds, user)
.ToList();
- var created = 0;
+ var jobItems = _syncRepo.GetJobItems(new SyncJobItemQuery
+ {
+ JobId = job.Id
+
+ }).Items.ToList();
foreach (var item in items)
{
@@ -52,24 +73,97 @@ namespace MediaBrowser.Server.Implementations.Sync
Id = Guid.NewGuid().ToString("N"),
ItemId = itemId,
JobId = job.Id,
- TargetId = job.TargetId
+ TargetId = job.TargetId,
+ DateCreated = DateTime.UtcNow
};
await _syncRepo.Create(jobItem).ConfigureAwait(false);
- created++;
+ jobItems.Add(jobItem);
+ }
+
+ jobItems = jobItems
+ .OrderBy(i => i.DateCreated)
+ .ToList();
+
+ await UpdateJobStatus(job, jobItems).ConfigureAwait(false);
+ }
+
+ private Task UpdateJobStatus(SyncJob job)
+ {
+ if (job == null)
+ {
+ throw new ArgumentNullException("job");
+ }
+
+ var result = _syncRepo.GetJobItems(new SyncJobItemQuery
+ {
+ JobId = job.Id
+ });
+
+ return UpdateJobStatus(job, result.Items.ToList());
+ }
+
+ private Task UpdateJobStatus(SyncJob job, List<SyncJobItem> jobItems)
+ {
+ job.ItemCount = jobItems.Count;
+
+ double pct = 0;
+
+ foreach (var item in jobItems)
+ {
+ if (item.Status == SyncJobItemStatus.Failed || item.Status == SyncJobItemStatus.Completed)
+ {
+ pct += 100;
+ }
+ else
+ {
+ pct += item.Progress ?? 0;
+ }
+ }
+
+ if (job.ItemCount > 0)
+ {
+ pct /= job.ItemCount;
+ job.Progress = pct;
+ }
+ else
+ {
+ job.Progress = null;
+ }
+
+ if (pct >= 100)
+ {
+ if (jobItems.Any(i => i.Status == SyncJobItemStatus.Failed))
+ {
+ job.Status = SyncJobStatus.CompletedWithError;
+ }
+ else
+ {
+ job.Status = SyncJobStatus.Completed;
+ }
+ }
+ else if (pct.Equals(0))
+ {
+ job.Status = SyncJobStatus.Queued;
+ }
+ else
+ {
+ job.Status = SyncJobStatus.InProgress;
}
- job.ItemCount = jobItems.Count + created;
- await _syncRepo.Update(job).ConfigureAwait(false);
+ return _syncRepo.Update(job);
}
- public IEnumerable<BaseItem> GetItemsForSync(IEnumerable<string> itemIds)
+ public IEnumerable<BaseItem> GetItemsForSync(IEnumerable<string> itemIds, User user)
{
- return itemIds.SelectMany(GetItemsForSync).DistinctBy(i => i.Id);
+ return itemIds
+ .SelectMany(i => GetItemsForSync(i, user))
+ .Where(_syncManager.SupportsSync)
+ .DistinctBy(i => i.Id);
}
- private IEnumerable<BaseItem> GetItemsForSync(string id)
+ private IEnumerable<BaseItem> GetItemsForSync(string id, User user)
{
var item = _libraryManager.GetItemById(id);
@@ -78,12 +172,224 @@ namespace MediaBrowser.Server.Implementations.Sync
return new List<BaseItem>();
}
- return GetItemsForSync(item);
+ return GetItemsForSync(item, user);
}
- private IEnumerable<BaseItem> GetItemsForSync(BaseItem item)
+ private IEnumerable<BaseItem> GetItemsForSync(BaseItem item, User user)
{
+ var itemByName = item as IItemByName;
+ if (itemByName != null)
+ {
+ var items = user.RootFolder
+ .GetRecursiveChildren(user);
+
+ return itemByName.GetTaggedItems(items);
+ }
+
+ if (item.IsFolder)
+ {
+ var folder = (Folder)item;
+ var items = folder.GetRecursiveChildren(user);
+
+ items = items.Where(i => !i.IsFolder);
+
+ if (!folder.IsPreSorted)
+ {
+ items = items.OrderBy(i => i.SortName);
+ }
+
+ return items;
+ }
+
return new[] { item };
}
+
+ public async Task EnsureSyncJobs(CancellationToken cancellationToken)
+ {
+ var jobResult = _syncRepo.GetJobs(new SyncJobQuery
+ {
+ IsCompleted = false
+ });
+
+ foreach (var job in jobResult.Items)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (job.SyncNewContent)
+ {
+ await EnsureJobItems(job).ConfigureAwait(false);
+ }
+ }
+ }
+
+ public async Task Sync(IProgress<double> progress, CancellationToken cancellationToken)
+ {
+ await EnsureSyncJobs(cancellationToken).ConfigureAwait(false);
+
+ var result = _syncRepo.GetJobItems(new SyncJobItemQuery
+ {
+ IsCompleted = false
+ });
+
+ var jobItems = result.Items;
+ var index = 0;
+
+ foreach (var item in jobItems)
+ {
+ double percent = index;
+ percent /= result.TotalRecordCount;
+
+ progress.Report(100 * percent);
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (item.Status == SyncJobItemStatus.Queued)
+ {
+ await ProcessJobItem(item, cancellationToken).ConfigureAwait(false);
+ }
+
+ var job = _syncRepo.GetJob(item.JobId);
+ await UpdateJobStatus(job).ConfigureAwait(false);
+
+ index++;
+ }
+ }
+
+ private async Task ProcessJobItem(SyncJobItem jobItem, CancellationToken cancellationToken)
+ {
+ var item = _libraryManager.GetItemById(jobItem.ItemId);
+ if (item == null)
+ {
+ jobItem.Status = SyncJobItemStatus.Failed;
+ _logger.Error("Unable to locate library item for JobItem {0}, ItemId {1}", jobItem.Id, jobItem.ItemId);
+ await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ return;
+ }
+
+ var deviceProfile = _syncManager.GetDeviceProfile(jobItem.TargetId);
+ if (deviceProfile == null)
+ {
+ jobItem.Status = SyncJobItemStatus.Failed;
+ _logger.Error("Unable to locate SyncTarget for JobItem {0}, SyncTargetId {1}", jobItem.Id, jobItem.TargetId);
+ await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ return;
+ }
+
+ jobItem.Progress = 0;
+ jobItem.Status = SyncJobItemStatus.Converting;
+
+ var video = item as Video;
+ if (video != null)
+ {
+ jobItem.OutputPath = await Sync(jobItem, video, deviceProfile, cancellationToken).ConfigureAwait(false);
+ }
+
+ else if (item is Audio)
+ {
+ jobItem.OutputPath = await Sync(jobItem, (Audio)item, deviceProfile, cancellationToken).ConfigureAwait(false);
+ }
+
+ else if (item is Photo)
+ {
+ jobItem.OutputPath = await Sync(jobItem, (Photo)item, deviceProfile, cancellationToken).ConfigureAwait(false);
+ }
+
+ else if (item is Game)
+ {
+ jobItem.OutputPath = await Sync(jobItem, (Game)item, deviceProfile, cancellationToken).ConfigureAwait(false);
+ }
+
+ else if (item is Book)
+ {
+ jobItem.OutputPath = await Sync(jobItem, (Book)item, deviceProfile, cancellationToken).ConfigureAwait(false);
+ }
+
+ jobItem.Progress = 50;
+ jobItem.Status = SyncJobItemStatus.Transferring;
+ await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ }
+
+ private async Task<string> Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, CancellationToken cancellationToken)
+ {
+ var options = new VideoOptions
+ {
+ Context = EncodingContext.Streaming,
+ ItemId = item.Id.ToString("N"),
+ DeviceId = jobItem.TargetId,
+ Profile = profile,
+ MediaSources = item.GetMediaSources(false).ToList()
+ };
+
+ var streamInfo = new StreamBuilder().BuildVideoItem(options);
+ var mediaSource = streamInfo.MediaSource;
+
+ if (streamInfo.PlayMethod != PlayMethod.Transcode)
+ {
+ if (mediaSource.Protocol == MediaProtocol.File)
+ {
+ return mediaSource.Path;
+ }
+ if (mediaSource.Protocol == MediaProtocol.Http)
+ {
+ return await DownloadFile(jobItem, mediaSource, cancellationToken).ConfigureAwait(false);
+ }
+ throw new InvalidOperationException(string.Format("Cannot direct stream {0} protocol", mediaSource.Protocol));
+ }
+
+ // TODO: Transcode
+ return mediaSource.Path;
+ }
+
+ private async Task<string> Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, CancellationToken cancellationToken)
+ {
+ var options = new AudioOptions
+ {
+ Context = EncodingContext.Streaming,
+ ItemId = item.Id.ToString("N"),
+ DeviceId = jobItem.TargetId,
+ Profile = profile,
+ MediaSources = item.GetMediaSources(false).ToList()
+ };
+
+ var streamInfo = new StreamBuilder().BuildAudioItem(options);
+ var mediaSource = streamInfo.MediaSource;
+
+ if (streamInfo.PlayMethod != PlayMethod.Transcode)
+ {
+ if (mediaSource.Protocol == MediaProtocol.File)
+ {
+ return mediaSource.Path;
+ }
+ if (mediaSource.Protocol == MediaProtocol.Http)
+ {
+ return await DownloadFile(jobItem, mediaSource, cancellationToken).ConfigureAwait(false);
+ }
+ throw new InvalidOperationException(string.Format("Cannot direct stream {0} protocol", mediaSource.Protocol));
+ }
+
+ // TODO: Transcode
+ return mediaSource.Path;
+ }
+
+ private async Task<string> Sync(SyncJobItem jobItem, Photo item, DeviceProfile profile, CancellationToken cancellationToken)
+ {
+ return item.Path;
+ }
+
+ private async Task<string> Sync(SyncJobItem jobItem, Game item, DeviceProfile profile, CancellationToken cancellationToken)
+ {
+ return item.Path;
+ }
+
+ private async Task<string> Sync(SyncJobItem jobItem, Book item, DeviceProfile profile, CancellationToken cancellationToken)
+ {
+ return item.Path;
+ }
+
+ private async Task<string> DownloadFile(SyncJobItem jobItem, MediaSourceInfo mediaSource, CancellationToken cancellationToken)
+ {
+ // TODO: Download
+ return mediaSource.Path;
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index 0c7b5c2b9..b3c7e6202 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Querying;
@@ -23,15 +24,17 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly ISyncRepository _repo;
private readonly IImageProcessor _imageProcessor;
private readonly ILogger _logger;
+ private readonly IUserManager _userManager;
private ISyncProvider[] _providers = { };
- public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger)
+ public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager)
{
_libraryManager = libraryManager;
_repo = repo;
_imageProcessor = imageProcessor;
_logger = logger;
+ _userManager = userManager;
}
public void AddParts(IEnumerable<ISyncProvider> providers)
@@ -41,8 +44,12 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task<SyncJobCreationResult> CreateJob(SyncJobRequest request)
{
- var items = new SyncJobProcessor(_libraryManager, _repo)
- .GetItemsForSync(request.ItemIds)
+ var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager);
+
+ var user = _userManager.GetUserById(request.UserId);
+
+ var items = processor
+ .GetItemsForSync(request.ItemIds, user)
.ToList();
if (items.Any(i => !SupportsSync(i)))
@@ -50,9 +57,9 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new ArgumentException("Item does not support sync.");
}
- if (items.Count == 1)
+ if (string.IsNullOrWhiteSpace(request.Name) && request.ItemIds.Count == 1)
{
- request.Name = GetDefaultName(items[0]);
+ request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0]));
}
if (string.IsNullOrWhiteSpace(request.Name))
@@ -82,8 +89,16 @@ namespace MediaBrowser.Server.Implementations.Sync
Quality = request.Quality
};
+ // It's just a static list
+ if (!items.Any(i => i.IsFolder || i is IItemByName))
+ {
+ job.SyncNewContent = false;
+ }
+
await _repo.Create(job).ConfigureAwait(false);
+ await processor.EnsureJobItems(job).ConfigureAwait(false);
+
return new SyncJobCreationResult
{
Job = GetJob(jobId)
@@ -101,9 +116,9 @@ namespace MediaBrowser.Server.Implementations.Sync
private void FillMetadata(SyncJob job)
{
- var item = new SyncJobProcessor(_libraryManager, _repo)
- .GetItemsForSync(job.RequestedItemIds)
- .FirstOrDefault();
+ var item = job.RequestedItemIds
+ .Select(_libraryManager.GetItemById)
+ .FirstOrDefault(i => i != null);
if (item != null)
{
@@ -139,10 +154,6 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task CancelJob(string id)
{
- var job = GetJob(id);
-
- job.Status = SyncJobStatus.Cancelled;
-
return _repo.DeleteJob(id);
}
@@ -165,10 +176,15 @@ namespace MediaBrowser.Server.Implementations.Sync
return provider.GetSyncTargets().Select(i => new SyncTarget
{
Name = i.Name,
- Id = providerId + "-" + i.Id
+ Id = GetSyncTargetId(providerId, i)
});
}
+ private string GetSyncTargetId(string providerId, SyncTarget target)
+ {
+ return (providerId + "-" + target.Id).GetMD5().ToString("N");
+ }
+
private ISyncProvider GetSyncProvider(SyncTarget target)
{
var providerId = target.Id.Split(new[] { '-' }, 2).First();
@@ -183,35 +199,46 @@ namespace MediaBrowser.Server.Implementations.Sync
public bool SupportsSync(BaseItem item)
{
- if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) ||
- string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(item.MediaType, MediaType.Photo, StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(item.MediaType, MediaType.Game, StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(item.MediaType, MediaType.Book, StringComparison.OrdinalIgnoreCase))
{
if (item.LocationType == LocationType.Virtual)
{
return false;
}
- if (item.RunTimeTicks.HasValue)
+ if (!item.RunTimeTicks.HasValue)
{
- var video = item as Video;
+ return false;
+ }
+
+ var video = item as Video;
+ if (video != null)
+ {
+ if (video.VideoType == VideoType.Iso)
+ {
+ return false;
+ }
- if (video != null)
+ if (video.IsStacked)
{
- if (video.VideoType == VideoType.Iso)
- {
- return false;
- }
-
- if (video.IsStacked)
- {
- return false;
- }
+ return false;
}
+ }
- return true;
+ var game = item as Game;
+ if (game != null)
+ {
+ if (game.IsMultiPart)
+ {
+ return false;
+ }
}
- return false;
+ return true;
}
return item.LocationType == LocationType.FileSystem || item is Season;
@@ -221,5 +248,21 @@ namespace MediaBrowser.Server.Implementations.Sync
{
return item.Name;
}
+
+ public DeviceProfile GetDeviceProfile(string targetId)
+ {
+ foreach (var provider in _providers)
+ {
+ foreach (var target in GetSyncTargets(provider, null))
+ {
+ if (string.Equals(target.Id, targetId, StringComparison.OrdinalIgnoreCase))
+ {
+ return provider.GetDeviceProfile(target);
+ }
+ }
+ }
+
+ return null;
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
index 338529043..c7ffbb27f 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
@@ -35,7 +35,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public async Task Initialize()
{
- var dbFile = Path.Combine(_appPaths.DataPath, "sync2.db");
+ var dbFile = Path.Combine(_appPaths.DataPath, "sync4.db");
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
@@ -44,7 +44,7 @@ namespace MediaBrowser.Server.Implementations.Sync
"create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, UnwatchedOnly BIT, ItemLimit INT, RemoveWhenWatched BIT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)",
"create index if not exists idx_SyncJobs on SyncJobs(Id)",
- "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT)",
+ "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)",
"create index if not exists idx_SyncJobItems on SyncJobs(Id)",
//pragmas
@@ -84,17 +84,20 @@ namespace MediaBrowser.Server.Implementations.Sync
_saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount");
_saveJobItemCommand = _connection.CreateCommand();
- _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, JobId, OutputPath, Status, TargetId) values (@Id, @ItemId, @JobId, @OutputPath, @Status, @TargetId)";
+ _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, JobId, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @JobId, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)";
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Id");
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@ItemId");
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@JobId");
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@OutputPath");
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Status");
+ _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@TargetId");
+ _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@DateCreated");
+ _saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Progress");
}
private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, UnwatchedOnly, ItemLimit, RemoveWhenWatched, SyncNewContent, DateCreated, DateLastModified, ItemCount from SyncJobs";
- private const string BaseJobItemSelectText = "select Id, ItemId, JobId, OutputPath, Status, TargetId from SyncJobItems";
+ private const string BaseJobItemSelectText = "select Id, ItemId, JobId, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems";
public SyncJob GetJob(string id)
{
@@ -105,6 +108,11 @@ namespace MediaBrowser.Server.Implementations.Sync
var guid = new Guid(id);
+ if (guid == Guid.Empty)
+ {
+ throw new ArgumentNullException("id");
+ }
+
using (var cmd = _connection.CreateCommand())
{
cmd.CommandText = BaseJobSelectText + " where Id=@Id";
@@ -321,8 +329,24 @@ namespace MediaBrowser.Server.Implementations.Sync
var whereClauses = new List<string>();
- var startIndex = query.StartIndex ?? 0;
+ if (query.IsCompleted.HasValue)
+ {
+ if (query.IsCompleted.Value)
+ {
+ whereClauses.Add("Status=@Status");
+ }
+ else
+ {
+ whereClauses.Add("Status<>@Status");
+ }
+ cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = SyncJobStatus.Completed.ToString();
+ }
+ var whereTextWithoutPaging = whereClauses.Count == 0 ?
+ string.Empty :
+ " where " + string.Join(" AND ", whereClauses.ToArray());
+
+ var startIndex = query.StartIndex ?? 0;
if (startIndex > 0)
{
whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY DateLastModified DESC LIMIT {0})",
@@ -341,7 +365,7 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.CommandText += " LIMIT " + query.Limit.Value.ToString(_usCulture);
}
- cmd.CommandText += "; select count (Id) from SyncJobs";
+ cmd.CommandText += "; select count (Id) from SyncJobs" + whereTextWithoutPaging;
var list = new List<SyncJob>();
var count = 0;
@@ -386,7 +410,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
if (reader.Read())
{
- return GetSyncJobItem(reader);
+ return GetJobItem(reader);
}
}
}
@@ -394,28 +418,84 @@ namespace MediaBrowser.Server.Implementations.Sync
return null;
}
- public IEnumerable<SyncJobItem> GetJobItems(string jobId)
+ public QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query)
{
- if (string.IsNullOrEmpty(jobId))
+ if (query == null)
{
- throw new ArgumentNullException("jobId");
+ throw new ArgumentNullException("query");
}
- var guid = new Guid(jobId);
-
using (var cmd = _connection.CreateCommand())
{
- cmd.CommandText = BaseJobItemSelectText + " where JobId=@Id";
+ cmd.CommandText = BaseJobItemSelectText;
- cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = guid;
+ var whereClauses = new List<string>();
+
+ if (!string.IsNullOrWhiteSpace(query.JobId))
+ {
+ whereClauses.Add("JobId=@JobId");
+ cmd.Parameters.Add(cmd, "@JobId", DbType.String).Value = query.JobId;
+ }
+
+ if (query.IsCompleted.HasValue)
+ {
+ if (query.IsCompleted.Value)
+ {
+ whereClauses.Add("Status=@Status");
+ }
+ else
+ {
+ whereClauses.Add("Status<>@Status");
+ }
+ cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = SyncJobStatus.Completed.ToString();
+ }
+
+ var whereTextWithoutPaging = whereClauses.Count == 0 ?
+ string.Empty :
+ " where " + string.Join(" AND ", whereClauses.ToArray());
+
+ var startIndex = query.StartIndex ?? 0;
+ if (startIndex > 0)
+ {
+ whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobItems ORDER BY DateCreated LIMIT {0})",
+ startIndex.ToString(_usCulture)));
+ }
+
+ if (whereClauses.Count > 0)
+ {
+ cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
+ }
+
+ cmd.CommandText += " ORDER BY DateCreated";
+
+ if (query.Limit.HasValue)
+ {
+ cmd.CommandText += " LIMIT " + query.Limit.Value.ToString(_usCulture);
+ }
+
+ cmd.CommandText += "; select count (Id) from SyncJobItems" + whereTextWithoutPaging;
+
+ var list = new List<SyncJobItem>();
+ var count = 0;
- using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
+ using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
while (reader.Read())
{
- yield return GetSyncJobItem(reader);
+ list.Add(GetJobItem(reader));
+ }
+
+ if (reader.NextResult() && reader.Read())
+ {
+ count = reader.GetInt32(0);
}
}
+
+ return new QueryResult<SyncJobItem>()
+ {
+ Items = list.ToArray(),
+ TotalRecordCount = count
+ };
}
}
@@ -447,6 +527,8 @@ namespace MediaBrowser.Server.Implementations.Sync
_saveJobItemCommand.GetParameter(index++).Value = jobItem.OutputPath;
_saveJobItemCommand.GetParameter(index++).Value = jobItem.Status;
_saveJobItemCommand.GetParameter(index++).Value = jobItem.TargetId;
+ _saveJobItemCommand.GetParameter(index++).Value = jobItem.DateCreated;
+ _saveJobItemCommand.GetParameter(index++).Value = jobItem.Progress;
_saveJobItemCommand.Transaction = transaction;
@@ -485,7 +567,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- private SyncJobItem GetSyncJobItem(IDataReader reader)
+ private SyncJobItem GetJobItem(IDataReader reader)
{
var info = new SyncJobItem
{
@@ -501,11 +583,18 @@ namespace MediaBrowser.Server.Implementations.Sync
if (!reader.IsDBNull(4))
{
- info.Status = (SyncJobStatus)Enum.Parse(typeof(SyncJobStatus), reader.GetString(4), true);
+ info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(4), true);
}
info.TargetId = reader.GetString(5);
+ info.DateCreated = reader.GetDateTime(6);
+
+ if (!reader.IsDBNull(7))
+ {
+ info.Progress = reader.GetDouble(7);
+ }
+
return info;
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs
new file mode 100644
index 000000000..019951680
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs
@@ -0,0 +1,62 @@
+using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Server.Implementations.Sync
+{
+ public class SyncScheduledTask : IScheduledTask
+ {
+ private readonly ILibraryManager _libraryManager;
+ private readonly ISyncRepository _syncRepo;
+ private readonly ISyncManager _syncManager;
+ private readonly ILogger _logger;
+ private readonly IUserManager _userManager;
+
+ public SyncScheduledTask(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager)
+ {
+ _libraryManager = libraryManager;
+ _syncRepo = syncRepo;
+ _syncManager = syncManager;
+ _logger = logger;
+ _userManager = userManager;
+ }
+
+ public string Name
+ {
+ get { return "Sync"; }
+ }
+
+ public string Description
+ {
+ get { return "Runs scheduled sync jobs"; }
+ }
+
+ public string Category
+ {
+ get
+ {
+ return "Library";
+ }
+ }
+
+ public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
+ {
+ return new SyncJobProcessor(_libraryManager, _syncRepo, _syncManager, _logger, _userManager).Sync(progress,
+ cancellationToken);
+ }
+
+ public IEnumerable<ITaskTrigger> GetDefaultTriggers()
+ {
+ return new ITaskTrigger[]
+ {
+ new IntervalTrigger { Interval = TimeSpan.FromHours(3) },
+ new StartupTrigger{ DelayMs = Convert.ToInt32(TimeSpan.FromMinutes(5).TotalMilliseconds)}
+ };
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index 8b07e483e..1d69cd325 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -346,6 +346,7 @@ namespace MediaBrowser.Server.Startup.Common
new RenameXbmcOptions(ServerConfigurationManager).Run();
new RenameXmlOptions(ServerConfigurationManager).Run();
new DeprecatePlugins(ApplicationPaths).Run();
+ new DeleteDlnaProfiles(ApplicationPaths).Run();
}
/// <summary>
@@ -428,7 +429,7 @@ namespace MediaBrowser.Server.Startup.Common
ImageProcessor = new ImageProcessor(LogManager.GetLogger("ImageProcessor"), ServerConfigurationManager.ApplicationPaths, FileSystemManager, JsonSerializer, MediaEncoder);
RegisterSingleInstance(ImageProcessor);
- SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"));
+ SyncManager = new SyncManager(LibraryManager, SyncRepository, ImageProcessor, LogManager.GetLogger("SyncManager"), UserManager);
RegisterSingleInstance(SyncManager);
DtoService = new DtoService(Logger, LibraryManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager, () => ChannelManager, SyncManager, this);
diff --git a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj b/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
index db525e8e4..b133f78e7 100644
--- a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
+++ b/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
@@ -63,6 +63,7 @@
<Compile Include="FFMpeg\FFMpegInfo.cs" />
<Compile Include="FFMpeg\FFmpegValidator.cs" />
<Compile Include="INativeApp.cs" />
+ <Compile Include="Migrations\DeleteDlnaProfiles.cs" />
<Compile Include="Migrations\DeprecatePlugins.cs" />
<Compile Include="Migrations\IVersionMigration.cs" />
<Compile Include="Migrations\MigrateUserFolders.cs" />
diff --git a/MediaBrowser.Server.Startup.Common/Migrations/DeleteDlnaProfiles.cs b/MediaBrowser.Server.Startup.Common/Migrations/DeleteDlnaProfiles.cs
new file mode 100644
index 000000000..8fe841ffc
--- /dev/null
+++ b/MediaBrowser.Server.Startup.Common/Migrations/DeleteDlnaProfiles.cs
@@ -0,0 +1,42 @@
+using MediaBrowser.Controller;
+using System.IO;
+
+namespace MediaBrowser.Server.Startup.Common.Migrations
+{
+ public class DeleteDlnaProfiles : IVersionMigration
+ {
+ private readonly IServerApplicationPaths _appPaths;
+
+ public DeleteDlnaProfiles(IServerApplicationPaths appPaths)
+ {
+ _appPaths = appPaths;
+ }
+
+ public void Run()
+ {
+ RemoveProfile("Android");
+ RemoveProfile("Windows Phone");
+ RemoveProfile("Windows 8 RT");
+ }
+
+ private void RemoveProfile(string filename)
+ {
+ try
+ {
+ File.Delete(Path.Combine(_appPaths.ConfigurationDirectoryPath, "dlna", "system", filename + ".xml"));
+ }
+ catch
+ {
+
+ }
+ try
+ {
+ File.Delete(Path.Combine(_appPaths.ConfigurationDirectoryPath, "dlna", "user", filename + ".xml"));
+ }
+ catch
+ {
+
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Tests/Dlna/StreamBuilderTests.cs b/MediaBrowser.Tests/Dlna/StreamBuilderTests.cs
deleted file mode 100644
index d2a579838..000000000
--- a/MediaBrowser.Tests/Dlna/StreamBuilderTests.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Entities;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using System;
-using System.Collections.Generic;
-
-namespace MediaBrowser.Tests.Dlna
-{
- [TestClass]
- public class StreamBuilderTests
- {
- [TestMethod]
- public void TestVideoProfile()
- {
- var profile = new AndroidProfile(true, false, new[]
- {
- "high",
- "baseline",
- "constrained baseline"
- });
-
- var builder = new StreamBuilder();
-
- var mediaSources = new List<MediaSourceInfo>
- {
- new MediaSourceInfo
- {
- Bitrate = 6200000,
- Container = "mkv",
- Path= "\\server\\test.mkv",
- Protocol = Model.MediaInfo.MediaProtocol.File,
- RunTimeTicks = TimeSpan.FromMinutes(60).Ticks,
- VideoType = VideoType.VideoFile,
- Type = MediaSourceType.Default,
- MediaStreams = new List<MediaStream>
- {
- new MediaStream
- {
- Codec = "H264",
- Type = MediaStreamType.Video,
- Profile = "High",
- IsCabac = true
- },
- new MediaStream
- {
- Codec = "AC3",
- Type = MediaStreamType.Audio
- }
- }
- }
- };
-
- var options = new VideoOptions
- {
- Context = EncodingContext.Streaming,
- DeviceId = Guid.NewGuid().ToString(),
- ItemId = Guid.NewGuid().ToString(),
- Profile = profile,
- MediaSources = mediaSources
- };
-
- var streamInfo = builder.BuildVideoItem(options);
-
- var url = streamInfo.ToDlnaUrl("http://localhost:8096");
-
- var containsHighProfile = url.IndexOf(";high;", StringComparison.OrdinalIgnoreCase) != -1;
- var containsBaseline = url.IndexOf(";baseline;", StringComparison.OrdinalIgnoreCase) != -1;
-
- Assert.IsTrue(containsHighProfile);
- Assert.IsFalse(containsBaseline);
-
- var isHls = url.IndexOf("master.m3u8?", StringComparison.OrdinalIgnoreCase) != -1;
- Assert.IsTrue(isHls);
- }
- }
-}
diff --git a/MediaBrowser.Tests/MediaBrowser.Tests.csproj b/MediaBrowser.Tests/MediaBrowser.Tests.csproj
index b4755e9c5..f93a2612a 100644
--- a/MediaBrowser.Tests/MediaBrowser.Tests.csproj
+++ b/MediaBrowser.Tests/MediaBrowser.Tests.csproj
@@ -50,7 +50,6 @@
</Otherwise>
</Choose>
<ItemGroup>
- <Compile Include="Dlna\StreamBuilderTests.cs" />
<Compile Include="MediaEncoding\Subtitles\AssParserTests.cs" />
<Compile Include="MediaEncoding\Subtitles\SrtParserTests.cs" />
<Compile Include="MediaEncoding\Subtitles\VttWriterTest.cs" />
diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
index 39fcce57d..b3a1bf84a 100644
--- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs
+++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
@@ -354,7 +354,6 @@ namespace MediaBrowser.WebDashboard.Api
"connectlogin.js",
"dashboardgeneral.js",
"dashboardpage.js",
- "dashboardsync.js",
"device.js",
"devices.js",
"devicesupload.js",
@@ -451,6 +450,8 @@ namespace MediaBrowser.WebDashboard.Api
"songs.js",
"supporterkeypage.js",
"supporterpage.js",
+ "syncactivity.js",
+ "syncsettings.js",
"episodes.js",
"thememediaplayer.js",
"tvgenres.js",
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 6b872d55f..d8e6561ab 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -102,6 +102,9 @@
<Content Include="dashboard-ui\scripts\selectserver.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\scripts\syncsettings.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\scripts\usernew.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -111,6 +114,9 @@
<Content Include="dashboard-ui\selectserver.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\syncsettings.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\thirdparty\apiclient\connectservice.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -399,7 +405,7 @@
<Content Include="dashboard-ui\dashboardgeneral.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\dashboardsync.html">
+ <Content Include="dashboard-ui\syncactivity.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\device.html">
@@ -735,7 +741,7 @@
<Content Include="dashboard-ui\scripts\dashboardgeneral.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\scripts\dashboardsync.js">
+ <Content Include="dashboard-ui\scripts\syncactivity.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\device.js">