Compare commits

5 Commits

Author SHA1 Message Date
Александр
f7550ddc75 add: base GUI 2026-03-04 18:50:21 +03:00
Александр
c4f81b6904 fix: extract core 2026-03-04 18:02:12 +03:00
Александр
ac7bbe303c extract core 2026-03-04 12:23:29 +03:00
Александр
5e5ad24cef Revert "fix: extract core"
This reverts commit a9cf2ec6b8a7535742f22e936fee4618305e0afb.
2026-03-04 12:20:25 +03:00
Александр
a9cf2ec6b8 Refactor project structure 2026-03-04 12:19:34 +03:00
136 changed files with 3135 additions and 134 deletions

4
.gitignore vendored
View File

@@ -1,2 +1,4 @@
src/bin/
src/obj/
src/obj/
.vs/
.git/

View File

@@ -0,0 +1,52 @@
using UniversalTagEditor.Core;
class Program
{
static async Task Main(string[] args)
{
var opt = ParseArgs(args);
var log = new Progress<string>(Console.WriteLine);
var prog = new Progress<ProgressInfo>(p =>
Console.Title = $"UniversalTagEditor {p.Done}/{p.Total}");
await Runner.RunAsync(opt, log, prog);
}
static UteOptions ParseArgs(string[] args)
{
string? albumInfo = null;
string? albumCover = null;
string? format = null;
string? workingDirectory = null;
bool fixTags = false;
bool enhanceStructure = false;
for (int i = 0; i < args.Length; i++)
{
switch (args[i])
{
case "-w": workingDirectory = args[++i]; break;
case "-a": albumInfo = args[++i]; break;
case "-f": format = args[++i]; break;
case "-c": albumCover = args[++i]; break;
case "--fix-tags": fixTags = true; break;
case "--enhance-structure": enhanceStructure = true; break;
}
}
if (string.IsNullOrWhiteSpace(workingDirectory))
throw new ArgumentException("Нужен -w <path>");
return new UteOptions
{
WorkingDirectory = workingDirectory,
AlbumInfoCsv = albumInfo,
AlbumCover = albumCover,
Format = format,
FixTags = fixTags,
EnhanceStructure = enhanceStructure,
MaxDegreeOfParallelism = 4
};
}
}

View File

@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\UniversalTagEditor.Core\UniversalTagEditor.Core.csproj" />
</ItemGroup>
</Project>

Binary file not shown.

View File

@@ -0,0 +1,126 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"UniversalTagEditor.CUI/1.0.0": {
"dependencies": {
"UniversalTagEditor.Core": "1.0.0"
},
"runtime": {
"UniversalTagEditor.CUI.dll": {}
}
},
"CsvHelper/33.1.0": {
"runtime": {
"lib/net8.0/CsvHelper.dll": {
"assemblyVersion": "33.0.0.0",
"fileVersion": "33.1.0.26"
}
}
},
"MetaBrainz.Common/4.1.1": {
"runtime": {
"lib/net8.0/MetaBrainz.Common.dll": {
"assemblyVersion": "4.1.0.0",
"fileVersion": "4.1.1.0"
}
}
},
"MetaBrainz.Common.Json/7.2.0": {
"dependencies": {
"MetaBrainz.Common": "4.1.1"
},
"runtime": {
"lib/net8.0/MetaBrainz.Common.Json.dll": {
"assemblyVersion": "7.2.0.0",
"fileVersion": "7.2.0.0"
}
}
},
"MetaBrainz.MusicBrainz/8.0.1": {
"dependencies": {
"MetaBrainz.Common": "4.1.1",
"MetaBrainz.Common.Json": "7.2.0"
},
"runtime": {
"lib/net8.0/MetaBrainz.MusicBrainz.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1.0"
}
}
},
"TagLibSharp/2.3.0": {
"runtime": {
"lib/netstandard2.0/TagLibSharp.dll": {
"assemblyVersion": "2.3.0.0",
"fileVersion": "2.3.0.0"
}
}
},
"UniversalTagEditor.Core/1.0.0": {
"dependencies": {
"CsvHelper": "33.1.0",
"MetaBrainz.MusicBrainz": "8.0.1",
"TagLibSharp": "2.3.0"
},
"runtime": {
"UniversalTagEditor.Core.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"UniversalTagEditor.CUI/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"CsvHelper/33.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kqfTOZGrn7NarNeXgjh86JcpTHUoeQDMB8t9NVa/ZtlSYiV1rxfRnQ49WaJsob4AiGrbK0XDzpyKkBwai4F8eg==",
"path": "csvhelper/33.1.0",
"hashPath": "csvhelper.33.1.0.nupkg.sha512"
},
"MetaBrainz.Common/4.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ovKr4BktLkKdGcMkKJihcGNPqvsPW4DXRmi051SbJICauVkKgnZFI51uWaHoQoO8Z6YBTqLzqam/GfRlMj0xcw==",
"path": "metabrainz.common/4.1.1",
"hashPath": "metabrainz.common.4.1.1.nupkg.sha512"
},
"MetaBrainz.Common.Json/7.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e3lPRMTujYYzBzZI7GV3s4OwXdBViGGrdpvWf5J/PXFaasjEdkQvKpmwG26PplZ3atPRK8x3FRVgP4lOARAoLQ==",
"path": "metabrainz.common.json/7.2.0",
"hashPath": "metabrainz.common.json.7.2.0.nupkg.sha512"
},
"MetaBrainz.MusicBrainz/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CXyfOQbYyICPTOckS169V4+zmk71sd2z6FncoQxE3uR1fvwyD5Q7+Iv5/mAmqnb/u6IyepMt+2+O8lzDLmXZbg==",
"path": "metabrainz.musicbrainz/8.0.1",
"hashPath": "metabrainz.musicbrainz.8.0.1.nupkg.sha512"
},
"TagLibSharp/2.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Qo4z6ZjnIfbR3Us1Za5M2vQ97OWZPmODvVmepxZ8XW0UIVLGdO2T63/N3b23kCcyiwuIe0TQvMEQG8wUCCD1mA==",
"path": "taglibsharp/2.3.0",
"hashPath": "taglibsharp.2.3.0.nupkg.sha512"
},
"UniversalTagEditor.Core/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -0,0 +1,12 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("UniversalTagEditor")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+399691cb05a3e92be12505bfa2e438097e72b680")]
[assembly: System.Reflection.AssemblyProductAttribute("UniversalTagEditor")]
[assembly: System.Reflection.AssemblyTitleAttribute("UniversalTagEditor")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@@ -0,0 +1 @@
5de3c73fdd3550f53441b0efbad9c02427f9c9cfcc94b77951bd29d724054e35

View File

@@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("UniversalTagEditor.CUI")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c4f81b6904f5ab4d9379030af563ac1de4a3771b")]
[assembly: System.Reflection.AssemblyProductAttribute("UniversalTagEditor.CUI")]
[assembly: System.Reflection.AssemblyTitleAttribute("UniversalTagEditor.CUI")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@@ -0,0 +1 @@
0234c9b982a1c871b504dc2bbf0488ea3ed9dbd91c92a2ef67c579aa9a3f4a88

View File

@@ -0,0 +1,15 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = UniversalTagEditor.CUI
build_property.ProjectDir = C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1 @@
8745abac5667d6da7e13977578176a7ac32a7054288d690ced92d1c4df7112f8

View File

@@ -0,0 +1,23 @@
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.CUI.exe
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.CUI.deps.json
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.CUI.runtimeconfig.json
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.CUI.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.CUI.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\CsvHelper.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\MetaBrainz.Common.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\MetaBrainz.Common.Json.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\MetaBrainz.MusicBrainz.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\TagLibSharp.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.Core.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\bin\Debug\net8.0\UniversalTagEditor.Core.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.csproj.AssemblyReference.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.AssemblyInfoInputs.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.AssemblyInfo.cs
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.csproj.CoreCompileInputs.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\Universa.D17C248B.Up2Date
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\refint\UniversalTagEditor.CUI.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\UniversalTagEditor.CUI.genruntimeconfig.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.CUI\obj\Debug\net8.0\ref\UniversalTagEditor.CUI.dll

View File

@@ -0,0 +1 @@
c2328e6d1d3f9ebdcb5f7bc23bb3d8e793a8539076416ed1ec7f23ef438a9d69

View File

@@ -0,0 +1,15 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = UniversalTagEditor
build_property.ProjectDir = C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1 @@
b538747e11850aa66442cb933fcefdcae62771e8a28378755f88267cc10a87ea

View File

@@ -0,0 +1,23 @@
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.exe
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.deps.json
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.runtimeconfig.json
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\CsvHelper.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\MetaBrainz.Common.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\MetaBrainz.Common.Json.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\MetaBrainz.MusicBrainz.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\TagLibSharp.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.Core.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\bin\Debug\net8.0\UniversalTagEditor.Core.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.csproj.AssemblyReference.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.AssemblyInfoInputs.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.AssemblyInfo.cs
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.csproj.CoreCompileInputs.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\Universa.B658D7AE.Up2Date
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\refint\UniversalTagEditor.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\UniversalTagEditor.genruntimeconfig.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\src\obj\Debug\net8.0\ref\UniversalTagEditor.dll

View File

@@ -0,0 +1 @@
143f53d7fc5c0f3c7418c1d3241857437f849b5c30a7c0133a9dbf4fd66dec66

Binary file not shown.

View File

@@ -0,0 +1,156 @@
{
"format": 1,
"restore": {
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj": {}
},
"projects": {
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"projectName": "UniversalTagEditor.Core",
"projectPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"packagesPath": "C:\\Users\\GorokhovA\\.nuget\\packages\\",
"outputPath": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.Core\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\GorokhovA\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"CsvHelper": {
"target": "Package",
"version": "[33.1.0, )"
},
"MetaBrainz.MusicBrainz": {
"target": "Package",
"version": "[8.0.1, )"
},
"TagLibSharp": {
"target": "Package",
"version": "[2.3.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.306/PortableRuntimeIdentifierGraph.json"
}
}
},
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj",
"projectName": "UniversalTagEditor.CUI",
"projectPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj",
"packagesPath": "C:\\Users\\GorokhovA\\.nuget\\packages\\",
"outputPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\GorokhovA\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj": {
"projectPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.306/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\GorokhovA\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\GorokhovA\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,68 @@
{
"format": 1,
"restore": {
"C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.csproj": {}
},
"projects": {
"C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.csproj",
"projectName": "UniversalTagEditor",
"projectPath": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.csproj",
"packagesPath": "C:\\Users\\GorokhovA\\.nuget\\packages\\",
"outputPath": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.CUI\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\GorokhovA\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net10.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net10.0": {
"targetAlias": "net10.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net10.0": {
"targetAlias": "net10.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.306/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\GorokhovA\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\GorokhovA\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,276 @@
{
"version": 3,
"targets": {
"net8.0": {
"CsvHelper/33.1.0": {
"type": "package",
"compile": {
"lib/net8.0/CsvHelper.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/CsvHelper.dll": {
"related": ".xml"
}
}
},
"MetaBrainz.Common/4.1.1": {
"type": "package",
"compile": {
"lib/net8.0/MetaBrainz.Common.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MetaBrainz.Common.dll": {
"related": ".xml"
}
}
},
"MetaBrainz.Common.Json/7.2.0": {
"type": "package",
"dependencies": {
"MetaBrainz.Common": "4.1.1"
},
"compile": {
"lib/net8.0/MetaBrainz.Common.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MetaBrainz.Common.Json.dll": {
"related": ".xml"
}
}
},
"MetaBrainz.MusicBrainz/8.0.1": {
"type": "package",
"dependencies": {
"MetaBrainz.Common": "4.1.1",
"MetaBrainz.Common.Json": "7.2.0"
},
"compile": {
"lib/net8.0/MetaBrainz.MusicBrainz.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MetaBrainz.MusicBrainz.dll": {
"related": ".xml"
}
}
},
"TagLibSharp/2.3.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/TagLibSharp.dll": {
"related": ".pdb"
}
},
"runtime": {
"lib/netstandard2.0/TagLibSharp.dll": {
"related": ".pdb"
}
}
},
"UniversalTagEditor.Core/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v8.0",
"dependencies": {
"CsvHelper": "33.1.0",
"MetaBrainz.MusicBrainz": "8.0.1",
"TagLibSharp": "2.3.0"
},
"compile": {
"bin/placeholder/UniversalTagEditor.Core.dll": {}
},
"runtime": {
"bin/placeholder/UniversalTagEditor.Core.dll": {}
}
}
}
},
"libraries": {
"CsvHelper/33.1.0": {
"sha512": "kqfTOZGrn7NarNeXgjh86JcpTHUoeQDMB8t9NVa/ZtlSYiV1rxfRnQ49WaJsob4AiGrbK0XDzpyKkBwai4F8eg==",
"type": "package",
"path": "csvhelper/33.1.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"csvhelper.33.1.0.nupkg.sha512",
"csvhelper.nuspec",
"lib/net462/CsvHelper.dll",
"lib/net462/CsvHelper.xml",
"lib/net47/CsvHelper.dll",
"lib/net47/CsvHelper.xml",
"lib/net48/CsvHelper.dll",
"lib/net48/CsvHelper.xml",
"lib/net8.0/CsvHelper.dll",
"lib/net8.0/CsvHelper.xml",
"lib/net9.0/CsvHelper.dll",
"lib/net9.0/CsvHelper.xml",
"lib/netstandard2.0/CsvHelper.dll",
"lib/netstandard2.0/CsvHelper.xml",
"lib/netstandard2.1/CsvHelper.dll",
"lib/netstandard2.1/CsvHelper.xml"
]
},
"MetaBrainz.Common/4.1.1": {
"sha512": "ovKr4BktLkKdGcMkKJihcGNPqvsPW4DXRmi051SbJICauVkKgnZFI51uWaHoQoO8Z6YBTqLzqam/GfRlMj0xcw==",
"type": "package",
"path": "metabrainz.common/4.1.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net10.0/MetaBrainz.Common.dll",
"lib/net10.0/MetaBrainz.Common.xml",
"lib/net8.0/MetaBrainz.Common.dll",
"lib/net8.0/MetaBrainz.Common.xml",
"metabrainz.common.4.1.1.nupkg.sha512",
"metabrainz.common.nuspec",
"package-icon.png"
]
},
"MetaBrainz.Common.Json/7.2.0": {
"sha512": "e3lPRMTujYYzBzZI7GV3s4OwXdBViGGrdpvWf5J/PXFaasjEdkQvKpmwG26PplZ3atPRK8x3FRVgP4lOARAoLQ==",
"type": "package",
"path": "metabrainz.common.json/7.2.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net10.0/MetaBrainz.Common.Json.dll",
"lib/net10.0/MetaBrainz.Common.Json.xml",
"lib/net8.0/MetaBrainz.Common.Json.dll",
"lib/net8.0/MetaBrainz.Common.Json.xml",
"metabrainz.common.json.7.2.0.nupkg.sha512",
"metabrainz.common.json.nuspec",
"package-icon.png"
]
},
"MetaBrainz.MusicBrainz/8.0.1": {
"sha512": "CXyfOQbYyICPTOckS169V4+zmk71sd2z6FncoQxE3uR1fvwyD5Q7+Iv5/mAmqnb/u6IyepMt+2+O8lzDLmXZbg==",
"type": "package",
"path": "metabrainz.musicbrainz/8.0.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net10.0/MetaBrainz.MusicBrainz.dll",
"lib/net10.0/MetaBrainz.MusicBrainz.xml",
"lib/net8.0/MetaBrainz.MusicBrainz.dll",
"lib/net8.0/MetaBrainz.MusicBrainz.xml",
"metabrainz.musicbrainz.8.0.1.nupkg.sha512",
"metabrainz.musicbrainz.nuspec",
"package-icon.png"
]
},
"TagLibSharp/2.3.0": {
"sha512": "Qo4z6ZjnIfbR3Us1Za5M2vQ97OWZPmODvVmepxZ8XW0UIVLGdO2T63/N3b23kCcyiwuIe0TQvMEQG8wUCCD1mA==",
"type": "package",
"path": "taglibsharp/2.3.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net462/TagLibSharp.dll",
"lib/net462/TagLibSharp.pdb",
"lib/net462/TaglibSharp.xml",
"lib/netstandard2.0/TagLibSharp.dll",
"lib/netstandard2.0/TagLibSharp.pdb",
"lib/netstandard2.0/TaglibSharp.xml",
"taglibsharp.2.3.0.nupkg.sha512",
"taglibsharp.nuspec"
]
},
"UniversalTagEditor.Core/1.0.0": {
"type": "project",
"path": "../UniversalTagEditor.Core/UniversalTagEditor.Core.csproj",
"msbuildProject": "../UniversalTagEditor.Core/UniversalTagEditor.Core.csproj"
}
},
"projectFileDependencyGroups": {
"net8.0": [
"UniversalTagEditor.Core >= 1.0.0"
]
},
"packageFolders": {
"C:\\Users\\GorokhovA\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj",
"projectName": "UniversalTagEditor.CUI",
"projectPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj",
"packagesPath": "C:\\Users\\GorokhovA\\.nuget\\packages\\",
"outputPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\GorokhovA\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj": {
"projectPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.306/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -0,0 +1,14 @@
{
"version": 2,
"dgSpecHash": "rLabcHrOF9Y=",
"success": true,
"projectFilePath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.CUI\\UniversalTagEditor.CUI.csproj",
"expectedPackageFiles": [
"C:\\Users\\GorokhovA\\.nuget\\packages\\csvhelper\\33.1.0\\csvhelper.33.1.0.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\metabrainz.common\\4.1.1\\metabrainz.common.4.1.1.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\metabrainz.common.json\\7.2.0\\metabrainz.common.json.7.2.0.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\metabrainz.musicbrainz\\8.0.1\\metabrainz.musicbrainz.8.0.1.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\taglibsharp\\2.3.0\\taglibsharp.2.3.0.nupkg.sha512"
],
"logs": []
}

View File

@@ -1,15 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CsvHelper" Version="33.1.0" />
<PackageReference Include="MetaBrainz.MusicBrainz" Version="7.0.0" />
<PackageReference Include="MetaBrainz.MusicBrainz" Version="8.0.1" />
<PackageReference Include="TagLibSharp" Version="2.3.0" />
</ItemGroup>

View File

@@ -0,0 +1,110 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"UniversalTagEditor.Core/1.0.0": {
"dependencies": {
"CsvHelper": "33.1.0",
"MetaBrainz.MusicBrainz": "8.0.1",
"TagLibSharp": "2.3.0"
},
"runtime": {
"UniversalTagEditor.Core.dll": {}
}
},
"CsvHelper/33.1.0": {
"runtime": {
"lib/net8.0/CsvHelper.dll": {
"assemblyVersion": "33.0.0.0",
"fileVersion": "33.1.0.26"
}
}
},
"MetaBrainz.Common/4.1.1": {
"runtime": {
"lib/net8.0/MetaBrainz.Common.dll": {
"assemblyVersion": "4.1.0.0",
"fileVersion": "4.1.1.0"
}
}
},
"MetaBrainz.Common.Json/7.2.0": {
"dependencies": {
"MetaBrainz.Common": "4.1.1"
},
"runtime": {
"lib/net8.0/MetaBrainz.Common.Json.dll": {
"assemblyVersion": "7.2.0.0",
"fileVersion": "7.2.0.0"
}
}
},
"MetaBrainz.MusicBrainz/8.0.1": {
"dependencies": {
"MetaBrainz.Common": "4.1.1",
"MetaBrainz.Common.Json": "7.2.0"
},
"runtime": {
"lib/net8.0/MetaBrainz.MusicBrainz.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1.0"
}
}
},
"TagLibSharp/2.3.0": {
"runtime": {
"lib/netstandard2.0/TagLibSharp.dll": {
"assemblyVersion": "2.3.0.0",
"fileVersion": "2.3.0.0"
}
}
}
}
},
"libraries": {
"UniversalTagEditor.Core/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"CsvHelper/33.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kqfTOZGrn7NarNeXgjh86JcpTHUoeQDMB8t9NVa/ZtlSYiV1rxfRnQ49WaJsob4AiGrbK0XDzpyKkBwai4F8eg==",
"path": "csvhelper/33.1.0",
"hashPath": "csvhelper.33.1.0.nupkg.sha512"
},
"MetaBrainz.Common/4.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ovKr4BktLkKdGcMkKJihcGNPqvsPW4DXRmi051SbJICauVkKgnZFI51uWaHoQoO8Z6YBTqLzqam/GfRlMj0xcw==",
"path": "metabrainz.common/4.1.1",
"hashPath": "metabrainz.common.4.1.1.nupkg.sha512"
},
"MetaBrainz.Common.Json/7.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e3lPRMTujYYzBzZI7GV3s4OwXdBViGGrdpvWf5J/PXFaasjEdkQvKpmwG26PplZ3atPRK8x3FRVgP4lOARAoLQ==",
"path": "metabrainz.common.json/7.2.0",
"hashPath": "metabrainz.common.json.7.2.0.nupkg.sha512"
},
"MetaBrainz.MusicBrainz/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CXyfOQbYyICPTOckS169V4+zmk71sd2z6FncoQxE3uR1fvwyD5Q7+Iv5/mAmqnb/u6IyepMt+2+O8lzDLmXZbg==",
"path": "metabrainz.musicbrainz/8.0.1",
"hashPath": "metabrainz.musicbrainz.8.0.1.nupkg.sha512"
},
"TagLibSharp/2.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Qo4z6ZjnIfbR3Us1Za5M2vQ97OWZPmODvVmepxZ8XW0UIVLGdO2T63/N3b23kCcyiwuIe0TQvMEQG8wUCCD1mA==",
"path": "taglibsharp/2.3.0",
"hashPath": "taglibsharp.2.3.0.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("UniversalTagEditor.Core")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c4f81b6904f5ab4d9379030af563ac1de4a3771b")]
[assembly: System.Reflection.AssemblyProductAttribute("UniversalTagEditor.Core")]
[assembly: System.Reflection.AssemblyTitleAttribute("UniversalTagEditor.Core")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@@ -0,0 +1 @@
0ce210202e645e03f2e82d3c113217006334ec65dcd1a74b8296e8e3daa78950

View File

@@ -0,0 +1,15 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = UniversalTagEditor.Core
build_property.ProjectDir = C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1 @@
522ccfd2f0b66e94dae4b2e7afddeeb10d7bf472975a65b84fc79cd5fb1b7f9a

View File

@@ -0,0 +1,12 @@
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\bin\Debug\net8.0\UniversalTagEditor.Core.deps.json
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\bin\Debug\net8.0\UniversalTagEditor.Core.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\bin\Debug\net8.0\UniversalTagEditor.Core.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.csproj.AssemblyReference.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.AssemblyInfoInputs.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.AssemblyInfo.cs
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.csproj.CoreCompileInputs.cache
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\refint\UniversalTagEditor.Core.dll
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\UniversalTagEditor.Core.pdb
C:\Users\GorokhovA\Source\Repos\MusicTagFixer\UniversalTagEditor.Core\obj\Debug\net8.0\ref\UniversalTagEditor.Core.dll

View File

@@ -0,0 +1,87 @@
{
"format": 1,
"restore": {
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj": {}
},
"projects": {
"C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"projectName": "UniversalTagEditor.Core",
"projectPath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"packagesPath": "C:\\Users\\GorokhovA\\.nuget\\packages\\",
"outputPath": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.Core\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\GorokhovA\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"CsvHelper": {
"target": "Package",
"version": "[33.1.0, )"
},
"MetaBrainz.MusicBrainz": {
"target": "Package",
"version": "[8.0.1, )"
},
"TagLibSharp": {
"target": "Package",
"version": "[2.3.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.306/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\GorokhovA\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\GorokhovA\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,268 @@
{
"version": 3,
"targets": {
"net8.0": {
"CsvHelper/33.1.0": {
"type": "package",
"compile": {
"lib/net8.0/CsvHelper.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/CsvHelper.dll": {
"related": ".xml"
}
}
},
"MetaBrainz.Common/4.1.1": {
"type": "package",
"compile": {
"lib/net8.0/MetaBrainz.Common.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MetaBrainz.Common.dll": {
"related": ".xml"
}
}
},
"MetaBrainz.Common.Json/7.2.0": {
"type": "package",
"dependencies": {
"MetaBrainz.Common": "4.1.1"
},
"compile": {
"lib/net8.0/MetaBrainz.Common.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MetaBrainz.Common.Json.dll": {
"related": ".xml"
}
}
},
"MetaBrainz.MusicBrainz/8.0.1": {
"type": "package",
"dependencies": {
"MetaBrainz.Common": "4.1.1",
"MetaBrainz.Common.Json": "7.2.0"
},
"compile": {
"lib/net8.0/MetaBrainz.MusicBrainz.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MetaBrainz.MusicBrainz.dll": {
"related": ".xml"
}
}
},
"TagLibSharp/2.3.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/TagLibSharp.dll": {
"related": ".pdb"
}
},
"runtime": {
"lib/netstandard2.0/TagLibSharp.dll": {
"related": ".pdb"
}
}
}
}
},
"libraries": {
"CsvHelper/33.1.0": {
"sha512": "kqfTOZGrn7NarNeXgjh86JcpTHUoeQDMB8t9NVa/ZtlSYiV1rxfRnQ49WaJsob4AiGrbK0XDzpyKkBwai4F8eg==",
"type": "package",
"path": "csvhelper/33.1.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"csvhelper.33.1.0.nupkg.sha512",
"csvhelper.nuspec",
"lib/net462/CsvHelper.dll",
"lib/net462/CsvHelper.xml",
"lib/net47/CsvHelper.dll",
"lib/net47/CsvHelper.xml",
"lib/net48/CsvHelper.dll",
"lib/net48/CsvHelper.xml",
"lib/net8.0/CsvHelper.dll",
"lib/net8.0/CsvHelper.xml",
"lib/net9.0/CsvHelper.dll",
"lib/net9.0/CsvHelper.xml",
"lib/netstandard2.0/CsvHelper.dll",
"lib/netstandard2.0/CsvHelper.xml",
"lib/netstandard2.1/CsvHelper.dll",
"lib/netstandard2.1/CsvHelper.xml"
]
},
"MetaBrainz.Common/4.1.1": {
"sha512": "ovKr4BktLkKdGcMkKJihcGNPqvsPW4DXRmi051SbJICauVkKgnZFI51uWaHoQoO8Z6YBTqLzqam/GfRlMj0xcw==",
"type": "package",
"path": "metabrainz.common/4.1.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net10.0/MetaBrainz.Common.dll",
"lib/net10.0/MetaBrainz.Common.xml",
"lib/net8.0/MetaBrainz.Common.dll",
"lib/net8.0/MetaBrainz.Common.xml",
"metabrainz.common.4.1.1.nupkg.sha512",
"metabrainz.common.nuspec",
"package-icon.png"
]
},
"MetaBrainz.Common.Json/7.2.0": {
"sha512": "e3lPRMTujYYzBzZI7GV3s4OwXdBViGGrdpvWf5J/PXFaasjEdkQvKpmwG26PplZ3atPRK8x3FRVgP4lOARAoLQ==",
"type": "package",
"path": "metabrainz.common.json/7.2.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net10.0/MetaBrainz.Common.Json.dll",
"lib/net10.0/MetaBrainz.Common.Json.xml",
"lib/net8.0/MetaBrainz.Common.Json.dll",
"lib/net8.0/MetaBrainz.Common.Json.xml",
"metabrainz.common.json.7.2.0.nupkg.sha512",
"metabrainz.common.json.nuspec",
"package-icon.png"
]
},
"MetaBrainz.MusicBrainz/8.0.1": {
"sha512": "CXyfOQbYyICPTOckS169V4+zmk71sd2z6FncoQxE3uR1fvwyD5Q7+Iv5/mAmqnb/u6IyepMt+2+O8lzDLmXZbg==",
"type": "package",
"path": "metabrainz.musicbrainz/8.0.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net10.0/MetaBrainz.MusicBrainz.dll",
"lib/net10.0/MetaBrainz.MusicBrainz.xml",
"lib/net8.0/MetaBrainz.MusicBrainz.dll",
"lib/net8.0/MetaBrainz.MusicBrainz.xml",
"metabrainz.musicbrainz.8.0.1.nupkg.sha512",
"metabrainz.musicbrainz.nuspec",
"package-icon.png"
]
},
"TagLibSharp/2.3.0": {
"sha512": "Qo4z6ZjnIfbR3Us1Za5M2vQ97OWZPmODvVmepxZ8XW0UIVLGdO2T63/N3b23kCcyiwuIe0TQvMEQG8wUCCD1mA==",
"type": "package",
"path": "taglibsharp/2.3.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net462/TagLibSharp.dll",
"lib/net462/TagLibSharp.pdb",
"lib/net462/TaglibSharp.xml",
"lib/netstandard2.0/TagLibSharp.dll",
"lib/netstandard2.0/TagLibSharp.pdb",
"lib/netstandard2.0/TaglibSharp.xml",
"taglibsharp.2.3.0.nupkg.sha512",
"taglibsharp.nuspec"
]
}
},
"projectFileDependencyGroups": {
"net8.0": [
"CsvHelper >= 33.1.0",
"MetaBrainz.MusicBrainz >= 8.0.1",
"TagLibSharp >= 2.3.0"
]
},
"packageFolders": {
"C:\\Users\\GorokhovA\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"projectName": "UniversalTagEditor.Core",
"projectPath": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"packagesPath": "C:\\Users\\GorokhovA\\.nuget\\packages\\",
"outputPath": "C:\\Users\\GorokhovA\\source\\repos\\MusicTagFixer\\UniversalTagEditor.Core\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\GorokhovA\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"CsvHelper": {
"target": "Package",
"version": "[33.1.0, )"
},
"MetaBrainz.MusicBrainz": {
"target": "Package",
"version": "[8.0.1, )"
},
"TagLibSharp": {
"target": "Package",
"version": "[2.3.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.306/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -0,0 +1,14 @@
{
"version": 2,
"dgSpecHash": "DdO17/NeTpU=",
"success": true,
"projectFilePath": "C:\\Users\\GorokhovA\\Source\\Repos\\MusicTagFixer\\UniversalTagEditor.Core\\UniversalTagEditor.Core.csproj",
"expectedPackageFiles": [
"C:\\Users\\GorokhovA\\.nuget\\packages\\csvhelper\\33.1.0\\csvhelper.33.1.0.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\metabrainz.common\\4.1.1\\metabrainz.common.4.1.1.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\metabrainz.common.json\\7.2.0\\metabrainz.common.json.7.2.0.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\metabrainz.musicbrainz\\8.0.1\\metabrainz.musicbrainz.8.0.1.nupkg.sha512",
"C:\\Users\\GorokhovA\\.nuget\\packages\\taglibsharp\\2.3.0\\taglibsharp.2.3.0.nupkg.sha512"
],
"logs": []
}

View File

@@ -0,0 +1,107 @@
using MetaBrainz.MusicBrainz;
using UniversalTagEditor.Helpers;
using UniversalTagEditor.Types;
namespace UniversalTagEditor.Core;
public sealed class UteOptions
{
public required string WorkingDirectory { get; init; }
public string? AlbumInfoCsv { get; init; } // имя файла или путь
public string? AlbumCover { get; init; } // имя файла или путь
public string? Format { get; init; } // flac/mp3/...
public bool FixTags { get; init; }
public bool EnhanceStructure { get; init; }
public int MaxDegreeOfParallelism { get; init; } = 4;
}
public sealed record ProgressInfo(int Done, int Total, string? CurrentFile);
public static class Runner
{
public static async Task RunAsync(
UteOptions opt,
IProgress<string>? log = null,
IProgress<ProgressInfo>? progress = null,
CancellationToken ct = default)
{
if (string.IsNullOrWhiteSpace(opt.WorkingDirectory))
throw new ArgumentException("WorkingDirectory is empty.");
if (!Directory.Exists(opt.WorkingDirectory))
throw new DirectoryNotFoundException(opt.WorkingDirectory);
var format = (opt.Format ?? "").Trim();
if (string.IsNullOrWhiteSpace(format))
throw new ArgumentException("Format (-f) is required.");
// Album data (csv + cover)
AlbumInfo album = new();
if (!string.IsNullOrWhiteSpace(opt.AlbumInfoCsv))
{
var csvPath = MakePath(opt.WorkingDirectory, opt.AlbumInfoCsv!);
var records = CsvParser.ParseCsvTable(csvPath);
album = new AlbumInfo { Tracks = records };
}
if (!string.IsNullOrWhiteSpace(opt.AlbumCover))
album.Cover = MakePath(opt.WorkingDirectory, opt.AlbumCover!);
// Collect files
var files = new List<string>();
files.AddRange(Directory.GetFiles(opt.WorkingDirectory, $"*.{format}"));
if (!opt.EnhanceStructure)
{
foreach (var dir in Directory.GetDirectories(opt.WorkingDirectory))
files.AddRange(Directory.GetFiles(dir, $"*.{format}"));
}
if (files.Count == 0)
{
log?.Report("Файлы не найдены.");
return;
}
// ВАЖНО: Query НЕ потокобезопасен — делаем отдельный на каждый поток
var queries = new ThreadLocal<Query>(() =>
new Query("NavidromeMetadataRecovery", "1.0"));
int done = 0;
int total = files.Count;
// Нормальная параллельность вместо Thread + async void
await Parallel.ForEachAsync(
files.Select((path, index) => (path, index)),
new ParallelOptions
{
MaxDegreeOfParallelism = Math.Max(1, opt.MaxDegreeOfParallelism),
CancellationToken = ct
},
async (item, token) =>
{
var (file, index) = item;
if (opt.FixTags)
{
await TagEditor.Fix(file, queries.Value!, opt.EnhanceStructure, format);
}
else
{
TagEditor.Edit(file, album, index);
}
var nowDone = Interlocked.Increment(ref done);
progress?.Report(new ProgressInfo(nowDone, total, file));
log?.Report($"{nowDone}/{total}: {file} успешно обработан");
});
log?.Report("Готово!");
}
private static string MakePath(string workDir, string maybeFileOrPath)
=> Path.IsPathRooted(maybeFileOrPath)
? maybeFileOrPath
: Path.Combine(workDir, maybeFileOrPath);
}

218
UniversalTagEditor.GUI/Form1.Designer.cs generated Normal file
View File

@@ -0,0 +1,218 @@
namespace UniversalTagEditor.GUI
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
menuStrip1 = new MenuStrip();
файлToolStripMenuItem = new ToolStripMenuItem();
выходToolStripMenuItem = new ToolStripMenuItem();
tbFolder = new TextBox();
label1 = new Label();
btnBrowse = new Button();
cbFormat = new ComboBox();
label2 = new Label();
chkFixTags = new CheckBox();
chkEnhance = new CheckBox();
btnStart = new Button();
btnCancel = new Button();
logBox = new RichTextBox();
progressBar = new ProgressBar();
menuStrip1.SuspendLayout();
SuspendLayout();
//
// menuStrip1
//
menuStrip1.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Size = new Size(711, 24);
menuStrip1.TabIndex = 0;
menuStrip1.Text = "menuStrip1";
//
// файлToolStripMenuItem
//
файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { выходToolStripMenuItem });
файлToolStripMenuItem.Name = айлToolStripMenuItem";
файлToolStripMenuItem.Size = new Size(48, 20);
файлToolStripMenuItem.Text = "Файл";
//
// выходToolStripMenuItem
//
выходToolStripMenuItem.Name = "выходToolStripMenuItem";
выходToolStripMenuItem.ShortcutKeys = Keys.Alt | Keys.F4;
выходToolStripMenuItem.Size = new Size(151, 22);
выходToolStripMenuItem.Text = "Выход";
выходToolStripMenuItem.Click += exit;
//
// tbFolder
//
tbFolder.Location = new Point(22, 65);
tbFolder.Name = "tbFolder";
tbFolder.Size = new Size(310, 23);
tbFolder.TabIndex = 1;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(22, 47);
label1.Name = "label1";
label1.Size = new Size(117, 15);
label1.TabIndex = 2;
label1.Text = "Путь до директории";
//
// btnBrowse
//
btnBrowse.Location = new Point(338, 65);
btnBrowse.Name = "btnBrowse";
btnBrowse.Size = new Size(31, 23);
btnBrowse.TabIndex = 3;
btnBrowse.Text = "...";
btnBrowse.UseVisualStyleBackColor = true;
btnBrowse.Click += btnBrowse_Click;
//
// cbFormat
//
cbFormat.FormattingEnabled = true;
cbFormat.Location = new Point(22, 114);
cbFormat.Name = "cbFormat";
cbFormat.Size = new Size(151, 23);
cbFormat.TabIndex = 4;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(22, 96);
label2.Name = "label2";
label2.Size = new Size(151, 15);
label2.TabIndex = 5;
label2.Text = "Тип музыкальных файлов";
//
// chkFixTags
//
chkFixTags.AutoSize = true;
chkFixTags.Location = new Point(22, 147);
chkFixTags.Name = "chkFixTags";
chkFixTags.Size = new Size(117, 19);
chkFixTags.TabIndex = 6;
chkFixTags.Text = "Исправлять теги";
chkFixTags.UseVisualStyleBackColor = true;
chkFixTags.CheckedChanged += chkFixTags_CheckedChanged;
//
// chkEnhance
//
chkEnhance.AutoSize = true;
chkEnhance.Enabled = false;
chkEnhance.Location = new Point(22, 172);
chkEnhance.Name = "chkEnhance";
chkEnhance.Size = new Size(179, 19);
chkEnhance.TabIndex = 7;
chkEnhance.Text = "Улучшить структуру треков";
chkEnhance.UseVisualStyleBackColor = true;
//
// btnStart
//
btnStart.Location = new Point(293, 386);
btnStart.Name = "btnStart";
btnStart.Size = new Size(75, 23);
btnStart.TabIndex = 8;
btnStart.Text = "Начать";
btnStart.UseVisualStyleBackColor = true;
btnStart.Click += btnStart_Click;
//
// btnCancel
//
btnCancel.Enabled = false;
btnCancel.Location = new Point(212, 386);
btnCancel.Name = "btnCancel";
btnCancel.Size = new Size(75, 23);
btnCancel.TabIndex = 9;
btnCancel.Text = "Отмена";
btnCancel.UseVisualStyleBackColor = true;
btnCancel.Click += btnCancel_Click;
//
// logBox
//
logBox.Location = new Point(389, 47);
logBox.Name = "logBox";
logBox.ReadOnly = true;
logBox.Size = new Size(306, 391);
logBox.TabIndex = 10;
logBox.Text = "";
logBox.WordWrap = false;
//
// progressBar
//
progressBar.Location = new Point(22, 415);
progressBar.Name = "progressBar";
progressBar.Size = new Size(347, 23);
progressBar.TabIndex = 11;
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(711, 450);
Controls.Add(progressBar);
Controls.Add(logBox);
Controls.Add(btnCancel);
Controls.Add(btnStart);
Controls.Add(chkEnhance);
Controls.Add(chkFixTags);
Controls.Add(label2);
Controls.Add(cbFormat);
Controls.Add(btnBrowse);
Controls.Add(label1);
Controls.Add(tbFolder);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
Name = "Form1";
Text = "index";
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip1;
private ToolStripMenuItem файлToolStripMenuItem;
private ToolStripMenuItem выходToolStripMenuItem;
private TextBox tbFolder;
private Label label1;
private Button btnBrowse;
private ComboBox cbFormat;
private Label label2;
private CheckBox chkFixTags;
private CheckBox chkEnhance;
private Button btnStart;
private Button btnCancel;
private RichTextBox logBox;
private ProgressBar progressBar;
}
}

View File

@@ -0,0 +1,182 @@
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using UniversalTagEditor.Core;
namespace UniversalTagEditor.GUI
{
public partial class Form1 : Form
{
private CancellationTokenSource? _cts;
private readonly ConcurrentQueue<string> _logQueue = new();
private readonly System.Windows.Forms.Timer _logTimer = new();
private StreamWriter? _logWriter;
private const int MaxLogChars = 500_000;
public Form1()
{
InitializeComponent();
cbFormat.Items.AddRange(new object[] { "flac", "mp3", "wav", "m4a", "ogg" });
cbFormat.SelectedIndex = 0;
btnCancel.Enabled = false;
chkEnhance.Enabled = false;
// Таймер: пачками добавляем лог в RichTextBox
_logTimer.Interval = 100; // 10 раз/сек
_logTimer.Tick += (_, __) => FlushLogToUi();
_logTimer.Start();
}
private void btnBrowse_Click(object sender, EventArgs e)
{
using var dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.OK)
tbFolder.Text = dialog.SelectedPath;
}
private void chkFixTags_CheckedChanged(object sender, EventArgs e)
{
chkEnhance.Enabled = chkFixTags.Checked;
if (!chkFixTags.Checked) chkEnhance.Checked = false;
}
// ВАЖНО: async, потому что внутри await
private async void btnStart_Click(object sender, EventArgs e)
{
if (_cts != null) return;
var workDir = tbFolder.Text.Trim();
if (string.IsNullOrWhiteSpace(workDir) || !Directory.Exists(workDir))
{
MessageBox.Show("Укажи существующую папку.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
var format = (cbFormat.SelectedItem?.ToString() ?? "flac").Trim().TrimStart('.');
// Очистка UI лога
logBox.Clear();
while (_logQueue.TryDequeue(out _)) { }
// Лог рядом с GUI.exe
var logPath = Path.Combine(AppContext.BaseDirectory, "logs.txt");
_logWriter = new StreamWriter(logPath, append: true, encoding: Encoding.UTF8)
{
AutoFlush = true
};
_cts = new CancellationTokenSource();
btnStart.Enabled = false;
btnCancel.Enabled = true;
progressBar.Value = 0;
progressBar.Maximum = 1;
var opt = new UteOptions
{
WorkingDirectory = workDir,
Format = format,
FixTags = chkFixTags.Checked,
EnhanceStructure = chkEnhance.Checked,
MaxDegreeOfParallelism = 4
};
// Лог: в файл сразу + в очередь для UI
var log = new Progress<string>(msg =>
{
var line = $"[{DateTime.Now:HH:mm:ss}] {msg}";
_logWriter?.WriteLine(line);
_logQueue.Enqueue(line);
});
// Прогресс
var prog = new Progress<ProgressInfo>(p =>
{
progressBar.Maximum = Math.Max(1, p.Total);
progressBar.Value = Math.Min(p.Done, progressBar.Maximum);
});
try
{
await Runner.RunAsync(opt, log, prog, _cts.Token);
_logQueue.Enqueue($"[{DateTime.Now:HH:mm:ss}] Готово!");
}
catch (OperationCanceledException)
{
_logQueue.Enqueue($"[{DateTime.Now:HH:mm:ss}] Отменено пользователем.");
}
catch (Exception ex)
{
_logQueue.Enqueue($"[{DateTime.Now:HH:mm:ss}] ОШИБКА: {ex}");
}
finally
{
btnStart.Enabled = true;
btnCancel.Enabled = false;
_cts?.Dispose();
_cts = null;
_logWriter?.Dispose();
_logWriter = null;
}
}
// Кнопка Cancel должна отменять обработку
private void btnCancel_Click(object sender, EventArgs e)
{
_cts?.Cancel();
}
// Таймер вызывает это: быстро добавляем лог пачками
private void FlushLogToUi()
{
if (_logQueue.IsEmpty) return;
var sb = new StringBuilder();
int taken = 0;
while (taken < 200 && _logQueue.TryDequeue(out var line))
{
sb.AppendLine(line);
taken++;
}
if (sb.Length == 0) return;
logBox.AppendText(sb.ToString());
logBox.ScrollToCaret();
TrimLogIfNeeded();
}
private void TrimLogIfNeeded()
{
if (logBox.TextLength <= MaxLogChars) return;
int remove = logBox.TextLength / 3;
logBox.Select(0, remove);
logBox.SelectedText = "";
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
_cts?.Cancel();
_logWriter?.Dispose();
_logWriter = null;
base.OnFormClosing(e);
}
private void exit(object sender, EventArgs e)
{
Application.Exit();
}
}
}

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,17 @@
namespace UniversalTagEditor.GUI
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
}

View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\UniversalTagEditor.Core\UniversalTagEditor.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Update="Form1.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

Some files were not shown because too many files have changed in this diff Show More