Version 1.1.0

See version history for details on all the changes.
This commit is contained in:
David Maisonave
2024-12-13 16:44:52 -05:00
parent 0791ea15c0
commit 14bb86a529
10 changed files with 1187 additions and 628 deletions

View File

@@ -8,68 +8,13 @@ table, th, td {border:1px solid black;}
.inline {
display: inline;
}
.scene-details{text-align: center;font-size: small;}
.reason-details{text-align: left;font-size: small;}
.link-items{text-align: center;font-size: small;}
.link-button {
background: none;
border: none;
color: blue;
text-decoration: underline;
cursor: pointer;
font-size: 1em;
font-family: serif;
text-align: center;
font-size: small;
}
.link-button:focus {
outline: none;
}
.link-button:active {
color:red;
}
html.wait, html.wait * { cursor: wait !important; }
/* The dropdown container */
.dropdown {
float: left;
overflow: hidden;
}
/******** Dropdown button *********/
.dropdown .dropbtn {
font-size: 14px;
border: none;
outline: none;
color: white;
padding: 6px 10px;
background-color: transparent;
font-family: inherit; /* Important for vertical align on mobile phones */
margin: 0; /* Important for vertical align on mobile phones */
}
/* Dropdown content (hidden by default) */
.dropdown-content {
display: none;
position: absolute;
background-color: inherit;
min-width: 80px;
box-shadow: 0px 4px 12px 0px rgba(0,0,0,0.2);
z-index: 1;
}
/* Links inside the dropdown */
.dropdown-content a {
float: none;
color: black;
padding: 6px 10px;
text-decoration: none;
display: block;
text-align: left;
}
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
display: block;
}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="https://www.axter.com/js/jquery-3.7.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://axter.com/js/easyui/themes/black/easyui.css"> <!-- black || material-blue-->
<link rel="stylesheet" type="text/css" href="https://axter.com/js/easyui/themes/icon.css">
<!-- <script type="text/javascript" src="https://axter.com/js/easyui/jquery.min.js"></script> -->
<script type="text/javascript" src="https://axter.com/js/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="https://axter.com/js/easyui/jquery.easyui.min.js"></script>
<script src="https://www.axter.com/js/jquery.prompt.js"></script>
<link rel="stylesheet" href="https://www.axter.com/js/jquery.prompt.css"/>
<script>
@@ -85,6 +30,7 @@ console.log("GQL = " + GraphQl_URL);
console.log("Key = " + apiKey);
function RunPluginDupFileManager(Mode, Param = 0, Async = false, TagOnlyScenes = false) {
// alert("Mode = " + Mode + ";Param = " + Param);
$('html').addClass('wait');
$("body").css("cursor", "progress");
if (TagOnlyScenes)
@@ -114,8 +60,8 @@ function RunPluginDupFileManager(Mode, Param = 0, Async = false, TagOnlyScenes =
if (result.indexOf("\"Report complete\"") == -1)
alert("Stash RunPluginOperation returned unexpected results.\nNot sure if report completed successfully.\n\nResults = " + result);
else
$('<p>Report complete. Click on OK to open report in browser.</p>').confirm(function(e){
if(e.response){
$('<p>Report complete. Click on OK to open report in browser.</p>').confirm(function(retrn){
if(retrn.response){
var reportUrl = window.location.href;
reportUrl = reportUrl.replace("advance_options.html", "report/DuplicateTagScenes.html");
console.log("reportUrl = " + reportUrl);
@@ -130,64 +76,87 @@ function RunPluginDupFileManager(Mode, Param = 0, Async = false, TagOnlyScenes =
}
});
console.log("Setting default cursor");
}
$(document).ready(function(){
$("button").click(function(){
}
function GetStashTabUrl(Tab){
var Url = GraphQl_URL;
Url = Url.replace("graphql", "settings?tab=" + Tab);
console.log("Url = " + Url);
return Url;
}
function GetReportCreateOptions(Value){
if (Value === "-1")
return "";
const param = Value + ":" + $("#significantTimeDiff").val() + ":" + $("#IncludePreviewImage").prop('checked') + ":" + $("#scenesPerPage").val() + ":" + $("#ImagePreviewSize").val() + ":" + $("#ImagePreviewPopupSize").val() + ":" + $("#TimeDiffHighlight").val() + ":" + $("#maxDupToProcess").val() + ":" + $("#streamOverPreview").prop('checked') + ":" + $("#SupperHighlight").val() + ":" + $("#DetailDiffTextColor").val() + ":" + $("#LowerHighlight").val() + ":" + $("#ReportBackgroundColor").val() + ":" + $("#ReportTextColor").val() + ":" + $("#VideoPreviewWidth").val() + ":" + $("#VideoPreviewHeight").val() + ":" + $("#IncludePreviewVideo").prop('checked');
console.log("param = " + param);
return param;
}
function ProcessClick(This_){
if (This_ == null)
return;
const ID = This_.id;
var Value = This_.getAttribute("value");
if ((ID == null || ID === "") && (Value == null || Value === ""))
return;
if (Value == null) Value = "";
console.log("ID = " + ID + "; Value = " + Value);// alert("ID = " + ID + "; Value = " + Value);
const AddedWarn = "? This will delete the files, and remove them from stash.";
console.log(this.id);
var blackliststr = "";
var comparestr = "less than ";
if (this.id.includes("Blacklist")) blackliststr = "in blacklist ";
if (this.id.includes("Graylist")) blackliststr = "in graylist ";
if (this.id.includes("Pinklist")) blackliststr = "in pinklist ";
if (this.id.includes("Greater")) comparestr = "greater than ";
else if (this.id.includes("Eq")) comparestr = "equal to ";
if (this.id === "tag_duplicates_task")
if (ID.includes("Blacklist")) blackliststr = "in blacklist ";
if (ID.includes("Graylist")) blackliststr = "in graylist ";
if (ID.includes("Pinklist")) blackliststr = "in pinklist ";
if (ID.includes("Greater")) comparestr = "greater than ";
else if (ID.includes("Eq")) comparestr = "equal to ";
if (ID === "tag_duplicates_task")
{
RunPluginDupFileManager(this.id, this.value, true);
RunPluginDupFileManager(ID, Value, true);
}
else if (this.id.startsWith("tag_duplicates_task"))
else if (ID.startsWith("tag_duplicates_task"))
{
RunPluginDupFileManager("tag_duplicates_task", this.value + ":" + $("#significantTimeDiff").val(), true);
RunPluginDupFileManager("tag_duplicates_task", GetReportCreateOptions(Value), true);
}
else if (this.id.startsWith("create_duplicate_report_task"))
else if (ID.startsWith("create_duplicate_report_task"))
{
RunPluginDupFileManager("create_duplicate_report_task", this.value + ":" + $("#significantTimeDiff").val(), true);
RunPluginDupFileManager("create_duplicate_report_task", GetReportCreateOptions(Value), true);
}
else if (this.id === "viewreport")
else if (ID === "viewreport")
{
var reportUrl = window.location.href;
reportUrl = reportUrl.replace("advance_options.html", "report/DuplicateTagScenes.html");
console.log("reportUrl = " + reportUrl);
window.open(reportUrl, "_blank");
}
else if (this.id === "pathToDelete" || this.id === "pathToDeleteBlacklist")
else if (ID === "viewStashPlugin")
window.open(GetStashTabUrl("plugins"), "_blank");
else if (ID === "viewStashTools")
window.open(GetStashTabUrl("tools"), "_blank");
else if (ID === "pathToDelete" || ID === "pathToDeleteBlacklist")
{
if (confirm("Are you sure you want to delete tag scenes " + blackliststr + "having _DuplicateMarkForDeletion tags, and in path " + $("#pathToDeleteText").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#pathToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#pathToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "sizeToDeleteLess" || this.id === "sizeToDeleteGreater" || this.id === "sizeToDeleteBlacklistLess" || this.id === "sizeToDeleteBlacklistGreater")
else if (ID === "sizeToDeleteLess" || ID === "sizeToDeleteGreater" || ID === "sizeToDeleteBlacklistLess" || ID === "sizeToDeleteBlacklistGreater")
{
if (confirm("Are you sure you want to delete duplicate tag scenes " + blackliststr + "having file size " + comparestr + $("#sizeToDelete").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#sizeToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#sizeToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "durationToDeleteLess" || this.id === "durationToDeleteGreater" || this.id === "durationToDeleteBlacklistLess" || this.id === "durationToDeleteBlacklistGreater")
else if (ID === "durationToDeleteLess" || ID === "durationToDeleteGreater" || ID === "durationToDeleteBlacklistLess" || ID === "durationToDeleteBlacklistGreater")
{
if (confirm("Are you sure you want to delete duplicate tag scenes " + blackliststr + "having file duration " + comparestr + $("#durationToDelete").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#durationToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#durationToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "commonResToDeleteLess" || this.id === "commonResToDeleteEq" || this.id === "commonResToDeleteGreater" || this.id === "commonResToDeleteBlacklistLess" || this.id === "commonResToDeleteBlacklistEq" || this.id === "commonResToDeleteBlacklistGreater")
else if (ID === "commonResToDeleteLess" || ID === "commonResToDeleteEq" || ID === "commonResToDeleteGreater" || ID === "commonResToDeleteBlacklistLess" || ID === "commonResToDeleteBlacklistEq" || ID === "commonResToDeleteBlacklistGreater")
{
if (confirm("Are you sure you want to delete duplicate tag scenes " + blackliststr + "having resolution " + comparestr + $("#commonResToDelete").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#commonResToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#commonResToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "resolutionToDeleteLess" || this.id === "resolutionToDeleteEq" || this.id === "resolutionToDeleteGreater" || this.id === "resolutionToDeleteBlacklistLess" || this.id === "resolutionToDeleteBlacklistEq" || this.id === "resolutionToDeleteBlacklistGreater")
else if (ID === "resolutionToDeleteLess" || ID === "resolutionToDeleteEq" || ID === "resolutionToDeleteGreater" || ID === "resolutionToDeleteBlacklistLess" || ID === "resolutionToDeleteBlacklistEq" || ID === "resolutionToDeleteBlacklistGreater")
{
if (confirm("Are you sure you want to delete duplicate tag scenes " + blackliststr + "having resolution " + comparestr + $("#resolutionToDelete").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#resolutionToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#resolutionToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "ratingToDeleteLess" || this.id === "ratingToDeleteEq" || this.id === "ratingToDeleteGreater" || this.id === "ratingToDeleteBlacklistLess" || this.id === "ratingToDeleteBlacklistEq" || this.id === "ratingToDeleteBlacklistGreater")
else if (ID === "ratingToDeleteLess" || ID === "ratingToDeleteEq" || ID === "ratingToDeleteGreater" || ID === "ratingToDeleteBlacklistLess" || ID === "ratingToDeleteBlacklistEq" || ID === "ratingToDeleteBlacklistGreater")
{
let result = 0;
if ($("#ratingToDelete").val() == 1 && comparestr === "less than ")
@@ -197,36 +166,36 @@ $(document).ready(function(){
else
result = confirm("Are you sure you want to delete duplicate tag scenes " + blackliststr + "having rating " + comparestr + $("#ratingToDelete").val() + AddedWarn);
if (result)
RunPluginDupFileManager(this.id, $("#ratingToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#ratingToDelete").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "tagToDelete" || this.id === "tagToDeleteBlacklist")
else if (ID === "tagToDelete" || ID === "tagToDeleteBlacklist")
{
if (confirm("Are you sure you want to delete tag scenes " + blackliststr + "having _DuplicateMarkForDeletion tags, and having tag " + $("#tagToDeleteText").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#tagToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#tagToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "titleToDelete" || this.id === "titleToDeleteBlacklist")
else if (ID === "titleToDelete" || ID === "titleToDeleteBlacklist")
{
if (confirm("Are you sure you want to delete tag scenes " + blackliststr + "having _DuplicateMarkForDeletion tags, and having title containing " + $("#titleToDeleteText").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#titleToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#titleToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "pathStrToDelete" || this.id === "pathStrToDeleteBlacklist")
else if (ID === "pathStrToDelete" || ID === "pathStrToDeleteBlacklist")
{
if (confirm("Are you sure you want to delete tag scenes " + blackliststr + "having _DuplicateMarkForDeletion tags, and having path containing " + $("#pathStrToDeleteText").val() + AddedWarn))
RunPluginDupFileManager(this.id, $("#pathStrToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, $("#pathStrToDeleteText").val(), true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "fileNotExistToDelete" || this.id === "fileNotExistToDeleteBlacklist")
else if (ID === "fileNotExistToDelete" || ID === "fileNotExistToDeleteBlacklist")
{
if (confirm("Are you sure you want to delete tag scenes " + blackliststr + "having _DuplicateMarkForDeletion tags, and that do NOT exist in the file system?"))
RunPluginDupFileManager(this.id, true, true, $("#DupTagOnlyCheck").prop('checked'));
RunPluginDupFileManager(ID, true, true, $("#DupTagOnlyCheck").prop('checked'));
}
else if (this.id === "applyCombo" || this.id === "applyCombo_" || this.id === "applyComboBlacklist" || this.id === "applyComboGraylist" || this.id === "applyComboPinklist")
else if (ID === "applyCombo" || ID === "applyCombo_" || ID === "applyComboBlacklist" || ID === "applyComboGraylist" || ID === "applyComboPinklist")
{
var Blacklist = "";
if (this.id === "applyComboBlacklist")
if (ID === "applyComboBlacklist")
Blacklist = "Blacklist";
else if (this.id === "applyComboGraylist")
else if (ID === "applyComboGraylist")
Blacklist = "Graylist";
else if (this.id === "applyComboPinklist")
else if (ID === "applyComboPinklist")
Blacklist = "Pinklist";
var Param = "{";
if ($("#InPathCheck").prop('checked'))
@@ -267,9 +236,61 @@ $(document).ready(function(){
}
console.log(Param);
if (confirm("Are you sure you want to delete tag scenes " + blackliststr + "having _DuplicateMarkForDeletion tags, and having the selected options" + AddedWarn + "\nSelected options:\n" + Param))
RunPluginDupFileManager(this.id, Param, true);
RunPluginDupFileManager(ID, Param, true);
}
});
}
$(document).ready(function(){
if ($("#IncludePreviewImage").prop('checked')){
$("#ImagePreviewSize").prop('disabled', false);
$("#ImagePreviewPopupSize").prop('disabled', false);
}
else{
$("#ImagePreviewSize").prop('disabled', true);
$("#ImagePreviewPopupSize").prop('disabled', true);
}
if ($("#IncludePreviewVideo").prop('checked')){
$("#streamOverPreview").prop('disabled', false);
$("#VideoPreviewWidth").prop('disabled', false);
$("#VideoPreviewHeight").prop('disabled', false);
}
else{
$("#streamOverPreview").prop('disabled', true);
$("#VideoPreviewWidth").prop('disabled', true);
$("#VideoPreviewHeight").prop('disabled', true);
}
$("button").click(function(){
ProcessClick(this);
});
$("a").click(function(){
ProcessClick(this);
});
$("div").click(function(){
if (this.id.startsWith("btn_mnu"))
return;
ProcessClick(this);
});
$("#IncludePreviewImage").change(function() {
if(this.checked){
$("#ImagePreviewSize").prop('disabled', false);
$("#ImagePreviewPopupSize").prop('disabled', false);
}
else{
$("#ImagePreviewSize").prop('disabled', true);
$("#ImagePreviewPopupSize").prop('disabled', true);
}
});
$("#IncludePreviewVideo").change(function() {
if(this.checked){
$("#streamOverPreview").prop('disabled', false);
$("#VideoPreviewWidth").prop('disabled', false);
$("#VideoPreviewHeight").prop('disabled', false);
}
else{
$("#streamOverPreview").prop('disabled', true);
$("#VideoPreviewWidth").prop('disabled', true);
$("#VideoPreviewHeight").prop('disabled', true);
}
});
});
function DeleteDupInPath(){
alert('Something went wrong!!!');
@@ -277,55 +298,62 @@ function DeleteDupInPath(){
</script>
</head>
<body>
<center><table style="color:darkgreen;background-color:powderblue;">
<tr><th><div><b style="color:red;"><i>DupFileManager</i></b></div>Advance Duplicate File Deletion Menu</th><th>Apply Multiple Options</th></tr>
<center>
<div class="easyui-accordion" data-options="multiple:true" style="width:800px;">
<div title="Menu" data-options="iconCls:'icon-ok'" style="overflow:auto;padding:10px;">
<center>
<table style="color:darkgreen;background-color:powderblue;">
<tr><th><div><b style="color:red;"><i>DupFileManager</i></b></div>Advance Duplicate File Menu</th><th>Apply Multiple Options</th></tr>
<tr>
<td>
<table style="border-collapse: collapse; border: none;">
<tr><th colspan="3" style="font-size: 12px;border: none;">Create report overriding user [Match Duplicate Distance] and [significantTimeDiff] settings</th></tr>
<tr><th colspan="3" style="font-size: 12px;border: none;">Create report overriding user [Match Duplicate Distance] and other user settings</th></tr>
<tr>
<td style="border: none;"><div class="dropdown">
<button type="button" id="create_duplicate_report_task" value="-1" title="Create new report WITHOUT tags using user settings for [Match Duplicate Distance].">Create Duplicate Report <i class="fa fa-caret-down"></i></button>
<div class="dropdown-content">
<div><button type="button" id="create_duplicate_report_task0a" value="0" title="Create report using [Match Duplicate Distance]=0 (Exact Match). NO tagging.">Create Duplicate Report [Exact Match]</button></div>
<div><button type="button" id="create_duplicate_report_task1a" value="1" title="Create report using [Match Duplicate Distance]=1 (High Match). NO tagging.">Create Duplicate Report [High Match]</button></div>
<div><button type="button" id="create_duplicate_report_task2a" value="2" title="Create report using [Match Duplicate Distance]=2 (Medium Match). NO tagging.">Create Duplicate Report [Medium Match]</button></div>
<div><button type="button" id="create_duplicate_report_task3a" value="3" title="Create report using [Match Duplicate Distance]=3 (Low Match). NO tagging.">Create Duplicate Report [Low Match]</button></div>
<div style="height:2px;width:220px;border-width:0;color:gray;background-color:gray;">_</div>
<div><button type="button" id="tag_duplicates_task" value="-1" title="Create new report which tags duplicates with tag name _DuplicateMarkForDeletion using user settings for [Match Duplicate Distance].">Create Duplicate Report with Tagging (With Default Match Setting)</button></div>
<div><button type="button" id="tag_duplicates_task0a" value="0" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_0 and using [Match Duplicate Distance]=0 (Exact Match).">Create Duplicate Tagging Report [Exact Match]</button></div>
<div><button type="button" id="tag_duplicates_task1a" value="1" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_1 and using [Match Duplicate Distance]=1 (High Match).">Create Duplicate Tagging Report [High Match]</button></div>
<div><button type="button" id="tag_duplicates_task2a" value="2" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_2 and using [Match Duplicate Distance]=2 (Medium Match).">Create Duplicate Tagging Report [Medium Match]</button></div>
<div><button type="button" id="tag_duplicates_task3a" value="3" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_3 and using [Match Duplicate Distance]=3 (Low Match).">Create Duplicate Tagging Report [Low Match]</button></div>
<td style="border: none;padding: 0 15px;">
<div class="easyui-panel" style="width:380px">
<a iconCls="icon-documents" class="easyui-splitbutton easyui-tooltip" menu="#btn_mnu1" id="create_duplicate_report_task" value="-1" title="Create new report WITHOUT tags using user DupFileManager plugin settings. All settings in below [Create Report Options] are ignored.">Create Duplicate Report</a>
<button iconCls="icon-view-eye" type="button" id="viewreport" class="easyui-linkbutton easyui-tooltip" title="View duplicate file report.">View Dup Report</button>
<a iconCls="icon-menu-3-lines" type="button" id="viewreport" class="easyui-menubutton" menu="#btn_mnu3"></a>
</div>
<div id="btn_mnu1">
<div iconCls="icon-document-number-0" id="create_duplicate_report_task0a" value="0" title="Create report using [Match Duplicate Distance]=0 (Exact Match). NO tagging.">Create Duplicate Report [Exact Match]</div>
<div iconCls="icon-document-number-1" id="create_duplicate_report_task1a" value="1" title="Create report using [Match Duplicate Distance]=1 (High Match). NO tagging.">Create Duplicate Report [High Match]</div>
<div iconCls="icon-document-number-2" id="create_duplicate_report_task2a" value="2" title="Create report using [Match Duplicate Distance]=2 (Medium Match). NO tagging.">Create Duplicate Report [Medium Match]</div>
<div iconCls="icon-document-number-3" id="create_duplicate_report_task3a" value="3" title="Create report using [Match Duplicate Distance]=3 (Low Match). NO tagging.">Create Duplicate Report [Low Match]</div>
<div class="menu-sep"></div>
<div iconCls="icon-tag-0" id="tag_duplicates_task0a" value="0" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_0 and using [Match Duplicate Distance]=0 (Exact Match).">Create Duplicate Tagging Report [Exact Match]</div>
<div iconCls="icon-tag-1" id="tag_duplicates_task1a" value="1" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_1 and using [Match Duplicate Distance]=1 (High Match).">Create Duplicate Tagging Report [High Match]</div>
<div iconCls="icon-tag-2" id="tag_duplicates_task2a" value="2" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_2 and using [Match Duplicate Distance]=2 (Medium Match).">Create Duplicate Tagging Report [Medium Match]</div>
<div iconCls="icon-tag-3" id="tag_duplicates_task3a" value="3" class="easyui-tooltip" title="Create report which tags duplicates with tag name _DuplicateMarkForDeletion_3 and using [Match Duplicate Distance]=3 (Low Match).">Create Duplicate Tagging Report [Low Match]</div>
</div>
<div id="btn_mnu3">
<div iconCls="icon-more"><a href="https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins" target="_blank" rel="noopener noreferrer">Axter-Stash Plugins</a></div>
<div class="menu-sep"></div>
<div iconCls="icon-menu1" id="viewStashPlugin" title="View Stash plugins menu.">Stash Plugins</div>
<div iconCls="icon-menu-blue" id="viewStashTools" title="View Stash tools menu.">Stash Tools</div>
</div>
</div></td>
<td style="border: none;padding: 0 15px;">
<label for="significantTimeDiff" title="Significant time difference setting, where 1 equals 100% and (.9) equals 90%.">Time Difference%:</label>
<input type="number" min="0.25" max="1.00" step="0.01" id="significantTimeDiff" name="significantTimeDiff" title="Significant time difference setting, where 1 equals 100% and (.9) equals 90%." value="0.90">
</td>
<td style="border: none;padding: 0 15px;">
<button type="button" id="viewreport" title="View duplicate file report.">View Dup Report</button>
</td>
</tr>
</table>
</td>
<td>
<div class="dropdown">
<center>Multi-Options: <button id="applyCombo" title="Apply selected multiple options to delete scenes.">Delete <i class="fa fa-caret-down"></i></button></center>
<div class="dropdown-content">
<div><button type="button" id="applyCombo_" title="Apply selected multiple options to delete scenes.">Delete All Candidates</button></div>
<div><button type="button" id="applyComboBlacklist" title="Apply selected multiple options to delete scenes in blacklist.">Delete-Blacklist</button></div>
<div><button type="button" id="applyComboGraylist" title="Apply selected multiple options to delete scenes in graylist.">Delete-Graylist</button></div>
<div><button type="button" id="applyComboPinklist" title="Apply selected multiple options to delete scenes in pinklist.">Delete-Pinklist</button></div>
</div>
<div style="height:28px;">
<a iconCls="icon-cancel" class="easyui-splitbutton easyui-button easyui-tooltip" menu="#btn_mnu2" id="applyCombo" value="" title="Apply selected multiple options to delete scenes.">Delete</a>
</div>
<div id="btn_mnu2">
<div iconCls="icon-no" id="applyCombo_" title="Apply selected multiple options to delete scenes.">Delete All Candidates</div>
<div class="menu-sep"></div>
<div iconCls="icon-black-x" id="applyComboBlacklist" title="Apply selected multiple options to delete scenes in blacklist.">Delete-Blacklist</div>
<div iconCls="icon-gray-x" id="applyComboGraylist" title="Apply selected multiple options to delete scenes in graylist.">Delete-Graylist</div>
<div iconCls="icon-pink-x" id="applyComboPinklist" class="easyui-tooltip" title="Apply selected multiple options to delete scenes in pinklist.">Delete-Pinklist</div>
</div>
</td>
</tr>
<tr>
<td><label title="When enabled, operations only apply to scenes which have the special tag _DuplicateMarkForDeletion_?" for="DupTagOnlyCheck">Apply action only to scenes with <b>_DuplicateMarkForDeletion_?</b> tag:</label><input title="When enabled, operations only apply to scenes which have the special tag _DuplicateMarkForDeletion_?" type="checkbox" id="DupTagOnlyCheck" name="DupTagOnlyCheck" value="true"></td>
<td><label title="When enabled, operations only apply to scenes which have the special tag _DuplicateMarkForDeletion_?" for="DupTagOnlyCheck">Apply action only to scenes with <b>_DuplicateMarkForDeletion_?</b> tag:</label><input class="easyui-tooltip" title="When enabled, operations only apply to scenes which have the special tag _DuplicateMarkForDeletion_?" type="checkbox" id="DupTagOnlyCheck" name="DupTagOnlyCheck" value="true"></td>
<td>
<label for="tagOrFlagCombobox">TagOrFlag:</label>
<select id="tagOrFlagCombobox" name="tagOrFlagCombobox">
<label for="tagOrFlagCombobox" class="easyui-tooltip" title="Select if a [Multi-Options] operation only apply to scenes which have the specified flag or the special [_DuplicateMarkForDeletion_] tag.">TagOrFlag:</label>
<select id="tagOrFlagCombobox" name="tagOrFlagCombobox" class="easyui-tooltip" title="Select if a [Multi-Options] operation only apply to scenes which have the specified flag or the special [_DuplicateMarkForDeletion_] tag.">
<option value="" selected="selected"></option>
<option value="TagOnlyScenes" title="When selected, Multi-Options operations only apply to scenes which have the special tag _DuplicateMarkForDeletion_?">Dup Tag</option>
<option value="YellowFlag" style="background-color:Yellow;" title="When selected, Multi-Options operations only apply to scenes with [Yellow] fag.">Yellow Flag</option>
@@ -347,7 +375,7 @@ function DeleteDupInPath(){
<button type="button" id="pathToDeleteBlacklist" title="Delete blacklist tagged duplicates having file path">Del Blacklist Dup in Path</button>
</form>
</td>
<td><label for="InPathCheck">In-Path:</label><input type="checkbox" id="InPathCheck" name="InPathCheck" value="true"></td>
<td><label for="InPathCheck">In-Path:</label><input type="checkbox" class="easyui-tooltip" title="Select to require file to be in folder specified in path field." id="InPathCheck" name="InPathCheck" value="true"></td>
</tr>
<tr>
<td><form id="sizeToDeleteForm" action="javascript:DeleteDupInPath();" target="_self">
@@ -442,32 +470,32 @@ function DeleteDupInPath(){
</tr>
<tr>
<td><form id="titleToDeleteForm" action="javascript:DeleteDupInPath();" target="_self">
<label for="titleToDelete" title="Scene having value in title.">Title:</label>
<input type="text" id="titleToDeleteText" name="titleToDelete" title="String to search for in title." placeholder="mature" value="">
<label for="titleToDelete" class="easyui-tooltip" title="Scene having value in title.">Title:</label>
<input type="text" id="titleToDeleteText" name="titleToDelete" class="easyui-tooltip" title="String to search for in title." placeholder="mature" value="">
<label for="titleToDelete">All:</label>
<button type="button" id="titleToDelete" title="Delete tagged duplicates with title name including value">Contains</button>
<label for="titleToDeleteBlacklist">Blacklist:</label>
<button type="button" id="titleToDeleteBlacklist" title="Delete blacklist tagged duplicates with title name including value">Contains</button>
</form>
</td>
<td><label for="containTitleCheck">Contains Title:</label><input type="checkbox" id="containTitleCheck" name="containTitleCheck" value="true"></td>
<td><label for="containTitleCheck">Contains Title:</label><input type="checkbox" class="easyui-tooltip" title="Select to include content of title field in the multiple option requirement." id="containTitleCheck" name="containTitleCheck" value="true"></td>
</tr>
<tr>
<td><form id="pathStrToDeleteForm" action="javascript:DeleteDupInPath();" target="_self">
<label for="pathStrToDelete" pathStr="Scene having value in path.">Path String:</label>
<input type="text" id="pathStrToDeleteText" name="pathStrToDelete" pathStr="String to search for in path." placeholder="blond" value="">
<label for="pathStrToDelete" title="Scene having value in file path.">Path String:</label>
<input type="text" id="pathStrToDeleteText" name="pathStrToDelete" class="easyui-tooltip" title="String to search for in file path." placeholder="blond" value="">
<label for="pathStrToDelete">All:</label>
<button type="button" id="pathStrToDelete" pathStr="Delete tagged duplicates with path having value">Contains</button>
<button type="button" id="pathStrToDelete" title="Delete tagged duplicates with path having value">Contains</button>
<label for="pathStrToDeleteBlacklist">Blacklist:</label>
<button type="button" id="pathStrToDeleteBlacklist" pathStr="Delete blacklist tagged duplicates with path having value">Contains</button>
<button type="button" id="pathStrToDeleteBlacklist" title="Delete blacklist tagged duplicates with path having value">Contains</button>
</form>
</td>
<td><label for="containStrInPathCheck">Text in Path:</label><input type="checkbox" id="containStrInPathCheck" name="containStrInPathCheck" value="true"></td>
<td><label for="containStrInPathCheck">Text in Path:</label><input type="checkbox" class="easyui-tooltip" title="Select to include string in path field as part of the multiple option requirement." id="containStrInPathCheck" name="containStrInPathCheck" value="true"></td>
</tr>
<tr>
<td><form id="ratingToDeleteForm" action="javascript:DeleteDupInPath();" target="_self">
<label for="ratingToDelete" title="Scene rating.">Rating:</label>
<input type="number" min="1" max="5" id="ratingToDelete" name="ratingToDelete" title="Scene rating (1, 2, 3, 4, or 5)" value="1">
<input type="number" min="1" max="5" id="ratingToDelete" name="ratingToDelete" class="easyui-tooltip" title="Scene rating (1, 2, 3, 4, or 5)" value="1">
<label for="ratingToDeleteLess">All:</label>
<button type="button" id="ratingToDeleteLess" title="Delete tagged duplicates with file rating less than"><</button>
<button type="button" id="ratingToDeleteEq" title="Delete tagged duplicates with rating equal to">=</button>
@@ -494,7 +522,7 @@ function DeleteDupInPath(){
<label for="fileNotExistToDeleteBlacklist">Blacklist:</label>
<button type="button" id="fileNotExistToDeleteBlacklist" title="Delete blacklist tagged duplicates for which file does NOT exist.">Delete Files That do Not Exist</button>
</td>
<td><label for="fileNotExistCheck">File Not Exist:</label><input type="checkbox" id="fileNotExistCheck" name="fileNotExistCheck" value="true"></td>
<td><label for="fileNotExistCheck">File Not Exist:</label><input type="checkbox" class="easyui-tooltip" title="Select to require deletion candidates to have file missing." id="fileNotExistCheck" name="fileNotExistCheck" value="true"></td>
</tr>
<tr>
<td><form id="resolutionToDeleteForm" action="javascript:DeleteDupInPath();" target="_self">
@@ -1925,33 +1953,109 @@ function DeleteDupInPath(){
</select>
</td>
</tr>
</table>
</div>
<div title="Create Report Options" data-options="iconCls:'icon-menu2'" style="overflow:auto;padding:10px;">
<center>
<table style="color:darkgreen;background-color:powderblue;">
<tr><th colspan="3">
These options override the UI plugin user settings and the DupFileManager_config.py settings.
<div style="font-size: 10px;">These options apply to <b>[Create Duplicate Report]</b> <b style="color:red;background-color:yellow">sub-menu</b> options, that have specific <b style="color:red;background-color:yellow">match</b> value.</div>
</th></tr>
<tr>
<td>
<div class="easyui-tooltip" title="Significant time difference setting, where 1 equals 100% and (.9) equals 90%. Default value is 0.90.">
<label for="significantTimeDiff">Time Difference%:</label><input type="number" min="0.25" max="1.00" step="0.01" id="significantTimeDiff" name="significantTimeDiff" value="0.90">
</div>
</td>
<td>
<div class="easyui-tooltip" title="Number of scenes per page in report. Default value is 100."><label for="scenesPerPage">Scenes Per Page:</label><input type="number" min="25" max="5000" step="25" id="scenesPerPage" name="scenesPerPage" value="100"></div>
</td>
<td>
<div class="easyui-tooltip" title="The minimum time difference in seconds for report to highlight scene time. This is the time difference between [Duplicate-to-Delete] scene and [Scene-ToKeep]. Default value is 3."><label for="TimeDiffHighlight">Time Diff Highlight:</label><input type="number" min="1" max="300" step="1" id="TimeDiffHighlight" name="TimeDiffHighlight" value="3"></div>
</td>
</tr>
<tr>
<td>
<div class="easyui-tooltip" title="Create report with preview image."><label for="IncludePreviewImage">Include Preview Image:</label><input type="checkbox" id="IncludePreviewImage" name="IncludePreviewImage" value="true"></div>
</td>
<td>
<div class="easyui-tooltip" title="This value is the size of preview image. Default value is 140."><label for="ImagePreviewSize">Preview Image Size:</label><input type="number" min="50" max="600" step="10" id="ImagePreviewSize" name="ImagePreviewSize" value="140"></div>
</td>
<td>
<div class="easyui-tooltip" title="This value is the size of the popup window when mouse hovers over the image. Default value is 600."><label for="ImagePreviewPopupSize">Image Popup Size:</label><input type="number" min="200" max="3000" step="100" id="ImagePreviewPopupSize" name="ImagePreviewPopupSize" value="600"></div>
</td>
</tr>
<tr><td colspan="3">
<div class="easyui-tooltip" title="Maximum quantity of duplicates to process. This option is normally used ONLY for testing purposes. Set to zero to disable maximum. Default value is 0."><label for="maxDupToProcess">Maximum Duplicates to Process:</label><input type="number" min="0" max="100000" step="10" id="maxDupToProcess" name="maxDupToProcess" value="0"></div>
</td></tr>
<tr><td colspan="3">
<div><b>Note:</b> Color entries can be a color name, or it can be a hexadecimal value in the form: <b style="color:red;">#rrggbb</b></div>
</td></tr>
<tr>
<td>
<div class="easyui-tooltip" title="The main background color for the report. Default color is #f0f5f5, which is a light gray color in most monitors."><label for="ReportBackgroundColor">Report Background Color:</label><input type="text" id="ReportBackgroundColor" name="ReportBackgroundColor" value="#f0f5f5"></div>
</td>
<td colspan="2">
<div class="easyui-tooltip" title="The main text color for the report. Default color is black."><label for="ReportTextColor">Report Text Color:</label><input type="text" id="ReportTextColor" name="ReportTextColor" value="black"></div>
</td>
</tr>
<tr>
<td>
<div class="easyui-tooltip" title="Major highlight color for details with higher resolution or duration on the left side. In other words, when [Duplicate-to-Delete] may have a better video than [Duplicate-to-Keep]. Default color is yellow."><label for="SupperHighlight">Main Highlight Color:</label><input type="text" id="SupperHighlight" name="SupperHighlight" value="yellow"></div>
</td>
<td colspan="2">
<div class="easyui-tooltip" title="Text color for details with different resolution, duration, size, bitrate,codec, or framerate. Default color is violet."><label for="DetailDiffTextColor">Text Color for Data Differences:</label><input type="text" id="DetailDiffTextColor" name="DetailDiffTextColor" value="violet"></div>
</td>
</tr>
<tr>
<td colspan="3">
<div class="easyui-tooltip" title="Lower highlight for details with slightly higher duration. Default color is nyanza, which is a very pale yellowish-green color."><label for="LowerHighlight">Minor Highlight Color:</label><input type="text" id="LowerHighlight" name="LowerHighlight" value="nyanza"></div>
</td>
</tr>
<tr>
<td rowspan="2">
<div class="easyui-tooltip" title="Create report with preview video."><label for="IncludePreviewVideo">Include Preview Video:</label><input type="checkbox" id="IncludePreviewVideo" name="IncludePreviewVideo" value="true" checked></div>
</td>
<td colspan="2">
<div class="easyui-tooltip" title="Create report with full video available in the preview section instead of a partial video. This option works in Chrome, but does not work so well in firefox."><label for="streamOverPreview">For preview, display full stream video instead of partial preview video:</label><input type="checkbox" id="streamOverPreview" name="streamOverPreview" value="true"></div>
</td>
</tr>
<tr>
<td><div class="easyui-tooltip" title="The size of preview video width. Default value is 160."><label for="VideoPreviewWidth">Preview Video Width:</label><input type="number" min="50" max="600" step="10" id="VideoPreviewWidth" name="VideoPreviewWidth" value="160"></div></td>
<td><div class="easyui-tooltip" title="The size of preview video height. Default value is 120."><label for="VideoPreviewHeight">Preview Video Height:</label><input type="number" min="50" max="600" step="10" id="VideoPreviewHeight" name="VideoPreviewHeight" value="120"></div></td>
</tr>
</table>
</center>
</div>
<div title="Help" data-options="iconCls:'icon-help', selected:'false'" style="padding:10px;">
<table style="color:darkgreen;background-color:powderblue;">
<tr><td style="font-size: 12px;" colspan="2">
<b>Details:</b>
<ol type="I" style="padding-left: 16px;">
<li>Match Duplicate Distance Number Details</li>
<ol type="1" start="0" style="padding-left: 16px;">
<li><b style="color:red;">Exact Match</b></li>
<ol type="a" style="padding-left: 16px;">
<ol type="A" style="padding-left: 16px;">
<li>Safest and most reliable option</li>
<li>Uses tag name _DuplicateMarkForDeletion<b>_0</b></li>
<li>Has the fewest results, and it's very rare to have false matches.</li>
</ol>
<li><b style="color:red;">High Match</b></li>
<ol type="a" style="padding-left: 16px;">
<ol type="A" style="padding-left: 16px;">
<li>Recommended Setting</li>
<li>Safe and usually reliable</li>
<li>Uses tag name _DuplicateMarkForDeletion<b>_1</b></li>
<li>Scenes tagged by Exact Match will have both tags (_DuplicateMarkForDeletion_0 and _DuplicateMarkForDeletion_1)</li>
</ol>
<li><b style="color:red;">Medium Match</b></li>
<ol type="a" style="padding-left: 16px;">
<ol type="A" style="padding-left: 16px;">
<li>Not so safe. Some false matches</li>
<li>To reduce false matches use a time difference of .96 or higher.</li>
<li>Uses tag name _DuplicateMarkForDeletion<b>_2</b></li>
<li>Scenes tagged by 0 and 1 will have three tags.</li>
</ol>
<li><b style="color:red;">Low Match</b></li>
<ol type="a" style="padding-left: 16px;">
<ol type="A" style="padding-left: 16px;">
<li>Unsafe, and many false matches</li>
<li>To reduce false matches use a time difference of .98 or higher.</li>
<li>Uses tag name _DuplicateMarkForDeletion<b>_3</b></li>
@@ -1963,7 +2067,7 @@ function DeleteDupInPath(){
<ol type="1" style="padding-left: 16px;">
<li>Significant time difference setting, where 1 equals 100% and (.9) equals 90%.</li>
<li>This setting overrides the setting in DupFileManager_config.py.</li>
<ol type="a" style="padding-left: 16px;">
<ol type="A" style="padding-left: 16px;">
<li>See setting <b style="color:red;">significantTimeDiff</b> in DupFileManager_config.py</li>
</ol>
<li>This setting is generally not useful for <b style="color:red;">[Exact Match]</b> reports.</li>
@@ -1981,12 +2085,79 @@ function DeleteDupInPath(){
<li>The report is created much faster. It usually takes a few seconds to complete.</li>
<li>This is the recommended report type to create if the <b>DupFileManager Advance Menu</b> is not needed or desired.</li>
</ol>
<li><b style="color:red;">Tag V.S. Flag</b></li>
<ol type="1" style="padding-left: 16px;">
<li>A tag is part Stash scene attributes. Tags are stored in the Stash database.</li>
<ol type="A" style="padding-left: 16px;">
<li>When a new DupFileManager report is created, it does <b>NOT</b> delete existing tags.</li>
</ol>
<li>A flag is only used in the reports created by DupFileManager.</li>
<ol type="A" style="padding-left: 16px;">
<li>If a new report is created, <b>ALL</b> the flags are deleted!</li>
<li>Flag Purpose</li>
<ol type="a" style="padding-left: 16px;">
<li>Allow the user to review the DupFileManager report, and flag files for futher action or flag them as review complete.</li>
</ol>
<li>The DupFileManager report, has options that allows the user to perform the same action on all files with a selected color flag.</li>
<li>The following flag group options are available.</li>
<ol type="a" style="padding-left: 16px;">
<li>Delete all files with specified flag color.</li>
<li>Copy all scene files to assosciated Duplicate-to-Keep file where Duplicate-to-Delete is flaged with specified flag color.</li>
<li>Move all scene files to assosciated Duplicate-to-Keep file where Duplicate-to-Delete is flaged with specified flag color.</li>
<ol type="i" style="padding-left: 16px;">
<li>A move operation also copies the metadata like tags, performers, and galleries.</li>
<li>Note: Future versions of this program might also delete the Duplicate-to-Delete scene after successfully coping the file.</li>
</ol>
<li>Copy tags, performers, and galleries from Duplicate-to-Delete to associated Duplicate-to-Keep.</li>
<li>Add exclude tag to all files with specified flag color.</li>
</ol>
</ol>
</ol>
<li>List</b></li>
<ol type="1" style="padding-left: 16px;">
<li>DupFileManager supports 4 types of list that are configured in Stash=>Settings->Plugins->DupFileManager.</li>
<ol type="A" style="padding-left: 16px;">
<li>Whitelist</li>
<ol type="a" style="padding-left: 16px;">
<li>A list of protected paths.</li>
<li>Videos under these paths are NOT to be deleted.</li>
<li>E.g. <b>C:\Favorite\,E:\MustKeep\</b></li>
</ol>
<li>Graylist</li>
<ol type="a" style="padding-left: 16px;">
<li>A list of preferential paths.</li>
<li>Videos under these paths are only designated for deletion if:</li>
<ol type="i" style="padding-left: 16px;">
<li>Counter duplicate is in the whitelist.</li>
<li>If the video quality is poor compare to blacklist duplicate.</li>
</ol>
<li>E.g. <b>C:\2nd_Fav\,E:\ShouldKeep\</b></li>
</ol>
<li>Blacklist</li>
<ol type="a" style="padding-left: 16px;">
<li>A list of least preferential paths.</li>
<li>Videos under these paths are primary candidates for deletion.</li>
<li>E.g. <b>C:\Downloads\,E:\DeleteMeFirst\</b></li>
</ol>
<li>Pinklist</li>
<ol type="a" style="padding-left: 16px;">
<li>The pinklist is NOT used at all when creating the Duplicate Report.</li>
<li>The pinklist is only used in the Advance Menu.</li>
<ol type="i" style="padding-left: 16px;">
<li>This gives the user additional manual deletion options.</li>
<li>This option is similar to the <b>Path</b> field option.</li>
</ol>
</ol>
</ol>
<li>Whitelist is not available in the <b style="color:red;">Advance Menu</b> because the paths are designated as protected from deletion.</li>
</ol>
</ol>
</td></tr>
</table></center>
</table>
</div>
</center>
<div id="div1"></div>
</center>
</body></html>