using System;
using System.Collections.Generic;
using BililiveRecorder.Core;
using BililiveRecorder.Web.Models.Rest.Files;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.FileProviders;
namespace BililiveRecorder.Web.Api
{
[ApiController, Route("api/[controller]", Name = "[controller] [action]")]
public sealed class FileController : ControllerBase, IDisposable
{
private readonly PhysicalFileProvider? fileProvider;
private bool disposedValue;
public FileController(IRecorder recorder, BililiveRecorderFileExplorerSettings fileExplorerSettings)
{
if (recorder is null) throw new ArgumentNullException(nameof(recorder));
if (fileExplorerSettings is null) throw new ArgumentNullException(nameof(fileExplorerSettings));
if (fileExplorerSettings.Enable)
{
this.fileProvider = new PhysicalFileProvider(recorder.Config.Global.WorkDirectory!);
}
}
///
/// 获取录播目录文件信息
///
/// 路径
///
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public FileApiResult GetFiles([FromQuery] string path)
{
if (this.fileProvider is null || path is null)
return FileApiResult.NotExist;
var contents = this.fileProvider.GetDirectoryContents(path);
if (!contents.Exists)
return FileApiResult.NotExist;
var fileLikes = new List();
foreach (var content in contents)
{
try
{
if (!content.Exists)
continue;
if (content.IsDirectory)
{
fileLikes.Add(new FolderDto
{
Name = content.Name,
LastModified = content.LastModified,
});
}
else
{
var pathTrimmed = path.Trim('/');
fileLikes.Add(new FileDto
{
Name = content.Name,
LastModified = content.LastModified,
Size = content.Length,
// Path.Combine 在 Windows 上会用 \
Url = "/file/" + (pathTrimmed.Length > 0 ? pathTrimmed + '/' : string.Empty) + content.Name,
});
}
}
catch (Exception) { }
}
return new FileApiResult(true, path, fileLikes);
}
private void Dispose(bool disposing)
{
if (!this.disposedValue)
{
if (disposing)
{
this.fileProvider?.Dispose();
}
this.disposedValue = true;
}
}
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
this.Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
}