Back to before AA
This commit is contained in:
parent
a4a92aacd2
commit
de18149027
@ -1,91 +0,0 @@
|
|||||||
using MetadataExtractor;
|
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Text.Json;
|
|
||||||
using View_by_Distance.Shared.Models;
|
|
||||||
using View_by_Distance.Shared.Models.Methods;
|
|
||||||
using View_by_Distance.Shared.Models.Properties;
|
|
||||||
|
|
||||||
namespace View_by_Distance.Metadata.Models;
|
|
||||||
|
|
||||||
public class A_Metadata : IMetadata<MetadataExtractor.Directory>
|
|
||||||
{
|
|
||||||
|
|
||||||
private readonly bool _PropertiesChangedForMetadata;
|
|
||||||
private readonly IPropertyConfiguration _PropertyConfiguration;
|
|
||||||
private readonly bool _ForceMetadataLastWriteTimeToCreationTime;
|
|
||||||
private readonly IReadOnlyDictionary<string, string[]> _FileGroups;
|
|
||||||
|
|
||||||
public A_Metadata(IPropertyConfiguration propertyConfiguration, bool forceMetadataLastWriteTimeToCreationTime, bool propertiesChangedForMetadata)
|
|
||||||
{
|
|
||||||
_PropertyConfiguration = propertyConfiguration;
|
|
||||||
_PropertiesChangedForMetadata = propertiesChangedForMetadata;
|
|
||||||
_ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime;
|
|
||||||
string bResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(_PropertyConfiguration,
|
|
||||||
nameof(A_Metadata),
|
|
||||||
string.Empty,
|
|
||||||
includeResizeGroup: false,
|
|
||||||
includeModel: false,
|
|
||||||
includePredictorModel: false);
|
|
||||||
_FileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(propertyConfiguration, bResultsFullGroupDirectory, [propertyConfiguration.ResultSingleton]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReadOnlyDictionary<string, MetadataExtractorDirectory> GetMetadataCollection(string file)
|
|
||||||
{
|
|
||||||
Dictionary<string, MetadataExtractorDirectory>? results;
|
|
||||||
string fileName = Path.GetFileName(file);
|
|
||||||
string fileExtensionLowered = Path.GetExtension(file).ToLower();
|
|
||||||
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
|
|
||||||
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, fileName);
|
|
||||||
FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{fileNameWithoutExtension}{fileExtensionLowered}.json"));
|
|
||||||
if (_ForceMetadataLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
|
|
||||||
{
|
|
||||||
File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName);
|
|
||||||
fileInfo.Refresh();
|
|
||||||
}
|
|
||||||
if (_ForceMetadataLastWriteTimeToCreationTime && fileInfo.Exists && fileInfo.LastWriteTime != fileInfo.CreationTime)
|
|
||||||
{
|
|
||||||
File.SetLastWriteTime(fileInfo.FullName, fileInfo.CreationTime);
|
|
||||||
fileInfo.Refresh();
|
|
||||||
}
|
|
||||||
if (_PropertiesChangedForMetadata)
|
|
||||||
results = null;
|
|
||||||
else if (!fileInfo.Exists)
|
|
||||||
results = null;
|
|
||||||
else if (!fileInfo.FullName.EndsWith(".json") && !fileInfo.FullName.EndsWith(".old"))
|
|
||||||
throw new ArgumentException("must be a *.json file");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string json = File.ReadAllText(fileInfo.FullName);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
results = Stateless.Methods.Metadata.Deserialize(json);
|
|
||||||
if (results is null)
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
results = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (results is null || results.Count == 0)
|
|
||||||
{
|
|
||||||
IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(file);
|
|
||||||
results = Stateless.Methods.Metadata.Covert(directories);
|
|
||||||
string json = JsonSerializer.Serialize(results, DictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.DictionaryStringMetadataExtractorDirectory);
|
|
||||||
if (Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null) && _ForceMetadataLastWriteTimeToCreationTime)
|
|
||||||
{
|
|
||||||
File.SetLastWriteTime(fileInfo.FullName, fileInfo.CreationTime);
|
|
||||||
fileInfo.Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new(results);
|
|
||||||
}
|
|
||||||
|
|
||||||
(DateTime?, DateTime?[]) IMetadata<MetadataExtractor.Directory>.GetDateTimes(FileHolder fileHolder, IReadOnlyList<MetadataExtractor.Directory> directories)
|
|
||||||
{
|
|
||||||
List<DateTime?> results = [];
|
|
||||||
DateTime? result = null;
|
|
||||||
return new(result, results.ToArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
namespace View_by_Distance.Metadata.Models;
|
|
||||||
|
|
||||||
public record Avi(string? FramesPerSecond1,
|
|
||||||
string? SamplesPerSecond2,
|
|
||||||
string? Duration3,
|
|
||||||
string? VideoCodec4,
|
|
||||||
string? AudioCodec5,
|
|
||||||
string? Width6,
|
|
||||||
string? Height7,
|
|
||||||
string? Streams8,
|
|
||||||
string? DateTimeOriginal320)
|
|
||||||
{
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
string result = JsonSerializer.Serialize(this, AviSourceGenerationContext.Default.Avi);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
|
||||||
[JsonSerializable(typeof(Avi))]
|
|
||||||
public partial class AviSourceGenerationContext : JsonSerializerContext
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,7 +1,4 @@
|
|||||||
using MetadataExtractor;
|
using MetadataExtractor;
|
||||||
using MetadataExtractor.Formats.Avi;
|
|
||||||
using MetadataExtractor.Formats.Exif;
|
|
||||||
using MetadataExtractor.Formats.QuickTime;
|
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using View_by_Distance.Shared.Models;
|
using View_by_Distance.Shared.Models;
|
||||||
@ -90,7 +87,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
if (results is null || results.Count == 0)
|
if (results is null || results.Count == 0)
|
||||||
{
|
{
|
||||||
IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(mappingFromItem.ImageFileHolder.FullName);
|
IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(mappingFromItem.ImageFileHolder.FullName);
|
||||||
results = Stateless.Methods.Metadata.Covert(directories);
|
results = Stateless.Methods.Metadata.GetKeyValuePairs(directories);
|
||||||
json = JsonSerializer.Serialize(results, DictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.DictionaryStringMetadataExtractorDirectory);
|
json = JsonSerializer.Serialize(results, DictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.DictionaryStringMetadataExtractorDirectory);
|
||||||
bool updateDateWhenMatches = dateTimes.Count != 0 && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime;
|
bool updateDateWhenMatches = dateTimes.Count != 0 && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime;
|
||||||
DateTime? dateTime = !updateDateWhenMatches ? null : dateTimes.Max();
|
DateTime? dateTime = !updateDateWhenMatches ? null : dateTimes.Max();
|
||||||
@ -116,35 +113,35 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
DateTime? dateTime;
|
DateTime? dateTime;
|
||||||
DateTime checkDateTime;
|
DateTime checkDateTime;
|
||||||
string dateTimeFormat = Property.Models.Stateless.IProperty.DateTimeFormat();
|
string dateTimeFormat = Property.Models.Stateless.IProperty.DateTimeFormat();
|
||||||
ExifDirectoryBase? exifDirectoryBase = directories.OfType<ExifDirectoryBase>().FirstOrDefault();
|
MetadataExtractor.Formats.Exif.ExifDirectoryBase? exifDirectoryBase = directories.OfType<MetadataExtractor.Formats.Exif.ExifDirectoryBase>().FirstOrDefault();
|
||||||
results.Add(fileHolder.CreationTime);
|
results.Add(fileHolder.CreationTime);
|
||||||
results.Add(fileHolder.LastWriteTime);
|
results.Add(fileHolder.LastWriteTime);
|
||||||
if (exifDirectoryBase is not null)
|
if (exifDirectoryBase is not null)
|
||||||
{
|
{
|
||||||
if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTime, out checkDateTime))
|
if (exifDirectoryBase.TryGetDateTime(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTime, out checkDateTime))
|
||||||
results.Add(checkDateTime);
|
results.Add(checkDateTime);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTime));
|
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTime));
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
results.Add(dateTime.Value);
|
results.Add(dateTime.Value);
|
||||||
}
|
}
|
||||||
if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime))
|
if (exifDirectoryBase.TryGetDateTime(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime))
|
||||||
results.Add(checkDateTime);
|
results.Add(checkDateTime);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeDigitized));
|
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeDigitized));
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
results.Add(dateTime.Value);
|
results.Add(dateTime.Value);
|
||||||
}
|
}
|
||||||
if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime))
|
if (exifDirectoryBase.TryGetDateTime(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime))
|
||||||
{
|
{
|
||||||
result ??= checkDateTime;
|
result ??= checkDateTime;
|
||||||
results.Add(checkDateTime);
|
results.Add(checkDateTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeOriginal));
|
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeOriginal));
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
{
|
{
|
||||||
result ??= dateTime.Value;
|
result ??= dateTime.Value;
|
||||||
@ -152,17 +149,17 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AviDirectory? aviDirectory = directories.OfType<AviDirectory>().FirstOrDefault();
|
MetadataExtractor.Formats.Avi.AviDirectory? aviDirectory = directories.OfType<MetadataExtractor.Formats.Avi.AviDirectory>().FirstOrDefault();
|
||||||
if (aviDirectory is not null)
|
if (aviDirectory is not null)
|
||||||
{
|
{
|
||||||
if (aviDirectory.TryGetDateTime(AviDirectory.TagDateTimeOriginal, out checkDateTime))
|
if (aviDirectory.TryGetDateTime(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal, out checkDateTime))
|
||||||
{
|
{
|
||||||
result ??= checkDateTime;
|
result ??= checkDateTime;
|
||||||
results.Add(checkDateTime);
|
results.Add(checkDateTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, aviDirectory.GetString(AviDirectory.TagDateTimeOriginal));
|
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal));
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
{
|
{
|
||||||
result ??= dateTime.Value;
|
result ??= dateTime.Value;
|
||||||
@ -170,17 +167,17 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QuickTimeMovieHeaderDirectory? quickTimeMovieHeaderDirectory = directories.OfType<QuickTimeMovieHeaderDirectory>().FirstOrDefault();
|
MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory? quickTimeMovieHeaderDirectory = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory>().FirstOrDefault();
|
||||||
if (quickTimeMovieHeaderDirectory is not null)
|
if (quickTimeMovieHeaderDirectory is not null)
|
||||||
{
|
{
|
||||||
if (quickTimeMovieHeaderDirectory.TryGetDateTime(QuickTimeMovieHeaderDirectory.TagCreated, out checkDateTime))
|
if (quickTimeMovieHeaderDirectory.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated, out checkDateTime))
|
||||||
{
|
{
|
||||||
result ??= checkDateTime;
|
result ??= checkDateTime;
|
||||||
results.Add(checkDateTime);
|
results.Add(checkDateTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, quickTimeMovieHeaderDirectory.GetString(QuickTimeMovieHeaderDirectory.TagCreated));
|
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, quickTimeMovieHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated));
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
{
|
{
|
||||||
result ??= dateTime.Value;
|
result ??= dateTime.Value;
|
||||||
@ -188,17 +185,17 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QuickTimeTrackHeaderDirectory? quickTimeTrackHeaderDirectory = directories.OfType<QuickTimeTrackHeaderDirectory>().FirstOrDefault();
|
MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory? quickTimeTrackHeaderDirectory = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory>().FirstOrDefault();
|
||||||
if (quickTimeTrackHeaderDirectory is not null)
|
if (quickTimeTrackHeaderDirectory is not null)
|
||||||
{
|
{
|
||||||
if (quickTimeTrackHeaderDirectory.TryGetDateTime(QuickTimeTrackHeaderDirectory.TagCreated, out checkDateTime))
|
if (quickTimeTrackHeaderDirectory.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated, out checkDateTime))
|
||||||
{
|
{
|
||||||
result ??= checkDateTime;
|
result ??= checkDateTime;
|
||||||
results.Add(checkDateTime);
|
results.Add(checkDateTime);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, quickTimeTrackHeaderDirectory.GetString(QuickTimeTrackHeaderDirectory.TagCreated));
|
dateTime = Property.Models.Stateless.IProperty.GetDateTime(dateTimeFormat, quickTimeTrackHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated));
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
{
|
{
|
||||||
result ??= dateTime.Value;
|
result ??= dateTime.Value;
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
namespace View_by_Distance.Metadata.Models;
|
|
||||||
|
|
||||||
public record QuickTimeMovieHeader(string? Version1,
|
|
||||||
string? NextTrackId16,
|
|
||||||
string? CurrentTime15,
|
|
||||||
string? SelectionDuration14,
|
|
||||||
string? SelectionTime13,
|
|
||||||
string? PosterTime12,
|
|
||||||
string? PreviewDuration11,
|
|
||||||
string? PreviewTime10,
|
|
||||||
string? Matrix9,
|
|
||||||
string? PreferredVolume8,
|
|
||||||
string? PreferredRate7,
|
|
||||||
string? Duration6,
|
|
||||||
string? TimeScale5,
|
|
||||||
string? Modified4,
|
|
||||||
string? Created3,
|
|
||||||
string? Flags2)
|
|
||||||
{
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
string result = JsonSerializer.Serialize(this, QuickTimeMovieHeaderSourceGenerationContext.Default.QuickTimeMovieHeader);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
|
||||||
[JsonSerializable(typeof(QuickTimeMovieHeader))]
|
|
||||||
public partial class QuickTimeMovieHeaderSourceGenerationContext : JsonSerializerContext
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
namespace View_by_Distance.Metadata.Models;
|
|
||||||
|
|
||||||
public record QuickTimeTrackHeader(string? Version1,
|
|
||||||
string? Flags2,
|
|
||||||
string? Created3,
|
|
||||||
string? Modified4,
|
|
||||||
string? TrackId5,
|
|
||||||
string? Duration6,
|
|
||||||
string? Layer7,
|
|
||||||
string? AlternateGroup8,
|
|
||||||
string? Volume9,
|
|
||||||
string? Width10,
|
|
||||||
string? Height11,
|
|
||||||
string? Matrix12,
|
|
||||||
string? Rotation13)
|
|
||||||
{
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
string result = JsonSerializer.Serialize(this, QuickTimeTrackHeaderSourceGenerationContext.Default.QuickTimeTrackHeader);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
|
||||||
[JsonSerializable(typeof(QuickTimeTrackHeader))]
|
|
||||||
public partial class QuickTimeTrackHeaderSourceGenerationContext : JsonSerializerContext
|
|
||||||
{
|
|
||||||
}
|
|
@ -14,10 +14,10 @@ public interface IMetadata
|
|||||||
Meters
|
Meters
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadOnlyDictionary<string, MetadataExtractorDirectory> TestStatic_Covert(IReadOnlyList<MetadataExtractor.Directory> directories) =>
|
ReadOnlyDictionary<string, MetadataExtractorDirectory> TestStatic_GetKeyValuePairs(IReadOnlyList<MetadataExtractor.Directory> directories) =>
|
||||||
Covert(directories);
|
GetKeyValuePairs(directories);
|
||||||
static ReadOnlyDictionary<string, MetadataExtractorDirectory> Covert(IReadOnlyList<MetadataExtractor.Directory> directories) =>
|
static ReadOnlyDictionary<string, MetadataExtractorDirectory> GetKeyValuePairs(IReadOnlyList<MetadataExtractor.Directory> directories) =>
|
||||||
new(Metadata.Covert(directories));
|
new(Metadata.GetKeyValuePairs(directories));
|
||||||
|
|
||||||
string? TestStatic_GetModel(IReadOnlyList<MetadataExtractor.Directory> directories) =>
|
string? TestStatic_GetModel(IReadOnlyList<MetadataExtractor.Directory> directories) =>
|
||||||
GetModel(directories);
|
GetModel(directories);
|
||||||
|
@ -9,7 +9,7 @@ namespace View_by_Distance.Metadata.Models.Stateless.Methods;
|
|||||||
internal partial class Metadata
|
internal partial class Metadata
|
||||||
{
|
{
|
||||||
|
|
||||||
internal static Dictionary<string, MetadataExtractorDirectory> Covert(IReadOnlyList<MetadataExtractor.Directory> directories)
|
internal static Dictionary<string, MetadataExtractorDirectory> GetKeyValuePairs(IReadOnlyList<MetadataExtractor.Directory> directories)
|
||||||
{
|
{
|
||||||
Dictionary<string, MetadataExtractorDirectory> results = [];
|
Dictionary<string, MetadataExtractorDirectory> results = [];
|
||||||
MetadataExtractorTag metadataExtractorTag;
|
MetadataExtractorTag metadataExtractorTag;
|
||||||
|
@ -3,7 +3,6 @@ using Microsoft.Extensions.Configuration;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Phares.Shared;
|
using Phares.Shared;
|
||||||
using ShellProgressBar;
|
using ShellProgressBar;
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using View_by_Distance.Metadata.Models;
|
using View_by_Distance.Metadata.Models;
|
||||||
using View_by_Distance.Rename.Models;
|
using View_by_Distance.Rename.Models;
|
||||||
@ -16,9 +15,6 @@ namespace View_by_Distance.Rename;
|
|||||||
public class Rename
|
public class Rename
|
||||||
{
|
{
|
||||||
|
|
||||||
private record Result(string File,
|
|
||||||
ReadOnlyDictionary<string, MetadataExtractorDirectory> KeyValuePairs);
|
|
||||||
|
|
||||||
private record Record(int Index,
|
private record Record(int Index,
|
||||||
bool IsIgnoreExtension,
|
bool IsIgnoreExtension,
|
||||||
bool IsValidImageFormatExtension,
|
bool IsValidImageFormatExtension,
|
||||||
@ -52,12 +48,6 @@ public class Rename
|
|||||||
logger?.LogInformation("{RootDirectory}", propertyConfiguration.RootDirectory);
|
logger?.LogInformation("{RootDirectory}", propertyConfiguration.RootDirectory);
|
||||||
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false);
|
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false);
|
||||||
Verify();
|
Verify();
|
||||||
List<string> linesB = IteratedRenameFilesInDirectories(logger);
|
|
||||||
if (linesB.Count != 0)
|
|
||||||
{
|
|
||||||
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", linesB);
|
|
||||||
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory);
|
|
||||||
}
|
|
||||||
List<string> lines = RenameFilesInDirectories(logger);
|
List<string> lines = RenameFilesInDirectories(logger);
|
||||||
if (lines.Count != 0)
|
if (lines.Count != 0)
|
||||||
{
|
{
|
||||||
@ -82,25 +72,6 @@ public class Rename
|
|||||||
throw new NullReferenceException(nameof(_PropertyConfiguration));
|
throw new NullReferenceException(nameof(_PropertyConfiguration));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Action<string> GetResultCollection(A_Metadata metadata, List<Result> results, Action tick)
|
|
||||||
{
|
|
||||||
tick.Invoke();
|
|
||||||
return file => results.Add(new(file, metadata.GetMetadataCollection(file)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<string> IteratedRenameFilesInDirectories(ILogger? logger)
|
|
||||||
{
|
|
||||||
List<string> old = [];
|
|
||||||
List<Result> results = [];
|
|
||||||
string rootDirectoryFullPath = Path.GetFullPath(_PropertyConfiguration.RootDirectory);
|
|
||||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism };
|
|
||||||
IEnumerable<string> files = Directory.EnumerateFiles(rootDirectoryFullPath, "*", SearchOption.AllDirectories);
|
|
||||||
A_Metadata metadata = new(_PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata);
|
|
||||||
ProgressBar progressBar = new(short.MaxValue, "EnumerateFiles load", new ProgressBarOptions() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true });
|
|
||||||
files.AsParallel().ForAll(GetResultCollection(metadata, results, () => progressBar.Tick()));
|
|
||||||
return old;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<string> RenameFilesInDirectories(ILogger? logger)
|
private List<string> RenameFilesInDirectories(ILogger? logger)
|
||||||
{
|
{
|
||||||
List<string> results = [];
|
List<string> results = [];
|
||||||
|
24
Shared/Models/AviDirectory.cs
Normal file
24
Shared/Models/AviDirectory.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record AviDirectory(DateTime? DateTimeOriginal,
|
||||||
|
string? Duration,
|
||||||
|
string? Height,
|
||||||
|
string? Width)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, AviDirectorySourceGenerationContext.Default.AviDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(AviDirectory))]
|
||||||
|
public partial class AviDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
35
Shared/Models/ExifDirectory.cs
Normal file
35
Shared/Models/ExifDirectory.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record ExifDirectory(AviDirectory AviDirectory,
|
||||||
|
ExifDirectoryBase ExifDirectoryBase,
|
||||||
|
string File,
|
||||||
|
FileMetadataDirectory FileMetadataDirectory,
|
||||||
|
GifHeaderDirectory GifHeaderDirectory,
|
||||||
|
GpsDirectory GpsDirectory,
|
||||||
|
int? Height,
|
||||||
|
string JsonFile,
|
||||||
|
JpegDirectory JpegDirectory,
|
||||||
|
PhotoshopDirectory PhotoshopDirectory,
|
||||||
|
PngDirectory PngDirectory,
|
||||||
|
QuickTimeMovieHeaderDirectory QuickTimeMovieHeaderDirectory,
|
||||||
|
QuickTimeTrackHeaderDirectory QuickTimeTrackHeaderDirectory,
|
||||||
|
WebPDirectory WebPDirectory,
|
||||||
|
int? Width)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(ExifDirectory))]
|
||||||
|
public partial class ExifDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
66
Shared/Models/ExifDirectoryBase.cs
Normal file
66
Shared/Models/ExifDirectoryBase.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record ExifDirectoryBase(string? Aperture,
|
||||||
|
string? ApplicationNotes,
|
||||||
|
string? Artist,
|
||||||
|
string? BitsPerSample,
|
||||||
|
string? BodySerialNumber,
|
||||||
|
string? CameraOwnerName,
|
||||||
|
string? CompressedAverageBitsPerPixel,
|
||||||
|
string? Compression,
|
||||||
|
string? Copyright,
|
||||||
|
DateTime? DateTime,
|
||||||
|
DateTime? DateTimeDigitized,
|
||||||
|
DateTime? DateTimeOriginal,
|
||||||
|
string? DocumentName,
|
||||||
|
string? ExifVersion,
|
||||||
|
string? ExposureTime,
|
||||||
|
string? FileSource,
|
||||||
|
string? ImageDescription,
|
||||||
|
string? ImageHeight,
|
||||||
|
string? ImageNumber,
|
||||||
|
string? ImageUniqueId,
|
||||||
|
string? ImageWidth,
|
||||||
|
string? IsoSpeed,
|
||||||
|
string? LensMake,
|
||||||
|
string? LensModel,
|
||||||
|
string? LensSerialNumber,
|
||||||
|
string? Make,
|
||||||
|
string? MakerNote,
|
||||||
|
string? Model,
|
||||||
|
string? Orientation,
|
||||||
|
int? OrientationValue,
|
||||||
|
string? Rating,
|
||||||
|
string? RatingPercent,
|
||||||
|
string? SecurityClassification,
|
||||||
|
string? ShutterSpeed,
|
||||||
|
string? Software,
|
||||||
|
string? TimeZone,
|
||||||
|
string? TimeZoneDigitized,
|
||||||
|
string? TimeZoneOriginal,
|
||||||
|
string? UserComment,
|
||||||
|
string? WinAuthor,
|
||||||
|
string? WinComment,
|
||||||
|
string? WinKeywords,
|
||||||
|
string? WinSubject,
|
||||||
|
string? WinTitle,
|
||||||
|
string? XResolution,
|
||||||
|
string? YResolution)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, ExifDirectoryBaseSourceGenerationContext.Default.ExifDirectoryBase);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(ExifDirectoryBase))]
|
||||||
|
public partial class ExifDirectoryBaseSourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
23
Shared/Models/FileMetadataDirectory.cs
Normal file
23
Shared/Models/FileMetadataDirectory.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record FileMetadataDirectory(DateTime? FileModifiedDate,
|
||||||
|
string? FileName,
|
||||||
|
string? FileSize)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, FileMetadataDirectorySourceGenerationContext.Default.FileMetadataDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(FileMetadataDirectory))]
|
||||||
|
public partial class FileMetadataDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
22
Shared/Models/GifHeaderDirectory.cs
Normal file
22
Shared/Models/GifHeaderDirectory.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record GifHeaderDirectory(string? ImageHeight,
|
||||||
|
string? ImageWidth)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, GifHeaderDirectorySourceGenerationContext.Default.GifHeaderDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(GifHeaderDirectory))]
|
||||||
|
public partial class GifHeaderDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
26
Shared/Models/GpsDirectory.cs
Normal file
26
Shared/Models/GpsDirectory.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record GpsDirectory(string? Altitude,
|
||||||
|
string? Latitude,
|
||||||
|
string? LatitudeRef,
|
||||||
|
string? Longitude,
|
||||||
|
string? LongitudeRef,
|
||||||
|
DateTime? TimeStamp)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, GpsDirectorySourceGenerationContext.Default.GpsDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(GpsDirectory))]
|
||||||
|
public partial class GpsDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
22
Shared/Models/JpegDirectory.cs
Normal file
22
Shared/Models/JpegDirectory.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record JpegDirectory(string? ImageHeight,
|
||||||
|
string? ImageWidth)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, JpegDirectorySourceGenerationContext.Default.JpegDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(JpegDirectory))]
|
||||||
|
public partial class JpegDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
22
Shared/Models/PhotoshopDirectory.cs
Normal file
22
Shared/Models/PhotoshopDirectory.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record PhotoshopDirectory(string? JpegQuality,
|
||||||
|
string? Url)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, PhotoshopDirectorySourceGenerationContext.Default.PhotoshopDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(PhotoshopDirectory))]
|
||||||
|
public partial class PhotoshopDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
22
Shared/Models/PngDirectory.cs
Normal file
22
Shared/Models/PngDirectory.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record PngDirectory(string? ImageHeight,
|
||||||
|
string? ImageWidth)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, PngDirectorySourceGenerationContext.Default.PngDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(PngDirectory))]
|
||||||
|
public partial class PngDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
21
Shared/Models/QuickTimeMovieHeaderDirectory.cs
Normal file
21
Shared/Models/QuickTimeMovieHeaderDirectory.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record QuickTimeMovieHeaderDirectory(DateTime? Created)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, QuickTimeMovieHeaderDirectorySourceGenerationContext.Default.QuickTimeMovieHeaderDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(QuickTimeMovieHeaderDirectory))]
|
||||||
|
public partial class QuickTimeMovieHeaderDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
21
Shared/Models/QuickTimeTrackHeaderDirectory.cs
Normal file
21
Shared/Models/QuickTimeTrackHeaderDirectory.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record QuickTimeTrackHeaderDirectory(DateTime? Created)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, QuickTimeTrackHeaderDirectorySourceGenerationContext.Default.QuickTimeTrackHeaderDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(QuickTimeTrackHeaderDirectory))]
|
||||||
|
public partial class QuickTimeTrackHeaderDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
22
Shared/Models/WebPDirectory.cs
Normal file
22
Shared/Models/WebPDirectory.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record WebPDirectory(string? ImageHeight,
|
||||||
|
string? ImageWidth)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, WebPDirectorySourceGenerationContext.Default.WebPDirectory);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(WebPDirectory))]
|
||||||
|
public partial class WebPDirectorySourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<LangVersion>11.0</LangVersion>
|
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
|
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user