Simplify pk calculation to work for all file types

Simplified the FLAC pk collision fix to work uniformly for all files:
- Always read up to 1024 bytes (or whatever is available)
- Use at most the last 512 bytes for pk calculation

This approach works correctly for:
- Small files (< 512 bytes, e.g., tiny images): uses all content
- Medium files (512-1024 bytes): uses bytes after 512
- Large files (>= 1024 bytes, e.g., FLAC): uses bytes 512-1024

No special detection needed - the algorithm adapts automatically.
Fixes potential issues with small images in pmocovers cache.
This commit is contained in:
Claude
2025-11-07 06:26:27 +00:00
parent 3bd2a33497
commit 64586721b9

View File

@@ -387,22 +387,22 @@ impl<C: CacheConfig> Cache<C> {
where
R: AsyncRead + Send + Unpin + 'static,
{
// 1. Lire les premiers octets pour calculer le pk
// Pour éviter les collisions entre fichiers FLAC au même format, on skip le header (512 octets)
// et on utilise les octets 512-1024 (début du contenu audio) pour calculer le pk
let buffer_size = if explicit_pk.is_none() { 1024 } else { 512 };
let header = crate::download::peek_reader_header(&mut reader, buffer_size)
// 1. Lire jusqu'à 1024 octets (ou ce qui est disponible)
let header = crate::download::peek_reader_header(&mut reader, 1024)
.await
.map_err(|e| anyhow!("Failed to peek reader header: {}", e))?;
// 2. Calculer le pk: si pas de pk explicite, utiliser octets 512-1024 au lieu de 0-512
// 2. Calculer le pk en utilisant au plus les 512 derniers octets
// Ceci évite les collisions pour les fichiers avec headers identiques (ex: FLAC)
// tout en fonctionnant pour les petits fichiers (images < 512 octets)
let pk = if let Some(explicit) = explicit_pk {
explicit
} else {
// Skip les 512 premiers octets (header FLAC) et utiliser les 512 suivants
let pk_bytes = if header.len() > 512 {
// Fichier >= 512 octets: utiliser les octets 512+ (au plus 512 octets)
&header[512..]
} else {
// Petit fichier < 512 octets: utiliser tout le contenu
&header[..]
};
crate::cache_trait::pk_from_content_header(pk_bytes)