80 lines
3.2 KiB
C#
80 lines
3.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using ProjectQuint.Core.Progression;
|
|
using ProjectQuint.Library;
|
|
using ProjectQuint.Persistence;
|
|
|
|
namespace ProjectQuint.Bootstrap
|
|
{
|
|
internal sealed class ProfileRatingThumbnailCatalog
|
|
{
|
|
private long _sourceSignature = long.MinValue;
|
|
public IReadOnlyList<SongLibraryEntry> Songs { get; private set; } = Array.Empty<SongLibraryEntry>();
|
|
public int Revision { get; private set; }
|
|
|
|
public void Refresh(IReadOnlyList<RatingSummary> contexts,
|
|
IReadOnlyList<SongLibraryEntry> activeSongs, int songsRevision, BmsPackRegistry registry)
|
|
{
|
|
var requestedChartIds = new HashSet<string>(StringComparer.Ordinal);
|
|
foreach (var context in contexts ?? Array.Empty<RatingSummary>())
|
|
{
|
|
foreach (var entry in context.BestPlays ?? Array.Empty<RatingChartEntry>())
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(entry.ChartId))
|
|
requestedChartIds.Add(entry.ChartId);
|
|
}
|
|
}
|
|
|
|
var signature = 17L;
|
|
unchecked
|
|
{
|
|
signature = signature * 31 + (songsRevision);
|
|
foreach (var chartId in requestedChartIds.OrderBy(id => id, StringComparer.Ordinal))
|
|
signature = signature * 31 + StringComparer.Ordinal.GetHashCode(chartId);
|
|
foreach (var pack in registry?.Packs ?? Array.Empty<BmsPackDefinition>())
|
|
{
|
|
var cachePath = registry.CachePathFor(pack);
|
|
var cache = new FileInfo(cachePath);
|
|
signature = signature * 31 + StringComparer.OrdinalIgnoreCase.GetHashCode(pack.Id ?? string.Empty);
|
|
signature = signature * 31 + (cache.Exists ? cache.Length : 0L);
|
|
signature = signature * 31 + (cache.Exists ? cache.LastWriteTimeUtc.Ticks : 0L);
|
|
}
|
|
}
|
|
if (signature == _sourceSignature)
|
|
return;
|
|
|
|
var songsByChartId = new Dictionary<string, SongLibraryEntry>(StringComparer.Ordinal);
|
|
void AddSong(SongLibraryEntry song)
|
|
{
|
|
if (song == null)
|
|
return;
|
|
var chartId = ChartIdentityResolver.Resolve(song).Value;
|
|
if (requestedChartIds.Contains(chartId) && !songsByChartId.ContainsKey(chartId))
|
|
songsByChartId.Add(chartId, song);
|
|
}
|
|
|
|
foreach (var song in activeSongs ?? Array.Empty<SongLibraryEntry>())
|
|
AddSong(song);
|
|
foreach (var pack in registry?.Packs ?? Array.Empty<BmsPackDefinition>())
|
|
{
|
|
foreach (var song in SongLibraryScanner.LoadCachedThumbnailEntries(
|
|
registry.CachePathFor(pack),
|
|
pack.ContentRoot,
|
|
pack.Id,
|
|
requestedChartIds))
|
|
AddSong(song);
|
|
}
|
|
|
|
Songs = songsByChartId.Values.ToArray();
|
|
_sourceSignature = signature;
|
|
unchecked
|
|
{
|
|
Revision++;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|