mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-05-31 20:24:27 -04:00
* Fixed an underline on hover of pagination link * Ensure title of companion bar eats full width if there is no filter * If a user doesn't have the Download role, they will not be able to download over OPDS. * Fixed a bug where after going into webtoon reader mode then leaving, the bookmark effect would continue using the webtoon mode styling * Fixed a bug where continuous reader wasn't being triggered due to moving scrollbar to body and a floating point percision error on scroll top * Fixed how continuous trigger is shown so that we properly adjust scroll on the top (for prev chapter) * Fixed a bad merge that broke saving any edits to series metadata * When a epub key is not correct, even after we correct it, ignore the inlining of the style so the book is at least still readable. * Disabled double rendering (this feature is being postponed to a later release) * Disabled user setting and forced it to Single on any save * Removed cache directory from UpdateSettings validation as we don't allow changing it. * Fix security issue with url parse * After all migrations run, update the installed version in the Database. Send that installed version on the stat service. * Dependency bot to update some security stuff * Some misc code cleanup and fixes on the typeahead (still broken)
68 lines
2.4 KiB
C#
68 lines
2.4 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using API.Constants;
|
|
using API.Entities;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.StaticFiles;
|
|
|
|
namespace API.Services;
|
|
|
|
public interface IDownloadService
|
|
{
|
|
Task<(byte[], string, string)> GetFirstFileDownload(IEnumerable<MangaFile> files);
|
|
string GetContentTypeFromFile(string filepath);
|
|
Task<bool> HasDownloadPermission(AppUser user);
|
|
}
|
|
public class DownloadService : IDownloadService
|
|
{
|
|
private readonly IDirectoryService _directoryService;
|
|
private readonly UserManager<AppUser> _userManager;
|
|
private readonly FileExtensionContentTypeProvider _fileTypeProvider = new FileExtensionContentTypeProvider();
|
|
|
|
public DownloadService(IDirectoryService directoryService, UserManager<AppUser> userManager)
|
|
{
|
|
_directoryService = directoryService;
|
|
_userManager = userManager;
|
|
}
|
|
|
|
/// <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;
|
|
}
|
|
|
|
public async Task<bool> HasDownloadPermission(AppUser user)
|
|
{
|
|
var roles = await _userManager.GetRolesAsync(user);
|
|
return roles.Contains(PolicyConstants.DownloadRole) || roles.Contains(PolicyConstants.AdminRole);
|
|
}
|
|
}
|