瀏覽代碼

update translations

Luke Pulverenti 11 年之前
父節點
當前提交
d1a9d42eaf
共有 37 個文件被更改,包括 360 次插入35 次删除
  1. 4 7
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  2. 1 1
      MediaBrowser.Common.Implementations/Logging/NlogManager.cs
  3. 11 2
      MediaBrowser.Dlna/PlayTo/DidlBuilder.cs
  4. 1 1
      MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs
  5. 1 1
      MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
  6. 206 4
      MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
  7. 1 1
      MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
  8. 53 5
      MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
  9. 0 1
      MediaBrowser.Model/Configuration/UserConfiguration.cs
  10. 17 1
      MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
  11. 6 7
      MediaBrowser.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
  12. 1 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json
  13. 0 0
      MediaBrowser.Server.Implementations/Localization/JavaScript/el.json
  14. 1 1
      MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
  15. 1 1
      MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
  16. 1 1
      MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json
  17. 2 0
      MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs
  18. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/ar.json
  19. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/cs.json
  20. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/de.json
  21. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/el.json
  22. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
  23. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/en_US.json
  24. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/es.json
  25. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
  26. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/fr.json
  27. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/he.json
  28. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/it.json
  29. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/nb.json
  30. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/nl.json
  31. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
  32. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
  33. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/ru.json
  34. 51 1
      MediaBrowser.Server.Implementations/Localization/Server/server.json
  35. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/sv.json
  36. 0 0
      MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
  37. 2 0
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

+ 4 - 7
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -919,7 +919,7 @@ namespace MediaBrowser.Api.Playback
             var commandLineLogMessage = process.StartInfo.FileName + " " + process.StartInfo.Arguments;
             Logger.Info(commandLineLogMessage);
 
-            var logFilePath = Path.Combine(ServerConfigurationManager.ApplicationPaths.LogDirectoryPath, "ffmpeg-" + Guid.NewGuid() + ".txt");
+            var logFilePath = Path.Combine(ServerConfigurationManager.ApplicationPaths.LogDirectoryPath, "transcode-" + Guid.NewGuid() + ".txt");
             Directory.CreateDirectory(Path.GetDirectoryName(logFilePath));
 
             // FFMpeg writes debug/error info to stderr. This is useful when debugging so let's put it in the log directory.
@@ -1485,17 +1485,14 @@ namespace MediaBrowser.Api.Playback
 
             ApplyDeviceProfileSettings(state);
 
-            if (videoRequest != null && state.VideoStream != null)
+            if (videoRequest != null)
             {
-                if (CanStreamCopyVideo(videoRequest, state.VideoStream, state.VideoType))
+                if (state.VideoStream != null && CanStreamCopyVideo(videoRequest, state.VideoStream, state.VideoType))
                 {
                     videoRequest.VideoCodec = "copy";
                 }
-            }
 
-            if (state.AudioStream != null)
-            {
-                //if (CanStreamCopyAudio(request, state.AudioStream))
+                //if (state.AudioStream != null && CanStreamCopyAudio(request, state.AudioStream))
                 //{
                 //    request.AudioCodec = "copy";
                 //}

+ 1 - 1
MediaBrowser.Common.Implementations/Logging/NlogManager.cs

@@ -184,7 +184,7 @@ namespace MediaBrowser.Common.Implementations.Logging
         /// <param name="level">The level.</param>
         public void ReloadLogger(LogSeverity level)
         {
-            LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".log");
+            LogFilePath = Path.Combine(LogDirectory, LogFilePrefix + "-" + decimal.Round(DateTime.Now.Ticks / 10000000) + ".txt");
 
             Directory.CreateDirectory(Path.GetDirectoryName(LogFilePath));
 

+ 11 - 2
MediaBrowser.Dlna/PlayTo/DidlBuilder.cs

@@ -105,7 +105,12 @@ namespace MediaBrowser.Dlna.PlayTo
                 return string.Empty;
             }
 
-            return string.Format(DIDL_VIDEO_RES, videostream.BitRate.HasValue ? videostream.BitRate.Value / 10 : 0, GetDurationString(dto), videostream.Width ?? 0, videostream.Height ?? 0, streamUrl);
+            return string.Format(DIDL_VIDEO_RES, 
+                videostream.BitRate.HasValue ? videostream.BitRate.Value / 10 : 0, 
+                GetDurationString(dto), 
+                videostream.Width ?? 0, 
+                videostream.Height ?? 0, 
+                streamUrl);
         }
 
         private static string GetAudioDIDL(BaseItem dto, string streamUrl, IEnumerable<MediaStream> streams)
@@ -118,7 +123,11 @@ namespace MediaBrowser.Dlna.PlayTo
                 return string.Empty;
             }
 
-            return string.Format(DIDL_AUDIO_RES, audiostream.BitRate.HasValue ? audiostream.BitRate.Value / 10 : 16000, GetDurationString(dto), audiostream.SampleRate ?? 0, streamUrl);
+            return string.Format(DIDL_AUDIO_RES, 
+                audiostream.BitRate.HasValue ? audiostream.BitRate.Value / 10 : 16000, 
+                GetDurationString(dto), 
+                audiostream.SampleRate ?? 0, 
+                streamUrl);
         }
 
         private static string GetImageUrl(BaseItem dto, string serverAddress)

+ 1 - 1
MediaBrowser.Dlna/Profiles/WindowsMediaCenterProfile.cs

@@ -97,7 +97,7 @@ namespace MediaBrowser.Dlna.Profiles
                     {
                         new ProfileCondition
                         {
-                            Condition = ProfileConditionType.LessThanEqual,
+                            Condition = ProfileConditionType.Equals,
                             Property = ProfileConditionValue.Has64BitOffsets,
                             Value = "false",
                             IsRequired = false

+ 1 - 1
MediaBrowser.Dlna/Profiles/Xbox360Profile.cs

@@ -126,7 +126,7 @@ namespace MediaBrowser.Dlna.Profiles
                     {
                         new ProfileCondition
                         {
-                            Condition = ProfileConditionType.LessThanEqual,
+                            Condition = ProfileConditionType.Equals,
                             Property = ProfileConditionValue.Has64BitOffsets,
                             Value = "false",
                             IsRequired = false

+ 206 - 4
MediaBrowser.Dlna/Profiles/XboxOneProfile.cs

@@ -9,6 +9,7 @@ namespace MediaBrowser.Dlna.Profiles
         public XboxOneProfile()
         {
             Name = "Xbox One";
+            XDlnaDoc = "DMS-1.50";
 
             Identification = new DeviceIdentification
             {
@@ -28,8 +29,9 @@ namespace MediaBrowser.Dlna.Profiles
                 {
                     Container = "ts",
                     VideoCodec = "h264",
-                    AudioCodec = "aac",
-                    Type = DlnaProfileType.Video
+                    AudioCodec = "ac3",
+                    Type = DlnaProfileType.Video,
+                    EstimateContentLength = true
                 }
             };
 
@@ -37,17 +39,217 @@ namespace MediaBrowser.Dlna.Profiles
             {
                 new DirectPlayProfile
                 {
-                    Container = "mp3,wma",
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "mpeg4",
+                    AudioCodec = "ac3,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "h264",
+                    AudioCodec = "aac",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp4,mov,mkv",
+                    VideoCodec = "h264,mpeg4",
+                    AudioCodec = "aac,ac3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    VideoCodec = "wmv2,wmv3,vc1",
+                    AudioCodec = "wmav2,wmapro",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
                     Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
                 }
             };
 
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Video,
+                    Container = "mp4,mov",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.Equals,
+                            Property = ProfileConditionValue.Has64BitOffsets,
+                            Value = "false",
+                            IsRequired = false
+                        }
+                    }
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.Video,
+                    Codec = "mpeg4",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "5120000",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.Video,
+                    Codec = "h264",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.Video,
+                    Codec = "wmv2,wmv3,vc1",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "15360000",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudio,
+                    Codec = "ac3,wmav2,wmapro",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "6",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudio,
+                    Codec = "aac",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "2",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.Equals,
+                            Property = ProfileConditionValue.AudioProfile,
+                            Value = "lc",
+                            IsRequired = false
+                        }
+                    }
+                }
+            };
+            
             ResponseProfiles = new[]
             {
                 new ResponseProfile
                 {
                     Container = "avi",
-                    MimeType = "video/x-msvideo",
+                    MimeType = "video/avi",
                     Type = DlnaProfileType.Video
                 }
             };

+ 1 - 1
MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml

@@ -40,7 +40,7 @@
   <ContainerProfiles>
     <ContainerProfile type="Video" container="mp4,mov">
       <Conditions>
-        <ProfileCondition condition="LessThanEqual" property="Has64BitOffsets" value="false" isRequired="false" />
+        <ProfileCondition condition="Equals" property="Has64BitOffsets" value="false" isRequired="false" />
       </Conditions>
     </ContainerProfile>
     <ContainerProfile type="Photo">

+ 53 - 5
MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml

@@ -16,21 +16,69 @@
   <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
   <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
   <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
+  <XDlnaDoc>DMS-1.50</XDlnaDoc>
   <ProtocolInfo>DLNA</ProtocolInfo>
   <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <DirectPlayProfiles>
-    <DirectPlayProfile container="mp3,wma" type="Audio" />
+    <DirectPlayProfile container="ts" audioCodec="ac3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mp4,mov,mkv" audioCodec="aac,ac3" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="wmv2,wmv3,vc1" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
   </DirectPlayProfiles>
   <TranscodingProfiles>
     <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
-    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" />
   </TranscodingProfiles>
-  <ContainerProfiles />
-  <CodecProfiles />
+  <ContainerProfiles>
+    <ContainerProfile type="Video" container="mp4,mov">
+      <Conditions>
+        <ProfileCondition condition="Equals" property="Has64BitOffsets" value="false" isRequired="false" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="Video" codec="mpeg4">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="5120000" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="Video" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="Video" codec="wmv2,wmv3,vc1">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="15360000" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudio" codec="ac3,wmav2,wmapro">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudio" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="false" />
+        <ProfileCondition condition="Equals" property="AudioProfile" value="lc" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
   <ResponseProfiles>
-    <ResponseProfile container="avi" type="Video" mimeType="video/x-msvideo">
+    <ResponseProfile container="avi" type="Video" mimeType="video/avi">
       <Conditions />
     </ResponseProfile>
   </ResponseProfiles>

+ 0 - 1
MediaBrowser.Model/Configuration/UserConfiguration.cs

@@ -66,7 +66,6 @@ namespace MediaBrowser.Model.Configuration
             IsAdministrator = true;
 
             EnableRemoteControlOfOtherUsers = true;
-            EnableContentDeletion = true;
             EnableLiveTvManagement = true;
             EnableMediaPlayback = true;
             EnableLiveTvAccess = true;

+ 17 - 1
MediaBrowser.Providers/TV/MissingEpisodeProvider.cs

@@ -91,6 +91,8 @@ namespace MediaBrowser.Providers.TV
                 .Where(i => i.Item1 != -1 && i.Item2 != -1)
                 .ToList();
 
+            var hasBadData = HasInvalidContent(group);
+
             var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(group, episodeLookup, cancellationToken)
                 .ConfigureAwait(false);
 
@@ -105,7 +107,7 @@ namespace MediaBrowser.Providers.TV
                 hasNewSeasons = await AddDummySeasonFolders(series, cancellationToken).ConfigureAwait(false);
             }
 
-            if (_config.Configuration.EnableInternetProviders)
+            if (!hasBadData && _config.Configuration.EnableInternetProviders)
             {
                 var seriesConfig = _config.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, typeof(Series).Name, StringComparison.OrdinalIgnoreCase));
 
@@ -130,6 +132,20 @@ namespace MediaBrowser.Providers.TV
             }
         }
 
+        /// <summary>
+        /// Returns true if a series has any seasons or episodes without season or episode numbers
+        /// If this data is missing no virtual items will be added in order to prevent possible duplicates
+        /// </summary>
+        /// <param name="group"></param>
+        /// <returns></returns>
+        private bool HasInvalidContent(IEnumerable<Series> group)
+        {
+            var allItems = group.ToList().SelectMany(i => i.RecursiveChildren).ToList();
+
+            return allItems.OfType<Season>().Any(i => !i.IndexNumber.HasValue) ||
+                   allItems.OfType<Episode>().Any(i => !i.IndexNumber.HasValue || !i.ParentIndexNumber.HasValue);
+        }
+
         /// <summary>
         /// For series with episodes directly under the series folder, this adds dummy seasons to enable regular browsing and metadata
         /// </summary>

+ 6 - 7
MediaBrowser.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Logging;
@@ -16,15 +17,17 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         private readonly ILogger _logger;
         private readonly ITaskManager _iTaskManager;
         private readonly ISessionManager _sessionManager;
+        private readonly IServerConfigurationManager _config;
 
         private Timer _timer;
 
-        public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager)
+        public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager, IServerConfigurationManager config)
         {
             _appHost = appHost;
             _logger = logger;
             _iTaskManager = iTaskManager;
             _sessionManager = sessionManager;
+            _config = config;
         }
 
         public void Run()
@@ -47,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
 
         private void TimerCallback(object state)
         {
-            if (IsIdle())
+            if (_config.Configuration.EnableAutomaticRestart && IsIdle())
             {
                 DisposeTimer();
 
@@ -70,12 +73,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
             }
 
             var now = DateTime.UtcNow;
-            if (_sessionManager.Sessions.Any(i => !string.IsNullOrEmpty(i.NowViewingItemName) || (now - i.LastActivityDate).TotalMinutes < 30))
-            {
-                return false;
-            }
 
-            return true;
+            return !_sessionManager.Sessions.Any(i => !string.IsNullOrEmpty(i.NowViewingItemName) || (now - i.LastActivityDate).TotalMinutes < 30);
         }
 
         public void Dispose()

+ 1 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/cs.json

@@ -0,0 +1 @@
+{"SettingsSaved":"Nastaven\u00ed ulo\u017eeno.","AddUser":"P\u0159idat u\u017eivatele","Users":"U\u017eivatel\u00e9","Delete":"Odstranit","Administrator":"Administr\u00e1tor","Password":"Heslo","DeleteImage":"Odstranit obr\u00e1zek","DeleteImageConfirmation":"Jste si jisti, \u017ee chcete odstranit tento obr\u00e1zek?","FileReadCancelled":"\u010cten\u00ed souboru bylo zru\u0161eno.","FileNotFound":"Soubor nebyl nalezen.","FileReadError":"Nastala chyba p\u0159i na\u010d\u00edt\u00e1n\u00ed souboru.","DeleteUser":"Odstranit u\u017eivatele","DeleteUserConfirmation":"Jste si jisti, \u017ee chcete odstranit {0}?","PasswordResetHeader":"Obnovit heslo","PasswordResetComplete":"Heslo bylo obnoveno.","PasswordResetConfirmation":"Jste si jisti, \u017ee chcete obnovit heslo?","PasswordSaved":"Heslo ulo\u017eeno.","PasswordMatchError":"Heslo a potvrzen\u00ed hesla mus\u00ed souhlasit.","OptionOff":"Vypnout","OptionOn":"Zapnout","OptionRelease":"Ofici\u00e1ln\u00ed vyd\u00e1n\u00ed","OptionBeta":"Betaverze","OptionDev":"Dev (Nestabiln\u00ed\/V\u00fdvoj\u00e1\u0159sk\u00e1)","UninstallPluginHeader":"Odinstalovat plugin","UninstallPluginConfirmation":"Jste si jisti, \u017ee chcete odinstalovat {0}?","NoPluginConfigurationMessage":"Tento plugin nem\u00e1 nastaven\u00ed.","NoPluginsInstalledMessage":"Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd plugin.","BrowsePluginCatalogMessage":"Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 pluginy."}

文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/JavaScript/el.json


+ 1 - 1
MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json

@@ -1 +1 @@
-{"SettingsSaved":"Param\u00e8tres sauvegard\u00e9s.","AddUser":"Ajouter utilisateur","Users":"Utilisateurs","Delete":"Supprimer","Administrator":"Administrateur","Password":"Mot de passe","DeleteImage":"Supprimer Image","DeleteImageConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer l'image?","FileReadCancelled":"La lecture du fichier a \u00e9t\u00e9 annul\u00e9e.","FileNotFound":"Fichier non trouv\u00e9","FileReadError":"Un erreur est survenue pendant la lecture du fichier.","DeleteUser":"Supprimer utilisateur","DeleteUserConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer {0}?","PasswordResetHeader":"R\u00e9initialisation du mot de passe","PasswordResetComplete":"Le mot de passe a \u00e9t\u00e9 r\u00e9initialis\u00e9.","PasswordResetConfirmation":"\u00cates-vous s\u00fbr de vouloir r\u00e9initialiser le mot de passe?","PasswordSaved":"Mot de passe sauvegard\u00e9.","PasswordMatchError":"Le mot de passe et sa confirmation doivent correspondre.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Version officielle","OptionBeta":"Beta","OptionDev":"Dev (Instable)","UninstallPluginHeader":"D\u00e9sinstaller Plug-in","UninstallPluginConfirmation":"\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?","NoPluginConfigurationMessage":"Ce module d'extension n'a rien \u00e0 configurer.","NoPluginsInstalledMessage":"Vous n'avez aucun module d'extension install\u00e9.","BrowsePluginCatalogMessage":"Explorer notre catalogue de Plug-ins disponibles."}
+{"SettingsSaved":"Param\u00e8tres sauvegard\u00e9s.","AddUser":"Ajouter utilisateur","Users":"Utilisateurs","Delete":"Supprimer","Administrator":"Administrateur","Password":"Mot de passe","DeleteImage":"Supprimer Image","DeleteImageConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer l'image?","FileReadCancelled":"La lecture du fichier a \u00e9t\u00e9 annul\u00e9e.","FileNotFound":"Fichier non trouv\u00e9","FileReadError":"Un erreur est survenue pendant la lecture du fichier.","DeleteUser":"Supprimer utilisateur","DeleteUserConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer {0}?","PasswordResetHeader":"R\u00e9initialisation du mot de passe","PasswordResetComplete":"Le mot de passe a \u00e9t\u00e9 r\u00e9initialis\u00e9.","PasswordResetConfirmation":"\u00cates-vous s\u00fbr de vouloir r\u00e9initialiser le mot de passe?","PasswordSaved":"Mot de passe sauvegard\u00e9.","PasswordMatchError":"Le mot de passe et sa confirmation doivent correspondre.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Version officielle","OptionBeta":"Beta","OptionDev":"Dev (Instable)","UninstallPluginHeader":"D\u00e9sinstaller Plug-in","UninstallPluginConfirmation":"\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?","NoPluginConfigurationMessage":"Ce module d'extension n'a rien \u00e0 configurer.","NoPluginsInstalledMessage":"Vous n'avez aucun Plugin install\u00e9.","BrowsePluginCatalogMessage":"Explorer notre catalogue de Plugins disponibles."}

+ 1 - 1
MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json

@@ -1 +1 @@
-{"SettingsSaved":"Instellingen opgeslagen.","AddUser":"Gebruiker toevoegen","Users":"Gebruikers","Delete":"Verwijderen","Administrator":"Beheerder","Password":"Wachtwoord","DeleteImage":"Verwijder afbeelding","DeleteImageConfirmation":"Weet je zeker dat je deze afbeelding wilt verwijderen?","FileReadCancelled":"Bestand lezen is geannuleerd.","FileNotFound":"Bestand niet gevonden.","FileReadError":"Er is een fout opgetreden bij het lezen van het bestand.","DeleteUser":"Verwijder gebruiker","DeleteUserConfirmation":"Weet je zeker dat je {0} wilt verwijderen?","PasswordResetHeader":"Wachtwoord opnieuw instellen","PasswordResetComplete":"Het wachtwoord is opnieuw ingesteld.","PasswordResetConfirmation":"Weet je zeker dat je het wachtwoord opnieuw in wilt stellen?","PasswordSaved":"Wachtwoord opgeslagen.","PasswordMatchError":"Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.","OptionOff":"Uit","OptionOn":"Aan","OptionRelease":"Offici\u00eble Release","OptionBeta":"Beta","OptionDev":"Dev (Onstabiel)","UninstallPluginHeader":"Plug-in de\u00efnstalleren","UninstallPluginConfirmation":"Weet u zeker dat u {0} wilt de\u00efnstalleren?","NoPluginConfigurationMessage":"Deze plug-in heeft niets in te stellen","NoPluginsInstalledMessage":"U heeft geen plug-ins ge\u00efnstalleerd","BrowsePluginCatalogMessage":"Bekijk de Plug-in catalogus voor beschikbare plug-ins."}
+{"SettingsSaved":"Instellingen opgeslagen.","AddUser":"Gebruiker toevoegen","Users":"Gebruikers","Delete":"Verwijderen","Administrator":"Beheerder","Password":"Wachtwoord","DeleteImage":"Verwijder afbeelding","DeleteImageConfirmation":"Weet je zeker dat je deze afbeelding wilt verwijderen?","FileReadCancelled":"Bestand lezen is geannuleerd.","FileNotFound":"Bestand niet gevonden.","FileReadError":"Er is een fout opgetreden bij het lezen van het bestand.","DeleteUser":"Verwijder gebruiker","DeleteUserConfirmation":"Weet je zeker dat je {0} wilt verwijderen?","PasswordResetHeader":"Wachtwoord opnieuw instellen","PasswordResetComplete":"Het wachtwoord is opnieuw ingesteld.","PasswordResetConfirmation":"Weet je zeker dat je het wachtwoord opnieuw in wilt stellen?","PasswordSaved":"Wachtwoord opgeslagen.","PasswordMatchError":"Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.","OptionOff":"Uit","OptionOn":"Aan","OptionRelease":"Offici\u00eble Release","OptionBeta":"Beta","OptionDev":"Dev (Instabiel)","UninstallPluginHeader":"Plug-in de\u00efnstalleren","UninstallPluginConfirmation":"Weet u zeker dat u {0} wilt de\u00efnstalleren?","NoPluginConfigurationMessage":"Deze plug-in heeft niets in te stellen","NoPluginsInstalledMessage":"U heeft geen plug-ins ge\u00efnstalleerd","BrowsePluginCatalogMessage":"Bekijk de Plug-in catalogus voor beschikbare plug-ins."}

+ 1 - 1
MediaBrowser.Server.Implementations/Localization/JavaScript/pt_PT.json

@@ -1 +1 @@
-{"SettingsSaved":"Configura\u00e7\u00f5es guardadas.","AddUser":"Adicionar Utilizador","Users":"Utilizadores","Delete":"Apagar","Administrator":"Administrador","Password":"Senha","DeleteImage":"Apagar Imagem","DeleteImageConfirmation":"Tem a certeza que deseja apagar a imagem?","FileReadCancelled":"A leitura do ficheiro foi cancelada.","FileNotFound":"Ficheiro n\u00e3o encontrado.","FileReadError":"Ocorreu um erro ao ler o ficheiro.","DeleteUser":"Apagar Utilizador","DeleteUserConfirmation":"Tem a certeza que deseja apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Tem a certeza que deseja redefinir a senha?","PasswordSaved":"Senha guardada.","PasswordMatchError":"A senha e a confirma\u00e7\u00e3o da senha devem coincidir.","OptionOff":"Desligado","OptionOn":"Ligado","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desinstalar extens\u00e3o","UninstallPluginConfirmation":"Tem a certeza que deseja desinstalar {0}?","NoPluginConfigurationMessage":"Esta extens\u00e3o n\u00e3o \u00e9 configur\u00e1vel.","NoPluginsInstalledMessage":"N\u00e3o tem extens\u00f5es instaladas.","BrowsePluginCatalogMessage":"Navegue o nosso cat\u00e1logo de extens\u00f5es, para ver as extens\u00f5es dispon\u00edveis."}
+{"SettingsSaved":"Configura\u00e7\u00f5es guardadas.","AddUser":"Adicionar Utilizador","Users":"Utilizadores","Delete":"Apagar","Administrator":"Administrador","Password":"Senha","DeleteImage":"Apagar Imagem","DeleteImageConfirmation":"Tem a certeza que deseja apagar a imagem?","FileReadCancelled":"A leitura do ficheiro foi cancelada.","FileNotFound":"Ficheiro n\u00e3o encontrado.","FileReadError":"Ocorreu um erro ao ler o ficheiro.","DeleteUser":"Apagar Utilizador","DeleteUserConfirmation":"Tem a certeza que deseja apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Tem a certeza que deseja redefinir a senha?","PasswordSaved":"Senha guardada.","PasswordMatchError":"A senha e a confirma\u00e7\u00e3o da senha devem coincidir.","OptionOff":"Desligar","OptionOn":"Ligar","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desinstalar extens\u00e3o","UninstallPluginConfirmation":"Tem a certeza que deseja desinstalar {0}?","NoPluginConfigurationMessage":"Esta extens\u00e3o n\u00e3o \u00e9 configur\u00e1vel.","NoPluginsInstalledMessage":"N\u00e3o tem extens\u00f5es instaladas.","BrowsePluginCatalogMessage":"Navegue o nosso cat\u00e1logo de extens\u00f5es, para ver as extens\u00f5es dispon\u00edveis."}

+ 2 - 0
MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs

@@ -336,7 +336,9 @@ namespace MediaBrowser.Server.Implementations.Localization
                 new LocalizatonOption{ Name="Arabic", Value="ar"},
                 new LocalizatonOption{ Name="English (United Kingdom)", Value="en-GB"},
                 new LocalizatonOption{ Name="English (United States)", Value="en-us"},
+                new LocalizatonOption{ Name="Catalan", Value="ca"},
                 new LocalizatonOption{ Name="Chinese Traditional", Value="zh-TW"},
+                new LocalizatonOption{ Name="Czech", Value="cs"},
                 new LocalizatonOption{ Name="Dutch", Value="nl"},
                 new LocalizatonOption{ Name="French", Value="fr"},
                 new LocalizatonOption{ Name="German", Value="de"},

文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/ar.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/cs.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/de.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/el.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/en_GB.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/en_US.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/es.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/es_MX.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/fr.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/he.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/it.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/nb.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/nl.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/ru.json


+ 51 - 1
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -35,6 +35,7 @@
 	"LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.",
 	"ButtonOk": "Ok",
 	"ButtonCancel": "Cancel",
+	"ButtonNew": "New",
 	"HeaderSetupLibrary": "Setup your media library",
 	"ButtonAddMediaFolder": "Add media folder",
 	"LabelFolderType": "Folder type:",
@@ -52,6 +53,9 @@
 	"TabLibraryAccess": "Library Access",
 	"TabImage": "Image",
 	"TabProfile": "Profile",
+	"TabMetadata": "Metadata",
+	"TabImages": "Images",
+	"TabCollectionTitles": "Titles",
 	"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
 	"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
 	"HeaderVideoPlaybackSettings": "Video Playback Settings",
@@ -215,6 +219,7 @@
 	"OptionIsSD": "SD",
 	"OptionMetascore": "Metascore",
 	"ButtonSelect": "Select",
+	"ButtonSearch": "Search",
 	"ButtonGroupVersions": "Group Versions",
 	"PismoMessage": "Utilizing Pismo File Mount through a donated license.",
 	"PleaseSupportOtherProduces": "Please support other free products we utilize:",
@@ -301,6 +306,7 @@
 	"ButtonEdit": "Edit",
 	"ButtonRecord": "Record",
 	"ButtonDelete": "Delete",
+	"ButtonRemove": "Remove",
 	"OptionRecordSeries": "Record Series",
 	"HeaderDetails": "Details",
 	"ButtonCancelRecording": "Cancel Recording",
@@ -400,5 +406,49 @@
 	"OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.",
 	"OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging",
 	"OptionUpscaling": "Allow clients to request upscaled video",
-	"OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage."
+	"OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.",
+	"EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.",
+	"HeaderAddTitles": "Add Titles",
+	"LabelEnableDlnaPlayTo": "Enable DLNA Play To",
+	"LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.",
+	"LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
+	"LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.",
+	"LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
+	"LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds of the interval between SSDP searches performed by Media Browser.",
+	"HeaderCustomDlnaProfiles": "Custom Profiles",
+	"HeaderSystemDlnaProfiles": "System Profiles",
+	"CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.",
+	"SystemDlnaProfilesHelp": "System profiles are read-only. To override a system profile, create a custom profile targeting the same device.",
+	"TitleDashboard": "Dashboard",
+	"TabHome": "Home",
+	"TabInfo": "Info",
+	"HeaderLinks": "Links",
+	"HeaderSystemPaths": "System Paths",
+	"LinkCommunity": "Community",
+	"LinkGithub": "Github",
+	"LinkApiDocumentation": "Api Documentation",
+	"LabelFriendlyServerName": "Friendly server name:",
+	"LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.",
+	"LabelPreferredDisplayLanguage": "Preferred display language",
+	"LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
+	"LabelReadHowYouCanContribute": "Read about how you can contribute.",
+	"HeaderNewCollection": "New Collection",
+	"NewCollectionNameExample": "Example: Star Wars Collection",
+	"OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
+	"ButtonCreate": "Create",
+	"LabelHttpServerPortNumber": "Http server port number:",
+	"LabelWebSocketPortNumber": "Web socket port number:",
+	"LabelEnableAutomaticPortMapping": "Enable automatic port mapping",
+	"LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.",
+	"LabelExternalDDNS": "External DDNS:",
+	"LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.",
+	"TabResume": "Resume",
+	"TabWeather": "Weather",
+	"TitleAppSettings": "App Settings",
+	"LabelMinResumePercentage": "Min resume percentage:",
+	"LabelMaxResumePercentage": "Max resume percentage:",
+	"LabelMinResumeDuration": "Min resume duration (seconds):",
+	"LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time",
+	"LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time",
+	"LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable"
 }

文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/sv.json


文件差異過大導致無法顯示
+ 0 - 0
MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json


+ 2 - 0
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -317,6 +317,8 @@
     <EmbeddedResource Include="Localization\Server\en_GB.json" />
     <EmbeddedResource Include="Localization\JavaScript\sv.json" />
     <EmbeddedResource Include="Localization\Server\sv.json" />
+    <EmbeddedResource Include="Localization\JavaScript\cs.json" />
+    <EmbeddedResource Include="Localization\Server\cs.json" />
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>

部分文件因文件數量過多而無法顯示