mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-30 18:22:48 -04:00 
			
		
		
		
	Cleanup file related code (#14023)
This commit is contained in:
		
							parent
							
								
									4096c973c6
								
							
						
					
					
						commit
						0c3ba30de2
					
				| @ -2,6 +2,7 @@ using System; | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.IO; | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|  | using Jellyfin.Extensions; | ||||||
| using MediaBrowser.Common.Configuration; | using MediaBrowser.Common.Configuration; | ||||||
| 
 | 
 | ||||||
| namespace Emby.Server.Implementations.AppBase | namespace Emby.Server.Implementations.AppBase | ||||||
| @ -91,10 +92,7 @@ namespace Emby.Server.Implementations.AppBase | |||||||
|         /// <inheritdoc /> |         /// <inheritdoc /> | ||||||
|         public void CreateAndCheckMarker(string path, string markerName, bool recursive = false) |         public void CreateAndCheckMarker(string path, string markerName, bool recursive = false) | ||||||
|         { |         { | ||||||
|             if (!Directory.Exists(path)) |             Directory.CreateDirectory(path); | ||||||
|             { |  | ||||||
|                 Directory.CreateDirectory(path); |  | ||||||
|             } |  | ||||||
| 
 | 
 | ||||||
|             CheckOrCreateMarker(path, $".jellyfin-{markerName}", recursive); |             CheckOrCreateMarker(path, $".jellyfin-{markerName}", recursive); | ||||||
|         } |         } | ||||||
| @ -115,7 +113,7 @@ namespace Emby.Server.Implementations.AppBase | |||||||
|             var markerPath = Path.Combine(path, markerName); |             var markerPath = Path.Combine(path, markerName); | ||||||
|             if (!File.Exists(markerPath)) |             if (!File.Exists(markerPath)) | ||||||
|             { |             { | ||||||
|                 File.Create(markerPath).Dispose(); |                 FileHelper.CreateEmpty(markerPath); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -159,13 +159,13 @@ namespace Emby.Server.Implementations.IO | |||||||
|             catch (IOException) |             catch (IOException) | ||||||
|             { |             { | ||||||
|                 // Cross device move requires a copy |                 // Cross device move requires a copy | ||||||
|                 Directory.CreateDirectory(destination); |                 var directory = Directory.CreateDirectory(destination); | ||||||
|                 foreach (string file in Directory.GetFiles(source)) |                 foreach (var file in directory.EnumerateFiles()) | ||||||
|                 { |                 { | ||||||
|                     File.Copy(file, Path.Combine(destination, Path.GetFileName(file)), true); |                     file.CopyTo(Path.Combine(destination, file.Name), true); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 Directory.Delete(source, true); |                 directory.Delete(true); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ public class DotIgnoreIgnoreRule : IResolverIgnoreRule | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         var parentDir = directory.Parent; |         var parentDir = directory.Parent; | ||||||
|         if (parentDir == null || parentDir.FullName == directory.FullName) |         if (parentDir is null) | ||||||
|         { |         { | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -2945,7 +2945,7 @@ namespace Emby.Server.Implementations.Library | |||||||
|                 { |                 { | ||||||
|                     var path = Path.Combine(virtualFolderPath, collectionType.ToString()!.ToLowerInvariant() + ".collection"); // Can't be null with legal values? |                     var path = Path.Combine(virtualFolderPath, collectionType.ToString()!.ToLowerInvariant() + ".collection"); // Can't be null with legal values? | ||||||
| 
 | 
 | ||||||
|                     await File.WriteAllBytesAsync(path, []).ConfigureAwait(false); |                     FileHelper.CreateEmpty(path); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 CollectionFolder.SaveLibraryOptions(virtualFolderPath, options); |                 CollectionFolder.SaveLibraryOptions(virtualFolderPath, options); | ||||||
|  | |||||||
| @ -681,17 +681,17 @@ namespace Emby.Server.Implementations.Library | |||||||
| 
 | 
 | ||||||
|                 mediaInfo = await _mediaEncoder.GetMediaInfo( |                 mediaInfo = await _mediaEncoder.GetMediaInfo( | ||||||
|                     new MediaInfoRequest |                     new MediaInfoRequest | ||||||
|                 { |                     { | ||||||
|                     MediaSource = mediaSource, |                         MediaSource = mediaSource, | ||||||
|                     MediaType = isAudio ? DlnaProfileType.Audio : DlnaProfileType.Video, |                         MediaType = isAudio ? DlnaProfileType.Audio : DlnaProfileType.Video, | ||||||
|                     ExtractChapters = false |                         ExtractChapters = false | ||||||
|                 }, |                     }, | ||||||
|                     cancellationToken).ConfigureAwait(false); |                     cancellationToken).ConfigureAwait(false); | ||||||
| 
 | 
 | ||||||
|                 if (cacheFilePath is not null) |                 if (cacheFilePath is not null) | ||||||
|                 { |                 { | ||||||
|                     Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath)); |                     Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath)); | ||||||
|                     FileStream createStream = File.Create(cacheFilePath); |                     FileStream createStream = AsyncFile.Create(cacheFilePath); | ||||||
|                     await using (createStream.ConfigureAwait(false)) |                     await using (createStream.ConfigureAwait(false)) | ||||||
|                     { |                     { | ||||||
|                         await JsonSerializer.SerializeAsync(createStream, mediaInfo, _jsonOptions, cancellationToken).ConfigureAwait(false); |                         await JsonSerializer.SerializeAsync(createStream, mediaInfo, _jsonOptions, cancellationToken).ConfigureAwait(false); | ||||||
|  | |||||||
| @ -520,7 +520,7 @@ namespace Emby.Server.Implementations.Localization | |||||||
|         public bool TryGetISO6392TFromB(string isoB, [NotNullWhen(true)] out string? isoT) |         public bool TryGetISO6392TFromB(string isoB, [NotNullWhen(true)] out string? isoT) | ||||||
|         { |         { | ||||||
|             // Unlikely case the dictionary is not (yet) initialized properly |             // Unlikely case the dictionary is not (yet) initialized properly | ||||||
|             if (_iso6392BtoT == null) |             if (_iso6392BtoT is null) | ||||||
|             { |             { | ||||||
|                 isoT = null; |                 isoT = null; | ||||||
|                 return false; |                 return false; | ||||||
|  | |||||||
| @ -125,7 +125,7 @@ public class SyncPlayController : BaseJellyfinApiController | |||||||
|     { |     { | ||||||
|         var currentSession = await RequestHelpers.GetSession(_sessionManager, _userManager, HttpContext).ConfigureAwait(false); |         var currentSession = await RequestHelpers.GetSession(_sessionManager, _userManager, HttpContext).ConfigureAwait(false); | ||||||
|         var group = _syncPlayManager.GetGroup(currentSession, id); |         var group = _syncPlayManager.GetGroup(currentSession, id); | ||||||
|         return group == null ? NotFound() : Ok(group); |         return group is null ? NotFound() : Ok(group); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|  | |||||||
| @ -72,10 +72,7 @@ public static class StorageHelper | |||||||
|     private static void TestDataDirectorySize(string path, ILogger logger, long threshold = -1) |     private static void TestDataDirectorySize(string path, ILogger logger, long threshold = -1) | ||||||
|     { |     { | ||||||
|         logger.LogDebug("Check path {TestPath} for storage capacity", path); |         logger.LogDebug("Check path {TestPath} for storage capacity", path); | ||||||
|         if (!Directory.Exists(path)) |         Directory.CreateDirectory(path); | ||||||
|         { |  | ||||||
|             Directory.CreateDirectory(path); |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         var drive = new DriveInfo(path); |         var drive = new DriveInfo(path); | ||||||
|         if (threshold != -1 && drive.AvailableFreeSpace < threshold) |         if (threshold != -1 && drive.AvailableFreeSpace < threshold) | ||||||
|  | |||||||
| @ -97,28 +97,28 @@ public class TrickplayManager : ITrickplayManager | |||||||
|             var existingResolution = resolution.Key; |             var existingResolution = resolution.Key; | ||||||
|             var tileWidth = resolution.Value.TileWidth; |             var tileWidth = resolution.Value.TileWidth; | ||||||
|             var tileHeight = resolution.Value.TileHeight; |             var tileHeight = resolution.Value.TileHeight; | ||||||
|             var shouldBeSavedWithMedia = libraryOptions is null ? false : libraryOptions.SaveTrickplayWithMedia; |             var shouldBeSavedWithMedia = libraryOptions is not null && libraryOptions.SaveTrickplayWithMedia; | ||||||
|             var localOutputDir = GetTrickplayDirectory(video, tileWidth, tileHeight, existingResolution, false); |             var localOutputDir = new DirectoryInfo(GetTrickplayDirectory(video, tileWidth, tileHeight, existingResolution, false)); | ||||||
|             var mediaOutputDir = GetTrickplayDirectory(video, tileWidth, tileHeight, existingResolution, true); |             var mediaOutputDir = new DirectoryInfo(GetTrickplayDirectory(video, tileWidth, tileHeight, existingResolution, true)); | ||||||
|             if (shouldBeSavedWithMedia && Directory.Exists(localOutputDir)) |             if (shouldBeSavedWithMedia && localOutputDir.Exists) | ||||||
|             { |             { | ||||||
|                 var localDirFiles = Directory.GetFiles(localOutputDir); |                 var localDirFiles = localOutputDir.EnumerateFiles(); | ||||||
|                 var mediaDirExists = Directory.Exists(mediaOutputDir); |                 var mediaDirExists = mediaOutputDir.Exists; | ||||||
|                 if (localDirFiles.Length > 0 && ((mediaDirExists && Directory.GetFiles(mediaOutputDir).Length == 0) || !mediaDirExists)) |                 if (localDirFiles.Any() && ((mediaDirExists && mediaOutputDir.EnumerateFiles().Any()) || !mediaDirExists)) | ||||||
|                 { |                 { | ||||||
|                     // Move images from local dir to media dir |                     // Move images from local dir to media dir | ||||||
|                     MoveContent(localOutputDir, mediaOutputDir); |                     MoveContent(localOutputDir.FullName, mediaOutputDir.FullName); | ||||||
|                     _logger.LogInformation("Moved trickplay images for {ItemName} to {Location}", video.Name, mediaOutputDir); |                     _logger.LogInformation("Moved trickplay images for {ItemName} to {Location}", video.Name, mediaOutputDir); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             else if (!shouldBeSavedWithMedia && Directory.Exists(mediaOutputDir)) |             else if (!shouldBeSavedWithMedia && mediaOutputDir.Exists) | ||||||
|             { |             { | ||||||
|                 var mediaDirFiles = Directory.GetFiles(mediaOutputDir); |                 var mediaDirFiles = mediaOutputDir.EnumerateFiles(); | ||||||
|                 var localDirExists = Directory.Exists(localOutputDir); |                 var localDirExists = localOutputDir.Exists; | ||||||
|                 if (mediaDirFiles.Length > 0 && ((localDirExists && Directory.GetFiles(localOutputDir).Length == 0) || !localDirExists)) |                 if (mediaDirFiles.Any() && ((localDirExists && localOutputDir.EnumerateFiles().Any()) || !localDirExists)) | ||||||
|                 { |                 { | ||||||
|                     // Move images from media dir to local dir |                     // Move images from media dir to local dir | ||||||
|                     MoveContent(mediaOutputDir, localOutputDir); |                     MoveContent(mediaOutputDir.FullName, localOutputDir.FullName); | ||||||
|                     _logger.LogInformation("Moved trickplay images for {ItemName} to {Location}", video.Name, localOutputDir); |                     _logger.LogInformation("Moved trickplay images for {ItemName} to {Location}", video.Name, localOutputDir); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @ -131,10 +131,10 @@ public class TrickplayManager : ITrickplayManager | |||||||
|         var parent = Directory.GetParent(sourceFolder); |         var parent = Directory.GetParent(sourceFolder); | ||||||
|         if (parent is not null) |         if (parent is not null) | ||||||
|         { |         { | ||||||
|             var parentContent = Directory.GetDirectories(parent.FullName); |             var parentContent = parent.EnumerateDirectories(); | ||||||
|             if (parentContent.Length == 0) |             if (!parentContent.Any()) | ||||||
|             { |             { | ||||||
|                 Directory.Delete(parent.FullName); |                 parent.Delete(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -220,13 +220,13 @@ public class TrickplayManager : ITrickplayManager | |||||||
| 
 | 
 | ||||||
|                 var tileWidth = options.TileWidth; |                 var tileWidth = options.TileWidth; | ||||||
|                 var tileHeight = options.TileHeight; |                 var tileHeight = options.TileHeight; | ||||||
|                 var saveWithMedia = libraryOptions is null ? false : libraryOptions.SaveTrickplayWithMedia; |                 var saveWithMedia = libraryOptions is not null && libraryOptions.SaveTrickplayWithMedia; | ||||||
|                 var outputDir = GetTrickplayDirectory(video, tileWidth, tileHeight, actualWidth, saveWithMedia); |                 var outputDir = new DirectoryInfo(GetTrickplayDirectory(video, tileWidth, tileHeight, actualWidth, saveWithMedia)); | ||||||
| 
 | 
 | ||||||
|                 // Import existing trickplay tiles |                 // Import existing trickplay tiles | ||||||
|                 if (!replace && Directory.Exists(outputDir)) |                 if (!replace && outputDir.Exists) | ||||||
|                 { |                 { | ||||||
|                     var existingFiles = Directory.GetFiles(outputDir); |                     var existingFiles = outputDir.GetFiles(); | ||||||
|                     if (existingFiles.Length > 0) |                     if (existingFiles.Length > 0) | ||||||
|                     { |                     { | ||||||
|                         var hasTrickplayResolution = await HasTrickplayResolutionAsync(video.Id, actualWidth).ConfigureAwait(false); |                         var hasTrickplayResolution = await HasTrickplayResolutionAsync(video.Id, actualWidth).ConfigureAwait(false); | ||||||
| @ -251,9 +251,9 @@ public class TrickplayManager : ITrickplayManager | |||||||
| 
 | 
 | ||||||
|                         foreach (var tile in existingFiles) |                         foreach (var tile in existingFiles) | ||||||
|                         { |                         { | ||||||
|                             var image = _imageEncoder.GetImageSize(tile); |                             var image = _imageEncoder.GetImageSize(tile.FullName); | ||||||
|                             localTrickplayInfo.Height = Math.Max(localTrickplayInfo.Height, (int)Math.Ceiling((double)image.Height / localTrickplayInfo.TileHeight)); |                             localTrickplayInfo.Height = Math.Max(localTrickplayInfo.Height, (int)Math.Ceiling((double)image.Height / localTrickplayInfo.TileHeight)); | ||||||
|                             var bitrate = (int)Math.Ceiling((decimal)new FileInfo(tile).Length * 8 / localTrickplayInfo.TileWidth / localTrickplayInfo.TileHeight / (localTrickplayInfo.Interval / 1000)); |                             var bitrate = (int)Math.Ceiling((decimal)tile.Length * 8 / localTrickplayInfo.TileWidth / localTrickplayInfo.TileHeight / (localTrickplayInfo.Interval / 1000)); | ||||||
|                             localTrickplayInfo.Bandwidth = Math.Max(localTrickplayInfo.Bandwidth, bitrate); |                             localTrickplayInfo.Bandwidth = Math.Max(localTrickplayInfo.Bandwidth, bitrate); | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
| @ -296,7 +296,7 @@ public class TrickplayManager : ITrickplayManager | |||||||
|                     .ToList(); |                     .ToList(); | ||||||
| 
 | 
 | ||||||
|                 // Create tiles |                 // Create tiles | ||||||
|                 var trickplayInfo = CreateTiles(images, actualWidth, options, outputDir); |                 var trickplayInfo = CreateTiles(images, actualWidth, options, outputDir.FullName); | ||||||
| 
 | 
 | ||||||
|                 // Save tiles info |                 // Save tiles info | ||||||
|                 try |                 try | ||||||
| @ -319,7 +319,7 @@ public class TrickplayManager : ITrickplayManager | |||||||
| 
 | 
 | ||||||
|                     // Make sure no files stay in metadata folders on failure |                     // Make sure no files stay in metadata folders on failure | ||||||
|                     // if tiles info wasn't saved. |                     // if tiles info wasn't saved. | ||||||
|                     Directory.Delete(outputDir, true); |                     outputDir.Delete(true); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             catch (Exception ex) |             catch (Exception ex) | ||||||
|  | |||||||
| @ -215,7 +215,7 @@ namespace Jellyfin.Server.Extensions | |||||||
|                 }); |                 }); | ||||||
| 
 | 
 | ||||||
|                 // Add all xml doc files to swagger generator. |                 // Add all xml doc files to swagger generator. | ||||||
|                 var xmlFiles = Directory.GetFiles( |                 var xmlFiles = Directory.EnumerateFiles( | ||||||
|                     AppContext.BaseDirectory, |                     AppContext.BaseDirectory, | ||||||
|                     "*.xml", |                     "*.xml", | ||||||
|                     SearchOption.TopDirectoryOnly); |                     SearchOption.TopDirectoryOnly); | ||||||
|  | |||||||
| @ -133,9 +133,9 @@ namespace MediaBrowser.MediaEncoding.Attachments | |||||||
|             var outputFolder = _pathManager.GetAttachmentFolderPath(mediaSource.Id); |             var outputFolder = _pathManager.GetAttachmentFolderPath(mediaSource.Id); | ||||||
|             using (await _semaphoreLocks.LockAsync(outputFolder, cancellationToken).ConfigureAwait(false)) |             using (await _semaphoreLocks.LockAsync(outputFolder, cancellationToken).ConfigureAwait(false)) | ||||||
|             { |             { | ||||||
|                 Directory.CreateDirectory(outputFolder); |                 var directory = Directory.CreateDirectory(outputFolder); | ||||||
|                 var fileNames = Directory.GetFiles(outputFolder, "*", SearchOption.TopDirectoryOnly).Select(f => Path.GetFileName(f)); |                 var fileNames = directory.GetFiles("*", SearchOption.TopDirectoryOnly).Select(f => f.Name).ToHashSet(); | ||||||
|                 var missingFiles = mediaSource.MediaAttachments.Where(a => !fileNames.Contains(a.FileName) && !string.Equals(a.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)); |                 var missingFiles = mediaSource.MediaAttachments.Where(a => a.FileName is not null && !fileNames.Contains(a.FileName) && !string.Equals(a.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)); | ||||||
|                 if (!missingFiles.Any()) |                 if (!missingFiles.Any()) | ||||||
|                 { |                 { | ||||||
|                     // Skip extraction if all files already exist |                     // Skip extraction if all files already exist | ||||||
|  | |||||||
| @ -26,6 +26,14 @@ namespace MediaBrowser.Model.IO | |||||||
|             Options = FileOptions.Asynchronous |             Options = FileOptions.Asynchronous | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates, or truncates and overwrites, a file in the specified path. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="path">The path and name of the file to create.</param> | ||||||
|  |         /// <returns>A <see cref="FileStream" /> that provides read/write access to the file specified in path.</returns> | ||||||
|  |         public static FileStream Create(string path) | ||||||
|  |             => new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous); | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Opens an existing file for reading. |         /// Opens an existing file for reading. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								src/Jellyfin.Extensions/FileHelper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/Jellyfin.Extensions/FileHelper.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | using System.IO; | ||||||
|  | 
 | ||||||
|  | namespace Jellyfin.Extensions; | ||||||
|  | 
 | ||||||
|  | /// <summary> | ||||||
|  | /// Provides helper functions for <see cref="File" />. | ||||||
|  | /// </summary> | ||||||
|  | public static class FileHelper | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Creates, or truncates a file in the specified path. | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="path">The path and name of the file to create.</param> | ||||||
|  |     public static void CreateEmpty(string path) | ||||||
|  |     { | ||||||
|  |         using (File.OpenHandle(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -363,7 +363,7 @@ namespace Jellyfin.LiveTv.Channels | |||||||
| 
 | 
 | ||||||
|             Directory.CreateDirectory(Path.GetDirectoryName(path)); |             Directory.CreateDirectory(Path.GetDirectoryName(path)); | ||||||
| 
 | 
 | ||||||
|             FileStream createStream = File.Create(path); |             FileStream createStream = AsyncFile.Create(path); | ||||||
|             await using (createStream.ConfigureAwait(false)) |             await using (createStream.ConfigureAwait(false)) | ||||||
|             { |             { | ||||||
|                 await JsonSerializer.SerializeAsync(createStream, mediaSources, _jsonOptions).ConfigureAwait(false); |                 await JsonSerializer.SerializeAsync(createStream, mediaSources, _jsonOptions).ConfigureAwait(false); | ||||||
| @ -866,7 +866,7 @@ namespace Jellyfin.LiveTv.Channels | |||||||
|             { |             { | ||||||
|                 Directory.CreateDirectory(Path.GetDirectoryName(path)); |                 Directory.CreateDirectory(Path.GetDirectoryName(path)); | ||||||
| 
 | 
 | ||||||
|                 var createStream = File.Create(path); |                 var createStream = AsyncFile.Create(path); | ||||||
|                 await using (createStream.ConfigureAwait(false)) |                 await using (createStream.ConfigureAwait(false)) | ||||||
|                 { |                 { | ||||||
|                     await JsonSerializer.SerializeAsync(createStream, result, _jsonOptions).ConfigureAwait(false); |                     await JsonSerializer.SerializeAsync(createStream, result, _jsonOptions).ConfigureAwait(false); | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								tests/Jellyfin.Extensions.Tests/FileHelperTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								tests/Jellyfin.Extensions.Tests/FileHelperTests.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | using System.IO; | ||||||
|  | using Xunit; | ||||||
|  | 
 | ||||||
|  | namespace Jellyfin.Extensions.Tests; | ||||||
|  | 
 | ||||||
|  | public static class FileHelperTests | ||||||
|  | { | ||||||
|  |     [Fact] | ||||||
|  |     public static void CreateEmpty_Valid_Correct() | ||||||
|  |     { | ||||||
|  |         var path = Path.Join(Path.GetTempPath(), Path.GetRandomFileName()); | ||||||
|  |         var fileInfo = new FileInfo(path); | ||||||
|  | 
 | ||||||
|  |         Assert.False(fileInfo.Exists); | ||||||
|  | 
 | ||||||
|  |         FileHelper.CreateEmpty(path); | ||||||
|  | 
 | ||||||
|  |         fileInfo.Refresh(); | ||||||
|  |         Assert.True(fileInfo.Exists); | ||||||
|  | 
 | ||||||
|  |         File.Delete(path); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -6,6 +6,7 @@ using System.Threading.Tasks; | |||||||
| using AutoFixture; | using AutoFixture; | ||||||
| using Emby.Server.Implementations.Library; | using Emby.Server.Implementations.Library; | ||||||
| using Emby.Server.Implementations.Plugins; | using Emby.Server.Implementations.Plugins; | ||||||
|  | using Jellyfin.Extensions; | ||||||
| using Jellyfin.Extensions.Json; | using Jellyfin.Extensions.Json; | ||||||
| using Jellyfin.Extensions.Json.Converters; | using Jellyfin.Extensions.Json.Converters; | ||||||
| using MediaBrowser.Common.Plugins; | using MediaBrowser.Common.Plugins; | ||||||
| @ -85,7 +86,7 @@ namespace Jellyfin.Server.Implementations.Tests.Plugins | |||||||
|             var dllPath = Path.GetDirectoryName(Path.Combine(_pluginPath, dllFile))!; |             var dllPath = Path.GetDirectoryName(Path.Combine(_pluginPath, dllFile))!; | ||||||
| 
 | 
 | ||||||
|             Directory.CreateDirectory(dllPath); |             Directory.CreateDirectory(dllPath); | ||||||
|             File.Create(Path.Combine(dllPath, filename)); |             FileHelper.CreateEmpty(Path.Combine(dllPath, filename)); | ||||||
|             var metafilePath = Path.Combine(_pluginPath, "meta.json"); |             var metafilePath = Path.Combine(_pluginPath, "meta.json"); | ||||||
| 
 | 
 | ||||||
|             File.WriteAllText(metafilePath, JsonSerializer.Serialize(manifest, _options)); |             File.WriteAllText(metafilePath, JsonSerializer.Serialize(manifest, _options)); | ||||||
| @ -141,7 +142,7 @@ namespace Jellyfin.Server.Implementations.Tests.Plugins | |||||||
| 
 | 
 | ||||||
|             foreach (var file in files) |             foreach (var file in files) | ||||||
|             { |             { | ||||||
|                 File.Create(Path.Combine(_pluginPath, file)); |                 FileHelper.CreateEmpty(Path.Combine(_pluginPath, file)); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             var metafilePath = Path.Combine(_pluginPath, "meta.json"); |             var metafilePath = Path.Combine(_pluginPath, "meta.json"); | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| using System.IO; | using System.IO; | ||||||
| using System.Reflection; | using System.Reflection; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  | using MediaBrowser.Model.IO; | ||||||
| using Xunit; | using Xunit; | ||||||
| using Xunit.Abstractions; | using Xunit.Abstractions; | ||||||
| 
 | 
 | ||||||
| @ -33,7 +34,7 @@ namespace Jellyfin.Server.Integration.Tests | |||||||
|             // Write out for publishing |             // Write out for publishing | ||||||
|             string outputPath = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? ".", "openapi.json")); |             string outputPath = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? ".", "openapi.json")); | ||||||
|             _outputHelper.WriteLine("Writing OpenAPI Spec JSON to '{0}'.", outputPath); |             _outputHelper.WriteLine("Writing OpenAPI Spec JSON to '{0}'.", outputPath); | ||||||
|             await using var fs = File.Create(outputPath); |             await using var fs = AsyncFile.Create(outputPath); | ||||||
|             await response.Content.CopyToAsync(fs); |             await response.Content.CopyToAsync(fs); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user