103 lines
3.3 KiB
C#
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
|
|
}
|
|
}
|