From 7618b83a04a476a6bc0b01a18c334ddf9f416126 Mon Sep 17 00:00:00 2001 From: John Andrews Date: Tue, 7 May 2024 17:24:22 +1200 Subject: [PATCH] FF-1530: DeleteNonPageImages --- ComicNodes/Comics/CreateComicInfo.cs | 92 +++++++++++++++++++++------ ComicNodes/i18n/en.json | 4 +- FileFlows.Plugin.dll | Bin 139264 -> 139264 bytes FileFlows.Plugin.pdb | Bin 33916 -> 33916 bytes 4 files changed, 76 insertions(+), 20 deletions(-) diff --git a/ComicNodes/Comics/CreateComicInfo.cs b/ComicNodes/Comics/CreateComicInfo.cs index 9f1f7679..55991df9 100644 --- a/ComicNodes/Comics/CreateComicInfo.cs +++ b/ComicNodes/Comics/CreateComicInfo.cs @@ -29,6 +29,12 @@ public class CreateComicInfo : Node /// [Boolean(1)] public bool Publisher { get; set; } + + /// + /// Gets or sets if the file should be renamed + /// + [Boolean(2)] + public bool RenameFile { get; set; } /// public override int Execute(NodeParameters args) @@ -51,36 +57,38 @@ public class CreateComicInfo : Node return -1; } - if (result.Value == true) + if (result.Value) { args.Logger?.ILog("comicinfo.xml already present"); return 2; } - var info = GetInfo(args.Logger, args.LibraryFileName, args.LibraryPath, Publisher); - if (info.Failed(out error)) + var infoResult = GetInfo(args.Logger, args.LibraryFileName, args.LibraryPath, Publisher); + if (infoResult.Failed(out error)) { args.FailureReason = error; args.Logger?.ELog(error); return -1; } + + var info = infoResult.Value; args.Logger?.ILog("Got ComicInfo from filename"); var newMetadata = new Dictionary { - { nameof(info.Value.Title), info.Value.Title }, - { nameof(info.Value.Series), info.Value.Series }, - { nameof(info.Value.Publisher), info.Value.Publisher }, - { nameof(info.Value.Number), info.Value.Number }, - { nameof(info.Value.Count), info.Value.Count }, - { nameof(info.Value.Volume), info.Value.Volume }, - { nameof(info.Value.AlternateSeries), info.Value.AlternateSeries }, - { nameof(info.Value.AlternateNumber), info.Value.AlternateNumber }, - { nameof(info.Value.AlternateCount), info.Value.AlternateCount }, - { nameof(info.Value.Summary), info.Value.Summary }, - { nameof(info.Value.Notes), info.Value.Notes }, - { nameof(info.Value.ReleaseDate), info.Value.ReleaseDate }, - { nameof(info.Value.Tags), info.Value.Tags?.Any() == true ? string.Join(", ", info.Value.Tags) : null } + { nameof(info.Title), info.Title }, + { nameof(info.Series), info.Series }, + { nameof(info.Publisher), info.Publisher }, + { nameof(info.Number), info.Number }, + { nameof(info.Count), info.Count }, + { nameof(info.Volume), info.Volume }, + { nameof(info.AlternateSeries), info.AlternateSeries }, + { nameof(info.AlternateNumber), info.AlternateNumber }, + { nameof(info.AlternateCount), info.AlternateCount }, + { nameof(info.Summary), info.Summary }, + { nameof(info.Notes), info.Notes }, + { nameof(info.ReleaseDate), info.ReleaseDate }, + { nameof(info.Tags), info.Tags?.Any() == true ? string.Join(", ", info.Tags) : null } }.Where(x => x.Value != null) .ToDictionary(x => x.Key, x => x.Value); @@ -94,7 +102,7 @@ public class CreateComicInfo : Node } } - string xml = SerializeToXml(info.Value); + string xml = SerializeToXml(info); if (string.IsNullOrWhiteSpace(xml)) { args.FailureReason = "Failed to serialize to XML"; @@ -119,6 +127,41 @@ public class CreateComicInfo : Node { args.Logger?.ELog("Failed to move saved file: " + error); } + + if (RenameFile) + { + if (info.Number == null && info.Volume?.StartsWith("Volume") == false) + { + args.Logger?.WLog("No issue number found, cannot rename"); + return 1; + } + if (string.IsNullOrWhiteSpace(info.Series)) + { + args.Logger?.WLog("No series found, cannot rename"); + return 1; + } + + string name = info.Series; + if (info.Number != null) + name += $" - #{info.Number + (info.Count > 0 ? $" (of {info.Count})" : "")}"; + else + name += " - " + info.Series; + + if (string.IsNullOrWhiteSpace(info.Title) == false) + name += " - " + info.Title; + + name += "." + FileHelper.GetExtension(args.WorkingFile); + + string path = FileHelper.GetDirectory(args.WorkingFile); + string newFile = FileHelper.Combine(path, name); + args.Logger?.ILog("New file name: " + newFile); + if (args.FileService.FileMove(args.WorkingFile, newFile).Failed(out error)) + { + args.Logger?.WLog("Failed ot rename file: " + error); + } + + args.SetWorkingFile(newFile); + } return 1; } @@ -157,11 +200,20 @@ public class CreateComicInfo : Node { parts = shortname.Split('#'); if (parts.Length < 2) + { + var lastChanceMatch = Regex.Match(shortname, @"(\d)+$"); + if(lastChanceMatch.Success) + { + info.Number = int.Parse(lastChanceMatch.Groups[1].Value); + return info; + } return Result.Fail("Invalid filename: " + shortname); + } + parts[1] = '#' + parts[1]; } - var issueNumberMatch = Regex.Match(parts[1], @"#(?\d+)(?:\s+of\s+#(?\d+))?"); + var issueNumberMatch = Regex.Match(parts[1], @"[#]?(?\d+)(?:\s+of\s+[#]?(?\d+))?"); if (issueNumberMatch.Success) { @@ -184,7 +236,9 @@ public class CreateComicInfo : Node } if (parts.Length > 2) - info.Title = parts[2].Trim(); + { + info.Title = Regex.Replace(parts[2], @"\s*\([^)]*\)\s*", " ").Trim(); + } return info; } diff --git a/ComicNodes/i18n/en.json b/ComicNodes/i18n/en.json index 0f6fd875..137c8ff6 100644 --- a/ComicNodes/i18n/en.json +++ b/ComicNodes/i18n/en.json @@ -38,7 +38,9 @@ "Description": "Parses the path of a comic and create a comicinfo.xml file inside the comic book archive.", "Fields": { "Publisher": "Publisher", - "Publisher-Help": "If the comic is in a publisher directory, see help for more information." + "Publisher-Help": "If the comic is in a publisher directory, see help for more information.", + "RenameFile": "Rename File", + "RenameFile-Help": "If the file should be renamed `Series - Issue - Title.extension`" }, "Outputs": { "1": "ComicInfo added to comic archive", diff --git a/FileFlows.Plugin.dll b/FileFlows.Plugin.dll index c8faecd87ea9cdc705caac58fc2f4576b8d66de9..edaaff42bcb58d3bf491766a85fc32e2303f7699 100644 GIT binary patch delta 250 zcmZoTz|nAkV?qbZ1D8qb8hcuM7`OH?X)p`eEqi-Vb0v@GBB@_-`;-10+kS+ZX||w7 znq^XoacYW5qPanyHzAg+Yp0s%5Ih_I6RGMn;yO**~67 z=MiTL5ZD><#ks~W*mvFso356Shx@1Jh%?zMKt=DyK}CV;)0uCtay&FixW|543fK12 z;!LTm{%H)B3`qYB01BzGxVG>Zz5X?#gsxV_P W0J05$a%Mo?mOyN=yEsAJJpUZtFKz)zqg{DNWB2XR=p-if+?~iUQRuoeiCC6~33xBxUL8ffz)mF&F|xk{K+4JQEBViW^iwlYnFtYO?Y)LdICJ+S)l0}9N&R`|Pu`YGvw2m-2D7dt? zhhu7~3}wc{P%A}S8U;yd9d*+2DCkkpR>UfcBSTe+1BfjQ^L;r}|KgtW`Q6{U_m}&Y z-1jCAIZPgMs4Veo%^OvgWb4$mKgr)I*Y{p{xq0GoQ>D=%WOH%=IZFa)JG=#df?5fo z1yCz;o5Xz4$_!c^#3+_Q599hDW8LHs~d``cV1%tu45d&3@4+$n80z6P zoP)2y1|4u4?!zN^3S%$@j&hbfU^Xm-#d6j}F-Vdi1=2wcYvFfL1Y4mPN}&SYgTFx| zoP{>{2ed;M^uPc-fl-(QehN#05DF|DgRfv9#l#XVV<`YwNQPygf^5hI-g1`agBZ?3 z7d!(+DodxJ8Jt$IYZLb&8UgZ1WFjPVn)IvQpf(1-ggo|+H)k%Imv6yaP z{9pfH>?v}78aF2q-lm_?HxwR4( z&{TRN@l}a<9TLf1#SJEqk1B!uRd_%5nkb5dswfHr7Lq^?O2`BaQiRg|>MEBwM0|-BY9F*`JUIMKYQ8uiFb?_X1 zSS6zGGDI{0lqsSBSOo?+1I^F_|ADgAB6_kKw-{#%r7yBVsRh0P8?-|wbVDx;!f+OM z^g_N1i)d=Zab}+TUW&1HV#~^x3M(NS*1|d{gg4+FXn?CQ1a3JziUcu8bNG~z<49{^9q^To z_zNAW5cwOhBgcu3fElX6bOqrD7zKBY6NP{bG_VQE;5amCoaq)E$#JH;8W$SUxYD@B zjU2RY0PnaDMe2L;+$RI2r$!&*-|1~pnw6V)MU;K)3w z3H^Dk7jI(TgCyDx#+ingyEM%7F=6CLiGnb! zdKS@{CViB|r+7i3J?^*1e#B@2kKtk+Vz_|kz^72bB1Dm35syzH0;N6fM~oEoBgP4M zd_J*)J5D@$GHcw4XFeF|;d@1wn&LuBb5m1XNuT==xz%zq(&BC6r7ZdFU*0TOm3d=w zk#3tjv&7m^o%%`Sw6#3A>QO`WbXo2Yp22CedNofhI57N6)PY*R9WC_*`B91(z1*cf z=8poeyB!8erCM}6Z~VcZPdA_St3UX0&GYL6$Gt)`cHV19&v1CrZf=dqsVgdw0hN6Wz8Mj=h@Zfs}0sS9;n%KP*}XJ(N-h8e6%#9 zuxyiO{waMsi8;MU+K zzpoP>e{oe``qs1eH(vOr_0+QCXEvtg8f$-Qu(()W3%3-HXkRLZuA9dGSsxx_=v6*g zk>YSBCwSM};*${%XP;hLKiao#7yF5P^XpsAeO7U5`F6>Mqa(|nGYh;Xa?F8>gc89)amPAzSe!R|3>GQ7uSBix!Ts-k$GuP z-dIIZdPTMHH^GGg=?|C$M$DMMPgx&slx;916d4jug`59Z8R&}Y6@H0V3Sl;vBamRUT*1k=*TwEmm1GK^KoSjCJr z(~|NBwX4TY?o`~>_TeHeRXfHRrqA;Jt~|znrbY1cmOjh$?uX8NOjlU?OI&!aT*myJ Nw4s(!(;+@X{{tG%=RE)b delta 2739 zcmZwHc~nzZ9tZH>%Lark0^-8H2!th&ge9RwsSreC0=xh%RXVJ3I*v?RZ97uN%($S{ z%2829?Xir-r7cB^!BDVLZIvEI;q+L+x_}OmR#8DK!cZ$S-MI~`e$>3f#0&m&qAxin`O+KkS1?0;5~27~ zJMzw?+Or}rvy?6+Ny$egrDRwHxlpX)21Zh!Dw6u)Hr%tf#n8{H7@7ocbqx7IC`5q* z)Q}2`zyNu$97jL--tpbgHzx6lKiWJaj`Z^urK5fG6+_gc=zIKsdxg9efEx8ncX;`7-i@SV)2eun4l?B@ir-kq;=K z4SHb|(o$vgDYSyai!ySD_n-wjp&y1oz7S&}4}OFZ7+)AmQy?^_#gYqn!dwV~h%|14 z{9fWH_W7}#64T_QfppLT3k6UFE1&}2vX7Tj74i+R6?Vd2sD~ra1TA1bh43|WJwM6s zCzjK9X#eTA#YT_|)44u5snX^2I((e2pwn;;F2E(Y3ZpO%&p@D6kTZBd45+mUq=f-3 zw^qClO=;svm=TZ9A)Z_^xJD&;W+-WH2ENaC%@jpJ8Br7gv5*KFNCzFTPyj`+0xIAw zsDcf!6?Vd2`^wzv(Nv!iO-G;!THq9X4PEe^eOxGA$q1zZcy$QjK4>5v9>XudEDEJ8 z$cI9B3^y}F>4(LkGz83&Q1XMtP!7kT75ZTe*6Tv)feyDAXAYz0rD601dv0NM*=Z!kgJ5+77$n12A_X+=M6Kk|UxJNCp=E1nXfxoXByY?_qnk16|8; zqrCnJv&tDiZD-OUXQ2R!SQlEyy3$tGjq2b4>t?1y zNE$h6H#&j3jdiD9Rzm+_XV3%I19#?uJM*AP)|13WPx66aqZdhyGbsU5AkFBFZR|~X zsFxdO;R(#9RmM5A*62%{jNH?e(ho){-GV#t5dI648z&{lTq#LlHUvTh#N~36xFRLh z^IS$%x!5$m0dm@yE2sBi-}6pxa00E%m(eE6aq$y>eWQJ^Ff^LTLl++yVv~fZMfRMh zazyQ9&q?i!+QpuiC%d6`2Pe9c=0exB3@K|LNoSd(vjk{$B^BGvIM6V2l}4FCCY*$n zAPL8+ClMX!nMWE4NGU0`#|`#qLyVE|87?*;N+o=rfWjpqi1Q>Nd;x_>((G{qVwA*& zD3|aB0*aONiTHHiWn9Fs-5lxa*=0=CI8sV}s>X@(@^2wOWjPvYnPG0Xgb&I`g4(i#k0G1O`TIT`wqAK`QYGKT$iCQHBq|Qdg6Z_14;|=I1}xom==!JH#k`4^*M1+9S*y*O zOlwH64rDsqxGh+==JkjCMl*BPr(sai=KkTT>{++hyLGG$KNK9%EUMWPvSYu`%J<$a zYB?MGTJ*nqilg?3#SylY%;wFLuFpc<0(F}&K00>o_Ln#6R(RwYhI#oXALkkj6_0jp z6tBu`2+tX->B;HJ{o6YuHAlbd*e6|(bHzB?RJP}6V^7LO)3J+v=biIrvhSFWEs$wn z3)&Vr=65;d)-JDu4cpXu=6G4Z^l-q${?+oK0_V~Tg)tvbo#}snW9DW}ooVmkeRq`e z4GzoWe3ibY`}t!}=LEQCe6!6W`>ZQ!{}ZA{xR)6QesgP3*&)2_3m{88`Zx|%x` zcXc*gl%?*CafY#3wy%DfnKRuYnBHo$Os%=)AV7DuWw6ST@5E)y8DhgNkIh>I{|73` B+a3S_