hydrus/changelog.html

3851 lines
132 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="A personal booru-style media tagger that can import files and tags from your hard drive and popular websites. Content can be shared with other users via user-run servers.">
<link rel="canonical" href="https://hydrusnetwork.github.io/hydrus/changelog.html">
<link rel="prev" href="support.html">
<link rel="next" href="about_docs.html">
<link rel="icon" href="assets/favicon.svg">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.14">
<title>Changelog - hydrus network</title>
<link rel="stylesheet" href="assets/stylesheets/main.10ba22f1.min.css">
<link rel="stylesheet" href="assets/stylesheets/palette.06af60db.min.css">
<link rel="stylesheet" href="assets/stylesheets/extra.css">
<script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="blue-grey" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#changelog" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="index.html" title="hydrus network" class="md-header__button md-logo" aria-label="hydrus network" data-md-component="logo">
<img src="assets/hydrus-white.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
hydrus network
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Changelog
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue-grey" data-md-color-accent="blue" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6zm0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4zM7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/hydrusnetwork/hydrus" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
hydrusnetwork/hydrus
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="index.html" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="introduction.html" class="md-tabs__link">
Getting Started
</a>
</li>
<li class="md-tabs__item">
<a href="advanced_siblings.html" class="md-tabs__link">
Advanced
</a>
</li>
<li class="md-tabs__item">
<a href="client_api.html" class="md-tabs__link">
API
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="faq.html" class="md-tabs__link">
Misc
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="index.html" title="hydrus network" class="md-nav__button md-logo" aria-label="hydrus network" data-md-component="logo">
<img src="assets/hydrus-white.svg" alt="logo">
</a>
hydrus network
</label>
<div class="md-nav__source">
<a href="https://github.com/hydrusnetwork/hydrus" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
hydrusnetwork/hydrus
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="index.html" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Getting Started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="introduction.html" class="md-nav__link">
<span class="md-ellipsis">
Introduction and Statement of Principles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="gettingStartedOverview.html" class="md-nav__link">
<span class="md-ellipsis">
Overview For Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_installing.html" class="md-nav__link">
<span class="md-ellipsis">
Installing and Updating
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_files.html" class="md-nav__link">
<span class="md-ellipsis">
Files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="filetypes.html" class="md-nav__link">
<span class="md-ellipsis">
Supported Filetypes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_importing.html" class="md-nav__link">
<span class="md-ellipsis">
Importing and Exporting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_tags.html" class="md-nav__link">
<span class="md-ellipsis">
Tags
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_searching.html" class="md-nav__link">
<span class="md-ellipsis">
Searching and Sorting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_more_tags.html" class="md-nav__link">
<span class="md-ellipsis">
More Tags
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_downloading.html" class="md-nav__link">
<span class="md-ellipsis">
Downloading
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_ratings.html" class="md-nav__link">
<span class="md-ellipsis">
Ratings
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_12" >
<label class="md-nav__link" for="__nav_2_12" id="__nav_2_12_label" tabindex="0">
<span class="md-ellipsis">
PTR
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_12">
<span class="md-nav__icon md-icon"></span>
PTR
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="access_keys.html" class="md-nav__link">
<span class="md-ellipsis">
PTR Access Keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="PTR.html" class="md-nav__link">
<span class="md-ellipsis">
PTR Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="petitionPractices.html" class="md-nav__link">
<span class="md-ellipsis">
Petition Practices
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_13" >
<label class="md-nav__link" for="__nav_2_13" id="__nav_2_13_label" tabindex="0">
<span class="md-ellipsis">
Next Steps
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_13">
<span class="md-nav__icon md-icon"></span>
Next Steps
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="adding_new_downloaders.html" class="md-nav__link">
<span class="md-ellipsis">
Adding New Downloaders
</span>
</a>
</li>
<li class="md-nav__item">
<a href="getting_started_subscriptions.html" class="md-nav__link">
<span class="md-ellipsis">
Subscriptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="duplicates.html" class="md-nav__link">
<span class="md-ellipsis">
Filtering Duplicates
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Advanced
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="advanced_siblings.html" class="md-nav__link">
<span class="md-ellipsis">
Tag Siblings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="advanced_parents.html" class="md-nav__link">
<span class="md-ellipsis">
Tag Parents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="advanced_sidecars.html" class="md-nav__link">
<span class="md-ellipsis">
Sidecars
</span>
</a>
</li>
<li class="md-nav__item">
<a href="advanced_multiple_local_file_services.html" class="md-nav__link">
<span class="md-ellipsis">
Multiple Local File Services
</span>
</a>
</li>
<li class="md-nav__item">
<a href="advanced.html" class="md-nav__link">
<span class="md-ellipsis">
General Clever Tricks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="reducing_lag.html" class="md-nav__link">
<span class="md-ellipsis">
Reducing Lag
</span>
</a>
</li>
<li class="md-nav__item">
<a href="database_migration.html" class="md-nav__link">
<span class="md-ellipsis">
Database Migration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="launch_arguments.html" class="md-nav__link">
<span class="md-ellipsis">
Launch Arguments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="ipfs.html" class="md-nav__link">
<span class="md-ellipsis">
IPFS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="local_booru.html" class="md-nav__link">
<span class="md-ellipsis">
Local Booru
</span>
</a>
</li>
<li class="md-nav__item">
<a href="server.html" class="md-nav__link">
<span class="md-ellipsis">
Running Your Own Server
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_12" >
<label class="md-nav__link" for="__nav_3_12" id="__nav_3_12_label" tabindex="0">
<span class="md-ellipsis">
Alternate Installations
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_12">
<span class="md-nav__icon md-icon"></span>
Alternate Installations
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="docker.html" class="md-nav__link">
<span class="md-ellipsis">
Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="wine.html" class="md-nav__link">
<span class="md-ellipsis">
Running In Wine
</span>
</a>
</li>
<li class="md-nav__item">
<a href="running_from_source.html" class="md-nav__link">
<span class="md-ellipsis">
Running From Source
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_13" >
<label class="md-nav__link" for="__nav_3_13" id="__nav_3_13_label" tabindex="0">
<span class="md-ellipsis">
Downloader Creation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_13">
<span class="md-nav__icon md-icon"></span>
Downloader Creation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="downloader_intro.html" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_gugs.html" class="md-nav__link">
<span class="md-ellipsis">
Gallery URL Generators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_url_classes.html" class="md-nav__link">
<span class="md-ellipsis">
URL Classes
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_13_4" >
<label class="md-nav__link" for="__nav_3_13_4" id="__nav_3_13_4_label" tabindex="0">
<span class="md-ellipsis">
Parsers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_13_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_13_4">
<span class="md-nav__icon md-icon"></span>
Parsers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="downloader_parsers.html" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_13_4_2" >
<label class="md-nav__link" for="__nav_3_13_4_2" id="__nav_3_13_4_2_label" tabindex="0">
<span class="md-ellipsis">
Components
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_3_13_4_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_13_4_2">
<span class="md-nav__icon md-icon"></span>
Components
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="downloader_parsers_formulae.html" class="md-nav__link">
<span class="md-ellipsis">
Formulae
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_parsers_content_parsers.html" class="md-nav__link">
<span class="md-ellipsis">
Content Parsers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_parsers_page_parsers.html" class="md-nav__link">
<span class="md-ellipsis">
Page Parsers
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_13_4_3" >
<label class="md-nav__link" for="__nav_3_13_4_3" id="__nav_3_13_4_3_label" tabindex="0">
<span class="md-ellipsis">
Walkthroughs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_3_13_4_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_13_4_3">
<span class="md-nav__icon md-icon"></span>
Walkthroughs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="downloader_parsers_full_example_gallery_page.html" class="md-nav__link">
<span class="md-ellipsis">
Gallery Page Example
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_parsers_full_example_file_page.html" class="md-nav__link">
<span class="md-ellipsis">
File Page Example
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_parsers_full_example_api.html" class="md-nav__link">
<span class="md-ellipsis">
API Example
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="downloader_completion.html" class="md-nav__link">
<span class="md-ellipsis">
Putting It All Together
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_sharing.html" class="md-nav__link">
<span class="md-ellipsis">
Sharing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="downloader_login.html" class="md-nav__link">
<span class="md-ellipsis">
Login Manager
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
API
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="client_api.html" class="md-nav__link">
<span class="md-ellipsis">
Client API
</span>
</a>
</li>
<li class="md-nav__item">
<a href="developer_api.html" class="md-nav__link">
<span class="md-ellipsis">
API documentation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Misc
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Misc
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="faq.html" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="privacy.html" class="md-nav__link">
<span class="md-ellipsis">
Privacy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="contact.html" class="md-nav__link">
<span class="md-ellipsis">
Contact and Links
</span>
</a>
</li>
<li class="md-nav__item">
<a href="support.html" class="md-nav__link">
<span class="md-ellipsis">
Financial Support
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Changelog
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="changelog.html" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Changelog
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#version_566" class="md-nav__link">
<span class="md-ellipsis">
Version 566
</span>
</a>
<nav class="md-nav" aria-label="Version 566">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#incremental_tagging" class="md-nav__link">
<span class="md-ellipsis">
incremental tagging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_code_cleanup" class="md-nav__link">
<span class="md-ellipsis">
boring code cleanup
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_565" class="md-nav__link">
<span class="md-ellipsis">
Version 565
</span>
</a>
<nav class="md-nav" aria-label="Version 565">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#tag_sorting_bonanza" class="md-nav__link">
<span class="md-ellipsis">
tag sorting bonanza
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tag_filter" class="md-nav__link">
<span class="md-ellipsis">
tag filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#concatenated_source_urls" class="md-nav__link">
<span class="md-ellipsis">
concatenated source urls
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#note_sidecars" class="md-nav__link">
<span class="md-ellipsis">
note sidecars
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_1" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_564" class="md-nav__link">
<span class="md-ellipsis">
Version 564
</span>
</a>
<nav class="md-nav" aria-label="Version 564">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#more_macos_work" class="md-nav__link">
<span class="md-ellipsis">
more macOS work
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#new_fuzzy_operator_math_in_system_predicates" class="md-nav__link">
<span class="md-ellipsis">
new fuzzy operator math in system predicates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_2" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_1" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_predicate_overhaul_work" class="md-nav__link">
<span class="md-ellipsis">
boring predicate overhaul work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_563" class="md-nav__link">
<span class="md-ellipsis">
Version 563
</span>
</a>
<nav class="md-nav" aria-label="Version 563">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#macos_improvements" class="md-nav__link">
<span class="md-ellipsis">
macOS improvements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shortcuts" class="md-nav__link">
<span class="md-ellipsis">
shortcuts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#some_ui_qol" class="md-nav__link">
<span class="md-ellipsis">
some UI QoL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_3" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tag_repository" class="md-nav__link">
<span class="md-ellipsis">
tag repository
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build_stuff" class="md-nav__link">
<span class="md-ellipsis">
build stuff
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_562" class="md-nav__link">
<span class="md-ellipsis">
Version 562
</span>
</a>
<nav class="md-nav" aria-label="Version 562">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#misc_4" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fixes" class="md-nav__link">
<span class="md-ellipsis">
fixes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#analyze" class="md-nav__link">
<span class="md-ellipsis">
analyze
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_code_cleanup_1" class="md-nav__link">
<span class="md-ellipsis">
boring code cleanup
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_561" class="md-nav__link">
<span class="md-ellipsis">
Version 561
</span>
</a>
<nav class="md-nav" aria-label="Version 561">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#rearranging_thumbnails" class="md-nav__link">
<span class="md-ellipsis">
rearranging thumbnails
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_5" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#db_update_stuff" class="md-nav__link">
<span class="md-ellipsis">
db update stuff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#some_downloader_stuff" class="md-nav__link">
<span class="md-ellipsis">
some downloader stuff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_560" class="md-nav__link">
<span class="md-ellipsis">
Version 560
</span>
</a>
<nav class="md-nav" aria-label="Version 560">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#editing_times_for_multiple_files" class="md-nav__link">
<span class="md-ellipsis">
editing times for multiple files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_6" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup_1" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup_time_code" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup, time code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup_content_updates" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup, content updates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_2" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_559" class="md-nav__link">
<span class="md-ellipsis">
Version 559
</span>
</a>
<nav class="md-nav" aria-label="Version 559">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#millisecond_timestamps" class="md-nav__link">
<span class="md-ellipsis">
millisecond timestamps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#time_details" class="md-nav__link">
<span class="md-ellipsis">
time details
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what_still_has_second-resolution" class="md-nav__link">
<span class="md-ellipsis">
what still has second-resolution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_3" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_7" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_558" class="md-nav__link">
<span class="md-ellipsis">
Version 558
</span>
</a>
<nav class="md-nav" aria-label="Version 558">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#user_contributions" class="md-nav__link">
<span class="md-ellipsis">
user contributions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_8" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#systemnumber_of_urls" class="md-nav__link">
<span class="md-ellipsis">
system:number of urls
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#more_cbz_rules" class="md-nav__link">
<span class="md-ellipsis">
more cbz rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cleanup_and_boring_stuff" class="md-nav__link">
<span class="md-ellipsis">
cleanup and boring stuff
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_557" class="md-nav__link">
<span class="md-ellipsis">
Version 557
</span>
</a>
<nav class="md-nav" aria-label="Version 557">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#misc_9" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#better_hash_predicate_parsing" class="md-nav__link">
<span class="md-ellipsis">
better hash predicate parsing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#documentation_and_cleanup" class="md-nav__link">
<span class="md-ellipsis">
documentation and cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_4" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="about_docs.html" class="md-nav__link">
<span class="md-ellipsis">
About These Docs
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#version_566" class="md-nav__link">
<span class="md-ellipsis">
Version 566
</span>
</a>
<nav class="md-nav" aria-label="Version 566">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#incremental_tagging" class="md-nav__link">
<span class="md-ellipsis">
incremental tagging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_code_cleanup" class="md-nav__link">
<span class="md-ellipsis">
boring code cleanup
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_565" class="md-nav__link">
<span class="md-ellipsis">
Version 565
</span>
</a>
<nav class="md-nav" aria-label="Version 565">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#tag_sorting_bonanza" class="md-nav__link">
<span class="md-ellipsis">
tag sorting bonanza
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tag_filter" class="md-nav__link">
<span class="md-ellipsis">
tag filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#concatenated_source_urls" class="md-nav__link">
<span class="md-ellipsis">
concatenated source urls
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#note_sidecars" class="md-nav__link">
<span class="md-ellipsis">
note sidecars
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_1" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_564" class="md-nav__link">
<span class="md-ellipsis">
Version 564
</span>
</a>
<nav class="md-nav" aria-label="Version 564">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#more_macos_work" class="md-nav__link">
<span class="md-ellipsis">
more macOS work
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#new_fuzzy_operator_math_in_system_predicates" class="md-nav__link">
<span class="md-ellipsis">
new fuzzy operator math in system predicates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_2" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_1" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_predicate_overhaul_work" class="md-nav__link">
<span class="md-ellipsis">
boring predicate overhaul work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_563" class="md-nav__link">
<span class="md-ellipsis">
Version 563
</span>
</a>
<nav class="md-nav" aria-label="Version 563">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#macos_improvements" class="md-nav__link">
<span class="md-ellipsis">
macOS improvements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shortcuts" class="md-nav__link">
<span class="md-ellipsis">
shortcuts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#some_ui_qol" class="md-nav__link">
<span class="md-ellipsis">
some UI QoL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_3" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tag_repository" class="md-nav__link">
<span class="md-ellipsis">
tag repository
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build_stuff" class="md-nav__link">
<span class="md-ellipsis">
build stuff
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_562" class="md-nav__link">
<span class="md-ellipsis">
Version 562
</span>
</a>
<nav class="md-nav" aria-label="Version 562">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#misc_4" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fixes" class="md-nav__link">
<span class="md-ellipsis">
fixes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#analyze" class="md-nav__link">
<span class="md-ellipsis">
analyze
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_code_cleanup_1" class="md-nav__link">
<span class="md-ellipsis">
boring code cleanup
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_561" class="md-nav__link">
<span class="md-ellipsis">
Version 561
</span>
</a>
<nav class="md-nav" aria-label="Version 561">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#rearranging_thumbnails" class="md-nav__link">
<span class="md-ellipsis">
rearranging thumbnails
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_5" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#db_update_stuff" class="md-nav__link">
<span class="md-ellipsis">
db update stuff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#some_downloader_stuff" class="md-nav__link">
<span class="md-ellipsis">
some downloader stuff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_560" class="md-nav__link">
<span class="md-ellipsis">
Version 560
</span>
</a>
<nav class="md-nav" aria-label="Version 560">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#editing_times_for_multiple_files" class="md-nav__link">
<span class="md-ellipsis">
editing times for multiple files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_6" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup_1" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup_time_code" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup, time code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boring_cleanup_content_updates" class="md-nav__link">
<span class="md-ellipsis">
boring cleanup, content updates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_2" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_559" class="md-nav__link">
<span class="md-ellipsis">
Version 559
</span>
</a>
<nav class="md-nav" aria-label="Version 559">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#millisecond_timestamps" class="md-nav__link">
<span class="md-ellipsis">
millisecond timestamps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#time_details" class="md-nav__link">
<span class="md-ellipsis">
time details
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what_still_has_second-resolution" class="md-nav__link">
<span class="md-ellipsis">
what still has second-resolution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_3" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_7" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_558" class="md-nav__link">
<span class="md-ellipsis">
Version 558
</span>
</a>
<nav class="md-nav" aria-label="Version 558">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#user_contributions" class="md-nav__link">
<span class="md-ellipsis">
user contributions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc_8" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#systemnumber_of_urls" class="md-nav__link">
<span class="md-ellipsis">
system:number of urls
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#more_cbz_rules" class="md-nav__link">
<span class="md-ellipsis">
more cbz rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cleanup_and_boring_stuff" class="md-nav__link">
<span class="md-ellipsis">
cleanup and boring stuff
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#version_557" class="md-nav__link">
<span class="md-ellipsis">
Version 557
</span>
</a>
<nav class="md-nav" aria-label="Version 557">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#misc_9" class="md-nav__link">
<span class="md-ellipsis">
misc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#better_hash_predicate_parsing" class="md-nav__link">
<span class="md-ellipsis">
better hash predicate parsing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#documentation_and_cleanup" class="md-nav__link">
<span class="md-ellipsis">
documentation and cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client_api_4" class="md-nav__link">
<span class="md-ellipsis">
client api
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/hydrusnetwork/hydrus/edit/master/docs/changelog.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4v-2m10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1 2.1 2.1Z"/></svg>
</a>
<h1 id="changelog">changelog<a class="headerlink" href="#changelog" title="Permanent link">&para;</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This is the new changelog, only the most recent builds. For all versions, see the <a href="old_changelog.html">old changelog</a>.</p>
</div>
<h2 id="version_566"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v566">Version 566</a><a class="headerlink" href="#version_566" title="Permanent link">&para;</a></h2>
<h3 id="incremental_tagging">incremental tagging<a class="headerlink" href="#incremental_tagging" title="Permanent link">&para;</a></h3>
<ul>
<li>when you boot a 'manage tags' dialog on multiple files, a new <code>±</code> button now lets you do 'incremental tagging'. this is where you, let's say for twenty files, tag them from page:1-&gt;page:20. this has been a long time in the works, but now we have thumbnail reorganisation tech, it is now sensible to do.</li>
<li>the dialog lets you set a namespace (or none), start point (e.g. you can start tagging at page:19 if you are doing the second chapter etc...), the step (you can count by +2 every file, instead of +1, or even -1 to decrement), the subtag prefix (so you can say 'page:insert-4' or something), and the subtag suffix (for, say, 'page:2 (wip)')</li>
<li>the last namespace is remembered between dialog opens, and if the first file in the selection has a number tag in that namespace, that is the number the 'start' will initialise with. a bit of overlap/prep may save time here!</li>
<li>the prefix and suffix are remembered between dialog opens</li>
<li>a status text gives you a live preview of what you will be adding and says whether any of the files already have exactly those tags or have different tags under the same namespace (which would be possible conflicts, suggesting you are not lined up correct)</li>
</ul>
<h3 id="misc">misc<a class="headerlink" href="#misc" title="Permanent link">&para;</a></h3>
<ul>
<li>added import support for .docx, .xlsx, and .pptx files (the Microsoft Open XML Formats). they get icons, not much else. they are secretly zips, so <strong>on update, you will be asked if you want to scan your existing zips for these formats</strong></li>
<li>when you move a window to another screen in a maximised state (e.g. on Windows you can do this with win+shift+arrow), the system that remembers window coordinates will now register and save this. the 'restore' window size is preserved from whatever it was on the previous screen while the 'restore' position will try to stay the same on the new monitor (e.g. if it was at (200, 400) on the old monitor, it will try to do the same on the new) as long as the window fits, otherwise it is moved to (20,20) on the new screen</li>
<li>the 'edit string converter' panel no longer requires you to enter an example text that can be converted. you can see the error on the dialog, so if you don't want to fix it, or you just need to nip in and out testing things, it is now up to you</li>
<li>if the database takes a long time to update, the 'just woke up from sleep' state should no longer trigger. the system thought the long weird early delay was the computer going to sleep</li>
<li>the system that gives a popup and then a dialog when you have 165+ (and then 500+ or so) pages open is now removed. this was always a wx thing primarily, and Qt is much happier about having a whole load of UI elements. the main problem here is now memory blot and UI-update lag. this is now in the user's hands alone, no more bothering from me (unless it becomes a new problem, and I'll figure out a better warning test/system)</li>
</ul>
<h3 id="boring_code_cleanup">boring code cleanup<a class="headerlink" href="#boring_code_cleanup" title="Permanent link">&para;</a></h3>
<ul>
<li>neatened how some manage tags ui is initialised. there's a hair of a chance this fixes the 'the manage tags dialog taglist is cut off sometimes' bug</li>
<li>neatened how some pending content updates are held in manage tags</li>
<li>manage tags dialogs now receive their media list in the same order as the underlying thumbnail selection, ha ha ha</li>
<li>untangled some of the presentation import options. stuff like 'is new or in inbox' gets slightly better description labels and cleaner actual logic code</li>
<li>fixed some type issues, some typo'd pubsubs, and other misc linting</li>
<li>tried last week's aborted github build update again. the build is now Node 20 compatible</li>
</ul>
<h2 id="version_565"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v565">Version 565</a><a class="headerlink" href="#version_565" title="Permanent link">&para;</a></h2>
<h3 id="tag_sorting_bonanza">tag sorting bonanza<a class="headerlink" href="#tag_sorting_bonanza" title="Permanent link">&para;</a></h3>
<ul>
<li><em>options-&gt;sort/collect</em> now offers four places to customise default tag sort. instead of having one default sort for everything, there's now sort for search pages, media viewers, and the manage tags dialogs launched off of them</li>
</ul>
<h3 id="tag_filter">tag filter<a class="headerlink" href="#tag_filter" title="Permanent link">&para;</a></h3>
<ul>
<li>when you copy namespaces from the tag filter list, it now copies the actual underlying data text like <code>character:</code>, which you can paste in elsewhere, rather than the pretty <code>"character" tags</code> display text</li>
<li>brushed up some of the UI and help text on the tag filter UI</li>
<li>fixed a couple places where the tag copy menus were trying to let you copy an empty string, which ended up with <code>-invalid label-</code></li>
<li>fixed some extremely janked-out logic in the tag filter that was sending <code>(un)namespaced tags</code> to the 'except for these' advanced whitelist in many cases. it was technically ok, but not ideal and overall inhuman</li>
</ul>
<h3 id="concatenated_source_urls">concatenated source urls<a class="headerlink" href="#concatenated_source_urls" title="Permanent link">&para;</a></h3>
<ul>
<li>on rule34.xxx and probably some other places, when the file has multiple source urls, the gelbooru-style parsers were pulling the urls in the format [ A, B, C, 'A B C' ], adding this weird extra string concatenation that is obviously invalid. I fixed the parsers so it won't happen again</li>
<li><strong>on update, you are going to get a couple of yes/no dialogs asking if you want to scan for and delete existing instances of these URLs</strong>. if you have a big client, it will take some time to do this scan. the yes/no dialogs will auto-yes after ten minutes, so if you are doing a headless update via docker or something, please be patient--it will go through</li>
</ul>
<h3 id="note_sidecars">note sidecars<a class="headerlink" href="#note_sidecars" title="Permanent link">&para;</a></h3>
<ul>
<li>the note-&gt;media sidecar exporter module now has a 'forced name' input. if you want to parse a single note from a .txt or .json that doesn't have a name, you can now force it</li>
<li>the sidecard txt separator dropdown in the .txt importer module now has a 'four pipes (||||)' entry in the dropdown as a quick-select beside 'newline'. four pipes is a useful separator of multi-line notes content since it almost certainly won't come up in a normal note</li>
<li>some tooltips and stuff are updated around here to better explain what the hell is going on</li>
<li>added a unit test to test the forced name</li>
</ul>
<h3 id="misc_1">misc<a class="headerlink" href="#misc_1" title="Permanent link">&para;</a></h3>
<ul>
<li>to help the recent shortcuts change that merged <code>numpad</code> variants of + and left arrow and so on into being seen as the <code>unmodified</code> variants, if you have a saved shortcut that <em>is</em> still the <code>numpad</code> variant, it will now match the <code>unmodified</code> input when the merge mode is on. just means you don't have to remap everything with this mode on--everything merged matches everything</li>
<li>added 'copy file known urls' to the 'media' shortcut set</li>
<li>I forgot to mention last week that we figured out more native global menubar tech (where the top menubar of the program will embed into your OS's top system menubar) in last week's release, for non-macOS (some versions of Linux) users. the new checkbox is under <em>gui-&gt;Use Native MenuBar</em>. it defaults to on for macOS and off for everyone else, but feel free to try it. there was a related 'my menubar is now messed up, why?' bug that hit some people in v564 that is fixed today. sorry if you got boshed by this, since it was tricky to manually fix. in future, note you can hit ctrl+p in a default client to bring up the command palette, and then you can type 'options' and can open the options that way, if your menubar isn't working!</li>
<li>fixed the <code>ideal usage</code> calculation in <em>database-&gt;move media files</em> when there are three or more competing storage locations with two or more having a max size that is exceeded by their weight, and one or more having a max size that is only exceeded by their weight a little bit. due to a mistake in how total remaining weight was calculated in the little behind the scenes elimination game here, a location in this situation was exceeding its max size amount by a multiple of <code>1/(1-total_normalised_weight_of_restricted_locations)</code>, typically +10-30%. thank you for the report here, it was interesting to figure out!</li>
<li>I removed a hack that made the repositories (like the PTR) work for users running super old versions of the client. the hack has now been in place for more than a year. if you run into repository syncing problems, please update to after v511!</li>
<li>fixed a dumb status line in the 'check for missing/invalid files' checker thah was double-counting bad files in the popup</li>
<li>fixed some media duration 'second' components being rendered with extraneous .0, like '30.0 seconds'</li>
<li>fixed a db routine that fetches a huge table in pieces to not repeat a few rows when the ids it is fetching are non-contiguous, and to report the correct quantity of work done as a result (it was saying like 17,563/17,562)</li>
<li>the new <em>help-&gt;about</em> Qt platformName addition will now say if the actual platformName differs from the running platformName (e.g. if it was set otherwise with a Qt launch parameter)</li>
</ul>
<h3 id="client_api">client api<a class="headerlink" href="#client_api" title="Permanent link">&para;</a></h3>
<ul>
<li>just a small thing, but the under-documented <code>/manage_database/get_client_options</code> call now says the four types of default tag sort. I left the old key, <code>default_tag_sort</code>, in so as not to break stuff, but it is just a copy of the <code>search_page</code> variant in the new <code>default_tag_sort_xxx</code> foursome</li>
<li>client api version is now 62</li>
</ul>
<h2 id="version_564"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v564">Version 564</a><a class="headerlink" href="#version_564" title="Permanent link">&para;</a></h2>
<h3 id="more_macos_work">more macOS work<a class="headerlink" href="#more_macos_work" title="Permanent link">&para;</a></h3>
<ul>
<li>thanks to a user, we have more macOS features:</li>
<li>macOS users get a new shortcut action, default Space, that uses Quick Look to preview a thumbnail like you can in Finder. <strong>all existing users will get the new shortcut!</strong></li>
<li>the hydrus .app now has the version number in Get Info</li>
<li><strong>macOS users who run from source should rebuild their venvs this week!</strong> if you don't, then trying this new Quick Look feature will just give you an error notification</li>
</ul>
<h3 id="new_fuzzy_operator_math_in_system_predicates">new fuzzy operator math in system predicates<a class="headerlink" href="#new_fuzzy_operator_math_in_system_predicates" title="Permanent link">&para;</a></h3>
<ul>
<li>the system predicates for width, height, num_notes, num_words, num_urls, num_frames, duration, and framerate now support two different kinds of approximate equals, ≈: absolute (±x), and percentage (±x%). previously, the ≈ secretly just did ±15% in all cases (issue #1468)</li>
<li>all <code>system:framerate=x</code> searches are now converted to <code>±5%</code>, which is what they were behind the scenes. <code>!=</code> framerate stuff is no longer supported, so if you happened to use it, it is now converted to <code>&lt;</code> just as a valid fallback</li>
<li><code>system:duration</code> gets the same thing, <code>±5%</code>. it wasn't doing this behind the scenes before, but it should have been!</li>
<li><code>system:duration</code> also now allows hours and minutes input, if you need longer!</li>
<li>for now, the parsing system is not updated to specify the % or absolute ± values. it will remain the same as the old system, with ±15% as the default for a <code>~=</code> input</li>
<li>there's still a little borked logic in these combined types. if you search <code>&lt; 3 URLs</code>, that will return files with 0 URLs, and same for <code>num_notes</code>, but if you search <code>&lt; 200px width</code> or any of the others I changed this week, that won't return a PDF that has no width (although it will return a damaged file that reports 0 width specifically). I am going to think about this, since there isn't an easy one-size-fits-all-solution to marry what is technically correct with what is actually convenient. I'll probably add a checkbox that says whether to include 'Null' values or not and default that True/False depending on the situation; let me know what you think!</li>
</ul>
<h3 id="misc_2">misc<a class="headerlink" href="#misc_2" title="Permanent link">&para;</a></h3>
<ul>
<li>I have taken out Space as the default for archive/delete filter 'keep' and duplicate filter 'this is better, delete other'. Space is now exclusively, by default, media pause/play. <strong>I am going to set this to existing users too, deleting/overwriting what Space does for you, if you are still set to the defaults</strong></li>
<li>integer percentages are now rendered without the trailing <code>.0</code>. <code>15%</code>, not <code>15.0%</code></li>
<li>when you 'open externally', 'open in web browser', or 'open path' from a thumbnail, the preview viewer now pauses rather than clears completely</li>
<li>fixed the edit shortcut panel ALWAYS showing the new (home/end/left/right/to focus) dropdown for thumbnail dropdown, arrgh</li>
<li>I fixed a stupid typo that was breaking file repository file deletes</li>
<li><code>help-&gt;about</code> now shows the Qt platformName</li>
<li>added a note about bad Wayland support to the Linux 'installing' help document</li>
<li>the guy who wrote the <code>Fixing_Hydrus_Random_Crashes_Under_Linux</code> document has updated it with new information, particularly related to running hydrus fast using virtual memory on small, underpowered computers</li>
</ul>
<h3 id="client_api_1">client api<a class="headerlink" href="#client_api_1" title="Permanent link">&para;</a></h3>
<ul>
<li>thanks to a user, the undocumented API call that returns info on importer pages now includes the sha256 file hash in each import object Object</li>
<li>although it is a tiny change, let's nonetheless update the Client API version to 61</li>
</ul>
<h3 id="boring_predicate_overhaul_work">boring predicate overhaul work<a class="headerlink" href="#boring_predicate_overhaul_work" title="Permanent link">&para;</a></h3>
<ul>
<li>updated the <code>NumberTest</code> object to hold specific percentage and absolute ± values</li>
<li>updated the <code>NumberTest</code> object to render itself to any number format, for instance pixels vs kilobytes vs a time delta</li>
<li>updated the <code>Predicate</code> object for system preds width, height, num_notes, num_words, num_urls, num_frames, duration, and framerate to store their operator and value as a <code>NumberTest</code>, and updated predicate string rendering, parsing, editing, database-level predicate handling</li>
<li>wrote new widgets to edit <code>NumberTest</code>s of various sorts and spammed them to these (operator, value) system predicate UI panels. we are finally clearing out some 8+-year-old jank here</li>
<li>rewrote the <code>num_notes</code> database search logic to use <code>NumberTest</code>s</li>
<li>the system preds for height, width, and framerate now say 'has x' and 'no x' when set to <code>&gt;0</code> or <code>=0</code>, although what these really mean is not perfectly defined</li>
</ul>
<h2 id="version_563"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v563">Version 563</a><a class="headerlink" href="#version_563" title="Permanent link">&para;</a></h2>
<h3 id="macos_improvements">macOS improvements<a class="headerlink" href="#macos_improvements" title="Permanent link">&para;</a></h3>
<ul>
<li>Thanks to a user, we have multiple improvements for macOS!</li>
<li>There is a new icon for the macOS .app build of hydrus</li>
<li>The macOS app will now appear as "Hydrus" in the menu bar instead of "Hydrus Network"</li>
<li>
<ul>
<li>Use the native global menu bar on macOS and some Linux desktop environments</li>
</ul>
</li>
<li>
<ul>
<li>"options" will now appear as "Preferences..." and be under the Hydrus menu on macOS</li>
</ul>
</li>
<li>
<ul>
<li>"exit" will now appear as "Quit Hydrus" and be under the Hydrus menu on macOS</li>
</ul>
</li>
<li>"exit and force shutdown maintenance", "restart", and "shortcuts" will now be under the Hydrus menu on macOS</li>
<li>The hydrus system tray icon is now enabled for macOS and "minimise to system tray" will be in the Hydrus menu when in advanced mode</li>
<li>macOS debug dialog menus are now disabled by default</li>
<li>The macOS build of hydrus now uses pyoxidizer 0.24.0 and Python 3.10</li>
<li>The command palette and hyperlinks colors in the default Qt stylesheet now use palette based colors that should change based on the Qt style</li>
<li>one thing hydev did: on macOS, Cmd+W <em>should</em> now close any dialog or non-main-gui window, just like the Escape key</li>
</ul>
<h3 id="shortcuts">shortcuts<a class="headerlink" href="#shortcuts" title="Permanent link">&para;</a></h3>
<ul>
<li>by default, Alt+Home/End/Left/Right now does the new thumbnail rearranging. <strong>assuming they do not conflict with an existing mapping, all users will recieve this on update</strong></li>
<li>by default, the shortcuts system now converts all non-number 'numpad' inputs (e.g. 'numpad Home', 'numpad Return', 'numpad Left') to just be normal inputs. a bunch of different keyboards have whack numpad assignments for non-numpad keys, so if it isn't a number, let's not, by default, make a fuss over the distinction. you can return to the old behaviour by unchecking the new checkbox under <em>file-&gt;shortcuts</em></li>
<li>the default shortcuts now no longer spam numpad variants anywhere. existing users can delete the surplus mappings (under 'thumbnails' and maybe some of the 'media' sets) if they like</li>
</ul>
<h3 id="some_ui_qol">some UI QoL<a class="headerlink" href="#some_ui_qol" title="Permanent link">&para;</a></h3>
<ul>
<li>the <em>tag service</em> menu button that appears in the autocomplete panel and sometimes some other places in advanced mode now shows a proper check mark in its menu beside its current value</li>
<li>the <em>location context</em> menu button on the other side of an autocomplete panel and some other places also now shows a check mark in its menu beside its current value</li>
<li>the <code>OR</code> button on search autocomplete that creates new OR predicates now inherits the current file search domain. it was previously defaulting at all times to the fallback file domain and 'all known tags'</li>
<li>the current search predicates list also now inherits the file search domain when you edit an OR predicate currently in use, same deal</li>
<li>removed the 'favourites' submenu from the taglist menu when no tags are selected</li>
<li>in any import context, the file log's arrow menu now supports deleting all the 'unknown' (outstanding, unstarted) items or setting them all to 'skipped'. the 'abort imports' button (with the stop icon) in HDD and urls import pages is removed</li>
</ul>
<h3 id="misc_3">misc<a class="headerlink" href="#misc_3" title="Permanent link">&para;</a></h3>
<ul>
<li>fixed yet another dumb problem with the datetime control's paste button--although the paste was now 'working' on the UI side, the control wasn't saving that result on dialog ok. the fixes both the datetime button and the modified/file service time multi-column list editing</li>
<li>a core asynchronous thread-checking timer in the program has been rewritten from a 20ms-resolution busy-wait to a &lt;1ms proper wait/notify system. a bunch of stuff that works in a thread is now much faster to recognise that blocking UI work is done, and it is more thread-polite about how it does it!</li>
<li>in the <code>setup_venv</code> scripts, if it needs to delete an old venv directory but fails to do so, the script now dumps out with an error saying 'hey, you probably have it open in a terminal/IDE, please close that and try again'. previously, it would just charge on and produce an odd file permission error as, e.g., the new venv setup tried to overwrite the in-use python exe</li>
<li>added a <code>help-&gt;debug-&gt;gui-&gt;isolate existing mpv widgets</code> command to force regeneration of mpv windows and help test-out/hack-fix various 'every other of my mpv views has no audio' and 'my mpv loses xxx property after a system sleep/wake cycle' problems. if I've been working with you on this stuff, please give it a go and let me know if new mpv window creation is good or what!</li>
<li>added a <code>BUGFIX: Disable off-screen window rescue</code> checkbox to <code>options-&gt;gui</code> that stops windows that think they are spawning off-screen from repositioning to a known safe screen. several Qt versions have had trouble with enumerating all the screens in a multiple monitor setup and thus the safe coordinate space, so if you have been hit by false positives here, you can now turn it off! (issue #1511)</li>
<li>fixed another couple instances of error texts with empty formatting braces <code>{}</code></li>
</ul>
<h3 id="tag_repository">tag repository<a class="headerlink" href="#tag_repository" title="Permanent link">&para;</a></h3>
<ul>
<li>mapping petitions fetched from the server will now max out at 500k mapping rows or 10k unique tags or ten seconds of construction time. we had a 250k-unique-tag petition this last week and it broke something, so I'm slapping a bunch of safety rails on. let me know if these are too strict, too liberal, or if it messes with the fetch workflow at all--I don't <em>think</em> it will, but we'll see</li>
</ul>
<h3 id="build_stuff">build stuff<a class="headerlink" href="#build_stuff" title="Permanent link">&para;</a></h3>
<ul>
<li>now they have had time to breathe, I optimised the recently split Github build scripts. the 'send to an ubuntu runner and then upload' step is now removed from all three, so they are natively uploaded in the first runner step. it works just a little nicer and faster now, although it did require learning how to truncate and export a variable to the Github Environment Variables file in Powershell, aiiieeeee</li>
<li>also, Github is moving from Node 16 to Node 20 soon, and I have moved two of the four actions we rely on to their newer v20 versions. a third action should be ready to update next week, and another, a general download file function, I have replaced with curl (for macOS) and Powershell's magical Invoke-WebRequest adventure</li>
</ul>
<h2 id="version_562"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v562">Version 562</a><a class="headerlink" href="#version_562" title="Permanent link">&para;</a></h2>
<h3 id="misc_4">misc<a class="headerlink" href="#misc_4" title="Permanent link">&para;</a></h3>
<ul>
<li>page tab drag and drops will now not start unless the click has lasted more than 100ms</li>
<li>same for thumbnail drag and drop--it perviously did a 20 pixel deadzone, but time checks detect accidental/spastic clicks better and stops false negatives when you start dragging on certain edges</li>
<li>added a 'BUGFIX: disable page tab drag and drop' setting to <em>options-&gt;gui pages</em>. while adding this, I may have accidentally fixed the issue I wanted to investigate (rare hangs on page DnD)</li>
<li>the manage tags dialog now shows the current count of tags for each page tab, and, if there are outstanding changes, shows an asterisk</li>
<li>the <code>migrate database</code> dialog is renamed <code>move media files</code></li>
</ul>
<h3 id="fixes">fixes<a class="headerlink" href="#fixes" title="Permanent link">&para;</a></h3>
<ul>
<li>fixed the basic copy/paste in the single 'edit datetime' panel, wich was often raising a dumb error. this thing also now exports millisecond data (issue #1520)</li>
<li>I am pretty sure I fixed the column-resizing problem in the very new PySide6 (Qt) 6.6.1, which it seems AUR users were recently updated to in an automatic OS update. all columns were setting to 100px width on initialisation. I think it is now safe to try out 6.6.1. I am still not sure why it was doing this, but some extra safeguards seem to have fixed it and also not broken things for &lt;=6.6.0, so let me know what you run into! if you were affected by this, recall that you can right-click on any multi-column list header and say 'reset widths' to get something sensible back here</li>
<li>when exporting files, the max size is now clipped another 84 characters (64 + 20 more, which usually ends up about 150 characters max for the output filename), in order to give padding for longer sidecar suffixes and also avoid going right to the filesystem limit, which broadly isn't sensible</li>
<li>I think I fixed an issue where the mouse could stay hidden, perhaps, just on Wayland, after closing the media viewer with your keyboard (issue #1518)</li>
<li>fixed inc/dec ratings in the media viewer not updating their tooltips on new media correctly</li>
<li>if you hit 'open this location' on the export files window and the location does not exist, you now get a nice messagebox rather than a semi-silent error</li>
</ul>
<h3 id="analyze">analyze<a class="headerlink" href="#analyze" title="Permanent link">&para;</a></h3>
<ul>
<li>background: some databases that process the PTR superfast or otherwise import a lot of data to a new file domain sometimes encounter massively massively slow tag update actions (typically tag-delete when the tags involved have siblings/parents), so I want to make the critical 'ANALYZE' call more timely</li>
<li>the 'analyze' database maintenance call will be soft-called far more regularly during normal repository processing, not just on first sync</li>
<li>sped up how some pre-analyze calculation is done</li>
<li>the size limit for automatic database analyze maintenance is raised from 100k rows to 10M</li>
<li>I hope to do more work here in future, probably making a review panel like we did for vacuum</li>
<li>if your repository processing sometimes hangs your whole damn client for 10-15 minutes, hit <em>database-&gt;db maintenance-&gt;analyze-&gt;full</em>! this job may take 30-60 minutes to finish</li>
</ul>
<h3 id="boring_code_cleanup_1">boring code cleanup<a class="headerlink" href="#boring_code_cleanup_1" title="Permanent link">&para;</a></h3>
<ul>
<li>finished the HG-&gt;CG.client_controller refactor I started last week. this was a thousand lines changed from one braindead format to another, but it will be a useful step towards untangling the hell-nest import hierarchy</li>
<li>did a scattering of the clientinterface typing, getting a feel for where I want to take this</li>
<li>deleted the old in-client server-test's 'boot' variant; this is no longer used and was always super hacky to maintain</li>
<li>I removed an old basic error raising routine that would sometimes kick in when a hash definition is missing. this routine now always fills in the missing data with garbage and does its best to recover the invalid situation automatically, with decent logging, while still informing the user that things are well busted m8. it isn't the user's job to fix this, and there is no good fix anyway, so no point halting work and giving it to the user to figure out!</li>
</ul>
<h2 id="version_561"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v561">Version 561</a><a class="headerlink" href="#version_561" title="Permanent link">&para;</a></h2>
<h3 id="rearranging_thumbnails">rearranging thumbnails<a class="headerlink" href="#rearranging_thumbnails" title="Permanent link">&para;</a></h3>
<ul>
<li>on the thumbnail menu, there is a new 'move' submenu. you can move the current selection of files to the start or end of the media list, or to one before or after the earliest selected file, or to the file you right-clicked on to create the menu, or to the first file's position if the selection is not contiguous. if the selection is non-contiguous, it will be made so in the move</li>
<li>added these rearrange commands to the shortcuts system, as 'move thumbnails' under the 'thumbnails' set. I wasn't sure whether to add some default shortcuts, like ctrl+numpad 7/&frac34;/6 for home/end/left/right or something--let me know what you think</li>
</ul>
<h3 id="misc_5">misc<a class="headerlink" href="#misc_5" title="Permanent link">&para;</a></h3>
<ul>
<li>thanks to user help, fixed a stupid typo from last week that caused some bad errors (including crashes, in some cases) when doing non-simple duplicate filtering (issue #1514). this is the issue the v560a hotfix was made for</li>
<li>fixed another stupid content update typo that was causing 'already in db' results to not get metadata updates</li>
<li>as a hardcoded shortcut, Ctrl+C or Ctrl+Insert now copies the currently selected tags in any taglist. it'll output the full tag/predicate text, with namespace, no counts</li>
<li>I've shortened some thumbnail/media-viewer menu labels, made the 'delete' line into a submenu, and ensured the top info line is always a short variant, with detailed info bumped off to the submenu off the top line. I hate how these menus are often super-wide and thus a pain to navigate to the submenus, so let me know what situations still make them wide</li>
<li>the file log arrow button menu now has entries for 'delete already in db' and 'delete everything'</li>
<li>the 'add these tags to the favourites list?' yes/no now only fires if you try to add more than five tags ot once</li>
<li>the various dialogs in the client that auto-yes or auto-no now show a live countdown in their title string</li>
<li>the window position saving system is now stricter about what it records. maximised and fullscreen state is only saved if 'remember size' is false, and the last size/position is not saved at all if 'remember size/position' is false (previously, it would save these values but not restore them, but let's try being more precise here)</li>
<li>fixed a 'omg what happened, closing the window now' error in the duplicate filter if you try to 'go back' while it is loading a new set of pairs to show</li>
<li>fixed the 'vacuum db' command to correctly save 'last vacuumed time' for all files vacuumed in a job, not just the last!</li>
<li>whenever a <code>copy2</code> file copy (which includes copying file times and permission bits) fails for permission reasons, hydrus now falls back to a normal <code>copy</code> and logs the failure, including the modified time that failed to copy (which is the bit we actually care about here)</li>
</ul>
<h3 id="db_update_stuff">db update stuff<a class="headerlink" href="#db_update_stuff" title="Permanent link">&para;</a></h3>
<ul>
<li>if there is a known bitrot issue on update, you now get a nicer error message. rather than the actual error, you are now told which version is safe to update to. to christen this system, I've added a check for the recent millisecond timestamp conversion, which caused some issues for users updating older clients. <strong>if your client is v551 or older and you try to update to v561 or later, you will be told to update to v558 first.</strong> sorry for the inconvenience here, and thank you for the reports (issue #1512)</li>
<li>if you try to boot a database more than 50 versions earlier than the code, the client-based version popups now happen in the correct order, with the &gt;50 exception firing before the &gt;15 warning</li>
<li>when an update asks a not-super-important yes/no question, I will now make it auto-yes or auto-no after ten minutes with the recommended value. this will ensure that automatic updaters will still progress (previously, they were hanging forever!)</li>
</ul>
<h3 id="some_downloader_stuff">some downloader stuff<a class="headerlink" href="#some_downloader_stuff" title="Permanent link">&para;</a></h3>
<ul>
<li>thanks to a user, the derpibooru now fetches the post description as a note and the source as an associable URL. I tweaked the submitted stuff a bit, simplifying the parsing and discluding 'No description provided.' notes</li>
<li>thanks to a user, the e621 parser can now grab files from posts where the (spicy, I think) content is normally not shown due to a guest login. the posts still won't show up in guest-login gallery searches, so this won't alter your normal results, but if you run into a post like this in your browser and drag-and-drop it onto the client, it now works</li>
<li>I tried to improve the parsing system's de-newlining. this thing is a long-time hack--I've never liked it and I want to replace it with proper multi-line support--but for now I've made sure the de-newliner strips each line of leading/trailing whitespace and discards empty lines. the mode that <em>doesn't</em> collapse newlines (note parsing, for the most part) now <em>does</em> strip leading/trailing newlines along with other whitespace, meaning you no longer have to try and strip extra <code>&lt;p&gt;</code> and <code>&lt;br&gt;</code> tags and stuff yourself when grabbing notes. also, the formula UI where it says 'Newlines are collapsed before...' now says when it won't be collapsing newlines due to it being a note parser</li>
<li>the String Match processing step now explicitly removes newlines before it runs, meaning it can still catch multi-line notes properly. you can now run a proper regex on a multi-line note</li>
</ul>
<h3 id="boring_cleanup">boring cleanup<a class="headerlink" href="#boring_cleanup" title="Permanent link">&para;</a></h3>
<ul>
<li>optimised some thumbnail handling code, stuff like fetching the current list of sorted selected media</li>
<li>large collections will be a little faster to select and otherwise do operations on</li>
<li>sketched out a new <code>ClientGlobals</code> and client controller interface and started refactoring various HG.client_controller to the new CG. this makes no important running changes, but it cleans the messy HG file and will help future coding and type checking in the IDE as it is fleshed out</li>
<li>added some help text to the edit file maintenance panel and fixed some gonk layout in the 'add new work' panel</li>
<li>fixed some instances of the 'unknown' import status showing as a blank string</li>
<li>fixed an error message in the export folder export job that fired when a file to be exported is missing--it was just giving blank instead of the file hash, and its direction to file maintenance was old and unclear</li>
</ul>
<h2 id="version_560"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v560">Version 560</a><a class="headerlink" href="#version_560" title="Permanent link">&para;</a></h2>
<h3 id="editing_times_for_multiple_files">editing times for multiple files<a class="headerlink" href="#editing_times_for_multiple_files" title="Permanent link">&para;</a></h3>
<ul>
<li>the 'edit times' dialog is now available when you select multiple files. it will show and apply time data for all of those files at once. when the files have different times, the various widgets and panels will show ranges and a count of how many files do and don't have that particular time type</li>
<li>when you open the edit times dialog on more than one file, every time control now has a 'cascade step' section, where you can set a time delta, e.g. 100 milliseconds, and then, on dialog ok, each file in the selection that launched the dialog will be set that much successively later than the previous, obviously in the order they are currently in. this is a way of forcing/normalising file sorts based on time. negative values are allowed!</li>
<li>when the edit times dialog is set to change more than 100 total times, it now verifies with the user that this is correct on dialog ok</li>
<li>when the edit times dialog sets a lot of modified dates to files (i.e. actually writing them to your file system), this now happens in a non-gui thread and now makes a cancellable progress popup after a few seconds</li>
</ul>
<h3 id="misc_6">misc<a class="headerlink" href="#misc_6" title="Permanent link">&para;</a></h3>
<ul>
<li>fixed the 'imported to' timestamp for files migrated to other local file domains, which were one of the ones incorrectly set, as expected, to 54 years ago. in the database update, I also fix all the wrongly saved ones from v559</li>
<li>mr bones and the file history chart are now under the 'database' menu</li>
<li>fixed an issue with the file history chart not maintaining the <code>show_deleted = False</code> state through search refreshes</li>
<li>there's a new checkbox under <code>files and trash</code>, <code>Remove files from view when they are moved to another local file domain</code>. this re-introduces the unintended behaviour that I fixed recently when 'remove when trashed' was set, but now targeted specifically for that situation. if you use multiple local file domans a bunch and want files to disappear when you shoot them to a place you aren't looking at, give it a go and let me know how it works for you</li>
<li>fixed a regression from my 'remove when trashed' fix where deleting collections with this option on would leave crazy ghost thumbnails behind. collections that are completely emptied should now properly remove themselves in all content update situations</li>
<li>the gallery downloader page 'cog' icon now has a 'do not allow new duplicates' option, which will discard any (query_text,source) pairs you try to enter if they already exist in the list. this option is remembered through restarts</li>
<li>added 'sort by pixel hash' to the file sort menu. it isn't super helpful, but it'll show pairs of exact-matching files next to each other amongst a sea of noise. I may expose perceptual hashes in a similar way in future, which would be more useful, but thumbnails don't have their phashes quickly available atm, so maybe only when there are other reasons to add that overhead</li>
<li>fixed the <code>setup_venv.sh</code> and <code>setup_venv.command</code> files' custom qtpy and PySide6 (Qt stuff) version installer! there was a dumb typo, sorry for the trouble</li>
<li>thanks to a user, the derpibooru parser now grabs <code>fanfic</code>, <code>spoiler</code>, and <code>error</code> tags</li>
</ul>
<h3 id="boring_cleanup_1">boring cleanup<a class="headerlink" href="#boring_cleanup_1" title="Permanent link">&para;</a></h3>
<ul>
<li>neatened up how non-thumbnail-generatable files (e.g. rtf) present their default thumbs and refactored the code a little</li>
<li>when a file's thumbnail is unavailable but the filetype is known (e.g. you are looking at records of deleted files that have no blurhash), hydrus should now deliver that file's default thumb instead</li>
<li>unified this thumbnail-defaulting code a little more, fixing fetching for some weirder files and deduplicating some messy areas. the client thumbnail cache should be better about delivering the right unusual thumbnail now and as future filetypes are added</li>
<li>added an 'image.png' to serve as a nicer fallback for various thumbnail-undeliverable but known-image files</li>
<li>fixed rtf files not providing their rtf thumbnail in the Client API</li>
<li>fixed up some ancient local booru thumbnail fetching code</li>
<li>cleaned up some messy dialog launches that were having to navigate single/collected media in an awkward way</li>
<li>removed the TestFunctions unit test stub, which was of diminishing use</li>
</ul>
<h3 id="boring_cleanup_time_code">boring cleanup, time code<a class="headerlink" href="#boring_cleanup_time_code" title="Permanent link">&para;</a></h3>
<ul>
<li>updated the DateTime control and button to handle multiple times at once, and updated the edit timestamps dialog itself similarly throughout (this took a day and a half lol)</li>
<li>rejiggered the DateTime widgets to handle a nice new object to hold the multiple times' range, since it was all getting messy</li>
<li>rejiggered the time content update pipeline from top to bottom to take multiple hashes per content update, so applying the same timestamp to a thousand files should still be pretty quick</li>
<li>fixed up various timestamp_ms-&gt;QtDateTime conversions so they all include local timezone info. also fixed the datetime widget so it returns properly local-timezone'd datetimes. I can no longer easily reproduce a particular time that jumps an hour every time you open it (due to retroactive summer-time fun)</li>
<li>harmonised some older datestring conversions to come out 2023-06-30 instead of 2023/06/30</li>
<li>fixed some time string calculations to handle our new sub-second times better</li>
<li>updated the time delta widget to handle negative numbers</li>
</ul>
<h3 id="boring_cleanup_content_updates">boring cleanup, content updates<a class="headerlink" href="#boring_cleanup_content_updates" title="Permanent link">&para;</a></h3>
<ul>
<li>moved all <code>ContentUpdate</code> gubbins out of the hydrus module scope; it is now client only</li>
<li>made a new <code>ClientContentUpdates.py</code> to collect all content update code and refactored stuff there</li>
<li>wrote a new <code>ContentUpdatePackage</code> to replace the ancient <code>service_keys_to_content_updates</code> structure. various hacky or ad-hoc processing and presentation is now gathered under this new object, and I refactor-spammed it across the program, with too many individual changes to talk about in detail</li>
</ul>
<h3 id="client_api_2">client api<a class="headerlink" href="#client_api_2" title="Permanent link">&para;</a></h3>
<ul>
<li>the new <code>set_time</code> call has some additional safety rails. you can add (or delete) 'web domain' timestamps any time, but you now cannot add or delete any of the others, only edit when they already exist</li>
<li>updated the client api unit tests and help to account for this</li>
<li>the client api is now version 60</li>
</ul>
<h2 id="version_559"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v559">Version 559</a><a class="headerlink" href="#version_559" title="Permanent link">&para;</a></h2>
<h3 id="millisecond_timestamps">millisecond timestamps<a class="headerlink" href="#millisecond_timestamps" title="Permanent link">&para;</a></h3>
<ul>
<li>since the program started, the database and code has generally handled timestamps as an integer (i.e. whole number, no fractions) count of the number of seconds since 1970. this is a very common system, but one drawback is it cannot track any amount of time less than a second. when a very fast import in hydrus imports two files in the same second, they then get the exact same import time and thus when you sort by import time, the two files don't know which should be truly first and they may sort either way. this week I have moved the database to store all file timestamps (archived time, imported time, etc...) with millisecond resolution. you do not have to do anything, and very little actually changes frontend, but your update may take a minute or two</li>
<li>whenever you sort by 'import time' now, we shouldn't get anymore switcheroos</li>
<li>the 'manage times' dialog now has millisecond display and edit widgets to reflect this, but in most places across the client, you'll see the same time labels as before</li>
<li>I changed a <strong>ton</strong> of code this week. all simple changes, but I'm sure a typo has slipped through somewhere. if you see a file with a 'last viewed time' of '54 years ago', let me know!</li>
</ul>
<h3 id="time_details">time details<a class="headerlink" href="#time_details" title="Permanent link">&para;</a></h3>
<ul>
<li>this section is just a big list so I have somewhat of a record of what I did. you can broadly ignore it</li>
<li>updated <code>vacuum_timestamps</code> to <code>timestamp_ms</code> and adjusted read/write and the dialog handling to ms</li>
<li>updated <code>analyse_timestamps</code> to <code>timestamp_ms</code> and adjusted read/write to ms</li>
<li>updated <code>json_dumps_named</code> to <code>timestamp_ms</code> and adjusted read/write and some UI-level gubbins around session loading and saving to ms</li>
<li>updated <code>recent_tags</code> to <code>timestamp_ms</code> and adjusted the whole system to ms</li>
<li>updated <code>file_viewing_stats</code> to <code>last_viewed_timestamp_ms</code> and adjusted read/write to ms</li>
<li>updated <code>file_modified_timestamps</code> to <code>file_modified_timestamp_ms</code> and adjusted read/write to ms, including to and from the disk</li>
<li>updated <code>file_domain_modified_timestamps</code> to <code>file_modified_timestamp_ms</code> and adjusted read/write to ms</li>
<li>updated <code>archive_timestamps</code> to <code>archived_timestamp_ms</code> and adjusted read/write to ms</li>
<li>updated all the current- and deleted-file tables for all file services to use ms (<code>timestamp_ms</code>, <code>timestamp_ms</code>, and <code>original_timestamp_ms</code>) and adjusted <em>all</em> database file storage, search, and update to work in ms</li>
<li>updated the <code>ClientDBFilesTimestamps</code> db module to use ms timestamps throughout</li>
<li>updated the <code>ClientDBFilesViewingStats</code> db module to use ms timestamps throughout</li>
<li>updated the <code>ClientDBFilesStorage</code> db module to use ms timestamps throughout</li>
<li>updated the controller timestamp tracker and all callers to use ms timestamps throughout</li>
<li>renamed <code>TimestampsManager</code> to <code>TimesManager</code> and <code>times_manager</code> across the program</li>
<li>updated the <code>TimesManager</code> and all of its calls and callers in general to work in ms. too much stuff to list here</li>
<li>the <code>TimestampData</code> object is now converted to ms, and since it does other jobs than a raw number, the various calls it is involved in are generally renamed from 'timestamp' to 'time'</li>
<li>the file viewing stats manager now tracks 'last viewed time' as ms, and the update pipeline is also updated</li>
<li>the locations manager now handles all file times in ms, and all the archive/add/delete pipelines are also updated</li>
<li>wrote some MS-based variants of the core time functions for spamming around here, including for both Qt <code>QDateTime</code> and python <code>datetime</code></li>
<li>updated the main datetime edit panel, button, and widget to handle millisecond display and editing</li>
<li>fleshed out a ton of ambiguous variable names to the new strict time/timestamp/timestamp_ms system</li>
<li>wrote a clean transition method between ms&lt;-&gt;s that accounts for various None situations and spammed it everywhere</li>
<li>fixed up some ill-advised timestamp data juggling in the time edit UI</li>
</ul>
<h3 id="what_still_has_second-resolution">what still has second-resolution<a class="headerlink" href="#what_still_has_second-resolution" title="Permanent link">&para;</a></h3>
<ul>
<li>the parsing system (and hence downloaded files' source times)</li>
<li>the sidecar system's time stuff, both import and export</li>
<li>the server and the hydrus network protocol in general</li>
<li>Mr. Bones and the File History chart</li>
<li>almost all the actual UI labels. I'm not going to spam milliseconds at you outside of the time edit UI</li>
<li>almost all the general maintenance timers, sleepers, and grunt-work code across the program</li>
</ul>
<h3 id="client_api_3">client api<a class="headerlink" href="#client_api_3" title="Permanent link">&para;</a></h3>
<ul>
<li>the <code>file_metadata</code> call has a new parameter, <code>include_milliseconds</code>, which turns the integer <code>1704419632</code> timestamps into floats with three sig figs <code>1704419632.154</code>, representing all the changes this week</li>
<li>a new permission, <code>edit file times</code> is added, with value <code>11</code></li>
<li>a new command, <code>/edit_times/set_time</code> now lets you set any of the file times you see in the <em>manage times</em> dialog. you can send it second- or millisecond-based timestamps</li>
<li>the client api help is updated for all this, particularly the new section here https://hydrusnetwork.github.io/hydrus/developer_api.html#edit_times_set_time </li>
<li>added unit tests for this</li>
<li>the client api version is now 59</li>
</ul>
<h3 id="misc_7">misc<a class="headerlink" href="#misc_7" title="Permanent link">&para;</a></h3>
<ul>
<li>the sankaku parsers, GUGs, and custom header/bandwidth rules are removed from the defaults, so new users will not see them. none of this stuff works well/at all any more, especially in recent weeks. for sites that are so difficult to download from, if there isn't a nice solution on the shared downloader repo, https://github.com/CuddleBear92/Hydrus-Presets-and-Scripts, I recommend going with a more robust solution like gallery-dl or just finding the content elsewhere</li>
<li>when there are multiple 'system:known url' predicates in a search, I now ensure the faster types run first, reducing the search domain for the slower, later ones. if you have a 'regex' 'known url' predicate, try tossing in a matching 'domain' one--it should accelerate it hugely, every time</li>
<li>fixed a bug in the autocomplete dropdown where it was not removing no-longer-valid file services from the location button after their deletion from <em>manage services</em> until program restart (which was causing some harmless but unwelcome database errors). it should now remove them instantly, and may even end up on the rare 'nothing' domain</li>
<li>the duplicate filter will no longer mention pixel-perfect pngs being a waste of space against static gifs--this isn't necessarily true</li>
<li>the default height of the 'read' autocomplete result list is now 21 rows, so <code>system:time</code> and <code>system:urls</code> are no longer subtly obscured by default. for existing users, that's under <em>options-&gt;search</em></li>
<li>in the 'running from source' requirements.txts, I bumped the 'new' and 'test' versions for python-mpv to 1.0.4/1.0.5. the newest python-mpv does not need you to rename libmpv-2.dll to mpv-2.dll, which will be one less annoying thing to do in future. I've also been testing this extremely new dll this week and ran into no problems, if you are also a Windows source user and would like to try it too: https://sourceforge.net/projects/mpv-player-windows/files/libmpv/mpv-dev-x86_64-20231231-git-abc2a74.7z . I also tried out Qt 6.6.1, but I just discovered a column-sizing bug I want to sort out before I roll it out to the wider community</li>
<li>updated the sqlite dll that gets bundled into the windows release to 3.44.2. the sqlite3.exe is updated too</li>
</ul>
<h2 id="version_558"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v558">Version 558</a><a class="headerlink" href="#version_558" title="Permanent link">&para;</a></h2>
<h3 id="user_contributions">user contributions<a class="headerlink" href="#user_contributions" title="Permanent link">&para;</a></h3>
<ul>
<li>thanks to a user, we now have rtf support! no word count yet, but it should be doable in future.</li>
<li>thanks to a user, ctrl+p and ctrl+n now move the tag listbox selection up and down, in case the arrow keys aren't what you want. it also works on the tag autocomplete results from the text input</li>
<li>added a link to 'Hydra Vista', https://github.com/konkrotte/hydravista, a macOS booru-like browser that talks to a hydrus client, to the main Client API help</li>
</ul>
<h3 id="misc_8">misc<a class="headerlink" href="#misc_8" title="Permanent link">&para;</a></h3>
<ul>
<li>if you right-click on a selection of multiple tags, you can now hide them or their namespaces en masse</li>
<li>if you right-click on a selection of multiple tags, you can now add or remove them from the favourites list en masse. if you select a mix of tags that are part-in, part-out of the list, you'll get both add and remove menu entries summarising what's going on. also, this command is now wrapped in a yes/no confirmation with full summary of what's being added/removed</li>
<li>the 'favourites' "tag suggestions" section is renamed to 'most used'. this was often confused with the favourites that sit under a tag autocomplete, and these tags aren't really 'favourite' anyway, just most-used, so they are renamed</li>
<li>if you have 'remove files from view when they are sent to the trash' set, then moving a file from one local file domain to another or removing one of multiple local file domains will no longer trigger a 'remove media'! sorry for the trouble, it was dumb logic on my part</li>
<li>fixed the 'known urls' menu's url class section ('open all blahbooru urls' etc...) not appearing when right-clicking a single 'collection' thumbnail</li>
<li>fixed the 'known urls' menu's open/copy specific urls not appearing when right-clicking any collection. it now shows the front 'display media's' urls</li>
<li>if you change the darkmode in <em>options-&gt;colours</em>, the <em>help-&gt;darkmode</em> menu item now updates correctly. just a side note: I hate much of this system and will eventually unify it with the style system</li>
<li>fixed a bunch of 'number of x' tests at the database level when the operator is <code></code></li>
</ul>
<h3 id="systemnumber_of_urls">system:number of urls<a class="headerlink" href="#systemnumber_of_urls" title="Permanent link">&para;</a></h3>
<ul>
<li>added <code>system:number of urls</code>! note this counts raw URLs at the moment--I just don't have fast database filtering of post urls vs file urls or url-classless urls or whatever. it does a raw count.</li>
<li><code>system:known urls</code> is now tucked with this new <code>system:number of urls</code> under a new stub predicate called <code>system:urls</code></li>
<li>a variety of 'system:number of words: has/no words' predicates now parse correctly when typed</li>
<li>wrote some new system predicate parsing tests</li>
</ul>
<h3 id="more_cbz_rules">more cbz rules<a class="headerlink" href="#more_cbz_rules" title="Permanent link">&para;</a></h3>
<ul>
<li>cbzs' non-image files must now have an appropriate extension like .txt, .nfo, or .xml</li>
<li>the test regarding the count of non-image files (typically allowing up to 5 non-image files per directory) is more precise with regards to subdirectories, meaning a cbz with a single subdirectory and three non-image files now counts as a cbz</li>
<li>every cbz must now have at least two image files that contain a number of some sort</li>
</ul>
<h3 id="cleanup_and_boring_stuff">cleanup and boring stuff<a class="headerlink" href="#cleanup_and_boring_stuff" title="Permanent link">&para;</a></h3>
<ul>
<li>I split the github workflow build file into three, so the windows, linux, and macOS builds now all happen and upload in parallel. previously, the upload step was blocked on the slowest of the three, which was typically the macOS build by about ten minutes; now they all upload whenever they are ready. this will also help some future testing situations. the newly split scripts are a little unclean/inefficient, so there is also more work to do here</li>
<li>I think I fixed the non-Windows executable permission bits for the various .sh and .command files in the base directory, which were lacking them, and I removed it from a couple dozen pngs across the docs and static directories, which somehow had them. let me know if I missed anything or messed anything up!</li>
<li>if you click one of the static system predicate buttons that appear in the system pred edit UI, for instance 'system:has duration', this no longer gets promoted to the 'recent' predicates list the next time you open the panel</li>
<li>some sytem predicate edit panels should stretch vertically a bit better</li>
<li>some 'number of tags' queries should be a little faster</li>
<li>the 'tag suggestions' options page has a bit of brushed up UI and some new explanation labels</li>
<li>unified the various thumbnail generation error reporting for all the different filetypes. it should also print the file's hash, too, since most of these error contexts only have a temporary path to talk about at this stage, which isn't useful after the fact</li>
</ul>
<h2 id="version_557"><a href="https://github.com/hydrusnetwork/hydrus/releases/tag/v557">Version 557</a><a class="headerlink" href="#version_557" title="Permanent link">&para;</a></h2>
<h3 id="misc_9">misc<a class="headerlink" href="#misc_9" title="Permanent link">&para;</a></h3>
<ul>
<li>optimised large tag filter edit UI. you can now paste 5,000 items into an empty tag filter blacklist in less than a second, and if you have a big tag filter, removing or adding one thing is now instant (previously, this stuff would lag 4 seconds or more, sometimes multiple minutes!!)</li>
<li>the ugoira 'num frames' counting method now discludes files ending in .js/.json, to catch future bundling of frame timings</li>
<li>the cbz scanning tech should now recognise cbzs with four or fewer pages</li>
<li>a legacy 'is this image all good?' check that happens on PIL-loading is now gone. this improves rendering for a variety of truncated files and clarifies some error messages (previously, this thing was just failing silently)</li>
<li>fixed the delete file pre-flight logic so users on the non-advanced delete dialog can now delete repository updates. previously, they saw the menu entry, but hitting it was a no-op</li>
</ul>
<h3 id="better_hash_predicate_parsing">better hash predicate parsing<a class="headerlink" href="#better_hash_predicate_parsing" title="Permanent link">&para;</a></h3>
<ul>
<li><code>system:hash</code> labels are a little different now. they'll say <code>system:hash (md5) is abcd...</code>, with the algorithm after the "hash". hash is omitted for sha256 (the hydrus default). this eases parsing</li>
<li><code>system:similar to data</code> labels are a little different. they'll say 'distance' instead of 'max hamming', and the number and type of hashes they hold, and if they hold only pixel hashes, the distance is not stated</li>
<li><code>system:hash</code> predicate parsing is now more flexible. you can put the hash type pretty much anywhere now.</li>
<li><code>system:similar to</code> and <code>system:similar to data</code> predicate parsing is now more flexible. more combinations are allowed, and you can not include distance and it'll be fine</li>
<li>these three hash predicates now copy to clipboard with all their hashes explicitly enumerated, making strings that are fully parsable! this is a big step forward in a completely sealed import-export predicate parsing loop; now I have the tech set up to export a different phrase to clipboard than what you see in the label, I just need the examples of where it goes wrong. if there is a system predicate that copies to clipboard in a way that won't parse back, let me know and I'll see if I can fix it.</li>
<li>added more unit tests for this parsing</li>
</ul>
<h3 id="documentation_and_cleanup">documentation and cleanup<a class="headerlink" href="#documentation_and_cleanup" title="Permanent link">&para;</a></h3>
<ul>
<li>wrote a guide on how to install 'Git for Windows' for the 'running from source' help. although most of the settings in its marathon 12-page install wizard can be left as default, the technical questions can be intimidating, so I've written them all out for a nice simple install. also brushed up some of the surrounding help here</li>
<li>added a warning to the regular 'installing and updating' help regarding the danger of test-running extract releases before updating (you can overwrite your database by accident)</li>
<li>thanks to a user, the filetypes help document is updated with Ugoira and CBZ info</li>
<li>all the 'HydrusFiletypeHandling' files are refactored to a new 'files' module. there's a bunch of them these days!</li>
<li>the hydrus.core.images module is moved beneath this 'files' module too</li>
<li>the file log list panel right-click menu now says 'open URLs'/'open files' locations' depending on whether you are looking at a URL import log or local HDD import log</li>
</ul>
<h3 id="client_api_4">client api<a class="headerlink" href="#client_api_4" title="Permanent link">&para;</a></h3>
<ul>
<li>the <code>file_metadata</code> call now returns <code>filetype_forced</code> and, if so, also <code>original_mime</code> to talk about the new forced filetype system</li>
<li>the client api help and unit tests are updated to test this is working ok</li>
<li>fixed a typo that was causing too much work in the updated file info manager call (and was often returning 'null' results for half-cached <code>file_metadata</code> requests with <code>only_return_basic_information=true</code>)</li>
<li>thanks to a user, the <code>/add_urls/get_url_info</code> Client API call now has a cache timeout of ten minutes, and the <code>/add_urls/get_url_files</code> call now has a timeout of 30 seconds if all the files are 'already in db'. this should automatically reduce some overhead for several programs that talk to the Client API a lot about URLs</li>
<li>the client api version is now 58</li>
</ul>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Last update">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1-2.1-2M12.5 7v5.2l4 2.4-1 1L11 13V7h1.5M11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2v1.8Z"/></svg>
</span>
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">March 20, 2024</span>
</span>
</aside>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var tab,labels=set.querySelector(".tabbed-labels");for(tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/hydrusnetwork/hydrus" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</a>
<a href="https://twitter.com/hydrusnetwork" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
</a>
<a href="https://hydrus.tumblr.com/" target="_blank" rel="noopener" title="hydrus.tumblr.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M309.8 480.3c-13.6 14.5-50 31.7-97.4 31.7-120.8 0-147-88.8-147-140.6v-144H17.9c-5.5 0-10-4.5-10-10v-68c0-7.2 4.5-13.6 11.3-16 62-21.8 81.5-76 84.3-117.1.8-11 6.5-16.3 16.1-16.3h70.9c5.5 0 10 4.5 10 10v115.2h83c5.5 0 10 4.4 10 9.9v81.7c0 5.5-4.5 10-10 10h-83.4V360c0 34.2 23.7 53.6 68 35.8 4.8-1.9 9-3.2 12.7-2.2 3.5.9 5.8 3.4 7.4 7.9l22 64.3c1.8 5 3.3 10.6-.4 14.5z"/></svg>
</a>
<a href="mailto:hydrus.admin@gmail.com" target="_blank" rel="noopener" title="" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4l217.6 163.2c11.4 8.5 27 8.5 38.4 0l217.6-163.2c12.1-9.1 19.2-23.3 19.2-38.4 0-26.5-21.5-48-48-48H48zM0 176v208c0 35.3 28.7 64 64 64h384c35.3 0 64-28.7 64-64V176L294.4 339.2a63.9 63.9 0 0 1-76.8 0L0 176z"/></svg>
</a>
<a href="https://discord.gg/wPHPCUZ" target="_blank" rel="noopener" title="discord.gg" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M524.531 69.836a1.5 1.5 0 0 0-.764-.7A485.065 485.065 0 0 0 404.081 32.03a1.816 1.816 0 0 0-1.923.91 337.461 337.461 0 0 0-14.9 30.6 447.848 447.848 0 0 0-134.426 0 309.541 309.541 0 0 0-15.135-30.6 1.89 1.89 0 0 0-1.924-.91 483.689 483.689 0 0 0-119.688 37.107 1.712 1.712 0 0 0-.788.676C39.068 183.651 18.186 294.69 28.43 404.354a2.016 2.016 0 0 0 .765 1.375 487.666 487.666 0 0 0 146.825 74.189 1.9 1.9 0 0 0 2.063-.676A348.2 348.2 0 0 0 208.12 430.4a1.86 1.86 0 0 0-1.019-2.588 321.173 321.173 0 0 1-45.868-21.853 1.885 1.885 0 0 1-.185-3.126 251.047 251.047 0 0 0 9.109-7.137 1.819 1.819 0 0 1 1.9-.256c96.229 43.917 200.41 43.917 295.5 0a1.812 1.812 0 0 1 1.924.233 234.533 234.533 0 0 0 9.132 7.16 1.884 1.884 0 0 1-.162 3.126 301.407 301.407 0 0 1-45.89 21.83 1.875 1.875 0 0 0-1 2.611 391.055 391.055 0 0 0 30.014 48.815 1.864 1.864 0 0 0 2.063.7A486.048 486.048 0 0 0 610.7 405.729a1.882 1.882 0 0 0 .765-1.352c12.264-126.783-20.532-236.912-86.934-334.541ZM222.491 337.58c-28.972 0-52.844-26.587-52.844-59.239s23.409-59.241 52.844-59.241c29.665 0 53.306 26.82 52.843 59.239 0 32.654-23.41 59.241-52.843 59.241Zm195.38 0c-28.971 0-52.843-26.587-52.843-59.239s23.409-59.241 52.843-59.241c29.667 0 53.307 26.82 52.844 59.239 0 32.654-23.177 59.241-52.844 59.241Z"/></svg>
</a>
<a href="https://www.patreon.com/hydrus_dev" target="_blank" rel="noopener" title="www.patreon.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M489.7 153.8c-.1-65.4-51-119-110.7-138.3C304.8-8.5 207-5 136.1 28.4 50.3 68.9 23.3 157.7 22.3 246.2 21.5 319 28.7 510.6 136.9 512c80.3 1 92.3-102.5 129.5-152.3 26.4-35.5 60.5-45.5 102.4-55.9 72-17.8 121.1-74.7 121-150z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": ".", "features": ["navigation.tracking", "navigation.sections", "navigation.tabs", "content.tabs.link", "navigation.top", "search.suggest", "content.code.annotate", "navigation.instant", "content.action.edit"], "search": "assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="assets/javascripts/bundle.bd41221c.min.js"></script>
</body>
</html>