Do not scrobble reading updates to Volume 0, Chapter 0

This commit is contained in:
Amelia 2025-06-16 17:08:31 +02:00
parent 6642f96d8f
commit 1a4aa215d6
No known key found for this signature in database
GPG key ID: D6D0ECE365407EAA
2 changed files with 52 additions and 10 deletions

View file

@ -66,7 +66,7 @@ public class ScrobblingServiceTests : AbstractDbTest
Substitute.For<IDirectoryService>(),
Substitute.For<IScrobblingService>()); // Do not use the actual one
_readerService = new ReaderService(UnitOfWork,
_hookedUpReaderService = new ReaderService(UnitOfWork,
Substitute.For<ILogger<ReaderService>>(),
Substitute.For<IEventHub>(),
Substitute.For<IImageService>(),
@ -286,6 +286,36 @@ public class ScrobblingServiceTests : AbstractDbTest
Assert.Empty(events);
}
[Fact]
public async Task ScrobbleReadingUpdate_RemoveWhenNoProgress()
{
await ResetDb();
await SeedData();
_licenseService.HasActiveLicense().Returns(true);
var user = await UnitOfWork.UserRepository.GetUserByIdAsync(1);
Assert.NotNull(user);
await _service.ScrobbleReadingUpdate(1, 1);
var events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
Assert.Empty(events);
await _hookedUpReaderService.MarkSeriesAsUnread(user, 1);
await UnitOfWork.CommitAsync();
// Existing event is deleted
events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
Assert.Empty(events);
await _hookedUpReaderService.MarkSeriesAsUnread(user, 1);
await UnitOfWork.CommitAsync();
// No new events are added
events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
Assert.Empty(events);
}
[Fact]
public async Task ScrobbleReadingUpdate_UpdateExistingNotIsProcessed()
{

View file

@ -453,19 +453,27 @@ public class ScrobblingService : IScrobblingService
_logger.LogInformation("Processing Scrobbling reading event for {AppUserId} on {SeriesName}", userId, series.Name);
if (await CheckIfCannotScrobble(userId, seriesId, series)) return;
var volumeNumber = (int) await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadVolumeForSeries(seriesId, userId);
var chapterNumber = await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadChapterForSeries(seriesId, userId);
// Check if there is an existing not yet processed event, if so update it
var existingEvt = await _unitOfWork.ScrobbleRepository.GetEvent(userId, series.Id,
ScrobbleEventType.ChapterRead, true);
if (existingEvt is {IsProcessed: false})
{
if (volumeNumber == 0 && chapterNumber == 0)
{
_unitOfWork.ScrobbleRepository.Remove(existingEvt);
await _unitOfWork.CommitAsync();
_logger.LogDebug("Removed scrobble event for {Series} as there is no reading progress", series.Name);
}
// We need to just update Volume/Chapter number
var prevChapter = $"{existingEvt.ChapterNumber}";
var prevVol = $"{existingEvt.VolumeNumber}";
existingEvt.VolumeNumber =
(int) await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadVolumeForSeries(seriesId, userId);
existingEvt.ChapterNumber =
await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadChapterForSeries(seriesId, userId);
existingEvt.VolumeNumber = volumeNumber;
existingEvt.ChapterNumber = chapterNumber;
_unitOfWork.ScrobbleRepository.Update(existingEvt);
await _unitOfWork.CommitAsync();
@ -475,9 +483,15 @@ public class ScrobblingService : IScrobblingService
return;
}
if (volumeNumber == 0 && chapterNumber == 0)
{
// Do not create a new scrobble event if there is no progress
return;
}
try
{
var evt = new ScrobbleEvent()
var evt = new ScrobbleEvent
{
SeriesId = series.Id,
LibraryId = series.LibraryId,
@ -485,10 +499,8 @@ public class ScrobblingService : IScrobblingService
AniListId = GetAniListId(series),
MalId = GetMalId(series),
AppUserId = userId,
VolumeNumber =
(int) await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadVolumeForSeries(seriesId, userId),
ChapterNumber =
await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadChapterForSeries(seriesId, userId),
VolumeNumber = volumeNumber,
ChapterNumber = chapterNumber,
Format = series.Library.Type.ConvertToPlusMediaFormat(series.Format),
};