filename templates added
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using VDownload.Models;
|
||||
using VDownload.Services.Data.Configuration;
|
||||
using VDownload.Services.Data.Configuration.Models;
|
||||
|
||||
namespace VDownload.Services.Utility.Filename
|
||||
{
|
||||
public interface IFilenameService
|
||||
{
|
||||
string CreateFilename(string template, Video video);
|
||||
string SanitizeFilename(string filename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class FilenameService : IFilenameService
|
||||
{
|
||||
#region SERVICES
|
||||
|
||||
protected readonly IConfigurationService _configurationService;
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region CONSTRUCTORS
|
||||
|
||||
public FilenameService(IConfigurationService configurationService)
|
||||
{
|
||||
_configurationService = configurationService;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region PUBLIC METHODS
|
||||
|
||||
public string CreateFilename(string template, Video video)
|
||||
{
|
||||
string filename = template;
|
||||
foreach (FilenameTemplate templateElement in _configurationService.Common.FilenameTemplates)
|
||||
{
|
||||
switch (templateElement.Name)
|
||||
{
|
||||
case "id": ReplaceInPlace(ref filename, templateElement.Wildcard, video.Id); break;
|
||||
case "title": ReplaceInPlace(ref filename, templateElement.Wildcard, video.Title); break;
|
||||
case "author": ReplaceInPlace(ref filename, templateElement.Wildcard, video.Author); break;
|
||||
case "views": ReplaceInPlace(ref filename, templateElement.Wildcard, video.Views.ToString()); break;
|
||||
case "source": ReplaceInPlace(ref filename, templateElement.Wildcard, video.Source.ToString()); break;
|
||||
case "date":
|
||||
{
|
||||
Regex regex = new Regex(templateElement.Wildcard);
|
||||
foreach (Match match in regex.Matches(filename))
|
||||
{
|
||||
ReplaceInPlace(ref filename, match.Value, video.PublishDate.ToString(match.Groups[1].Value));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "duration":
|
||||
{
|
||||
Regex regex = new Regex(templateElement.Wildcard);
|
||||
foreach (Match match in regex.Matches(filename))
|
||||
{
|
||||
ReplaceInPlace(ref filename, match.Value, video.Duration.ToString(match.Groups[1].Value));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: throw new Exception("Invalid template");
|
||||
}
|
||||
}
|
||||
filename = SanitizeFilename(filename);
|
||||
return filename;
|
||||
}
|
||||
|
||||
public string SanitizeFilename(string filename)
|
||||
{
|
||||
char[] invalidChars = System.IO.Path.GetInvalidFileNameChars();
|
||||
foreach (char c in invalidChars)
|
||||
{
|
||||
filename = filename.Replace(c, '_');
|
||||
}
|
||||
return filename;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region PRIVATE METHODS
|
||||
|
||||
protected void ReplaceInPlace(ref string filename, string oldValue, string newValue) => filename = filename.Replace(oldValue, newValue);
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\VDownload.Models\VDownload.Models.csproj" />
|
||||
<ProjectReference Include="..\..\VDownload.Services.Data\VDownload.Services.Data.Configuration\VDownload.Services.Data.Configuration.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user