59 lines
2.8 KiB
C#
59 lines
2.8 KiB
C#
namespace VideoDownloader.Server;
|
|
|
|
/// <summary>다운로드 큐 항목 스냅shot (모바일/웹 컴패니언용).</summary>
|
|
public sealed record QueueItemDto(string Id, string Title, string Url, string Status, double Percent);
|
|
|
|
/// <summary>라이브러리(저장 폴더) 미디어 항목.</summary>
|
|
public sealed record LibraryItemDto(string Id, string FileName, long SizeBytes, DateTime Modified, string? Resolution = null);
|
|
|
|
/// <summary>이어보기 위치(U3 동기화). 초 단위.</summary>
|
|
public sealed record PositionDto(double PositionSec);
|
|
|
|
/// <summary>서버 구성.</summary>
|
|
public sealed class ServerOptions
|
|
{
|
|
/// <summary>0 이면 사용 가능한 포트 자동 할당.</summary>
|
|
public int Port { get; init; }
|
|
/// <summary>페어링 토큰(Bearer). 비면 자동 생성.</summary>
|
|
public string Token { get; init; } = "";
|
|
/// <summary>라이브러리로 노출할 폴더.</summary>
|
|
public string LibraryFolder { get; init; } = "";
|
|
/// <summary>다운로드 큐 어댑터(호스트 앱이 구현 주입).</summary>
|
|
public IQueueAdapter Queue { get; init; } = new EmptyQueueAdapter();
|
|
/// <summary>기기 표시명(웹 컴패니언 헤더용).</summary>
|
|
public string DeviceName { get; init; } = Environment.MachineName;
|
|
/// <summary>썸네일/해상도 생성기(기본: DesktopProcessRunner 기반 ffmpeg). 테스트 주입 가능.</summary>
|
|
public Thumbnailer? Thumbnailer { get; init; }
|
|
/// <summary>ffmpeg 경로 오버라이드(기본: 설정→PATH 탐색). 호스트 ffmpeg 없는 환경 테스트용.</summary>
|
|
public string? FfmpegPath { get; init; }
|
|
}
|
|
|
|
/// <summary>기본 썸네일러 팩토리.</summary>
|
|
public static class ServerOptionsDefaults
|
|
{
|
|
public static Thumbnailer DefaultThumbnailer() =>
|
|
new(VideoDownloader.Core.Platform.DesktopProcessRunner.Default);
|
|
}
|
|
|
|
/// <summary>호스트 앱의 다운로드 큐와 서버를 잇는 어댑터(UI 스레드 마샬링은 구현측 담당).</summary>
|
|
public interface IQueueAdapter
|
|
{
|
|
Task<IReadOnlyList<QueueItemDto>> GetItemsAsync();
|
|
Task<string> AddAsync(string url, string? title);
|
|
Task PauseAsync(string id);
|
|
Task ResumeAsync(string id);
|
|
Task CancelAsync(string id);
|
|
event Action? Changed;
|
|
}
|
|
|
|
/// <summary>큐 없이 서버만 띄울 때의 기본 구현.</summary>
|
|
public sealed class EmptyQueueAdapter : IQueueAdapter
|
|
{
|
|
public Task<IReadOnlyList<QueueItemDto>> GetItemsAsync() =>
|
|
Task.FromResult<IReadOnlyList<QueueItemDto>>(Array.Empty<QueueItemDto>());
|
|
public Task<string> AddAsync(string url, string? title) => Task.FromResult("");
|
|
public Task PauseAsync(string id) => Task.CompletedTask;
|
|
public Task ResumeAsync(string id) => Task.CompletedTask;
|
|
public Task CancelAsync(string id) => Task.CompletedTask;
|
|
public event Action? Changed { add { } remove { } }
|
|
}
|