timeline rendering
This commit is contained in:
@@ -32,8 +32,10 @@ public class FileScannerService(MediaService mediaService, IConfiguration config
|
||||
{
|
||||
if (_isRunning)
|
||||
return;
|
||||
logger.LogInformation("Starting file scan");
|
||||
_isRunning = true;
|
||||
ScanFilesAsync(path).Wait();
|
||||
logger.LogInformation("File scan complete");
|
||||
_isRunning = false;
|
||||
}, null, TimeSpan.FromMinutes(0), TimeSpan.FromHours(1));
|
||||
return Task.CompletedTask;
|
||||
@@ -57,7 +59,7 @@ public class FileScannerService(MediaService mediaService, IConfiguration config
|
||||
foreach (var chunk in files.Chunk(50))
|
||||
{
|
||||
total += await ScanFileChunkAsync(path, chunk, existingFiles, cancellationToken);
|
||||
logger.LogInformation("Added {updated} of {count}", total, existingFiles.Count);
|
||||
logger.LogInformation("Added {updated} of {count}", total, files.Length);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -80,7 +82,7 @@ public class FileScannerService(MediaService mediaService, IConfiguration config
|
||||
var isUpgrade = false;
|
||||
if (existingFiles.TryGetValue(relativePath, out var version))
|
||||
{
|
||||
if (version < MediaEntry.CUR_VERSION)
|
||||
if (version <= MediaEntry.CUR_VERSION)
|
||||
continue;
|
||||
isUpgrade = true;
|
||||
}
|
||||
@@ -111,7 +113,7 @@ public class FileScannerService(MediaService mediaService, IConfiguration config
|
||||
{
|
||||
await mediaService.DeleteAllEntriesAsync(upgradeEntries.Select(e => e.Filepath), cancellationToken);
|
||||
await mediaService.AddMediaBulkAsync(upgradeEntries, cancellationToken);
|
||||
logger.LogInformation("Upgraded {count} file entries", entries.Count);
|
||||
logger.LogInformation("Upgraded {count} file entries", upgradeEntries.Count);
|
||||
}
|
||||
return entries.Count + upgradeEntries.Count;
|
||||
}
|
||||
@@ -143,9 +145,16 @@ public class FileScannerService(MediaService mediaService, IConfiguration config
|
||||
|
||||
private static Maybe<MediaMetadata> ReadVideoMetadata(string filePath)
|
||||
{
|
||||
var info = FFProbe.Analyse(filePath);
|
||||
if (info.PrimaryVideoStream == null)
|
||||
return new Error($"Could not find a primirary video stream in file.");
|
||||
return new MediaMetadata((int)info.Duration.TotalSeconds, info.PrimaryVideoStream.Height, info.PrimaryVideoStream.Width);
|
||||
try
|
||||
{
|
||||
var info = FFProbe.Analyse(filePath);
|
||||
if (info.PrimaryVideoStream == null)
|
||||
return new Error($"Could not find a primirary video stream in file.");
|
||||
return new MediaMetadata((int)info.Duration.TotalSeconds, info.PrimaryVideoStream.Height, info.PrimaryVideoStream.Width);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
return ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@ public class MediaService(IMongoDatabase db)
|
||||
public readonly IMongoCollection<MediaEntry> _entries = db.GetCollection<MediaEntry>("media");
|
||||
|
||||
[BsonIgnoreExtraElements]
|
||||
private record MediaInfo(string FilePath, int Version);
|
||||
private record class MediaInfo(string Filepath, int Version);
|
||||
public async Task<FrozenDictionary<string, int>> GetExistingFilePathsAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
var files = await _entries.Find("{}").As<MediaInfo>().ToListAsync(cancellationToken);
|
||||
if (files.Count == 0)
|
||||
return FrozenDictionary<string, int>.Empty;
|
||||
return files.ToFrozenDictionary(m => m.FilePath, m => m.Version);
|
||||
return files.ToFrozenDictionary(m => m.Filepath, m => m.Version);
|
||||
}
|
||||
|
||||
public async Task AddMediaBulkAsync(List<MediaEntry> entries, CancellationToken cancellationToken = default)
|
||||
|
||||
Reference in New Issue
Block a user