2
0
Эх сурвалжийг харах

Merge remote-tracking branch 'upstream/master' into remove-common-process

Mark Monteiro 5 жил өмнө
parent
commit
e0f40f57d8
100 өөрчлөгдсөн 554 нэмэгдсэн , 349 устгасан
  1. 1 1
      DvdLib/Ifo/Dvd.cs
  2. 39 16
      Emby.Dlna/Didl/DidlBuilder.cs
  3. 0 1
      Emby.Dlna/Didl/Filter.cs
  4. 2 2
      Emby.Dlna/Main/DlnaEntryPoint.cs
  5. 1 1
      Emby.Naming/AudioBook/AudioBookFileInfo.cs
  6. 2 10
      Emby.Naming/AudioBook/AudioBookListResolver.cs
  7. 2 1
      Emby.Naming/Subtitles/SubtitleParser.cs
  8. 8 2
      Emby.Naming/TV/EpisodePathParser.cs
  9. 1 1
      Emby.Naming/TV/SeasonPathParserResult.cs
  10. 9 16
      Emby.Naming/Video/StackResolver.cs
  11. 3 1
      Emby.Naming/Video/VideoFileInfo.cs
  12. 7 17
      Emby.Naming/Video/VideoListResolver.cs
  13. 0 1
      Emby.Notifications/Api/NotificationsService.cs
  14. 0 1
      Emby.Notifications/CoreNotificationTypes.cs
  15. 0 1
      Emby.Notifications/NotificationConfigurationFactory.cs
  16. 0 1
      Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
  17. 2 5
      Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
  18. 27 45
      Emby.Server.Implementations/ApplicationHost.cs
  19. 16 19
      Emby.Server.Implementations/Browser/BrowserLauncher.cs
  20. 8 4
      Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs
  21. 1 1
      Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs
  22. 11 2
      Emby.Server.Implementations/ConfigurationOptions.cs
  23. 20 16
      Emby.Server.Implementations/Data/SqliteItemRepository.cs
  24. 1 1
      Emby.Server.Implementations/Data/SqliteUserRepository.cs
  25. 10 5
      Emby.Server.Implementations/EntryPoints/StartupWizard.cs
  26. 5 10
      Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs
  27. 1 1
      Emby.Server.Implementations/HttpServer/FileWriter.cs
  28. 20 10
      Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
  29. 5 5
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  30. 0 1
      Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
  31. 9 9
      Emby.Server.Implementations/Library/UserManager.cs
  32. 1 2
      Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
  33. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  34. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/EntryPoint.cs
  35. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs
  36. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
  37. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs
  38. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
  39. 0 1
      Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
  40. 2 3
      Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
  41. 1 2
      Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs
  42. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs
  43. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
  44. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  45. 0 1
      Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs
  46. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs
  47. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
  48. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
  49. 1 2
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
  50. 1 2
      Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
  51. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
  52. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
  53. 1 2
      Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs
  54. 0 1
      Emby.Server.Implementations/Localization/Core/af.json
  55. 4 5
      Emby.Server.Implementations/Localization/Core/ar.json
  56. 25 4
      Emby.Server.Implementations/Localization/Core/bg-BG.json
  57. 0 1
      Emby.Server.Implementations/Localization/Core/bn.json
  58. 0 1
      Emby.Server.Implementations/Localization/Core/ca.json
  59. 24 3
      Emby.Server.Implementations/Localization/Core/cs.json
  60. 0 1
      Emby.Server.Implementations/Localization/Core/da.json
  61. 23 2
      Emby.Server.Implementations/Localization/Core/de.json
  62. 0 1
      Emby.Server.Implementations/Localization/Core/el.json
  63. 0 1
      Emby.Server.Implementations/Localization/Core/en-GB.json
  64. 23 2
      Emby.Server.Implementations/Localization/Core/en-US.json
  65. 0 1
      Emby.Server.Implementations/Localization/Core/es-AR.json
  66. 0 1
      Emby.Server.Implementations/Localization/Core/es-MX.json
  67. 23 2
      Emby.Server.Implementations/Localization/Core/es.json
  68. 41 42
      Emby.Server.Implementations/Localization/Core/fa.json
  69. 0 1
      Emby.Server.Implementations/Localization/Core/fi.json
  70. 0 1
      Emby.Server.Implementations/Localization/Core/fil.json
  71. 3 2
      Emby.Server.Implementations/Localization/Core/fr-CA.json
  72. 23 2
      Emby.Server.Implementations/Localization/Core/fr.json
  73. 0 1
      Emby.Server.Implementations/Localization/Core/gsw.json
  74. 0 1
      Emby.Server.Implementations/Localization/Core/he.json
  75. 0 1
      Emby.Server.Implementations/Localization/Core/hr.json
  76. 0 1
      Emby.Server.Implementations/Localization/Core/hu.json
  77. 0 1
      Emby.Server.Implementations/Localization/Core/id.json
  78. 0 1
      Emby.Server.Implementations/Localization/Core/is.json
  79. 25 4
      Emby.Server.Implementations/Localization/Core/it.json
  80. 0 1
      Emby.Server.Implementations/Localization/Core/ja.json
  81. 0 1
      Emby.Server.Implementations/Localization/Core/kk.json
  82. 0 1
      Emby.Server.Implementations/Localization/Core/ko.json
  83. 0 1
      Emby.Server.Implementations/Localization/Core/lt-LT.json
  84. 23 2
      Emby.Server.Implementations/Localization/Core/lv.json
  85. 0 1
      Emby.Server.Implementations/Localization/Core/mk.json
  86. 0 1
      Emby.Server.Implementations/Localization/Core/ms.json
  87. 5 2
      Emby.Server.Implementations/Localization/Core/nb.json
  88. 0 1
      Emby.Server.Implementations/Localization/Core/nl.json
  89. 0 1
      Emby.Server.Implementations/Localization/Core/pl.json
  90. 23 2
      Emby.Server.Implementations/Localization/Core/pt-BR.json
  91. 0 1
      Emby.Server.Implementations/Localization/Core/pt-PT.json
  92. 0 1
      Emby.Server.Implementations/Localization/Core/pt.json
  93. 23 2
      Emby.Server.Implementations/Localization/Core/ro.json
  94. 0 1
      Emby.Server.Implementations/Localization/Core/ru.json
  95. 23 2
      Emby.Server.Implementations/Localization/Core/sk.json
  96. 0 1
      Emby.Server.Implementations/Localization/Core/sl-SI.json
  97. 0 1
      Emby.Server.Implementations/Localization/Core/sr.json
  98. 0 1
      Emby.Server.Implementations/Localization/Core/sv.json
  99. 0 1
      Emby.Server.Implementations/Localization/Core/tr.json
  100. 25 4
      Emby.Server.Implementations/Localization/Core/zh-CN.json

+ 1 - 1
DvdLib/Ifo/Dvd.cs

@@ -33,7 +33,7 @@ namespace DvdLib.Ifo
                         continue;
                         continue;
                     }
                     }
 
 
-                    var nums = ifo.Name.Split(new [] { '_' }, StringSplitOptions.RemoveEmptyEntries);
+                    var nums = ifo.Name.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
                     if (nums.Length >= 2 && ushort.TryParse(nums[1], out var ifoNumber))
                     if (nums.Length >= 2 && ushort.TryParse(nums[1], out var ifoNumber))
                     {
                     {
                         ReadVTS(ifoNumber, ifo.FullName);
                         ReadVTS(ifoNumber, ifo.FullName);

+ 39 - 16
Emby.Dlna/Didl/DidlBuilder.cs

@@ -392,24 +392,24 @@ namespace Emby.Dlna.Didl
             {
             {
                 switch (itemStubType.Value)
                 switch (itemStubType.Value)
                 {
                 {
-                    case StubType.Latest:           return _localization.GetLocalizedString("Latest");
-                    case StubType.Playlists:        return _localization.GetLocalizedString("Playlists");
-                    case StubType.AlbumArtists:     return _localization.GetLocalizedString("HeaderAlbumArtists");
-                    case StubType.Albums:           return _localization.GetLocalizedString("Albums");
-                    case StubType.Artists:          return _localization.GetLocalizedString("Artists");
-                    case StubType.Songs:            return _localization.GetLocalizedString("Songs");
-                    case StubType.Genres:           return _localization.GetLocalizedString("Genres");
-                    case StubType.FavoriteAlbums:   return _localization.GetLocalizedString("HeaderFavoriteAlbums");
-                    case StubType.FavoriteArtists:  return _localization.GetLocalizedString("HeaderFavoriteArtists");
-                    case StubType.FavoriteSongs:    return _localization.GetLocalizedString("HeaderFavoriteSongs");
+                    case StubType.Latest: return _localization.GetLocalizedString("Latest");
+                    case StubType.Playlists: return _localization.GetLocalizedString("Playlists");
+                    case StubType.AlbumArtists: return _localization.GetLocalizedString("HeaderAlbumArtists");
+                    case StubType.Albums: return _localization.GetLocalizedString("Albums");
+                    case StubType.Artists: return _localization.GetLocalizedString("Artists");
+                    case StubType.Songs: return _localization.GetLocalizedString("Songs");
+                    case StubType.Genres: return _localization.GetLocalizedString("Genres");
+                    case StubType.FavoriteAlbums: return _localization.GetLocalizedString("HeaderFavoriteAlbums");
+                    case StubType.FavoriteArtists: return _localization.GetLocalizedString("HeaderFavoriteArtists");
+                    case StubType.FavoriteSongs: return _localization.GetLocalizedString("HeaderFavoriteSongs");
                     case StubType.ContinueWatching: return _localization.GetLocalizedString("HeaderContinueWatching");
                     case StubType.ContinueWatching: return _localization.GetLocalizedString("HeaderContinueWatching");
-                    case StubType.Movies:           return _localization.GetLocalizedString("Movies");
-                    case StubType.Collections:      return _localization.GetLocalizedString("Collections");
-                    case StubType.Favorites:        return _localization.GetLocalizedString("Favorites");
-                    case StubType.NextUp:           return _localization.GetLocalizedString("HeaderNextUp");
-                    case StubType.FavoriteSeries:   return _localization.GetLocalizedString("HeaderFavoriteShows");
+                    case StubType.Movies: return _localization.GetLocalizedString("Movies");
+                    case StubType.Collections: return _localization.GetLocalizedString("Collections");
+                    case StubType.Favorites: return _localization.GetLocalizedString("Favorites");
+                    case StubType.NextUp: return _localization.GetLocalizedString("HeaderNextUp");
+                    case StubType.FavoriteSeries: return _localization.GetLocalizedString("HeaderFavoriteShows");
                     case StubType.FavoriteEpisodes: return _localization.GetLocalizedString("HeaderFavoriteEpisodes");
                     case StubType.FavoriteEpisodes: return _localization.GetLocalizedString("HeaderFavoriteEpisodes");
-                    case StubType.Series:           return _localization.GetLocalizedString("Shows");
+                    case StubType.Series: return _localization.GetLocalizedString("Shows");
                     default: break;
                     default: break;
                 }
                 }
             }
             }
@@ -435,6 +435,29 @@ namespace Emby.Dlna.Didl
                     return number + " - " + item.Name;
                     return number + " - " + item.Name;
                 }
                 }
             }
             }
+            else if (item is Episode ep)
+            {
+                var parent = ep.GetParent();
+                var name = parent.Name + " - ";
+
+                if (ep.ParentIndexNumber.HasValue)
+                {
+                    name += "S" + ep.ParentIndexNumber.Value.ToString("00", CultureInfo.InvariantCulture);
+                }
+                else if (!item.IndexNumber.HasValue)
+                {
+                    return name + " - " + item.Name;
+                }
+
+                name += "E" + ep.IndexNumber.Value.ToString("00", CultureInfo.InvariantCulture);
+                if (ep.IndexNumberEnd.HasValue)
+                {
+                    name += "-" + ep.IndexNumberEnd.Value.ToString("00", CultureInfo.InvariantCulture);
+                }
+
+                name += " - " + item.Name;
+                return name;
+            }
 
 
             return item.Name;
             return item.Name;
         }
         }

+ 0 - 1
Emby.Dlna/Didl/Filter.cs

@@ -1,7 +1,6 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
 
 
 using System;
 using System;
-using MediaBrowser.Model.Extensions;
 
 
 namespace Emby.Dlna.Didl
 namespace Emby.Dlna.Didl
 {
 {

+ 2 - 2
Emby.Dlna/Main/DlnaEntryPoint.cs

@@ -262,8 +262,8 @@ namespace Emby.Dlna.Main
             {
             {
                 if (address.AddressFamily == AddressFamily.InterNetworkV6)
                 if (address.AddressFamily == AddressFamily.InterNetworkV6)
                 {
                 {
-                   // Not support IPv6 right now
-                   continue;
+                    // Not supporting IPv6 right now
+                    continue;
                 }
                 }
 
 
                 var fullService = "urn:schemas-upnp-org:device:MediaServer:1";
                 var fullService = "urn:schemas-upnp-org:device:MediaServer:1";

+ 1 - 1
Emby.Naming/AudioBook/AudioBookFileInfo.cs

@@ -37,7 +37,7 @@ namespace Emby.Naming.AudioBook
         /// <value>The type.</value>
         /// <value>The type.</value>
         public bool IsDirectory { get; set; }
         public bool IsDirectory { get; set; }
 
 
-        /// <inheritdoc/>
+        /// <inheritdoc />
         public int CompareTo(AudioBookFileInfo other)
         public int CompareTo(AudioBookFileInfo other)
         {
         {
             if (ReferenceEquals(this, other))
             if (ReferenceEquals(this, other))

+ 2 - 10
Emby.Naming/AudioBook/AudioBookListResolver.cs

@@ -29,11 +29,7 @@ namespace Emby.Naming.AudioBook
             // Filter out all extras, otherwise they could cause stacks to not be resolved
             // Filter out all extras, otherwise they could cause stacks to not be resolved
             // See the unit test TestStackedWithTrailer
             // See the unit test TestStackedWithTrailer
             var metadata = audiobookFileInfos
             var metadata = audiobookFileInfos
-                .Select(i => new FileSystemMetadata
-                {
-                    FullName = i.Path,
-                    IsDirectory = i.IsDirectory
-                });
+                .Select(i => new FileSystemMetadata { FullName = i.Path, IsDirectory = i.IsDirectory });
 
 
             var stackResult = new StackResolver(_options)
             var stackResult = new StackResolver(_options)
                 .ResolveAudioBooks(metadata);
                 .ResolveAudioBooks(metadata);
@@ -42,11 +38,7 @@ namespace Emby.Naming.AudioBook
             {
             {
                 var stackFiles = stack.Files.Select(i => audioBookResolver.Resolve(i, stack.IsDirectoryStack)).ToList();
                 var stackFiles = stack.Files.Select(i => audioBookResolver.Resolve(i, stack.IsDirectoryStack)).ToList();
                 stackFiles.Sort();
                 stackFiles.Sort();
-                var info = new AudioBookInfo
-                {
-                    Files = stackFiles,
-                    Name = stack.Name
-                };
+                var info = new AudioBookInfo { Files = stackFiles, Name = stack.Name };
 
 
                 yield return info;
                 yield return info;
             }
             }

+ 2 - 1
Emby.Naming/Subtitles/SubtitleParser.cs

@@ -37,7 +37,8 @@ namespace Emby.Naming.Subtitles
                 IsForced = _options.SubtitleForcedFlags.Any(i => flags.Contains(i, StringComparer.OrdinalIgnoreCase))
                 IsForced = _options.SubtitleForcedFlags.Any(i => flags.Contains(i, StringComparer.OrdinalIgnoreCase))
             };
             };
 
 
-            var parts = flags.Where(i => !_options.SubtitleDefaultFlags.Contains(i, StringComparer.OrdinalIgnoreCase) && !_options.SubtitleForcedFlags.Contains(i, StringComparer.OrdinalIgnoreCase))
+            var parts = flags.Where(i => !_options.SubtitleDefaultFlags.Contains(i, StringComparer.OrdinalIgnoreCase)
+                && !_options.SubtitleForcedFlags.Contains(i, StringComparer.OrdinalIgnoreCase))
                 .ToList();
                 .ToList();
 
 
             // Should have a name, language and file extension
             // Should have a name, language and file extension

+ 8 - 2
Emby.Naming/TV/EpisodePathParser.cs

@@ -18,7 +18,13 @@ namespace Emby.Naming.TV
             _options = options;
             _options = options;
         }
         }
 
 
-        public EpisodePathParserResult Parse(string path, bool isDirectory, bool? isNamed = null, bool? isOptimistic = null, bool? supportsAbsoluteNumbers = null, bool fillExtendedInfo = true)
+        public EpisodePathParserResult Parse(
+            string path,
+            bool isDirectory,
+            bool? isNamed = null,
+            bool? isOptimistic = null,
+            bool? supportsAbsoluteNumbers = null,
+            bool fillExtendedInfo = true)
         {
         {
             // Added to be able to use regex patterns which require a file extension.
             // Added to be able to use regex patterns which require a file extension.
             // There were no failed tests without this block, but to be safe, we can keep it until
             // There were no failed tests without this block, but to be safe, we can keep it until
@@ -64,7 +70,7 @@ namespace Emby.Naming.TV
                 {
                 {
                     result.SeriesName = result.SeriesName
                     result.SeriesName = result.SeriesName
                         .Trim()
                         .Trim()
-                        .Trim(new[] { '_', '.', '-' })
+                        .Trim('_', '.', '-')
                         .Trim();
                         .Trim();
                 }
                 }
             }
             }

+ 1 - 1
Emby.Naming/TV/SeasonPathParserResult.cs

@@ -11,7 +11,7 @@ namespace Emby.Naming.TV
         public int? SeasonNumber { get; set; }
         public int? SeasonNumber { get; set; }
 
 
         /// <summary>
         /// <summary>
-        /// Gets or sets a value indicating whether this <see cref="SeasonPathParserResult"/> is success.
+        /// Gets or sets a value indicating whether this <see cref="SeasonPathParserResult" /> is success.
         /// </summary>
         /// </summary>
         /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
         /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
         public bool Success { get; set; }
         public bool Success { get; set; }

+ 9 - 16
Emby.Naming/Video/StackResolver.cs

@@ -21,31 +21,24 @@ namespace Emby.Naming.Video
 
 
         public IEnumerable<FileStack> ResolveDirectories(IEnumerable<string> files)
         public IEnumerable<FileStack> ResolveDirectories(IEnumerable<string> files)
         {
         {
-            return Resolve(files.Select(i => new FileSystemMetadata
-            {
-                FullName = i,
-                IsDirectory = true
-            }));
+            return Resolve(files.Select(i => new FileSystemMetadata { FullName = i, IsDirectory = true }));
         }
         }
 
 
         public IEnumerable<FileStack> ResolveFiles(IEnumerable<string> files)
         public IEnumerable<FileStack> ResolveFiles(IEnumerable<string> files)
         {
         {
-            return Resolve(files.Select(i => new FileSystemMetadata
-            {
-                FullName = i,
-                IsDirectory = false
-            }));
+            return Resolve(files.Select(i => new FileSystemMetadata { FullName = i, IsDirectory = false }));
         }
         }
 
 
         public IEnumerable<FileStack> ResolveAudioBooks(IEnumerable<FileSystemMetadata> files)
         public IEnumerable<FileStack> ResolveAudioBooks(IEnumerable<FileSystemMetadata> files)
         {
         {
-            foreach (var directory in files.GroupBy(file => file.IsDirectory ? file.FullName : Path.GetDirectoryName(file.FullName)))
+            var groupedDirectoryFiles = files.GroupBy(file =>
+                file.IsDirectory
+                    ? file.FullName
+                    : Path.GetDirectoryName(file.FullName));
+
+            foreach (var directory in groupedDirectoryFiles)
             {
             {
-                var stack = new FileStack()
-                {
-                    Name = Path.GetFileName(directory.Key),
-                    IsDirectoryStack = false
-                };
+                var stack = new FileStack { Name = Path.GetFileName(directory.Key), IsDirectoryStack = false };
                 foreach (var file in directory)
                 foreach (var file in directory)
                 {
                 {
                     if (file.IsDirectory)
                     if (file.IsDirectory)

+ 3 - 1
Emby.Naming/Video/VideoFileInfo.cs

@@ -77,7 +77,9 @@ namespace Emby.Naming.Video
         /// Gets the file name without extension.
         /// Gets the file name without extension.
         /// </summary>
         /// </summary>
         /// <value>The file name without extension.</value>
         /// <value>The file name without extension.</value>
-        public string FileNameWithoutExtension => !IsDirectory ? System.IO.Path.GetFileNameWithoutExtension(Path) : System.IO.Path.GetFileName(Path);
+        public string FileNameWithoutExtension => !IsDirectory
+            ? System.IO.Path.GetFileNameWithoutExtension(Path)
+            : System.IO.Path.GetFileName(Path);
 
 
         /// <inheritdoc />
         /// <inheritdoc />
         public override string ToString()
         public override string ToString()

+ 7 - 17
Emby.Naming/Video/VideoListResolver.cs

@@ -33,11 +33,7 @@ namespace Emby.Naming.Video
             // See the unit test TestStackedWithTrailer
             // See the unit test TestStackedWithTrailer
             var nonExtras = videoInfos
             var nonExtras = videoInfos
                 .Where(i => i.ExtraType == null)
                 .Where(i => i.ExtraType == null)
-                .Select(i => new FileSystemMetadata
-                {
-                    FullName = i.Path,
-                    IsDirectory = i.IsDirectory
-                });
+                .Select(i => new FileSystemMetadata { FullName = i.Path, IsDirectory = i.IsDirectory });
 
 
             var stackResult = new StackResolver(_options)
             var stackResult = new StackResolver(_options)
                 .Resolve(nonExtras).ToList();
                 .Resolve(nonExtras).ToList();
@@ -57,11 +53,7 @@ namespace Emby.Naming.Video
 
 
                 info.Year = info.Files[0].Year;
                 info.Year = info.Files[0].Year;
 
 
-                var extraBaseNames = new List<string>
-                {
-                    stack.Name,
-                    Path.GetFileNameWithoutExtension(stack.Files[0])
-                };
+                var extraBaseNames = new List<string> { stack.Name, Path.GetFileNameWithoutExtension(stack.Files[0]) };
 
 
                 var extras = GetExtras(remainingFiles, extraBaseNames);
                 var extras = GetExtras(remainingFiles, extraBaseNames);
 
 
@@ -83,10 +75,7 @@ namespace Emby.Naming.Video
 
 
             foreach (var media in standaloneMedia)
             foreach (var media in standaloneMedia)
             {
             {
-                var info = new VideoInfo(media.Name)
-                {
-                    Files = new List<VideoFileInfo> { media }
-                };
+                var info = new VideoInfo(media.Name) { Files = new List<VideoFileInfo> { media } };
 
 
                 info.Year = info.Files[0].Year;
                 info.Year = info.Files[0].Year;
 
 
@@ -222,8 +211,8 @@ namespace Emby.Naming.Video
             {
             {
                 testFilename = testFilename.Substring(folderName.Length).Trim();
                 testFilename = testFilename.Substring(folderName.Length).Trim();
                 return string.IsNullOrEmpty(testFilename)
                 return string.IsNullOrEmpty(testFilename)
-                    || testFilename[0] == '-'
-                    || string.IsNullOrWhiteSpace(Regex.Replace(testFilename, @"\[([^]]*)\]", string.Empty));
+                   || testFilename[0] == '-'
+                   || string.IsNullOrWhiteSpace(Regex.Replace(testFilename, @"\[([^]]*)\]", string.Empty));
             }
             }
 
 
             return false;
             return false;
@@ -239,7 +228,8 @@ namespace Emby.Naming.Video
 
 
             return remainingFiles
             return remainingFiles
                 .Where(i => i.ExtraType == null)
                 .Where(i => i.ExtraType == null)
-                .Where(i => baseNames.Any(b => i.FileNameWithoutExtension.StartsWith(b, StringComparison.OrdinalIgnoreCase)))
+                .Where(i => baseNames.Any(b =>
+                    i.FileNameWithoutExtension.StartsWith(b, StringComparison.OrdinalIgnoreCase)))
                 .ToList();
                 .ToList();
         }
         }
     }
     }

+ 0 - 1
Emby.Notifications/Api/NotificationsService.cs

@@ -1,6 +1,5 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
 #pragma warning disable SA1402
 #pragma warning disable SA1402
-#pragma warning disable SA1600
 #pragma warning disable SA1649
 #pragma warning disable SA1649
 
 
 using System;
 using System;

+ 0 - 1
Emby.Notifications/CoreNotificationTypes.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Notifications/NotificationConfigurationFactory.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System.Collections.Generic;
 using System.Collections.Generic;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;

+ 0 - 1
Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs

@@ -8,7 +8,6 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Common.Updates;
-using MediaBrowser.Controller;
 using MediaBrowser.Controller.Authentication;
 using MediaBrowser.Controller.Authentication;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;

+ 2 - 5
Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs

@@ -5,7 +5,7 @@ using MediaBrowser.Common.Configuration;
 namespace Emby.Server.Implementations.AppBase
 namespace Emby.Server.Implementations.AppBase
 {
 {
     /// <summary>
     /// <summary>
-    /// Provides a base class to hold common application paths used by both the Ui and Server.
+    /// Provides a base class to hold common application paths used by both the UI and Server.
     /// This can be subclassed to add application-specific paths.
     /// This can be subclassed to add application-specific paths.
     /// </summary>
     /// </summary>
     public abstract class BaseApplicationPaths : IApplicationPaths
     public abstract class BaseApplicationPaths : IApplicationPaths
@@ -37,10 +37,7 @@ namespace Emby.Server.Implementations.AppBase
         /// <value>The program data path.</value>
         /// <value>The program data path.</value>
         public string ProgramDataPath { get; }
         public string ProgramDataPath { get; }
 
 
-        /// <summary>
-        /// Gets the path to the web UI resources folder.
-        /// </summary>
-        /// <value>The web UI resources path.</value>
+        /// <inheritdoc/>
         public string WebPath { get; }
         public string WebPath { get; }
 
 
         /// <summary>
         /// <summary>

+ 27 - 45
Emby.Server.Implementations/ApplicationHost.cs

@@ -42,6 +42,7 @@ using Emby.Server.Implementations.Playlists;
 using Emby.Server.Implementations.ScheduledTasks;
 using Emby.Server.Implementations.ScheduledTasks;
 using Emby.Server.Implementations.Security;
 using Emby.Server.Implementations.Security;
 using Emby.Server.Implementations.Serialization;
 using Emby.Server.Implementations.Serialization;
+using Emby.Server.Implementations.Services;
 using Emby.Server.Implementations.Session;
 using Emby.Server.Implementations.Session;
 using Emby.Server.Implementations.SocketSharp;
 using Emby.Server.Implementations.SocketSharp;
 using Emby.Server.Implementations.TV;
 using Emby.Server.Implementations.TV;
@@ -233,11 +234,6 @@ namespace Emby.Server.Implementations
         /// </summary>
         /// </summary>
         public int HttpsPort { get; private set; }
         public int HttpsPort { get; private set; }
 
 
-        /// <summary>
-        /// Gets the content root for the webhost.
-        /// </summary>
-        public string ContentRoot { get; private set; }
-
         /// <summary>
         /// <summary>
         /// Gets the server configuration manager.
         /// Gets the server configuration manager.
         /// </summary>
         /// </summary>
@@ -608,13 +604,7 @@ namespace Emby.Server.Implementations
 
 
             DiscoverTypes();
             DiscoverTypes();
 
 
-            await RegisterResources(serviceCollection, startupConfig).ConfigureAwait(false);
-
-            ContentRoot = ServerConfigurationManager.Configuration.DashboardSourcePath;
-            if (string.IsNullOrEmpty(ContentRoot))
-            {
-                ContentRoot = ServerConfigurationManager.ApplicationPaths.WebPath;
-            }
+            await RegisterServices(serviceCollection, startupConfig).ConfigureAwait(false);
         }
         }
 
 
         public async Task ExecuteWebsocketHandlerAsync(HttpContext context, Func<Task> next)
         public async Task ExecuteWebsocketHandlerAsync(HttpContext context, Func<Task> next)
@@ -645,9 +635,9 @@ namespace Emby.Server.Implementations
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// Registers resources that classes will depend on
+        /// Registers services/resources with the service collection that will be available via DI.
         /// </summary>
         /// </summary>
-        protected async Task RegisterResources(IServiceCollection serviceCollection, IConfiguration startupConfig)
+        protected async Task RegisterServices(IServiceCollection serviceCollection, IConfiguration startupConfig)
         {
         {
             serviceCollection.AddMemoryCache();
             serviceCollection.AddMemoryCache();
 
 
@@ -761,20 +751,9 @@ namespace Emby.Server.Implementations
             CertificateInfo = GetCertificateInfo(true);
             CertificateInfo = GetCertificateInfo(true);
             Certificate = GetCertificate(CertificateInfo);
             Certificate = GetCertificate(CertificateInfo);
 
 
-            HttpServer = new HttpListenerHost(
-                this,
-                LoggerFactory.CreateLogger<HttpListenerHost>(),
-                ServerConfigurationManager,
-                startupConfig,
-                NetworkManager,
-                JsonSerializer,
-                XmlSerializer,
-                CreateHttpListener())
-            {
-                GlobalResponse = LocalizationManager.GetLocalizedString("StartupEmbyServerIsLoading")
-            };
-
-            serviceCollection.AddSingleton(HttpServer);
+            serviceCollection.AddSingleton<ServiceController>();
+            serviceCollection.AddSingleton<IHttpListener, WebSocketSharpListener>();
+            serviceCollection.AddSingleton<IHttpServer, HttpListenerHost>();
 
 
             ImageProcessor = new ImageProcessor(LoggerFactory.CreateLogger<ImageProcessor>(), ServerConfigurationManager.ApplicationPaths, FileSystemManager, ImageEncoder, () => LibraryManager, () => MediaEncoder);
             ImageProcessor = new ImageProcessor(LoggerFactory.CreateLogger<ImageProcessor>(), ServerConfigurationManager.ApplicationPaths, FileSystemManager, ImageEncoder, () => LibraryManager, () => MediaEncoder);
             serviceCollection.AddSingleton(ImageProcessor);
             serviceCollection.AddSingleton(ImageProcessor);
@@ -836,10 +815,15 @@ namespace Emby.Server.Implementations
 
 
             serviceCollection.AddSingleton<IDeviceDiscovery>(new DeviceDiscovery(ServerConfigurationManager));
             serviceCollection.AddSingleton<IDeviceDiscovery>(new DeviceDiscovery(ServerConfigurationManager));
 
 
-            ChapterManager = new ChapterManager(LibraryManager, LoggerFactory, ServerConfigurationManager, ItemRepository);
+            ChapterManager = new ChapterManager(ItemRepository);
             serviceCollection.AddSingleton(ChapterManager);
             serviceCollection.AddSingleton(ChapterManager);
 
 
-            EncodingManager = new MediaEncoder.EncodingManager(FileSystemManager, LoggerFactory, MediaEncoder, ChapterManager, LibraryManager);
+            EncodingManager = new MediaEncoder.EncodingManager(
+                LoggerFactory.CreateLogger<MediaEncoder.EncodingManager>(),
+                FileSystemManager,
+                MediaEncoder,
+                ChapterManager,
+                LibraryManager);
             serviceCollection.AddSingleton(EncodingManager);
             serviceCollection.AddSingleton(EncodingManager);
 
 
             var activityLogRepo = GetActivityLogRepository();
             var activityLogRepo = GetActivityLogRepository();
@@ -881,6 +865,14 @@ namespace Emby.Server.Implementations
             ((LibraryManager)LibraryManager).ItemRepository = ItemRepository;
             ((LibraryManager)LibraryManager).ItemRepository = ItemRepository;
         }
         }
 
 
+        /// <summary>
+        /// Create services registered with the service container that need to be initialized at application startup.
+        /// </summary>
+        public void InitializeServices()
+        {
+            HttpServer = Resolve<IHttpServer>();
+        }
+
         public static void LogEnvironmentInfo(ILogger logger, IApplicationPaths appPaths)
         public static void LogEnvironmentInfo(ILogger logger, IApplicationPaths appPaths)
         {
         {
             // Distinct these to prevent users from reporting problems that aren't actually problems
             // Distinct these to prevent users from reporting problems that aren't actually problems
@@ -1064,7 +1056,7 @@ namespace Emby.Server.Implementations
                         .Where(i => i != null)
                         .Where(i => i != null)
                         .ToArray();
                         .ToArray();
 
 
-            HttpServer.Init(GetExports<IService>(false), GetExports<IWebSocketListener>(), GetUrlPrefixes());
+            HttpServer.Init(GetExportTypes<IService>(), GetExports<IWebSocketListener>(), GetUrlPrefixes());
 
 
             LibraryManager.AddParts(
             LibraryManager.AddParts(
                 GetExports<IResolverIgnoreRule>(),
                 GetExports<IResolverIgnoreRule>(),
@@ -1158,7 +1150,7 @@ namespace Emby.Server.Implementations
                 {
                 {
                     exportedTypes = ass.GetExportedTypes();
                     exportedTypes = ass.GetExportedTypes();
                 }
                 }
-                catch (TypeLoadException ex)
+                catch (FileNotFoundException ex)
                 {
                 {
                     Logger.LogError(ex, "Error getting exported types from {Assembly}", ass.FullName);
                     Logger.LogError(ex, "Error getting exported types from {Assembly}", ass.FullName);
                     continue;
                     continue;
@@ -1198,8 +1190,6 @@ namespace Emby.Server.Implementations
             });
             });
         }
         }
 
 
-        protected IHttpListener CreateHttpListener() => new WebSocketSharpListener(LoggerFactory.CreateLogger<WebSocketSharpListener>());
-
         private CertificateInfo GetCertificateInfo(bool generateCertificate)
         private CertificateInfo GetCertificateInfo(bool generateCertificate)
         {
         {
             // Custom cert
             // Custom cert
@@ -1510,18 +1500,10 @@ namespace Emby.Server.Implementations
         public string GetLocalApiUrl(ReadOnlySpan<char> host)
         public string GetLocalApiUrl(ReadOnlySpan<char> host)
         {
         {
             var url = new StringBuilder(64);
             var url = new StringBuilder(64);
-            if (EnableHttps)
-            {
-                url.Append("https://");
-            }
-            else
-            {
-                url.Append("http://");
-            }
-
-            url.Append(host)
+            url.Append(EnableHttps ? "https://" : "http://")
+                .Append(host)
                 .Append(':')
                 .Append(':')
-                .Append(HttpPort);
+                .Append(EnableHttps ? HttpsPort : HttpPort);
 
 
             string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
             string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
             if (baseUrl.Length != 0)
             if (baseUrl.Length != 0)

+ 16 - 19
Emby.Server.Implementations/Browser/BrowserLauncher.cs

@@ -1,51 +1,48 @@
 using System;
 using System;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
+using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.Browser
 namespace Emby.Server.Implementations.Browser
 {
 {
     /// <summary>
     /// <summary>
-    /// Class BrowserLauncher.
+    /// Assists in opening application URLs in an external browser.
     /// </summary>
     /// </summary>
     public static class BrowserLauncher
     public static class BrowserLauncher
     {
     {
         /// <summary>
         /// <summary>
-        /// Opens the dashboard page.
+        /// Opens the home page of the web client.
         /// </summary>
         /// </summary>
-        /// <param name="page">The page.</param>
         /// <param name="appHost">The app host.</param>
         /// <param name="appHost">The app host.</param>
-        private static void OpenDashboardPage(string page, IServerApplicationHost appHost)
+        public static void OpenWebApp(IServerApplicationHost appHost)
         {
         {
-            var url = appHost.GetLocalApiUrl("localhost") + "/web/" + page;
-
-            OpenUrl(appHost, url);
+            TryOpenUrl(appHost, "/web/index.html");
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// Opens the web client.
+        /// Opens the swagger API page.
         /// </summary>
         /// </summary>
         /// <param name="appHost">The app host.</param>
         /// <param name="appHost">The app host.</param>
-        public static void OpenWebApp(IServerApplicationHost appHost)
+        public static void OpenSwaggerPage(IServerApplicationHost appHost)
         {
         {
-            OpenDashboardPage("index.html", appHost);
+            TryOpenUrl(appHost, "/swagger/index.html");
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// Opens the URL.
+        /// Opens the specified URL in an external browser window. Any exceptions will be logged, but ignored.
         /// </summary>
         /// </summary>
-        /// <param name="appHost">The application host instance.</param>
+        /// <param name="appHost">The application host.</param>
         /// <param name="url">The URL.</param>
         /// <param name="url">The URL.</param>
-        private static void OpenUrl(IServerApplicationHost appHost, string url)
+        private static void TryOpenUrl(IServerApplicationHost appHost, string url)
         {
         {
             try
             try
             {
             {
-                appHost.LaunchUrl(url);
-            }
-            catch (NotSupportedException)
-            {
-
+                string baseUrl = appHost.GetLocalApiUrl("localhost");
+                appHost.LaunchUrl(baseUrl + url);
             }
             }
-            catch (Exception)
+            catch (Exception ex)
             {
             {
+                var logger = appHost.Resolve<ILogger>();
+                logger?.LogError(ex, "Failed to open browser window with URL {URL}", url);
             }
             }
         }
         }
     }
     }

+ 8 - 4
Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs

@@ -9,6 +9,7 @@ using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Tasks;
 using MediaBrowser.Model.Tasks;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;
+using MediaBrowser.Model.Globalization;
 
 
 namespace Emby.Server.Implementations.Channels
 namespace Emby.Server.Implementations.Channels
 {
 {
@@ -18,27 +19,30 @@ namespace Emby.Server.Implementations.Channels
         private readonly IUserManager _userManager;
         private readonly IUserManager _userManager;
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
+        private readonly ILocalizationManager _localization;
 
 
         public RefreshChannelsScheduledTask(
         public RefreshChannelsScheduledTask(
             IChannelManager channelManager,
             IChannelManager channelManager,
             IUserManager userManager,
             IUserManager userManager,
             ILogger<RefreshChannelsScheduledTask> logger,
             ILogger<RefreshChannelsScheduledTask> logger,
-            ILibraryManager libraryManager)
+            ILibraryManager libraryManager,
+            ILocalizationManager localization)
         {
         {
             _channelManager = channelManager;
             _channelManager = channelManager;
             _userManager = userManager;
             _userManager = userManager;
             _logger = logger;
             _logger = logger;
             _libraryManager = libraryManager;
             _libraryManager = libraryManager;
+            _localization = localization;
         }
         }
 
 
         /// <inheritdoc />
         /// <inheritdoc />
-        public string Name => "Refresh Channels";
+        public string Name => _localization.GetLocalizedString("TasksRefreshChannels");
 
 
         /// <inheritdoc />
         /// <inheritdoc />
-        public string Description => "Refreshes internet channel information.";
+        public string Description => _localization.GetLocalizedString("TasksRefreshChannelsDescription");
 
 
         /// <inheritdoc />
         /// <inheritdoc />
-        public string Category => "Internet Channels";
+        public string Category => _localization.GetLocalizedString("TasksChannelsCategory");
 
 
         /// <inheritdoc />
         /// <inheritdoc />
         public bool IsHidden => ((ChannelManager)_channelManager).Channels.Length == 0;
         public bool IsHidden => ((ChannelManager)_channelManager).Channels.Length == 0;

+ 1 - 1
Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -132,7 +132,7 @@ namespace Emby.Server.Implementations.Configuration
             var newPath = newConfig.MetadataPath;
             var newPath = newConfig.MetadataPath;
 
 
             if (!string.IsNullOrWhiteSpace(newPath)
             if (!string.IsNullOrWhiteSpace(newPath)
-                && !string.Equals(Configuration.MetadataPath, newPath,  StringComparison.Ordinal))
+                && !string.Equals(Configuration.MetadataPath, newPath, StringComparison.Ordinal))
             {
             {
                 // Validate
                 // Validate
                 if (!Directory.Exists(newPath))
                 if (!Directory.Exists(newPath))

+ 11 - 2
Emby.Server.Implementations/ConfigurationOptions.cs

@@ -1,13 +1,22 @@
 using System.Collections.Generic;
 using System.Collections.Generic;
+using Emby.Server.Implementations.HttpServer;
+using MediaBrowser.Providers.Music;
 using static MediaBrowser.Controller.Extensions.ConfigurationExtensions;
 using static MediaBrowser.Controller.Extensions.ConfigurationExtensions;
 
 
 namespace Emby.Server.Implementations
 namespace Emby.Server.Implementations
 {
 {
+    /// <summary>
+    /// Static class containing the default configuration options for the web server.
+    /// </summary>
     public static class ConfigurationOptions
     public static class ConfigurationOptions
     {
     {
-        public static Dictionary<string, string> Configuration => new Dictionary<string, string>
+        /// <summary>
+        /// Gets a new copy of the default configuration options.
+        /// </summary>
+        public static Dictionary<string, string> DefaultConfiguration => new Dictionary<string, string>
         {
         {
-            { "HttpListenerHost:DefaultRedirectPath", "web/index.html" },
+            { HostWebClientKey, bool.TrueString },
+            { HttpListenerHost.DefaultRedirectKey, "web/index.html" },
             { FfmpegProbeSizeKey, "1G" },
             { FfmpegProbeSizeKey, "1G" },
             { FfmpegAnalyzeDurationKey, "200M" },
             { FfmpegAnalyzeDurationKey, "200M" },
             { PlaylistsAllowDuplicatesKey, bool.TrueString }
             { PlaylistsAllowDuplicatesKey, bool.TrueString }

+ 20 - 16
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -454,7 +454,7 @@ namespace Emby.Server.Implementations.Data
 
 
         private static string GetSaveItemCommandText()
         private static string GetSaveItemCommandText()
         {
         {
-            var saveColumns = new []
+            var saveColumns = new[]
             {
             {
                 "guid",
                 "guid",
                 "type",
                 "type",
@@ -560,7 +560,7 @@ namespace Emby.Server.Implementations.Data
                 throw new ArgumentNullException(nameof(item));
                 throw new ArgumentNullException(nameof(item));
             }
             }
 
 
-            SaveItems(new [] { item }, cancellationToken);
+            SaveItems(new[] { item }, cancellationToken);
         }
         }
 
 
         public void SaveImages(BaseItem item)
         public void SaveImages(BaseItem item)
@@ -1622,7 +1622,7 @@ namespace Emby.Server.Implementations.Data
                 {
                 {
                     IEnumerable<MetadataFields> GetLockedFields(string s)
                     IEnumerable<MetadataFields> GetLockedFields(string s)
                     {
                     {
-                        foreach (var i in s.Split(new [] { '|' }, StringSplitOptions.RemoveEmptyEntries))
+                        foreach (var i in s.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                         {
                         {
                             if (Enum.TryParse(i, true, out MetadataFields parsedValue))
                             if (Enum.TryParse(i, true, out MetadataFields parsedValue))
                             {
                             {
@@ -1818,7 +1818,7 @@ namespace Emby.Server.Implementations.Data
             {
             {
                 if (!reader.IsDBNull(index))
                 if (!reader.IsDBNull(index))
                 {
                 {
-                    item.ProductionLocations = reader.GetString(index).Split(new [] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
+                    item.ProductionLocations = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
                 }
                 }
                 index++;
                 index++;
             }
             }
@@ -2006,7 +2006,7 @@ namespace Emby.Server.Implementations.Data
         /// <summary>
         /// <summary>
         /// Saves the chapters.
         /// Saves the chapters.
         /// </summary>
         /// </summary>
-        public void SaveChapters(Guid id, List<ChapterInfo> chapters)
+        public void SaveChapters(Guid id, IReadOnlyList<ChapterInfo> chapters)
         {
         {
             CheckDisposed();
             CheckDisposed();
 
 
@@ -2035,22 +2035,24 @@ namespace Emby.Server.Implementations.Data
             }
             }
         }
         }
 
 
-        private void InsertChapters(byte[] idBlob, List<ChapterInfo> chapters, IDatabaseConnection db)
+        private void InsertChapters(byte[] idBlob, IReadOnlyList<ChapterInfo> chapters, IDatabaseConnection db)
         {
         {
             var startIndex = 0;
             var startIndex = 0;
             var limit = 100;
             var limit = 100;
             var chapterIndex = 0;
             var chapterIndex = 0;
 
 
+            const string StartInsertText = "insert into " + ChaptersTableName + " (ItemId, ChapterIndex, StartPositionTicks, Name, ImagePath, ImageDateModified) values ";
+            var insertText = new StringBuilder(StartInsertText, 256);
+
             while (startIndex < chapters.Count)
             while (startIndex < chapters.Count)
             {
             {
-                var insertText = new StringBuilder("insert into " + ChaptersTableName + " (ItemId, ChapterIndex, StartPositionTicks, Name, ImagePath, ImageDateModified) values ");
-
                 var endIndex = Math.Min(chapters.Count, startIndex + limit);
                 var endIndex = Math.Min(chapters.Count, startIndex + limit);
 
 
                 for (var i = startIndex; i < endIndex; i++)
                 for (var i = startIndex; i < endIndex; i++)
                 {
                 {
                     insertText.AppendFormat("(@ItemId, @ChapterIndex{0}, @StartPositionTicks{0}, @Name{0}, @ImagePath{0}, @ImageDateModified{0}),", i.ToString(CultureInfo.InvariantCulture));
                     insertText.AppendFormat("(@ItemId, @ChapterIndex{0}, @StartPositionTicks{0}, @Name{0}, @ImagePath{0}, @ImageDateModified{0}),", i.ToString(CultureInfo.InvariantCulture));
                 }
                 }
+
                 insertText.Length -= 1; // Remove last ,
                 insertText.Length -= 1; // Remove last ,
 
 
                 using (var statement = PrepareStatement(db, insertText.ToString()))
                 using (var statement = PrepareStatement(db, insertText.ToString()))
@@ -2077,6 +2079,7 @@ namespace Emby.Server.Implementations.Data
                 }
                 }
 
 
                 startIndex += limit;
                 startIndex += limit;
+                insertText.Length = StartInsertText.Length;
             }
             }
         }
         }
 
 
@@ -2897,8 +2900,8 @@ namespace Emby.Server.Implementations.Data
                             BindSimilarParams(query, statement);
                             BindSimilarParams(query, statement);
                             BindSearchParams(query, statement);
                             BindSearchParams(query, statement);
 
 
-                                // Running this again will bind the params
-                                GetWhereClauses(query, statement);
+                            // Running this again will bind the params
+                            GetWhereClauses(query, statement);
 
 
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                         }
                         }
@@ -2925,7 +2928,7 @@ namespace Emby.Server.Implementations.Data
                     prepend.Add(("SearchScore", SortOrder.Descending));
                     prepend.Add(("SearchScore", SortOrder.Descending));
                     prepend.Add((ItemSortBy.SortName, SortOrder.Ascending));
                     prepend.Add((ItemSortBy.SortName, SortOrder.Ascending));
                 }
                 }
-                
+
                 if (hasSimilar)
                 if (hasSimilar)
                 {
                 {
                     prepend.Add(("SimilarityScore", SortOrder.Descending));
                     prepend.Add(("SimilarityScore", SortOrder.Descending));
@@ -3266,8 +3269,8 @@ namespace Emby.Server.Implementations.Data
                             BindSimilarParams(query, statement);
                             BindSimilarParams(query, statement);
                             BindSearchParams(query, statement);
                             BindSearchParams(query, statement);
 
 
-                                // Running this again will bind the params
-                                GetWhereClauses(query, statement);
+                            // Running this again will bind the params
+                            GetWhereClauses(query, statement);
 
 
                             foreach (var row in statement.ExecuteQuery())
                             foreach (var row in statement.ExecuteQuery())
                             {
                             {
@@ -3288,8 +3291,8 @@ namespace Emby.Server.Implementations.Data
                             BindSimilarParams(query, statement);
                             BindSimilarParams(query, statement);
                             BindSearchParams(query, statement);
                             BindSearchParams(query, statement);
 
 
-                                // Running this again will bind the params
-                                GetWhereClauses(query, statement);
+                            // Running this again will bind the params
+                            GetWhereClauses(query, statement);
 
 
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                             result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
                         }
                         }
@@ -6159,7 +6162,8 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                 item.ColorTransfer = reader[34].ToString();
                 item.ColorTransfer = reader[34].ToString();
             }
             }
 
 
-            if (item.Type == MediaStreamType.Subtitle){
+            if (item.Type == MediaStreamType.Subtitle)
+            {
                 item.localizedUndefined = _localization.GetLocalizedString("Undefined");
                 item.localizedUndefined = _localization.GetLocalizedString("Undefined");
                 item.localizedDefault = _localization.GetLocalizedString("Default");
                 item.localizedDefault = _localization.GetLocalizedString("Default");
                 item.localizedForced = _localization.GetLocalizedString("Forced");
                 item.localizedForced = _localization.GetLocalizedString("Forced");

+ 1 - 1
Emby.Server.Implementations/Data/SqliteUserRepository.cs

@@ -25,7 +25,7 @@ namespace Emby.Server.Implementations.Data
             IServerApplicationPaths appPaths)
             IServerApplicationPaths appPaths)
             : base(logger)
             : base(logger)
         {
         {
-            _jsonOptions = JsonDefaults.GetOptions();;
+            _jsonOptions = JsonDefaults.GetOptions();
 
 
             DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
             DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
         }
         }

+ 10 - 5
Emby.Server.Implementations/EntryPoints/StartupWizard.cs

@@ -2,7 +2,9 @@ using System.Threading.Tasks;
 using Emby.Server.Implementations.Browser;
 using Emby.Server.Implementations.Browser;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Extensions;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;
+using Microsoft.Extensions.Configuration;
 
 
 namespace Emby.Server.Implementations.EntryPoints
 namespace Emby.Server.Implementations.EntryPoints
 {
 {
@@ -11,10 +13,8 @@ namespace Emby.Server.Implementations.EntryPoints
     /// </summary>
     /// </summary>
     public sealed class StartupWizard : IServerEntryPoint
     public sealed class StartupWizard : IServerEntryPoint
     {
     {
-        /// <summary>
-        /// The app host.
-        /// </summary>
         private readonly IServerApplicationHost _appHost;
         private readonly IServerApplicationHost _appHost;
+        private readonly IConfiguration _appConfig;
         private readonly IServerConfigurationManager _config;
         private readonly IServerConfigurationManager _config;
 
 
         /// <summary>
         /// <summary>
@@ -22,9 +22,10 @@ namespace Emby.Server.Implementations.EntryPoints
         /// </summary>
         /// </summary>
         /// <param name="appHost">The application host.</param>
         /// <param name="appHost">The application host.</param>
         /// <param name="config">The configuration manager.</param>
         /// <param name="config">The configuration manager.</param>
-        public StartupWizard(IServerApplicationHost appHost, IServerConfigurationManager config)
+        public StartupWizard(IServerApplicationHost appHost, IConfiguration appConfig, IServerConfigurationManager config)
         {
         {
             _appHost = appHost;
             _appHost = appHost;
+            _appConfig = appConfig;
             _config = config;
             _config = config;
         }
         }
 
 
@@ -36,7 +37,11 @@ namespace Emby.Server.Implementations.EntryPoints
                 return Task.CompletedTask;
                 return Task.CompletedTask;
             }
             }
 
 
-            if (!_config.Configuration.IsStartupWizardCompleted)
+            if (!_appConfig.HostWebClient())
+            {
+                BrowserLauncher.OpenSwaggerPage(_appHost);
+            }
+            else if (!_config.Configuration.IsStartupWizardCompleted)
             {
             {
                 BrowserLauncher.OpenWebApp(_appHost);
                 BrowserLauncher.OpenWebApp(_appHost);
             }
             }

+ 5 - 10
Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs

@@ -96,13 +96,13 @@ namespace Emby.Server.Implementations.HttpClientManager
 
 
             switch (options.DecompressionMethod)
             switch (options.DecompressionMethod)
             {
             {
-                case CompressionMethod.Deflate | CompressionMethod.Gzip:
+                case CompressionMethods.Deflate | CompressionMethods.Gzip:
                     request.Headers.Add(HeaderNames.AcceptEncoding, new[] { "gzip", "deflate" });
                     request.Headers.Add(HeaderNames.AcceptEncoding, new[] { "gzip", "deflate" });
                     break;
                     break;
-                case CompressionMethod.Deflate:
+                case CompressionMethods.Deflate:
                     request.Headers.Add(HeaderNames.AcceptEncoding, "deflate");
                     request.Headers.Add(HeaderNames.AcceptEncoding, "deflate");
                     break;
                     break;
-                case CompressionMethod.Gzip:
+                case CompressionMethods.Gzip:
                     request.Headers.Add(HeaderNames.AcceptEncoding, "gzip");
                     request.Headers.Add(HeaderNames.AcceptEncoding, "gzip");
                     break;
                     break;
                 default:
                 default:
@@ -239,15 +239,10 @@ namespace Emby.Server.Implementations.HttpClientManager
 
 
             var httpWebRequest = GetRequestMessage(options, httpMethod);
             var httpWebRequest = GetRequestMessage(options, httpMethod);
 
 
-            if (options.RequestContentBytes != null
-                || !string.IsNullOrEmpty(options.RequestContent)
+            if (!string.IsNullOrEmpty(options.RequestContent)
                 || httpMethod == HttpMethod.Post)
                 || httpMethod == HttpMethod.Post)
             {
             {
-                if (options.RequestContentBytes != null)
-                {
-                    httpWebRequest.Content = new ByteArrayContent(options.RequestContentBytes);
-                }
-                else if (options.RequestContent != null)
+                if (options.RequestContent != null)
                 {
                 {
                     httpWebRequest.Content = new StringContent(
                     httpWebRequest.Content = new StringContent(
                         options.RequestContent,
                         options.RequestContent,

+ 1 - 1
Emby.Server.Implementations/HttpServer/FileWriter.cs

@@ -11,8 +11,8 @@ using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Services;
 using MediaBrowser.Model.Services;
-using Microsoft.Extensions.Logging;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
 using Microsoft.Net.Http.Headers;
 using Microsoft.Net.Http.Headers;
 
 
 namespace Emby.Server.Implementations.HttpServer
 namespace Emby.Server.Implementations.HttpServer

+ 20 - 10
Emby.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -17,6 +17,7 @@ using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Globalization;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Services;
 using MediaBrowser.Model.Services;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
@@ -29,6 +30,12 @@ namespace Emby.Server.Implementations.HttpServer
 {
 {
     public class HttpListenerHost : IHttpServer, IDisposable
     public class HttpListenerHost : IHttpServer, IDisposable
     {
     {
+        /// <summary>
+        /// The key for a setting that specifies the default redirect path
+        /// to use for requests where the URL base prefix is invalid or missing.
+        /// </summary>
+        public const string DefaultRedirectKey = "HttpListenerHost:DefaultRedirectPath";
+
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IServerConfigurationManager _config;
         private readonly IServerConfigurationManager _config;
         private readonly INetworkManager _networkManager;
         private readonly INetworkManager _networkManager;
@@ -52,23 +59,28 @@ namespace Emby.Server.Implementations.HttpServer
             INetworkManager networkManager,
             INetworkManager networkManager,
             IJsonSerializer jsonSerializer,
             IJsonSerializer jsonSerializer,
             IXmlSerializer xmlSerializer,
             IXmlSerializer xmlSerializer,
-            IHttpListener socketListener)
+            IHttpListener socketListener,
+            ILocalizationManager localizationManager,
+            ServiceController serviceController)
         {
         {
             _appHost = applicationHost;
             _appHost = applicationHost;
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
-            _defaultRedirectPath = configuration["HttpListenerHost:DefaultRedirectPath"];
+            _defaultRedirectPath = configuration[DefaultRedirectKey];
             _baseUrlPrefix = _config.Configuration.BaseUrl;
             _baseUrlPrefix = _config.Configuration.BaseUrl;
             _networkManager = networkManager;
             _networkManager = networkManager;
             _jsonSerializer = jsonSerializer;
             _jsonSerializer = jsonSerializer;
             _xmlSerializer = xmlSerializer;
             _xmlSerializer = xmlSerializer;
             _socketListener = socketListener;
             _socketListener = socketListener;
+            ServiceController = serviceController;
+
             _socketListener.WebSocketConnected = OnWebSocketConnected;
             _socketListener.WebSocketConnected = OnWebSocketConnected;
 
 
             _funcParseFn = t => s => JsvReader.GetParseFn(t)(s);
             _funcParseFn = t => s => JsvReader.GetParseFn(t)(s);
 
 
             Instance = this;
             Instance = this;
             ResponseFilters = Array.Empty<Action<IRequest, HttpResponse, object>>();
             ResponseFilters = Array.Empty<Action<IRequest, HttpResponse, object>>();
+            GlobalResponse = localizationManager.GetLocalizedString("StartupEmbyServerIsLoading");
         }
         }
 
 
         public event EventHandler<GenericEventArgs<IWebSocketConnection>> WebSocketConnected;
         public event EventHandler<GenericEventArgs<IWebSocketConnection>> WebSocketConnected;
@@ -81,7 +93,7 @@ namespace Emby.Server.Implementations.HttpServer
 
 
         public string GlobalResponse { get; set; }
         public string GlobalResponse { get; set; }
 
 
-        public ServiceController ServiceController { get; private set; }
+        public ServiceController ServiceController { get; }
 
 
         public object CreateInstance(Type type)
         public object CreateInstance(Type type)
         {
         {
@@ -585,17 +597,15 @@ namespace Emby.Server.Implementations.HttpServer
         /// <summary>
         /// <summary>
         /// Adds the rest handlers.
         /// Adds the rest handlers.
         /// </summary>
         /// </summary>
-        /// <param name="services">The services.</param>
-        /// <param name="listeners"></param>
-        /// <param name="urlPrefixes"></param>
-        public void Init(IEnumerable<IService> services, IEnumerable<IWebSocketListener> listeners, IEnumerable<string> urlPrefixes)
+        /// <param name="serviceTypes">The service types to register with the <see cref="ServiceController"/>.</param>
+        /// <param name="listeners">The web socket listeners.</param>
+        /// <param name="urlPrefixes">The URL prefixes. See <see cref="UrlPrefixes"/>.</param>
+        public void Init(IEnumerable<Type> serviceTypes, IEnumerable<IWebSocketListener> listeners, IEnumerable<string> urlPrefixes)
         {
         {
             _webSocketListeners = listeners.ToArray();
             _webSocketListeners = listeners.ToArray();
             UrlPrefixes = urlPrefixes.ToArray();
             UrlPrefixes = urlPrefixes.ToArray();
-            ServiceController = new ServiceController();
 
 
-            var types = services.Select(r => r.GetType());
-            ServiceController.Init(this, types);
+            ServiceController.Init(this, serviceTypes);
 
 
             ResponseFilters = new Action<IRequest, HttpResponse, object>[]
             ResponseFilters = new Action<IRequest, HttpResponse, object>[]
             {
             {

+ 5 - 5
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -587,11 +587,11 @@ namespace Emby.Server.Implementations.IO
             // some drives on linux have no actual size or are used for other purposes
             // some drives on linux have no actual size or are used for other purposes
             return DriveInfo.GetDrives().Where(d => d.IsReady && d.TotalSize != 0 && d.DriveType != DriveType.Ram)
             return DriveInfo.GetDrives().Where(d => d.IsReady && d.TotalSize != 0 && d.DriveType != DriveType.Ram)
                 .Select(d => new FileSystemMetadata
                 .Select(d => new FileSystemMetadata
-            {
-                Name = d.Name,
-                FullName = d.RootDirectory.FullName,
-                IsDirectory = true
-            }).ToList();
+                {
+                    Name = d.Name,
+                    FullName = d.RootDirectory.FullName,
+                    IsDirectory = true
+                }).ToList();
         }
         }
 
 
         public virtual IEnumerable<FileSystemMetadata> GetDirectories(string path, bool recursive = false)
         public virtual IEnumerable<FileSystemMetadata> GetDirectories(string path, bool recursive = false)

+ 0 - 1
Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs

@@ -8,7 +8,6 @@ using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Resolvers;
 using MediaBrowser.Controller.Resolvers;
-using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Logging;

+ 9 - 9
Emby.Server.Implementations/Library/UserManager.cs

@@ -805,17 +805,17 @@ namespace Emby.Server.Implementations.Library
 
 
             // Delete user config dir
             // Delete user config dir
             lock (_configSyncLock)
             lock (_configSyncLock)
-            lock (_policySyncLock)
-            {
-                try
-                {
-                    Directory.Delete(user.ConfigurationDirectoryPath, true);
-                }
-                catch (IOException ex)
+                lock (_policySyncLock)
                 {
                 {
-                    _logger.LogError(ex, "Error deleting user config dir: {Path}", user.ConfigurationDirectoryPath);
+                    try
+                    {
+                        Directory.Delete(user.ConfigurationDirectoryPath, true);
+                    }
+                    catch (IOException ex)
+                    {
+                        _logger.LogError(ex, "Error deleting user config dir: {Path}", user.ConfigurationDirectoryPath);
+                    }
                 }
                 }
-            }
 
 
             _users.TryRemove(user.Id, out _);
             _users.TryRemove(user.Id, out _);
 
 

+ 1 - 2
Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.IO;
 using System.IO;
@@ -73,7 +72,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 UserAgent = "Emby/3.0",
                 UserAgent = "Emby/3.0",
 
 
                 // Shouldn't matter but may cause issues
                 // Shouldn't matter but may cause issues
-                DecompressionMethod = CompressionMethod.None
+                DecompressionMethod = CompressionMethods.None
             };
             };
 
 
             using (var response = await _httpClient.SendAsync(httpRequestOptions, HttpMethod.Get).ConfigureAwait(false))
             using (var response = await _httpClient.SendAsync(httpRequestOptions, HttpMethod.Get).ConfigureAwait(false))

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/EntryPoint.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Threading;
 using System.Threading;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Globalization;
 using System.Globalization;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.LiveTv;

+ 0 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;

+ 2 - 3
Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;
@@ -636,7 +635,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             ListingsProviderInfo providerInfo)
             ListingsProviderInfo providerInfo)
         {
         {
             // Schedules direct requires that the client support compression and will return a 400 response without it
             // Schedules direct requires that the client support compression and will return a 400 response without it
-            options.DecompressionMethod = CompressionMethod.Deflate;
+            options.DecompressionMethod = CompressionMethods.Deflate;
 
 
             try
             try
             {
             {
@@ -666,7 +665,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             ListingsProviderInfo providerInfo)
             ListingsProviderInfo providerInfo)
         {
         {
             // Schedules direct requires that the client support compression and will return a 400 response without it
             // Schedules direct requires that the client support compression and will return a 400 response without it
-            options.DecompressionMethod = CompressionMethod.Deflate;
+            options.DecompressionMethod = CompressionMethods.Deflate;
 
 
             try
             try
             {
             {

+ 1 - 2
Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -84,7 +83,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
                 {
                 {
                     CancellationToken = cancellationToken,
                     CancellationToken = cancellationToken,
                     Url = path,
                     Url = path,
-                    DecompressionMethod = CompressionMethod.Gzip,
+                    DecompressionMethod = CompressionMethods.Gzip,
                 },
                 },
                 HttpMethod.Get).ConfigureAwait(false))
                 HttpMethod.Get).ConfigureAwait(false))
             using (var stream = res.Content)
             using (var stream = res.Content)

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System.Collections.Generic;
 using System.Collections.Generic;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Globalization;
 using System.Globalization;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Buffers;
 using System.Buffers;

+ 1 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -8,8 +7,8 @@ using System.Net;
 using System.Net.Sockets;
 using System.Net.Sockets;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;

+ 1 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -8,8 +7,8 @@ using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using MediaBrowser.Controller.Library;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.LiveTv;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;

+ 1 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs

@@ -1,5 +1,4 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
-#pragma warning disable SA1600
 
 
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -60,7 +59,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
                 Url = url,
                 Url = url,
                 CancellationToken = CancellationToken.None,
                 CancellationToken = CancellationToken.None,
                 BufferContent = false,
                 BufferContent = false,
-                DecompressionMethod = CompressionMethod.None
+                DecompressionMethod = CompressionMethods.None
             };
             };
 
 
             foreach (var header in mediaSource.RequiredHttpHeaders)
             foreach (var header in mediaSource.RequiredHttpHeaders)

+ 0 - 1
Emby.Server.Implementations/Localization/Core/af.json

@@ -41,7 +41,6 @@
     "User": "Gebruiker",
     "User": "Gebruiker",
     "TvShows": "TV Programme",
     "TvShows": "TV Programme",
     "System": "Stelsel",
     "System": "Stelsel",
-    "SubtitlesDownloadedForItem": "Ondertitels afgelaai vir {0}",
     "SubtitleDownloadFailureFromForItem": "Ondertitels het misluk om af te laai van {0} vir {1}",
     "SubtitleDownloadFailureFromForItem": "Ondertitels het misluk om af te laai van {0} vir {1}",
     "StartupEmbyServerIsLoading": "Jellyfin Bediener is besig om te laai. Probeer weer in 'n kort tyd.",
     "StartupEmbyServerIsLoading": "Jellyfin Bediener is besig om te laai. Probeer weer in 'n kort tyd.",
     "ServerNameNeedsToBeRestarted": "{0} moet herbegin word",
     "ServerNameNeedsToBeRestarted": "{0} moet herbegin word",

+ 4 - 5
Emby.Server.Implementations/Localization/Core/ar.json

@@ -4,10 +4,10 @@
     "Application": "تطبيق",
     "Application": "تطبيق",
     "Artists": "الفنانين",
     "Artists": "الفنانين",
     "AuthenticationSucceededWithUserName": "{0} سجل الدخول بنجاح",
     "AuthenticationSucceededWithUserName": "{0} سجل الدخول بنجاح",
-    "Books": "كتب",
+    "Books": "الكتب",
     "CameraImageUploadedFrom": "صورة كاميرا جديدة تم رفعها من {0}",
     "CameraImageUploadedFrom": "صورة كاميرا جديدة تم رفعها من {0}",
     "Channels": "القنوات",
     "Channels": "القنوات",
-    "ChapterNameValue": "فصل {0}",
+    "ChapterNameValue": "الفصل {0}",
     "Collections": "مجموعات",
     "Collections": "مجموعات",
     "DeviceOfflineWithName": "قُطِع الاتصال بـ{0}",
     "DeviceOfflineWithName": "قُطِع الاتصال بـ{0}",
     "DeviceOnlineWithName": "{0} متصل",
     "DeviceOnlineWithName": "{0} متصل",
@@ -51,8 +51,8 @@
     "NotificationOptionAudioPlaybackStopped": "تم إيقاف تشغيل المقطع الصوتي",
     "NotificationOptionAudioPlaybackStopped": "تم إيقاف تشغيل المقطع الصوتي",
     "NotificationOptionCameraImageUploaded": "تم رفع صورة الكاميرا",
     "NotificationOptionCameraImageUploaded": "تم رفع صورة الكاميرا",
     "NotificationOptionInstallationFailed": "فشل في التثبيت",
     "NotificationOptionInstallationFailed": "فشل في التثبيت",
-    "NotificationOptionNewLibraryContent": "أُضِيفَ محتوى جديد",
-    "NotificationOptionPluginError": "فشل في الـPlugin",
+    "NotificationOptionNewLibraryContent": "تم إضافة محتوى جديد",
+    "NotificationOptionPluginError": "فشل في البرنامج المضاف",
     "NotificationOptionPluginInstalled": "تم تثبيت الملحق",
     "NotificationOptionPluginInstalled": "تم تثبيت الملحق",
     "NotificationOptionPluginUninstalled": "تمت إزالة الملحق",
     "NotificationOptionPluginUninstalled": "تمت إزالة الملحق",
     "NotificationOptionPluginUpdateInstalled": "تم تثبيت تحديثات الملحق",
     "NotificationOptionPluginUpdateInstalled": "تم تثبيت تحديثات الملحق",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "سيرفر Jellyfin قيد التشغيل . الرجاء المحاولة بعد قليل.",
     "StartupEmbyServerIsLoading": "سيرفر Jellyfin قيد التشغيل . الرجاء المحاولة بعد قليل.",
     "SubtitleDownloadFailureForItem": "عملية إنزال الترجمة فشلت لـ{0}",
     "SubtitleDownloadFailureForItem": "عملية إنزال الترجمة فشلت لـ{0}",
     "SubtitleDownloadFailureFromForItem": "الترجمات فشلت في التحميل من {0} الى {1}",
     "SubtitleDownloadFailureFromForItem": "الترجمات فشلت في التحميل من {0} الى {1}",
-    "SubtitlesDownloadedForItem": "تم تحميل الترجمات الى {0}",
     "Sync": "مزامنة",
     "Sync": "مزامنة",
     "System": "النظام",
     "System": "النظام",
     "TvShows": "البرامج التلفزيونية",
     "TvShows": "البرامج التلفزيونية",

+ 25 - 4
Emby.Server.Implementations/Localization/Core/bg-BG.json

@@ -1,8 +1,8 @@
 {
 {
     "Albums": "Албуми",
     "Albums": "Албуми",
-    "AppDeviceValues": "Програма: {0}, устройство: {1}",
+    "AppDeviceValues": "Програма: {0}, Устройство: {1}",
     "Application": "Програма",
     "Application": "Програма",
-    "Artists": "Изпълнители",
+    "Artists": "Артисти",
     "AuthenticationSucceededWithUserName": "{0} се удостовери успешно",
     "AuthenticationSucceededWithUserName": "{0} се удостовери успешно",
     "Books": "Книги",
     "Books": "Книги",
     "CameraImageUploadedFrom": "Нова снимка от камера беше качена от {0}",
     "CameraImageUploadedFrom": "Нова снимка от камера беше качена от {0}",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Сървърът зарежда. Моля, опитайте отново след малко.",
     "StartupEmbyServerIsLoading": "Сървърът зарежда. Моля, опитайте отново след малко.",
     "SubtitleDownloadFailureForItem": "Неуспешно изтегляне на субтитри за {0}",
     "SubtitleDownloadFailureForItem": "Неуспешно изтегляне на субтитри за {0}",
     "SubtitleDownloadFailureFromForItem": "Поднадписите за {1} от {0} не можаха да се изтеглят",
     "SubtitleDownloadFailureFromForItem": "Поднадписите за {1} от {0} не можаха да се изтеглят",
-    "SubtitlesDownloadedForItem": "Изтеглени са субтитри за {0}",
     "Sync": "Синхронизиране",
     "Sync": "Синхронизиране",
     "System": "Система",
     "System": "Система",
     "TvShows": "Телевизионни сериали",
     "TvShows": "Телевизионни сериали",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} спря {1}",
     "UserStoppedPlayingItemWithValues": "{0} спря {1}",
     "ValueHasBeenAddedToLibrary": "{0} беше добавен във Вашата библиотека",
     "ValueHasBeenAddedToLibrary": "{0} беше добавен във Вашата библиотека",
     "ValueSpecialEpisodeName": "Специални - {0}",
     "ValueSpecialEpisodeName": "Специални - {0}",
-    "VersionNumber": "Версия {0}"
+    "VersionNumber": "Версия {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Търси Интернет за липсващи поднадписи, на база конфигурацията за мета-данни.",
+    "TaskDownloadMissingSubtitles": "Изтегляне на липсващи поднадписи",
+    "TaskRefreshChannelsDescription": "Обновява информацията за интернет канала.",
+    "TaskRefreshChannels": "Обновяване на Канали",
+    "TaskCleanTranscodeDescription": "Изтрива прекодирани файлове по-стари от един ден.",
+    "TaskCleanTranscode": "Изчиства директорията за прекодиране",
+    "TaskUpdatePluginsDescription": "Изтегля и инсталира актуализации за добавките, които са настроени за автоматична актуализация.",
+    "TaskUpdatePlugins": "Актуализира добавките",
+    "TaskRefreshPeopleDescription": "Актуализира мета-данните за артистите и режисьорите за Вашата медийна библиотека.",
+    "TaskRefreshPeople": "Обновяване на участниците",
+    "TaskCleanLogsDescription": "Изтрива лог файлове по-стари от {0} дни.",
+    "TaskCleanLogs": "Изчисти директорията с логове",
+    "TaskRefreshLibraryDescription": "Сканира Вашата библиотека с медия за нови файлове и обновява мета-данните.",
+    "TaskRefreshLibrary": "Сканиране на библиотеката с медия",
+    "TaskRefreshChapterImagesDescription": "Създава иконки за видеа, които имат епизоди.",
+    "TaskRefreshChapterImages": "Извличане на изображения за епизода",
+    "TaskCleanCacheDescription": "Изтриване на ненужните от системата файлове.",
+    "TaskCleanCache": "Изчистване на Кеш-директорията",
+    "TasksChannelsCategory": "Интернет Канали",
+    "TasksApplicationCategory": "Приложение",
+    "TasksLibraryCategory": "Библиотека",
+    "TasksMaintenanceCategory": "Поддръжка"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/bn.json

@@ -38,7 +38,6 @@
     "TvShows": "টিভি শোগুলো",
     "TvShows": "টিভি শোগুলো",
     "System": "সিস্টেম",
     "System": "সিস্টেম",
     "Sync": "সিংক",
     "Sync": "সিংক",
-    "SubtitlesDownloadedForItem": "{0} এর জন্য সাবটাইটেল ডাউনলোড করা হয়েছে",
     "SubtitleDownloadFailureFromForItem": "{2} থেকে {1} এর জন্য সাবটাইটেল ডাউনলোড ব্যর্থ",
     "SubtitleDownloadFailureFromForItem": "{2} থেকে {1} এর জন্য সাবটাইটেল ডাউনলোড ব্যর্থ",
     "StartupEmbyServerIsLoading": "জেলিফিন সার্ভার লোড হচ্ছে। দয়া করে একটু পরে আবার চেষ্টা করুন।",
     "StartupEmbyServerIsLoading": "জেলিফিন সার্ভার লোড হচ্ছে। দয়া করে একটু পরে আবার চেষ্টা করুন।",
     "Songs": "গানগুলো",
     "Songs": "গানগুলো",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ca.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "El Servidor d'Jellyfin est&agrave; carregant. Si et plau, prova de nou en breus.",
     "StartupEmbyServerIsLoading": "El Servidor d'Jellyfin est&agrave; carregant. Si et plau, prova de nou en breus.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Els subtítols no s'han pogut baixar de {0} per {1}",
     "SubtitleDownloadFailureFromForItem": "Els subtítols no s'han pogut baixar de {0} per {1}",
-    "SubtitlesDownloadedForItem": "Subtítols descarregats per a {0}",
     "Sync": "Sincronitzar",
     "Sync": "Sincronitzar",
     "System": "System",
     "System": "System",
     "TvShows": "Espectacles de TV",
     "TvShows": "Espectacles de TV",

+ 24 - 3
Emby.Server.Implementations/Localization/Core/cs.json

@@ -5,7 +5,7 @@
     "Artists": "Umělci",
     "Artists": "Umělci",
     "AuthenticationSucceededWithUserName": "{0} úspěšně ověřen",
     "AuthenticationSucceededWithUserName": "{0} úspěšně ověřen",
     "Books": "Knihy",
     "Books": "Knihy",
-    "CameraImageUploadedFrom": "Z {0} byla nahrána nová fotografie",
+    "CameraImageUploadedFrom": "Z {0} byla nahrána nová fotografie z fotoaparátu",
     "Channels": "Kanály",
     "Channels": "Kanály",
     "ChapterNameValue": "Kapitola {0}",
     "ChapterNameValue": "Kapitola {0}",
     "Collections": "Kolekce",
     "Collections": "Kolekce",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server je spouštěn. Zkuste to prosím v brzké době znovu.",
     "StartupEmbyServerIsLoading": "Jellyfin Server je spouštěn. Zkuste to prosím v brzké době znovu.",
     "SubtitleDownloadFailureForItem": "Stahování titulků selhalo pro {0}",
     "SubtitleDownloadFailureForItem": "Stahování titulků selhalo pro {0}",
     "SubtitleDownloadFailureFromForItem": "Stažení titulků pro {1} z {0} selhalo",
     "SubtitleDownloadFailureFromForItem": "Stažení titulků pro {1} z {0} selhalo",
-    "SubtitlesDownloadedForItem": "Staženy titulky pro {0}",
     "Sync": "Synchronizace",
     "Sync": "Synchronizace",
     "System": "Systém",
     "System": "Systém",
     "TvShows": "TV seriály",
     "TvShows": "TV seriály",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} zastavil přehrávání {1}",
     "UserStoppedPlayingItemWithValues": "{0} zastavil přehrávání {1}",
     "ValueHasBeenAddedToLibrary": "{0} byl přidán do vaší knihovny médií",
     "ValueHasBeenAddedToLibrary": "{0} byl přidán do vaší knihovny médií",
     "ValueSpecialEpisodeName": "Speciál - {0}",
     "ValueSpecialEpisodeName": "Speciál - {0}",
-    "VersionNumber": "Verze {0}"
+    "VersionNumber": "Verze {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Vyhledá na internetu chybějící titulky na základě nastavení metadat.",
+    "TaskDownloadMissingSubtitles": "Stáhnout chybějící titulky",
+    "TaskRefreshChannelsDescription": "Obnoví informace o internetových kanálech.",
+    "TaskRefreshChannels": "Obnovit kanály",
+    "TaskCleanTranscodeDescription": "Odstraní více než 1 den staré transkódované soubory.",
+    "TaskCleanTranscode": "Vyčistit adresář s transkódovaným obsahem",
+    "TaskUpdatePluginsDescription": "Stáhne a nainstaluje aktualizace zásuvných modulů, které mají nastavenou automatickou aktualizaci.",
+    "TaskUpdatePlugins": "Aktualizovat zásuvné moduly",
+    "TaskRefreshPeopleDescription": "Aktualizuje metadata umělců a režisérů ve Vaší knihovně médií.",
+    "TaskRefreshPeople": "Obnovit umělce",
+    "TaskCleanLogsDescription": "Odstraní soubory protokolu, které jsou starší více než {0} dní.",
+    "TaskCleanLogs": "Vyčistit adresář se souborem protokolu",
+    "TaskRefreshLibraryDescription": "Prohledá Vaši knihovnu médií zda neobsahuje nové soubory a obnoví metadatada.",
+    "TaskRefreshLibrary": "Prohledat knihovnu médií",
+    "TaskRefreshChapterImagesDescription": "Vytvoří náhledy videí, které obsahují kapitoly.",
+    "TaskRefreshChapterImages": "Extrahovat obrázky kapitol",
+    "TaskCleanCacheDescription": "Odstraní soubory mezipaměti, které systém již nebude potřebovat.",
+    "TaskCleanCache": "Vyčistit složku s mezipamětí",
+    "TasksChannelsCategory": "Internetové kanály",
+    "TasksApplicationCategory": "Aplikace",
+    "TasksLibraryCategory": "Knihovna",
+    "TasksMaintenanceCategory": "Údržba"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/da.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server er i gang med at starte op. Prøv venligst igen om lidt.",
     "StartupEmbyServerIsLoading": "Jellyfin Server er i gang med at starte op. Prøv venligst igen om lidt.",
     "SubtitleDownloadFailureForItem": "Fejlet i download af undertekster for {0}",
     "SubtitleDownloadFailureForItem": "Fejlet i download af undertekster for {0}",
     "SubtitleDownloadFailureFromForItem": "Undertekster kunne ikke downloades fra {0} til {1}",
     "SubtitleDownloadFailureFromForItem": "Undertekster kunne ikke downloades fra {0} til {1}",
-    "SubtitlesDownloadedForItem": "Undertekster downloadet for {0}",
     "Sync": "Synk",
     "Sync": "Synk",
     "System": "System",
     "System": "System",
     "TvShows": "TV serier",
     "TvShows": "TV serier",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/de.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin-Server startet, bitte versuche es gleich noch einmal.",
     "StartupEmbyServerIsLoading": "Jellyfin-Server startet, bitte versuche es gleich noch einmal.",
     "SubtitleDownloadFailureForItem": "Download der Untertitel fehlgeschlagen für {0}",
     "SubtitleDownloadFailureForItem": "Download der Untertitel fehlgeschlagen für {0}",
     "SubtitleDownloadFailureFromForItem": "Untertitel von {0} für {1} konnten nicht heruntergeladen werden",
     "SubtitleDownloadFailureFromForItem": "Untertitel von {0} für {1} konnten nicht heruntergeladen werden",
-    "SubtitlesDownloadedForItem": "Untertitel heruntergeladen für {0}",
     "Sync": "Synchronisation",
     "Sync": "Synchronisation",
     "System": "System",
     "System": "System",
     "TvShows": "TV-Sendungen",
     "TvShows": "TV-Sendungen",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} beendet",
     "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} beendet",
     "ValueHasBeenAddedToLibrary": "{0} wurde deiner Bibliothek hinzugefügt",
     "ValueHasBeenAddedToLibrary": "{0} wurde deiner Bibliothek hinzugefügt",
     "ValueSpecialEpisodeName": "Extra - {0}",
     "ValueSpecialEpisodeName": "Extra - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Durchsucht das Internet nach fehlenden Untertiteln, basierend auf den Meta Einstellungen.",
+    "TaskDownloadMissingSubtitles": "Lade fehlende Untertitel herunter",
+    "TaskRefreshChannelsDescription": "Erneuere Internet Kanal Informationen.",
+    "TaskRefreshChannels": "Erneuere Kanäle",
+    "TaskCleanTranscodeDescription": "Löscht Transkodierdateien welche älter als ein Tag sind.",
+    "TaskCleanTranscode": "Lösche Transkodier Pfad",
+    "TaskUpdatePluginsDescription": "Läd Updates für Plugins herunter, welche dazu eingestellt sind automatisch zu updaten und installiert sie.",
+    "TaskUpdatePlugins": "Update Plugins",
+    "TaskRefreshPeopleDescription": "Erneuert Metadaten für Schausteller und Regisseure in deinen Bibliotheken.",
+    "TaskRefreshPeople": "Erneuere Schausteller",
+    "TaskCleanLogsDescription": "Lösche Log Datein die älter als {0} Tage sind.",
+    "TaskCleanLogs": "Lösche Log Pfad",
+    "TaskRefreshLibraryDescription": "Scanne alle Bibliotheken für hinzugefügte Datein und erneuere Metadaten.",
+    "TaskRefreshLibrary": "Scanne alle Bibliotheken",
+    "TaskRefreshChapterImagesDescription": "Kreiert Vorschaubilder für Videos welche Kapitel haben.",
+    "TaskRefreshChapterImages": "Extrahiert Kapitel-Bilder",
+    "TaskCleanCacheDescription": "Löscht Zwischenspeicherdatein die nicht länger von System gebraucht werden.",
+    "TaskCleanCache": "Leere Cache Pfad",
+    "TasksChannelsCategory": "Internet Kanäle",
+    "TasksApplicationCategory": "Anwendung",
+    "TasksLibraryCategory": "Bibliothek",
+    "TasksMaintenanceCategory": "Wartung"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/el.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Ο Jellyfin Server φορτώνει. Παρακαλώ δοκιμάστε σε λίγο.",
     "StartupEmbyServerIsLoading": "Ο Jellyfin Server φορτώνει. Παρακαλώ δοκιμάστε σε λίγο.",
     "SubtitleDownloadFailureForItem": "Οι υπότιτλοι απέτυχαν να κατέβουν για {0}",
     "SubtitleDownloadFailureForItem": "Οι υπότιτλοι απέτυχαν να κατέβουν για {0}",
     "SubtitleDownloadFailureFromForItem": "Αποτυχίες μεταφόρτωσης υποτίτλων από {0} για {1}",
     "SubtitleDownloadFailureFromForItem": "Αποτυχίες μεταφόρτωσης υποτίτλων από {0} για {1}",
-    "SubtitlesDownloadedForItem": "Οι υπότιτλοι κατέβηκαν για {0}",
     "Sync": "Συγχρονισμός",
     "Sync": "Συγχρονισμός",
     "System": "Σύστημα",
     "System": "Σύστημα",
     "TvShows": "Τηλεοπτικές Σειρές",
     "TvShows": "Τηλεοπτικές Σειρές",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/en-GB.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "Sync",
     "Sync": "Sync",
     "System": "System",
     "System": "System",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/en-US.json

@@ -75,7 +75,6 @@
     "Songs": "Songs",
     "Songs": "Songs",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "Sync",
     "Sync": "Sync",
     "System": "System",
     "System": "System",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",
@@ -92,5 +91,27 @@
     "UserStoppedPlayingItemWithValues": "{0} has finished playing {1} on {2}",
     "UserStoppedPlayingItemWithValues": "{0} has finished playing {1} on {2}",
     "ValueHasBeenAddedToLibrary": "{0} has been added to your media library",
     "ValueHasBeenAddedToLibrary": "{0} has been added to your media library",
     "ValueSpecialEpisodeName": "Special - {0}",
     "ValueSpecialEpisodeName": "Special - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TasksMaintenanceCategory": "Maintenance",
+    "TasksLibraryCategory": "Library",
+    "TasksApplicationCategory": "Application",
+    "TasksChannelsCategory": "Internet Channels",
+    "TaskCleanCache": "Clean Cache Directory",
+    "TaskCleanCacheDescription": "Deletes cache files no longer needed by the system.",
+    "TaskRefreshChapterImages": "Extract Chapter Images",
+    "TaskRefreshChapterImagesDescription": "Creates thumbnails for videos that have chapters.",
+    "TaskRefreshLibrary": "Scan Media Library",
+    "TaskRefreshLibraryDescription": "Scans your media library for new files and refreshes metadata.",
+    "TaskCleanLogs": "Clean Log Directory",
+    "TaskCleanLogsDescription": "Deletes log files that are more than {0} days old.",
+    "TaskRefreshPeople": "Refresh People",
+    "TaskRefreshPeopleDescription": "Updates metadata for actors and directors in your media library.",
+    "TaskUpdatePlugins": "Update Plugins",
+    "TaskUpdatePluginsDescription": "Downloads and installs updates for plugins that are configured to update automatically.",
+    "TaskCleanTranscode": "Clean Transcode Directory",
+    "TaskCleanTranscodeDescription": "Deletes transcode files more than one day old.",
+    "TaskRefreshChannels": "Refresh Channels",
+    "TaskRefreshChannelsDescription": "Refreshes internet channel information.",
+    "TaskDownloadMissingSubtitles": "Download missing subtitles",
+    "TaskDownloadMissingSubtitlesDescription": "Searches the internet for missing subtitles based on metadata configuration."
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/es-AR.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
-    "SubtitlesDownloadedForItem": "Descargar subtítulos para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Series de TV",
     "TvShows": "Series de TV",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/es-MX.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "El servidor Jellyfin esta cargando. Por favor intente de nuevo dentro de poco.",
     "StartupEmbyServerIsLoading": "El servidor Jellyfin esta cargando. Por favor intente de nuevo dentro de poco.",
     "SubtitleDownloadFailureForItem": "Falló la descarga de subtítulos para {0}",
     "SubtitleDownloadFailureForItem": "Falló la descarga de subtítulos para {0}",
     "SubtitleDownloadFailureFromForItem": "Falló la descarga de subtitulos desde {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Falló la descarga de subtitulos desde {0} para {1}",
-    "SubtitlesDownloadedForItem": "Subtítulos descargados para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Programas de TV",
     "TvShows": "Programas de TV",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/es.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se está cargando. Vuelve a intentarlo en breve.",
     "SubtitleDownloadFailureForItem": "Error al descargar subtítulos para {0}",
     "SubtitleDownloadFailureForItem": "Error al descargar subtítulos para {0}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Fallo de descarga de subtítulos desde {0} para {1}",
-    "SubtitlesDownloadedForItem": "Descargar subtítulos para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Programas de televisión",
     "TvShows": "Programas de televisión",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
     "UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
     "ValueHasBeenAddedToLibrary": "{0} ha sido añadido a tu biblioteca multimedia",
     "ValueHasBeenAddedToLibrary": "{0} ha sido añadido a tu biblioteca multimedia",
     "ValueSpecialEpisodeName": "Especial - {0}",
     "ValueSpecialEpisodeName": "Especial - {0}",
-    "VersionNumber": "Versión {0}"
+    "VersionNumber": "Versión {0}",
+    "TasksMaintenanceCategory": "Mantenimiento",
+    "TasksLibraryCategory": "Librería",
+    "TasksApplicationCategory": "Aplicación",
+    "TasksChannelsCategory": "Canales de internet",
+    "TaskCleanCache": "Eliminar archivos temporales",
+    "TaskCleanCacheDescription": "Elimina los archivos temporales que ya no son necesarios para el servidor.",
+    "TaskRefreshChapterImages": "Extraer imágenes de los capítulos",
+    "TaskRefreshChapterImagesDescription": "Crea las miniaturas de los vídeos que tengan capítulos.",
+    "TaskRefreshLibrary": "Escanear la biblioteca",
+    "TaskRefreshLibraryDescription": "Añade los archivos que se hayan añadido a la biblioteca y actualiza las etiquetas de los ya presentes.",
+    "TaskCleanLogs": "Limpiar registros",
+    "TaskCleanLogsDescription": "Elimina los archivos de registro que tengan más de {0} días.",
+    "TaskRefreshPeople": "Actualizar personas",
+    "TaskRefreshPeopleDescription": "Actualiza las etiquetas de los intérpretes y directores presentes en tus bibliotecas.",
+    "TaskUpdatePlugins": "Actualizar extensiones",
+    "TaskUpdatePluginsDescription": "Actualiza las extensiones que están configuradas para actualizarse automáticamente.",
+    "TaskCleanTranscode": "Limpiar las transcodificaciones",
+    "TaskCleanTranscodeDescription": "Elimina los archivos temporales de transcodificación anteriores a un día de antigüedad.",
+    "TaskRefreshChannels": "Actualizar canales",
+    "TaskRefreshChannelsDescription": "Actualiza la información de los canales de internet.",
+    "TaskDownloadMissingSubtitles": "Descargar los subtítulos que faltan",
+    "TaskDownloadMissingSubtitlesDescription": "Busca en internet los subtítulos que falten en el contenido de tus bibliotecas, basándose en la configuración de los metadatos."
 }
 }

+ 41 - 42
Emby.Server.Implementations/Localization/Core/fa.json

@@ -1,56 +1,56 @@
 {
 {
-    "Albums": "آلبوم ها",
+    "Albums": "آلبومها",
     "AppDeviceValues": "برنامه: {0} ، دستگاه: {1}",
     "AppDeviceValues": "برنامه: {0} ، دستگاه: {1}",
     "Application": "برنامه",
     "Application": "برنامه",
     "Artists": "هنرمندان",
     "Artists": "هنرمندان",
     "AuthenticationSucceededWithUserName": "{0} با موفقیت تایید اعتبار شد",
     "AuthenticationSucceededWithUserName": "{0} با موفقیت تایید اعتبار شد",
-    "Books": "کتاب ها",
-    "CameraImageUploadedFrom": "یک عکس جدید از دوربین ارسال شده {0}",
-    "Channels": "کانال ها",
-    "ChapterNameValue": "فصل {0}",
-    "Collections": "کلکسیون ها",
+    "Books": "کتابها",
+    "CameraImageUploadedFrom": "یک عکس جدید از دوربین ارسال شده است {0}",
+    "Channels": "کانالها",
+    "ChapterNameValue": "قسمت {0}",
+    "Collections": "مجموعه‌ها",
     "DeviceOfflineWithName": "ارتباط {0} قطع شد",
     "DeviceOfflineWithName": "ارتباط {0} قطع شد",
-    "DeviceOnlineWithName": "{0} متصل شده",
+    "DeviceOnlineWithName": "{0} متصل شد",
     "FailedLoginAttemptWithUserName": "تلاش برای ورود از {0} ناموفق بود",
     "FailedLoginAttemptWithUserName": "تلاش برای ورود از {0} ناموفق بود",
-    "Favorites": "مورد علاقه ها",
-    "Folders": "پوشه ها",
+    "Favorites": "مورد علاقهها",
+    "Folders": "پوشهها",
     "Genres": "ژانرها",
     "Genres": "ژانرها",
     "HeaderAlbumArtists": "هنرمندان آلبوم",
     "HeaderAlbumArtists": "هنرمندان آلبوم",
     "HeaderCameraUploads": "آپلودهای دوربین",
     "HeaderCameraUploads": "آپلودهای دوربین",
     "HeaderContinueWatching": "ادامه تماشا",
     "HeaderContinueWatching": "ادامه تماشا",
-    "HeaderFavoriteAlbums": "آلبوم های مورد علاقه",
+    "HeaderFavoriteAlbums": "آلبومهای مورد علاقه",
     "HeaderFavoriteArtists": "هنرمندان مورد علاقه",
     "HeaderFavoriteArtists": "هنرمندان مورد علاقه",
-    "HeaderFavoriteEpisodes": "قسمت های مورد علاقه",
-    "HeaderFavoriteShows": "سریال های مورد علاقه",
-    "HeaderFavoriteSongs": "آهنگ های مورد علاقه",
+    "HeaderFavoriteEpisodes": "قسمتهای مورد علاقه",
+    "HeaderFavoriteShows": "سریالهای مورد علاقه",
+    "HeaderFavoriteSongs": "آهنگهای مورد علاقه",
     "HeaderLiveTV": "پخش زنده تلویزیون",
     "HeaderLiveTV": "پخش زنده تلویزیون",
-    "HeaderNextUp": "بعدی چیه",
-    "HeaderRecordingGroups": "گروه های ضبط",
+    "HeaderNextUp": "قسمت بعدی",
+    "HeaderRecordingGroups": "گروههای ضبط",
     "HomeVideos": "ویدیوهای خانگی",
     "HomeVideos": "ویدیوهای خانگی",
     "Inherit": "به ارث برده",
     "Inherit": "به ارث برده",
     "ItemAddedWithName": "{0} به کتابخانه افزوده شد",
     "ItemAddedWithName": "{0} به کتابخانه افزوده شد",
     "ItemRemovedWithName": "{0} از کتابخانه حذف شد",
     "ItemRemovedWithName": "{0} از کتابخانه حذف شد",
     "LabelIpAddressValue": "آدرس آی پی: {0}",
     "LabelIpAddressValue": "آدرس آی پی: {0}",
     "LabelRunningTimeValue": "زمان اجرا: {0}",
     "LabelRunningTimeValue": "زمان اجرا: {0}",
-    "Latest": "آخرین",
+    "Latest": "جدیدترین‌ها",
     "MessageApplicationUpdated": "سرور Jellyfin بروزرسانی شد",
     "MessageApplicationUpdated": "سرور Jellyfin بروزرسانی شد",
-    "MessageApplicationUpdatedTo": "سرور جلیفین آپدیت شده به نسخه {0}",
+    "MessageApplicationUpdatedTo": "سرور Jellyfin به نسخه {0} بروزرسانی شد",
     "MessageNamedServerConfigurationUpdatedWithValue": "پکربندی بخش {0} سرور  بروزرسانی شد",
     "MessageNamedServerConfigurationUpdatedWithValue": "پکربندی بخش {0} سرور  بروزرسانی شد",
     "MessageServerConfigurationUpdated": "پیکربندی سرور بروزرسانی شد",
     "MessageServerConfigurationUpdated": "پیکربندی سرور بروزرسانی شد",
-    "MixedContent": "محتوای درهم",
-    "Movies": "فیلم های سینمایی",
+    "MixedContent": "محتوای مخلوط",
+    "Movies": "فیلم‌ها",
     "Music": "موسیقی",
     "Music": "موسیقی",
     "MusicVideos": "موزیک ویدیوها",
     "MusicVideos": "موزیک ویدیوها",
-    "NameInstallFailed": "{0} نصب با مشکل مواجه شده",
+    "NameInstallFailed": "{0} نصب با مشکل مواجه شد",
     "NameSeasonNumber": "فصل {0}",
     "NameSeasonNumber": "فصل {0}",
-    "NameSeasonUnknown": "فصل های ناشناخته",
-    "NewVersionIsAvailable": "یک نسخه جدید جلیفین برای بروزرسانی آماده میباشد.",
+    "NameSeasonUnknown": "فصل ناشناخته",
+    "NewVersionIsAvailable": "یک نسخه جدید Jellyfin برای بروزرسانی آماده می‌باشد.",
     "NotificationOptionApplicationUpdateAvailable": "بروزرسانی برنامه موجود است",
     "NotificationOptionApplicationUpdateAvailable": "بروزرسانی برنامه موجود است",
     "NotificationOptionApplicationUpdateInstalled": "بروزرسانی برنامه نصب شد",
     "NotificationOptionApplicationUpdateInstalled": "بروزرسانی برنامه نصب شد",
     "NotificationOptionAudioPlayback": "پخش صدا آغاز شد",
     "NotificationOptionAudioPlayback": "پخش صدا آغاز شد",
     "NotificationOptionAudioPlaybackStopped": "پخش صدا متوقف شد",
     "NotificationOptionAudioPlaybackStopped": "پخش صدا متوقف شد",
     "NotificationOptionCameraImageUploaded": "تصاویر دوربین آپلود شد",
     "NotificationOptionCameraImageUploaded": "تصاویر دوربین آپلود شد",
-    "NotificationOptionInstallationFailed": "شکست نصب",
+    "NotificationOptionInstallationFailed": "نصب شکست خورد",
     "NotificationOptionNewLibraryContent": "محتوای جدید افزوده شد",
     "NotificationOptionNewLibraryContent": "محتوای جدید افزوده شد",
     "NotificationOptionPluginError": "خرابی افزونه",
     "NotificationOptionPluginError": "خرابی افزونه",
     "NotificationOptionPluginInstalled": "افزونه نصب شد",
     "NotificationOptionPluginInstalled": "افزونه نصب شد",
@@ -58,40 +58,39 @@
     "NotificationOptionPluginUpdateInstalled": "بروزرسانی افزونه نصب شد",
     "NotificationOptionPluginUpdateInstalled": "بروزرسانی افزونه نصب شد",
     "NotificationOptionServerRestartRequired": "شروع مجدد سرور نیاز است",
     "NotificationOptionServerRestartRequired": "شروع مجدد سرور نیاز است",
     "NotificationOptionTaskFailed": "شکست وظیفه برنامه ریزی شده",
     "NotificationOptionTaskFailed": "شکست وظیفه برنامه ریزی شده",
-    "NotificationOptionUserLockedOut": "کاربر از سیستم خارج شد",
+    "NotificationOptionUserLockedOut": "کاربر قفل شد",
     "NotificationOptionVideoPlayback": "پخش ویدیو آغاز شد",
     "NotificationOptionVideoPlayback": "پخش ویدیو آغاز شد",
     "NotificationOptionVideoPlaybackStopped": "پخش ویدیو متوقف شد",
     "NotificationOptionVideoPlaybackStopped": "پخش ویدیو متوقف شد",
-    "Photos": "عکس ها",
-    "Playlists": "لیست های پخش",
+    "Photos": "عکسها",
+    "Playlists": "لیستهای پخش",
     "Plugin": "افزونه",
     "Plugin": "افزونه",
     "PluginInstalledWithName": "{0} نصب شد",
     "PluginInstalledWithName": "{0} نصب شد",
     "PluginUninstalledWithName": "{0} حذف شد",
     "PluginUninstalledWithName": "{0} حذف شد",
     "PluginUpdatedWithName": "{0} آپدیت شد",
     "PluginUpdatedWithName": "{0} آپدیت شد",
     "ProviderValue": "ارائه دهنده: {0}",
     "ProviderValue": "ارائه دهنده: {0}",
-    "ScheduledTaskFailedWithName": "{0} ناموفق بود",
+    "ScheduledTaskFailedWithName": "{0} شکست خورد",
     "ScheduledTaskStartedWithName": "{0} شروع شد",
     "ScheduledTaskStartedWithName": "{0} شروع شد",
-    "ServerNameNeedsToBeRestarted": "{0} احتیاج به راه اندازی مجدد",
-    "Shows": "سریال ها",
-    "Songs": "آهنگ ها",
+    "ServerNameNeedsToBeRestarted": "{0} نیاز به راه اندازی مجدد دارد",
+    "Shows": "سریالها",
+    "Songs": "موسیقی‌ها",
     "StartupEmbyServerIsLoading": "سرور Jellyfin در حال بارگیری است. لطفا کمی بعد دوباره تلاش کنید.",
     "StartupEmbyServerIsLoading": "سرور Jellyfin در حال بارگیری است. لطفا کمی بعد دوباره تلاش کنید.",
     "SubtitleDownloadFailureForItem": "دانلود زیرنویس برای {0} ناموفق بود",
     "SubtitleDownloadFailureForItem": "دانلود زیرنویس برای {0} ناموفق بود",
-    "SubtitleDownloadFailureFromForItem": "زیرنویس برای دانلود با مشکل مواجه شده از {0} برای {1}",
-    "SubtitlesDownloadedForItem": "زیرنویس {0} دانلود شد",
-    "Sync": "همگامسازی",
+    "SubtitleDownloadFailureFromForItem": "بارگیری زیرنویس برای {1} از {0} شکست خورد",
+    "Sync": "همگام‌سازی",
     "System": "سیستم",
     "System": "سیستم",
-    "TvShows": "سریال های تلویزیونی",
+    "TvShows": "سریالهای تلویزیونی",
     "User": "کاربر",
     "User": "کاربر",
     "UserCreatedWithName": "کاربر {0} ایجاد شد",
     "UserCreatedWithName": "کاربر {0} ایجاد شد",
     "UserDeletedWithName": "کاربر {0} حذف شد",
     "UserDeletedWithName": "کاربر {0} حذف شد",
-    "UserDownloadingItemWithValues": "{0} در حال دانلود است {1}",
-    "UserLockedOutWithName": "کاربر {0} از سیستم خارج شد",
+    "UserDownloadingItemWithValues": "{0} در حال بارگیری {1} می‌باشد",
+    "UserLockedOutWithName": "کاربر {0} قفل شده است",
     "UserOfflineFromDevice": "ارتباط {0} از {1} قطع شد",
     "UserOfflineFromDevice": "ارتباط {0} از {1} قطع شد",
-    "UserOnlineFromDevice": "{0}از {1} آنلاین میباشد",
-    "UserPasswordChangedWithName": "رمز برای کاربر {0} تغییر یافت",
+    "UserOnlineFromDevice": "{0} از {1} آنلاین میباشد",
+    "UserPasswordChangedWithName": "گذرواژه برای کاربر {0} تغییر کرد",
     "UserPolicyUpdatedWithName": "سیاست کاربری برای {0} بروزرسانی شد",
     "UserPolicyUpdatedWithName": "سیاست کاربری برای {0} بروزرسانی شد",
-    "UserStartedPlayingItemWithValues": "{0} شروع به پخش {1} کرد",
-    "UserStoppedPlayingItemWithValues": "{0} پخش {1} را متوقف کرد",
-    "ValueHasBeenAddedToLibrary": "{0} اضافه شده به کتابخانه رسانه شما",
-    "ValueSpecialEpisodeName": "ویژه- {0}",
+    "UserStartedPlayingItemWithValues": "{0} در حال پخش {1} بر روی {2} است",
+    "UserStoppedPlayingItemWithValues": "{0} پخش {1} را بر روی {2} به پایان رساند",
+    "ValueHasBeenAddedToLibrary": "{0} به کتابخانه‌ی رسانه‌ی شما افزوده شد",
+    "ValueSpecialEpisodeName": "ویژه - {0}",
     "VersionNumber": "نسخه {0}"
     "VersionNumber": "نسخه {0}"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/fi.json

@@ -69,7 +69,6 @@
     "UserCreatedWithName": "Luotiin käyttäjä {0}",
     "UserCreatedWithName": "Luotiin käyttäjä {0}",
     "TvShows": "TV-Ohjelmat",
     "TvShows": "TV-Ohjelmat",
     "Sync": "Synkronoi",
     "Sync": "Synkronoi",
-    "SubtitlesDownloadedForItem": "Tekstitys ladattu {0}",
     "SubtitleDownloadFailureFromForItem": "Tekstityksen lataaminen epäonnistui {0} - {1}",
     "SubtitleDownloadFailureFromForItem": "Tekstityksen lataaminen epäonnistui {0} - {1}",
     "StartupEmbyServerIsLoading": "Jellyfin palvelin latautuu. Kokeile hetken kuluttua uudelleen.",
     "StartupEmbyServerIsLoading": "Jellyfin palvelin latautuu. Kokeile hetken kuluttua uudelleen.",
     "Songs": "Kappaleet",
     "Songs": "Kappaleet",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/fil.json

@@ -16,7 +16,6 @@
     "TvShows": "Pelikula",
     "TvShows": "Pelikula",
     "System": "Sistema",
     "System": "Sistema",
     "Sync": "Pag-sync",
     "Sync": "Pag-sync",
-    "SubtitlesDownloadedForItem": "Naidownload na ang subtitles {0}",
     "SubtitleDownloadFailureFromForItem": "Hindi naidownload ang subtitles {0} para sa {1}",
     "SubtitleDownloadFailureFromForItem": "Hindi naidownload ang subtitles {0} para sa {1}",
     "StartupEmbyServerIsLoading": "Nagloload ang Jellyfin Server. Sandaling maghintay.",
     "StartupEmbyServerIsLoading": "Nagloload ang Jellyfin Server. Sandaling maghintay.",
     "Songs": "Kanta",
     "Songs": "Kanta",

+ 3 - 2
Emby.Server.Implementations/Localization/Core/fr-CA.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
-    "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont été téléchargés",
     "Sync": "Synchroniser",
     "Sync": "Synchroniser",
     "System": "Système",
     "System": "Système",
     "TvShows": "Séries Télé",
     "TvShows": "Séries Télé",
@@ -93,5 +92,7 @@
     "UserStoppedPlayingItemWithValues": "{0} vient d'arrêter la lecture de {1} sur {2}",
     "UserStoppedPlayingItemWithValues": "{0} vient d'arrêter la lecture de {1} sur {2}",
     "ValueHasBeenAddedToLibrary": "{0} a été ajouté à votre médiathèque",
     "ValueHasBeenAddedToLibrary": "{0} a été ajouté à votre médiathèque",
     "ValueSpecialEpisodeName": "Spécial - {0}",
     "ValueSpecialEpisodeName": "Spécial - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TasksLibraryCategory": "Bibliothèque",
+    "TasksMaintenanceCategory": "Entretien"
 }
 }

+ 23 - 2
Emby.Server.Implementations/Localization/Core/fr.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "StartupEmbyServerIsLoading": "Le serveur Jellyfin est en cours de chargement. Veuillez réessayer dans quelques instants.",
     "SubtitleDownloadFailureForItem": "Le téléchargement des sous-titres pour {0} a échoué.",
     "SubtitleDownloadFailureForItem": "Le téléchargement des sous-titres pour {0} a échoué.",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
     "SubtitleDownloadFailureFromForItem": "Échec du téléchargement des sous-titres depuis {0} pour {1}",
-    "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont été téléchargés",
     "Sync": "Synchroniser",
     "Sync": "Synchroniser",
     "System": "Système",
     "System": "Système",
     "TvShows": "Séries Télé",
     "TvShows": "Séries Télé",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} vient d'arrêter la lecture de {1} sur {2}",
     "UserStoppedPlayingItemWithValues": "{0} vient d'arrêter la lecture de {1} sur {2}",
     "ValueHasBeenAddedToLibrary": "{0} a été ajouté à votre médiathèque",
     "ValueHasBeenAddedToLibrary": "{0} a été ajouté à votre médiathèque",
     "ValueSpecialEpisodeName": "Spécial - {0}",
     "ValueSpecialEpisodeName": "Spécial - {0}",
-    "VersionNumber": "Version {0}"
+    "VersionNumber": "Version {0}",
+    "TasksChannelsCategory": "Chaines en ligne",
+    "TaskDownloadMissingSubtitlesDescription": "Cherche les sous-titres manquant sur internet en se basant sur la configuration des métadonnées.",
+    "TaskDownloadMissingSubtitles": "Télécharge les sous-titres manquant",
+    "TaskRefreshChannelsDescription": "Rafraîchit les informations des chaines en ligne.",
+    "TaskRefreshChannels": "Rafraîchit les chaines",
+    "TaskCleanTranscodeDescription": "Supprime les fichiers transcodés de plus d'un jour.",
+    "TaskCleanTranscode": "Nettoie les dossier des transcodages",
+    "TaskUpdatePluginsDescription": "Télécharge et installe les mises à jours des plugins configurés pour être mis à jour automatiquement.",
+    "TaskUpdatePlugins": "Mettre à jour les plugins",
+    "TaskRefreshPeopleDescription": "Met à jour les métadonnées pour les acteurs et directeurs dans votre bibliothèque.",
+    "TaskRefreshPeople": "Rafraîchit les acteurs",
+    "TaskCleanLogsDescription": "Supprime les journaux de plus de {0} jours.",
+    "TaskCleanLogs": "Nettoie le répertoire des journaux",
+    "TaskRefreshLibraryDescription": "Scanne toute les bibliothèques pour trouver les nouveaux fichiers et rafraîchit les métadonnées.",
+    "TaskRefreshLibrary": "Scanne toute les Bibliothèques",
+    "TaskRefreshChapterImagesDescription": "Crée des images de miniature pour les vidéos ayant des chapitres.",
+    "TaskRefreshChapterImages": "Extrait les images de chapitre",
+    "TaskCleanCacheDescription": "Supprime les fichiers de cache dont le système n'a plus besoin.",
+    "TaskCleanCache": "Vider le répertoire cache",
+    "TasksApplicationCategory": "Application",
+    "TasksLibraryCategory": "Bibliothèque",
+    "TasksMaintenanceCategory": "Maintenance"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/gsw.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server ladt. Bitte grad noeinisch probiere.",
     "StartupEmbyServerIsLoading": "Jellyfin Server ladt. Bitte grad noeinisch probiere.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Ondertetle vo {0} för {1} hend ned chönne abeglade wärde",
     "SubtitleDownloadFailureFromForItem": "Ondertetle vo {0} för {1} hend ned chönne abeglade wärde",
-    "SubtitlesDownloadedForItem": "Ondertetle abeglade för {0}",
     "Sync": "Synchronisation",
     "Sync": "Synchronisation",
     "System": "System",
     "System": "System",
     "TvShows": "Färnsehserie",
     "TvShows": "Färnsehserie",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/he.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "שרת Jellyfin בהליכי טעינה. אנא נסה שנית בעוד זמן קצר.",
     "StartupEmbyServerIsLoading": "שרת Jellyfin בהליכי טעינה. אנא נסה שנית בעוד זמן קצר.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "סנכרן",
     "Sync": "סנכרן",
     "System": "System",
     "System": "System",
     "TvShows": "סדרות טלוויזיה",
     "TvShows": "סדרות טלוויזיה",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/hr.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se učitava. Pokušajte ponovo kasnije.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se učitava. Pokušajte ponovo kasnije.",
     "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}",
     "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Titlovi prijevoda preuzeti za {0}",
     "Sync": "Sink.",
     "Sync": "Sink.",
     "System": "Sistem",
     "System": "Sistem",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/hu.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "A Jellyfin Szerver betöltődik. Kérlek, próbáld újra hamarosan.",
     "StartupEmbyServerIsLoading": "A Jellyfin Szerver betöltődik. Kérlek, próbáld újra hamarosan.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Nem sikerült a felirat letöltése innen:  {0} ehhez: {1}",
     "SubtitleDownloadFailureFromForItem": "Nem sikerült a felirat letöltése innen:  {0} ehhez: {1}",
-    "SubtitlesDownloadedForItem": "Letöltött feliratok a következőhöz: {0}",
     "Sync": "Szinkronizál",
     "Sync": "Szinkronizál",
     "System": "Rendszer",
     "System": "Rendszer",
     "TvShows": "TV műsorok",
     "TvShows": "TV műsorok",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/id.json

@@ -54,7 +54,6 @@
     "User": "Pengguna",
     "User": "Pengguna",
     "System": "Sistem",
     "System": "Sistem",
     "Sync": "Sinkron",
     "Sync": "Sinkron",
-    "SubtitlesDownloadedForItem": "Talop telah diunduh untuk {0}",
     "Shows": "Tayangan",
     "Shows": "Tayangan",
     "ServerNameNeedsToBeRestarted": "{0} perlu dimuat ulang",
     "ServerNameNeedsToBeRestarted": "{0} perlu dimuat ulang",
     "ScheduledTaskStartedWithName": "{0} dimulai",
     "ScheduledTaskStartedWithName": "{0} dimulai",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/is.json

@@ -86,7 +86,6 @@
     "UserOfflineFromDevice": "{0} hefur aftengst frá {1}",
     "UserOfflineFromDevice": "{0} hefur aftengst frá {1}",
     "UserLockedOutWithName": "Notanda {0} hefur verið hindraður aðgangur",
     "UserLockedOutWithName": "Notanda {0} hefur verið hindraður aðgangur",
     "UserDownloadingItemWithValues": "{0} Hleður niður {1}",
     "UserDownloadingItemWithValues": "{0} Hleður niður {1}",
-    "SubtitlesDownloadedForItem": "Skjátextum halað niður fyrir {0}",
     "SubtitleDownloadFailureFromForItem": "Tókst ekki að hala niður skjátextum frá {0} til {1}",
     "SubtitleDownloadFailureFromForItem": "Tókst ekki að hala niður skjátextum frá {0} til {1}",
     "ProviderValue": "Veitandi: {0}",
     "ProviderValue": "Veitandi: {0}",
     "MessageNamedServerConfigurationUpdatedWithValue": "Stilling {0} hefur verið uppfærð á netþjón",
     "MessageNamedServerConfigurationUpdatedWithValue": "Stilling {0} hefur verið uppfærð á netþjón",

+ 25 - 4
Emby.Server.Implementations/Localization/Core/it.json

@@ -5,7 +5,7 @@
     "Artists": "Artisti",
     "Artists": "Artisti",
     "AuthenticationSucceededWithUserName": "{0} autenticato con successo",
     "AuthenticationSucceededWithUserName": "{0} autenticato con successo",
     "Books": "Libri",
     "Books": "Libri",
-    "CameraImageUploadedFrom": "È stata caricata una nuova immagine della fotocamera da {0}",
+    "CameraImageUploadedFrom": "È stata caricata una nuova immagine della fotocamera dal device {0}",
     "Channels": "Canali",
     "Channels": "Canali",
     "ChapterNameValue": "Capitolo {0}",
     "ChapterNameValue": "Capitolo {0}",
     "Collections": "Collezioni",
     "Collections": "Collezioni",
@@ -15,7 +15,7 @@
     "Favorites": "Preferiti",
     "Favorites": "Preferiti",
     "Folders": "Cartelle",
     "Folders": "Cartelle",
     "Genres": "Generi",
     "Genres": "Generi",
-    "HeaderAlbumArtists": "Artisti dell' Album",
+    "HeaderAlbumArtists": "Artisti degli Album",
     "HeaderCameraUploads": "Caricamenti Fotocamera",
     "HeaderCameraUploads": "Caricamenti Fotocamera",
     "HeaderContinueWatching": "Continua a guardare",
     "HeaderContinueWatching": "Continua a guardare",
     "HeaderFavoriteAlbums": "Album Preferiti",
     "HeaderFavoriteAlbums": "Album Preferiti",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.",
     "StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.",
     "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}",
     "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}",
     "SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}",
     "SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}",
-    "SubtitlesDownloadedForItem": "Sottotitoli scaricati per {0}",
     "Sync": "Sincronizza",
     "Sync": "Sincronizza",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Serie TV",
     "TvShows": "Serie TV",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}",
     "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}",
     "ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale",
     "ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale",
     "ValueSpecialEpisodeName": "Speciale - {0}",
     "ValueSpecialEpisodeName": "Speciale - {0}",
-    "VersionNumber": "Versione {0}"
+    "VersionNumber": "Versione {0}",
+    "TaskRefreshChannelsDescription": "Aggiorna le informazioni dei canali Internet.",
+    "TaskDownloadMissingSubtitlesDescription": "Cerca su internet i sottotitoli mancanti basandosi sulle configurazioni dei metadati.",
+    "TaskDownloadMissingSubtitles": "Scarica i sottotitoli mancanti",
+    "TaskRefreshChannels": "Aggiorna i canali",
+    "TaskCleanTranscodeDescription": "Cancella i file di transcode più vecchi di un giorno.",
+    "TaskCleanTranscode": "Svuota la cartella del transcoding",
+    "TaskUpdatePluginsDescription": "Scarica e installa gli aggiornamenti per i plugin che sono stati configurati per essere aggiornati contemporaneamente.",
+    "TaskUpdatePlugins": "Aggiorna i Plugin",
+    "TaskRefreshPeopleDescription": "Aggiorna i metadati per gli attori e registi nella tua libreria multimediale.",
+    "TaskRefreshPeople": "Aggiorna persone",
+    "TaskCleanLogsDescription": "Rimuovi i file di log più vecchi di {0} giorni.",
+    "TaskCleanLogs": "Pulisci la cartella dei log",
+    "TaskRefreshLibraryDescription": "Analizza la tua libreria multimediale per nuovi file e rinnova i metadati.",
+    "TaskRefreshLibrary": "Analizza la libreria dei contenuti multimediali",
+    "TaskRefreshChapterImagesDescription": "Crea le thumbnail per i video che hanno capitoli.",
+    "TaskRefreshChapterImages": "Estrai immagini capitolo",
+    "TaskCleanCacheDescription": "Cancella i file di cache non più necessari al sistema.",
+    "TaskCleanCache": "Pulisci la directory della cache",
+    "TasksChannelsCategory": "Canali su Internet",
+    "TasksApplicationCategory": "Applicazione",
+    "TasksLibraryCategory": "Libreria",
+    "TasksMaintenanceCategory": "Manutenzione"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ja.json

@@ -75,7 +75,6 @@
     "Songs": "曲",
     "Songs": "曲",
     "StartupEmbyServerIsLoading": "Jellyfin Server は現在読み込み中です。しばらくしてからもう一度お試しください。",
     "StartupEmbyServerIsLoading": "Jellyfin Server は現在読み込み中です。しばらくしてからもう一度お試しください。",
     "SubtitleDownloadFailureFromForItem": "{0} から {1}の字幕のダウンロードに失敗しました",
     "SubtitleDownloadFailureFromForItem": "{0} から {1}の字幕のダウンロードに失敗しました",
-    "SubtitlesDownloadedForItem": "{0} の字幕がダウンロードされました",
     "Sync": "同期",
     "Sync": "同期",
     "System": "システム",
     "System": "システム",
     "TvShows": "テレビ番組",
     "TvShows": "テレビ番組",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/kk.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server júktelýde. Áreketti kóp uzamaı qaıtalańyz.",
     "StartupEmbyServerIsLoading": "Jellyfin Server júktelýde. Áreketti kóp uzamaı qaıtalańyz.",
     "SubtitleDownloadFailureForItem": "Субтитрлер {0} үшін жүктеліп алынуы сәтсіз",
     "SubtitleDownloadFailureForItem": "Субтитрлер {0} үшін жүктеліп алынуы сәтсіз",
     "SubtitleDownloadFailureFromForItem": "{1} úshin sýbtıtrlerdi {0} kózinen júktep alý sátsiz",
     "SubtitleDownloadFailureFromForItem": "{1} úshin sýbtıtrlerdi {0} kózinen júktep alý sátsiz",
-    "SubtitlesDownloadedForItem": "{0} úshin sýbtıtrler júktelip alyndy",
     "Sync": "Úndestirý",
     "Sync": "Úndestirý",
     "System": "Júıe",
     "System": "Júıe",
     "TvShows": "TD-kórsetimder",
     "TvShows": "TD-kórsetimder",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ko.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin 서버를 불러오고 있습니다. 잠시 후에 다시 시도하십시오.",
     "StartupEmbyServerIsLoading": "Jellyfin 서버를 불러오고 있습니다. 잠시 후에 다시 시도하십시오.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "{0}에서 {1} 자막 다운로드에 실패했습니다",
     "SubtitleDownloadFailureFromForItem": "{0}에서 {1} 자막 다운로드에 실패했습니다",
-    "SubtitlesDownloadedForItem": "{0} 자막 다운로드 완료",
     "Sync": "동기화",
     "Sync": "동기화",
     "System": "시스템",
     "System": "시스템",
     "TvShows": "TV 쇼",
     "TvShows": "TV 쇼",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/lt-LT.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server kraunasi. Netrukus pabandykite dar kartą.",
     "StartupEmbyServerIsLoading": "Jellyfin Server kraunasi. Netrukus pabandykite dar kartą.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
     "SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
-    "SubtitlesDownloadedForItem": "{0} subtitrai parsiųsti",
     "Sync": "Sinchronizuoti",
     "Sync": "Sinchronizuoti",
     "System": "System",
     "System": "System",
     "TvShows": "TV Serialai",
     "TvShows": "TV Serialai",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/lv.json

@@ -31,7 +31,6 @@
     "TvShows": "TV Raidījumi",
     "TvShows": "TV Raidījumi",
     "Sync": "Sinhronizācija",
     "Sync": "Sinhronizācija",
     "System": "Sistēma",
     "System": "Sistēma",
-    "SubtitlesDownloadedForItem": "Subtitri lejupielādēti priekš {0}",
     "StartupEmbyServerIsLoading": "Jellyfin Serveris lādējas. Lūdzu mēģiniet vēlreiz pēc brīža.",
     "StartupEmbyServerIsLoading": "Jellyfin Serveris lādējas. Lūdzu mēģiniet vēlreiz pēc brīža.",
     "Songs": "Dziesmas",
     "Songs": "Dziesmas",
     "Shows": "Raidījumi",
     "Shows": "Raidījumi",
@@ -92,5 +91,27 @@
     "HeaderFavoriteShows": "Raidījumu Favorīti",
     "HeaderFavoriteShows": "Raidījumu Favorīti",
     "HeaderFavoriteEpisodes": "Episožu Favorīti",
     "HeaderFavoriteEpisodes": "Episožu Favorīti",
     "HeaderFavoriteArtists": "Izpildītāju Favorīti",
     "HeaderFavoriteArtists": "Izpildītāju Favorīti",
-    "HeaderFavoriteAlbums": "Albumu Favorīti"
+    "HeaderFavoriteAlbums": "Albumu Favorīti",
+    "TaskCleanCacheDescription": "Nodzēš keša datnes, kas vairs nav sistēmai vajadzīgas.",
+    "TaskRefreshChapterImages": "Izvilkt Nodaļu Attēlus",
+    "TasksApplicationCategory": "Lietotne",
+    "TasksLibraryCategory": "Bibliotēka",
+    "TaskDownloadMissingSubtitlesDescription": "Internetā meklē trūkstošus subtitrus pēc metadatu uzstādījumiem.",
+    "TaskDownloadMissingSubtitles": "Lejupielādēt trūkstošus subtitrus",
+    "TaskRefreshChannelsDescription": "Atjauno interneta kanālu informāciju.",
+    "TaskRefreshChannels": "Atjaunot Kanālus",
+    "TaskCleanTranscodeDescription": "Izdzēš trans-kodēšanas datnes, kas ir vecākas par vienu dienu.",
+    "TaskCleanTranscode": "Iztīrīt Trans-kodēšanas Mapi",
+    "TaskUpdatePluginsDescription": "Lejupielādē un uzstāda atjauninājumus paplašinājumiem, kam ir uzstādīta automātiskā atjaunināšana.",
+    "TaskUpdatePlugins": "Atjaunot Paplašinājumus",
+    "TaskRefreshPeopleDescription": "Atjauno metadatus priekš aktieriem un direktoriem tavā mediju bibliotēkā.",
+    "TaskRefreshPeople": "Atjaunot Cilvēkus",
+    "TaskCleanLogsDescription": "Nodzēš log datnes, kas ir vairāk par {0} dienām vecas.",
+    "TaskCleanLogs": "Iztīrīt Logdatņu Mapi",
+    "TaskRefreshLibraryDescription": "Skenē tavas mediju bibliotēkas priekš jaunām datnēm un atjauno metadatus.",
+    "TaskRefreshLibrary": "Skanēt Mediju Bibliotēku",
+    "TaskRefreshChapterImagesDescription": "Izveido sīktēlus priekš video ar sadaļām.",
+    "TaskCleanCache": "Iztīrīt Kešošanas Mapi",
+    "TasksChannelsCategory": "Interneta Kanāli",
+    "TasksMaintenanceCategory": "Apkope"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/mk.json

@@ -86,7 +86,6 @@
     "TvShows": "ТВ Серии",
     "TvShows": "ТВ Серии",
     "System": "Систем",
     "System": "Систем",
     "Sync": "Синхронизација",
     "Sync": "Синхронизација",
-    "SubtitlesDownloadedForItem": "Спуштање превод за {0}",
     "SubtitleDownloadFailureFromForItem": "Преводот неуспешно се спушти од {0} за {1}",
     "SubtitleDownloadFailureFromForItem": "Преводот неуспешно се спушти од {0} за {1}",
     "StartupEmbyServerIsLoading": "Jellyfin Server се пушта. Ве молиме причекајте.",
     "StartupEmbyServerIsLoading": "Jellyfin Server се пушта. Ве молиме причекајте.",
     "Songs": "Песни",
     "Songs": "Песни",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ms.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is loading. Please try again shortly.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitles failed to download from {0} for {1}",
-    "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
     "Sync": "Sync",
     "Sync": "Sync",
     "System": "Sistem",
     "System": "Sistem",
     "TvShows": "TV Shows",
     "TvShows": "TV Shows",

+ 5 - 2
Emby.Server.Implementations/Localization/Core/nb.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server laster. Prøv igjen snart.",
     "StartupEmbyServerIsLoading": "Jellyfin Server laster. Prøv igjen snart.",
     "SubtitleDownloadFailureForItem": "En feil oppstå under nedlasting av undertekster for  {0}",
     "SubtitleDownloadFailureForItem": "En feil oppstå under nedlasting av undertekster for  {0}",
     "SubtitleDownloadFailureFromForItem": "Kunne ikke laste ned undertekster fra {0} for {1}",
     "SubtitleDownloadFailureFromForItem": "Kunne ikke laste ned undertekster fra {0} for {1}",
-    "SubtitlesDownloadedForItem": "Undertekster lastet ned for {0}",
     "Sync": "Synkroniser",
     "Sync": "Synkroniser",
     "System": "System",
     "System": "System",
     "TvShows": "TV-serier",
     "TvShows": "TV-serier",
@@ -93,5 +92,9 @@
     "UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling  {1}",
     "UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling  {1}",
     "ValueHasBeenAddedToLibrary": "{0} har blitt lagt til i mediebiblioteket ditt",
     "ValueHasBeenAddedToLibrary": "{0} har blitt lagt til i mediebiblioteket ditt",
     "ValueSpecialEpisodeName": "Spesialepisode - {0}",
     "ValueSpecialEpisodeName": "Spesialepisode - {0}",
-    "VersionNumber": "Versjon {0}"
+    "VersionNumber": "Versjon {0}",
+    "TasksChannelsCategory": "Internett kanaler",
+    "TasksApplicationCategory": "Applikasjon",
+    "TasksLibraryCategory": "Bibliotek",
+    "TasksMaintenanceCategory": "Vedlikehold"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/nl.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server is aan het laden, probeer het later opnieuw.",
     "StartupEmbyServerIsLoading": "Jellyfin Server is aan het laden, probeer het later opnieuw.",
     "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt",
     "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt",
     "SubtitleDownloadFailureFromForItem": "Ondertitels konden niet gedownload worden van {0} voor {1}",
     "SubtitleDownloadFailureFromForItem": "Ondertitels konden niet gedownload worden van {0} voor {1}",
-    "SubtitlesDownloadedForItem": "Ondertiteling voor {0} is gedownload",
     "Sync": "Synchronisatie",
     "Sync": "Synchronisatie",
     "System": "Systeem",
     "System": "Systeem",
     "TvShows": "TV-series",
     "TvShows": "TV-series",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/pl.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Trwa wczytywanie serwera Jellyfin. Spróbuj ponownie za chwilę.",
     "StartupEmbyServerIsLoading": "Trwa wczytywanie serwera Jellyfin. Spróbuj ponownie za chwilę.",
     "SubtitleDownloadFailureForItem": "Pobieranie napisów dla {0} zakończone niepowodzeniem",
     "SubtitleDownloadFailureForItem": "Pobieranie napisów dla {0} zakończone niepowodzeniem",
     "SubtitleDownloadFailureFromForItem": "Nieudane pobieranie napisów z {0} dla {1}",
     "SubtitleDownloadFailureFromForItem": "Nieudane pobieranie napisów z {0} dla {1}",
-    "SubtitlesDownloadedForItem": "Pobrano napisy dla {0}",
     "Sync": "Synchronizacja",
     "Sync": "Synchronizacja",
     "System": "System",
     "System": "System",
     "TvShows": "Seriale",
     "TvShows": "Seriale",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/pt-BR.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "O Servidor Jellyfin está carregando. Por favor, tente novamente mais tarde.",
     "StartupEmbyServerIsLoading": "O Servidor Jellyfin está carregando. Por favor, tente novamente mais tarde.",
     "SubtitleDownloadFailureForItem": "Download de legendas falhou para {0}",
     "SubtitleDownloadFailureForItem": "Download de legendas falhou para {0}",
     "SubtitleDownloadFailureFromForItem": "Houve um problema ao baixar as legendas de {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Houve um problema ao baixar as legendas de {0} para {1}",
-    "SubtitlesDownloadedForItem": "Legendas baixadas para {0}",
     "Sync": "Sincronizar",
     "Sync": "Sincronizar",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Séries",
     "TvShows": "Séries",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1} em {2}",
     "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1} em {2}",
     "ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua biblioteca de mídia",
     "ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua biblioteca de mídia",
     "ValueSpecialEpisodeName": "Especial - {0}",
     "ValueSpecialEpisodeName": "Especial - {0}",
-    "VersionNumber": "Versão {0}"
+    "VersionNumber": "Versão {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Procurar na internet por legendas faltando baseado na configuração de metadados.",
+    "TaskDownloadMissingSubtitles": "Baixar legendas que estão faltando",
+    "TaskRefreshChannelsDescription": "Atualizar informação de canais da internet .",
+    "TaskRefreshChannels": "Atualizar Canais",
+    "TaskCleanTranscodeDescription": "Deletar arquivos de transcodificação com mais de um dia de criação.",
+    "TaskCleanTranscode": "Limpar pasta de transcodificação",
+    "TaskUpdatePluginsDescription": "Baixa e instala atualizações para plugins que estão configurados para atualizar automaticamente.",
+    "TaskUpdatePlugins": "Atualizar Plugins",
+    "TaskRefreshPeopleDescription": "Atualiza metadados para atores e diretores na sua biblioteca de mídia.",
+    "TaskRefreshPeople": "Atualizar pessoas",
+    "TaskCleanLogsDescription": "Deletar arquivos temporários com mais de {0} dias.",
+    "TaskCleanLogs": "Limpar pasta de logs",
+    "TaskRefreshLibraryDescription": "Escaneie a sua biblioteca de mídia para arquivos novos e atualize os metadados.",
+    "TaskRefreshLibrary": "Escanear a Biblioteca de Mídia",
+    "TaskRefreshChapterImagesDescription": "Criar miniaturas para vídeos que tem capítulos.",
+    "TaskRefreshChapterImages": "Extrair imagens dos capítulos",
+    "TaskCleanCacheDescription": "Deletar arquivos temporários que não são mais necessários para o sistema.",
+    "TaskCleanCache": "Limpar Arquivos Temporários",
+    "TasksChannelsCategory": "Canais da Internet",
+    "TasksApplicationCategory": "Aplicativo",
+    "TasksLibraryCategory": "Biblioteca",
+    "TasksMaintenanceCategory": "Manutenção"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/pt-PT.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente mais tarde.",
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente mais tarde.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas a partir de {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas a partir de {0} para {1}",
-    "SubtitlesDownloadedForItem": "Transferidas legendas para {0}",
     "Sync": "Sincronização",
     "Sync": "Sincronização",
     "System": "Sistema",
     "System": "Sistema",
     "TvShows": "Programas TV",
     "TvShows": "Programas TV",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/pt.json

@@ -31,7 +31,6 @@
     "User": "Utilizador",
     "User": "Utilizador",
     "TvShows": "Séries",
     "TvShows": "Séries",
     "System": "Sistema",
     "System": "Sistema",
-    "SubtitlesDownloadedForItem": "Legendas transferidas para {0}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas de {0} para {1}",
     "SubtitleDownloadFailureFromForItem": "Falha na transferência de legendas de {0} para {1}",
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente dentro de momentos.",
     "StartupEmbyServerIsLoading": "O servidor Jellyfin está a iniciar. Tente novamente dentro de momentos.",
     "ServerNameNeedsToBeRestarted": "{0} necessita ser reiniciado",
     "ServerNameNeedsToBeRestarted": "{0} necessita ser reiniciado",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/ro.json

@@ -17,7 +17,6 @@
     "TvShows": "Spectacole TV",
     "TvShows": "Spectacole TV",
     "System": "Sistem",
     "System": "Sistem",
     "Sync": "Sincronizare",
     "Sync": "Sincronizare",
-    "SubtitlesDownloadedForItem": "Subtitrari descarcate pentru {0}",
     "SubtitleDownloadFailureFromForItem": "Subtitrările nu au putut fi descărcate de la {0} pentru {1}",
     "SubtitleDownloadFailureFromForItem": "Subtitrările nu au putut fi descărcate de la {0} pentru {1}",
     "StartupEmbyServerIsLoading": "Se încarcă serverul Jellyfin. Încercați din nou în scurt timp.",
     "StartupEmbyServerIsLoading": "Se încarcă serverul Jellyfin. Încercați din nou în scurt timp.",
     "Songs": "Melodii",
     "Songs": "Melodii",
@@ -92,5 +91,27 @@
     "Artists": "Artiști",
     "Artists": "Artiști",
     "Application": "Aplicație",
     "Application": "Aplicație",
     "AppDeviceValues": "Aplicație: {0}, Dispozitiv: {1}",
     "AppDeviceValues": "Aplicație: {0}, Dispozitiv: {1}",
-    "Albums": "Albume"
+    "Albums": "Albume",
+    "TaskDownloadMissingSubtitlesDescription": "Caută pe internet subtitrările lipsă pe baza configurației metadatelor.",
+    "TaskDownloadMissingSubtitles": "Descarcă subtitrările lipsă",
+    "TaskRefreshChannelsDescription": "Actualizează informațiile despre canalul de internet.",
+    "TaskRefreshChannels": "Actualizează canale",
+    "TaskCleanTranscodeDescription": "Șterge fișierele de transcodare mai vechi de o zi.",
+    "TaskCleanTranscode": "Curățați directorul de transcodare",
+    "TaskUpdatePluginsDescription": "Descarcă și instalează actualizări pentru pluginuri care sunt configurate să se actualizeze automat.",
+    "TaskUpdatePlugins": "Actualizați plugin-uri",
+    "TaskRefreshPeopleDescription": "Actualizează metadatele pentru actori și regizori din biblioteca media.",
+    "TaskRefreshPeople": "Actualizează oamenii",
+    "TaskCleanLogsDescription": "Șterge fișierele jurnal care au mai mult de {0} zile.",
+    "TaskCleanLogs": "Curățare director jurnal",
+    "TaskRefreshLibraryDescription": "Scanează biblioteca media pentru fișiere noi și reîmprospătează metadatele.",
+    "TaskRefreshLibrary": "Scanează Biblioteca Media",
+    "TaskRefreshChapterImagesDescription": "Creează miniaturi pentru videourile care au capitole.",
+    "TaskRefreshChapterImages": "Extrage Imaginile de Capitol",
+    "TaskCleanCacheDescription": "Șterge fișierele cache care nu mai sunt necesare sistemului.",
+    "TaskCleanCache": "Curățați directorul cache",
+    "TasksChannelsCategory": "Canale de pe Internet",
+    "TasksApplicationCategory": "Aplicație",
+    "TasksLibraryCategory": "Librărie",
+    "TasksMaintenanceCategory": "Mentenanță"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/ru.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server загружается. Повторите попытку в ближайшее время.",
     "StartupEmbyServerIsLoading": "Jellyfin Server загружается. Повторите попытку в ближайшее время.",
     "SubtitleDownloadFailureForItem": "Субтитры к {0} не удалось загрузить",
     "SubtitleDownloadFailureForItem": "Субтитры к {0} не удалось загрузить",
     "SubtitleDownloadFailureFromForItem": "Субтитры к {1} не удалось загрузить с {0}",
     "SubtitleDownloadFailureFromForItem": "Субтитры к {1} не удалось загрузить с {0}",
-    "SubtitlesDownloadedForItem": "Субтитры к {0} загружены",
     "Sync": "Синхро",
     "Sync": "Синхро",
     "System": "Система",
     "System": "Система",
     "TvShows": "ТВ",
     "TvShows": "ТВ",

+ 23 - 2
Emby.Server.Implementations/Localization/Core/sk.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server sa spúšťa. Prosím, skúste to o chvíľu znova.",
     "StartupEmbyServerIsLoading": "Jellyfin Server sa spúšťa. Prosím, skúste to o chvíľu znova.",
     "SubtitleDownloadFailureForItem": "Sťahovanie titulkov pre {0} zlyhalo",
     "SubtitleDownloadFailureForItem": "Sťahovanie titulkov pre {0} zlyhalo",
     "SubtitleDownloadFailureFromForItem": "Sťahovanie titulkov z {0} pre {1} zlyhalo",
     "SubtitleDownloadFailureFromForItem": "Sťahovanie titulkov z {0} pre {1} zlyhalo",
-    "SubtitlesDownloadedForItem": "Titulky pre {0} stiahnuté",
     "Sync": "Synchronizácia",
     "Sync": "Synchronizácia",
     "System": "Systém",
     "System": "Systém",
     "TvShows": "TV seriály",
     "TvShows": "TV seriály",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} ukončil prehrávanie {1} na {2}",
     "UserStoppedPlayingItemWithValues": "{0} ukončil prehrávanie {1} na {2}",
     "ValueHasBeenAddedToLibrary": "{0} bol pridané do vašej knižnice médií",
     "ValueHasBeenAddedToLibrary": "{0} bol pridané do vašej knižnice médií",
     "ValueSpecialEpisodeName": "Špeciál - {0}",
     "ValueSpecialEpisodeName": "Špeciál - {0}",
-    "VersionNumber": "Verzia {0}"
+    "VersionNumber": "Verzia {0}",
+    "TaskDownloadMissingSubtitlesDescription": "Vyhľadá na internete chýbajúce titulky podľa toho, ako sú nakonfigurované metadáta.",
+    "TaskDownloadMissingSubtitles": "Stiahnuť chýbajúce titulky",
+    "TaskRefreshChannelsDescription": "Obnoví informácie o internetových kanáloch.",
+    "TaskRefreshChannels": "Obnoviť kanály",
+    "TaskCleanTranscodeDescription": "Vymaže súbory transkódovania, ktoré sú staršie ako jeden deň.",
+    "TaskCleanTranscode": "Vyčistiť priečinok pre transkódovanie",
+    "TaskUpdatePluginsDescription": "Stiahne a nainštaluje aktualizácie pre zásuvné moduly, ktoré sú nastavené tak, aby sa aktualizovali automaticky.",
+    "TaskUpdatePlugins": "Aktualizovať zásuvné moduly",
+    "TaskRefreshPeopleDescription": "Aktualizuje metadáta pre hercov a režisérov vo vašej mediálnej knižnici.",
+    "TaskRefreshPeople": "Obnoviť osoby",
+    "TaskCleanLogsDescription": "Vymaže log súbory, ktoré su staršie ako {0} deň/dni/dní.",
+    "TaskCleanLogs": "Vyčistiť priečinok s logmi",
+    "TaskRefreshLibraryDescription": "Hľadá vo vašej mediálnej knižnici nové súbory a obnovuje metadáta.",
+    "TaskRefreshLibrary": "Prehľadávať knižnicu medií",
+    "TaskRefreshChapterImagesDescription": "Vytvorí náhľady pre videá, ktoré majú kapitoly.",
+    "TaskRefreshChapterImages": "Extrahovať obrázky kapitol",
+    "TaskCleanCacheDescription": "Vymaže cache súbory, ktoré nie sú už potrebné pre systém.",
+    "TaskCleanCache": "Vyčistiť Cache priečinok",
+    "TasksChannelsCategory": "Internetové kanály",
+    "TasksApplicationCategory": "Aplikácia",
+    "TasksLibraryCategory": "Knižnica",
+    "TasksMaintenanceCategory": "Údržba"
 }
 }

+ 0 - 1
Emby.Server.Implementations/Localization/Core/sl-SI.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server se nalaga. Poskusi ponovno kasneje.",
     "StartupEmbyServerIsLoading": "Jellyfin Server se nalaga. Poskusi ponovno kasneje.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "Neuspešen prenos podnapisov iz {0} za {1}",
     "SubtitleDownloadFailureFromForItem": "Neuspešen prenos podnapisov iz {0} za {1}",
-    "SubtitlesDownloadedForItem": "Podnapisi preneseni za {0}",
     "Sync": "Sinhroniziraj",
     "Sync": "Sinhroniziraj",
     "System": "System",
     "System": "System",
     "TvShows": "TV serije",
     "TvShows": "TV serije",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/sr.json

@@ -17,7 +17,6 @@
     "TvShows": "ТВ серије",
     "TvShows": "ТВ серије",
     "System": "Систем",
     "System": "Систем",
     "Sync": "Усклади",
     "Sync": "Усклади",
-    "SubtitlesDownloadedForItem": "Титлови преузети за {0}",
     "SubtitleDownloadFailureFromForItem": "Неуспело преузимање титлова за {1} са {0}",
     "SubtitleDownloadFailureFromForItem": "Неуспело преузимање титлова за {1} са {0}",
     "StartupEmbyServerIsLoading": "Џелифин сервер се подиже. Покушајте поново убрзо.",
     "StartupEmbyServerIsLoading": "Џелифин сервер се подиже. Покушајте поново убрзо.",
     "Songs": "Песме",
     "Songs": "Песме",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/sv.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Server arbetar. Pröva igen snart.",
     "StartupEmbyServerIsLoading": "Jellyfin Server arbetar. Pröva igen snart.",
     "SubtitleDownloadFailureForItem": "Nerladdning av undertexter för {0} misslyckades",
     "SubtitleDownloadFailureForItem": "Nerladdning av undertexter för {0} misslyckades",
     "SubtitleDownloadFailureFromForItem": "Undertexter kunde inte laddas ner från {0} för {1}",
     "SubtitleDownloadFailureFromForItem": "Undertexter kunde inte laddas ner från {0} för {1}",
-    "SubtitlesDownloadedForItem": "Undertexter har laddats ner till {0}",
     "Sync": "Synk",
     "Sync": "Synk",
     "System": "System",
     "System": "System",
     "TvShows": "TV-serier",
     "TvShows": "TV-serier",

+ 0 - 1
Emby.Server.Implementations/Localization/Core/tr.json

@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin Sunucusu yükleniyor. Lütfen kısa süre sonra tekrar deneyin.",
     "StartupEmbyServerIsLoading": "Jellyfin Sunucusu yükleniyor. Lütfen kısa süre sonra tekrar deneyin.",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
     "SubtitleDownloadFailureFromForItem": "{1} için alt yazılar {0} 'dan indirilemedi",
     "SubtitleDownloadFailureFromForItem": "{1} için alt yazılar {0} 'dan indirilemedi",
-    "SubtitlesDownloadedForItem": "{0} için altyazılar indirildi",
     "Sync": "Eşitle",
     "Sync": "Eşitle",
     "System": "Sistem",
     "System": "Sistem",
     "TvShows": "Diziler",
     "TvShows": "Diziler",

+ 25 - 4
Emby.Server.Implementations/Localization/Core/zh-CN.json

@@ -3,11 +3,11 @@
     "AppDeviceValues": "应用: {0}, 设备: {1}",
     "AppDeviceValues": "应用: {0}, 设备: {1}",
     "Application": "应用程序",
     "Application": "应用程序",
     "Artists": "艺术家",
     "Artists": "艺术家",
-    "AuthenticationSucceededWithUserName": "{0} 验证成功",
+    "AuthenticationSucceededWithUserName": "成功验证{0} ",
     "Books": "书籍",
     "Books": "书籍",
     "CameraImageUploadedFrom": "新的相机图像已从 {0} 上传",
     "CameraImageUploadedFrom": "新的相机图像已从 {0} 上传",
     "Channels": "频道",
     "Channels": "频道",
-    "ChapterNameValue": "第 {0} ",
+    "ChapterNameValue": "第 {0} ",
     "Collections": "合集",
     "Collections": "合集",
     "DeviceOfflineWithName": "{0} 已断开",
     "DeviceOfflineWithName": "{0} 已断开",
     "DeviceOnlineWithName": "{0} 已连接",
     "DeviceOnlineWithName": "{0} 已连接",
@@ -76,7 +76,6 @@
     "StartupEmbyServerIsLoading": "Jellyfin 服务器加载中。请稍后再试。",
     "StartupEmbyServerIsLoading": "Jellyfin 服务器加载中。请稍后再试。",
     "SubtitleDownloadFailureForItem": "为 {0} 下载字幕失败",
     "SubtitleDownloadFailureForItem": "为 {0} 下载字幕失败",
     "SubtitleDownloadFailureFromForItem": "无法从 {0} 下载 {1} 的字幕",
     "SubtitleDownloadFailureFromForItem": "无法从 {0} 下载 {1} 的字幕",
-    "SubtitlesDownloadedForItem": "已为 {0} 下载了字幕",
     "Sync": "同步",
     "Sync": "同步",
     "System": "系统",
     "System": "系统",
     "TvShows": "电视剧",
     "TvShows": "电视剧",
@@ -93,5 +92,27 @@
     "UserStoppedPlayingItemWithValues": "{0} 已在 {2} 上停止播放 {1}",
     "UserStoppedPlayingItemWithValues": "{0} 已在 {2} 上停止播放 {1}",
     "ValueHasBeenAddedToLibrary": "{0} 已添加至您的媒体库中",
     "ValueHasBeenAddedToLibrary": "{0} 已添加至您的媒体库中",
     "ValueSpecialEpisodeName": "特典 - {0}",
     "ValueSpecialEpisodeName": "特典 - {0}",
-    "VersionNumber": "版本 {0}"
+    "VersionNumber": "版本 {0}",
+    "TaskUpdatePluginsDescription": "为已设置为自动更新的插件下载和安装更新。",
+    "TaskRefreshPeople": "刷新人员",
+    "TasksChannelsCategory": "互联网频道",
+    "TasksLibraryCategory": "媒体库",
+    "TaskDownloadMissingSubtitlesDescription": "根据元数据设置在互联网上搜索缺少的字幕。",
+    "TaskDownloadMissingSubtitles": "下载缺少的字幕",
+    "TaskRefreshChannelsDescription": "刷新互联网频道信息。",
+    "TaskRefreshChannels": "刷新频道",
+    "TaskCleanTranscodeDescription": "删除存在超过 1 天的转码文件。",
+    "TaskCleanTranscode": "清理转码目录",
+    "TaskUpdatePlugins": "更新插件",
+    "TaskRefreshPeopleDescription": "更新媒体库中演员和导演的元数据。",
+    "TaskCleanLogsDescription": "删除存在超过 {0} 天的的日志文件。",
+    "TaskCleanLogs": "清理日志目录",
+    "TaskRefreshLibraryDescription": "扫描你的媒体库以获取新文件并刷新元数据。",
+    "TaskRefreshLibrary": "扫描媒体库",
+    "TaskRefreshChapterImagesDescription": "为包含剧集的视频提取缩略图。",
+    "TaskRefreshChapterImages": "提取剧集图片",
+    "TaskCleanCacheDescription": "删除系统不再需要的缓存文件。",
+    "TaskCleanCache": "清理缓存目录",
+    "TasksApplicationCategory": "应用程序",
+    "TasksMaintenanceCategory": "维护"
 }
 }

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно