diff --git a/docs/changelog.md b/docs/changelog.md index 52bb9275a..6d9b99640 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -7,6 +7,54 @@ title: Changelog !!! note This is the new changelog, only the most recent builds. For all versions, see the [old changelog](old_changelog.html). +## [Version 581](https://github.com/hydrusnetwork/hydrus/releases/tag/v581) + +### misc + +* thanks to a user, we have a much improved shimmie parser, for both file and gallery urls, that fetches md5 better, improves gallery navigation, stops grabbing bad urls and related tags by accident, and can handle namespaces for those shimmies that use them. for our purposes, this improves r34h and r34@paheal downloaders by default +* thanks to a user, we have a new 'Dark Blue 1.1' styesheet with some improvements. the recommendation is: check the different scrollbar styling to see if you prefer the old version +* timedelta widgets now enforce their minimum time on focus-out rather than value change. if it wants at least 20 minutes, you can now type in '5...' in the minutes column without it going nuts. let me know if you discover a way to out-fox the focus-out detection! +* added a checkbox to file import options to govern whether 'import destinations' and 'archive all imports' apply to 'already in db' files. this turns on/off the logic that I made more reliable last week. default is that they do +* added 'do sleep check' to _options->system_ to try some things out on systems that often false-positive this check +* the 'review current network jobs' multi-column list has a new right-click menu to show a bit more debug info about each job: each of its network contexts, how the bandwidth is on each context, if the domain is ok, if it is waiting on a connection error, if it is waiting on serverside bandwidth, if it obey bandwidth, and if its tokens are ok. if you have been working with me on gallery jobs that just sit on 'starting soon', please check it out and let me know what you see. also, 'review current network jobs' is duplicated to the help->debug menu. I forgot where it was, so let's have it in both places +* on the filename-import tagging panel, the filename and directory checkbox-and-text-edit widgets no longer emit a (sometimes laggy) update signal when typing when the checkbox is unchecked + +### janitor stuff + +* if you are a repository janitor, right-clicking on any tag shows a new 'admin' menu +* if you have 'change options' permission, you will see 'block x'/'re-allow x' to let you quickly see if tags are blocked and then edit the repository tag filter respectively +* if you have 'mappings petition resolution' permission, you can 'purge' the selected tags, which will deleted them from the service entirely. this launches a review window that previews the job and allows adding of more tags using the standard autocomplete interface. when 'fired off', it launches a tag migration job to queue up the full petition/delete upload +* this new 'purge' window is also available from the normal 'administrate services' menu in the main gui +* also under the 'administrate services' is a new 'purge tag filter' command, which applies the existing repository tag filter to its own mappings store, retroactively syncing you to it + +### tag filters and migration + +* I wrote a database routine that quickly converts a hydrus tag filter into the list of tags within a file and tag search context. this tech will have a variety of uses in the genre of 'hey please delete/fetch/check all these tags' +* to start with, it is now plugged into the tag migration system, so when you set up, say, an 'all known files' tag migration that only looks for a namespace or a bunch of single tags, the 'setup' phase is now massively, massively faster (previously, with something like the PTR, this would be scanning through tens of millions of files for minutes; now it just targets the 50k or whatever using existing tag search tech usually within less than a second) +* cleaned (KISSed) and reworked the tag filter logic a bit--it can now, underlyingly, handle 'no namespaced tags, except for creator:anything, but still allowing creator:blah' +* optimised how tag filters do 'apply unnamespaced rules to namespaced tags' (which happens in some blacklists that want to be expansive) +* improved how the tag filter describes itself in many cases. it should make more grammatical sense and repeat itself less now (e.g. no more 'all tags and namespaced tags and unnamespaced tags' rubbish) +* improved how some tag filter rules are handled across the program, including fixing some edge-case false-positive namespace-rule detection +* deleted some ancient and no longer used tag filtering code + +### boring multi-column list stuff + +* did more 'select, sort, and scroll' code cleanup in my multi-column lists, specifically: manage import folders; manage export folders; the string-to-string dict list; edit ngug; edit downloader display (both gugs and url classes, and with a one-shot show/hide choice on a multi-selection rather than asking for each in turn); the special 'duplicate' command of edit shortcut set; and the string converter conversions list (including better select logic on move up/down) +* in keeping with the new general policy of 'when you edit a multi-column list, you just edit one row', the various 'edit' buttons under these lists across the program are now generally only enabled when you have one row selected +* the new 'select, sort, and scroll to new item when a human adds it' tech now _deselects_ the previous selection. let me know if this screws up anywhere (maybe in a hacky multi-add somewhere it'll only select the last added?) +* the aggravating 'clear the focus of the list on most changes bro' jank seems to be fixed--it was a dumb legacy thing +* whenever the multi-column list does its new 'scroll-to' action, it now takes focus to better highlight where we are (rather than stay, for instance, leaving focus on the 'add' button you just clicked) + +### other boring stuff + +* worked a little more on a routine that collapses an arbitrary list of strings to a human-presentable summary and replaced the hardcoded hacky version that presents the 'paste queries' result in the 'edit subscription' panel with it +* wrote a similar new routine to collapse an arbitrary list of strings to a single-line summary, appropriate for menu labels and such +* fixed a layout issue in the 'manage downloader display' dialog that caused the 'edit' button on the 'media viewer urls' side to not show, lmaooooooo +* ephemeral 'watcher' and 'gallery' network contexts now describe themselves with a nicer string +* decoupled how some service admin stuff works behind the scenes to make it easier to launch this stuff from different UI widgets +* refactored `ToHumanInt` and the `ToPrettyOrdinalString` guys to a new `HydrusNumbers.py` file +* fixed some bad Client API documentation for the params in `/get_files/search_files` + ## [Version 580](https://github.com/hydrusnetwork/hydrus/releases/tag/v580) ### misc @@ -322,33 +370,3 @@ title: Changelog * renamed the various simple commands I have replaced in the past few weeks as 'legacy', so we don't accidentally refer to them again in real code * the unit test for 'dateparser decode' is no longer run if dateparser is not in the environment * fixed the file metadata parsing unit tests to account for newer ffmpeg, which sees a -10ms different duration on one of the test files, and made the various tests +/-20% lenient to handle this stuff if it comes up again in future - -## [Version 571](https://github.com/hydrusnetwork/hydrus/releases/tag/v571) - -### clean install - -* the recent 'future build' test went well, so I am rolling these updates into the normal release for everyone. on Windows and Linux, the built program is now running Python 3.11, and, on all platforms, updated versions of Qt (UI) and OpenCV (image-processing). there's nothing earth-shattering about these changes, but some things will work better and faster -* **because of the jump, v570 and v571 have dll conflicts! if you are on Windows or Linux and use the .zip or .tar.zst "Extract" release, you will need to a clean install as here**: https://hydrusnetwork.github.io/hydrus/getting_started_installing.html#clean_installs -* **if you are a Windows installer/macOS App/source user, you do not need to do a clean install, just update as normal** - -### misc - -* when you finish an archive/delete filter and there are several domains you could delete from, the 'commit' buttons are now disabled for 1.2 seconds. this catches you from accidentally spamming enter through a surprise complicated decision -* under _options->files and trash_, you can now say 'when finishing filtering, always delete from all possible domains', which makes the above decision always single domain. hit this if you do want to spam through this and are fine always deleting from everywhere -* the client will now, by default, attempt to load truncated images. this was previously off until you set it per-session-on in a debug menu, but is now a checkbox under _options->media_. some weird damaged jpegs and pngs should now load, fingers crossed -* the 'load images with PIL' setting is now default on for new users and no longer IN TESTING -* every normal single column text list across the program now copies text better if you explicitly hit ctrl+c/ctrl+insert. they now copy all selected rows (rather than just one), and when the display text differs from the underlying data/sort text, you'll now get the sort text (e.g. on manage urls launched on multiple files, you might see 'site.com/123456 (2)', but now, when it copies, that ' (1)' display cruft is omitted). I spammed this to 22 locations and tested 2 so there are definitely no weird string copy bugs anywhere -* fixed an issue opening/closing manage parsers, url classes, or url class links if you have url classes with invalid example urls or critically missing default values in your storage -* the server has a new 'restart_services' command, only triggerable by an admin with service modification ability, which tells all the services on all ports to stop and restart. if there's a new ssl cert, they load the new one - -### client api - -* the 'associate urls' command has a new 'normalise_urls' parameter (default true, which was the behaviour before) to let you force-add un-normalised URLs or URIs or whatever -* added some unit tests to test this new param -* client api version is now 64 - -### help docs - -* wrote a new help document, 'help my db disappeared.txt' for the db directory that tells you what to do if you boot one day and suddenly get the 'this looks like the first time you ran this program' popup -* clarified the Windows 'running from source' help a little around 'git' and added a 'here is the Python version you want' link for Win 7 users -* gave the install help a very light pass, just fixing and updating a few things here and there. I also warn Linux users that the AUR package may throw errors if Arch updates a Qt library or something before we have had a chance to test it (as we have seen a couple times recently), and I generally suggest AUR people run from source manually if they can diff --git a/docs/developer_api.md b/docs/developer_api.md index be2b73057..f1917fee5 100644 --- a/docs/developer_api.md +++ b/docs/developer_api.md @@ -539,7 +539,7 @@ Required Headers: Arguments (in JSON): : * [files](#parameters_files) -* [file domain](#parameters_file_domain) (optional, defaults to 'all my files') +* [file domain](#parameters_file_domain) (optional, defaults to _all my files_) * `reason`: (optional, string, the reason attached to the delete action) ```json title="Example request body" @@ -551,7 +551,7 @@ Arguments (in JSON): Response: : 200 and no content. -If you specify a file service, the file will only be deleted from that location. Only local file domains are allowed (so you can't delete from a file repository or unpin from ipfs yet). It defaults to 'all my files', which will delete from all local services (i.e. force sending to trash). Sending 'all local files' on a file already in the trash will trigger a physical file delete. +If you specify a file service, the file will only be deleted from that location. Only local file domains are allowed (so you can't delete from a file repository or unpin from ipfs yet). It defaults to _all my files_, which will delete from all local services (i.e. force sending to trash). Sending 'all local files' on a file already in the trash will trigger a physical file delete. ### **POST `/add_files/undelete_files`** { id="add_files_undelete_files" } @@ -567,7 +567,7 @@ Required Headers: Arguments (in JSON): : * [files](#parameters_files) -* [file domain](#parameters_file_domain) (optional, defaults to 'all my files') +* [file domain](#parameters_file_domain) (optional, defaults to _all my files_) ```json title="Example request body" { @@ -1064,9 +1064,9 @@ Required Headers: n/a Arguments: : * `search`: (the tag text to search for, enter exactly what you would in the client UI) - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') - * `tag_service_key`: (optional, hexadecimal, the tag domain on which to search, defaults to 'all known tags') - * `tag_display_type`: (optional, string, to select whether to search raw or sibling-processed tags, defaults to 'storage') + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) + * `tag_service_key`: (optional, hexadecimal, the tag domain on which to search, defaults to _all known tags_) + * `tag_display_type`: (optional, string, to select whether to search raw or sibling-processed tags, defaults to `storage`) The `file domain` and `tag_service_key` perform the function of the file and tag domain buttons in the client UI. @@ -1183,9 +1183,11 @@ This last example is far more complicated than you will usually see. Pend rescin Note that the enumerated status keys in the service\_keys\_to\_actions\_to_tags structure are strings, not ints (JSON does not support int keys for Objects). -The `override_previously_deleted_mappings` parameter adjusts your Add/Pend actions. In the client, if a human, in the _manage tags dialog_, tries to add a tag mapping that has been previously deleted, that deleted record will be overwritten. An automatic system like a gallery parser will filter/skip any Add/Pend actions in this case (so that repeat downloads do not overwrite a human user delete, etc..). The Client API acts like a human, by default, overwriting previously deleted mappings. If you want to spam a lot of new mappings but do not want to overwrite previously deletion decisions, then set this to `false`. +The `override_previously_deleted_mappings` parameter adjusts your Add/Pend actions. In the client, if a human, in the _manage tags dialog_, tries to add a tag mapping that has been previously deleted, that deleted record will be overwritten. An automatic system like a gallery parser will filter/skip any Add/Pend actions in this case (so that repeat downloads do not overwrite a human user delete, etc..). The Client API acts like a human, by default, overwriting previously deleted mappings. If you want to spam a lot of new mappings but do not want to overwrite previously deletion decisions, acting like a downloader, then set this to `false`. -The `create_new_deleted_mappings` parameter adjusts your Delete/Petition actions. Particularly, whether a delete record should be made _even if the tag does not exist on the file_. There are not many ways to spontaneously create a delete record in the normal hydrus UI, but you as the Client API should think whether this is what you want. Are you saying 'migrate these deleted tag records from A to B'? Then you want this `true`. Are you saying 'I accidentally spammed this tag to the wrong places, so remove all instances of it on any of these files so I can try again'? Then set it `false`. +The `create_new_deleted_mappings` parameter adjusts your Delete/Petition actions, particularly whether a delete record should be made _even if the tag does not exist on the file_. There are not many ways to spontaneously create a delete record in the normal hydrus UI, but you as the Client API should think whether this is what you want. By default, the Client API will write a delete record whether the tag already exists for the file or not. If you only want to create a delete record (which prohibits the tag being added back again by something like a downloader, as with `override_previously_deleted_mappings`) when the tag already exists on the file, then set this to `false`. Are you saying 'migrate all these deleted tag records from A to B so that none of them are re-added'? Then you want this `true`. Are you saying 'This tag was applied incorrectly to some but perhaps not all of of these files; where it exists, delete it.'? Then set it `false`. + +There is currently no way to delete a tag mapping without leaving a delete record (as you can with files). This will probably happen, though, and it'll be a new parameter here. Response description: : 200 and no content. @@ -1421,12 +1423,12 @@ Required Headers: n/a Arguments (in percent-encoded JSON): : * `tags`: (a list of tags you wish to search for) - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') - * `tag_service_key`: (optional, hexadecimal, the tag domain on which to search, defaults to 'all my files') - * `file_sort_type`: (optional, integer, the results sort method, defaults to 'all known tags') - * `file_sort_asc`: true or false (optional, the results sort order) - * `return_file_ids`: true or false (optional, default true, returns file id results) - * `return_hashes`: true or false (optional, default false, returns hex hash results) + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) + * `tag_service_key`: (optional, hexadecimal, the tag domain on which to search, defaults to _all my files_) + * `file_sort_type`: (optional, integer, the results sort method, defaults to `2` for `import time`) + * `file_sort_asc`: true or false (optional, default `true`, the results sort order) + * `return_file_ids`: true or false (optional, default `true`, returns file id results) + * `return_hashes`: true or false (optional, default `false`, returns hex hash results) ``` title='Example request for 16 files (system:limit=16) in the inbox with tags "blue eyes", "blonde hair", and "кино"' /get_files/search_files?tags=%5B%22blue%20eyes%22%2C%20%22blonde%20hair%22%2C%20%22%5Cu043a%5Cu0438%5Cu043d%5Cu043e%22%2C%20%22system%3Ainbox%22%2C%20%22system%3Alimit%3D16%22%5D @@ -2105,7 +2107,7 @@ Required Headers: n/a Arguments (in percent-encoded JSON): : * [files](#parameters_files) - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) ``` title="Example request" /manage_file_relationships/get_file_relationships?hash=ac940bb9026c430ea9530b4f4f6980a12d9432c2af8d9d39dfc67b05d91df11d @@ -2166,7 +2168,7 @@ Required Headers: n/a Arguments (in percent-encoded JSON): : - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) * `tag_service_key_1`: (optional, default 'all known tags', a hex tag service key) * `tags_1`: (optional, default system:everything, a list of tags you wish to search for) * `tag_service_key_2`: (optional, default 'all known tags', a hex tag service key) @@ -2216,7 +2218,7 @@ Required Headers: n/a Arguments (in percent-encoded JSON): : - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) * `tag_service_key_1`: (optional, default 'all known tags', a hex tag service key) * `tags_1`: (optional, default system:everything, a list of tags you wish to search for) * `tag_service_key_2`: (optional, default 'all known tags', a hex tag service key) @@ -2261,7 +2263,7 @@ Required Headers: n/a Arguments (in percent-encoded JSON): : - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) * `tag_service_key_1`: (optional, default 'all known tags', a hex tag service key) * `tags_1`: (optional, default system:everything, a list of tags you wish to search for) * `tag_service_key_2`: (optional, default 'all known tags', a hex tag service key) @@ -3350,8 +3352,8 @@ Restricted access: Arguments (in percent-encoded JSON): : * `tags`: (optional, a list of tags you wish to search for) - * [file domain](#parameters_file_domain) (optional, defaults to 'all my files') - * `tag_service_key`: (optional, hexadecimal, the tag domain on which to search, defaults to 'all my files') + * [file domain](#parameters_file_domain) (optional, defaults to _all my files_) + * `tag_service_key`: (optional, hexadecimal, the tag domain on which to search, defaults to _all my files_) ``` title="Example requests" /manage_database/mr_bones diff --git a/docs/old_changelog.html b/docs/old_changelog.html index 447bbf4be..29d3ec936 100644 --- a/docs/old_changelog.html +++ b/docs/old_changelog.html @@ -34,6 +34,47 @@

changelog