using System.IO.Abstractions; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Graphics; using ErsatzTV.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Infrastructure.Streaming.Graphics; public static class GraphicsElementSeeder { private const string OnNowNextYaml = """ name: On Now / Next epg_entries: 2 location: BottomLeft horizontal_margin_percent: 4 vertical_margin_percent: 8 width_percent: 42 text_fit: Wrap text_align: Left z_index: 100 # transparent until 4s in, fade in 1s, hold 6s, fade out 1s opacity_expression: "LinearFadeDuration(content_seconds, 4, 1, 6)" base_style: now styles: - name: now font_family: "Noto Sans" font_size: 30 font_weight: 700 text_color: "#FFFFFF" halo_color: "#000000" halo_width: 2 - name: sub font_family: "Noto Sans" font_size: 22 font_weight: 400 text_color: "#DDDDDD" halo_color: "#000000" halo_width: 2 - name: next font_family: "Noto Sans" font_size: 22 font_weight: 400 text_color: "#DDDDDD" halo_color: "#000000" halo_width: 2 text: | [now]NOW {{ Epg[0].Title }}[/now] {{ if Epg[0].SubTitle }}[sub]{{ Epg[0].SubTitle }}[/sub]{{ end }} {{ if (array.size Epg) > 1 }}[next]NEXT {{ Epg[1].Title }}[/next]{{ end }} """; public static async Task SeedOnNowNext(TvContext context, IFileSystem fileSystem, CancellationToken cancellationToken) { string seededKey = ConfigElementKey.GraphicsOnNowNextSeeded.Key; bool alreadySeeded = await context.ConfigElements.AnyAsync(c => c.Key == seededKey, cancellationToken); if (alreadySeeded) { return; } string folder = FileSystemLayout.GraphicsElementsTextTemplatesFolder; string target = fileSystem.Path.Combine(folder, GraphicsElementDefaults.OnNowNextFileName); if (!fileSystem.Directory.Exists(folder)) { fileSystem.Directory.CreateDirectory(folder); } // Adopt an operator's existing file untouched; only write when absent. if (!fileSystem.File.Exists(target)) { await fileSystem.File.WriteAllTextAsync(target, OnNowNextYaml, cancellationToken); } await context.ConfigElements.AddAsync( new ConfigElement { Key = seededKey, Value = "true" }, cancellationToken); await context.SaveChangesAsync(cancellationToken); } }