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<IDirectoryService>(),
Substitute.For<IScrobblingService>()); // Do not use the actual one Substitute.For<IScrobblingService>()); // Do not use the actual one
_readerService = new ReaderService(UnitOfWork, _hookedUpReaderService = new ReaderService(UnitOfWork,
Substitute.For<ILogger<ReaderService>>(), Substitute.For<ILogger<ReaderService>>(),
Substitute.For<IEventHub>(), Substitute.For<IEventHub>(),
Substitute.For<IImageService>(), Substitute.For<IImageService>(),
@ -286,6 +286,36 @@ public class ScrobblingServiceTests : AbstractDbTest
Assert.Empty(events); 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] [Fact]
public async Task ScrobbleReadingUpdate_UpdateExistingNotIsProcessed() 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); _logger.LogInformation("Processing Scrobbling reading event for {AppUserId} on {SeriesName}", userId, series.Name);
if (await CheckIfCannotScrobble(userId, seriesId, series)) return; 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 // Check if there is an existing not yet processed event, if so update it
var existingEvt = await _unitOfWork.ScrobbleRepository.GetEvent(userId, series.Id, var existingEvt = await _unitOfWork.ScrobbleRepository.GetEvent(userId, series.Id,
ScrobbleEventType.ChapterRead, true); ScrobbleEventType.ChapterRead, true);
if (existingEvt is {IsProcessed: false}) 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 // We need to just update Volume/Chapter number
var prevChapter = $"{existingEvt.ChapterNumber}"; var prevChapter = $"{existingEvt.ChapterNumber}";
var prevVol = $"{existingEvt.VolumeNumber}"; var prevVol = $"{existingEvt.VolumeNumber}";
existingEvt.VolumeNumber = existingEvt.VolumeNumber = volumeNumber;
(int) await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadVolumeForSeries(seriesId, userId); existingEvt.ChapterNumber = chapterNumber;
existingEvt.ChapterNumber =
await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadChapterForSeries(seriesId, userId);
_unitOfWork.ScrobbleRepository.Update(existingEvt); _unitOfWork.ScrobbleRepository.Update(existingEvt);
await _unitOfWork.CommitAsync(); await _unitOfWork.CommitAsync();
@ -475,9 +483,15 @@ public class ScrobblingService : IScrobblingService
return; return;
} }
if (volumeNumber == 0 && chapterNumber == 0)
{
// Do not create a new scrobble event if there is no progress
return;
}
try try
{ {
var evt = new ScrobbleEvent() var evt = new ScrobbleEvent
{ {
SeriesId = series.Id, SeriesId = series.Id,
LibraryId = series.LibraryId, LibraryId = series.LibraryId,
@ -485,10 +499,8 @@ public class ScrobblingService : IScrobblingService
AniListId = GetAniListId(series), AniListId = GetAniListId(series),
MalId = GetMalId(series), MalId = GetMalId(series),
AppUserId = userId, AppUserId = userId,
VolumeNumber = VolumeNumber = volumeNumber,
(int) await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadVolumeForSeries(seriesId, userId), ChapterNumber = chapterNumber,
ChapterNumber =
await _unitOfWork.AppUserProgressRepository.GetHighestFullyReadChapterForSeries(seriesId, userId),
Format = series.Library.Type.ConvertToPlusMediaFormat(series.Format), Format = series.Library.Type.ConvertToPlusMediaFormat(series.Format),
}; };