From a90045c443299afe0e407c0381bb95884f615d80 Mon Sep 17 00:00:00 2001 From: John Andrews Date: Fri, 5 Aug 2022 20:46:20 +1200 Subject: [PATCH] FF-240 - added recording of metadata info to files --- Apprise/Apprise.csproj | 4 +-- AudioNodes/AudioInfo.cs | 2 +- AudioNodes/AudioInfoHelper.cs | 2 +- AudioNodes/AudioNodes.csproj | 4 +-- AudioNodes/InputNodes/AudioFile.cs | 2 +- AudioNodes/Nodes/AudioNode.cs | 38 ++++++++++++++++++++++- AudioNodes/Nodes/ConvertNode.cs | 6 ++-- BasicNodes/BasicNodes.csproj | 4 +-- ChecksumNodes/ChecksumNodes.csproj | 4 +-- CollectionNodes/CollectionNodes.csproj | 4 +-- ComicNodes/ComicNodes.csproj | 4 +-- ComicNodes/Comics/ComicConverter.cs | 24 +++++++++++++- ComicNodes/Helpers/GenericExtractor.cs | 6 ++++ ComicNodes/Helpers/PdfHelper.cs | 12 +++++++ DiscordNodes/DiscordNodes.csproj | 4 +-- EmailNodes/EmailNodes.csproj | 4 +-- Emby/Emby.csproj | 4 +-- FileFlows.Plugin.dll | Bin 51200 -> 48128 bytes FileFlows.Plugin.pdb | Bin 27728 -> 26520 bytes Gotify/Gotify.csproj | 4 +-- ImageNodes/ImageNodes.csproj | 4 +-- MetaNodes/MetaNodes.csproj | 4 +-- MusicNodes/InputNodes/MusicFile.cs | 2 +- MusicNodes/MusicInfo.cs | 2 +- MusicNodes/MusicInfoHelper.cs | 2 +- MusicNodes/MusicNodes.csproj | 4 +-- MusicNodes/Nodes/ConvertNode.cs | 6 ++-- MusicNodes/Nodes/MusicNode.cs | 2 +- Plex/Plex.csproj | 4 +-- VideoLegacyNodes/VideoLegacyNodes.csproj | 4 +-- VideoNodes/VideoNodes.csproj | 4 +-- VideoNodes/VideoNodes/VideoNode.cs | 35 +++++++++++++++++++++ 32 files changed, 158 insertions(+), 47 deletions(-) diff --git a/Apprise/Apprise.csproj b/Apprise/Apprise.csproj index 57941e3a..8754c5a5 100644 --- a/Apprise/Apprise.csproj +++ b/Apprise/Apprise.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/AudioNodes/AudioInfo.cs b/AudioNodes/AudioInfo.cs index ff68b3d9..68c6695a 100644 --- a/AudioNodes/AudioInfo.cs +++ b/AudioNodes/AudioInfo.cs @@ -13,7 +13,7 @@ namespace FileFlows.AudioNodes public string[] Genres { get; set; } public string Encoder { get; set; } public long Duration { get; set; } - public long BitRate { get; set; } + public long Bitrate { get; set; } public string Codec { get; set; } public long Channels { get; set; } public long Frequency { get; set; } diff --git a/AudioNodes/AudioInfoHelper.cs b/AudioNodes/AudioInfoHelper.cs index 34cf15fc..d148ce3e 100644 --- a/AudioNodes/AudioInfoHelper.cs +++ b/AudioNodes/AudioInfoHelper.cs @@ -163,7 +163,7 @@ namespace FileFlows.AudioNodes { br = br.Substring(0, br.IndexOf(" ")); if (long.TryParse(br, out long value)) - mi.BitRate = value; + mi.Bitrate = value; } } diff --git a/AudioNodes/AudioNodes.csproj b/AudioNodes/AudioNodes.csproj index 6de2105e..f0f8cb94 100644 --- a/AudioNodes/AudioNodes.csproj +++ b/AudioNodes/AudioNodes.csproj @@ -6,8 +6,8 @@ enable true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/AudioNodes/InputNodes/AudioFile.cs b/AudioNodes/InputNodes/AudioFile.cs index 4d4dfdfd..d03a2bcf 100644 --- a/AudioNodes/InputNodes/AudioFile.cs +++ b/AudioNodes/InputNodes/AudioFile.cs @@ -18,7 +18,7 @@ namespace FileFlows.AudioNodes { "mi.Album", "Album" }, { "mi.Artist", "Artist" }, { "mi.ArtistThe", "Artist, The" }, - { "mi.BitRate", 845 }, + { "mi.Bitrate", 845 }, { "mi.Channels", 2 }, { "mi.Codec", "flac" }, { "mi.Date", new DateTime(2020, 05, 23) }, diff --git a/AudioNodes/Nodes/AudioNode.cs b/AudioNodes/Nodes/AudioNode.cs index a318bfc6..9740e82c 100644 --- a/AudioNodes/Nodes/AudioNode.cs +++ b/AudioNodes/Nodes/AudioNode.cs @@ -59,7 +59,7 @@ namespace FileFlows.AudioNodes variables.AddOrUpdate("audio.ArtistThe", AudioInfo.Artist); variables.AddOrUpdate("audio.Album", AudioInfo.Album); - variables.AddOrUpdate("audio.BitRate", AudioInfo.BitRate); + variables.AddOrUpdate("audio.Bitrate", AudioInfo.Bitrate); variables.AddOrUpdate("audio.Channels", AudioInfo.Channels); variables.AddOrUpdate("audio.Codec", AudioInfo.Codec); variables.AddOrUpdate("audio.Date", AudioInfo.Date); @@ -74,9 +74,45 @@ namespace FileFlows.AudioNodes variables.AddOrUpdate("audio.Disc", AudioInfo.Disc < 1 ? 1 : AudioInfo.Disc); variables.AddOrUpdate("audio.TotalDiscs", AudioInfo.TotalDiscs < 1 ? 1 : AudioInfo.TotalDiscs); + + if (args.OriginalMetadata == null) + { + args.OriginalMetadata = new Dictionary(); + args.OriginalMetadata.Add("Duration", AudioInfo.Duration); + args.OriginalMetadata.Add("Codec", AudioInfo.Codec); + args.OriginalMetadata.Add("Bitrate", AudioInfo.Bitrate); + args.OriginalMetadata.Add("Channels", AudioInfo.Channels); + AddIfSet(args.OriginalMetadata, "Date", AudioInfo.Date); + AddIfSet(args.OriginalMetadata, "Frequency", AudioInfo.Frequency); + AddIfSet(args.OriginalMetadata, "Encoder", AudioInfo.Encoder); + AddIfSet(args.OriginalMetadata, "Genres", AudioInfo.Genres); + AddIfSet(args.OriginalMetadata, "Language", AudioInfo.Language); + AddIfSet(args.OriginalMetadata, "Title", AudioInfo.Title); + AddIfSet(args.OriginalMetadata, "Track", AudioInfo.Track); + AddIfSet(args.OriginalMetadata, "Disc", AudioInfo.Disc); + AddIfSet(args.OriginalMetadata, "TotalDiscs", AudioInfo.TotalDiscs); + } + args.UpdateVariables(variables); } + private void AddIfSet(Dictionary dict, string name, object value) + { + if (value == null) + return; + if (value is string sValue && string.IsNullOrWhiteSpace(sValue)) + return; + if (value is int iValue && iValue < 1) + return; + if (value is TimeSpan tsValue && tsValue.TotalSeconds < 1) + return; + if (value is DateTime dtValue && dtValue.Year <= 1900) + return; + if (value is IEnumerable strList && strList.Any() == false) + return; + dict.Add(name, value); + } + protected AudioInfo GetAudioInfo(NodeParameters args) { if (args.Parameters.ContainsKey(Audio_INFO) == false) diff --git a/AudioNodes/Nodes/ConvertNode.cs b/AudioNodes/Nodes/ConvertNode.cs index 1569475c..2c7fdb94 100644 --- a/AudioNodes/Nodes/ConvertNode.cs +++ b/AudioNodes/Nodes/ConvertNode.cs @@ -156,13 +156,13 @@ namespace FileFlows.AudioNodes { if (SkipIfCodecMatches) { - args.Logger?.ILog($"Audio file already '{Codec}' at bitrate '{AudioInfo.BitRate}', and set to skip if codec matches"); + args.Logger?.ILog($"Audio file already '{Codec}' at bitrate '{AudioInfo.Bitrate}', and set to skip if codec matches"); return 2; } - if(AudioInfo.BitRate <= Bitrate) + if(AudioInfo.Bitrate <= Bitrate) { - args.Logger?.ILog($"Audio file already '{Codec}' at bitrate '{AudioInfo.BitRate}'"); + args.Logger?.ILog($"Audio file already '{Codec}' at bitrate '{AudioInfo.Bitrate}'"); return 2; } } diff --git a/BasicNodes/BasicNodes.csproj b/BasicNodes/BasicNodes.csproj index 18270f6c..33879506 100644 --- a/BasicNodes/BasicNodes.csproj +++ b/BasicNodes/BasicNodes.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true FileFlows John Andrews diff --git a/ChecksumNodes/ChecksumNodes.csproj b/ChecksumNodes/ChecksumNodes.csproj index 70473d69..f135472e 100644 --- a/ChecksumNodes/ChecksumNodes.csproj +++ b/ChecksumNodes/ChecksumNodes.csproj @@ -5,8 +5,8 @@ enable true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true FileFlows John Andrews diff --git a/CollectionNodes/CollectionNodes.csproj b/CollectionNodes/CollectionNodes.csproj index f9cc2c07..43040d53 100644 --- a/CollectionNodes/CollectionNodes.csproj +++ b/CollectionNodes/CollectionNodes.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/ComicNodes/ComicNodes.csproj b/ComicNodes/ComicNodes.csproj index 15d9083a..1aa159c3 100644 --- a/ComicNodes/ComicNodes.csproj +++ b/ComicNodes/ComicNodes.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/ComicNodes/Comics/ComicConverter.cs b/ComicNodes/Comics/ComicConverter.cs index e1530052..60004746 100644 --- a/ComicNodes/Comics/ComicConverter.cs +++ b/ComicNodes/Comics/ComicConverter.cs @@ -45,7 +45,15 @@ public class ComicConverter: Node currentFormat = currentFormat[1..]; // remove the dot currentFormat = currentFormat.ToLower(); - if(currentFormat == Format) + + if (args.OriginalMetadata == null) + { + args.OriginalMetadata = new Dictionary(); + args.OriginalMetadata.Add("Format", currentFormat); + args.OriginalMetadata.Add("Pages", GetPageCount(currentFormat, args.WorkingFile)); + } + + if (currentFormat == Format) { args.Logger?.ILog($"Already in the target format of '{Format}'"); return 2; @@ -63,6 +71,20 @@ public class ComicConverter: Node return 1; } + private int GetPageCount(string format, string workingFile) + { + if (format == null) + return 0; + format = format.ToLower().Trim(); + switch (format) + { + case "pdf": + return Helpers.PdfHelper.GetPageCount(workingFile); + default: + return Helpers.GenericExtractor.GetImageCount(workingFile); + } + } + private string CreateComic(NodeParameters args, string directory, string format) { string file = Path.Combine(args.TempPath, Guid.NewGuid().ToString() + "." + format); diff --git a/ComicNodes/Helpers/GenericExtractor.cs b/ComicNodes/Helpers/GenericExtractor.cs index 5b0e2c4f..7dbfafdd 100644 --- a/ComicNodes/Helpers/GenericExtractor.cs +++ b/ComicNodes/Helpers/GenericExtractor.cs @@ -25,4 +25,10 @@ internal class GenericExtractor if (args?.PartPercentageUpdate != null) args?.PartPercentageUpdate(halfProgress ? 50 : 100); } + + internal static int GetImageCount(string workingFile) + { + var rgxImages = new Regex(@"\.(jpeg|jpg|jpe|png|bmp|tiff|webp|gif)$"); + return ArchiveFactory.GetFileParts(workingFile).Where(x => rgxImages.IsMatch(x)).Count(); + } } diff --git a/ComicNodes/Helpers/PdfHelper.cs b/ComicNodes/Helpers/PdfHelper.cs index 5d026ff2..20a3ae56 100644 --- a/ComicNodes/Helpers/PdfHelper.cs +++ b/ComicNodes/Helpers/PdfHelper.cs @@ -115,4 +115,16 @@ internal class PdfHelper if (args?.PartPercentageUpdate != null) args?.PartPercentageUpdate(100); } + + /// + /// Gets the number of pages in a PDF + /// + /// the PDF file + /// the number of pages in the PDF + internal static int GetPageCount(string pdfFile) + { + using var library = DocLib.Instance; + using var docReader = library.GetDocReader(pdfFile, new PageDimensions(1080, 1920)); + return docReader.GetPageCount(); + } } diff --git a/DiscordNodes/DiscordNodes.csproj b/DiscordNodes/DiscordNodes.csproj index 5d1c8d70..0b2b51de 100644 --- a/DiscordNodes/DiscordNodes.csproj +++ b/DiscordNodes/DiscordNodes.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/EmailNodes/EmailNodes.csproj b/EmailNodes/EmailNodes.csproj index 77c4fa87..601527d1 100644 --- a/EmailNodes/EmailNodes.csproj +++ b/EmailNodes/EmailNodes.csproj @@ -9,8 +9,8 @@ true true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true FileFlows John Andrews diff --git a/Emby/Emby.csproj b/Emby/Emby.csproj index 6d2b3c54..70b60ff0 100644 --- a/Emby/Emby.csproj +++ b/Emby/Emby.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/FileFlows.Plugin.dll b/FileFlows.Plugin.dll index df60dd905f249163113b3ddf12d7961b2ea63b8f..662f3a0208928b5011e5344f415108c60229f941 100644 GIT binary patch literal 48128 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 AF#rGn diff --git a/Gotify/Gotify.csproj b/Gotify/Gotify.csproj index 6edef2c2..32681cf2 100644 --- a/Gotify/Gotify.csproj +++ b/Gotify/Gotify.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/ImageNodes/ImageNodes.csproj b/ImageNodes/ImageNodes.csproj index cc983011..163972da 100644 --- a/ImageNodes/ImageNodes.csproj +++ b/ImageNodes/ImageNodes.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/MetaNodes/MetaNodes.csproj b/MetaNodes/MetaNodes.csproj index b015aa2b..ef96b28e 100644 --- a/MetaNodes/MetaNodes.csproj +++ b/MetaNodes/MetaNodes.csproj @@ -6,8 +6,8 @@ enable true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/MusicNodes/InputNodes/MusicFile.cs b/MusicNodes/InputNodes/MusicFile.cs index dfdbe8a5..a1633db2 100644 --- a/MusicNodes/InputNodes/MusicFile.cs +++ b/MusicNodes/InputNodes/MusicFile.cs @@ -19,7 +19,7 @@ namespace FileFlows.MusicNodes { "mi.Album", "Album" }, { "mi.Artist", "Artist" }, { "mi.ArtistThe", "Artist, The" }, - { "mi.BitRate", 845 }, + { "mi.Bitrate", 845 }, { "mi.Channels", 2 }, { "mi.Codec", "flac" }, { "mi.Date", new DateTime(2020, 05, 23) }, diff --git a/MusicNodes/MusicInfo.cs b/MusicNodes/MusicInfo.cs index 46970deb..f5128501 100644 --- a/MusicNodes/MusicInfo.cs +++ b/MusicNodes/MusicInfo.cs @@ -13,7 +13,7 @@ namespace FileFlows.MusicNodes public string[] Genres { get; set; } public string Encoder { get; set; } public long Duration { get; set; } - public long BitRate { get; set; } + public long Bitrate { get; set; } public string Codec { get; set; } public long Channels { get; set; } public long Frequency { get; set; } diff --git a/MusicNodes/MusicInfoHelper.cs b/MusicNodes/MusicInfoHelper.cs index 0aa4418f..1f05e591 100644 --- a/MusicNodes/MusicInfoHelper.cs +++ b/MusicNodes/MusicInfoHelper.cs @@ -163,7 +163,7 @@ namespace FileFlows.MusicNodes { br = br.Substring(0, br.IndexOf(" ")); if (long.TryParse(br, out long value)) - mi.BitRate = value; + mi.Bitrate = value; } } diff --git a/MusicNodes/MusicNodes.csproj b/MusicNodes/MusicNodes.csproj index ef72caca..ef96b42f 100644 --- a/MusicNodes/MusicNodes.csproj +++ b/MusicNodes/MusicNodes.csproj @@ -6,8 +6,8 @@ enable true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/MusicNodes/Nodes/ConvertNode.cs b/MusicNodes/Nodes/ConvertNode.cs index 532d2f60..7c943604 100644 --- a/MusicNodes/Nodes/ConvertNode.cs +++ b/MusicNodes/Nodes/ConvertNode.cs @@ -152,13 +152,13 @@ namespace FileFlows.MusicNodes { if (SkipIfCodecMatches) { - args.Logger?.ILog($"Music file already '{Codec}' at bitrate '{musicInfo.BitRate}', and set to skip if codec matches"); + args.Logger?.ILog($"Music file already '{Codec}' at bitrate '{musicInfo.Bitrate}', and set to skip if codec matches"); return 2; } - if(musicInfo.BitRate <= Bitrate) + if(musicInfo.Bitrate <= Bitrate) { - args.Logger?.ILog($"Music file already '{Codec}' at bitrate '{musicInfo.BitRate}'"); + args.Logger?.ILog($"Music file already '{Codec}' at bitrate '{musicInfo.Bitrate}'"); return 2; } } diff --git a/MusicNodes/Nodes/MusicNode.cs b/MusicNodes/Nodes/MusicNode.cs index 9153d15e..62d5e261 100644 --- a/MusicNodes/Nodes/MusicNode.cs +++ b/MusicNodes/Nodes/MusicNode.cs @@ -59,7 +59,7 @@ namespace FileFlows.MusicNodes variables.AddOrUpdate("mi.ArtistThe", musicInfo.Artist); variables.AddOrUpdate("mi.Album", musicInfo.Album); - variables.AddOrUpdate("mi.BitRate", musicInfo.BitRate); + variables.AddOrUpdate("mi.Bitrate", musicInfo.Bitrate); variables.AddOrUpdate("mi.Channels", musicInfo.Channels); variables.AddOrUpdate("mi.Codec", musicInfo.Codec); variables.AddOrUpdate("mi.Date", musicInfo.Date); diff --git a/Plex/Plex.csproj b/Plex/Plex.csproj index b1f1a18b..c01f1a24 100644 --- a/Plex/Plex.csproj +++ b/Plex/Plex.csproj @@ -5,8 +5,8 @@ enable enable FileFlows.$(MSBuildProjectName.Replace(" ", "_")) - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true true FileFlows diff --git a/VideoLegacyNodes/VideoLegacyNodes.csproj b/VideoLegacyNodes/VideoLegacyNodes.csproj index 6ae4ea1b..f9484c63 100644 --- a/VideoLegacyNodes/VideoLegacyNodes.csproj +++ b/VideoLegacyNodes/VideoLegacyNodes.csproj @@ -6,8 +6,8 @@ enable true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true FileFlows John Andrews diff --git a/VideoNodes/VideoNodes.csproj b/VideoNodes/VideoNodes.csproj index a20f6297..d4f0662e 100644 --- a/VideoNodes/VideoNodes.csproj +++ b/VideoNodes/VideoNodes.csproj @@ -6,8 +6,8 @@ enable true true - 1.0.0.169 - 1.0.0.169 + 1.0.0.170 + 1.0.0.170 true FileFlows John Andrews diff --git a/VideoNodes/VideoNodes/VideoNode.cs b/VideoNodes/VideoNodes/VideoNode.cs index 4d7b9b6d..1748b040 100644 --- a/VideoNodes/VideoNodes/VideoNode.cs +++ b/VideoNodes/VideoNodes/VideoNode.cs @@ -113,6 +113,41 @@ namespace FileFlows.VideoNodes variables.AddOrUpdate("vi.Resolution", videoInfo.VideoStreams[0].Width + "x" + videoInfo.VideoStreams[0].Height); args.UpdateVariables(variables); + + if(args.OriginalMetadata == null) + { + args.OriginalMetadata = new Dictionary(); + args.OriginalMetadata.Add("Duration", videoInfo.VideoStreams[0].Duration); + foreach (var (stream, i) in videoInfo.VideoStreams.Select((value, i) => (value, i))) + { + string prefix = "Video" + (i == 0 ? "" : " " + (i + 1)) + " "; + args.OriginalMetadata.Add(prefix + "Codec", stream.Codec); + args.OriginalMetadata.Add(prefix + "Resolution", stream.Width + "x" + stream.Height + (stream.HDR ? " (HDR)" : string.Empty)); + if(stream.Bitrate > 0) + args.OriginalMetadata.Add(prefix + "Bitrate", stream.Bitrate); + } + foreach (var (stream, i) in videoInfo.AudioStreams.Select((value, i) => (value, i))) + { + string prefix = "Audio" + (i == 0 ? "" : " " + (i + 1)) + " "; + args.OriginalMetadata.Add(prefix + "Codec", stream.Codec); + args.OriginalMetadata.Add(prefix + "Channels", stream.Channels); + if (string.IsNullOrEmpty(stream.Title) == false) + args.OriginalMetadata.Add(prefix + "Title", stream.Title); + if(string.IsNullOrEmpty(stream.Language) == false) + args.OriginalMetadata.Add(prefix + "Language", stream.Language); + if (stream.Bitrate > 0) + args.OriginalMetadata.Add(prefix + "Bitrate", stream.Bitrate); + } + foreach (var (strream, i) in videoInfo.SubtitleStreams.Select((value, i) => (value, i))) + { + string prefix = "Audio" + (i == 0 ? "" : " " + (i + 1)) + " "; + args.OriginalMetadata.Add(prefix + "Codec", strream.Codec); + if (string.IsNullOrEmpty(strream.Title) == false) + args.OriginalMetadata.Add(prefix + "Title", strream.Title); + if (string.IsNullOrEmpty(strream.Language) == false) + args.OriginalMetadata.Add(prefix + "Language", strream.Language); + } + } } protected VideoInfo GetVideoInfo(NodeParameters args, bool refreshIfFileChanged = true)