mirror of
				https://github.com/Kareadita/Kavita.git
				synced 2025-11-04 03:27:05 -05:00 
			
		
		
		
	* Refactored all files to have Interfaces within the same file. Started moving over to file-scoped namespaces. * Refactored common methods for getting underlying file's cover, pages, and extracting into 1 interface. * More refactoring around removing dependence on explicit filetype testing for getting information. * Code is buildable, tests are broken. Huge refactor (not completed) which makes most of DirectoryService testable with a mock filesystem (and thus the services that utilize it). * Finished porting DirectoryService to use mocked filesystem implementation. * Added a null check * Added a null check * Finished all unit tests for DirectoryService. * Some misc cleanup on the code * Fixed up some bugs from refactoring scan loop. * Implemented CleanupService testing and refactored more of DirectoryService to be non-static. Fixed a bug where cover file cleanup wasn't properly finding files due to a regex bug. * Fixed an issue in CleanupBackup() where we weren't properly selecting database files older than 30 days. Finished CleanupService Tests. * Refactored Flatten and RemoveNonImages to directory service to allow CacheService to be testable. * Finally have CacheService tested. Rewrote GetCachedPagePath() to be much more straightforward & performant. * Updated DefaultParserTests.cs to contain all existing tests and follow new test layout format. * All tests fixed up
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Collections.Generic;
 | 
						|
using System.IO;
 | 
						|
using System.Linq;
 | 
						|
using System.Threading.Tasks;
 | 
						|
using API.Entities;
 | 
						|
using Microsoft.AspNetCore.StaticFiles;
 | 
						|
 | 
						|
namespace API.Services;
 | 
						|
 | 
						|
public interface IDownloadService
 | 
						|
{
 | 
						|
    Task<(byte[], string, string)> GetFirstFileDownload(IEnumerable<MangaFile> files);
 | 
						|
    string GetContentTypeFromFile(string filepath);
 | 
						|
}
 | 
						|
public class DownloadService : IDownloadService
 | 
						|
{
 | 
						|
    private readonly IDirectoryService _directoryService;
 | 
						|
    private readonly FileExtensionContentTypeProvider _fileTypeProvider = new FileExtensionContentTypeProvider();
 | 
						|
 | 
						|
    public DownloadService(IDirectoryService directoryService)
 | 
						|
    {
 | 
						|
        _directoryService = directoryService;
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Downloads the first file in the file enumerable for download
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="files"></param>
 | 
						|
    /// <returns></returns>
 | 
						|
    public async Task<(byte[], string, string)> GetFirstFileDownload(IEnumerable<MangaFile> files)
 | 
						|
    {
 | 
						|
        var firstFile = files.Select(c => c.FilePath).First();
 | 
						|
        return (await _directoryService.ReadFileAsync(firstFile), GetContentTypeFromFile(firstFile), Path.GetFileName(firstFile));
 | 
						|
    }
 | 
						|
 | 
						|
    public string GetContentTypeFromFile(string filepath)
 | 
						|
    {
 | 
						|
        // Figures out what the content type should be based on the file name.
 | 
						|
        if (!_fileTypeProvider.TryGetContentType(filepath, out var contentType))
 | 
						|
        {
 | 
						|
            contentType = Path.GetExtension(filepath).ToLowerInvariant() switch
 | 
						|
            {
 | 
						|
                ".cbz" => "application/zip",
 | 
						|
                ".cbr" => "application/vnd.rar",
 | 
						|
                ".cb7" => "application/x-compressed",
 | 
						|
                ".epub" => "application/epub+zip",
 | 
						|
                ".7z" => "application/x-7z-compressed",
 | 
						|
                ".7zip" => "application/x-7z-compressed",
 | 
						|
                ".pdf" => "application/pdf",
 | 
						|
                _ => contentType
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
        return contentType;
 | 
						|
    }
 | 
						|
}
 |