mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-06-03 05:34:21 -04:00
Fixed loose chapters marked as read for Tachiyomi (#1158)
* Tachiyomi-related fixes * Created unit test for MarkAsReadAnythingUntil * Applied the requested changes.
This commit is contained in:
parent
01ce61b590
commit
5220d2b300
@ -1780,6 +1780,78 @@ public class ReaderServiceTests
|
|||||||
Assert.True(await _unitOfWork.AppUserProgressRepository.UserHasProgress(LibraryType.Manga, 1));
|
Assert.True(await _unitOfWork.AppUserProgressRepository.UserHasProgress(LibraryType.Manga, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task MarkChaptersUntilAsRead_ShouldMarkAsReadAnythingUntil()
|
||||||
|
{
|
||||||
|
await ResetDB();
|
||||||
|
_context.Series.Add(new Series()
|
||||||
|
{
|
||||||
|
Name = "Test",
|
||||||
|
Library = new Library()
|
||||||
|
{
|
||||||
|
Name = "Test LIb",
|
||||||
|
Type = LibraryType.Manga,
|
||||||
|
},
|
||||||
|
Volumes = new List<Volume>()
|
||||||
|
{
|
||||||
|
EntityFactory.CreateVolume("0", new List<Chapter>()
|
||||||
|
{
|
||||||
|
EntityFactory.CreateChapter("45", false, new List<MangaFile>(), 5),
|
||||||
|
|
||||||
|
EntityFactory.CreateChapter("46", false, new List<MangaFile>(), 46),
|
||||||
|
EntityFactory.CreateChapter("47", false, new List<MangaFile>(), 47),
|
||||||
|
EntityFactory.CreateChapter("48", false, new List<MangaFile>(), 48),
|
||||||
|
EntityFactory.CreateChapter("49", false, new List<MangaFile>(), 49),
|
||||||
|
EntityFactory.CreateChapter("50", false, new List<MangaFile>(), 50),
|
||||||
|
EntityFactory.CreateChapter("Some Special Title", true, new List<MangaFile>(), 10),
|
||||||
|
}),
|
||||||
|
EntityFactory.CreateVolume("1", new List<Chapter>()
|
||||||
|
{
|
||||||
|
EntityFactory.CreateChapter("0", false, new List<MangaFile>(), 6),
|
||||||
|
}),
|
||||||
|
EntityFactory.CreateVolume("2", new List<Chapter>()
|
||||||
|
{
|
||||||
|
EntityFactory.CreateChapter("0", false, new List<MangaFile>(), 7),
|
||||||
|
}),
|
||||||
|
EntityFactory.CreateVolume("3", new List<Chapter>()
|
||||||
|
{
|
||||||
|
EntityFactory.CreateChapter("12", false, new List<MangaFile>(), 5),
|
||||||
|
EntityFactory.CreateChapter("13", false, new List<MangaFile>(), 5),
|
||||||
|
EntityFactory.CreateChapter("14", false, new List<MangaFile>(), 5),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_context.AppUser.Add(new AppUser()
|
||||||
|
{
|
||||||
|
UserName = "majora2007"
|
||||||
|
});
|
||||||
|
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
|
var readerService = new ReaderService(_unitOfWork, Substitute.For<ILogger<ReaderService>>());
|
||||||
|
|
||||||
|
var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync("majora2007", AppUserIncludes.Progress);
|
||||||
|
const int markReadUntilNumber = 47;
|
||||||
|
|
||||||
|
await readerService.MarkChaptersUntilAsRead(user, 1, markReadUntilNumber);
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
|
var volumes = await _unitOfWork.VolumeRepository.GetVolumesDtoAsync(1, 1);
|
||||||
|
Assert.True(volumes.SelectMany(v => v.Chapters).All(c =>
|
||||||
|
{
|
||||||
|
// Specials are ignored.
|
||||||
|
var notReadChapterRanges = new[] {"Some Special Title", "48", "49", "50"};
|
||||||
|
if (notReadChapterRanges.Contains(c.Range))
|
||||||
|
{
|
||||||
|
return c.PagesRead == 0;
|
||||||
|
}
|
||||||
|
// Pages read and total pages must match -> chapter fully read
|
||||||
|
return c.Pages == c.PagesRead;
|
||||||
|
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
@ -394,6 +394,10 @@ namespace API.Controllers
|
|||||||
var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Progress);
|
var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Progress);
|
||||||
user.Progresses ??= new List<AppUserProgress>();
|
user.Progresses ??= new List<AppUserProgress>();
|
||||||
|
|
||||||
|
// Tachiyomi sends chapter 0.0f when there's no chapters read.
|
||||||
|
// Due to the encoding for volumes this marks all chapters in volume 0 (loose chapters) as read so we ignore it
|
||||||
|
if (chapterNumber == 0.0f) return true;
|
||||||
|
|
||||||
if (chapterNumber < 1.0f)
|
if (chapterNumber < 1.0f)
|
||||||
{
|
{
|
||||||
// This is a hack to track volume number. We need to map it back by x100
|
// This is a hack to track volume number. We need to map it back by x100
|
||||||
|
@ -443,7 +443,7 @@ public class ReaderService : IReaderService
|
|||||||
public async Task MarkVolumesUntilAsRead(AppUser user, int seriesId, int volumeNumber)
|
public async Task MarkVolumesUntilAsRead(AppUser user, int seriesId, int volumeNumber)
|
||||||
{
|
{
|
||||||
var volumes = await _unitOfWork.VolumeRepository.GetVolumesForSeriesAsync(new List<int>() { seriesId }, true);
|
var volumes = await _unitOfWork.VolumeRepository.GetVolumesForSeriesAsync(new List<int>() { seriesId }, true);
|
||||||
foreach (var volume in volumes.OrderBy(v => v.Number).Where(v => v.Number <= volumeNumber))
|
foreach (var volume in volumes.OrderBy(v => v.Number).Where(v => v.Number <= volumeNumber && v.Number > 0))
|
||||||
{
|
{
|
||||||
MarkChaptersAsRead(user, volume.SeriesId, volume.Chapters);
|
MarkChaptersAsRead(user, volume.SeriesId, volume.Chapters);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user