Refactor ILibraryService and LibraryService to support new metadata handling features, including remote image management and enhanced label summaries. Update LabelSummary to include ImagePath for better visual representation. Revise MetadataMatchViewModel and MetadataScanViewModel to accommodate new image loading logic. Enhance README.md to document these updates and new functionalities.

This commit is contained in:
Leonid Pershin
2026-08-10 09:25:41 +03:00
parent 9e239e045f
commit b82b0b4555
38 changed files with 4661 additions and 3316 deletions
@@ -0,0 +1,169 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using PLib.Infrastructure.Persistence;
#nullable disable
namespace PLib.Infrastructure.Persistence.Migrations
{
[DbContext(typeof(LibraryDbContext))]
[Migration("20260810054626_LabelImages")]
partial class LabelImages
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "10.0.10");
modelBuilder.Entity("LibraryLabelVideoItem", b =>
{
b.Property<Guid>("LabelsId")
.HasColumnType("TEXT");
b.Property<Guid>("VideosId")
.HasColumnType("TEXT");
b.HasKey("LabelsId", "VideosId");
b.HasIndex("VideosId");
b.ToTable("VideoLabels", (string)null);
});
modelBuilder.Entity("PLib.Domain.Videos.LibraryLabel", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<long>("CreatedAt")
.HasColumnType("INTEGER");
b.Property<string>("ImagePath")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<string>("Kind")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("TEXT");
b.Property<string>("NormalizedName")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("Kind", "NormalizedName")
.IsUnique();
b.ToTable("Labels", (string)null);
});
modelBuilder.Entity("PLib.Domain.Videos.VideoItem", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");
b.Property<long>("AddedAt")
.HasColumnType("INTEGER");
b.Property<string>("Description")
.HasColumnType("TEXT");
b.Property<TimeSpan?>("Duration")
.HasColumnType("TEXT");
b.Property<long>("FileModifiedAt")
.HasColumnType("INTEGER");
b.Property<string>("FullPath")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<int?>("Height")
.HasColumnType("INTEGER");
b.Property<long?>("LastPlayedAt")
.HasColumnType("INTEGER");
b.Property<long?>("PerceptualHash")
.HasColumnType("INTEGER");
b.Property<int>("PlayCount")
.HasColumnType("INTEGER");
b.Property<int>("PreviewFrameCount")
.HasColumnType("INTEGER");
b.Property<string>("PreviewPath")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<TimeSpan?>("ResumePosition")
.HasColumnType("TEXT");
b.Property<long>("SizeInBytes")
.HasColumnType("INTEGER");
b.Property<string>("ThumbnailPath")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("TEXT");
b.Property<string>("VideoCodec")
.HasMaxLength(64)
.HasColumnType("TEXT");
b.Property<int?>("Width")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("AddedAt");
b.HasIndex("FullPath")
.IsUnique();
b.HasIndex("LastPlayedAt");
b.HasIndex("PerceptualHash");
b.ToTable("Videos", (string)null);
});
modelBuilder.Entity("LibraryLabelVideoItem", b =>
{
b.HasOne("PLib.Domain.Videos.LibraryLabel", null)
.WithMany()
.HasForeignKey("LabelsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("PLib.Domain.Videos.VideoItem", null)
.WithMany()
.HasForeignKey("VideosId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}