Files
VDownload/VDownload.Services/VDownload.Services.Utility/VDownload.Services.Utility.Filename/FilenameService.cs

103 lines
3.3 KiB
C#

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
}
}