mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-26 05:41:17 +01:00 
			
		
		
		
	convert upload image url to rest
This commit is contained in:
		
							parent
							
								
									add43baffe
								
							
						
					
					
						commit
						b075e0a5b9
					
				| @ -1,6 +1,4 @@ | |||||||
| using MediaBrowser.Controller; | using System; | ||||||
| using MediaBrowser.Controller.Entities; |  | ||||||
| using System; |  | ||||||
| using System.Net; | using System.Net; | ||||||
| 
 | 
 | ||||||
| namespace MediaBrowser.Api | namespace MediaBrowser.Api | ||||||
| @ -10,24 +8,6 @@ namespace MediaBrowser.Api | |||||||
|     /// </summary> |     /// </summary> | ||||||
|     public static class ApiService |     public static class ApiService | ||||||
|     { |     { | ||||||
|         /// <summary> |  | ||||||
|         /// Gets a User by Id |  | ||||||
|         /// </summary> |  | ||||||
|         /// <param name="id">The id of the user</param> |  | ||||||
|         /// <returns>User.</returns> |  | ||||||
|         /// <exception cref="System.ArgumentNullException">id</exception> |  | ||||||
|         public static User GetUserById(string id) |  | ||||||
|         { |  | ||||||
|             if (string.IsNullOrEmpty(id)) |  | ||||||
|             { |  | ||||||
|                 throw new ArgumentNullException("id"); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             var guid = new Guid(id); |  | ||||||
| 
 |  | ||||||
|             return Kernel.Instance.GetUserById(guid); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Determines whether [is API URL match] [the specified URL]. |         /// Determines whether [is API URL match] [the specified URL]. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| using MediaBrowser.Common.Extensions; | using System.Threading; | ||||||
|  | using MediaBrowser.Common.Extensions; | ||||||
|  | using MediaBrowser.Common.IO; | ||||||
| using MediaBrowser.Common.Net; | using MediaBrowser.Common.Net; | ||||||
| using MediaBrowser.Controller; | using MediaBrowser.Controller; | ||||||
| using MediaBrowser.Controller.Entities; | using MediaBrowser.Controller.Entities; | ||||||
| @ -9,6 +11,7 @@ using System; | |||||||
| using System.IO; | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  | using ServiceStack.Text.Controller; | ||||||
| 
 | 
 | ||||||
| namespace MediaBrowser.Api.Images | namespace MediaBrowser.Api.Images | ||||||
| { | { | ||||||
| @ -101,7 +104,7 @@ namespace MediaBrowser.Api.Images | |||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Route("/Users/{Id}/Images/{Type}", "DELETE")] |     [Route("/Users/{Id}/Images/{Type}", "DELETE")] | ||||||
|     [Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")] |     [Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")] | ||||||
|     public class DeleteUserImage : DeleteImageRequest |     public class DeleteUserImage : DeleteImageRequest, IReturnVoid | ||||||
|     { |     { | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Gets or sets the id. |         /// Gets or sets the id. | ||||||
| @ -110,6 +113,23 @@ namespace MediaBrowser.Api.Images | |||||||
|         public Guid Id { get; set; } |         public Guid Id { get; set; } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     [Route("/Users/{Id}/Images/{Type}", "POST")] | ||||||
|  |     [Route("/Users/{Id}/Images/{Type}/{Index}", "POST")] | ||||||
|  |     public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets or sets the id. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <value>The id.</value> | ||||||
|  |         public Guid Id { get; set; } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// The raw Http Request Input Stream | ||||||
|  |         /// </summary> | ||||||
|  |         /// <value>The request stream.</value> | ||||||
|  |         public Stream RequestStream { get; set; } | ||||||
|  |     } | ||||||
|  |      | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Class ImageService |     /// Class ImageService | ||||||
|     /// </summary> |     /// </summary> | ||||||
| @ -197,6 +217,26 @@ namespace MediaBrowser.Api.Images | |||||||
|             return GetImage(request, item); |             return GetImage(request, item); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Posts the specified request. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="request">The request.</param> | ||||||
|  |         public void Post(PostUserImage request) | ||||||
|  |         { | ||||||
|  |             var kernel = (Kernel)Kernel; | ||||||
|  | 
 | ||||||
|  |             var pathInfo = PathInfo.Parse(Request.PathInfo); | ||||||
|  |             var id = new Guid(pathInfo.GetArgumentValue<string>(1)); | ||||||
|  | 
 | ||||||
|  |             request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue<string>(3), true); | ||||||
|  | 
 | ||||||
|  |             var item = kernel.Users.First(i => i.Id == id); | ||||||
|  | 
 | ||||||
|  |             var task = PostImage(item, request.RequestStream, request.Type, Request.ContentType); | ||||||
|  | 
 | ||||||
|  |             Task.WaitAll(task); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Deletes the specified request. |         /// Deletes the specified request. | ||||||
|         /// </summary> |         /// </summary> | ||||||
| @ -280,5 +320,62 @@ namespace MediaBrowser.Api.Images | |||||||
| 
 | 
 | ||||||
|             return kernel.ImageManager.GetImagePath(item, request.Type, index); |             return kernel.ImageManager.GetImagePath(item, request.Type, index); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Posts the image. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="entity">The entity.</param> | ||||||
|  |         /// <param name="inputStream">The input stream.</param> | ||||||
|  |         /// <param name="imageType">Type of the image.</param> | ||||||
|  |         /// <param name="mimeType">Type of the MIME.</param> | ||||||
|  |         /// <returns>Task.</returns> | ||||||
|  |         private async Task PostImage(BaseItem entity, Stream inputStream, ImageType imageType, string mimeType) | ||||||
|  |         { | ||||||
|  |             using (var reader = new StreamReader(inputStream)) | ||||||
|  |             { | ||||||
|  |                 var text = await reader.ReadToEndAsync().ConfigureAwait(false); | ||||||
|  | 
 | ||||||
|  |                 var bytes = Convert.FromBase64String(text); | ||||||
|  | 
 | ||||||
|  |                 string filename; | ||||||
|  | 
 | ||||||
|  |                 switch (imageType) | ||||||
|  |                 { | ||||||
|  |                     case ImageType.Art: | ||||||
|  |                         filename = "clearart"; | ||||||
|  |                         break; | ||||||
|  |                     case ImageType.Primary: | ||||||
|  |                         filename = "folder"; | ||||||
|  |                         break; | ||||||
|  |                     default: | ||||||
|  |                         filename = imageType.ToString().ToLower(); | ||||||
|  |                         break; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 var extension = mimeType.Substring(mimeType.IndexOf('/') + 1); | ||||||
|  | 
 | ||||||
|  |                 var oldImagePath = entity.GetImage(imageType); | ||||||
|  | 
 | ||||||
|  |                 var imagePath = Path.Combine(entity.MetaLocation, filename + "." + extension); | ||||||
|  | 
 | ||||||
|  |                 // Save to file system | ||||||
|  |                 using (var fs = new FileStream(imagePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) | ||||||
|  |                 { | ||||||
|  |                     await fs.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // Set the image | ||||||
|  |                 entity.SetImage(imageType, imagePath); | ||||||
|  | 
 | ||||||
|  |                 // If the new and old paths are different, delete the old one | ||||||
|  |                 if (!string.IsNullOrEmpty(oldImagePath) && !oldImagePath.Equals(imagePath, StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     File.Delete(oldImagePath); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // Directory watchers should repeat this, but do a quick refresh first | ||||||
|  |                 await entity.RefreshMetadata(CancellationToken.None, forceSave: true, allowSlowProviders: false).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,141 +0,0 @@ | |||||||
| using MediaBrowser.Common.IO; |  | ||||||
| using MediaBrowser.Common.Net.Handlers; |  | ||||||
| using MediaBrowser.Controller; |  | ||||||
| using MediaBrowser.Controller.Entities; |  | ||||||
| using MediaBrowser.Controller.Library; |  | ||||||
| using MediaBrowser.Model.Entities; |  | ||||||
| using System; |  | ||||||
| using System.IO; |  | ||||||
| using System.Threading; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
| 
 |  | ||||||
| namespace MediaBrowser.Api.Images |  | ||||||
| { |  | ||||||
|     /// <summary> |  | ||||||
|     /// Class UploadImageHandler |  | ||||||
|     /// </summary> |  | ||||||
|     class UploadImageHandler : BaseActionHandler<Kernel> |  | ||||||
|     { |  | ||||||
|         /// <summary> |  | ||||||
|         /// The _source entity |  | ||||||
|         /// </summary> |  | ||||||
|         private BaseItem _sourceEntity; |  | ||||||
| 
 |  | ||||||
|         /// <summary> |  | ||||||
|         /// Gets the source entity. |  | ||||||
|         /// </summary> |  | ||||||
|         /// <returns>Task{BaseItem}.</returns> |  | ||||||
|         private async Task<BaseItem> GetSourceEntity() |  | ||||||
|         { |  | ||||||
|             if (_sourceEntity == null) |  | ||||||
|             { |  | ||||||
|                 if (!string.IsNullOrEmpty(QueryString["personname"])) |  | ||||||
|                 { |  | ||||||
|                     _sourceEntity = |  | ||||||
|                         await Kernel.LibraryManager.GetPerson(QueryString["personname"]).ConfigureAwait(false); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 else if (!string.IsNullOrEmpty(QueryString["genre"])) |  | ||||||
|                 { |  | ||||||
|                     _sourceEntity = |  | ||||||
|                         await Kernel.LibraryManager.GetGenre(QueryString["genre"]).ConfigureAwait(false); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 else if (!string.IsNullOrEmpty(QueryString["year"])) |  | ||||||
|                 { |  | ||||||
|                     _sourceEntity = |  | ||||||
|                         await |  | ||||||
|                         Kernel.LibraryManager.GetYear(int.Parse(QueryString["year"])).ConfigureAwait(false); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 else if (!string.IsNullOrEmpty(QueryString["studio"])) |  | ||||||
|                 { |  | ||||||
|                     _sourceEntity = |  | ||||||
|                         await Kernel.LibraryManager.GetStudio(QueryString["studio"]).ConfigureAwait(false); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 else if (!string.IsNullOrEmpty(QueryString["userid"])) |  | ||||||
|                 { |  | ||||||
|                     _sourceEntity = ApiService.GetUserById(QueryString["userid"]); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     _sourceEntity = DtoBuilder.GetItemByClientId(QueryString["id"]); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             return _sourceEntity; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         /// <summary> |  | ||||||
|         /// Gets the type of the image. |  | ||||||
|         /// </summary> |  | ||||||
|         /// <value>The type of the image.</value> |  | ||||||
|         private ImageType ImageType |  | ||||||
|         { |  | ||||||
|             get |  | ||||||
|             { |  | ||||||
|                 var imageType = QueryString["type"]; |  | ||||||
| 
 |  | ||||||
|                 return (ImageType)Enum.Parse(typeof(ImageType), imageType, true); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         /// <summary> |  | ||||||
|         /// Performs the action. |  | ||||||
|         /// </summary> |  | ||||||
|         /// <returns>Task.</returns> |  | ||||||
|         protected override async Task ExecuteAction() |  | ||||||
|         { |  | ||||||
|             var entity = await GetSourceEntity().ConfigureAwait(false); |  | ||||||
| 
 |  | ||||||
|             using (var reader = new StreamReader(HttpListenerContext.Request.InputStream)) |  | ||||||
|             { |  | ||||||
|                 var text = await reader.ReadToEndAsync().ConfigureAwait(false); |  | ||||||
| 
 |  | ||||||
|                 var bytes = Convert.FromBase64String(text); |  | ||||||
| 
 |  | ||||||
|                 string filename; |  | ||||||
| 
 |  | ||||||
|                 switch (ImageType) |  | ||||||
|                 { |  | ||||||
|                     case ImageType.Art: |  | ||||||
|                         filename = "clearart"; |  | ||||||
|                         break; |  | ||||||
|                     case ImageType.Primary: |  | ||||||
|                         filename = "folder"; |  | ||||||
|                         break; |  | ||||||
|                     default: |  | ||||||
|                         filename = ImageType.ToString().ToLower(); |  | ||||||
|                         break; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 // Use the client filename to determine the original extension |  | ||||||
|                 var clientFileName = QueryString["filename"]; |  | ||||||
| 
 |  | ||||||
|                 var oldImagePath = entity.GetImage(ImageType); |  | ||||||
| 
 |  | ||||||
|                 var imagePath = Path.Combine(entity.MetaLocation, filename + Path.GetExtension(clientFileName)); |  | ||||||
| 
 |  | ||||||
|                 // Save to file system |  | ||||||
|                 using (var fs = new FileStream(imagePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) |  | ||||||
|                 { |  | ||||||
|                     await fs.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 // Set the image |  | ||||||
|                 entity.SetImage(ImageType, imagePath); |  | ||||||
| 
 |  | ||||||
|                 // If the new and old paths are different, delete the old one |  | ||||||
|                 if (!string.IsNullOrEmpty(oldImagePath) && !oldImagePath.Equals(imagePath, StringComparison.OrdinalIgnoreCase)) |  | ||||||
|                 { |  | ||||||
|                     File.Delete(oldImagePath); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 // Directory watchers should repeat this, but do a quick refresh first |  | ||||||
|                 await entity.RefreshMetadata(CancellationToken.None, forceSave: true, allowSlowProviders: false).ConfigureAwait(false); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -613,15 +613,15 @@ var ApiClient = { | |||||||
| 
 | 
 | ||||||
|             var data = window.btoa(e.target.result); |             var data = window.btoa(e.target.result); | ||||||
| 
 | 
 | ||||||
|             var params = { |             var url = ApiClient.getUrl("Users/" + userId + "/Images/" + imageType); | ||||||
|                 userId: userId, |  | ||||||
|                 type: imageType, |  | ||||||
|                 filename: file.name |  | ||||||
|             }; |  | ||||||
| 
 | 
 | ||||||
|             var url = ApiClient.getUrl("UploadImage", params); |             $.ajax({ | ||||||
|  |                 type: "POST", | ||||||
|  |                 url: url, | ||||||
|  |                 data: data, | ||||||
|  |                 contentType: "image/" + file.name.substring(file.name.lastIndexOf('.') + 1) | ||||||
| 
 | 
 | ||||||
|             $.post(url, data).done(function (result) { |             }).done(function (result) { | ||||||
| 
 | 
 | ||||||
|                 deferred.resolveWith(null, [result]); |                 deferred.resolveWith(null, [result]); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -78,7 +78,6 @@ | |||||||
|     <Compile Include="Images\ImageRequest.cs" /> |     <Compile Include="Images\ImageRequest.cs" /> | ||||||
|     <Compile Include="Images\ImageService.cs" /> |     <Compile Include="Images\ImageService.cs" /> | ||||||
|     <Compile Include="Images\ImageWriter.cs" /> |     <Compile Include="Images\ImageWriter.cs" /> | ||||||
|     <Compile Include="Images\UploadImageHandler.cs" /> |  | ||||||
|     <Compile Include="Javascript\JavascriptApiClientService.cs" /> |     <Compile Include="Javascript\JavascriptApiClientService.cs" /> | ||||||
|     <Compile Include="Library\LibraryHelpers.cs" /> |     <Compile Include="Library\LibraryHelpers.cs" /> | ||||||
|     <Compile Include="Library\LibraryService.cs" /> |     <Compile Include="Library\LibraryService.cs" /> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user