makes album sync work
PiwigoDirectorySync/pipeline/head This commit looks good Details

This commit is contained in:
Philipp Häfelfinger 2023-08-31 23:24:19 +02:00
parent b67f85cd85
commit f86cacac20
2 changed files with 53 additions and 6 deletions

View File

@ -18,4 +18,9 @@ public static class ExtensionMethods
{
return await dbSet.Where(a => a.ServerId == piwigoServerId && a.ServerAlbumId == serverAlbumId).FirstOrDefaultAsync(ct);
}
public static Task<AlbumEntity> GetByIdAsync(this DbSet<AlbumEntity> dbSet, int serverId, CancellationToken ct)
{
return dbSet.Where(a => a.Id == serverId).FirstAsync(ct);
}
}

View File

@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Piwigo.Client;
using Piwigo.Client.Albums;
using PiwigoDirectorySync.Infrastructure;
@ -30,16 +31,38 @@ public class AlbumSynchronizer : IAlbumSynchronizer
var piwigoClient = await _piwigoClientFactory.GetPiwigoClientAsync(piwigoServer, ct);
await UpdatePiwigoAlbumsFromServerAsync(dbContext, piwigoClient, piwigoServer, ct);
await AddMissingAlbumsToServerAsync(dbContext, piwigoClient, piwigoServer, ct);
}
private static async Task UpdatePiwigoAlbumsFromServerAsync(PersistenceContext dbContext, IPiwigoClient piwigoClient, ServerEntity piwigoServer, CancellationToken ct)
private static async Task AddMissingAlbumsToServerAsync(PersistenceContext dbContext, IPiwigoClient piwigoClient, ServerEntity piwigoServer, CancellationToken ct)
{
var albumsToCreate = await dbContext.PiwigoAlbums.Where(a => a.ServerAlbumId == null && a.ServerId == piwigoServer.Id)
.OrderBy(a => a.Path)
.Select(a => a.Id)
.ToListAsync(ct);
foreach (var albumId in albumsToCreate)
{
var albumEntity = await dbContext.PiwigoAlbums.GetByIdAsync(albumId, ct);
var piwigoParentId = albumEntity.ParentId.HasValue ? (await dbContext.PiwigoAlbums.GetByIdAsync(albumEntity.ParentId.Value, ct)).ServerAlbumId : null;
albumEntity.ServerAlbumId = await piwigoClient.Album.AddAsync(albumEntity.Name, piwigoParentId, visible: true, position: AlbumPosition.First,
status: AlbumStatus.Public, cancellationToken: ct);
await dbContext.SaveChangesAsync(ct);
}
}
private async Task UpdatePiwigoAlbumsFromServerAsync(PersistenceContext dbContext, IPiwigoClient piwigoClient, ServerEntity piwigoServer, CancellationToken ct)
{
var serverAlbums = await piwigoClient.Album.GetListAsync(null, true, false, ThumbnailSize.Thumb, ct);
var serverAlbumDictionary = serverAlbums.ToDictionary(a => a.Id, a => a);
foreach (var serverAlbum in serverAlbums)
{
var albumEntity = await GetOrAddPiwigoAlbumEntityAsync(dbContext, piwigoServer, serverAlbum, serverAlbumDictionary, ct);
_logger.LogInformation("Updating piwigo server album {ServerAlbumName} with piwigo id {ServerAlbumId}", serverAlbum.Name, serverAlbum.Id);
var albumEntity = await GetOrAddPiwigoAlbumEntityFromServerAsync(dbContext, piwigoServer, serverAlbum, serverAlbumDictionary, ct);
if (serverAlbum.IdUpperCat.HasValue)
{
albumEntity.ParentId = (await dbContext.PiwigoAlbums.FindByServerIdAsync(piwigoServer.Id, serverAlbum.IdUpperCat.Value, ct))?.Id;
@ -49,12 +72,27 @@ public class AlbumSynchronizer : IAlbumSynchronizer
}
}
private static async Task<AlbumEntity> GetOrAddPiwigoAlbumEntityAsync(PersistenceContext dbContext, ServerEntity piwigoServer, Album serverAlbum,
private async Task<AlbumEntity> GetOrAddPiwigoAlbumEntityFromServerAsync(PersistenceContext dbContext, ServerEntity piwigoServer, Album serverAlbum,
IDictionary<int, Album> serverAlbumDictionary, CancellationToken ct)
{
// Already synchronized so it is easy to return
var albumEntity = await dbContext.PiwigoAlbums.FindByServerIdAsync(piwigoServer.Id, serverAlbum.Id, ct);
if (albumEntity != null)
{
_logger.LogDebug("Found existing album {AlbumEntityName} with local id {AlbumEntityId} and piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id,
albumEntity.ServerAlbumId);
return albumEntity;
}
// might exist already as the file system got scanned and created the local entries
// In this case we save the server id in our local album and link them.
var path = GeneratePath(serverAlbum, serverAlbumDictionary);
albumEntity = await dbContext.PiwigoAlbums.FindByServerAndPathAsync(piwigoServer.Id, path, ct);
if (albumEntity != null)
{
albumEntity.ServerAlbumId = serverAlbum.Id;
_logger.LogInformation("Linking existing album {AlbumEntityName} with local id {AlbumEntityId} to piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id,
albumEntity.ServerAlbumId);
return albumEntity;
}
@ -64,14 +102,16 @@ public class AlbumSynchronizer : IAlbumSynchronizer
Server = piwigoServer,
Name = serverAlbum.Name,
ServerAlbumId = serverAlbum.Id,
Path = GeneratePath(serverAlbum, serverAlbumDictionary)
Path = path
};
_logger.LogInformation("Adding piwigo album {AlbumEntityName} with local id {AlbumEntityId} and piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id,
albumEntity.ServerAlbumId);
dbContext.PiwigoAlbums.Add(albumEntity);
return albumEntity;
}
private static string GeneratePath(Album serverAlbum, IDictionary<int, Album> serverAlbumDictionary)
private string GeneratePath(Album serverAlbum, IDictionary<int, Album> serverAlbumDictionary)
{
if (!serverAlbum.IdUpperCat.HasValue)
{
@ -87,6 +127,8 @@ public class AlbumSynchronizer : IAlbumSynchronizer
parentId = currentParent.IdUpperCat ?? 0;
}
_logger.LogDebug("Generated path {Path} for album with piwigo id {ServerAlbumId}", path, serverAlbum.Id);
return path;
}
}