Drag-Drop-Explorer
This commit is contained in:
parent
110b306206
commit
d0cd52807d
17
.vscode/launch.json
vendored
17
.vscode/launch.json
vendored
@ -175,6 +175,23 @@
|
||||
"console": "externalTerminal",
|
||||
"stopAtEntry": false,
|
||||
"requireExactSource": false
|
||||
},
|
||||
{
|
||||
"name": "Rename",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
"program": "${workspaceFolder}/Rename/bin/Debug/net7.0/win-x64/Rename.dll",
|
||||
"args": [
|
||||
"s"
|
||||
],
|
||||
"env": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "externalTerminal",
|
||||
"stopAtEntry": false,
|
||||
"requireExactSource": false
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Compare</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Date.Group</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Delete.By.Distinct</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -78,7 +78,8 @@ public class DeleteByDistinct
|
||||
if (!fileTicksToNames.TryGetValue(checkDate.Ticks, out fileNames))
|
||||
throw new Exception();
|
||||
}
|
||||
checkName = fileInfo.Name.ToLower().Replace(".jpeg", ".jpg");
|
||||
checkName = fileInfo.Name[..10];
|
||||
// checkName = fileInfo.Name.ToLower().Replace(".jpeg", ".jpg");
|
||||
if (fileNames.Contains(checkName))
|
||||
deletedFiles.Add(file);
|
||||
else
|
||||
@ -128,4 +129,5 @@ public class DeleteByDistinct
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,13 +1,12 @@
|
||||
{
|
||||
"xCompareRootDirectory": "",
|
||||
"CompareRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
|
||||
"CompareRootDirectory": "D:/7) Question/- - - Videos A",
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Log4netProvider": "Debug"
|
||||
}
|
||||
},
|
||||
"MaxDegreeOfParallelism": 6,
|
||||
"SearchPattern": "*.j*",
|
||||
"SearchPattern": "*.*",
|
||||
"Serilog": {
|
||||
"MinimumLevel": "Debug"
|
||||
},
|
||||
@ -15,231 +14,10 @@
|
||||
"Configuration": {
|
||||
"xRootDirectory": "D:/2) Images B/Corrupt",
|
||||
"xxRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
|
||||
"RootDirectory": "D:/1) Images A/Images-45f4401",
|
||||
"VerifyToSeason": [
|
||||
". 2000",
|
||||
". 2001",
|
||||
". 2002",
|
||||
". 2003",
|
||||
". 2004",
|
||||
". 2005",
|
||||
". 2006",
|
||||
". 2007",
|
||||
". 2008",
|
||||
". 2009",
|
||||
". 2010",
|
||||
". 2011",
|
||||
". 2012",
|
||||
". 2013",
|
||||
". 2014",
|
||||
". 2015",
|
||||
". 2016",
|
||||
". 2017",
|
||||
". 2018",
|
||||
". 2019",
|
||||
". 2020",
|
||||
". 2021",
|
||||
". 2022",
|
||||
". 2023",
|
||||
". 2024",
|
||||
". 2025",
|
||||
". 2026",
|
||||
". 2027",
|
||||
". 2028",
|
||||
". 2029",
|
||||
"2000.0 Winter",
|
||||
"2002.1 Spring",
|
||||
"2002.4 Winter",
|
||||
"2003.0 Winter",
|
||||
"2003.1 Spring",
|
||||
"2003.3 Fall",
|
||||
"2003.4 Winter",
|
||||
"2004.0 Winter",
|
||||
"2005.1 Spring",
|
||||
"2005.2 Summer",
|
||||
"2005.3 Fall",
|
||||
"2005.4 Winter",
|
||||
"2006.0 Winter",
|
||||
"2006.1 Spring",
|
||||
"2006.3 Fall",
|
||||
"2007.0 Winter",
|
||||
"2007.2 Summer Logan Michael",
|
||||
"2007.2 Summer",
|
||||
"2007.3 Fall Logan Michael",
|
||||
"2007.4 Winter Logan Michael",
|
||||
"2008.0 Winter Logan Michael",
|
||||
"2008.1 Spring Logan Michael",
|
||||
"2008.2 Summer Logan Michael",
|
||||
"2008.2 Summer",
|
||||
"2008.3 Fall Logan Michael",
|
||||
"2009.0 Winter Logan Michael",
|
||||
"2009.0 Winter",
|
||||
"2009.1 Spring Logan Michael",
|
||||
"2009.1 Spring",
|
||||
"2009.2 Summer Logan Michael",
|
||||
"2009.2 Summer",
|
||||
"2009.3 Fall Logan Michael",
|
||||
"2009.3 Fall",
|
||||
"2009.4 Winter Logan Michael",
|
||||
"2009.4 Winter",
|
||||
"2010.0 Winter Logan Michael",
|
||||
"2010.0 Winter",
|
||||
"2010.1 Spring Logan Michael",
|
||||
"2010.1 Spring",
|
||||
"2010.2 Summer",
|
||||
"2010.3 Fall Logan Michael",
|
||||
"2010.3 Fall",
|
||||
"2010.4 Winter",
|
||||
"2011.0 Winter",
|
||||
"2011.1 Spring",
|
||||
"2011.2 Summer",
|
||||
"2011.3 Fall",
|
||||
"2011.4 Winter",
|
||||
"2012.0 Winter Chelsea 2012",
|
||||
"2012.0 Winter Chelsea",
|
||||
"2012.0 Winter",
|
||||
"2012.1 Spring Chelsea",
|
||||
"2012.1 Spring",
|
||||
"2012.2 Summer Chelsea",
|
||||
"2012.2 Summer",
|
||||
"2012.3 Fall Chelsea",
|
||||
"2012.3 Fall",
|
||||
"2012.4 Winter Chelsea",
|
||||
"2012.4 Winter",
|
||||
"2013.0 Winter Chelsea 2013",
|
||||
"2013.0 Winter Chelsea",
|
||||
"2013.0 Winter",
|
||||
"2013.1 Spring",
|
||||
"2013.2 Summer Chelsea",
|
||||
"2013.2 Summer",
|
||||
"2013.3 Fall Chelsea",
|
||||
"2013.3 Fall",
|
||||
"2013.4 Winter",
|
||||
"2014.0 Winter",
|
||||
"2014.1 Spring",
|
||||
"2014.2 Summer",
|
||||
"2014.3 Fall",
|
||||
"2014.4 Winter",
|
||||
"2015.0 Winter",
|
||||
"2015.1 Spring",
|
||||
"2015.2 Summer",
|
||||
"2015.3 Fall",
|
||||
"2015.4 Winter",
|
||||
"2016.0 Winter",
|
||||
"2016.1 Spring",
|
||||
"2016.2 Summer",
|
||||
"2016.3 Fall",
|
||||
"2016.4 Winter",
|
||||
"2017.1 Spring",
|
||||
"2017.2 Summer",
|
||||
"2017.3 Fall",
|
||||
"2017.4 Winter",
|
||||
"2018.0 Winter",
|
||||
"2018.1 Spring",
|
||||
"2018.3 Fall",
|
||||
"2018.4 Winter",
|
||||
"2019.0 Winter",
|
||||
"2019.1 Spring",
|
||||
"2019.2 Summer",
|
||||
"2019.3 Fall",
|
||||
"2019.4 Winter",
|
||||
"2020.0 Winter",
|
||||
"2020.1 Spring",
|
||||
"2020.2 Summer",
|
||||
"2020.3 Fall",
|
||||
"2020.4 Winter",
|
||||
"2021.1 Spring",
|
||||
"2021.2 Summer",
|
||||
"2021.3 Fall",
|
||||
"2021.4 Winter",
|
||||
"2022.0 Winter",
|
||||
"2022.1 Spring",
|
||||
"Anthem 2015",
|
||||
"April 2010",
|
||||
"April 2013",
|
||||
"December 2006",
|
||||
"December 2010",
|
||||
"Fall 2005",
|
||||
"Fall 2015",
|
||||
"Fall 2016",
|
||||
"Fall 2017",
|
||||
"Fall 2018",
|
||||
"Fall 2019",
|
||||
"Fall 2020",
|
||||
"Fall 2021",
|
||||
"February 2010",
|
||||
"January 2015",
|
||||
"July 2010",
|
||||
"June 2010",
|
||||
"Kids 2005",
|
||||
"March 2013",
|
||||
"May 2010",
|
||||
"May 2011",
|
||||
"May 2013",
|
||||
"October 2005",
|
||||
"October 2014",
|
||||
"Spring 2013",
|
||||
"Spring 2014",
|
||||
"Spring 2016",
|
||||
"Spring 2018",
|
||||
"Spring 2019",
|
||||
"Spring 2020",
|
||||
"Summer 2011",
|
||||
"Summer 2012",
|
||||
"Summer 2013",
|
||||
"Summer 2014",
|
||||
"Summer 2015",
|
||||
"Summer 2016",
|
||||
"Summer 2017",
|
||||
"Summer 2018",
|
||||
"Summer 2020",
|
||||
"Summer 2021",
|
||||
"Winter 2015",
|
||||
"Winter 2016",
|
||||
"Winter 2017",
|
||||
"Winter 2018",
|
||||
"Winter 2019-2020",
|
||||
"Winter 2020",
|
||||
"zzz 2005.0 Winter Tracy Pictures",
|
||||
"zzz 2005.1 Spring Tracy Pictures",
|
||||
"zzz 2005.2 Summer Tracy Pictures",
|
||||
"zzz 2005.3 Fall Tracy Pictures",
|
||||
"zzz 2005.4 Winter Tracy Pictures",
|
||||
"zzz 2006.1 Spring Tracy Pictures",
|
||||
"zzz 2007.0 Winter Tracy Pictures",
|
||||
"zzz 2007.2 Summer Tracy Pictures",
|
||||
"zzz 2008.0 Winter Tracy Pictures",
|
||||
"zzz 2008.2 Summer Tracy Pictures",
|
||||
"zzz 2009.0 Winter Tracy Pictures",
|
||||
"zzz 2009.2 Summer Tracy Pictures",
|
||||
"zzz 2009.3 Fall Tracy Pictures",
|
||||
"zzz 2009.4 Winter Tracy Pictures",
|
||||
"zzz 2010.0 Winter Tracy Pictures",
|
||||
"zzz 2010.1 Spring Tracy Pictures",
|
||||
"zzz 2010.2 Summer Tracy Pictures",
|
||||
"zzz 2010.3 Fall Tracy Pictures",
|
||||
"zzz 2011.0 Winter Tracy Pictures",
|
||||
"zzz 2011.1 Spring Tracy Pictures",
|
||||
"zzz 2011.2 Summer Tracy Pictures",
|
||||
"zzz 2011.3 Fall Tracy Pictures",
|
||||
"zzz 2011.4 Winter Tracy Pictures",
|
||||
"zzz 2012.0 Winter Tracy Pictures",
|
||||
"zzz 2012.1 Spring Tracy Pictures",
|
||||
"zzz 2012.2 Summer Tracy Pictures",
|
||||
"zzz 2012.3 Fall Tracy Pictures",
|
||||
"zzz 2012.4 Winter Tracy Pictures",
|
||||
"zzz 2013.0 Winter Tracy Pictures",
|
||||
"zzz 2013.1 Spring Tracy Pictures",
|
||||
"zzz 2013.2 Summer Tracy Pictures",
|
||||
"zzz 2013.3 Fall Tracy Pictures",
|
||||
"zzz 2013.4 Winter Tracy Pictures",
|
||||
"zzz 2014.0 Winter Tracy Pictures",
|
||||
"zzz 2014.1 Spring Tracy Pictures",
|
||||
"zzz 2014.2 Summer Tracy Pictures",
|
||||
"zzz 2014.3 Fall Tracy Pictures",
|
||||
"zzz 2014.4 Winter Tracy Pictures",
|
||||
"zzz 2015.0 Winter Tracy Pictures"
|
||||
]
|
||||
"xxxRootDirectory": "D:/1) Images A/Images-45f4401",
|
||||
"RootDirectory": "E:/3) Videos A/Device Videos 2_0_0_3 - Current",
|
||||
"xxxxxRootDirectory": "E:/4) Videos B/Device Videos 2_0_0_3 - Current - Ignore",
|
||||
"VerifyToSeason": []
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"CompareRootDirectory": "",
|
||||
"ComparePathsFile": "",
|
||||
"Company": "Mike Phares",
|
||||
"Linux": {},
|
||||
"Logging": {
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Delete.By.Relative</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Distance</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -1,6 +1,6 @@
|
||||
namespace View_by_Distance.Drag_Drop_Explorer;
|
||||
|
||||
partial class Form
|
||||
partial class DragDropExplorer
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
@ -32,7 +32,7 @@ partial class Form
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(640, 100);
|
||||
this.StartPosition = FormStartPosition.CenterScreen;
|
||||
this.Text = "Form1";
|
||||
this.Text = "Drag Drop Explorer";
|
||||
}
|
||||
|
||||
#endregion
|
@ -6,11 +6,12 @@ using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using View_by_Distance.Drag_Drop_Explorer.Models;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Drag_Drop_Explorer;
|
||||
|
||||
public partial class Form : System.Windows.Forms.Form
|
||||
public partial class DragDropExplorer : Form
|
||||
{
|
||||
|
||||
private readonly ILogger _Logger;
|
||||
@ -23,7 +24,7 @@ public partial class Form : System.Windows.Forms.Form
|
||||
private readonly string _WorkingDirectory;
|
||||
private readonly IsEnvironment _IsEnvironment;
|
||||
|
||||
public Form()
|
||||
public DragDropExplorer()
|
||||
{
|
||||
InitializeComponent();
|
||||
ILogger logger;
|
||||
@ -48,17 +49,17 @@ public partial class Form : System.Windows.Forms.Form
|
||||
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
|
||||
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
|
||||
Log.Logger = loggerConfiguration.CreateLogger();
|
||||
logger = Log.ForContext<Form>();
|
||||
logger = Log.ForContext<DragDropExplorer>();
|
||||
logger.Information("Complete");
|
||||
_Logger = logger;
|
||||
_AppSettings = appSettings;
|
||||
Text = "Drag Drop Explorer";
|
||||
_IsEnvironment = isEnvironment;
|
||||
_WorkingDirectory = workingDirectory;
|
||||
_ProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
|
||||
_FirstTextBox = new() { Location = new(5, 5), Dock = DockStyle.Top, Text = _IsEnvironment.Profile };
|
||||
_PathTextBox = new() { Location = new(5, 5), Dock = DockStyle.Top, Text = _AppSettings.WorkingDirectoryName };
|
||||
_JsonTextBox = new() { Location = new(5, 5), Dock = DockStyle.Top, Text = JsonSerializer.Serialize(_AppSettings, new JsonSerializerOptions { WriteIndented = true }), Multiline = true, MinimumSize = new(1, 80) };
|
||||
_ProgressBar = new() { TabIndex = 4, Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
|
||||
string json = JsonSerializer.Serialize(_AppSettings, new JsonSerializerOptions { WriteIndented = true });
|
||||
_FirstTextBox = new() { TabIndex = 1, Text = _IsEnvironment.Profile, Location = new(5, 5), Dock = DockStyle.Top };
|
||||
_PathTextBox = new() { TabIndex = 2, Text = _AppSettings.WorkingDirectoryName, Location = new(5, 5), Dock = DockStyle.Top };
|
||||
_JsonTextBox = new() { TabIndex = 3, Text = json, Multiline = true, MinimumSize = new(1, 80), Location = new(5, 5), Dock = DockStyle.Top };
|
||||
Load += new EventHandler(Form1_Load);
|
||||
Controls.Add(_ProgressBar);
|
||||
Controls.Add(_JsonTextBox);
|
||||
@ -94,6 +95,7 @@ public partial class Form : System.Windows.Forms.Form
|
||||
{
|
||||
if (sender is TextBox textBox)
|
||||
{
|
||||
textBox.Text = GetConverted(textBox.Text);
|
||||
if (textBox.Text == "ps")
|
||||
throw new NotImplementedException();
|
||||
|
||||
@ -133,10 +135,10 @@ public partial class Form : System.Windows.Forms.Form
|
||||
{
|
||||
string converted;
|
||||
FileInfo fileInfo;
|
||||
_FirstTextBox.Text = paths[0];
|
||||
List<MatchNginx> files = new();
|
||||
DateTime dateTime = DateTime.Now;
|
||||
List<MatchNginx> directories = new();
|
||||
_FirstTextBox.Text = GetConverted(paths[0]);
|
||||
string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
|
||||
string directory = Path.Combine(_WorkingDirectory, $"{dateTime.Year}_{weekOfYear}");
|
||||
if (!Directory.Exists(directory))
|
@ -9,7 +9,7 @@ static class Program
|
||||
static void Main()
|
||||
{
|
||||
ApplicationConfiguration.Initialize();
|
||||
Application.Run(new Form());
|
||||
Application.Run(new DragDropExplorer());
|
||||
}
|
||||
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/bin/Debug/net7.0-windows/win-x64/Drag-Drop.dll",
|
||||
"program": "${workspaceFolder}/bin/Debug/net7.0-windows/win-x64/Drag-Drop-Search.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
41
Drag-Drop-Search/.vscode/tasks.json
vendored
Normal file
41
Drag-Drop-Search/.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/Drag-Drop-Search.csproj",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "publish",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"publish",
|
||||
"${workspaceFolder}/Drag-Drop-Search.csproj",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "watch",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"watch",
|
||||
"run",
|
||||
"--project",
|
||||
"${workspaceFolder}/Drag-Drop-Search.csproj"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
namespace View_by_Distance.Drag_Drop;
|
||||
|
||||
partial class Form
|
||||
partial class DragDropSearch
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
@ -32,7 +32,7 @@ partial class Form
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(640, 100);
|
||||
this.StartPosition = FormStartPosition.CenterScreen;
|
||||
this.Text = "Form1";
|
||||
this.Text = "Drag Drop Search";
|
||||
}
|
||||
|
||||
#endregion
|
204
Drag-Drop-Search/DragDropSearch.cs
Normal file
204
Drag-Drop-Search/DragDropSearch.cs
Normal file
@ -0,0 +1,204 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Phares.Shared;
|
||||
using Serilog;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using View_by_Distance.Drag_Drop.Models;
|
||||
using View_by_Distance.Resize.Models;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Drag_Drop;
|
||||
|
||||
public partial class DragDropSearch : Form
|
||||
{
|
||||
|
||||
private readonly ILogger _Logger;
|
||||
private readonly TextBox _TextBox;
|
||||
private readonly AppSettings _AppSettings;
|
||||
private readonly ProgressBar _ProgressBar;
|
||||
private readonly string _WorkingDirectory;
|
||||
private readonly Configuration _Configuration;
|
||||
private readonly IsEnvironment _IsEnvironment;
|
||||
private readonly Dictionary<int, Item> _IdToItem;
|
||||
private readonly string _ResizeFileNameExtension;
|
||||
private readonly IConfigurationRoot _ConfigurationRoot;
|
||||
private readonly Property.Models.Configuration _PropertyConfiguration;
|
||||
|
||||
public DragDropSearch()
|
||||
{
|
||||
InitializeComponent();
|
||||
ILogger logger;
|
||||
AppSettings appSettings;
|
||||
string workingDirectory;
|
||||
Configuration configuration;
|
||||
IsEnvironment isEnvironment;
|
||||
_IdToItem = new();
|
||||
IConfigurationRoot configurationRoot;
|
||||
LoggerConfiguration loggerConfiguration = new();
|
||||
Property.Models.Configuration propertyConfiguration;
|
||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||
bool debuggerWasAttachedAtLineZero = Debugger.IsAttached || assembly.Location.Contains(@"\bin\Debug");
|
||||
isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero);
|
||||
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
|
||||
.AddEnvironmentVariables()
|
||||
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
|
||||
.AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true);
|
||||
configurationRoot = configurationBuilder.Build();
|
||||
appSettings = Models.Binder.AppSettings.Get(configurationRoot);
|
||||
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
|
||||
throw new Exception("Working path name must have parentDirectory value!");
|
||||
workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName);
|
||||
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
|
||||
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
|
||||
Log.Logger = loggerConfiguration.CreateLogger();
|
||||
logger = Log.ForContext<DragDropSearch>();
|
||||
propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
|
||||
configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
|
||||
(_, _, string resizeFileNameExtension) = C_Resize.GetTuple(configuration.OutputExtension, configuration.OutputQuality);
|
||||
logger.Information("Complete");
|
||||
_Logger = logger;
|
||||
_AppSettings = appSettings;
|
||||
_Configuration = configuration;
|
||||
_IsEnvironment = isEnvironment;
|
||||
_WorkingDirectory = workingDirectory;
|
||||
_ConfigurationRoot = configurationRoot;
|
||||
_PropertyConfiguration = propertyConfiguration;
|
||||
_ResizeFileNameExtension = resizeFileNameExtension;
|
||||
_TextBox = new() { Location = new(5, 5), Dock = DockStyle.Top };
|
||||
_ProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
|
||||
Load += new EventHandler(Form1_Load);
|
||||
Controls.Add(_ProgressBar);
|
||||
Controls.Add(_TextBox);
|
||||
}
|
||||
|
||||
void Form1_Load(object? sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
AllowDrop = true;
|
||||
DragDrop += new DragEventHandler(Form1_DragDrop);
|
||||
DragEnter += new DragEventHandler(Form1_DragEnter);
|
||||
_TextBox.LostFocus += new EventHandler(TextBox_LostFocus);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void TextBox_LostFocus(object? sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_TextBox.Text == "ps")
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void Form1_DragEnter(object? sender, DragEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e.Data is not null && e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void LoadData()
|
||||
{
|
||||
Container[] containers;
|
||||
Property.Models.A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _ResizeFileNameExtension, _Configuration.Reverse);
|
||||
(_, _, _, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, propertyLogic);
|
||||
List<Item> collection = Program.GetItemCollection(_Configuration, containers);
|
||||
foreach (Item item in collection)
|
||||
{
|
||||
if (item.Property?.Id is null)
|
||||
continue;
|
||||
if (_IdToItem.ContainsKey(item.Property.Id.Value))
|
||||
continue;
|
||||
_IdToItem.Add(item.Property.Id.Value, item);
|
||||
}
|
||||
if (_Logger is null)
|
||||
throw new NullReferenceException(nameof(_Logger));
|
||||
_Logger.Debug((_AppSettings is null).ToString());
|
||||
_Logger.Debug((_Configuration is null).ToString());
|
||||
_Logger.Debug((_IsEnvironment is null).ToString());
|
||||
_Logger.Debug((_WorkingDirectory is null).ToString());
|
||||
_Logger.Debug((_ConfigurationRoot is null).ToString());
|
||||
_Logger.Debug((_PropertyConfiguration is null).ToString());
|
||||
}
|
||||
|
||||
public static string? GetFaceEncoding(string file)
|
||||
{
|
||||
string? result;
|
||||
List<string> results = new();
|
||||
const string comment = "Comment: ";
|
||||
if (File.Exists(file))
|
||||
{
|
||||
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
|
||||
foreach (MetadataExtractor.Directory directory in directories)
|
||||
{
|
||||
if (directory.Name != "PNG-tEXt")
|
||||
continue;
|
||||
foreach (MetadataExtractor.Tag tag in directory.Tags)
|
||||
{
|
||||
if (tag.Name != "Textual Data" || string.IsNullOrEmpty(tag.Description))
|
||||
continue;
|
||||
if (!tag.Description.StartsWith(comment))
|
||||
continue;
|
||||
results.Add(tag.Description);
|
||||
}
|
||||
}
|
||||
}
|
||||
result = results.Any() ? results[0][comment.Length..] : null;
|
||||
return result;
|
||||
}
|
||||
|
||||
private void GetDirectoriesOrDoDragDrop(string[] paths)
|
||||
{
|
||||
string name;
|
||||
string[] segments;
|
||||
foreach (string path in paths)
|
||||
{
|
||||
name = Path.GetFileNameWithoutExtension(path);
|
||||
Text = name;
|
||||
segments = name.Split('.');
|
||||
if (!_IdToItem.Any())
|
||||
LoadData();
|
||||
if (int.TryParse(segments[0], out int id) && _IdToItem.TryGetValue(id, out Item? item))
|
||||
{
|
||||
Text = item.ImageFileHolder.Name;
|
||||
_TextBox.Text = item.ImageFileHolder.FullName;
|
||||
if (item.ImageFileHolder.DirectoryName is not null)
|
||||
_Logger.Information(item.ImageFileHolder.DirectoryName);
|
||||
if (!string.IsNullOrEmpty(item.ImageFileHolder.DirectoryName))
|
||||
_ = Process.Start("explorer.exe", string.Concat("\"", item.ImageFileHolder.DirectoryName, "\""));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Form1_DragDrop(object? sender, DragEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths)
|
||||
_TextBox.Text = string.Empty;
|
||||
else
|
||||
GetDirectoriesOrDoDragDrop(paths);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -11,7 +11,7 @@ static class Program
|
||||
static void Main()
|
||||
{
|
||||
ApplicationConfiguration.Initialize();
|
||||
Application.Run(new Form());
|
||||
Application.Run(new DragDropSearch());
|
||||
}
|
||||
|
||||
private static Item[] GetFilterItems(Models.Configuration configuration, Container container)
|
@ -1,550 +0,0 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Phares.Shared;
|
||||
using Serilog;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using View_by_Distance.Drag_Drop.Models;
|
||||
using View_by_Distance.FaceRecognitionDotNet;
|
||||
using View_by_Distance.Resize.Models;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Drag_Drop;
|
||||
|
||||
public partial class Form : System.Windows.Forms.Form
|
||||
{
|
||||
|
||||
private readonly ILogger _Logger;
|
||||
private readonly TextBox _TextBox;
|
||||
private readonly List<string> _Lines;
|
||||
private readonly AppSettings _AppSettings;
|
||||
private readonly ProgressBar _ProgressBar;
|
||||
private readonly string _WorkingDirectory;
|
||||
private readonly Configuration _Configuration;
|
||||
private readonly IsEnvironment _IsEnvironment;
|
||||
private readonly ProgressBar _InnerProgressBar;
|
||||
private readonly Dictionary<int, Item> _IdToItem;
|
||||
private readonly string _ResizeFileNameExtension;
|
||||
private readonly IConfigurationRoot _ConfigurationRoot;
|
||||
private readonly Property.Models.Configuration _PropertyConfiguration;
|
||||
|
||||
public Form()
|
||||
{
|
||||
InitializeComponent();
|
||||
_Lines = new();
|
||||
ILogger logger;
|
||||
AppSettings appSettings;
|
||||
string workingDirectory;
|
||||
Configuration configuration;
|
||||
IsEnvironment isEnvironment;
|
||||
_IdToItem = new();
|
||||
IConfigurationRoot configurationRoot;
|
||||
LoggerConfiguration loggerConfiguration = new();
|
||||
Property.Models.Configuration propertyConfiguration;
|
||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||
bool debuggerWasAttachedAtLineZero = Debugger.IsAttached || assembly.Location.Contains(@"\bin\Debug");
|
||||
isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero);
|
||||
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
|
||||
.AddEnvironmentVariables()
|
||||
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
|
||||
.AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true);
|
||||
configurationRoot = configurationBuilder.Build();
|
||||
appSettings = Models.Binder.AppSettings.Get(configurationRoot);
|
||||
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
|
||||
throw new Exception("Working path name must have parentDirectory value!");
|
||||
workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName);
|
||||
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
|
||||
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
|
||||
Log.Logger = loggerConfiguration.CreateLogger();
|
||||
logger = Log.ForContext<Form>();
|
||||
propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
|
||||
configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
|
||||
(_, _, string resizeFileNameExtension) = C_Resize.GetTuple(configuration.OutputExtension, configuration.OutputQuality);
|
||||
logger.Information("Complete");
|
||||
_Logger = logger;
|
||||
_AppSettings = appSettings;
|
||||
_Configuration = configuration;
|
||||
_IsEnvironment = isEnvironment;
|
||||
_WorkingDirectory = workingDirectory;
|
||||
_ConfigurationRoot = configurationRoot;
|
||||
_PropertyConfiguration = propertyConfiguration;
|
||||
_ResizeFileNameExtension = resizeFileNameExtension;
|
||||
_TextBox = new() { Location = new(5, 5), Dock = DockStyle.Top };
|
||||
_ProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
|
||||
_InnerProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
|
||||
Load += new EventHandler(Form1_Load);
|
||||
Controls.Add(_ProgressBar);
|
||||
Controls.Add(_InnerProgressBar);
|
||||
Controls.Add(_TextBox);
|
||||
}
|
||||
|
||||
void Form1_Load(object? sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
AllowDrop = true;
|
||||
DragDrop += new DragEventHandler(Form1_DragDrop);
|
||||
DragEnter += new DragEventHandler(Form1_DragEnter);
|
||||
_TextBox.LostFocus += new EventHandler(TextBox_LostFocus);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void TextBox_LostFocus(object? sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_TextBox.Text == "ps")
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void Form1_DragEnter(object? sender, DragEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e.Data is not null && e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void LoadData()
|
||||
{
|
||||
Container[] containers;
|
||||
Property.Models.A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _ResizeFileNameExtension, _Configuration.Reverse);
|
||||
(_, _, _, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, propertyLogic);
|
||||
List<Item> collection = Program.GetItemCollection(_Configuration, containers);
|
||||
foreach (Item item in collection)
|
||||
{
|
||||
if (item.Property?.Id is null)
|
||||
continue;
|
||||
if (_IdToItem.ContainsKey(item.Property.Id.Value))
|
||||
continue;
|
||||
_IdToItem.Add(item.Property.Id.Value, item);
|
||||
}
|
||||
if (_Logger is null)
|
||||
throw new NullReferenceException(nameof(_Logger));
|
||||
_Logger.Debug((_AppSettings is null).ToString());
|
||||
_Logger.Debug((_Configuration is null).ToString());
|
||||
_Logger.Debug((_IsEnvironment is null).ToString());
|
||||
_Logger.Debug((_WorkingDirectory is null).ToString());
|
||||
_Logger.Debug((_ConfigurationRoot is null).ToString());
|
||||
_Logger.Debug((_PropertyConfiguration is null).ToString());
|
||||
}
|
||||
|
||||
public static string? GetFaceEncoding(string file)
|
||||
{
|
||||
string? result;
|
||||
List<string> results = new();
|
||||
const string comment = "Comment: ";
|
||||
if (File.Exists(file))
|
||||
{
|
||||
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
|
||||
foreach (MetadataExtractor.Directory directory in directories)
|
||||
{
|
||||
if (directory.Name != "PNG-tEXt")
|
||||
continue;
|
||||
foreach (MetadataExtractor.Tag tag in directory.Tags)
|
||||
{
|
||||
if (tag.Name != "Textual Data" || string.IsNullOrEmpty(tag.Description))
|
||||
continue;
|
||||
if (!tag.Description.StartsWith(comment))
|
||||
continue;
|
||||
results.Add(tag.Description);
|
||||
}
|
||||
}
|
||||
}
|
||||
result = results.Any() ? results[0][comment.Length..] : null;
|
||||
return result;
|
||||
}
|
||||
|
||||
private void RenameFilesInDirectory(string directory, string searchPattern)
|
||||
{
|
||||
int? id;
|
||||
string? message;
|
||||
string checkFile;
|
||||
TimeSpan timeSpan;
|
||||
DateTime? dateTime;
|
||||
DateTime?[] dateTimes;
|
||||
FileHolder fileHolder;
|
||||
bool isIgnoreExtension;
|
||||
string checkFileExtension;
|
||||
DateTime? minimumDateTime;
|
||||
const string jpg = ".jpg";
|
||||
_InnerProgressBar.Step = 1;
|
||||
_InnerProgressBar.Value = 0;
|
||||
const string jpeg = ".jpeg";
|
||||
_InnerProgressBar.Visible = true;
|
||||
bool isValidImageFormatExtension;
|
||||
bool nameWithoutExtensionIsIdFormat;
|
||||
IReadOnlyList<MetadataExtractor.Directory> directories;
|
||||
string[] files = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
|
||||
if (files.All(l => l.EndsWith(".id")))
|
||||
{
|
||||
foreach (string file in files)
|
||||
File.Delete(file);
|
||||
}
|
||||
_InnerProgressBar.Maximum = files.Length;
|
||||
foreach (string file in files)
|
||||
{
|
||||
_InnerProgressBar.PerformStep();
|
||||
fileHolder = new(file);
|
||||
_Lines.Add(fileHolder.NameWithoutExtension);
|
||||
if (fileHolder.ExtensionLowered == ".id" || fileHolder.DirectoryName is null)
|
||||
continue;
|
||||
if (files.Contains($"{fileHolder.FullName}.id"))
|
||||
continue;
|
||||
isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
isIgnoreExtension = isValidImageFormatExtension && _Configuration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
nameWithoutExtensionIsIdFormat = IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
|
||||
if (!isIgnoreExtension && isValidImageFormatExtension)
|
||||
{
|
||||
if (fileHolder.ExtensionLowered == jpeg)
|
||||
{
|
||||
if (File.Exists($"{fileHolder.FullName}.id"))
|
||||
File.Move($"{fileHolder.FullName}.id", Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}.id"));
|
||||
File.Move(fileHolder.FullName, Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}"));
|
||||
}
|
||||
if (nameWithoutExtensionIsIdFormat)
|
||||
continue;
|
||||
}
|
||||
(dateTimes, id, message) = IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension);
|
||||
minimumDateTime = dateTimes.Min();
|
||||
if (minimumDateTime is null || !isIgnoreExtension && isValidImageFormatExtension)
|
||||
{
|
||||
dateTime = IProperty.GetDateTimeFromName(fileHolder);
|
||||
if (dateTime is null || minimumDateTime is null)
|
||||
timeSpan = new TimeSpan(0);
|
||||
else
|
||||
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTime.Value.Ticks));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!int.TryParse(Path.GetFileName(fileHolder.DirectoryName)[..4], out int year))
|
||||
year = minimumDateTime.Value.Year;
|
||||
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
|
||||
dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories);
|
||||
timeSpan = new TimeSpan(int.MaxValue);
|
||||
}
|
||||
if (dateTime is not null && timeSpan.TotalMinutes > 2)
|
||||
{
|
||||
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
|
||||
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}{checkFileExtension}");
|
||||
if (checkFile == fileHolder.FullName)
|
||||
continue;
|
||||
for (int i = 0; i < int.MaxValue; i++)
|
||||
{
|
||||
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks + i}{checkFileExtension}");
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
File.Move(fileHolder.FullName, checkFile);
|
||||
File.WriteAllText($"{checkFile}.id", $"{checkFile}{Environment.NewLine}{fileHolder.Name}");
|
||||
continue;
|
||||
}
|
||||
if (id is null)
|
||||
continue;
|
||||
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
|
||||
checkFile = Path.Combine(fileHolder.DirectoryName, $"{id.Value}{checkFileExtension}");
|
||||
if (checkFile == fileHolder.FullName || File.Exists(checkFile))
|
||||
continue;
|
||||
File.Move(fileHolder.FullName, checkFile);
|
||||
File.WriteAllText($"{checkFile}.id", $"{checkFile}{Environment.NewLine}{fileHolder.Name}");
|
||||
}
|
||||
_InnerProgressBar.Visible = false;
|
||||
}
|
||||
|
||||
private List<(string, FaceDistance)> GetFileAndFaceDistanceCollection(string[] files)
|
||||
{
|
||||
// int? id;
|
||||
string? json;
|
||||
// string? message;
|
||||
// DateTime? dateTime;
|
||||
// FileHolder fileHolder;
|
||||
// bool isIgnoreExtension;
|
||||
// DateTime? minimumDateTime;
|
||||
FaceDistance faceDistance;
|
||||
// bool isValidImageFormatExtension;
|
||||
List<(string, FaceDistance)> collection = new();
|
||||
Shared.Models.FaceEncoding? modelsFaceEncoding;
|
||||
IReadOnlyList<MetadataExtractor.Directory> directories;
|
||||
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding;
|
||||
_ProgressBar.Maximum = files.Length;
|
||||
foreach (string file in files)
|
||||
{
|
||||
_ProgressBar.PerformStep();
|
||||
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
|
||||
json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(directories);
|
||||
if (json is null)
|
||||
break;
|
||||
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (modelsFaceEncoding is null)
|
||||
throw new NotSupportedException();
|
||||
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
|
||||
faceDistance = new(faceRecognitionDotNetFaceEncoding);
|
||||
collection.Add(new(file, faceDistance));
|
||||
// fileHolder = new(file);
|
||||
// _Lines.Add(fileHolder.NameWithoutExtension);
|
||||
// isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
// isIgnoreExtension = isValidImageFormatExtension && _Configuration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
// if (isIgnoreExtension || !isValidImageFormatExtension)
|
||||
// continue;
|
||||
// if (fileHolder.CreationTime is null || fileHolder.Name.Contains(fileHolder.CreationTime.Value.ToString("yy")))
|
||||
// continue;
|
||||
// if (fileHolder.LastWriteTime is null || fileHolder.Name.Contains(fileHolder.LastWriteTime.Value.ToString("yy")))
|
||||
// continue;
|
||||
// if (fileHolder.NameWithoutExtension.Length == 1 || fileHolder.NameWithoutExtension[1..].All(l => char.IsNumber(l)))
|
||||
// continue;
|
||||
// if (fileHolder.DirectoryName is null)
|
||||
// continue;
|
||||
// dateTime = IProperty.GetDateTimeFromName(fileHolder);
|
||||
// if (dateTime is not null && fileHolder.Name.Contains(dateTime.Value.ToString("yy")))
|
||||
// continue;
|
||||
// (minimumDateTime, id, message) = IProperty.Get(fileHolder);
|
||||
// if (minimumDateTime is null || id is null)
|
||||
// continue;
|
||||
// if (fileHolder.Name.Contains(minimumDateTime.Value.ToString("yy")))
|
||||
// continue;
|
||||
// if (dateTime is not null && minimumDateTime.Value != dateTime.Value)
|
||||
// continue;
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
private static List<(string File, double? Sum)> GetFileAndSum(List<(string File, FaceDistance FaceDistance)> collection)
|
||||
{
|
||||
List<(string File, double? Sum)> results = new();
|
||||
List<double?> lengths = new();
|
||||
List<FaceDistance> faceDistanceLengths;
|
||||
int take = (int)(collection.Count * .3333);
|
||||
List<FaceDistance> faceDistances = collection.Select(l => l.FaceDistance).ToList();
|
||||
foreach ((string file, FaceDistance faceDistance) in collection)
|
||||
{
|
||||
lengths.Clear();
|
||||
faceDistanceLengths = FaceRecognition.FaceDistances(faceDistances, faceDistance);
|
||||
if (faceDistanceLengths.Count != faceDistances.Count)
|
||||
throw new NotSupportedException();
|
||||
lengths.AddRange(from l in faceDistanceLengths orderby l.Length is not null, l.Length select l.Length);
|
||||
results.Add(new(file, lengths.Take(take).Sum()));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private void ChangeDate(string directory, DateTime dateTime, string searchPattern)
|
||||
{
|
||||
string[] files = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
|
||||
_ProgressBar.Step = 1;
|
||||
_ProgressBar.Value = 0;
|
||||
_ProgressBar.Visible = true;
|
||||
List<(string File, double? Sum)> results;
|
||||
List<(string File, FaceDistance FaceDistance)> collection = GetFileAndFaceDistanceCollection(files);
|
||||
_ProgressBar.Maximum = files.Length;
|
||||
if (collection.Count != files.Length)
|
||||
results = new();
|
||||
else
|
||||
results = GetFileAndSum(collection);
|
||||
if (results.Count == files.Length)
|
||||
{
|
||||
foreach ((string file, double? sum) in results)
|
||||
{
|
||||
if (sum is null)
|
||||
continue;
|
||||
File.SetCreationTime(file, dateTime.AddSeconds(sum.Value));
|
||||
}
|
||||
}
|
||||
if (results.Count == files.Length)
|
||||
{ }
|
||||
}
|
||||
|
||||
private List<DateTime> GetBirthDates(string directory)
|
||||
{
|
||||
List<DateTime> results = new();
|
||||
string[] directoryNames = IPath.GetDirectoryNames(directory);
|
||||
foreach (string directoryName in directoryNames)
|
||||
{
|
||||
if (directoryName.Length != _Configuration.PersonBirthdayFormat.Length)
|
||||
continue;
|
||||
if (!DateTime.TryParseExact(directoryName, _Configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTime))
|
||||
continue;
|
||||
results.Add(dateTime);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private static void Rename2000(string[] paths)
|
||||
{
|
||||
string name;
|
||||
string check;
|
||||
string? directoryName;
|
||||
foreach (string path in paths)
|
||||
{
|
||||
name = Path.GetFileName(path).Trim();
|
||||
if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20")))
|
||||
// if (name.Length < 1 || !name.Contains(".Z.#20"))
|
||||
continue;
|
||||
directoryName = Path.GetDirectoryName(path);
|
||||
if (directoryName is null)
|
||||
continue;
|
||||
if (name.StartsWith("=20") || name.StartsWith("#20"))
|
||||
check = Path.Combine(directoryName, name[1..]);
|
||||
else
|
||||
check = Path.Combine(directoryName, $"zzz {name[5..]}");
|
||||
// check = Path.Combine(directoryName, name.Replace("#", string.Empty));
|
||||
if (Directory.Exists(check) || File.Exists(check))
|
||||
continue;
|
||||
if (!Directory.Exists(path))
|
||||
File.Move(path, check);
|
||||
else
|
||||
Directory.Move(path, check);
|
||||
}
|
||||
}
|
||||
|
||||
private void RenameFilesInDirectories(List<string> directories)
|
||||
{
|
||||
string directoryName;
|
||||
ReadOnlySpan<char> span;
|
||||
_ProgressBar.Step = 1;
|
||||
_ProgressBar.Visible = true;
|
||||
_ProgressBar.Maximum = directories.Count;
|
||||
for (int i = 1; i < 3; i++)
|
||||
{
|
||||
_ProgressBar.Value = 0;
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
_ProgressBar.PerformStep();
|
||||
if (directory.Length < 6)
|
||||
continue;
|
||||
directoryName = Path.GetFileName(directory);
|
||||
if (directory.Contains("!---"))
|
||||
span = "0";
|
||||
else
|
||||
span = directory.AsSpan(directory.Length - 5, 3);
|
||||
if (directoryName.Length != 1 || !int.TryParse(span, out int age))
|
||||
{
|
||||
if (i == 1)
|
||||
RenameFilesInDirectory(directory, "*Rename*");
|
||||
else if (i == 2)
|
||||
RenameFilesInDirectory(directory, "*");
|
||||
else
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (i == 1)
|
||||
{
|
||||
List<DateTime> birthDates = GetBirthDates(directory);
|
||||
if (birthDates.Count != 1)
|
||||
continue;
|
||||
ChangeDate(directory, birthDates[0].AddYears(age), "*");
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", _Lines);
|
||||
_Lines.Clear();
|
||||
_ProgressBar.Visible = false;
|
||||
}
|
||||
|
||||
private static void MoveMatches(string argZero)
|
||||
{
|
||||
string moveDirectory;
|
||||
string checkDirectory;
|
||||
int length = argZero.Length;
|
||||
string compareDirectory = "D:/";
|
||||
string[] directories = Directory.GetDirectories(argZero, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(directory))
|
||||
continue;
|
||||
checkDirectory = string.Concat(compareDirectory, directory[length..]);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
continue;
|
||||
moveDirectory = string.Concat(compareDirectory[..^1], directory[length..]);
|
||||
Directory.Move(checkDirectory, moveDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
private List<string> GetDirectoriesOrDoDragDrop(string[] paths)
|
||||
{
|
||||
List<string> results = new();
|
||||
string name;
|
||||
string[] segments;
|
||||
foreach (string path in paths)
|
||||
{
|
||||
name = Path.GetFileNameWithoutExtension(path);
|
||||
Text = name;
|
||||
segments = name.Split('.');
|
||||
if (Directory.Exists(path))
|
||||
{
|
||||
results.Add(path);
|
||||
results.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_IdToItem.Any())
|
||||
LoadData();
|
||||
if (int.TryParse(segments[0], out int id) && _IdToItem.TryGetValue(id, out Item? item))
|
||||
{
|
||||
Text = item.ImageFileHolder.Name;
|
||||
_TextBox.Text = item.ImageFileHolder.FullName;
|
||||
if (item.ImageFileHolder.DirectoryName is not null)
|
||||
_Logger.Information(item.ImageFileHolder.DirectoryName);
|
||||
if (!string.IsNullOrEmpty(item.ImageFileHolder.DirectoryName))
|
||||
_ = Process.Start("explorer.exe", string.Concat("\"", item.ImageFileHolder.DirectoryName, "\""));
|
||||
}
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
void Form1_DragDrop(object? sender, DragEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths)
|
||||
_TextBox.Text = string.Empty;
|
||||
else
|
||||
{
|
||||
if (paths.Length == 0 && paths[0].Contains("~~~"))
|
||||
MoveMatches(paths[0]);
|
||||
else if (paths.All(l => l.Contains("=20")) || paths.All(l => l.Contains("#20")))
|
||||
// if (paths.All(l => l.Contains('#')))
|
||||
Rename2000(paths);
|
||||
else
|
||||
{
|
||||
List<string> directories = GetDirectoriesOrDoDragDrop(paths);
|
||||
if (directories.Any())
|
||||
{
|
||||
RenameFilesInDirectories(directories);
|
||||
string? parentDirectory = Path.GetDirectoryName(directories[0]);
|
||||
if (parentDirectory is not null && parentDirectory != Path.GetPathRoot(directories[0]))
|
||||
_ = IPath.DeleteEmptyDirectories(parentDirectory);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Duplicate-Search</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Face</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.FaceParts</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.FaceRecognitionDotNet</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Instance</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Map</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Metadata</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Not.Copy.Copy</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.PhotoPrism</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.PrepareForOld</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Property.Compare</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Property</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
26
Rename/.vscode/launch.json
vendored
Normal file
26
Rename/.vscode/launch.json
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||
// Use hover for the description of the existing attributes
|
||||
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
|
||||
"name": ".NET Core Launch (console)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/bin/Debug/net7.0/win-x64/Rename.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Attach",
|
||||
"type": "coreclr",
|
||||
"request": "attach"
|
||||
}
|
||||
]
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
"type": "process",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/Drag-Drop.csproj",
|
||||
"${workspaceFolder}/Rename.csproj",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
@ -19,7 +19,7 @@
|
||||
"type": "process",
|
||||
"args": [
|
||||
"publish",
|
||||
"${workspaceFolder}/Drag-Drop.csproj",
|
||||
"${workspaceFolder}/Rename.csproj",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
@ -33,7 +33,7 @@
|
||||
"watch",
|
||||
"run",
|
||||
"--project",
|
||||
"${workspaceFolder}/Drag-Drop.csproj"
|
||||
"${workspaceFolder}/Rename.csproj"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
29
Rename/Models/AppSettings.cs
Normal file
29
Rename/Models/AppSettings.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace View_by_Distance.Rename.Models;
|
||||
|
||||
public class AppSettings
|
||||
{
|
||||
|
||||
public string Company { init; get; }
|
||||
public string ComparePathsFile { init; get; }
|
||||
public int MaxDegreeOfParallelism { init; get; }
|
||||
public string WorkingDirectoryName { init; get; }
|
||||
|
||||
[JsonConstructor]
|
||||
public AppSettings(string company, string comparePathsFile, int maxDegreeOfParallelism, string workingDirectoryName)
|
||||
{
|
||||
Company = company;
|
||||
ComparePathsFile = comparePathsFile;
|
||||
MaxDegreeOfParallelism = maxDegreeOfParallelism;
|
||||
WorkingDirectoryName = workingDirectoryName;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
46
Rename/Models/Binder/AppSettings.cs
Normal file
46
Rename/Models/Binder/AppSettings.cs
Normal file
@ -0,0 +1,46 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace View_by_Distance.Rename.Models.Binder;
|
||||
|
||||
public class AppSettings
|
||||
{
|
||||
|
||||
#nullable disable
|
||||
|
||||
public string Company { get; set; }
|
||||
public string ComparePathsFile { get; set; }
|
||||
public int? MaxDegreeOfParallelism { get; set; }
|
||||
public string WorkingDirectoryName { get; set; }
|
||||
|
||||
#nullable restore
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Models.AppSettings Get(AppSettings? appSettings)
|
||||
{
|
||||
Models.AppSettings result;
|
||||
if (appSettings?.MaxDegreeOfParallelism is null)
|
||||
throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism));
|
||||
result = new(
|
||||
appSettings.Company,
|
||||
appSettings.ComparePathsFile,
|
||||
appSettings.MaxDegreeOfParallelism.Value,
|
||||
appSettings.WorkingDirectoryName
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
|
||||
{
|
||||
Models.AppSettings result;
|
||||
AppSettings? appSettings = configurationRoot.Get<AppSettings>();
|
||||
result = Get(appSettings);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
59
Rename/Models/Binder/Configuration.cs
Normal file
59
Rename/Models/Binder/Configuration.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Phares.Shared;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace View_by_Distance.Rename.Models.Binder;
|
||||
|
||||
public class Configuration
|
||||
{
|
||||
|
||||
#nullable disable
|
||||
|
||||
[Display(Name = "Ignore Extensions"), Required] public string[] IgnoreExtensions { get; set; }
|
||||
[Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; }
|
||||
[Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; }
|
||||
|
||||
#nullable restore
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Models.Configuration Get(Configuration? configuration)
|
||||
{
|
||||
Models.Configuration result;
|
||||
if (configuration is null)
|
||||
throw new NullReferenceException(nameof(configuration));
|
||||
if (configuration.IgnoreExtensions is null)
|
||||
throw new NullReferenceException(nameof(configuration.IgnoreExtensions));
|
||||
if (configuration.PersonBirthdayFormat is null)
|
||||
throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat));
|
||||
result = new(
|
||||
configuration.IgnoreExtensions,
|
||||
configuration.PersonBirthdayFormat,
|
||||
configuration.PropertyConfiguration);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Models.Configuration Get(IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, Property.Models.Configuration propertyConfiguration)
|
||||
{
|
||||
Models.Configuration result;
|
||||
Configuration? configuration;
|
||||
if (isEnvironment is null)
|
||||
configuration = configurationRoot.Get<Configuration>();
|
||||
else
|
||||
{
|
||||
string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment);
|
||||
string section = string.Concat(environmentName, ":", nameof(Configuration));
|
||||
IConfigurationSection configurationSection = configurationRoot.GetSection(section);
|
||||
configuration = configurationSection.Get<Configuration>();
|
||||
}
|
||||
result = Get(configuration);
|
||||
result.SetAndUpdate(propertyConfiguration);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
38
Rename/Models/Configuration.cs
Normal file
38
Rename/Models/Configuration.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace View_by_Distance.Rename.Models;
|
||||
|
||||
public class Configuration
|
||||
{
|
||||
|
||||
protected Property.Models.Configuration _PropertyConfiguration;
|
||||
public string[] IgnoreExtensions { init; get; }
|
||||
public string PersonBirthdayFormat { init; get; }
|
||||
|
||||
public Property.Models.Configuration PropertyConfiguration => _PropertyConfiguration;
|
||||
|
||||
[JsonConstructor]
|
||||
public Configuration(
|
||||
string[] ignoreExtensions,
|
||||
string personBirthdayFormat,
|
||||
Property.Models.Configuration propertyConfiguration)
|
||||
{
|
||||
IgnoreExtensions = ignoreExtensions;
|
||||
PersonBirthdayFormat = personBirthdayFormat;
|
||||
_PropertyConfiguration = propertyConfiguration;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||
return result;
|
||||
}
|
||||
|
||||
public void SetAndUpdate(Property.Models.Configuration configuration)
|
||||
{
|
||||
_PropertyConfiguration = configuration;
|
||||
_PropertyConfiguration.Update();
|
||||
}
|
||||
|
||||
}
|
10
Rename/Models/Stateless/SerilogExtensionMethods.cs
Normal file
10
Rename/Models/Stateless/SerilogExtensionMethods.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace View_by_Distance.Rename.Models.Stateless;
|
||||
|
||||
public static class SerilogExtensionMethods
|
||||
{
|
||||
|
||||
internal static void Warn(this Serilog.ILogger log, string messageTemplate) => log.Warning(messageTemplate);
|
||||
|
||||
internal static void Info(this Serilog.ILogger log, string messageTemplate) => log.Information(messageTemplate);
|
||||
|
||||
}
|
70
Rename/Program.cs
Normal file
70
Rename/Program.cs
Normal file
@ -0,0 +1,70 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Phares.Shared;
|
||||
using Serilog;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using View_by_Distance.Rename.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Rename;
|
||||
|
||||
public class Program
|
||||
{
|
||||
|
||||
public static void Secondary(List<string> args)
|
||||
{
|
||||
LoggerConfiguration loggerConfiguration = new();
|
||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||
bool debuggerWasAttachedAtLineZero = Debugger.IsAttached || assembly.Location.Contains(@"\bin\Debug");
|
||||
IsEnvironment isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero);
|
||||
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
|
||||
.AddEnvironmentVariables()
|
||||
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
|
||||
.AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true);
|
||||
IConfigurationRoot configurationRoot = configurationBuilder.Build();
|
||||
AppSettings appSettings = Models.Binder.AppSettings.Get(configurationRoot);
|
||||
if (appSettings.MaxDegreeOfParallelism > Environment.ProcessorCount)
|
||||
throw new Exception("MaxDegreeOfParallelism must be =< Environment.ProcessorCount!");
|
||||
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
|
||||
throw new Exception("Working directory name must have a value!");
|
||||
string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName);
|
||||
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
|
||||
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
|
||||
Log.Logger = loggerConfiguration.CreateLogger();
|
||||
ILogger log = Log.ForContext<Program>();
|
||||
int silentIndex = args.IndexOf("s");
|
||||
if (silentIndex > -1)
|
||||
args.RemoveAt(silentIndex);
|
||||
try
|
||||
{
|
||||
if (args is null)
|
||||
throw new Exception("args is null!");
|
||||
Shared.Models.Console console = new();
|
||||
_ = new Rename(args, isEnvironment, configurationRoot, appSettings, workingDirectory, silentIndex > -1, console);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.Fatal(string.Concat(ex.Message, Environment.NewLine, ex.StackTrace));
|
||||
}
|
||||
finally
|
||||
{
|
||||
Log.CloseAndFlush();
|
||||
}
|
||||
if (silentIndex > -1)
|
||||
log.Debug("Done. Bye");
|
||||
else
|
||||
{
|
||||
log.Debug("Done. Press 'Enter' to end");
|
||||
_ = Console.ReadLine();
|
||||
}
|
||||
}
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
if (args is not null)
|
||||
Secondary(args.ToList());
|
||||
else
|
||||
Secondary(new List<string>());
|
||||
}
|
||||
|
||||
}
|
270
Rename/Rename.cs
Normal file
270
Rename/Rename.cs
Normal file
@ -0,0 +1,270 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Phares.Shared;
|
||||
using Serilog;
|
||||
using ShellProgressBar;
|
||||
using View_by_Distance.Rename.Models;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Methods;
|
||||
|
||||
namespace View_by_Distance.Rename;
|
||||
|
||||
public class Rename
|
||||
{
|
||||
|
||||
private readonly AppSettings _AppSettings;
|
||||
private readonly string _WorkingDirectory;
|
||||
private readonly IsEnvironment _IsEnvironment;
|
||||
private readonly Configuration _Configuration;
|
||||
private readonly IConfigurationRoot _ConfigurationRoot;
|
||||
private readonly Property.Models.Configuration _PropertyConfiguration;
|
||||
|
||||
public Rename(List<string> args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
|
||||
{
|
||||
if (isSilent)
|
||||
{ }
|
||||
if (console is null)
|
||||
{ }
|
||||
_AppSettings = appSettings;
|
||||
_IsEnvironment = isEnvironment;
|
||||
long ticks = DateTime.Now.Ticks;
|
||||
_WorkingDirectory = workingDirectory;
|
||||
_ConfigurationRoot = configurationRoot;
|
||||
ILogger? log = Log.ForContext<Rename>();
|
||||
Dictionary<long, Dictionary<long, List<string>>> fileSizeToCollection = new();
|
||||
Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
|
||||
Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
|
||||
_PropertyConfiguration = propertyConfiguration;
|
||||
_Configuration = configuration;
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
propertyConfiguration.Update();
|
||||
string? comparePathRoot = Path.GetDirectoryName(appSettings.ComparePathsFile);
|
||||
if (comparePathRoot is null || comparePathRoot == propertyConfiguration.RootDirectory)
|
||||
throw new Exception("Nested isn't allowed!");
|
||||
log.Information(propertyConfiguration.RootDirectory);
|
||||
Verify();
|
||||
string json = File.ReadAllText(appSettings.ComparePathsFile);
|
||||
MatchNginx[]? matchNginxCollection = System.Text.Json.JsonSerializer.Deserialize<MatchNginx[]>(json);
|
||||
if (matchNginxCollection is null)
|
||||
throw new NullReferenceException(nameof(matchNginxCollection));
|
||||
if (matchNginxCollection.Length == 0 && matchNginxCollection[0].ConvertedPath.Contains("~~~"))
|
||||
MoveMatches(matchNginxCollection[0]);
|
||||
else if (matchNginxCollection.All(l => l.Name.StartsWith("#")) || matchNginxCollection.All(l => l.Name.StartsWith(" #")) || matchNginxCollection.All(l => l.Name.StartsWith("=20")) || matchNginxCollection.All(l => l.Name.StartsWith("#20")))
|
||||
Rename2000(matchNginxCollection);
|
||||
else if (matchNginxCollection.Any())
|
||||
{
|
||||
List<string> lines = RenameFilesInDirectories(options, matchNginxCollection);
|
||||
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines);
|
||||
if (comparePathRoot != Path.GetPathRoot(matchNginxCollection[0].ConvertedPath))
|
||||
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(comparePathRoot);
|
||||
}
|
||||
}
|
||||
|
||||
private void Verify()
|
||||
{
|
||||
if (_AppSettings is null)
|
||||
{ }
|
||||
if (_IsEnvironment is null)
|
||||
{ }
|
||||
if (_Configuration is null)
|
||||
{ }
|
||||
if (_ConfigurationRoot is null)
|
||||
{ }
|
||||
if (_WorkingDirectory is null)
|
||||
{ }
|
||||
}
|
||||
|
||||
private static void MoveMatches(MatchNginx matchNginx)
|
||||
{
|
||||
string moveDirectory;
|
||||
string checkDirectory;
|
||||
string compareDirectory = "D:/";
|
||||
int length = matchNginx.ConvertedPath.Length;
|
||||
string[] directories = Directory.GetDirectories(matchNginx.ConvertedPath, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(directory))
|
||||
continue;
|
||||
checkDirectory = string.Concat(compareDirectory, directory[length..]);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
continue;
|
||||
moveDirectory = string.Concat(compareDirectory[..^1], directory[length..]);
|
||||
Directory.Move(checkDirectory, moveDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
private (List<(FileHolder, string)>, int) RenameFilesInDirectory(ProgressBar progressBar, string[] files)
|
||||
{
|
||||
List<(FileHolder, string)> results = new();
|
||||
int? id;
|
||||
string? message;
|
||||
string checkFile;
|
||||
TimeSpan timeSpan;
|
||||
DateTime? dateTime;
|
||||
DateTime?[] dateTimes;
|
||||
FileHolder fileHolder;
|
||||
bool isIgnoreExtension;
|
||||
string checkFileExtension;
|
||||
DateTime? minimumDateTime;
|
||||
const string jpg = ".jpg";
|
||||
const string jpeg = ".jpeg";
|
||||
bool isValidImageFormatExtension;
|
||||
bool nameWithoutExtensionIsIdFormat;
|
||||
List<string> distinctCollection = new();
|
||||
IReadOnlyList<MetadataExtractor.Directory> directories;
|
||||
foreach (string file in files)
|
||||
{
|
||||
progressBar.Tick();
|
||||
fileHolder = new(file);
|
||||
if (fileHolder.ExtensionLowered == ".id" || fileHolder.DirectoryName is null)
|
||||
continue;
|
||||
if (files.Contains($"{fileHolder.FullName}.id"))
|
||||
continue;
|
||||
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
isIgnoreExtension = isValidImageFormatExtension && _Configuration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
|
||||
if (!isIgnoreExtension && isValidImageFormatExtension)
|
||||
{
|
||||
if (fileHolder.ExtensionLowered == jpeg)
|
||||
{
|
||||
if (File.Exists($"{fileHolder.FullName}.id"))
|
||||
File.Move($"{fileHolder.FullName}.id", Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}.id"));
|
||||
File.Move(fileHolder.FullName, Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}"));
|
||||
}
|
||||
if (nameWithoutExtensionIsIdFormat)
|
||||
continue;
|
||||
}
|
||||
(dateTimes, id, message) = Shared.Models.Stateless.Methods.IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension);
|
||||
minimumDateTime = dateTimes.Min();
|
||||
if (minimumDateTime is null || !isIgnoreExtension && isValidImageFormatExtension)
|
||||
{
|
||||
dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTimeFromName(fileHolder);
|
||||
if (dateTime is null || minimumDateTime is null)
|
||||
timeSpan = new TimeSpan(0);
|
||||
else
|
||||
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTime.Value.Ticks));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!int.TryParse(Path.GetFileName(fileHolder.DirectoryName)[..4], out int year))
|
||||
year = minimumDateTime.Value.Year;
|
||||
try
|
||||
{ directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file); }
|
||||
catch (Exception) { continue; }
|
||||
dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories);
|
||||
timeSpan = new TimeSpan(int.MaxValue);
|
||||
}
|
||||
if (dateTime is not null && timeSpan.TotalMinutes > 2)
|
||||
{
|
||||
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
|
||||
if (!isIgnoreExtension && isValidImageFormatExtension)
|
||||
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}{checkFileExtension}");
|
||||
else
|
||||
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}");
|
||||
if (checkFile == fileHolder.FullName)
|
||||
continue;
|
||||
if (distinctCollection.Contains(checkFile))
|
||||
continue;
|
||||
distinctCollection.Add(checkFile);
|
||||
results.Add(new(fileHolder, checkFile));
|
||||
continue;
|
||||
}
|
||||
if (id is null)
|
||||
continue;
|
||||
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
|
||||
checkFile = Path.Combine(fileHolder.DirectoryName, $"{id.Value}{checkFileExtension}");
|
||||
if (checkFile == fileHolder.FullName || File.Exists(checkFile))
|
||||
continue;
|
||||
if (distinctCollection.Contains(checkFile))
|
||||
continue;
|
||||
results.Add(new(fileHolder, checkFile));
|
||||
}
|
||||
return new(results, distinctCollection.Count);
|
||||
}
|
||||
|
||||
private static void Rename2000(MatchNginx[] matchNginxCollection)
|
||||
{
|
||||
string name;
|
||||
string check;
|
||||
string? directoryName;
|
||||
foreach (MatchNginx matchNginx in matchNginxCollection)
|
||||
{
|
||||
name = matchNginx.Name.Trim();
|
||||
if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20")))
|
||||
// if (name.Length < 1 || !name.Contains(".Z.#20"))
|
||||
continue;
|
||||
directoryName = Path.GetDirectoryName(matchNginx.ConvertedPath);
|
||||
if (directoryName is null)
|
||||
continue;
|
||||
if (name.StartsWith("=20") || name.StartsWith("#20"))
|
||||
check = Path.Combine(directoryName, name[1..]);
|
||||
else
|
||||
check = Path.Combine(directoryName, $"zzz {name[5..]}");
|
||||
// check = Path.Combine(directoryName, name.Replace("#", string.Empty));
|
||||
if (Directory.Exists(check) || File.Exists(check))
|
||||
continue;
|
||||
if (!Directory.Exists(matchNginx.ConvertedPath))
|
||||
File.Move(matchNginx.ConvertedPath, check);
|
||||
else
|
||||
Directory.Move(matchNginx.ConvertedPath, check);
|
||||
}
|
||||
}
|
||||
|
||||
private static List<string> GetAllFiles(MatchNginx[] matchNginxCollection)
|
||||
{
|
||||
List<string> allFiles = new();
|
||||
string[] files;
|
||||
string directoryName;
|
||||
ReadOnlySpan<char> span;
|
||||
foreach (MatchNginx matchNginx in matchNginxCollection)
|
||||
{
|
||||
if (matchNginx.ConvertedPath.Length < 6)
|
||||
continue;
|
||||
directoryName = Path.GetFileName(matchNginx.ConvertedPath);
|
||||
if (matchNginx.ConvertedPath.Contains("!---"))
|
||||
span = "0";
|
||||
else
|
||||
span = matchNginx.ConvertedPath.AsSpan(matchNginx.ConvertedPath.Length - 5, 3);
|
||||
if (directoryName.Length == 1 && int.TryParse(span, out int age))
|
||||
continue;
|
||||
if (File.Exists(matchNginx.ConvertedPath))
|
||||
continue;
|
||||
files = Directory.GetFiles(matchNginx.ConvertedPath, "*", SearchOption.TopDirectoryOnly);
|
||||
if (files.All(l => l.EndsWith(".id")))
|
||||
{
|
||||
foreach (string file in files)
|
||||
File.Delete(file);
|
||||
continue;
|
||||
}
|
||||
allFiles.AddRange(files);
|
||||
}
|
||||
return allFiles;
|
||||
}
|
||||
|
||||
private List<string> RenameFilesInDirectories(ProgressBarOptions options, MatchNginx[] matchNginxCollection)
|
||||
{
|
||||
List<string> results = new();
|
||||
string[] files;
|
||||
int distinctCount;
|
||||
string message = "Renaming files";
|
||||
List<(FileHolder, string)> renameCollection;
|
||||
List<string> allFiles = GetAllFiles(matchNginxCollection);
|
||||
using ProgressBar progressBar = new(matchNginxCollection.Length * 2, message, options);
|
||||
for (int i = 1; i < 3; i++)
|
||||
{
|
||||
files = i == 2 ? allFiles.ToArray() : (from l in allFiles where l.Contains("Rename") select l).ToArray();
|
||||
(renameCollection, distinctCount) = RenameFilesInDirectory(progressBar, files);
|
||||
foreach ((FileHolder fileHolder, string to) in renameCollection)
|
||||
{
|
||||
results.Add(fileHolder.NameWithoutExtension);
|
||||
if (renameCollection.Count != distinctCount)
|
||||
continue;
|
||||
if (File.Exists(to))
|
||||
continue;
|
||||
File.Move(fileHolder.FullName, to);
|
||||
File.WriteAllText($"{to}.id", $"{to}{Environment.NewLine}{fileHolder.FullName}");
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
60
Rename/Rename.csproj
Normal file
60
Rename/Rename.csproj
Normal file
@ -0,0 +1,60 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<LangVersion>10.0</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Rename</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
|
||||
<IsOSX Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' == 'true'">true</IsOSX>
|
||||
<IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(IsWindows)'=='true'">
|
||||
<DefineConstants>Windows</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(IsOSX)'=='true'">
|
||||
<DefineConstants>OSX</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(IsLinux)'=='true'">
|
||||
<DefineConstants>Linux</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'browser-wasm'">
|
||||
<SupportedPlatform Include="browser" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
|
||||
<PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
||||
<PackageReference Include="Serilog" Version="2.12.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Metadata\Metadata.csproj" />
|
||||
<ProjectReference Include="..\Property\Property.csproj" />
|
||||
<ProjectReference Include="..\Resize\Resize.csproj" />
|
||||
<ProjectReference Include="..\Shared\View-by-Distance.Shared.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="appsettings.Development.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="appsettings.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
18
Rename/appsettings.Development.json
Normal file
18
Rename/appsettings.Development.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_01/638082668201867717.json",
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Log4netProvider": "Debug"
|
||||
}
|
||||
},
|
||||
"MaxDegreeOfParallelism": 6,
|
||||
"Serilog": {
|
||||
"MinimumLevel": "Debug"
|
||||
},
|
||||
"Windows": {
|
||||
"Configuration": {
|
||||
"RootDirectory": "C:/",
|
||||
"VerifyToSeason": []
|
||||
}
|
||||
}
|
||||
}
|
118
Rename/appsettings.json
Normal file
118
Rename/appsettings.json
Normal file
@ -0,0 +1,118 @@
|
||||
{
|
||||
"ComparePathsFile": "",
|
||||
"Company": "Mike Phares",
|
||||
"Linux": {},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Log4netProvider": "Debug",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"MaxDegreeOfParallelism": 6,
|
||||
"Serilog": {
|
||||
"Using": [
|
||||
"Serilog.Sinks.Console",
|
||||
"Serilog.Sinks.File"
|
||||
],
|
||||
"MinimumLevel": "Information",
|
||||
"WriteTo": [
|
||||
{
|
||||
"Name": "Debug",
|
||||
"Args": {
|
||||
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"Name": "Console",
|
||||
"Args": {
|
||||
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"Name": "File",
|
||||
"Args": {
|
||||
"path": "%workingDirectory% - Log/log-.txt",
|
||||
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}",
|
||||
"rollingInterval": "Hour"
|
||||
}
|
||||
}
|
||||
],
|
||||
"Enrich": [
|
||||
"FromLogContext",
|
||||
"WithMachineName",
|
||||
"WithThreadId"
|
||||
],
|
||||
"Properties": {
|
||||
"Application": "Sample"
|
||||
}
|
||||
},
|
||||
"WorkingDirectoryName": "PharesApps",
|
||||
"Windows": {
|
||||
"Configuration": {
|
||||
"DateGroup": "45f4401",
|
||||
"DiffPropertyDirectory": "",
|
||||
"FileNameDirectorySeparator": ".Z.",
|
||||
"ForcePropertyLastWriteTimeToCreationTime": false,
|
||||
"MaxImagesInDirectoryForTopLevelFirstPass": 10,
|
||||
"OutputExtension": ".jpg",
|
||||
"Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]",
|
||||
"PersonBirthdayFormat": "yyyy-MM-dd_HH",
|
||||
"PopulatePropertyId": true,
|
||||
"PropertiesChangedForProperty": false,
|
||||
"ResultAllInOne": "_ _ _",
|
||||
"ResultCollection": "[]",
|
||||
"ResultContent": "()",
|
||||
"ResultSingleton": "{}",
|
||||
"RootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
|
||||
"WriteBitmapDataBytes": false,
|
||||
"IgnoreExtensions": [
|
||||
".gif",
|
||||
".GIF"
|
||||
],
|
||||
"ValidImageFormatExtensions": [
|
||||
".bmp",
|
||||
".BMP",
|
||||
".gif",
|
||||
".GIF",
|
||||
".jpeg",
|
||||
".JPEG",
|
||||
".jpg",
|
||||
".JPG",
|
||||
".png",
|
||||
".PNG",
|
||||
".tiff",
|
||||
".TIFF"
|
||||
],
|
||||
"ValidMetadataExtensions": [
|
||||
".3gp",
|
||||
".3GP",
|
||||
".avi",
|
||||
".AVI",
|
||||
".bmp",
|
||||
".BMP",
|
||||
".gif",
|
||||
".GIF",
|
||||
".ico",
|
||||
".ICO",
|
||||
".jpeg",
|
||||
".JPEG",
|
||||
".jpg",
|
||||
".JPG",
|
||||
".m4v",
|
||||
".M4V",
|
||||
".mov",
|
||||
".MOV",
|
||||
".mp4",
|
||||
".MP4",
|
||||
".mta",
|
||||
".MTA",
|
||||
".png",
|
||||
".PNG",
|
||||
".tiff",
|
||||
".TIFF"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Resize</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -1,4 +1,4 @@
|
||||
namespace View_by_Distance.Drag_Drop_Explorer;
|
||||
namespace View_by_Distance.Shared.Models;
|
||||
|
||||
public record MatchNginx(string Name, string Type, DateTime MTime, long Size, string ConvertedPath)
|
||||
{ }
|
@ -9,7 +9,7 @@
|
||||
<PropertyGroup>
|
||||
<PackageId>Phares.View.by.Distance.Shared</PackageId>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<Version>6.0.100.1</Version>
|
||||
<Version>7.0.101.1</Version>
|
||||
<Authors>Mike Phares</Authors>
|
||||
<Company>Phares</Company>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
|
@ -80,6 +80,8 @@ public partial class UnitTestCalculations
|
||||
{
|
||||
PersonBirthday personBirthday = new(new(1980, 1, 17));
|
||||
double? age = IPersonBirthday.GetAge(personBirthday);
|
||||
if (age is null)
|
||||
throw new NullReferenceException(nameof(age));
|
||||
Assert.IsNotNull(age);
|
||||
Assert.IsTrue(age.Value > 42.6092);
|
||||
}
|
||||
|
@ -3,49 +3,51 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30114.105
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "View-by-Distance.Shared", "shared\View-by-Distance.Shared.csproj", "{1D231660-33B4-4763-9C9F-C6ACC8BA600D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Date-Group", "Date-Group\Date-Group.csproj", "{DFEDB5F9-AFFC-40A2-9FEC-9B84C83B63D9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Metadata", "Metadata\Metadata.csproj", "{961D11A0-44C8-48CD-BEEE-A6E6903AE58F}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Distinct", "Delete-By-Distinct\Delete-By-Distinct.csproj", "{3F00BDD5-75F8-470C-ACED-1A26FDC8D7B3}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Not-Copy-Copy", "Not-Copy-Copy\Not-Copy-Copy.csproj", "{BF81D265-36E3-4DCA-891B-A0D875C1E68A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrepareForOld", "PrepareForOld\PrepareForOld.csproj", "{F73F9468-0139-4B05-99CE-C6C0403D03E5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property", "Property\Property.csproj", "{964B969A-719C-48AF-86C0-F97AF1397347}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property-Compare", "Property-Compare\Property-Compare.csproj", "{692AA058-F142-44B0-88BC-F22AB5BE5EDF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Resize", "Resize\Resize.csproj", "{27D0D869-394D-4B07-83DF-2095B16026FC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{B4FB6B43-36EC-404D-B934-5C695C6E32CC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceRecognitionDotNet", "FaceRecognitionDotNet\FaceRecognitionDotNet.csproj", "{FAD03DA9-E8B1-4BBE-B8D0-2ADD2F2BC758}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsWithFaceRecognitionDotNet", "TestsWithFaceRecognitionDotNet\TestsWithFaceRecognitionDotNet.csproj", "{A67D73C7-A1A1-4443-B681-776339CFA08A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Map", "Map\Map.csproj", "{960BBED6-BF2C-4337-8330-F858606F4343}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Instance", "Instance\Instance.csproj", "{8085C1EE-C4DB-43DE-8888-1C956D69CF91}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Relative", "Delete-By-Relative\Delete-By-Relative.csproj", "{9DFCA595-80AA-4E78-A9AF-5B4AB4D737C4}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Distance", "Distance\Distance.csproj", "{8D444B55-933C-40CD-B7FC-226136F16138}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop-Explorer", "Drag-Drop-Explorer\Drag-Drop-Explorer.csproj", "{986B009B-2937-4624-AC9C-13806868DB8C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop-Search", "Drag-Drop-Search\Drag-Drop-Search.csproj", "{87EB76BC-32A9-4FD0-922A-BD7E9B6E7D8B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicate-Search", "Duplicate-Search\Duplicate-Search.csproj", "{48E87D9B-B802-467A-BDC7-E86F7FD01D5C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Face", "Face\Face.csproj", "{A12E19E5-59C0-40D4-B807-DF1334D4906D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceParts", "FaceParts\FaceParts.csproj", "{919525B1-60BA-40C6-BA66-6F7F4C526E01}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop", "Drag-Drop\Drag-Drop.csproj", "{87EB76BC-32A9-4FD0-922A-BD7E9B6E7D8B}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceRecognitionDotNet", "FaceRecognitionDotNet\FaceRecognitionDotNet.csproj", "{FAD03DA9-E8B1-4BBE-B8D0-2ADD2F2BC758}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicate-Search", "Duplicate-Search\Duplicate-Search.csproj", "{48E87D9B-B802-467A-BDC7-E86F7FD01D5C}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Instance", "Instance\Instance.csproj", "{8085C1EE-C4DB-43DE-8888-1C956D69CF91}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Relative", "Delete-By-Relative\Delete-By-Relative.csproj", "{9DFCA595-80AA-4E78-A9AF-5B4AB4D737C4}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Map", "Map\Map.csproj", "{960BBED6-BF2C-4337-8330-F858606F4343}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Distinct", "Delete-By-Distinct\Delete-By-Distinct.csproj", "{3F00BDD5-75F8-470C-ACED-1A26FDC8D7B3}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Metadata", "Metadata\Metadata.csproj", "{961D11A0-44C8-48CD-BEEE-A6E6903AE58F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Not-Copy-Copy", "Not-Copy-Copy\Not-Copy-Copy.csproj", "{BF81D265-36E3-4DCA-891B-A0D875C1E68A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhotoPrism", "PhotoPrism\PhotoPrism.csproj", "{DF4B0776-E0E5-4220-8721-8D1E491FF263}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop-Explorer", "Drag-Drop-Explorer\Drag-Drop-Explorer.csproj", "{986B009B-2937-4624-AC9C-13806868DB8C}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrepareForOld", "PrepareForOld\PrepareForOld.csproj", "{F73F9468-0139-4B05-99CE-C6C0403D03E5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property-Compare", "Property-Compare\Property-Compare.csproj", "{692AA058-F142-44B0-88BC-F22AB5BE5EDF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property", "Property\Property.csproj", "{964B969A-719C-48AF-86C0-F97AF1397347}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rename", "Rename\Rename.csproj", "{83FD089F-8034-4597-B87F-87D343C0486B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Resize", "Resize\Resize.csproj", "{27D0D869-394D-4B07-83DF-2095B16026FC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{B4FB6B43-36EC-404D-B934-5C695C6E32CC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsWithFaceRecognitionDotNet", "TestsWithFaceRecognitionDotNet\TestsWithFaceRecognitionDotNet.csproj", "{A67D73C7-A1A1-4443-B681-776339CFA08A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "View-by-Distance.Shared", "shared\View-by-Distance.Shared.csproj", "{1D231660-33B4-4763-9C9F-C6ACC8BA600D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@ -144,5 +146,9 @@ Global
|
||||
{986B009B-2937-4624-AC9C-13806868DB8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{986B009B-2937-4624-AC9C-13806868DB8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{986B009B-2937-4624-AC9C-13806868DB8C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{83FD089F-8034-4597-B87F-87D343C0486B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{83FD089F-8034-4597-B87F-87D343C0486B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{83FD089F-8034-4597-B87F-87D343C0486B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{83FD089F-8034-4597-B87F-87D343C0486B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
Loading…
x
Reference in New Issue
Block a user