浏览代码

Merge branch 'master' into fix-memoryleak

Patrick Barron 5 年之前
父节点
当前提交
18c03fa9c8

+ 8 - 5
.ci/azure-pipelines-package.yml

@@ -35,7 +35,6 @@ jobs:
   steps:
   steps:
   - script: 'docker build -f deployment/Dockerfile.$(BuildConfiguration) -t jellyfin-server-$(BuildConfiguration) deployment'
   - script: 'docker build -f deployment/Dockerfile.$(BuildConfiguration) -t jellyfin-server-$(BuildConfiguration) deployment'
     displayName: 'Build Dockerfile'
     displayName: 'Build Dockerfile'
-    condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master'))
 
 
   - script: 'docker image ls -a && docker run -v $(pwd)/deployment/dist:/dist -v $(pwd):/jellyfin -e IS_UNSTABLE="yes" -e BUILD_ID=$(Build.BuildNumber) jellyfin-server-$(BuildConfiguration)'
   - script: 'docker image ls -a && docker run -v $(pwd)/deployment/dist:/dist -v $(pwd):/jellyfin -e IS_UNSTABLE="yes" -e BUILD_ID=$(Build.BuildNumber) jellyfin-server-$(BuildConfiguration)'
     displayName: 'Run Dockerfile (unstable)'
     displayName: 'Run Dockerfile (unstable)'
@@ -47,14 +46,12 @@ jobs:
 
 
   - task: PublishPipelineArtifact@1
   - task: PublishPipelineArtifact@1
     displayName: 'Publish Release'
     displayName: 'Publish Release'
-    condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master'))
     inputs:
     inputs:
       targetPath: '$(Build.SourcesDirectory)/deployment/dist'
       targetPath: '$(Build.SourcesDirectory)/deployment/dist'
       artifactName: 'jellyfin-server-$(BuildConfiguration)'
       artifactName: 'jellyfin-server-$(BuildConfiguration)'
 
 
   - task: CopyFilesOverSSH@0
   - task: CopyFilesOverSSH@0
     displayName: 'Upload artifacts to repository server'
     displayName: 'Upload artifacts to repository server'
-    condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master'))
     inputs:
     inputs:
       sshEndpoint: repository
       sshEndpoint: repository
       sourceFolder: '$(Build.SourcesDirectory)/deployment/dist'
       sourceFolder: '$(Build.SourcesDirectory)/deployment/dist'
@@ -120,7 +117,10 @@ jobs:
     inputs:
     inputs:
       sshEndpoint: repository
       sshEndpoint: repository
       runOptions: 'inline'
       runOptions: 'inline'
-      inline: 'sudo /srv/repository/collect-server.azure.sh /srv/repository/incoming/azure $(Build.BuildNumber) unstable'
+      inline: |
+        sudo /srv/repository/collect-server.azure.sh /srv/repository/incoming/azure $(Build.BuildNumber) unstable
+        rm $0
+        exit
 
 
   - task: SSH@0
   - task: SSH@0
     displayName: 'Update Stable Repository'
     displayName: 'Update Stable Repository'
@@ -128,4 +128,7 @@ jobs:
     inputs:
     inputs:
       sshEndpoint: repository
       sshEndpoint: repository
       runOptions: 'inline'
       runOptions: 'inline'
-      inline: 'sudo /srv/repository/collect-server.azure.sh /srv/repository/incoming/azure $(Build.BuildNumber)'
+      inline: |
+        sudo /srv/repository/collect-server.azure.sh /srv/repository/incoming/azure $(Build.BuildNumber)
+        rm $0
+        exit

+ 4 - 0
.ci/azure-pipelines.yml

@@ -15,11 +15,13 @@ trigger:
   batch: true
   batch: true
 
 
 jobs:
 jobs:
+- ${{ if not(or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master'))) }}:
   - template: azure-pipelines-main.yml
   - template: azure-pipelines-main.yml
     parameters:
     parameters:
       LinuxImage: 'ubuntu-latest'
       LinuxImage: 'ubuntu-latest'
       RestoreBuildProjects: $(RestoreBuildProjects)
       RestoreBuildProjects: $(RestoreBuildProjects)
 
 
+- ${{ if not(or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master'))) }}:
   - template: azure-pipelines-test.yml
   - template: azure-pipelines-test.yml
     parameters:
     parameters:
       ImageNames:
       ImageNames:
@@ -27,6 +29,7 @@ jobs:
         Windows: 'windows-latest'
         Windows: 'windows-latest'
         macOS: 'macos-latest'
         macOS: 'macos-latest'
 
 
+- ${{ if not(or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master'))) }}:
   - template: azure-pipelines-abi.yml
   - template: azure-pipelines-abi.yml
     parameters:
     parameters:
       Packages:
       Packages:
@@ -44,4 +47,5 @@ jobs:
           AssemblyFileName: MediaBrowser.Common.dll
           AssemblyFileName: MediaBrowser.Common.dll
       LinuxImage: 'ubuntu-latest'
       LinuxImage: 'ubuntu-latest'
 
 
+- ${{ if or(startsWith(variables['Build.SourceBranch'], 'refs/tags'), startsWith(variables['Build.SourceBranch'], 'refs/heads/master')) }}:
   - template: azure-pipelines-package.yml
   - template: azure-pipelines-package.yml

+ 3 - 1
Emby.Server.Implementations/Localization/Core/mr.json

@@ -57,5 +57,7 @@
     "HeaderCameraUploads": "कॅमेरा अपलोड",
     "HeaderCameraUploads": "कॅमेरा अपलोड",
     "CameraImageUploadedFrom": "एक नवीन कॅमेरा चित्र {0} येथून अपलोड केले आहे",
     "CameraImageUploadedFrom": "एक नवीन कॅमेरा चित्र {0} येथून अपलोड केले आहे",
     "Application": "अ‍ॅप्लिकेशन",
     "Application": "अ‍ॅप्लिकेशन",
-    "AppDeviceValues": "अ‍ॅप: {0}, यंत्र: {1}"
+    "AppDeviceValues": "अ‍ॅप: {0}, यंत्र: {1}",
+    "Collections": "संग्रह",
+    "ChapterNameValue": "धडा {0}"
 }
 }

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

@@ -104,5 +104,14 @@
     "TaskRefreshChapterImagesDescription": "Cria miniaturas para vídeos que têm capítulos.",
     "TaskRefreshChapterImagesDescription": "Cria miniaturas para vídeos que têm capítulos.",
     "TaskCleanCacheDescription": "Apaga ficheiros em cache que já não são usados pelo sistema.",
     "TaskCleanCacheDescription": "Apaga ficheiros em cache que já não são usados pelo sistema.",
     "TasksChannelsCategory": "Canais de Internet",
     "TasksChannelsCategory": "Canais de Internet",
-    "TaskRefreshChapterImages": "Extrair Imagens do Capítulo"
+    "TaskRefreshChapterImages": "Extrair Imagens do Capítulo",
+    "TaskDownloadMissingSubtitlesDescription": "Pesquisa na Internet as legendas em falta com base na configuração de metadados.",
+    "TaskDownloadMissingSubtitles": "Download das legendas em falta",
+    "TaskRefreshChannelsDescription": "Atualiza as informações do canal da Internet.",
+    "TaskCleanTranscodeDescription": "Apagar os ficheiros com mais de um dia, de Transcode.",
+    "TaskCleanTranscode": "Limpar o diretório de Transcode",
+    "TaskUpdatePluginsDescription": "Download e instala as atualizações para plug-ins configurados para atualização automática.",
+    "TaskRefreshPeopleDescription": "Atualiza os metadados para atores e diretores na tua biblioteca de media.",
+    "TaskRefreshPeople": "Atualizar pessoas",
+    "TaskRefreshLibraryDescription": "Pesquisa a tua biblioteca de media por novos ficheiros e atualiza os metadados."
 }
 }

+ 1 - 1
Jellyfin.Server.Implementations/Users/UserManager.cs

@@ -133,7 +133,7 @@ namespace Jellyfin.Server.Implementations.Users
                 .Include(user => user.Preferences)
                 .Include(user => user.Preferences)
                 .Include(user => user.AccessSchedules)
                 .Include(user => user.AccessSchedules)
                 .Include(user => user.ProfileImage)
                 .Include(user => user.ProfileImage)
-                .ToList()
+                .AsEnumerable()
                 .FirstOrDefault(u => string.Equals(u.Username, name, StringComparison.OrdinalIgnoreCase));
                 .FirstOrDefault(u => string.Equals(u.Username, name, StringComparison.OrdinalIgnoreCase));
         }
         }
 
 

+ 27 - 27
MediaBrowser.Api/SyncPlay/SyncPlayService.cs

@@ -11,15 +11,15 @@ using Microsoft.Extensions.Logging;
 
 
 namespace MediaBrowser.Api.SyncPlay
 namespace MediaBrowser.Api.SyncPlay
 {
 {
-    [Route("/SyncPlay/NewGroup", "POST", Summary = "Create a new SyncPlay group")]
+    [Route("/SyncPlay/New", "POST", Summary = "Create a new SyncPlay group")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayNewGroup : IReturnVoid
+    public class SyncPlayNew : IReturnVoid
     {
     {
     }
     }
 
 
-    [Route("/SyncPlay/JoinGroup", "POST", Summary = "Join an existing SyncPlay group")]
+    [Route("/SyncPlay/Join", "POST", Summary = "Join an existing SyncPlay group")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayJoinGroup : IReturnVoid
+    public class SyncPlayJoin : IReturnVoid
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the Group id.
         /// Gets or sets the Group id.
@@ -36,15 +36,15 @@ namespace MediaBrowser.Api.SyncPlay
         public string PlayingItemId { get; set; }
         public string PlayingItemId { get; set; }
     }
     }
 
 
-    [Route("/SyncPlay/LeaveGroup", "POST", Summary = "Leave joined SyncPlay group")]
+    [Route("/SyncPlay/Leave", "POST", Summary = "Leave joined SyncPlay group")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayLeaveGroup : IReturnVoid
+    public class SyncPlayLeave : IReturnVoid
     {
     {
     }
     }
 
 
-    [Route("/SyncPlay/ListGroups", "GET", Summary = "List SyncPlay groups")]
+    [Route("/SyncPlay/List", "GET", Summary = "List SyncPlay groups")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayListGroups : IReturnVoid
+    public class SyncPlayList : IReturnVoid
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the filter item id.
         /// Gets or sets the filter item id.
@@ -54,29 +54,29 @@ namespace MediaBrowser.Api.SyncPlay
         public string FilterItemId { get; set; }
         public string FilterItemId { get; set; }
     }
     }
 
 
-    [Route("/SyncPlay/PlayRequest", "POST", Summary = "Request play in SyncPlay group")]
+    [Route("/SyncPlay/Play", "POST", Summary = "Request play in SyncPlay group")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayPlayRequest : IReturnVoid
+    public class SyncPlayPlay : IReturnVoid
     {
     {
     }
     }
 
 
-    [Route("/SyncPlay/PauseRequest", "POST", Summary = "Request pause in SyncPlay group")]
+    [Route("/SyncPlay/Pause", "POST", Summary = "Request pause in SyncPlay group")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayPauseRequest : IReturnVoid
+    public class SyncPlayPause : IReturnVoid
     {
     {
     }
     }
 
 
-    [Route("/SyncPlay/SeekRequest", "POST", Summary = "Request seek in SyncPlay group")]
+    [Route("/SyncPlay/Seek", "POST", Summary = "Request seek in SyncPlay group")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlaySeekRequest : IReturnVoid
+    public class SyncPlaySeek : IReturnVoid
     {
     {
         [ApiMember(Name = "PositionTicks", IsRequired = true, DataType = "long", ParameterType = "query", Verb = "POST")]
         [ApiMember(Name = "PositionTicks", IsRequired = true, DataType = "long", ParameterType = "query", Verb = "POST")]
         public long PositionTicks { get; set; }
         public long PositionTicks { get; set; }
     }
     }
 
 
-    [Route("/SyncPlay/BufferingRequest", "POST", Summary = "Request group wait in SyncPlay group while buffering")]
+    [Route("/SyncPlay/Buffering", "POST", Summary = "Request group wait in SyncPlay group while buffering")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayBufferingRequest : IReturnVoid
+    public class SyncPlayBuffering : IReturnVoid
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the date used to pin PositionTicks in time.
         /// Gets or sets the date used to pin PositionTicks in time.
@@ -96,9 +96,9 @@ namespace MediaBrowser.Api.SyncPlay
         public bool BufferingDone { get; set; }
         public bool BufferingDone { get; set; }
     }
     }
 
 
-    [Route("/SyncPlay/UpdatePing", "POST", Summary = "Update session ping")]
+    [Route("/SyncPlay/Ping", "POST", Summary = "Update session ping")]
     [Authenticated]
     [Authenticated]
-    public class SyncPlayUpdatePing : IReturnVoid
+    public class SyncPlayPing : IReturnVoid
     {
     {
         [ApiMember(Name = "Ping", IsRequired = true, DataType = "double", ParameterType = "query", Verb = "POST")]
         [ApiMember(Name = "Ping", IsRequired = true, DataType = "double", ParameterType = "query", Verb = "POST")]
         public double Ping { get; set; }
         public double Ping { get; set; }
@@ -135,7 +135,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayNewGroup request)
+        public void Post(SyncPlayNew request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             _syncPlayManager.NewGroup(currentSession, CancellationToken.None);
             _syncPlayManager.NewGroup(currentSession, CancellationToken.None);
@@ -145,7 +145,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayJoinGroup request)
+        public void Post(SyncPlayJoin request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
 
 
@@ -178,7 +178,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayLeaveGroup request)
+        public void Post(SyncPlayLeave request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             _syncPlayManager.LeaveGroup(currentSession, CancellationToken.None);
             _syncPlayManager.LeaveGroup(currentSession, CancellationToken.None);
@@ -189,7 +189,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
         /// <value>The requested list of groups.</value>
         /// <value>The requested list of groups.</value>
-        public List<GroupInfoView> Post(SyncPlayListGroups request)
+        public List<GroupInfoView> Get(SyncPlayList request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             var filterItemId = Guid.Empty;
             var filterItemId = Guid.Empty;
@@ -206,7 +206,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayPlayRequest request)
+        public void Post(SyncPlayPlay request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             var syncPlayRequest = new PlaybackRequest()
             var syncPlayRequest = new PlaybackRequest()
@@ -220,7 +220,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayPauseRequest request)
+        public void Post(SyncPlayPause request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             var syncPlayRequest = new PlaybackRequest()
             var syncPlayRequest = new PlaybackRequest()
@@ -234,7 +234,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlaySeekRequest request)
+        public void Post(SyncPlaySeek request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             var syncPlayRequest = new PlaybackRequest()
             var syncPlayRequest = new PlaybackRequest()
@@ -249,7 +249,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayBufferingRequest request)
+        public void Post(SyncPlayBuffering request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             var syncPlayRequest = new PlaybackRequest()
             var syncPlayRequest = new PlaybackRequest()
@@ -265,7 +265,7 @@ namespace MediaBrowser.Api.SyncPlay
         /// Handles the specified request.
         /// Handles the specified request.
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
-        public void Post(SyncPlayUpdatePing request)
+        public void Post(SyncPlayPing request)
         {
         {
             var currentSession = GetSession(_sessionContext);
             var currentSession = GetSession(_sessionContext);
             var syncPlayRequest = new PlaybackRequest()
             var syncPlayRequest = new PlaybackRequest()