diff --git a/Jellyfin.HardwareVisualizer/Server/Migrations/20240313175208_AddProcessedProperty.Designer.cs b/Jellyfin.HardwareVisualizer/Server/Migrations/20240313175208_AddProcessedProperty.Designer.cs
new file mode 100644
index 0000000..9b8103c
--- /dev/null
+++ b/Jellyfin.HardwareVisualizer/Server/Migrations/20240313175208_AddProcessedProperty.Designer.cs
@@ -0,0 +1,996 @@
+//
+using System;
+using Jellyfin.HardwareVisualizer.Server.Database;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Jellyfin.HardwareVisualizer.Server.Migrations
+{
+ [DbContext(typeof(HardwareVisualizerDataContext))]
+ [Migration("20240313175208_AddProcessedProperty")]
+ partial class AddProcessedProperty
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.CpuType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Identifier")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Vendor")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("CpuTypes");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.FfmpegVersion", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("HashMd5")
+ .HasColumnType("text");
+
+ b.Property("HashSha256")
+ .HasColumnType("text");
+
+ b.Property("PlatformId")
+ .HasColumnType("uuid");
+
+ b.Property("Source")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("VersionGroup")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlatformId");
+
+ b.ToTable("FfmpegVersions");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("a3f734be-fb92-4a1f-bd8c-b6701e0f7e9f"),
+ HashSha256 = "47f4ea0da73f7835748c4549004877eb9abc6070",
+ PlatformId = new Guid("2c361be8-c0ec-4020-984b-66c620dad840"),
+ Source = "https://repo.jellyfin.org/releases/server/windows/versions/jellyfin-ffmpeg/5.1.4-3/jellyfin-ffmpeg_5.1.4-3-portable_win64.zip",
+ Version = "5.1.6-3",
+ VersionGroup = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f")
+ },
+ new
+ {
+ Id = new Guid("2c720157-f8fb-48c9-8686-d4dfe7daae9a"),
+ HashSha256 = "dbe5bf6d194abfec209e8ec3d25d526d12b1d51638902535fb2df233aedb62c2",
+ PlatformId = new Guid("8d58b84b-73dc-4275-985d-123abe886818"),
+ Source = "https://repo.jellyfin.org/releases/server/ubuntu/versions/jellyfin-ffmpeg/6.0.1-2/jellyfin-ffmpeg6_6.0.1-2-focal_amd64.deb",
+ Version = "6.0.1-2",
+ VersionGroup = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f")
+ });
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.GpuType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Identifier")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Vendor")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("GpuTypes");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareCodec", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Identifier")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("HardwareCodecs");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("bf2065dc-9b03-48b8-9a30-206a12a6319c"),
+ Identifier = "h264",
+ Name = "H264"
+ },
+ new
+ {
+ Id = new Guid("104537db-e1e2-4490-a82a-afaede9a8fd4"),
+ Identifier = "h265",
+ Name = "HVEC"
+ });
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareDisplay", b =>
+ {
+ b.Property("HardwareCodec")
+ .HasColumnType("text");
+
+ b.Property("ToResolution")
+ .HasColumnType("text");
+
+ b.Property("FromResolution")
+ .HasColumnType("text");
+
+ b.Property("DeviceType")
+ .HasColumnType("integer");
+
+ b.Property("DeviceName")
+ .HasColumnType("text");
+
+ b.Property("Diviation")
+ .HasColumnType("real");
+
+ b.Property("MaxStreams")
+ .HasColumnType("double precision");
+
+ b.HasKey("HardwareCodec", "ToResolution", "FromResolution", "DeviceType", "DeviceName");
+
+ b.ToTable("HardwareDisplays");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareSurveyEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("CpuTypeId")
+ .HasColumnType("uuid");
+
+ b.Property("FromResolutionId")
+ .HasColumnType("uuid");
+
+ b.Property("GpuTypeId")
+ .HasColumnType("uuid");
+
+ b.Property("HardwareCodecId")
+ .HasColumnType("uuid");
+
+ b.Property("HardwareSurveySubmissionId")
+ .HasColumnType("uuid");
+
+ b.Property("MaxStreams")
+ .HasColumnType("integer");
+
+ b.Property("Processed")
+ .HasColumnType("boolean");
+
+ b.Property("ToResolutionId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CpuTypeId");
+
+ b.HasIndex("FromResolutionId");
+
+ b.HasIndex("GpuTypeId");
+
+ b.HasIndex("HardwareCodecId");
+
+ b.HasIndex("HardwareSurveySubmissionId");
+
+ b.HasIndex("ToResolutionId");
+
+ b.ToTable("HardwareSurveyEntries");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareSurveySubmission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("RawSurveySubmissionId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RawSurveySubmissionId");
+
+ b.ToTable("HardwareSurveySubmissions");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.MediaTestFile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("AudioCodec")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Bitrate")
+ .HasColumnType("bigint");
+
+ b.Property("HashMd5")
+ .HasColumnType("text");
+
+ b.Property("HashSha256")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("Size")
+ .HasColumnType("bigint");
+
+ b.Property("SourceUrl")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("VideoCodec")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("MediaTestFiles");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ AudioCodec = "",
+ Bitrate = 120L,
+ HashMd5 = "",
+ HashSha256 = "",
+ Name = "jellyfish-120-mbps-4k-uhd-hevc-10bit",
+ Size = 429L,
+ SourceUrl = "https://repo.jellyfin.org/jellyfish/media/jellyfish-120-mbps-4k-uhd-hevc-10bit.mkv",
+ VideoCodec = "HEVC"
+ },
+ new
+ {
+ Id = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ AudioCodec = "",
+ Bitrate = 120L,
+ HashMd5 = "",
+ HashSha256 = "",
+ Name = "jellyfish-120-mbps-4k-uhd-h264",
+ Size = 431L,
+ SourceUrl = "https://repo.jellyfin.org/jellyfish/media/jellyfish-120-mbps-4k-uhd-h264.mkv",
+ VideoCodec = "h264"
+ },
+ new
+ {
+ Id = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ AudioCodec = "",
+ Bitrate = 40L,
+ HashMd5 = "",
+ HashSha256 = "",
+ Name = "jellyfish-40-mbps-hd-hevc-10bit",
+ Size = 143L,
+ SourceUrl = "https://repo.jellyfin.org/jellyfish/media/jellyfish-40-mbps-hd-hevc-10bit.mkv",
+ VideoCodec = "HEVC"
+ },
+ new
+ {
+ Id = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ AudioCodec = "",
+ Bitrate = 40L,
+ HashMd5 = "",
+ HashSha256 = "",
+ Name = "jellyfish-40-mbps-hd-h264",
+ Size = 142L,
+ SourceUrl = "https://repo.jellyfin.org/jellyfish/media/jellyfish-40-mbps-hd-h264.mkv",
+ VideoCodec = "h264"
+ });
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.Platform", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ReplacementId")
+ .HasColumnType("text");
+
+ b.Property("Supported")
+ .HasColumnType("boolean");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("Version")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("VersionId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Platform");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("2c361be8-c0ec-4020-984b-66c620dad840"),
+ DisplayName = "Windows 11",
+ Name = "Windows 11",
+ Supported = true,
+ Type = 0,
+ Version = "Windows 11 version 23H2",
+ VersionId = "22631"
+ },
+ new
+ {
+ Id = new Guid("8d58b84b-73dc-4275-985d-123abe886818"),
+ DisplayName = "Ubuntu Focal",
+ Name = "Ubuntu",
+ Supported = true,
+ Type = 1,
+ Version = "Ubuntu",
+ VersionId = "22.04"
+ });
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.RawSurveySubmission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Json")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("RawSurveySubmission");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.TestCase", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Bitrate")
+ .HasColumnType("bigint");
+
+ b.Property("FromResolution")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("MediaTestFileId")
+ .HasColumnType("uuid");
+
+ b.Property("TestCaseType")
+ .HasColumnType("integer");
+
+ b.Property("ToResolution")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaTestFileId");
+
+ b.ToTable("TestCases");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("c7f40068-5e43-aa02-c27c-4fd927fc2227"),
+ Bitrate = 79616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("b254896a-12e5-1eef-9af7-227ef036e328"),
+ Bitrate = 9616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("c1d474a5-ba17-69e3-c756-e60d4fa4da45"),
+ Bitrate = 3616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("baf3bb5a-59f6-5524-10d6-2d4c3c84b98b"),
+ Bitrate = 79616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("b3332698-6127-b00f-a6eb-ea8f2ce2cef6"),
+ Bitrate = 9616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("3423dd1d-2943-4c32-4f7f-b1418d962c43"),
+ Bitrate = 3616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("29755a9c-2670-f91d-ac43-130a6f95282d"),
+ Bitrate = 79616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("5f2f3607-8461-6f48-f4e7-63a8afce220f"),
+ Bitrate = 9616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("d2f2a7bf-a56d-f685-bf29-88ff1527dcba"),
+ Bitrate = 3616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("e8a75e65-a3f3-4d92-a45b-84e71a13efab"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("56398356-cd67-18e1-1206-3489c3754ade"),
+ Bitrate = 79616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("c84b0320-56a3-62c0-b138-a037fb4859cc"),
+ Bitrate = 9616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("2b51a90a-cc94-f2a7-c5da-c06770fc3249"),
+ Bitrate = 3616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("11dfaadf-13dc-0016-c3d6-a52e2ca91cc9"),
+ Bitrate = 79616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("197e68ac-1e23-5449-5c59-03c99659f2b4"),
+ Bitrate = 9616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("51585605-4769-f7f0-9251-68be2678c51b"),
+ Bitrate = 3616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("08baf6bd-197d-c126-608b-b583104d6a6a"),
+ Bitrate = 79616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("d629f0e4-ca51-655f-7887-86d2b58b2de3"),
+ Bitrate = 9616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("9f0be794-ea9e-ec37-3096-f1de916ce744"),
+ Bitrate = 3616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("e1e58b15-6664-454c-868a-20442db30557"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("35d9fee7-ee4f-f3ca-9655-8ff692540bd5"),
+ Bitrate = 79616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("28efd25d-ca42-f9cb-b93c-a5bbd981d30b"),
+ Bitrate = 9616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("b7ea429f-f7b1-a593-1d18-08495a415adc"),
+ Bitrate = 3616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("bf801b8a-be7d-1c02-32e0-7c13490f1915"),
+ Bitrate = 79616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("50568481-5469-6623-3f4a-0b2ac2829f78"),
+ Bitrate = 9616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("bd30c9e2-1401-e18d-3fcd-84d17a7f5b0e"),
+ Bitrate = 3616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("d5c7f3fe-09ea-3572-f81a-7f33b3d75ab0"),
+ Bitrate = 79616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("7f310440-5cde-6c14-f774-109bd052ebbf"),
+ Bitrate = 9616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("ce2bfcee-c9ba-d88d-56fa-c5e694592e67"),
+ Bitrate = 3616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("70daebe7-c9fc-4e02-a524-2fc825a49355"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("7690d373-dc4e-a22f-df5a-de76f9d765a5"),
+ Bitrate = 79616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("b645bf2e-8bac-77f6-7759-28e4972dd79d"),
+ Bitrate = 9616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("fd28a846-75c2-1171-cd89-ef5feb17de7f"),
+ Bitrate = 3616000L,
+ FromResolution = "2160p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("d5b81f94-7813-e7bb-dc18-fef5b34b0ab2"),
+ Bitrate = 79616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("502f4082-68ae-b9e3-4e34-e8229c978c5f"),
+ Bitrate = 9616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("774fa97a-0274-cd8a-ed41-20a9767c5e82"),
+ Bitrate = 3616000L,
+ FromResolution = "1080p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ },
+ new
+ {
+ Id = new Guid("aadc3d7e-8ee7-2cd0-3bfe-86df8f994a45"),
+ Bitrate = 79616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "2160p"
+ },
+ new
+ {
+ Id = new Guid("097a9f8c-93fb-803d-b661-636d473a43d2"),
+ Bitrate = 9616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "1080p"
+ },
+ new
+ {
+ Id = new Guid("5fa366d5-e1ba-ec78-d922-3c767caa3e53"),
+ Bitrate = 3616000L,
+ FromResolution = "720p",
+ MediaTestFileId = new Guid("1d943d13-586d-4562-a968-eb1d0ffae947"),
+ TestCaseType = 0,
+ ToResolution = "720p"
+ });
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.TestCaseArgument", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("FfmpegArgument")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("FfmpegVersionGroupId")
+ .HasColumnType("uuid");
+
+ b.Property("FfmpegVersionId")
+ .HasColumnType("uuid");
+
+ b.Property("HardwareCodecId")
+ .HasColumnType("uuid");
+
+ b.Property("TestCaseArgumentDeviceType")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FfmpegVersionId");
+
+ b.HasIndex("HardwareCodecId");
+
+ b.ToTable("TestCaseArguments");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("1c76b8cc-7a23-4c9d-8ed7-9cbf2d741631"),
+ FfmpegArgument = "-c:v h264 -i {video_file} -autoscale 0 -an -sn -vf scale=trunc(min(max(iw\\,ih*a)\\,{scale})/2)*2:trunc(ow/a/2)*2,format=yuv420p -c:v libx264 -preset veryfast -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("bf2065dc-9b03-48b8-9a30-206a12a6319c"),
+ TestCaseArgumentDeviceType = 0
+ },
+ new
+ {
+ Id = new Guid("26b70d55-42e0-4def-8288-f00b562c0d6d"),
+ FfmpegArgument = "-c:v hevc -i {video_file} -autoscale 0 -an -sn -vf scale=trunc(min(max(iw\\,ih*a)\\,{scale})/2)*2:trunc(ow/a/2)*2,format=yuv420p -c:v libx265 -preset veryfast -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("104537db-e1e2-4490-a82a-afaede9a8fd4"),
+ TestCaseArgumentDeviceType = 0
+ },
+ new
+ {
+ Id = new Guid("5535efbb-bcee-4196-961d-7c7358c1c232"),
+ FfmpegArgument = "-init_hw_device cuda=cu:{gpu} -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i {video_file} -autoscale 0 -an -sn -vf scale_cuda=-1:{scale}:yuv420p -c:v h264_nvenc -preset p1 -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("bf2065dc-9b03-48b8-9a30-206a12a6319c"),
+ TestCaseArgumentDeviceType = 1
+ },
+ new
+ {
+ Id = new Guid("a3af8e6a-456a-41c2-91c6-f1a4cde9c7f4"),
+ FfmpegArgument = "-init_hw_device cuda=cu:{gpu} -hwaccel cuda -hwaccel_output_format cuda -c:v hevc_cuvid -i {video_file} -autoscale 0 -an -sn -vf scale_cuda=-1:{scale}:yuv420p -c:v hevc_nvenc -preset p1 -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("104537db-e1e2-4490-a82a-afaede9a8fd4"),
+ TestCaseArgumentDeviceType = 1
+ },
+ new
+ {
+ Id = new Guid("4ff85976-2046-4560-94fd-a79af116f154"),
+ FfmpegArgument = "-init_hw_device vaapi=va:/dev/dri/by-path/{gpu}-render -hwaccel vaapi -hwaccel_output_format vaapi -c:v h264 -i {video_file} -autoscale 0 -an -sn -vf scale_vaapi=-1:{scale}:format=nv12 -c:v h264_vaapi -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("bf2065dc-9b03-48b8-9a30-206a12a6319c"),
+ TestCaseArgumentDeviceType = 2
+ },
+ new
+ {
+ Id = new Guid("2a255052-3128-4e2a-a511-bef273f4889c"),
+ FfmpegArgument = "-init_hw_device vaapi=va:/dev/dri/by-path/{gpu}-render -hwaccel vaapi -hwaccel_output_format vaapi -c:v hevc -i {video_file} -autoscale 0 -an -sn -vf scale_vaapi=-1:{scale}:format=nv12 -c:v hevc_vaapi -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("104537db-e1e2-4490-a82a-afaede9a8fd4"),
+ TestCaseArgumentDeviceType = 2
+ },
+ new
+ {
+ Id = new Guid("49463914-c696-4dca-8f62-c041ec2d8200"),
+ FfmpegArgument = "-init_hw_device vaapi=va:/dev/dri/by-path/{gpu}-render -init_hw_device qsv=qs@va -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i {video_file} -autoscale 0 -an -sn -vf scale_qsv=-1:{scale}:format=nv12 -c:v h264_qsv -preset veryfast -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("bf2065dc-9b03-48b8-9a30-206a12a6319c"),
+ TestCaseArgumentDeviceType = 3
+ },
+ new
+ {
+ Id = new Guid("ec73eeb5-e095-40f5-8b84-4d2307f13bfd"),
+ FfmpegArgument = "-init_hw_device vaapi=va:/dev/dri/by-path/{gpu}-render -init_hw_device qsv=qs@va -hwaccel qsv -hwaccel_output_format qsv -c:v hevc_qsv -i {video_file} -autoscale 0 -an -sn -vf scale_qsv=-1:{scale}:format=nv12 -c:v hevc_qsv -preset veryfast -b:v {bitrate} -maxrate {bitrate} -f null - -benchmark",
+ FfmpegVersionGroupId = new Guid("9f9565f1-4661-484b-8c80-433bc909e70f"),
+ HardwareCodecId = new Guid("104537db-e1e2-4490-a82a-afaede9a8fd4"),
+ TestCaseArgumentDeviceType = 3
+ });
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.TestResolution", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Identifier")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("TestResolutions");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.FfmpegVersion", b =>
+ {
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.Platform", "Platform")
+ .WithMany()
+ .HasForeignKey("PlatformId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Platform");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareSurveyEntry", b =>
+ {
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.CpuType", "CpuType")
+ .WithMany()
+ .HasForeignKey("CpuTypeId");
+
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.TestResolution", "FromResolution")
+ .WithMany()
+ .HasForeignKey("FromResolutionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.GpuType", "GpuType")
+ .WithMany()
+ .HasForeignKey("GpuTypeId");
+
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.HardwareCodec", "HardwareCodec")
+ .WithMany()
+ .HasForeignKey("HardwareCodecId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.HardwareSurveySubmission", "HardwareSurveySubmission")
+ .WithMany("HardwareSurveyEntry")
+ .HasForeignKey("HardwareSurveySubmissionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.TestResolution", "ToResolution")
+ .WithMany()
+ .HasForeignKey("ToResolutionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("CpuType");
+
+ b.Navigation("FromResolution");
+
+ b.Navigation("GpuType");
+
+ b.Navigation("HardwareCodec");
+
+ b.Navigation("HardwareSurveySubmission");
+
+ b.Navigation("ToResolution");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareSurveySubmission", b =>
+ {
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.RawSurveySubmission", "RawSurveySubmission")
+ .WithMany()
+ .HasForeignKey("RawSurveySubmissionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("RawSurveySubmission");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.TestCase", b =>
+ {
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.MediaTestFile", "MediaTestFile")
+ .WithMany("TestCases")
+ .HasForeignKey("MediaTestFileId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("MediaTestFile");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.TestCaseArgument", b =>
+ {
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.FfmpegVersion", null)
+ .WithMany("TestCaseArguments")
+ .HasForeignKey("FfmpegVersionId");
+
+ b.HasOne("Jellyfin.HardwareVisualizer.Server.Database.HardwareCodec", "HardwareCodec")
+ .WithMany()
+ .HasForeignKey("HardwareCodecId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("HardwareCodec");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.FfmpegVersion", b =>
+ {
+ b.Navigation("TestCaseArguments");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.HardwareSurveySubmission", b =>
+ {
+ b.Navigation("HardwareSurveyEntry");
+ });
+
+ modelBuilder.Entity("Jellyfin.HardwareVisualizer.Server.Database.MediaTestFile", b =>
+ {
+ b.Navigation("TestCases");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Jellyfin.HardwareVisualizer/Server/Migrations/20240313175208_AddProcessedProperty.cs b/Jellyfin.HardwareVisualizer/Server/Migrations/20240313175208_AddProcessedProperty.cs
new file mode 100644
index 0000000..e836c89
--- /dev/null
+++ b/Jellyfin.HardwareVisualizer/Server/Migrations/20240313175208_AddProcessedProperty.cs
@@ -0,0 +1,29 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Jellyfin.HardwareVisualizer.Server.Migrations
+{
+ ///
+ public partial class AddProcessedProperty : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "Processed",
+ table: "HardwareSurveyEntries",
+ type: "boolean",
+ nullable: false,
+ defaultValue: false);
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "Processed",
+ table: "HardwareSurveyEntries");
+ }
+ }
+}
diff --git a/Jellyfin.HardwareVisualizer/Server/Migrations/HardwareVisualizerDataContextModelSnapshot.cs b/Jellyfin.HardwareVisualizer/Server/Migrations/HardwareVisualizerDataContextModelSnapshot.cs
index d25e456..d44ac82 100644
--- a/Jellyfin.HardwareVisualizer/Server/Migrations/HardwareVisualizerDataContextModelSnapshot.cs
+++ b/Jellyfin.HardwareVisualizer/Server/Migrations/HardwareVisualizerDataContextModelSnapshot.cs
@@ -206,6 +206,9 @@ protected override void BuildModel(ModelBuilder modelBuilder)
b.Property("MaxStreams")
.HasColumnType("integer");
+ b.Property("Processed")
+ .HasColumnType("boolean");
+
b.Property("ToResolutionId")
.HasColumnType("uuid");