Refactor global configuration page and navigation; add media library page; enhance streamer configuration with detailed options
- Removed the global configuration form and redirected to the consolidated settings page. - Updated the dashboard to provide feedback when no streamers are configured and added edit links for each streamer. - Introduced a new media library page to display media files from the configured archive root. - Enhanced the streamer configuration page with additional options for overrides and settings, including a confirmation modal for deletion. - Updated the layout and styles for improved user experience and navigation. - Switched from file-based password storage to database-backed user credentials management in AuthService. - Applied EF migrations on application startup to ensure database schema is up-to-date.
This commit is contained in:
parent
1ecf7501f4
commit
e5e60999bf
24 changed files with 1151 additions and 163 deletions
|
|
@ -1,3 +1,4 @@
|
|||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace TwitchArchive.Core.Config
|
||||
|
|
@ -26,12 +27,98 @@ namespace TwitchArchive.Core.Config
|
|||
public string? UploadDestination { get; set; }
|
||||
|
||||
[JsonPropertyName("refresh_interval_seconds")]
|
||||
[Range(5, 86400, ErrorMessage = "Refresh interval must be between 5 and 86400 seconds.")]
|
||||
public int RefreshIntervalSeconds { get; set; } = 60;
|
||||
|
||||
[JsonPropertyName("stream_segment_threads")]
|
||||
[Range(1, 64, ErrorMessage = "Stream segment threads must be between 1 and 64.")]
|
||||
public int StreamSegmentThreads { get; set; } = 4;
|
||||
|
||||
[JsonPropertyName("default_quality")]
|
||||
public string? DefaultQuality { get; set; } = "best";
|
||||
|
||||
// Defaults section for per-streamer fallbacks
|
||||
[JsonPropertyName("defaults")]
|
||||
public DefaultsSection Defaults { get; set; } = new DefaultsSection();
|
||||
}
|
||||
|
||||
public class DefaultsSection
|
||||
{
|
||||
[JsonPropertyName("downloadVOD")]
|
||||
public bool DownloadVOD { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("downloadCHAT")]
|
||||
public bool DownloadCHAT { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("downloadLiveCHAT")]
|
||||
public bool DownloadLiveCHAT { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("mergeVideoChat")]
|
||||
public bool MergeVideoChat { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("mergeChatLayout")]
|
||||
public string MergeChatLayout { get; set; } = "side-by-side";
|
||||
|
||||
[JsonPropertyName("vodTimeout")]
|
||||
[Range(0, 86400, ErrorMessage = "VOD timeout must be between 0 and 86400 seconds.")]
|
||||
public int VodTimeout { get; set; } = 300;
|
||||
|
||||
[JsonPropertyName("uploadCloud")]
|
||||
public bool UploadCloud { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("uploadPreMergeVideo")]
|
||||
public bool UploadPreMergeVideo { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("uploadMergedVideo")]
|
||||
public bool UploadMergedVideo { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("uploadChatVideo")]
|
||||
public bool UploadChatVideo { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("deleteFiles")]
|
||||
public bool DeleteFiles { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("onlyRaw")]
|
||||
public bool OnlyRaw { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("cleanRaw")]
|
||||
public bool CleanRaw { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("hls_segments")]
|
||||
[Range(1, 50, ErrorMessage = "HLS segments must be between 1 and 50.")]
|
||||
public int HlsSegments { get; set; } = 3;
|
||||
|
||||
[JsonPropertyName("hls_segmentsVOD")]
|
||||
[Range(1, 200, ErrorMessage = "HLS segments (VOD) must be between 1 and 200.")]
|
||||
public int HlsSegmentsVOD { get; set; } = 10;
|
||||
|
||||
[JsonPropertyName("streamlink_ttvlol")]
|
||||
public bool StreamlinkTtvlol { get; set; } = false;
|
||||
|
||||
[JsonPropertyName("ffmpeg_hwaccel")]
|
||||
public string FfmpegHwaccel { get; set; } = "auto";
|
||||
|
||||
[JsonPropertyName("ffmpeg_threads")]
|
||||
[Range(0, 128, ErrorMessage = "FFmpeg threads must be between 0 and 128.")]
|
||||
public int FfmpegThreads { get; set; } = 0;
|
||||
|
||||
[JsonPropertyName("ffmpeg_audio_codec")]
|
||||
public string FfmpegAudioCodec { get; set; } = "aac";
|
||||
|
||||
[JsonPropertyName("ffmpeg_audio_samplerate")]
|
||||
[Range(8000, 192000, ErrorMessage = "Audio sample rate must be between 8000 and 192000.")]
|
||||
public int FfmpegAudioSamplerate { get; set; } = 48000;
|
||||
|
||||
[JsonPropertyName("ffmpeg_audio_bitrate")]
|
||||
public string FfmpegAudioBitrate { get; set; } = "192k";
|
||||
|
||||
[JsonPropertyName("ffmpeg_error_recovery")]
|
||||
public bool FfmpegErrorRecovery { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("ffmpeg_faststart")]
|
||||
public bool FfmpegFaststart { get; set; } = true;
|
||||
|
||||
[JsonPropertyName("ffmpeg_progress")]
|
||||
public bool FfmpegProgress { get; set; } = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue