Initial commit from version 57

This commit is contained in:
Tenshi Hinanawi 2013-02-18 16:11:43 -08:00
commit 310f3015c0
186 changed files with 61393 additions and 0 deletions

3
.directory Normal file
View File

@ -0,0 +1,3 @@
[Dolphin]
Timestamp=2013,2,18,16,11,30
Version=3

5
Readme.txt Executable file
View File

@ -0,0 +1,5 @@
If you are reading this, you probably extracted rather than installed, so you were not prompted to read the help.
The hydrus client can do a lot, so do please go into the help folder and open up index.html so you don't get lost. Thanks!
I use a number of the Silk Icons by Mark James at famfamfam.com.

25
client.pyw Executable file
View File

@ -0,0 +1,25 @@
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.
import os
from include import HydrusConstants as HC
from include import ClientController
try:
app = ClientController.Controller( True, HC.LOGS_DIR + os.path.sep + 'client.log' )
app.MainLoop()
except:
import traceback
print( traceback.format_exc() )
HC.shutdown = True
HC.pubsub.pubimmediate( 'shutdown' )

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

2308
help/Database Diagrams - Old.svg Executable file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 101 KiB

2835
help/Database Diagrams.svg Executable file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 128 KiB

23
help/access_keys.html Executable file
View File

@ -0,0 +1,23 @@
<html>
<head>
<title>access keys</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>first off</h3>
<p>I have purposely not pre-baked this info into the client's install. You have to put it in yourself. It won't connect anywhere until you tell it to.</p>
<h3>access keys</h3>
<p><b><i>If this stuff be-fuzzles you, you can now go </i>help->i don't know what I am doing->just set up some repositories for me, please<i> and you _should_ be all set up automatically.</i></b></p>
<p>I run a public, objective tag repository that <a href="tagging_schema.html">you are welcome to contribute</a> to. I also run a read-only file repository that you can search to get a feel for the interface. The files on my file repo are appropriately tagged in my tag repo.</p>
<p><img src="edit_repos_public_tag_repo.png" /></p>
<p><img src="edit_repos_file_repo.png" /></p>
<p>Here's the info so you can copy it:</p>
<ul>
<li>public tag repository: 4a285629721ca442541ef2c15ea17d1f7f7578b0c3f4f5f2a05f8f0ab297786f@98.214.1.156:45871</li>
<li>read-only file repository: 8f8a3685abc19e78a92ba61d84a0482b1cfac176fd853f46d93fe437a95e40a5@98.214.1.156:45872</li>
</ul>
</div>
</body>
</html>

69
help/advanced.html Executable file
View File

@ -0,0 +1,69 @@
<html>
<head>
<title>advanced</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>using flash in fullscreen view</h3>
<p>Flash files are sometimes interested in inputs (like spacebar or mouse-scrollwheel) that mean something to hydrus's fullscreen view, and the libraries I have to use to show flash don't handle these events like normal windows. I now have it set so if your mouse is inside the flash window, the input will go to the flash, and if it is outside, it goes to the fullscreen window. Unless the flash is set otherwise, your mouse cursor should show up when it moves into the flash window.</p>
<p>So, if you want to play a flash game in fullscreen, keep your mouse inside the window. If you want to filter some flash files real quick, keep your cursor at the edge of your screen.</p>
<h3>exclude deleted files</h3>
<p>In the client's options is a checkbox to exclude deleted files. It occurs again pretty much anywhere you can import, under 'advanced import options'. If you select this, any file you ever deleted will be excluded from all future remote searches and import operations. This can stop you from importing/downloading and filtering out the same bad files several times over. The default is off. You may wish to have it set one way most of the time, but switch it the other just for one specific import or search.</p>
<h3>importing and adding tags at the same time</h3>
<p><i>Add tags before importing</i> on <i>file->import files</i> lets you give tags to the files you import <i>en masse</i>, and intelligently, using regexes that parse filename:</p>
<p><img src="gunnerkrigg_import.png"/></p>
<p>This should be somewhat self-explanatory to anyone familiar with regexes. I hate them, personally, but I recognise they are powerful and exactly the right tool to use in this case. <a href="http://www.aivosto.com/vbtips/regex.html">This</a> is a good introduction, if you are not certain about regexes.</p>
<p>Once you are done, you'll get something neat like this:</p>
<p><img src="gunnerkrigg_page.png"/></p>
<p>Which you can more easily manage by collecting:</p>
<p><img src="gunnerkrigg_chapter.png"/></p>
<p>Collections have a small icon in the bottom left corner. Selecting them actually selects many files (see the status bar), and performing an action on them (like archiving, uploading) will do so to every file in the collection. Viewing collections fullscreen pages through their contents just like an uncollected search.</p>
<p>Here is a particularly zoomed out view, after importing volume 2:</p>
<p><img src="gunnerkrigg_volume.png"/></p>
<p>Importing with tags is great for long-running series with well-formatted filenames, and will save you literally hours' finicky tagging.</p>
<h3>custom filter</h3>
<p>Once you are comfortable with the client's tagging and rating, you may be interested in performing a <i>custom filter</i>, which is essentially the fullscreen browser with custom shortcuts. You select it from the regular thumbnail right-click menu. First, it will show you a dialog:</p>
<p><img src="custom_filter_parent.png" /></p>
<p>Which has a sub-dialog to add and edit actions:</p>
<p><img src="custom_filter_child.png" /></p>
<p>You can reassign the default shortcuts for regular things, like archive/delete and opening tag/ratings dialogs, and also add shortcuts for adding/removing a tag or setting/unsetting a rating. Shortcuts do not yet combine; they overwrite.</p>
<p>Once you hit ok on the parent dialog, the fullscreen browser will launch. Navigation and zooming happens as normal with the mouse and keyboard, unless you have overwritten a shortcut! Hitting any of the shortcuts you declared should carry out the action. Tags will pend/rescind pend or petition/rescind petition or add/delete as appropriate to the type of tag service and the tag's status for the particular file.</p>
<p>The shortcuts you set will be active only for that session; they will be forgotten as soon as you close the browser. This behaviour may change, if people desire it. <span class="warning">(remembering the last settings, or having favourites, maybe? send me your thoughts.)</span></p>
<h3>finding duplicates</h3>
<p>system:similar_to takes two arguments: a hash and an integer representing max hamming distance (0 means exactly the same, 64 means everything. 5 is good for finding dupes). You can quick-select it from a file's right-click menu. It returns all images that are <i>very</i> similar to the hash. For example:</p>
<p>Here are a couple of duplicates, found despite their different resolution.</p>
<p><img src="similar_gununu.png" /></p>
<p>And some images of similar shape but not colour.</p>
<p><img src="similar_icons.png" /></p>
<p>If you are careful, you can find images that look only <i>somewhat</i> like your hash. You get a lot of false positives with hamming distance of much more than 12, though.</p>
<p><img src="similar_gununus.png" /></p>
<h3>PIL errors</h3>
<p>At some point, you will probably encounter a PIL error when importing a file. PIL is the Python Image Library, the code I use to manipulate image files. Some files are kooky, and just won't load with it. I can't fix these errors, since PIL is not mine. It would take me thousands of hours to write my own image library, and even then it would have its own odd errors. Just gotta deal with it.</p>
<p>If the PIL error'ing file is one you particularly care about, I suggest you import it into photoshop or similar and save it again. Photoshop should be clever enough to parse the file's weirdness, and then it'll hopefully save again to a simpler format which PIL, and hence the client, will be able to understand.</p>
<h3>busted up gifs</h3>
<p>Animated gifs are a real pain in the neck. There are several loopholes in the standard that permit odd palettes and colourspaces, and PIL has a hard time parsing it all.</p>
<p>So, some gifs will have a coloured first frame but grey frames thereafter; or they will have odd washy noise all over; or they will just be black. The file isn't broken, but lib is looking at it wrong. Every ten versions or so, I gather enough enthusiasm to fix a few more.</p>
<h3>setting a password</h3>
<p>the client offers a very simple password system, enough to keep out noobs. You can set it at <i>database->set a password</i>. It will thereafter ask for the password every time you start the program, and will not open without it. However none of the database is encrypted, and someone with enough enthusiasm or a tool and access to your computer can still very easily see what files you have. The password is mainly to stop idle snoops checking your images if you are away from your machine.</p>
<h3>backing up</h3>
<p>All of the client's files, mappings, service credentials, options, everything, are stored in the /db folder beneath the main install directory. If you want to back your data up, just turn off the client and copy the directory somewhere. Copy it back to restore.</p>
<p>The same is true of a server. Turn it off and copy the db folder, or send a backup command via the server admin menu and copy the resultant .db.backup files and relevant subdirectories.</p>
<h3>the client's server</h3>
<p>The client runs a very simple http server. I want to do much more with it in future.</p>
<p>When you boot the client, it will try to host a service on port 45865, which will respond to /file and /thumbnail requests just like a file repository, but without needing an access key, and only to localhost (127.0.0.1).</p>
<p>For instance, the following image (6c0ae65894c7a5ffd686f54cc052326b8ea188a691a1895b2f88b7c60a07f13f.jpg, in the help dir) is served here from disk:</p>
<p><img src="6c0ae65894c7a5ffd686f54cc052326b8ea188a691a1895b2f88b7c60a07f13f.jpg" /></p>
<p>And here it will attempt to load from the client:</p>
<p><img src="http://127.0.0.1:45865/file?hash=6c0ae65894c7a5ffd686f54cc052326b8ea188a691a1895b2f88b7c60a07f13f" /></p>
<p>For more information, check the image's two urls. It will of course only display in the second case if you import it to the client and have it running when you load this page. You can copy the second image's url and replace the hash with that of any other image or swf in your collection and it should work.</p>
<p>Needless to say, this starts to break if you try to run several different copies of the client at once.</p>
<h3>a note concerning memory usage</h3>
<p>the client does a lot of caching. It eats plenty of memory, and if you go crazy you can crash the program. A default-sized 4000-strong thumbnail pane is really just a scrollable 250MB-ish bitmap, so opening up a dozen large searches will start pushing your OS's 32-bit upper memory limits. If you find the client crashing, slow down a little or reduce the max cache sizes and thumbnail dimensions in the options.</p>
<h3>vacuum</h3>
<p>After a lot of use, pretty much all of the client's database's pages will be fragged and inefficiently packed. If you think the client is running sluggish, going <i>database->vacuum</i> will rebuild the database entirely, making it as efficient as it can possibly be. It takes a minute or so.</p>
<p>If the db is sluggish even after a vacuum, please send me an email with your rough details. I am always interested in speeding up bad code.</p>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

BIN
help/autocomplete_dropdown.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="autocomplete_dropdown_overlay.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="322.58293"
inkscape:cy="799.10367"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1184"
inkscape:window-x="1196"
inkscape:window-y="716"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<image
y="18.362173"
x="17.142857"
id="image2993"
xlink:href="file:///C:/code/Hydrus/help/autocomplete_dropdown.png"
height="588"
width="480"
inkscape:export-filename="C:\code\Hydrus\help\autocomplete_dropdown_overlay.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
style="color:#000000;fill:none;stroke:#b22900;stroke-width:1.99999988000000010;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:5.99999999000000010, 5.99999999000000010;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect2996"
width="449.99997"
height="33.571476"
x="30"
y="194.50504" />
<text
xml:space="preserve"
style="font-size:6px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
x="57.857143"
y="146.64789"
id="text3766"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3768"
x="57.857143"
y="146.64789"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Palatino Linotype;-inkscape-font-specification:Palatino Linotype">type here, get existing tags here</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 95.259972,151.63302 C 83.113971,194.49477 61.814544,211.79977 61.724438,211.8571"
id="path3776"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 232.2926,157.03042 C 224.461,274.08354 185.35103,349.51988 168.44888,366.94993"
id="path3778"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 62.881996,205.60181 -1.1594,6.41106 6.471018,-1.19004"
id="path3782"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 168.39286,359.59432 0.0784,7.57444 7.6894,-2.48515"
id="path3788"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
help/basic_network_diagram.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

637
help/basic_network_diagram.svg Executable file
View File

@ -0,0 +1,637 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.48.1 "
sodipodi:docname="basic_network_diagram.svg"
inkscape:export-filename="C:\code\Hydrus\help\basic_network_diagram.png"
inkscape:export-xdpi="113.00286"
inkscape:export-ydpi="113.00286">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective10" />
<inkscape:perspective
id="perspective3598"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-7"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-0"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-4"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-8"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-45"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-1"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-11"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-76"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3598-2"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3727"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3727-5"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3727-7"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3727-2"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3840"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3840-7"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3840-6"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3840-0"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3951"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3951-9"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective4000"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="328.57299"
inkscape:cy="682.75905"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1200"
inkscape:window-height="1904"
inkscape:window-x="1916"
inkscape:window-y="-4"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4013"
width="764.28571"
height="498.57144"
x="1.4285721"
y="53.076466"
inkscape:export-xdpi="113.00286"
inkscape:export-ydpi="113.00286"
inkscape:export-filename="C:\code\Hydrus\help\basic_network_diagram.png" />
<g
id="g3707"
transform="translate(270,422.14287)">
<rect
y="32.260204"
x="73.463745"
height="51.42857"
width="74.285713"
id="rect2816"
style="color:#000000;fill:#daffd0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.76032728;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
id="text3693"
y="45.930542"
x="110.23746"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
y="45.930542"
x="110.23746"
id="tspan3695"
sodipodi:role="line">public</tspan><tspan
style="text-align:center;text-anchor:middle"
y="60.930542"
x="110.23746"
sodipodi:role="line"
id="tspan3068">tag</tspan><tspan
style="text-align:center;text-anchor:middle"
id="tspan3703"
y="75.930542"
x="110.23746"
sodipodi:role="line">repository</tspan></text>
</g>
<g
id="g3713"
transform="translate(-68.541578,51.267543)">
<rect
y="36.647896"
x="282.85715"
height="51.42857"
width="74.285713"
id="rect2816-1"
style="color:#000000;fill:#fffed0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.76032728;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
id="text3697"
y="58.984253"
x="319.74805"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
y="58.984253"
x="319.74805"
id="tspan3699"
sodipodi:role="line">file</tspan><tspan
style="text-align:center;text-anchor:middle"
id="tspan3701"
y="73.984253"
x="319.74805"
sodipodi:role="line">repository</tspan></text>
</g>
<g
transform="translate(112.73784,51.267543)"
id="g3713-2">
<rect
y="36.647896"
x="282.85715"
height="51.42857"
width="74.285713"
id="rect2816-1-2"
style="color:#000000;fill:#fffed0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.76032728;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
id="text3697-1"
y="58.984253"
x="319.74805"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
y="58.984253"
x="319.74805"
id="tspan3699-6"
sodipodi:role="line">file</tspan><tspan
style="text-align:center;text-anchor:middle"
id="tspan3701-8"
y="73.984253"
x="319.74805"
sodipodi:role="line">repository</tspan></text>
</g>
<g
transform="translate(203.37755,51.267543)"
id="g3713-7">
<rect
y="36.647896"
x="282.85715"
height="51.42857"
width="74.285713"
id="rect2816-1-6"
style="color:#000000;fill:#fffed0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.76032728;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
id="text3697-18"
y="58.984253"
x="319.74805"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
y="58.984253"
x="319.74805"
id="tspan3699-9"
sodipodi:role="line">file</tspan><tspan
style="text-align:center;text-anchor:middle"
id="tspan3701-2"
y="73.984253"
x="319.74805"
sodipodi:role="line">repository</tspan></text>
</g>
<g
transform="translate(22.098132,51.267543)"
id="g3713-9">
<rect
y="36.647896"
x="282.85715"
height="51.42857"
width="74.285713"
id="rect2816-1-5"
style="color:#000000;fill:#fffed0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.76032728;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
id="text3697-4"
y="58.984253"
x="319.74805"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
y="58.984253"
x="319.74805"
id="tspan3699-3"
sodipodi:role="line">file</tspan><tspan
style="text-align:center;text-anchor:middle"
id="tspan3701-1"
y="73.984253"
x="319.74805"
sodipodi:role="line">repository</tspan></text>
</g>
<path
style="color:#000000;fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 127.37723,331.56427 343.46375,458.32808"
id="path3929"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3797"
inkscape:connection-end="#g3707"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 407.45503,454.40307 531.6136,335.48928"
id="path3933"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3707"
inkscape:connection-end="#g3809-5"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 372.11403,454.40307 332.84076,335.48928"
id="path3935"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3707"
inkscape:connection-end="#g3809-8"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 389.78453,454.40307 432.22718,335.48928"
id="path3937"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3707"
inkscape:connection-end="#g3809-9"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 417.74946,458.66352 638.37605,331.22883"
id="path3939"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3707"
inkscape:connection-end="#g3809-2"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 354.44353,454.40307 233.45436,335.48928"
id="path3941"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3707"
inkscape:connection-end="#g3809"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="m 111.37055,284.06071 118.9517,-144.7167"
id="path3972"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3797"
inkscape:connection-end="#g3713"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="M 127.37723,288.50398 395.59499,134.90074"
id="path3974"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3797"
inkscape:connection-end="#g3713-2"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="m 213.08152,284.06071 32.58667,-144.7167"
id="path3976"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3809"
inkscape:connection-end="#g3713"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="m 326.67517,284.06071 13.09598,-144.7167"
id="path3980"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3809-8"
inkscape:connection-end="#g3713-9"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="m 338.55787,284.06071 79.97029,-144.7167"
id="path3982"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3809-8"
inkscape:connection-end="#g3713-2"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="m 350.44057,284.06071 146.8446,-144.7167"
id="path3984"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3809-8"
inkscape:connection-end="#g3713-7"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
d="m 452.15154,284.06071 60.47958,-144.7167"
id="path3986"
inkscape:connector-type="polyline"
inkscape:connection-start="#g3809-9"
inkscape:connection-end="#g3713-7"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<path
style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 370.46305,139.34401 159.63407,144.7167"
id="path3990"
inkscape:connector-type="polyline"
inkscape:connection-end="#g3809-5"
inkscape:connection-start="#g3713-9"
inkscape:connection-start-point="d4"
inkscape:connection-end-point="d4"
inkscape:connector-curvature="0" />
<g
id="g3797"
transform="translate(-2.1428573,4.2857138)">
<rect
y="279.77499"
x="55.234379"
height="51.42857"
width="74.285713"
id="rect2816-8"
style="color:#000000;fill:#eef7f8;fill-opacity:1;stroke:#000000;stroke-width:0.76032728000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;stroke-dashoffset:0" />
<text
id="text3787"
y="309.61136"
x="92.14286"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
y="309.61136"
x="92.14286"
sodipodi:role="line"
id="tspan3076">librarium</tspan></text>
</g>
<g
transform="translate(124.74217,-49.999992)"
id="g3809-9">
<rect
y="334.0607"
x="279.52008"
height="51.42857"
width="74.285713"
id="rect2816-2-3"
style="color:#000000;fill:#eef7f8;fill-opacity:1;stroke:#000000;stroke-width:0.76032728000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;stroke-dashoffset:0" />
<text
id="text3803-1"
y="363.89706"
x="316.42856"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
id="tspan3807-8"
y="363.89706"
x="316.42856"
sodipodi:role="line">librarium</tspan></text>
</g>
<g
transform="translate(358.85597,-49.999992)"
id="g3809-2">
<rect
y="334.0607"
x="279.52008"
height="51.42857"
width="74.285713"
id="rect2816-2-4"
style="color:#000000;fill:#eef7f8;fill-opacity:1;stroke:#000000;stroke-width:0.76032728000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;stroke-dashoffset:0" />
<text
id="text3803-8"
y="363.89706"
x="316.42856"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
id="tspan3807-5"
y="363.89706"
x="316.42856"
sodipodi:role="line">librarium</tspan></text>
</g>
<g
transform="translate(241.79909,-49.999992)"
id="g3809-5">
<rect
y="334.0607"
x="279.52008"
height="51.42857"
width="74.285713"
id="rect2816-2-0"
style="color:#000000;fill:#eef7f8;fill-opacity:1;stroke:#000000;stroke-width:0.76032728000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;stroke-dashoffset:0" />
<text
id="text3803-2"
y="363.89706"
x="316.42856"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
id="tspan3807-6"
y="363.89706"
x="316.42856"
sodipodi:role="line">librarium</tspan></text>
</g>
<g
id="g3809"
transform="translate(-109.37165,-49.999992)">
<rect
y="334.0607"
x="279.52008"
height="51.42857"
width="74.285713"
id="rect2816-2"
style="color:#000000;fill:#eef7f8;fill-opacity:1;stroke:#000000;stroke-width:0.76032728000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;stroke-dashoffset:0" />
<text
id="text3803"
y="363.89706"
x="316.42856"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
id="tspan3807"
y="363.89706"
x="316.42856"
sodipodi:role="line">librarium</tspan></text>
</g>
<g
transform="translate(7.6852517,-49.999992)"
id="g3809-8">
<rect
y="334.0607"
x="279.52008"
height="51.42857"
width="74.285713"
id="rect2816-2-7"
style="color:#000000;fill:#eef7f8;fill-opacity:1;stroke:#000000;stroke-width:0.76032728000000005;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;stroke-dashoffset:0" />
<text
id="text3803-4"
y="363.89706"
x="316.42856"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Consolas;-inkscape-font-specification:Consolas"
xml:space="preserve"><tspan
style="text-align:center;text-anchor:middle"
id="tspan3807-7"
y="363.89706"
x="316.42856"
sodipodi:role="line">librarium</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

835
help/changelog.html Executable file
View File

@ -0,0 +1,835 @@
<html>
<head>
<title>changelog</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>changelog</h3>
<ul>
<li><h3>version 57</h3></li>
<ul>
<li>added quick vs accurate slider for numerical ratings filter</li>
<li>new slider will remember where you left it last</li>
<li>ratings filter internal comparison logic is more sane</li>
<li>'already rated' will now show the specific rating beside it</li>
<li>ratings filter (hopefully!) chooses better comparisons, in about four different and new ways</li>
<li>you can now ratings filter just one file</li>
<li>ratings filter code is neatened a whole lot, especially on my horrible variable names</li>
<li>I may have fixed an equality ratings filter bug</li>
<li>internal rating data -> pretty text for display is more flexible and accurate</li>
<li>going back several steps on ratings filter will no longer forget to re-rate already rated files</li>
<li>delete from dumper no longer screws with the indices</li>
<li>dumper is more stable, less likely to bail on the whole dump if something odd happens</li>
<li>dumper should recognise duplicate file errors and recover the fail</li>
<li>if the user has idled for the last twenty minutes, the db checks to see whether it can optimise itself</li>
<li>fixed flickering on fullscreen drag</li>
<li>fixed flickering onn fullscreen image init, meaning smoother mousewheel/whatever scrolling</li>
<li>fixed a graphical glitch in manage boorus dialog, and a bunch of others (removed all staticboxsizers)</li>
<li>fixed a similar glitch in manage ratings dialog - it now has dropdowns; I'll probably make it radio buttons again soon</li>
<li>fullscreen page navigation (previous, next, first, last) shortcuts are now customisable</li>
<li>custom filter now supports these new page nav shortcuts</li>
<li>can now do home/end and page up/down in shortcuts</li>
<li>shortcuts listctrls now sort by action by default</li>
<li>I improved the my custom listctrl's code generally</li>
<li>little less ugly code, here and there</li>
<li>fixed a whole ton of regular little bugs</li>
</ul>
<li><h3>version 56</h3></li>
<ul>
<li>new existing tag sort dropdown</li>
<li>an option to set default existing tag sort</li>
<li>dumper error logic improved</li>
<li>dumper now does random sort properly!</li>
<li>double buffering hilariousness</li>
<li>some reordering of the local options dialog</li>
<li>made a 'shortcut' entry object</li>
<li>made a parent frame object</li>
<li>collection thumbnails will redraw if the sort changes</li>
<li>add media and add thumbnail data and graphics logic is improved</li>
<li>4chan pass now authenticates for an entire year</li>
<li>bit more in help about the autocomplete tag entry</li>
<li>tag petition processing speed is a loooot faster</li>
</ul>
<li><h3>version 55</h3></li>
<ul>
<li>custom filter prototype ready!</li>
<li>added some info on custom filter to help (in advanced.html)</li>
<li>you can now set a default tag service in options</li>
<li>tag rexeg dialog's listctrl refreshes without scrolling up to the top every time</li>
<li>tag for this file in tag regex dialog applies to all selected, not just the first</li>
<li>scrolling in autocomplete entry will scroll services in manage tags and tags regex dialog</li>
<li>ctrl+scrolling in autocomplete entry will scroll through results</li>
<li>complete rewrite of image prefetch calculation</li>
<li>couple of content-update display bugs in ratings filter fixed</li>
<li>in manage ratings dialog, sliders will preset to best guess at current score</li>
<li>dumper should be fixed</li>
<li>resized active predicates box (much smaller)</li>
<li>a deprecated call updated</li>
<li>added some forum extensions</li>
</ul>
<li><h3>version 54</h3></li>
<ul>
<li>several new flash key and mouse event bugs fixed - now: mouse in = to flash | mouse out = to frame</li>
<li>the problem with scrollable management windows not drawing things on scroll is fixed; staticboxsizers now replaced with "- title -"</li>
<li>ratings filter now accepts several shortcut keys, directing to whichever window the mouse is over</li>
<li>the ratings filter windows will redraw themselves appropriately on content and service updates, e.g. changing tags with F3</li>
<li>ratings filter will choose the files to compare to more intelligently, both from the db and the currently-rated pool</li>
<li>the way services are identified behind the scenes is entirely overhauled and improved</li>
<li>the review service dialog is better as a result</li>
<li>all dialogs will now cancel-exit on pressing escape</li>
<li>started fade in and out for thumbnails</li>
<li>up cursor arrow in filter now skips</li>
<li>the tags regex dialog is refitted so it will refit on small screens better</li>
<li>dumper now dumps in its own thread (no longer locks up the gui while uploading)</li>
<li>the calculation of num_frames for flvs was off by a thousand, lol</li>
<li>synchro/wait shortcut typo fixed</li>
<li>inbox and other icons moved to background in fullscreen</li>
<li>fullscreen makes less db queries r.e. ratings</li>
<li>a couple managementpanel resize issues corrected</li>
<li>a couple drawing/flickering issues corrected</li>
<li>some updates to help</li>
<li>I made a forum to my site, and added links in the client and help</li>
</ul>
<li><h3>version 53</h3></li>
<ul>
<li>several terrible ratings filter bugs fixed</li>
<li>ratings filter can now rate files internally</li>
<li>ratings filter frame now has a statusbar</li>
<li>system:rating:service=uncertain added</li>
<li>upgraded to wx2.9, which included a ton of bug fixes</li>
<li>sort by namespace wasn't working due to an odd typo</li>
<li>collect by logic changed a little so that 'none' values are collected</li>
<li>the shutdown lag from v52 is corrected</li>
</ul>
<li><h3>version 52</h3></li>
<ul>
<li>ratings filter prototype is done</li>
<li>bit of help docs</li>
<li>more intelligent cpu burn on shutdown</li>
<li>dumper can manage flood time error, and recover from it</li>
<li>whole load of work done on mappings optimisation, meaning mappings updates, uploading mappings and approving petitions work about 100x faster!</li>
<li>forgetting pending uploads now throws up an ok/cancel dialog</li>
<li>had another look at overwriting deleted tags</li>
</ul>
<li><h3>version 51</h3></li>
<ul>
<li>dumper deals with failed uploads better, although there is more work to do.</li>
<li>flv support for client and file repo!</li>
<li>reworked tag services' permissions calculations on thumbnail menu</li>
<li>new fatten A/C cache on shutdown</li>
<li>system:untagged works again for null tag repo ('all known tags')</li>
<li>advanced import options now default no limit for size and resolution</li>
<li>ratings service now have a little info on the review services frame</li>
<li>new shortcut keys (ctrl-b and -n) for animated gif previous/next frame in fullscreen</li>
<li>added thoughts on plurals to tag schema help page</li>
<li>hentai foundry downloads now interleave pictures and scraps</li>
<li>removed db locks on file/thumbnail reads</li>
<li>you can open the page picker frame with the mouse by going view->pick a new page</li>
<li>the copy->whatever thumbnail menu is more concise</li>
<li>system:hash now works for null file repos ('all known files')</li>
<li>there is now a title: regex on the tag regex dialog</li>
<li>servers now store updates in a folder, not inside their dbs.</li>
<li>couple misc changes to help pages</li>
</ul>
<li><h3>version 50</h3></li>
<ul>
<li>4chan pass added</li>
<li>captcha timings in dump are better</li>
<li>dumper's file ordering is less insane</li>
<li>some general updates to regex tag dialog</li>
<li>new box on regex tag dialog for tags for single files</li>
<li>regex tag dialog now supports arrow key up and down to change repo</li>
<li>entirely new and vastly improved listctrl class</li>
<li>collect by is now a thousand times more complicated, but also much more powerful</li>
<li>the top-left media-flicker display bug in fullscreen is fixed</li>
<li>some logging improvements</li>
<li>some tag cleaning improvements</li>
<li>thumbnails have less cluttered tag headers</li>
<li>some small changes to help</li>
<li>fullscreen precache doesn't do gifs any more, which should make things smoother</li>
<li>got rid of the awful view pending uploads dialog. I'll improve it later</li>
<li>started remote ratings, but its not done yet</li>
</ul>
<li><h3>version 49</h3></li>
<ul>
<li>local rating like service</li>
<li>local rating numerical service</li>
<li>ratings dialog</li>
<li>ratings drawn on preview and fullscreen canvas</li>
<li>search by rating</li>
<li>system:rating in options</li>
<li>sort by rating</li>
<li>a ratings help page added</li>
<li>custom shortcuts</li>
<li>overhauled shortcuts code</li>
<li>a new, comprehensive regex menu in the regex tag dialog</li>
<li>extensive new hentai foundry search and sort options</li>
<li>a new option regarding the search style of tag A/C entries</li>
<li>thu dumper can now dump with tags</li>
<li>regex tag dialog selects tag A/C on page change</li>
<li>regex tag dialog's button now now shows in import dialog even if there are no remote tag dialogs with POST privilege</li>
<li>A/C is slightly faster in all cases</li>
<li>preview canvas now updates on a content update</li>
<li>numtags = 0 and numtags > 0 now work for pending tags</li>
<li>shift- or Ctrl-Click no longer deselects</li>
<li>listbook renaming and resizing bug fixed</li>
<li>collections thumbnail is fixed</li>
<li>sometimes, an empty tag, '', could be entered into pending and screw a lot up</li>
<li>sometimes, a null tag could be entered into pending and screw a lot up</li>
<li>advanced tag options has better checkbox defaults</li>
<li>some help screenshots updated</li>
<li>the db's processing is slightly rebalanced</li>
<li>the db's startup is slightly rebalanced</li>
<li>a misc gui bug was fixed</li>
<li>a misc gui typo was fixed</li>
</ul>
<li><h3>version 48</h3></li>
<ul>
<li>New copy path and copy url menu entries on thumbnail right-click menu</li>
<li>Gif scrollbar</li>
<li>Hentai Foundry parsing errors fixed</li>
<li>Hentai Foundry 404 errors fixed</li>
<li>All the html parsers are rewritten using BeautifulSoap</li>
<li>Flash now zooms full, but not fit</li>
<li>Filter is now F12</li>
<li>Help is updated in a number of ways</li>
<li>Up/Down on empty input to change repository in manage tags dialog is fixed</li>
<li>The servers now support OPTIONS requests</li>
<li>Several status typos fixed</li>
<li>I started local ratings services</li>
</ul>
<li><h3>version 47</h3></li>
<ul>
<li>Hentai Foundry interface is done, for both artist and tag searches</li>
<li>A/C gui reorganisation</li>
<li>A/C file and repo buttons added</li>
<li>A/C cache count alterations to match those buttons</li>
<li>A/C tag processing is cleaned up</li>
<li>Search and thumbnail-action improved to support null file service or non-null tag service</li>
<li>system:numtags=0 and system:numtags>0 optimised to be much faster</li>
<li>Ctrl+I now switches searching immediately/waiting</li>
<li>z now switches between zoom full and zoom fit in fullscreen view</li>
<li>advanced import options now has exclude already deleted files checkbox</li>
<li>Thumbnails choose the way they access the db more intelligently</li>
<li>ManagementPanel colour is changed, hmmm</li>
<li>Some DB cleanup</li>
<li>Some general code cleanup</li>
<li>Some download logic improved, including timer</li>
<li>Some download status improved</li>
<li>Download 404 notices better</li>
<li>DeviantArt now initially shows 'artist username' in its searchbox</li>
<li>Some code nomenclature improved</li>
<li class="dealwithit">I've made a changelog.html, compling all changes together.</li>
</ul>
<li><h3>version 46</h3></li>
<ul>
<li>DA parsing CLEAR</li>
<li>rule34@paheal parsing CLEAR</li>
<li>tbib (another booru) parsing CLEAR</li>
<li>Canvas rearranging</li>
<li>Preview now shows tags</li>
<li>The autocomplete tag write dialog will promote existing exact matches to the top of the list, even if it is not the most popular.</li>
<li>Autocomplete lists now scroll with the mouse.</li>
<li>A/C scrolling is a little more accurate.</li>
<li>Pressing up or down on an empty A/C entry will change tag repository.</li>
<li>A sledgehammer has been applied to the python garbage collector.</li>
<li>The code that navigates boorus is better.</li>
<li>The import queuing/pausing/cancelling system is better.</li>
<li>Booru tag-processing is better.</li>
<li>The import-queue gui is slightly better sized on small screens.</li>
<li>The new local tags service now shows up in advanced tag options.</li>
<li>Even more flicker is removed from the main thumbnail view, this time when clicking on whitespace. (it was a stupid bug)</li>
<li>Serverside db-backup now includes the WAL file.</li>
<li>Manually adding an admin service is fixed.</li>
</ul>
<li><h3>version 45</h3></li>
<ul>
<li>Local tags: DONE</li>
<li>Thread watcher: DONE</li>
<li>Fullscreen now shows tags</li>
<li>Preview shows some more file + tag info</li>
<li>Listbooks load their panels on demand.</li>
<li>Local options dialog is now a listbook.</li>
<li>Some incorrect sample image downloads from danbooru are fixed. Danboorus inner workings remain a 404-cluttered mess though.</li>
<li>Some remaining utf-8 html parse errors (where a limited content-type header is given) are cleared up.</li>
<li>Another connection problem (a certain case of the server closing the connection) is now properly recovered from.</li>
<li>Some flicker in the thumbnail view is reduced, but my slow laptop still shows some, so I need to revisit this.</li>
<li>Autocomplete tag boxes now have little tooltips better describing their search domains.</li>
</ul>
<li><h3>version 44</h3></li>
<ul>
<li>All database triggers are removed and replaced with more efficient inline code.</li>
<li>Cached number of files, namespaces and tags for a tag repo are kept updated, so review services should rarely take very long to load.</li>
<li>Cached number of A/C counts (current and pending) are kept updated, so A/C results should rarely take very long to load.</li>
<li>The way A/C cache searches are done is improved.</li>
<li>The way A/C cache entries are calculated is vastly improved.</li>
<li>The way several db SELECT DISTINCT * and SELECT COUNT( DISTINCT * ) queries are performed is improved.</li>
<li>The custom httpconnection object is improved to better deal with server-side connection closes. (Cannot connect to server problem)</li>
<li>The custom httpconnection object does http redirections more intelligently.</li>
<li>The custom httpconnection object now parses non-ascii content-type (e.g. utf-8) properly, according to server-side header. The tag “pokémon” will now parse correctly.</li>
<li>e621 and rule34@booru.org are fixed. (just a couple parsing-variable changes)</li>
<li>If some tag parsing entries are checked on a booru download page, the tags will be downloaded, parsed and applied even to files already in the database.</li>
<li>The mouse cursor will remain visible in the fullscreen browser while the right click menu is open.</li>
<li>I corrected some which->that grammar in a couple dialogs.</li>
<li>Auto-repo-setup (from the help menu) was broken in a very stupid way, but I fixed it. I apologise for not noticing.</li>
<li>Thumbnails now show creator and title up top. They are a bit crushed, so I may rearrange them.</li>
</ul>
<li><h3>version 43</h3></li>
<ul>
<li>Updated import + booru code</li>
<li>New booru buttons</li>
<li>Cut tag parse bug fixed</li>
<li>Download preview instead of real file bug fixed (I think)</li>
<li>Fixed the thumbnails not appearing on import bug</li>
<li>Import flickers less</li>
<li>Media Classes rewrite is done, although Im not totally happy. Have to think about it.</li>
<li>A problem with pending tags applying over existing tags no flushing correctly is fixed.</li>
<li>A/C cache is better, but still a little slow on slow computers.</li>
<li>system:duration=0 is fixed.</li>
</ul>
<li><h3>version 42</h3></li>
<ul>
<li>Autocomplete tag cache DONE. Please tell me if you encounter excessive slowdown or incorrect counts.</li>
<li>Autocomplete tag logic improved in about five ways. Tags should appear more intuitively and with more accurate counts.</li>
<li>Copy and paste buttons in manage tag dialog to facilitate spamming many tags from one file to another.</li>
<li>Imageboard dump is fixed!</li>
<li>URL download got fixed last week and I forgot to say!</li>
<li>A peculiar pseudo-foreign-key bug with the active_pending_mappings table is sorted. (leading to more accurate queries and counts)</li>
<li>Since display of large queries is so much faster, the woah! 12,000 query results warning is gone.</li>
<li>Fullscreen precache timings are rebalanced, hopefully for the better!</li>
<li>The importing gui classes are a little smoother, and thumbs should load one by one, not row by row, once the page height is exceeded. The scrollbars should be less janky.</li>
<li>Page transitions are smoother.</li>
<li>Importing from URL will now load those urls that are already inside the db (hella fast, too), just like importing from hdd.</li>
<li>The double-update-download bug is finally fixed! Now youll download update number 258 only once, and not twice in a row. (I hope!) It never mattered much, beyond a little CPU, but it annoyed the hell out of me. Working out what was wrong took ages. (Long story short: Pythons Priority Queues are not parallel FIFOs!)</li>
<li>There was a weird bug in pending tags sometimes going to higher tag-precedence services, rather than the one chosen in the manage tags dialog.</li>
<li>There was a typo in reset service.</li>
<li>More content update unification in the db, making things much neater behind the scenes.</li>
<li>I found a potential hang in the db-shutdown code.</li>
<li>I found another potential hang in the db-shutdown code!</li>
<li>The number of messages in your inbox is now displayed on the statusbar.</li>
<li>Bold, Italic and Underline now work with Ctrl+B/I/U in the message compose panel.</li>
<li>The dont receive messages from Anonymous checkbox in Add, Remove and Edit Services for message depots now does something.</li>
<li>system:unread in message search now has a count.</li>
<li>A draft will remember its saved changes when you click on another conversation and back again.</li>
<li>You can now save a draft with zero recipients.</li>
</ul>
<li><h3>version 41</h3></li>
<ul>
<li>Rich Text Control with Toolbar in messaging.</li>
<li>Message unread/read status now syncs to message depot.</li>
<li>Can set defaults for file system predicates.</li>
<li>Animated Text class written.</li>
<li>system:unread tag in messaging.</li>
<li>Import bug fixed.</li>
<li>Messaging search logic improved.</li>
<li>Message depot default check time down to 180, and daemon thread improved to manage with that.</li>
<li>Application startup is more stable.</li>
<li>Some AddMessage logic improved.</li>
<li>Drag+Drop service fixed and improved.</li>
<li>Tags added while importing will now turn up in autocomplete.</li>
<li>I unified more of the clients content-update db calls. Just making stuff neater.</li>
<li>I massively simplified the autocomplete tag code in preparation for another bash at doing autocomplete cache. A/C is far too slow atm, imo.</li>
<li>Some A/C counts are still off, particularly when there are a mix of current and pending. I couldnt figure out what is causing it, but Ill look at it more as I do the cache.</li>
<li>In add, remove and edit serivces, you can now specify if you want to receive messages from Anonymous or not. Unfortunately, because I forgot to implement it in DoMessageQuery, this checkbox doesnt actually do anything yet! Whoops!</li>
</ul>
<li><h3>version 40</h3></li>
<ul>
<li>Inbox/Archive for messaging works. The inbox icon is back, and F7 to archive as usual.</li>
<li>Unread/Read for messaging works. Click on your status next to a message panel to change.</li>
<li>All message participants are shown in the conversation listctrl.</li>
<li>The message page will open with system:inbox active, ordered by newest message.</li>
<li>I fixed conversation listctrl sorting in a couple ways.</li>
<li>Some bugs in the db->gui update reporting system are fixed, so the compose window and draft panel will close properly on a message-send, and the conversation listctrl will swiftly update unread counts and inbox status and so on.</li>
<li>The draft panels save button wasnt updating sometimes when it should have been.</li>
<li>html links in messages will show in the main frames statusbar and launch in your browser when clicked.</li>
<li>I reworked how many system tags are searched in file queries to make them muuuuch faster. Now, any time you go system:hash, :size, :mime, :age, :width, :height, :duration, it (should) be significantly faster than before.</li>
<li>Ever have a png file that had an ok thumbnail but a black preview/fullscreen? It was probably an LA image, or greyscale with an alpha channel. Display of LA images is now fixed.</li>
<li>Streamlined the way file archive and delete commands are sent throughout the application, with an eye to eventually adding all other user-commands to the same system (to make it simpler, and also to do undo-redo).</li>
<li>Ive updated the help docs, including the section on how messaging actually works.</li>
<li>You can now enter system tags with enter/return from the keyboard, not just double-clicking with the mouse.</li>
</ul>
<li><h3>version 39</h3></li>
<ul>
<li>A whole bunch of stuff I didnt write down that generally made messages work beyond sending “Hello World”.</li>
<li>Unicode messages now work.</li>
<li>Newlines in messages now display properly.</li>
<li>Fixed contact saving and drag-and-drop to the manage contacts dialog.</li>
<li>You can now add a contact using a contact address (assuming their service is v39).</li>
<li>A bug in contact renaming is fixed.</li>
<li>My contact (hydrus admin) is now added automatically.</li>
<li>Messages are orphan-deleted properly server-side.</li>
<li>Message depots you control now get an entry under the admin menu.</li>
<li>The conversation listctrl is now properly sorted.</li>
<li>The HtmlWindow that shows message body is now resized to its minimum needed height via magic that I aint gotta explain.</li>
<li>Messages that fail to send can be retried by clicking on the failed.</li>
<li>Some draft save/send button enable/disable logic was updated.</li>
<li>I switched around some server-side account logic.</li>
<li>You cant zoom a flash window bigger than the screen.</li>
<li>Ive made the mouse appear in fullscreen when you move it, and this includes while you drag. See how you feel about it. Ill make options to change behaviour if people care.</li>
<li>Better zip structure. (No more CWD rubbish)</li>
<li>New tar.gz release with only the code and help. Code is 1.2MB, help is 14MB lol. Ill improve the structure of this release next week. I threw it together by hand today, but Ill improve its structure next week.</li>
</ul>
<li><h3>version 38</h3></li>
<ul>
<li>messaging v1.0</li>
</ul>
<li><h3>version 37</h3></li>
<ul>
<li>messaging prototype</li>
</ul>
<li><h3>version 36</h3></li>
<ul>
<li>animated gif fixes</li>
<li>new page chooser</li>
<li>svcp->cstvcp in fullscreen too</li>
<li>new import progress</li>
<li>just start the server on this computer, please</li>
<li>I think I have scrolling to the current selection after an archive fixed now.</li>
<li>Started an experimental simpler way to send commands to the db, which may open the way for undo-redo.</li>
<li>Capitalisation option in file->options->gui. It only does the menubar for now, but I will expand it.</li>
<li>Custom sorts/collects. Under file->options. Check it out, play with it if you care about it.</li>
<li>Some program initialisation error handling is cleaned up.</li>
<li>Can now no longer start a server if the admin port it wants to use is occupied. (cant run two servers at once on the same port)</li>
<li>I broke dump with a typo in a previous release, I think! It is fixed now.</li>
</ul>
<li><h3>version 35</h3></li>
<ul>
<li>Slight speedup of review services frame loadtime.</li>
<li>SVCP now replaced with SCTVCP and CSTVCP for now, with more planned next week.</li>
<li>Repo sync daemon adds db jobs less manically, now, locking up the gui less.</li>
<li>Repo sync daemon reports successful updates to the log.</li>
<li>Tag petition review page has a visual bug fixed.</li>
<li>ThumbnailMediaPanel manages its underlying bmp canvas more intelligently.</li>
<li>Some ugly page-closing code was cleaned up.</li>
<li>There is a regex examples popout window on the regex-filename-tag import dialog, with copy-pastable examples of python regexes thatll work for common filename-parsing situations.</li>
<li>Home and End keys now select the first/last thumbnail as well as scrolling.</li>
</ul>
<li><h3>version 34</h3></li>
<ul>
<li>DB consolidation, and foreign keys and triggers with it. The db is less prone to orphan ids and miscounts.</li>
<li>For long-time users, all orphan ids should have all been deleted, reducing weirdness.</li>
<li>Total size of local service is now tracked accurately.</li>
<li>Archive while importing should work a bit better now.</li>
<li>Update logic should be more reliable, as should all service_updates.</li>
<li>Archive count for file repos should be less wrong.</li>
<li>Fixed two (!) typos in system:age predicate code.</li>
<li>File upload is fixed (not sure if it was ever broken in release, but I fixed the stupid thing I did anyway)</li>
<li>DB (and server) errors should report better now, revealing inner-db code in the traceback. (and printing it to the appropriate log)</li>
<li>Improved the mime_to_enum object for image/jpeg, image/jpg, image/jpe, image/wtfaretheygoingtocalljpegnow.</li>
<li>HTTP connections can deal with some esoteric commands, like 301, without throwing a fit. All http goes through the same code.</li>
<li>Danbooru should now be in your booru list, and it _should_ work.</li>
<li>Pausing/Cancelling a booru gallery parse should now work.</li>
<li>4chan dumper now understands captchas being wrong and the thread not existing; in the former case itll let you put in a new captcha and try again, in the latter itll stop the whole dump.</li>
<li>Some general code neatness improvements.</li>
</ul>
<li><h3>version 33</h3></li>
<ul>
<li>Boorus are working for users who started last week</li>
<li>The server can now manage many more simultaneous requests without bugging out.</li>
<li>The early freeze/import freeze due to simultaneous access in the client is fixed.</li>
<li>The clients file+thumbnail server (details in helps advanced.html) works again.</li>
<li>Client DB now stores md5 and sha1 for all local files.</li>
<li>Client DB has a larger cache size.</li>
<li>The freeze caused when importing thousands of files at once with tags is fixed.</li>
<li>The yaml imageboard import (when you drag and drop a .yaml file onto the imageboards dialog) now adds form fields correctly! If you had problems here, check out install_path/static/default_imageboards.yaml to reset them!</li>
<li>The autocomplete counts should be more accurate, particularly when there are a mix of current and pending tags in the db.</li>
<li>The autocomplete in the regex-path dialog will now search the db correctly (it was misconfigured).</li>
<li>Autocomplete is also just a _little_ faster</li>
<li>File imports are now low priority, so gui activity should still happen nice and quick even while an import is occurring.</li>
<li>The review services frame will now show how long until the next update will be checked (see picture above). In case of error, it will show how long until it tries again.</li>
<li>The review services panel and manage services panel are of a better default size, and they use my new listbook class exclusively, rather than the old notebook.</li>
<li>Ive added some tooltips on not-obvious widgets.</li>
<li>Content Updates have vastly improved processing speed on a thumbnail view (x100 in some cases!). Tag updates particularly will not be so slow to process if you have a large search open.</li>
<li>The import gauge will now show the correct range according to the current queue size, not always the default 100.</li>
<li>Active Import Pages will throw up a yes/no dialog if you try to close them.</li>
<li>Some beautifying of code syntax. \n is now os.linesep, which means exported stuff should show up better in notepad.</li>
<li>Some changes in network protocol, although now I think of them, I realise I forgot to update the network version. They arent important for most users, so w/e.</li>
</ul>
<li><h3>version 32</h3></li>
<ul>
<li>client db serialisation DONE</li>
<li>Cleaned up a dirty-bmp canvas init issue.</li>
<li>Resized some dlg stuff that was too tall</li>
<li>Cleaned up a bunch of unrelated db code</li>
<li>Tightened the pubsub system so it integrates better with wx.</li>
</ul>
<li><h3>version 31</h3></li>
<ul>
<li>booru prototype</li>
<li>Fixed some problem with last error timestamp </li>
<li>Fixed a bug in repo bandwidth tracking</li>
<li>Fixed URL registration with the client db.</li>
<li>Made downloading URLs asynchronous again</li>
<li>Made repo synchronisations not block so much, and not for nearly as long. You should be able to do queries and click on thumbs (albeit at a slower rate) while the client is downloading and processing updates.</li>
</ul>
<li><h3>version 30</h3></li>
<ul>
<li>Thumbs are exported, and, along with perceptual hashes, now treated as a global pool, reducing downloads and speeding queries.</li>
<li>Thumbnail resize is now asynchronous, done as each thumbnail is requested. Changing the thumbnail size in the options dialog happens real quick, and if you dont like a particular size, you can change it back just as fast.</li>
<li>Temporary DB locking mechanisms ensure serialisation, less inefficient locking.</li>
<li>ImportPage superclass works a lot better, in a lot less code. DB import code is now even simpler, and much faster, especially for redundant files. The new import page will also tell you how many files were successful/failed/already deleted/already in the db.</li>
<li>Fetching images for fullscreen or preview is fully asynchronous, and will no longer block the gui thread.</li>
<li>Some query logic is improved.</li>
<li>You can now import and export sites/imageboards from the manage imageboards dialog. Itll export to a .yaml file, which is easy to understand with a decent text editor. Just drag and drop onto the dialog to import.</li>
<li>Selecting thumbs has a little less preview-flicker now.</li>
<li>The new tagboxes now render numbers prettily, so 4123 -> 4,123.</li>
<li>(+) namespace:tag now colours properly.</li>
<li>The background for selected tags is now an appropriate colour.</li>
<li>You can now choose the colours of any namespace you like in the normal options dialog.</li>
<li>Clicking in whitespace in the new tagbox deselects, rather than select( 0 )s.</li>
<li>Spacebar, PageDown, Return and all the other special command characters are now propagated to flash in fullscreen view, just as long as the mouse is over the canvas.</li>
</ul>
<li><h3>version 29</h3></li>
<ul>
<li>Big changes to the dbs file storage, as above.</li>
<li>database->vacuum is reinstated, database->reindex is retired. I recommend you run a vacuum once you are updated; itll only take a minute now.</li>
<li>Rollback and initialisation bugs are fixed.</li>
<li>Theres a splash window now that can offer client-boot feedback.</li>
<li>The way scrolling-to-focus is calculated is improved.</li>
<li>Pretty much everywhere you see tags will now show coloured tags! I finished up my own tagbox class, which for now will show tags coloured in the default booru scheme. It also loads in a few milliseconds, rather than the ~0.5s of the default listbox. It scrolls faster, too. Ill have user-customisable colours next release.</li>
<li>Files with invalid resolution, size and mime are now filtered out before dumping to an imageboard.</li>
<li>A number of misc other bugs were fixed.</li>
</ul>
<li><h3>version 28</h3></li>
<ul>
<li>I fixed the searching immediately bug. It was a stupid typo as usual.</li>
<li>Post-Filter scrolling should be a bit more reliable.</li>
<li>Some more log events.</li>
<li>I did a lot of work on my new tags box, although the actualy gui elements will have to be finished for v29.</li>
<li>Manage Imageboards wasnt saving properly. It is now.</li>
<li>My new progressdialog happens in several places. It is a little neater than the one in wx; just better for my purposes.</li>
<li>I reworked some of the transaction stuff in the db so that I can atomically queue pubsub events. (this means file import are less juddery)</li>
<li>After becoming very annoyed with wxs listbook/labelbook/whateverbook, I wrote my own. Its all over the place in my dialogs now. It is tighter, more reliable, and can scroll.</li>
<li>I reworked some of the way sets interacted.</li>
<li>There was an infinite recursion bug sometimes, when uploading files to a file repo.</li>
</ul>
<li><h3>version 27</h3></li>
<ul>
<li>Cleared out some old unused library imports, so the client is slightly smaller.</li>
<li>Had a cyclical import (!). Luckily, python is forgiving, but I have still fixed it.</li>
<li>Collection thumbnails will now update with their new pending tags correctly.</li>
<li>Some wx.Panel vs wx.Window issues and nomenclature resolved.</li>
<li>Full Page decouple. Now the window to the left is a seperate, much neater class. It and the media/preview windows talk to each other in a clever way that means I can make new kinds of page much faster. It scrolls, too.</li>
<li>Thumbnails resize will tell the thumbnail window just to redraw itself, not refresh the entire query.</li>
<li>system:local and system:not local are now mutually exclusive (will swap each other out, rather than overlap), like inbox and archive.</li>
<li>A little neatening of the system predicate code.</li>
<li>system:similar_to RMB menu entry fixed for some cases.</li>
<li>There is a new log window. Go view->new log page to see it. It doesnt show much right now, but you can see synchro successes and errors pop up as they happen.</li>
<li>There is now a popup button on the import dialog and the URL downloader page that does advanced import options. You can now tell these import processes to archive everything and/or ignore files below a certain size or resolution. By default, the client will not import anything <5KB or <50x50px. You can set no limit.</li>
<li>Flash windows will now own all keystrokes as long as the mouse cursor is over the flash. If you are browsing/filtering, just move your mouse over or off the flash window to make sure your return/page down/spacebar/escape/whatever is interpreted as you want.</li>
<li>The URL downloader will not download the same file twice in a row, so you can add a thread URL several times in a row, and itll only download the newest files. The behaviour of this is affected by the exclude deleted files checkbox in the clients options. Ill implement thread watching a bit later.</li>
</ul>
<li><h3>version 26</h3></li>
<ul>
<li>The double unnamespaced count bug ( system:blah (70), blah (140) ) in autocomplete should be gone.</li>
<li>Some rejiggering of how the statusbar updates means active import windows cant spam the statusbar when they dont have focus.</li>
<li>The count of pending tags is more accurate and uniform. When it says (+3), it means for three files, not in three cases.</li>
<li>Tag counts overall are better. When it says diaper vore (17), you should be getting 17 files if you enter that search.</li>
<li>GUI tag repo precedence is slightly more accurate, compared to what the db thinks it should be.</li>
<li>I nailed down why system:mime wasnt working sometimes, and now it should work all the time.</li>
<li>I discovered some problems with repo-side bandwidth tracking. I fixed a couple bits, but have notes to look at it more.</li>
<li>In v25, if system:limit was greater than the search population, it threw an error! Whoops! Fixed now.</li>
<li>The post-filtering thumbnail problem is totally fixed, as are a couple other instances when thumbs would sometimes not draw.</li>
<li>The fullscreen change-image-jittering-around problem is fixed, I think.</li>
<li>Fullscreen archive works again. Not sure why/when it broke.</li>
<li>Importing with archive checkbox ticked sometimes didnt archive, lol.</li>
<li>A bunch of decoupling of gui elements, making for much neater code and less gui blocking.</li>
<li>Decoupling of import from hdd as well.</li>
<li>Query is now asynchronous! If you do a massive query on a slow computer, you wont lose the gui! You can go check other tabs, whatever, and the query will process in the background, rendering on the page you started it when it is done.</li>
<li>A number of cpu-heavy numbers are now cleverly cached, so system predicate fetch happens much faster, especially on 100,000+ image dbs.</li>
<li>Some collect code is sped up and made generally less bonkers.</li>
<li>I wrote a couple new classes for my most common gui elements.</li>
<li>There is now an option in file->options to change the number of characters before autocomplete will go search the db for tags! If you have a slow computer and a huge db, you can set it to 2, 3 or even more chars. Default is 1.</li>
<li>Dialogs that ask you questions will now usually center on their parent window.</li>
<li>The current selection tagsbox wont show ( blah (12), blah (+3) ), itll combine into blah (12) (+3) (-1). With the + meaning pending and the - meaning petitioned.</li>
<li>Autocomplete now respects which of the include_current and include_pending buttons are green! Itll only search current/pending as you wish! And the numbers will now be accurate!</li>
<li>My new question dialog with the yes/no buttons hooks the Escape key to mean no.</li>
<li>I dont use it much yet, but I have a new message dialog too.</li>
</ul>
<li><h3>version 25</h3></li>
<ul>
<li>Thumbnails should load just a bit quicker.</li>
<li>Made some dict + set code neater</li>
<li>A new end-of-filtering dialog makes the choices a bit more obvious</li>
<li>When you exit from fullscreen/filter view, the main thumbnail view it was based on should select (and scroll to!) where you were. But filtering is less reliable, since you may have just deleted the last thing you were looking at!</li>
<li>Better scrolling in thumbnail view</li>
<li>Scrolling in thumbnail view will follow the current selection, so the focussed media will always be visible.</li>
<li>Double right-clicking in filter now deletes instead of keeps (typo)</li>
<li>Slightly less flickering when processing repo updates</li>
<li>Made some form code neater</li>
<li>A lot of the thumbnail gui code has been decoupled and pubsubd. It is all neater behind the scenes, meaning Ill be able to extend it easier in future.</li>
<li>I completely overhauled how my pubsub works. (pubsub is a messaging system inside the code). It is more flexible and easier for me to work with.</li>
<li>system:mime was not working in v23, not sure why. Its fixed now.</li>
<li>Some small speedup + neatening in db queries.</li>
<li>You can now scroll to the end of a thumbnail page by pressing End. WARNING: If you have like 10,000 thumbs in the current pane, it is going to have to load all those.</li>
<li>In the AutocompleteTagWrite object, which is the tag entry box in the manage tags dialog, there was a stupid bug that made many requests more expensive. Its fixed.</li>
<li>Autocomplete now works off one characters input.</li>
<li>Ive swapped a bunch of expensive objects with easier staticbitmaps for now</li>
<li>some A/C ordering changes</li>
</ul>
<li><h3>version 24</h3></li>
<ul>
<li>imageboard dumper prototype</li>
<li>some db update stuff</li>
</ul>
<li><h3>version 23</h3></li>
<ul>
<li>A typo was disallowing petition rescinds in certain cases.</li>
<li>Ive rearranged some of the RMB menu separators to reduce filter/archive misclicks.</li>
<li>Tag pending upload has more accurate GUI response.</li>
<li>You can now find similar images from RMB menu.</li>
<li>Petition approvals are mirrored on an admins client.</li>
<li>The gui now accepts that admins can overrule deleted content.</li>
<li>Couple tiny URL downloader gui bugs fixed</li>
</ul>
<li><h3>version 22</h3></li>
<ul>
<li>system:similar_to</li>
<li>Some backend namespace stuff</li>
<li>Couple of gui presentation fixes</li>
<li>I removed the clunky inbox and archive buttons, see how you feel about it.</li>
<li>I tried to do ultimatelistctrl to have coloured tags (like a *booru), but it was too buggy and slow for the clients purposes, so Ill probably have to write my own control.</li>
<li>system:mime exists, now. Not many mimes, yet, but have a play with it, see if you like it.</li>
</ul>
<li><h3>version 21</h3></li>
<ul>
<li>On opening the URL downloader, the textbox input focuses.</li>
<li>The URL downloader has some better update texts. It pauses nicely, etc…</li>
<li>The URL downloader now orders urls in the order they are parsed. I forgot I was throwing the links in a set, losing all order!</li>
<li>You wont see dupes in the URL downloaders mediaresultswindow.</li>
<li>Accounts should now correctly refresh on version update.</li>
<li>When accounts fail to sync, it dumps the error in the log.</li>
</ul>
<li><h3>version 20</h3></li>
<ul>
<li>The preview pane should be a little less schizophrenic.</li>
<li>Some code cleaning up behind the scenes.</li>
<li>Thumbnail download optimisation if they already exist locally.</li>
<li>Icons will show/hide in fullscreen with mouse movement, just like 21/123.</li>
<li>Weird archiving bug on import is fixed. It was display only.</li>
<li>Manage tags dialog now works in fullscreen, lol.</li>
<li>system:not_uploaded_to: now works</li>
<li>services->review services now loads muuuuuch faster (after the first time)</li>
<li>There was a typo in setting up initial servers accounts. Email me if you cant make new admins.</li>
<li>Importing is more streamlined, with more shared code.</li>
<li>Importing with tags dialog happens more naturally in the import process. You can now do it from drag and drop imports!</li>
<li>I reordered the default collection dropdown. Your default may be changed, so check your options.</li>
<li>You can now fetch an account by a deleted file (hash).</li>
<li>Thumbnails tags now obey tag precedence for deleted stuff. I hope.</li>
<li>Modify Account Dialog now does its stuff.</li>
<li>Collections thumbnails now show how many files are in the collection, just next to the icon.</li>
<li>Ive added to and edited the help extensively, replacing screenshots and updating the text.</li>
</ul>
<li><h3>version 19</h3></li>
<ul>
<li>drop librarium nomenclature</li>
<li>More intelligent prefetch in fullscreen - things should load muuuuuch faster</li>
<li>A little more intelligent sum() calcs in autocomplete - non-namespaced tags now sum all their namespaced versions as well</li>
<li>More rigorous client db transactions, just to make things more pretty and reliable.</li>
<li>Moved db files to /db, logs to /logs</li>
<li>Made inroads to getting review services to load faster, but version 20 will have more here.</li>
<li>Ive updated the frame view so the file info is draw on top of the image. Its a hack for now, inside the image-frame, but it is the only solution for wxs annoying no overlapping policy.</li>
</ul>
<li><h3>version 18</h3></li>
<ul>
<li>Some misc gui image info bugs fixed</li>
<li>Review services dialog is less pubsub buggy</li>
<li>Fullscreen image prefetch does more and hopefully more intelligently</li>
<li>Entering a blank tag to quit tag dialog was broke when I updated autocomplete textctrls. Ive fixed it.</li>
<li>Petition page is fixed, so I can finally clear out the tag petitions!</li>
<li>F10 was broke when the lib had deleted files lol! Fixed it.</li>
<li>Review services is more responsive to repo permissions updates.</li>
<li>Flash files are now correctly put in the inbox on import.</li>
<li>Synchronise Repositories daemon no longer takes ten gui-blocking seconds to process every update! This was an annoying slowdown, but I figured out what it was and reduced it to <1s with a quick patch. The problem will return with private tag repos, but Ill deal with that when I come to it.</li>
<li>Synchronise Accounts daemon has some better pubsub so it fires more intelligently. This in turn affects several other daemons, which should all be more responsive; e.g. when your permissions change, your pending thumbs/files should start downloading.</li>
<li>Improved delete orphans logic for the fiftieth time! It is great now, and wont ever bug you in the gui; it runs invisibly on shutdown and usually only takes a few secs to do its job.</li>
<li>Some of the gui updates triggered by the daemons are optimised so they block the gui less. Multiple stuff is bundled into single updates, those updates are less buggy, and the gui catches them better. Resetting the public tag repo will no longer lock up a slow system.</li>
<li>A few versions ago I changed the way repos were registered with the gui, and Ive fixed some of the resultant daemon-related errors. This mostly affects admins, which mostly means me!</li>
<li>Download Thumbnails daemon was getting pretty slow for large dbs (100k+ files) because of an inefficient db query. This has been cleared up.</li>
<li>I banged my head against the wall for a couple of hours getting nested notebooks to work, and I am now a better person for it. Review and Manage Services dialogs feature better panel management as a result. Their panels are also much richer, reporting loads more data about the respective service. You can now see how many mappings the public tag repo has without having to delve into sqlite db browser.</li>
<li>I have unified panel and frame background colouring away from wxs bonkers idea of what things should be coloured. It should mean that everything is properly grey, but please tell me if your gui turns all black or transparent or whatever.</li>
<li>21457 is now 21,457 in pretty much all cases where it is appropriate.</li>
<li>Fixed a bug with wx gauges not liking large ranges because of signed short or whatever underlying var the C code was using to store it. (That should have been done at the wx-python level, but whatever.)</li>
<li>localhost resolves to 127.0.0.1 when editing a service, mainly because windows freaks out at the former, deciding to take a couple seconds longer to make any raw connection.</li>
<li>Dialogs and frames have better, multi-monitor-friendly positioning.</li>
<li>Flash files are loaded from a temp folder beneath the install dir, rather than libs server, for various reasons. This temp dir also manages file copy/paste operations. I may move this back to the OSs approved temp folder, but well see.</li>
</ul>
<li><h3>version 17</h3></li>
<ul>
<li>Tag negation “-tag” works again</li>
<li>You can now cancel a filter on the first image</li>
<li>Some weird filenames that were breaking the new import page no longer do</li>
<li>Autocomplete (either when searching for tags or adding new ones in) will now show the number of files tagged with that tag after the tag e.g. here</li>
<li>Manage tag dialog now pops up slightly to the upper left, rather than the center (default) of the screen, so you can see what you are tagging. I may make this more intelligent in future, so it remembers where you last left it.</li>
<li>I changed a couple small things in help regarding the new import.</li>
</ul>
<li><h3>version 16</h3></li>
<ul>
<li>Numtags system predicate now takes into account which of current/pending tags buttons you have active.</li>
<li>Thumbnail downloads fire more reliably.</li>
<li>Downloading a file was causing funky thumbnail draw, which seems to be fixed.</li>
<li>Delete Orphans daemon only fires on application close now, so post-filter db lag is gone.</li>
<li>Daemons now use events, not conditions! lololol, Im an idiot who cant scroll down a library doc. For the longest time I was like “I wish threading had events!” and it does.</li>
<li>Some account checks were missing in tag upload, but are now there.</li>
<li>A gigantic db rewrite that altered pretty much every table and query.</li>
<li>Calculation of tags for current selection now support collections, and is fast.</li>
<li>Was deleting a repo broke in 15? If it was, sorry! Didnt catch it, but its fixed with the new system now.</li>
<li>Pubsub can do more, and is a little less argh, I think it works like that, and more OOP</li>
<li>The way tags are held by a thumb can support multiple tag servers (but only does public tag repo for now)</li>
<li>Repos are now a subclass of service. Ill do more on this in the next version, including some nomenclature changes in the gui.</li>
<li>Imports are now asynchronous! Theres a new import page thatll open on any import. Its a little jittery, but it all works. If you import 3000 tiny files, your gui may lock up for a few secs since itll be able to import faster than it updates the gui.</li>
</ul>
<li><h3>version 15</h3></li>
<ul>
<li>manage tags dialog focus bug hotfix</li>
</ul>
<li><h3>version 14</h3></li>
<ul>
<li>Selections tags box now shows collections singletons tags</li>
<li>Autocomplete now sources from the current thumbnails whenever it can (faster than db), and does so intelligently</li>
<li>Couple of small display bugs fixed</li>
<li>Some delete logic approved</li>
<li>Repos do some more efficient inserts on POST content</li>
<li>Petition optimisation, for auto-soft-approval before update gen</li>
<li>Dialog parents, dialog parents everywhere</li>
<li>DB cleanup of a couple of old methods</li>
<li>Autocomplete Write (when adding tags in manage tags dialog) now sources from the entire networks tags (not just for the files on your hard drive) when you type enough letters to stump it. i.e. If you have no files tagged evangelion, but you do have a file tagged eve, itll show eve if you type ev, but if you type eva, itll requery the db more widely, and give you evangelion.</li>
<li>system:ratio for searching for wallpapers or whatever. Combine with system:width>x for extra utility!</li>
<li>You can now hit F3 (manage tags) in fullscreen, whether browsing or filtering.</li>
</ul>
<li><h3>version 13</h3></li>
<ul>
<li>a couple of cpu-intensive DAEMONS schedule themselves better. (less slowdown after a big filter)</li>
<li>image rendering prefetch improved</li>
<li>smoother image rendering to screen (especially when zooming), less flickering</li>
<li>petition approval has smoother, less buggy workflow</li>
<li>new hashes and tags are added to the db muuuuuuuuch more efficiently. most public tag repo updates happen in a second or two, rather than 30+</li>
<li>some of the internal commands are streamlined together into a single class</li>
<li>ctrl-s fixed</li>
<li>clear pending file repos pubsub fixed</li>
<li>ctrl-r now shows/hides splitters</li>
<li>thumbnail delete logic is better</li>
<li>select logic is better</li>
<li>deleted_remote_files bug fixed</li>
<li>headache-inducing weakref repositories __eq__ bug in pubsub fixed</li>
<li>with keyword all over the place now. turns out wx has a bunch of objects with support it (including dialogs!)</li>
<li>gridsizers are now all flexgridsizers</li>
<li>the list of tags on the current selection now has a weight attached like flower (23) to show how many of the current selection have that tag. it doesnt support collections weight yet.</li>
<li>revised some ambiguous repo error messages</li>
<li>you can now have a main window with no pages open</li>
<li>right click menus on a selection are vastly improved (lots more info), but still a way to go.</li>
<li>on the import files dialog, you can now specify to auto-archive rather than send to inbox</li>
<li>thumbnails now know where they are uploaded/pending/petitioned to and will show that info with different icons</li>
<li>escape key now deselects</li>
<li>manage repos dialog is completely revised. comments appreciated.</li>
</ul>
<li><h3>version 12</h3></li>
<ul>
<li>You can now tell lib to search current tags only, pending tags only, or both.</li>
<li>Tag search is more efficient.</li>
<li>Search in general is more efficient.</li>
<li>Search code is more beautiful and decoupled.</li>
<li>Tags are stored in memory more beautifully, and a similar class holds repositories for thumbs also.</li>
<li>Age predicate is fixed (twice!)</li>
<li>Server code is more beautiful. DB-Server interface is decoupled into a mixin class to make it easier to understand and manage.</li>
<li>Icons for pending and petitioned files, and for currently downloading.</li>
<li>Prefetch fixed, so nearby fullscreen images load just in case you want to see them.</li>
<li>Fixed a redundant pending tags bug</li>
<li>Fixed a swf tag petitions bug</li>
<li>On boot, temp folder is cleared.</li>
<li>The current tags window is now union on the current selection, not intersect. If nothing is selected, it shows all the tags of the current selection. In a later version, Ill order this list by count-weight.</li>
<li>All (I think) tag updates are synchronous-ish with the gui. As updates come in from the public repo, thumbs will update themselves appropriately. Same goes for repositories.</li>
<li>Gui-code tidy-up</li>
<li>On deleting a local file, preview clears.</li>
</ul>
<li><h3>version 11</h3></li>
<ul>
<li>swf support, lol</li>
<li>You can now backup repositories from the admin menu. Info in help.</li>
<li>Under the help menu, a quick way to set up the beta repositories credentials.</li>
<li>Account sync was full of bugs, and is now less so.</li>
<li>When you go fullscreen, the preview window should go blank, which should save a little cpu time when you are looking at gifs and your ears when you are looking at swfs.</li>
<li>Auto-complete is muuuuuch faster than it was. Also more correct. Still more work to do, though.</li>
<li>Librarium hosts an http server on 45874, which supports GET /file and /thumbnail just like a file repo. Utterly prototype, but you can test it right in your browser if you like. Go http://127.0.0.1:45874/file?hash=whatever when lib is running.</li>
<li>Ctrl-T opens a new local page/tab, Ctrl-W closes the currently active</li>
<li>Image display in preview and fullscreen has been revamped, and is now both a little buggy and much better.</li>
<li>Bandwidth tracking both server- and client-side should be more reliable.</li>
<li>Delete lag (the slowdown after you boot/delete something) should be reduced.</li>
<li>Query lag is significantly reduced, and new operators for predicates have been added. You can now go ˜ on a bunch of values like size and width and duration to get approximately equal to, which actually means plus or minus about five percent.</li>
<li>A stupid error on file upload is fixed. If youve been having problems seeing the files you uploaded in preview, try resetting the respective file repository.</li>
<li>A few daemon bug fixes.</li>
</ul>
<li><h3>version 10</h3></li>
<ul>
<li>hotfix for tag updates</li>
</ul>
<li><h3>version 9</h3></li>
<ul>
<li>Pressing a cursor key when no thumb is focussed no longer throws an exception.</li>
<li>Hitting enter on a blank input in the manage tags dialog now quickly oks the dialog.</li>
<li>Annoying splitter exception on import is gone. It was a one-line fix, because I was being stupid.</li>
<li>All searches should be a little faster. Mostly effects searches with 1000+ results.</li>
<li>Modal dialogs (in particular) should be just a little more responsive now. Less stuff is being dumped on the wx gui thread, and all db handling is more parallel.</li>
<li>Slow petition approval fixed, made almost instant.</li>
<li>Image rendering has been revamped. It should be less stuttery now, but there is still more work to do.</li>
<li>Some pending tag update logic was fixed.</li>
<li>If the focused thumb goes from not local to local, its preview will load. (its on my to-do to do the opposite: clearing preview on delete in remote search.</li>
<li>DB daemons rewritten completely, so now a whole bunch of stuff flushes more efficiently, more reliably, and with less gui-blocking. Things happen smoother now.</li>
<li>Can now create repository database backups via librarium. Sending the command (via the admin menu) tells the repo to lock and copy its .db files to .db.backup. Ill update help to explain this more.</li>
<li>Can now copy files from within librarium to the clipboard! Just select from the right-click menu or press Ctrl-C, and your selection will be copied to clipboard. You can then paste to any directory, for quick export to anywhere. The export command remains for exporting thousands of files.</li>
</ul>
<li><h3>version 8</h3></li>
<ul>
<li>Fixed a missing transaction on repo db update.</li>
<li>Export path can now be on other hard drives. Youll probably want to keep it on the same drive if you have lib on a usb stick, though.</li>
<li>Fixed a really stupid &lt; for &gt; typo that was causing a ton of gui blocking and repository slowdown.</li>
<li>File and thumbnail downloads are much snappier.</li>
<li>One person had a very odd error while trying to open manage repos. I dont understand what actually caused the traceback to happen, but I think I fixed it nonetheless.</li>
<li>inbox/archive buttons above the searchbox are now mutually exclusive.</li>
<li>Fixed the version number in libs about window.</li>
<li>Fixed the preview window so it remembers its last size properly. Also reduced its min size so you can make it tiny.</li>
<li>Fixed the problem people were having with admin rights. See this post if you were having problems.</li>
<li>The RegisterRepoRequest that was filling peoples logs on upload should be fixed now. Turns out I didnt understand how wx.CallAfter works during modal dialogs! I threw in a horrible fix, but it works. Ill revisit it.</li>
</ul>
<li><h3>version 7</h3></li>
<ul>
<li>db changes are done</li>
<li>fixed a bug with posting tag petitions</li>
<li>when typing tags in, autocomplete now harvests from pending tags as well as current</li>
<li>the regex dialogs tag entry is now autocomplete</li>
<li>leading/following whitespace removal for tags, and multi-whitespace -> single</li>
<li>a little server-side pubsub neatening up</li>
<li>when importing via dialog, there is now a checkbox to ignore subdirectories</li>
<li>Added a quick readme.txt in the base_dir for people who choose to extract rather than install. (Everyone should check out the help at least once)</li>
</ul>
<li><h3>version 3->6 (never released)</h3></li>
<ul>
<li>after much feedback, completely rewrite db</li>
<li>general improvements to gui</li>
</ul>
<li><h3>version 2</h3></li>
<ul>
<li>general fixes and improvements</li>
</ul>
<li><h3>version 1</h3></li>
<ul>
<li>first true metadata beta</li>
<li>shit actually works</li>
</ul>
<li><h3>versions 0.91 -> 0.99</h3></li>
<ul>
<li>move to python and wx, and an application- rather than browser-based model</li>
<li>building on concepts</li>
<li>scrapping p2p, turning to client-server</li>
</ul>
<li><h3>early versions of beta</h3></li>
<ul>
<li>made db, playing around with LAMP</li>
<li>an initial p2p framework started</li>
</ul>
</ul>
</div>
</body>
</html>

BIN
help/client_autism.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 KiB

BIN
help/client_autism_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
help/client_auto.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

BIN
help/client_auto_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
help/client_database_diagram.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

BIN
help/client_empty.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
help/client_empty_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
help/client_fullscreen.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

BIN
help/client_fullscreen_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

24
help/contact.html Executable file
View File

@ -0,0 +1,24 @@
<html>
<head>
<title>contact</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>contact and links</h3>
<p>Please send bug reports straight to my email or hydrus messaging account. Also welcome are your ideas and otherwise comment.</p>
<p>I don't really do chat, and I don't get caught up in the social stuff on twitter/tumblr. If you want to tell me something, please just send me a mail. I like to spend a day or so to think before replying to non-urgent emails, but I do reply to everything.</p>
<p>If you have a problem with something on someone's file repository, please, <span class="warning">do not come to me</span>, as I can in no way help with your problem. If your ex-gf's nudes have leaked onto the internet, or you find something terribly offensive, or you just plain hate the free flow of information, I cannot help you at all.</p>
<p>Anyway:</p>
<ul>
<li><a href="mailto:hydrus.admin@gmail.com">email</a></li>
<li><a>93b3474a5c15cbc36838ae4425cd51669dd28e7231880bb1d6d6444723d7b81a@98.214.1.156:45873</a> (this should be preloaded when you install the client)</a></li>
<li><a href="http://hydrus.x10.mx/forum/">forum</a></li>
<li><a href="http://hydrus.tumblr.com/">tumblr</a> (<a href="http://hydrus.tumblr.com/rss">rss</a>)</li>
<li><a href="http://twitter.com/hydrusnetwork">twitter</a> (<a href="http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=hydrusnetwork">rss</a>)</li>
</ul>
<p>I try to make my work <a href="http://en.wikipedia.org/wiki/Project_triangle">good and cheap</a>. As a result, I am not very fast. Whenever I say 'x should be done within a week', please don't believe my optimism.</p>
</div>
</body>
</html>

BIN
help/contacts.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
help/content_post_update.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
help/content_pre_update.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
help/custom_filter_child.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
help/custom_filter_parent.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

16
help/db_diagrams.html Executable file
View File

@ -0,0 +1,16 @@
<html>
<head>
<title>database diagrams</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>database diagrams</h3>
<p>I have included SQLite Studio with the releases so you can better understand, if you are so interested, how the programs work. You can drag a .db file straight onto the exe and it will open up for browsing.</p>
<p>Here are current diagrams for the databases. They are not strict UML, just a general guide. I refer to them while coding, so I thought I might as well include them here.</p>
<p><img src="client_database_diagram.png" /></p>
<p><img src="server_database_diagram.png" /></p>
</div>
</body>
</html>

BIN
help/dc_devil.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

23
help/depots.html Executable file
View File

@ -0,0 +1,23 @@
<html>
<head>
<title>message depots</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>how the hydrus network sends messages</h3>
<p>Message depots mix hydrus's standard access key authentication with cryptograhic principles to store clients' messages privately. They work a little like repositories, except anyone can upload data, and they do so anonymously.</p>
<p>All a message depot knows about its users are their public keys and which encrypted messages are for them. It does not know their private keys, and cannot decrypt the messages it stores.</p>
<p>I have made the encryption work as best as I can, but it is a very difficult problem to get cryptography 100% correct. I use AES-256 and RSA-2048 with a simple mostly-random-byte padding scheme and OAEP respectively, along with python's os.urandom() for the PRNG. I am fairly certain I have made no major errors, but I cannot guarantee that a dedicated and well financed attacker cannot defeat it. Please feel free to check my source code (HydrusMessageHandling.py) if you are so interested. If you would like to know more about cryptography, go check out <a href="http://en.wikipedia.org/wiki/Cryptography" title="See you in four hours!">wikipedia</a>. Hydrus uses both public-key and symmetric-key cryptography.</p>
<p>Contact keys are just sha256( PEM( public_key ) ).</p>
<p>I plan to extend this service to better guarantee anonymity; at the moment, it is trivial for someone to alter their server's source code to record IP addresses, so I will test onion-routing algorithms or similar in future.</p>
<p>Here are some diagrams:</p>
<p><img src="message_sync_1.png" /></p>
<p><img src="message_sync_2.png" /></p>
<p><img src="message_sync_3.png" /></p>
<p><img src="message_sync_4.png" /></p>
<p>There is a little more to it (applying statuses to a message), but I have only half-implemented it. I shall flush out the description once it is done.</p>
</div>
</body>
</html>

BIN
help/downloads.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
help/dumping.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 KiB

BIN
help/edit_repos_file_repo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
help/example_convo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
help/example_lib.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

72
help/faq.html Executable file
View File

@ -0,0 +1,72 @@
<html>
<head>
<title>faq</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<a name="repositories"><h3>hold up, what is a repository?</h3></a>
<p>A <i>repository</i> is a special kind of server in the hydrus network that stores a certain kind of information—files or tag mappings, for instance—as submitted by users all over the internet. Those users periodically synchronise with the repository so they know what it stores. Hydrus network clients never send queries to repositories; they download and cache <i>all</i> of a repository's searchable metadata and perform queries over that cache, locally, on the client's computer.</p>
<a name="tags"><h3>hold up, what is a tag?</h3></a>
<p><a href="http://en.wikipedia.org/wiki/Tag_(metadata)">wiki</a></p>
<p>A <i>tag</i> is a small bit of text describing a single property of something. They make searching easy. Good examples are "flower" or "nicolas cage" or "the sopranos" or "2003". By combining several tags together ( e.g. [ 'tiger woods', 'sports illustrated', '2008' ] or [ 'cosplay', 'the legend of zelda' ] ), a huge image collection is reduced to a tiny and easy-to-digest sample, usually in less than a second.</p>
<p>A good word for the connection of a particular tag to a particular file is <i>mapping</i>.</p>
<p>In the hydrus network, all tags are automatically converted to lower case. 'Sunset Drive' becomes 'sunset drive'. Why?</p>
<ol>
<li>Although it may at first seem preferable to have proper capitalised titles, like 'The Lord of the Rings' rather than 'the lord of the rings', there are many, many special cases where style guides differ. There is no definitive correct capitalisation schema, so the simplest compromise is to not have any.</li>
<li>Searches become far easier when case is not matched. And when case does not matter, what point is there in recording it?</li>
</ol>
<p>Secondly, leading and trailing whitespace is removed, and multiple whitespace is collapsed to a single character. <pre>' yellow dress '</pre> becomes <pre>'yellow dress'</pre></p>
<p><a href="asolutionthatmaximisesutility.gif">Does this unjust censorship frustrate you?</a></p>
<a name="filenames"><h3>why not use filenames and folders?</h3></a>
<p>As a retrieval method, filenames and folders become worse and worse as the number of files increases. Why?</p>
<ul>
<li>A filename is not unique; did you mean this "04.jpg" or <i>this</i> "04.jpg"? Perhaps "04 (3).jpg"?</li>
<li>A filename is not guaranteed to describe the file correctly, nor is it proofed against trolling, e.g. hello.jpg</li>
<li>A filename is not guaranteed to stay the same, meaning other programs cannot rely on the filename address being valid or even returning the same data every time. This is the cause of a ton of behind-the-scenes and often redundant reindexing that slows nearly all other media management programs.</li>
<li>A filename is often—for <i>ridiculous</i> reasons—limited to a certain prohibitive character set; even when utf-8 is supported, some arbitrary ascii characters are usually not, and different localisations, operating systems and formatting conventions only make it worse.</p>
<li>Folders can offer context, but they are clunky and time-consuming to change. If you put each chapter of a comic in a different folder, for instance, reading several volumes in one sitting can be a pain. Nesting many folders adds navigation-latency and tends to induce less informative "04.jpg"-type filenames.</li>
</ul>
<p>So, the client tracks files by their <i>hash</i>.</p>
<p><i>BTW: when exporting files, the client names them by their hexadecimalised hash, like so: f099b5823f4e36a4bd6562812582f60e49e818cf445902b504b5533c6a5dad94.jpg. This will probably change to tag-munged in future.</i></p>
<p>Please do not tag your files with their exact original 'filename.jpg' on my public tag repo. <a href="http://www.youtube.com/watch?v=_yYS0ZZdsnA">Shed the concept of filenames as you would chains.</a></p>
<a name="hashes"><h3>hold up, what is a hash?</h3></a>
<p><a href="http://en.wikipedia.org/wiki/Hash_function">wiki</a></p>
<p>Hashes are a subject one usually has to be a software engineer to find interesting. If you don't care to digest the wiki page, the simple answer is that hashes are guaranteed unique names for things. It can be proven that f099b5823f4e36a4bd6562812582f60e49e818cf445902b504b5533c6a5dad94 refers to one particular file and no other. Hashes make excellent—if ugly—identifiers. In the client's normal operation, you will never encounter a file's hash; if you like a thumbnail, double-click it; the software handles the mathematics.</p>
<p><i>For those who </i>are<i> interested: hydrus uses SHA-256, which spits out 32-byte (256-bit) hashes. The software stores and searches over the hash densely, as 32 bytes, only encoding it to 64 hex characters when the user views it or copies to clipboard. SHA-256 is not perfect, but it is a great compromise candidate; it is secure for now, it is reasonably fast, it is available for most programming languages, and newer CPUs perform it more efficiently all the time. Maybe when NIST decides on the SHA-3 winner we will have a grand switch over.</i></p>
<a name="access_keys"><h3>hold up, what is an access key?</h3></a>
<p>The hydrus network's repositories do not use username/password, but instead a single combination identifier-password like this: <i>7ce4dbf18f7af8b420ee942bae42030aab344e91dc0e839260fcd71a4c9879e3</i></p>
<p>These hex numbers give you access to a particular account on a particular repository. They are long enough to be impossible to guess, and also randomly generated, so they reveal nothing personally identifying about you. Many people can use the same access key (and hence the same account) on a repository without consequence, although they will have to share bandwidth limits, and if one person screws around and gets the account banned, they will all lose access.</p>
<a name="other_platforms"><h3>why shouldn't I use a more mature platform?</h3></a>
<p>Some applications like ACDSee try to make finding files easier than browsing explorer, but they are all-too-often:</p>
<p>
<ul>
<li>weighed down by noob-friendly 'features'</li>
<li>lacking any easy and open method of sharing files or tags</li>
<li>proprietary, untrustworthy, and expensive</li>
<li>good at one specific job, but only that</li>
<li>cluttered with inefficient database code, and perpetual reindexing</li>
<li>designed by people who think the internet is AOL.com</li>
</ul>
</p>
<p>Some websites like flickr and danbooru have crowd-sourced tags and offer fairly effective retrieval, but then <i>they</i> all-too-often have:</p>
<p>
<ul>
<li>choked bandwidth/server CPU</li>
<li>high search latency</li>
<li>degraded image quality</li>
<li>small results sets (e.g. 12 results to a page)</li>
<li>arbitrary obscenity rules</li>
<li>intrusive advertisement</li>
<li>unreliable access</li>
<li>uncertain privacy</li>
</ul>
</p>
<p>The hydrus network attempts to combine the privacy and low latency of local searching with the efficiency of crowd-sourcing.</p>
<a name="delays"><h3>why can my friend not see what I just uploaded?</h3></a>
<p>The repositories do not work like conventional search engines; it takes a short but predictable while for changes to propagate to other users.</p>
<p>Remember that the client's searches only ever happen over its local cache of what is on the repository. Those caches are updated about once a day, so any changes you make will be delayed for others until their next update occurs. At the moment, the update period is 100,000 seconds, which is about 1 day and 4 hours.</p>
</div>
</body>
</html>

BIN
help/file_sync_1.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
help/file_sync_2.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
help/file_sync_3.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
help/file_sync_4.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
help/file_sync_5.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
help/file_sync_6.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

54
help/future.html Executable file
View File

@ -0,0 +1,54 @@
<html>
<head>
<title>ideas for the future</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>ideas for the future</h3>
<ul>
<li>date parsing and more</li>
<li>drag and drop export, which got easier since I change the db</li>
<li>client file-sync over several computers</li>
<li>ssl</li>
<li>i gotta rewrite the db access sometime, to make it mono-threaded</li>
<li>*booru searching and downloading</li>
<li>session management, so access keys are not thrown about so much</li>
<li>(given session management) http login form or background javascript so browsers can load images straight from a file repo</li>
<li class="lololol">develop Hydrus CopyScan Technology&trade;&reg; to ensure no one ever ever violates copyright law&reg;, ensuring intellectual property jobs stay in America, #1!</li>
<li>better download management</li>
<li>UPnP for auto-NAT traversal</li>
<li>(optional) key regen, so users can change the key their account is linked to</li>
<li>cleverer downloads, with http resume (setting up support for larger, non-image files)</li>
<li>better and more granular pending management (I've done this for tags, now need to do files)</li>
<li>download rules (a bit like rss), so certain-tagged and -propertied files are automatically downloaded</li>
<li>messaging system, so users can talk to admins (and perhaps vice-versa)</li>
<li>hierarchical sync, so lib can sync files/tags from another version of lib</li>
<li class="lololol">compiling statistics on users' files and submitting to a central repository, access to which I can sell to advertisers and market research groups</li>
<li>more view types, not just a grid of thumbs</li>
<li>mouse gestures? wx seems to support them, but I don't know how good they are</li>
<li>completely bug-free animated gif rendering (lol, not likely)</li>
<li>tag synonyms</li>
<li>text (as in documents) support and display, maybe through web browsers looking at a local lib server or plugged-in web browser tech. not sure yet</li>
<li>And much, much, more! My to-do list is perpetually overfull.</li>
</ul>
<h3>a looooong way into the future</h3>
<ul>
<li>audio</li>
<li>efficiently-packed short animations with synched audio (noisy gifs)</li>
<li>video</li>
<li>3d models</li>
<li>other social stuff</li>
</ul>
<h3>never going to happen</h3>
<ul>
<li>give you up</li>
<li>let you down</li>
<li>facebook integration</li>
<li>in-software advertisements/spyware/bonzi buddy</li>
<li>making things noob-friendly at functionality's expense</li>
</ul>
</div>
</body>
</html>

130
help/getting_started_files.html Executable file
View File

@ -0,0 +1,130 @@
<html>
<head>
<title>getting started - files</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<p><a href="introduction.html"><--- Back to the introduction</a></p>
<h3 class="warning">a warning</h3>
<p class="warning">This is the real internet, not babby AOL. The hydrus client gives you the power to screw up your life. If you want to do private sexy slideshows of your shy wife that's fine, but don't upload the pictures anywhere you don't absolutely trust and don't give them public tags that'll identify anyone. It is <b>impossible</b> to contain leaks of private information.</p>
<h3>the problem</h3>
<p>If you have ever seen something like this—</p>
<p><img src="pictures.png" title="After a while, I started just dropping everything in here unsorted. It would only grow, hungry and untouchable." /></p>
<p>—then you already know the problem: using a filesystem to manage a lot of images sucks.</p>
<p>Finding the right picture within a minute can be difficult. Finding all those by a particular artist or of a particular resolution within any reasonable time limit can be impossible. Adding new files into the whole mess is a further pain, and most operating systems bug out displaying folders with > 10,000 images.</p>
<h3>so, what does the hydrus client do?</h3>
<p>Let's first focus on storing and sharing files.</p>
<p>On booting the client for the first time, you will be faced with a blank screen and little idea of what to do next. I advise you simply drag-and-drop a folder with a hundred or so images onto the main window. After a little parsing, a dialog will appear affirming what you want to import. Ok that and a new page will open. Thumbnails will stream in as the software processes each file.</p>
<p><a href="import.png"><img src="import.png" width="683" height="384" /></a></p>
<p>The files are being imported into the client's database. <a href="faq.html#filenames">The client discards their filenames.</a></p>
<p>Notice your original folder and its files are untouched. You can move the originals somewhere else, delete them, and the client will still return searches fine. In the same way, you can delete from the client, and the original files will remain unchanged; import is a <b>copy</b>, not a move, operation. The client performs all its operations on its internal database. If you find yourself enjoying using the client and decide to completely switch over, you may delete the original files you import without worry. You can always export them back again later (albeit with different filenames).</p>
<p>Now:</p>
<ul class="bulletpoint">
<li>Click on a thumbnail; see what happens. Now double- or middle-click it to go fullscreen, then mouse-scroll or page up and down a bit, and double/middle-click again. Hitting Enter/Return on a focussed file does the same thing.</li>
<li>Try shift- or ctrl- selecting several files, and notice how the status bar at the bottom of the screen changes. Right click your selection.</li>
<li>Hit F9 to bring up a new page chooser. It won't show much right now, because you are just started. You can navigate it with the arrow keys, your numpad, or your mouse.</li>
<li>
<p>On the left of a normal 'file search' page is a text box with a large pop-up dropdown. It looks like this:</p>
<p><img src="autocomplete_dropdown_overlay.png" /></p>
<p>This is the autocomplete tag entry. It is where you put in the predicates to do a search. The dropdown window only appears when the text box is focussed. If the text box is empty, it will show a number of 'system' tags that let you search by non-tag metadata such as file size or animation duration. Typing in the text box will, when you have some tags in your database, show the tags that begin with whatever you type. The following (number) shows how many files have that tag, and hence how large the search result will be if you select that tag. You can scroll the dropdown list with the arrow keys or ctrl + scrollwheel, and then hit enter or just double click on a tag to enter it into the current search.</p>
<p>There are also several buttons to play with:</p>
<ul class="bulletpoint">
<li><b>include current/pending tags</b> - will determine whether the autocomplete results (and their counts) will be harvested from tags that currently exist, and/or the tags that are waiting to be sent to a service (more on this in <i>getting started with tags</i>).</li>
<li><b>searching immediately</b> - determines whether new searches will be performed as soon as you add or remove a search predicate, or whether the client will wait until you hit the button again. This is useful if you have a complicated query and don't want to wait for the search with every step.</li>
<li><b>file repository/tag repository</b> - determines the search domain for the autocomplete tags. Selecting 'all known files/tags' will union all known file or tag services together. Be careful selecting both 'all known files' and 'all known tags', as queries (and even just the dropdown!) will be delayed!</li>
</ul>
</li>
<li>Once you are happy with the dropdown, try hitting 'system:size', and maybe change the resultant dialog's &lt; to &gt; or the 100KB to 1MB.</li>
<li>You can remove from the list of 'active tags' above with a double-click, or by entering the same tag again through the dropdown.</li>
<li>Play with the system tags more if you like, and the sort-by dropdown. The collect-by dropdown (which collects by certain tags) will only do things if your files have appropriate tags.</li>
<li>To close a page's tab, middle click it.</li>
</ul>
<p>The client currently supports the following mimetypes:</p>
<ul>
<li><b>image/bmp</b> (.bmp - converted to image/png on import)</li>
<li><b>image/gif</b> (.gif)</li>
<li><b>image/png</b> (.png)</li>
<li><b>image/jpeg</b> (.jpg)</li>
<li><b>application/x-shockwave-flash</b> (.swf)</li>
<li><b>video/x-flv</b> (.flv)</li>
</ul>
<p>The client can also download files from several websites, including 4chan, many boorus, and gallery sites like deviant art. The different options are under F9->download.</p>
<p><a href="downloads.png"><img src="downloads.png" width="683" height="384" /></a></p>
<p>Most of them have similar interfaces. Paste the url or type the query your are interested in, and press enter.</p>
<p><a href="faq.html#filenames">FAQ: why not use filenames and folders?</a></p>
<h3>inbox and archiving</h3>
<p>the client sends newly imported/downloaded files to an <b>inbox</b> so you may more easily decide what to do with them. Inbox acts like a tag, matched by 'system:inbox'. A small envelope icon is drawn in the top corner of all inbox files.</p>
<p>If you are sure you want to keep a file long-term, you should <b>archive</b> it, which will remove it from the inbox. You can archive from your selected thumbnails' right-click menu, or by pressing F7.</p>
<p>Anything you do not want to keep should be deleted.</p>
<p>A quick way of doing this is—</p>
<h3>filtering</h3>
<p>Lets say you just downloaded a good thread, or perhaps you just imported an old folder of miscellany. You now have a whole bunch of files in your inbox—some good, some awful. You probably want to quickly go through them, saying <i>yes, yes, yes, no, yes, no, no, yes</i>, where <i>yes</i> means 'keep and archive' and <i>no</i> means 'delete this trash'. <b>Filtering</b> is the solution.</p>
<p>Select some thumbnails, and either choose filter from their right-click menu or hit F12. You will see this selection in fullscreen, with the following controls:</p>
<ul>
<li>Left-click, space, or F7: <b>keep and archive the file, move on</b></li>
<li>Right-click or delete: <b>delete the file, move on</b></li>
<li>Arrow key up: <b>Skip this file, move on</b></li>
<li>Middle-click or backspace: <b>I didn't mean that, go back one</b></li>
<li>Escape, return, or F12: <b>stop filtering now</b></li>
</ul>
<p>When done, you will be asked whether you want to commit your choices, forget them, or go back to filtering the current file.</p>
<p>Filtering saves time.</p>
<p>I have plans to make a filtering-like system to speed up certain kinds of tagging. Your thoughts would be appreciated.</p>
<h3>exporting and uploading</h3>
<p>There are many ways to export files from the client:</p>
<ul>
<li>
<p><b>raw export</b></p>
<p>Right clicking some files and selecting 'export all' will copy all those files from the database to your export folder, which is set in <i>file->options</i> and easily accessed in <i>file->open export folder</i>.</p>
<p>The files will have ugly filenames. It is on my to-do list to make them better, perhaps tag-based.</p>
<p>This is an ugly operation, but it is quick. It is best when you want to mass-export many thousands of files.</p>
</li>
<li>
<p><b>copy->copy all</b></p>
<p>Right clicking some files and selecting 'copy all' from the copy submenu will export the files to a temporary folder and copy their paths to your clipboard. You can then paste them wherever you like, just as with normal files. They will have the same ugly filenames as with a normal export.</p>
<p>This is a very quick operation, and can also be triggered by hitting Ctrl+C. It is best when you want to export just a few files somewhere for a temporary job.</p>
</li>
<li>
<p><b>copy->hash/hashes</b></p>
<p>Right clicking some files and selecting 'copy hash/hashes' will copy the files' unique identifiers to your clipboard.</p>
<p>You will not have to do this often. It is best when you want to tell someone else about a number of files without giving them the files.</p>
</li>
<li>
<p><b>copy->copy path/local url</b></p>
<p>Right clicking any file and selecting 'copy path' will copy the file's raw database path (install_path/db/client_files/[hash]) to your clipboard. 'copy local url' does the same, but with a localhost url in the form http://127.0.0.1:45865/file?hash=[hash].</p>
<p>These are most useful when you want to send a single file to another program. You can copy either of these addresses into a file open dialog like so:</p>
<p><a href="upload.png"><img src="upload.png" width="960" height="600" /></a></p>
<p>This works for file upload, opening a file in a graphics editor, or whatever. You can also paste into your browser's address bar, to check they are working.</p>
<p>The path method will always work, the url method will only work while the client is running.</p>
<p>The path method will send the file's hash as the filename, the url method will send something odd like file[7].</p>
<p>The path method will change your current working directory to your client's db directory (possibly annoying, if you have a lot of files), the url method will change your current working directory to temporary internet files.</p>
<p>I generally recommend you go with the url method.</p>
<p>If you use the path method to open a file inside an image editing program, try to remember to go 'save as' and give it a new filename! The client does not expect files inside its db directory to change.</p>
</li>
<li>
<p><b>dumping to imageboard</b></p>
<p>Right clicking some files and selecting 'dump all' will let you mass-dump them to an imageboard. You'll be asked which board you want to dump to and then taken to a new page:</p>
<p><a href="dumping.png"><img src="dumping.png" width="960" height="600" /></a></p>
<p>If you have a 4chan pass, you can authenticate the client in <i>services->manage 4chan pass</i>. Any new dump pages will no longer show the captcha window.</p>
<p>The client comes with all of 4chan's boards pre-configured. If you feel very brave and confident of your html-form-parsing skills, go <i>services->manage imageboards</i> and try to add some new sites.</p>
</li>
</ul>
<h3>sharing files</h3>
<p>The hydrus network has a service that lets clients share files anonymously, called a <i>file repository</i>.</p>
<p>It simply stores files in a big pool. Anyone who has an access key to the repository can see the pool's thumbnails and download anything they like. They may have permission to to upload to it as well. Admins can delete. I run a download-only file repository, which you are welcome to connect to to get a feel for the interface. Go <i>services->add, remove or edit services</i>.</p>
<p><img src="edit_repos_file_repo.png" /></p>
<ul><li>8f8a3685abc19e78a92ba61d84a0482b1cfac176fd853f46d93fe437a95e40a5@98.214.1.156:45872</li></ul>
<p>Then go <i>services->review services</i> to see your client synchronise with the repository's file list.</p>
<p><img src="review_services.png" /></p>
<p>Hit F9, and you'll see a new "files->" page. It works exactly like a local search, it just uses a different file list. Files you do not have will be drawn with a dark background, those you do will be drawn as normal:</p>
<p><a href="lib_rec.png"><img src="lib_rec.png" width="683" height="384" /></a></p>
<p>To download a file, double- or middle-click it, or select from the right click menu.</p>
<p>If you have permission to upload files to a particular repository, that option will appear in the right-click menu for any local files. Selecting this will pend them for batch uploading; just select from the new <i>pending</i> menu to effect the upload when you are ready.</p>
<h3>lastly</h3>
<p>The hydrus client is not an image-editing program, nor is it particularly intended for half-finished images. Think of it as a giant archive, a library, for everything excellent you have decided to store away.</p>
<p class="right"><a href="getting_started_tags.html">Now let's learn about tags! ----></a></p>
</div>
</body>
</html>

View File

@ -0,0 +1,56 @@
<html>
<head>
<title>getting started - messages</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<p><a href="getting_started_tags.html"><--- Back to ratings</a></p>
<h3 class="warning">messaging, you say?</h3>
<p class="warning">This is somewhat prototype. I am actively working on improving it all right now.</p>
<p class="warning">Secondly: I use encryption to protect your privacy. Although I am confident my code is mostly good, cryptography is <i>really difficult</i> to get 100% right. I use the right random number generator and key lengths and everything, but don't work under the assumption a dedicated and well funded attacker will never be able to break what I have done. I can guarantee your guildmaster will not be able to read your messages, not the NSA. Don't Do Drugs&#8482;.</p>
<h3>ok, let's messaging</h3>
<p>With the aid of a service called a <i>message depot</i>, the clients can send messages to one another.</p>
<p>A message depot is a bit like an IMAP email server. It has a number of contacts registered with it, and any client who knows those contacts can upload messages to it. A client can have many contacts (you can be several different people on the same computer), and a contact many clients (you can be the same person on several different computers). Clients check their appropriate message depots regularly, and download any new messages.</p>
<h3>how is it different from email?</h3>
<p>All hydrus network messages are stored on the message depots in an encrypted format, and <i>only</i> the recipient's client(s) have the key to decrypt them. If someone hacks/steals/whatever a message depot, they cannot read the messages, nor tell who they are from.</p>
<p>Messages are verifiable, meaning the client knows for sure if they came from who they say they did.</p>
<p>A client can send messages anonymously. These messages cannot (right now) be replied to.</p>
<h3>adding contacts</h3>
<p>First, let's discern a couple differences:</p>
<ul>
<li>contact: <b>An address that can send and recieve messages.</b></li>
<li>identity: <b>A contact you control.</b></li>
</ul>
<p>The dialog under <i>services->manage contacts and identities</i> lets you add new contacts.</p>
<p><img src="contacts.png" /></p>
<p><i>add manually</i> lets you enter the information in each field, while <i>add by contact address</i> grabs the public key from the server for you after you put in the contact_key@host:port. If you do add manually, make sure you copy the public key <i>very</i> carefully, and check the resultant contact key is correct; if your OS converts newlines incorrectly, it'll all go wrong!</p>
<p>Your identities are listed here (and you can rename them), but you do not create them here.</p>
<h3>how do i create a new identity?</h3>
<p>If you want to send messages as anything other than Anonymous, you need an access key at a message depot. The access key is not the same as your eventual contact key; the first gives you access, the second is how people's clients will identity you. They are both random numbers.</p>
<p><a href="server.html">Creating</a> or adding a message depot works exactly the same as for any other type of service.</a> When you add it, the client will do some heavy math in the background, which should freeze the interface for a few seconds. This is it generating the contact's <i>private key</i>, which is the secret that lets it decrypt messages.</p>
<p><img src="manage_services_edit_message_depot.png" /></p>
<p class="warning">If you want to use the same identity with several clients, don't try to add the service in the usual way on your extra clients, or they will generate their own private keys, overwriting each other! Instead, export the message depot from <i>services->add, remove or edit services</i> on the first client, and import (drag and drop the .yaml file onto the dialog) into the second, third, whatever client. This will copy the original private key across without any errors.</p>
<p>When you are done, the 'messages' F9 menu will show your new identity.</p>
<p>If you want to share your identity, you can either send people your contact_key@host:port, or you can just message them, which will add you to their contacts automatically.</p>
<h3>composing messages</h3>
<p>Composing messages is easy. Just hit the button on your messages page. The 'recipients can see each other' checkbox does email's cc vs bcc.</p>
<p>I will add file attachments in future.</p>
<h3>finding messages</h3>
<p>The interface is just like searching for files. Put in a normal word to search message bodies/subjects, or use the system predicates to perform more complicated queries. Conversations that match will appear on the top right, and any selected convo will appear below.</p>
<p><a href="example_convo.png"><img src="example_convo.png" width=604 height=964/></a></p>
<p>You can hit F7 or delete or just right click on a conversation above to archive or delete it. Beside each message, you can see its current status with each recipient. If it says <i>failed</i>, you can click on it to retry, and if your identity is the recipient, you can switch between <i>read</i> and <i>unread</i>.</p>
<p>I will add:</p>
<ul>
<li>rich text</li>
<li>file attachments</li>
<li>custom status</li>
<li>auto-adding of new messages</li>
<li>live times (3 mins 21 seconds ago auto-updating)</li>
</ul>
<p>in future.</p>
<p class="right"><a href="index.html">Go back to the index ---></a></p>
</div>
</body>
</html>

View File

@ -0,0 +1,51 @@
<html>
<head>
<title>getting started - ratings</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<p><a href="getting_started_tags.html"><--- Back to tags</a></p>
<p class="warning">This is all prototype! I'm still working on this document! The network will soon support remote, collaborative ratings!</p>
<h3>what is the difference between tags and ratings?</h3>
<p>To rate a file qualitatively, to say that it is funny or sexy or a wallpaper, tags are the tool to use. To rate a file quantitatively, to say that it is 3/5 stars or critically excellent or terrible, we use ratings.</p>
<p>The hydrus client supports two kinds of ratings: <i>like/dislike</i> and a <i>&#x2124; out of &#x2124; + n</i> numerical rating. Let's start with the simpler one:</p>
<h3>like/dislike</h3>
<p>For now, since the client only supports local ratings, this is not terribly useful! You can define it in the <i>services->add, remove or edit services</i> dialog like so:</p>
<p><img src="ratings_like.png" /></p>
<p>You can set the words for like or dislike as you like!</p>
<h3>&#x2124; out of &#x2124; + n</h3>
<p>This is just a clever way of saying something like 3 out of 5 stars or 8/10. This other rating system is a numerical, integer-only input (whole numbers only, no 3.5/5) based system. You can set the range however you like:</p>
<p><img src="ratings_numerical.png" /></p>
<p>You can change these limits at a later date, and the database will adjust existing ratings appropriately (3/5 will go to 6/10, 9/10 will go to 4.5/5).
<h3>now what?</h3>
<p>Once you are sorted with your services, you can edit ratings for one or more files with F4:</p>
<p><img src="ratings_dialog.png" /></p>
<p>If you hit F4 on one file, the dialog will show that file's ratings. If you hit F4 on several files, it'll try its best to show you a summary of all the files' ratings. When you set new ratings with this dialog, the ratings will be applied to all files.</p>
<h3>ratings filter</h3>
<p>If you would like to rate many files quickly, the client now lets you 'filter' them, like with the inbox/archive filter. You select it from some thumbnails' right-click menu as usual.</p>
<p><img src="ratings_menu.png" /></p>
<p>This will launch a new fullscreen window that will show already rated files beside the images you wish to rate:</p>
<p><img src="ratings_filter.png" /></p>
<p>Once it has exhausted currently rated files, it will try to compare the unrated files with each other. The current controls are:</p>
<ul>
<li>Arrow key left or left mouse button: <b>the left image is better</b></li>
<li>Arrow key right or right mouse button: <b>the right image is better</b></li>
<li>Arrow key down or middle mouse button: <b>the files are about equal</b></li>
<li>Arrow key up or space: <b>skip decision, and show another random comparison</b></li>
<li>Backspace: <b>I didn't mean that, go back one</b></li>
<li>Escape or return: <b>stop filtering now</b></li>
</ul>
<p>Every small decision you make will give the client another clue about how good a file is; e.g. if you say a file is better than a 7/10 file, it must be either 8/10, 9/10 or 10/10. The client will later show you a file in this range to narrow it down further.</p>
<h3>so, what now?</h3>
<p>Ratings will show in the preview screen and fullscreen views, like so:</p>
<p><img src="ratings_preview.png" /></p>
<p>You can search with system:rating, and sort in the normal manner:</p>
<p><img src="ratings_sort.png" /></p>
<p>And that's it! Remote ratings will make this a _little_ more complicated, but not much.</p>
<p class="right"><a href="getting_started_messages.html">Read about messaging ---></a></p>
<p class="right"><a href="index.html">Go back to the index ---></a></p>
</div>
</body>
</html>

49
help/getting_started_tags.html Executable file
View File

@ -0,0 +1,49 @@
<html>
<head>
<title>getting started - tags</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<p><a href="getting_started_files.html"><--- Back to files</a></p>
<h3>how do we find files?</h3>
<p>So, we have stored our images and .swfs in a large database. Everything is hashed and cached. We can sort by inbox and resolution and size and a bunch of other quantitative metadata, but if we want to differentiate qualitatively, we shall have to use tags.</p>
<p><a href="faq.html#tags">FAQ: hold up, what is a tag?</a></p>
<p class="warning">The client starts with a 'local tags' service, which stores tags only on your client's database, where only you can see them. This is useful, and you should keep it in mind for specific jobs as you read the rest of this page, but please do not try to tag everything you own by yourself; unless you have a tiny collection, it will take you hundreds of hours, and your time is better spent helping build tag collections with other people.</p>
<p>In order to share tags with others, you must connect to at least one tag repository. You can create your own, if you like, and share access with whoever you like. I run a public tag repository, which you are very welcome to access and contribute to:</p>
<p><img src="edit_repos_public_tag_repo.png" /></p>
<ul><li>4a285629721ca442541ef2c15ea17d1f7f7578b0c3f4f5f2a05f8f0ab297786f@98.214.1.156:45871</li></ul>
<p>Tags are rich, cpu-intensive metadata, and it will take a few minutes for the repository to synchronise completely. The client will lag a little as it processes each update. You can watch its progress in the <i>services->review services</i> dialog as usual.</p>
<h3>now let's find some files</h3>
<p>Once you are all set up, you start to type in a tag, and the autocomplete dropdown will offer suggestions for you:</p>
<p><a href="hidamari_ac.png"><img src="hidamari_ac.png" width="683" height="384" /></a></p>
<p>Press up/down and enter to select, or double click with your mouse. Play with the buttons to see how they change your queries.</p>
<p><a href="hidamari.png"><img src="hidamari.png" width="683" height="384" /></a></p>
<p>More tags will narrow a search:</p>
<p><a href="hidamari_miyako.png"><img src="hidamari_miyako.png" width="683" height="384" /></a></p>
<p>Or, when prefixed with a hyphen, exclude:</p>
<p><a href="hidamari_exclude.png"><img src="hidamari_exclude.png" width="683" height="384" /></a></p>
<p>When you are more familiar with namespaces, sorting and collections, you can easily find and display whole books with just a few keystrokes:</p>
<p><a href="gunnerkrigg_chapter.png"><img src="gunnerkrigg_chapter.png" width="683" height="384" /></a></p>
<h3>creating tags</h3>
<p>Hit F3 on a selection of files to open up the tagging dialog.</p>
<p><a href="manage_tags.png"><img src="manage_tags.png" width="683" height="384" /></a></p>
<p>The dialog shows the <b>intersection</b> of the current selection's tags, and will add tags to/remove tags from the entire selection. Type a new tag and press enter to add it, double click an existing tag to remove it. You may be prompted to give a reason for removing a tag, which an administrator will review. Hit <i>Apply</i> and the changes will be pended for upload, just like with files. Use the <i>pending</i> menu when you are ready.</p>
<p>Please do not upload tags to my public tag repo until you get a rough feel for the <a href="tagging_schema.html">tag schema</a>, or just lurk until you get the idea. I am only interested in objective tags. If you don't like my guidelines, start your own tag repo!</p>
<p>You can be connected to more than one tag repository. Press the up or down arrow keys on an empty input to quickly jump between your repositories. Each repo's beliefs about which tags go with which files will be applied according to a certain precedence that you can edit in <i>services->manage tag service precedence</i>.</p>
<p><a href="faq.html#delays">FAQ: why can my friend not see what I just uploaded?</a></p>
<h3>typical usage</h3>
<p>I find the following import-cycle works well for me:</p>
<ul>
<li>import anything in my downloaded images folder</li>
<li>filter a few hundred from my inbox</li>
<li>go system:archive, system:numtags<4 and tag some stuff</li>
<li>upload pending tags</li>
<li>feel good about myself</li>
</ul>
<p class="right"><a href="getting_started_ratings.html">Read about ratings ---></a></p>
<p class="right"><a href="index.html">Go back to the index ---></a></p>
</div>
</body>
</html>

26
help/glossary.html Executable file
View File

@ -0,0 +1,26 @@
<html>
<head>
<title>glossary</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<p><b>access key</b> A 32-byte identifier-password that gives you certain permissions with a repository. Usually represented as a 64-character hex string like so: 7ce4dbf18f7af8b420ee942bae42030aab344e91dc0e839260fcd71a4c9879e3</p>
<p><b>address</b> The pairing of both a server's host (be that an IP or a domain) with its port number, like so: 74.125.225.18:80, or google.com:80</p>
<p><b>archive</b> The store of files you have chosen to keep.</p>
<p><b>file repository</b> A service in the hydrus network that hosts files.</p>
<p><b>filtering</b> A method of quickly deleting and archiving files within the client.</p>
<p><b>hash</b> A file's unique identifier. The hydrus network uses SHA-256.</p>
<p><b>hydrus client</b> An application that manages media and connects to services on the hydrus network.</p>
<p><b>hydrus network</b> A loose collection of servers that attempt to make media management and distribution easier.</p>
<p><b>inbox</b> A special tag the client gives to newly imported and downloaded files to make them easier to find and review.</p>
<p><b>mapping</b> The pairing of a particular file with a particular tag.</p>
<p><b>message depot</b> A service in the hydrus network that stores messages.</p>
<p><b>metadata</b> Information <i>about</i> a file, but not stored within the file. Filename, size, hash, modified dates, tags and location are all good examples.</p>
<p><b>petition</b> A request from an uploader for particular content to be removed from a repository.</p>
<p><b>tag</b> A short string of text describing a file.</p>
<p><b>tag repository</b> The service in the hydrus network that hosts mappings.</p>
</div>
</body>
</html>

BIN
help/gunnerkrigg_chapter.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

BIN
help/gunnerkrigg_import.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
help/gunnerkrigg_page.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

BIN
help/gunnerkrigg_volume.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
help/hidamari.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 KiB

BIN
help/hidamari_ac.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
help/hidamari_exclude.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 KiB

BIN
help/hidamari_miyako.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

BIN
help/hydrus.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
help/import.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 KiB

39
help/index.html Executable file
View File

@ -0,0 +1,39 @@
<html>
<head>
<title>hydrus help</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<a class="screenshot" href="client_empty.png" title="the main screen, just after you start up"><img src="client_empty_small.png" /></a>
<a class="screenshot" href="client_autism.png" title="an example search"><img src="client_autism_small.png" /></a>
<a class="screenshot" href="lib_gc.png" title="a well-tagged webcomic, sorted and viewed by chapter"><img src="lib_gc_small.png" /></a>
<a class="screenshot" href="client_fullscreen.png" title="reading the webcomic in fullscreen"><img src="client_fullscreen_small.png" /></a>
<a class="screenshot" href="lib_rec.png" title="file repository view, with some files local and some not"><img src="lib_rec_small.png" /></a>
<a class="screenshot" href="lib_party_hard.png" title="now with swf support!"><img src="lib_party_hard_small.png" /></a>
<a class="screenshot" href="client_auto.png" title="an example of tag-autocomplete, which only displays results applicable to the current query"><img src="client_auto_small.png" /></a>
<h3>hydrus help</h3>
<p>Although the hydrus software's interface attempts to be simple, its underlying concepts are not. Please read the introduction and skim the getting started guide at the least, and you'll probably want to check out the access keys section to get started with my server.</p>
<ul>
<li><a href="introduction.html">introduction and statement of principles</a></li>
<li><a href="getting_started_files.html">getting started with files</a></li>
<li><a href="getting_started_tags.html">getting started with tags</a></li>
<li><a href="getting_started_ratings.html">getting started with ratings</a></li>
<li><a href="getting_started_messages.html">getting started with messages</a></li>
<li><a href="access_keys.html">access keys to my server's services</a></li>
<li><a href="tagging_schema.html">thoughts on a public tagging schema</a></li>
<li><a href="advanced.html">advanced usage</a></li>
<li><a href="privacy.html">privacy</a></li>
<li><a href="server.html">setting up your own server</a></li>
<li><a href="running_from_source.html">running a client or server from source</a></li>
<li><a href="contact.html">developer contact and links</a></li>
<li><a href="future.html">ideas for the future</a></li>
<li><a href="updates.html">how the repositories synchronise</a></li>
<li><a href="depots.html">how the message depots work</a></li>
<li><a href="db_diagrams.html">database diagrams</a></li>
<li><a href="faq.html">faq</a></li>
<li><a href="glossary.html">glossary</a></li>
<li><a href="changelog.html">changelog</a></li>
</ul>
</body>
</html>

42
help/introduction.html Executable file
View File

@ -0,0 +1,42 @@
<html>
<head>
<title>introduction and statement of principles</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>on being anonymous</h3>
<p>I am convinced that anonymous speech is incredibly valuable to the modern development of free culture and society.</p>
<p>When people have no fear of personal repercussion, they reveal corruptions and admit truths they otherwise never would. Their words are insightful and stupid, convincing and hurtful, hilarious and ridiculous. Anons can discuss problems and collaborate on solutions without having to conform to laborious social norms. When they lie, it is usually less for vanity and more for fun.</p>
<p>Nearly all forums and social networking platforms use the same username/password archetype, and nearly all of them have the same problems with egotistical mods, sockpuppets, and drama. Everyone has a name to make and defend.</p>
<p>This is not to say that I believe in mandating anonymity; I think people should always have the <i>option</i> to be anonymous, and people should always have the choice to not view anonymously submitted material.</p>
<p>There are several online platforms that support anonymity, usually through a web browser, but most have terribly inefficient code, and their actual anonymity is often impotent window dressing, an afterthought. Collaboration is awkward and ephemeral.</p>
<p>I think we can do better.</p>
<h3>the hydrus network</h3>
<p>So! I'm developing a platform that helps people work together anonymously. My concern is in enabling you to do what you want. I don't want to record metrics on users, nor serve ads, nor charge for my software.</p>
<p>There are a number of new concepts, and it can get as complicated as you like. If you are totally new to it, I advise you start slow, go through the getting started guides, and experiment doing different things.</p>
<p>There is a server executable, which can run any of a number of different services I have designed, and a client application, which can plug into as many as you want (including none). I run a tag server that you are welcome to access and contribute to.</p>
<p>A <b>server</b> will have an address, such as 98.214.1.156 or hostname.net. A <b>service</b> hosted by that server will have a port, such as 45871. <b>Access keys</b> are non-identifing random numbers that grant a client certain permissions on a service. They look like this: 4a285629721ca442541ef2c15ea17d1f7f7578b0c3f4f5f2a05f8f0ab297786f.</p>
<p>Combining these three values like so:</p>
<ul><li>4a285629721ca442541ef2c15ea17d1f7f7578b0c3f4f5f2a05f8f0ab297786f@98.214.1.156:45871</li></ul>
<p>gives your client sufficient credentials to access and use the service. All the clients connecting to a particular service can collaborate on a particular problem, such as "Post funny pictures of dogs." or "Let's collect our cosplay pictures and tag them."</p>
<p>I call what I have made the <i>hydrus network</i>. Right now, the platform lets you collect and manage your images, then share those files, and any tags you give them, with other users anonymously. Clients can also communicate with each other, although this feature is prototype. I have much more <a href="future.html">planned</a>.</p>
<p>Here is a shot of the client, with a very general search:</p>
<p><a href="example_lib.png"><img src="example_lib.png" width="960" height="600" title="WELCOME TO INTERNET" /></a></p>
<h3>statement of principles</h3>
<p><i>Skip past this if you don't want to read some sanctimonious bullshit.</i></p>
<p>Anyone following internet news knows our rights are under constant attack. Some seriously bad dudes are very content to wreck others' lives for marginally larger slices of extremely inefficient political and economic markets. They are desperate to replace our net-liberty with old, ruinous broken systems. I personally don't think it is anyone else's business whether you search for queer pornography, religious iconography, or daisies. I have designed the hydrus network as such. I strongly believe that permitting anonymity makes for strong society.</p>
<p>I care about empowering you to do whatever you want with whatever you own, and I don't want anyone (including myself!) peeking in on it. Whenever someone wants your personal data and they don't <i>absolutely need it</i> to get their job done, you are about to get screwed. Your oddities will be measured and broadcast. Your vulnerability will be encouraged and leveraged. I think we are on the verge of some pretty cool stuff, and I reckon <i>Amazon, Facebook et al.</i> could well be some insidious runaway badness.</p>
<p>I think the internet works best where we have specialised servers run by different people (especially yourself!) doing specific jobs. One-stop-shops like your typical social network and the old Yahoo! and AOL portals are tepid at their best and promote biased ignorance at their worst. I very much admire the way irc has grown, for even though there are giant irc servers hosting countless channels, the standard is open and anyone can start their own server or write their own client with just a bit of brainpower. You can be anonymous and talk about whatever you like, or identified and talk about one particular subject politely, or any of the infinite combinations between. The people have the power. MediaWiki is similar: Don't like wikipedia? Make ED. Don't like OhI? Make ED.ch. Contrast this with the inflexibility of modern social networks. Or to how unreceptive large ISPs (who, these days, are nearly always also content providers) are to non-standard traffic.</p>
<p>My dream internet would have most users running their own servers. All their content and social media would be stored on and served from computers under their control. Their business would be no one else's.</p>
<p>Having said that, I use gmail and youtube just like pretty much everyone. But I would rather be using different systems, especially in ten years. No one seemed to be making what I wanted, so I decided to do it myself, and here we are.</p>
<p>Hand in hand with privacy goes free expression; I will never remove a mapping from my public tag repository because someone finds it not to their taste; I'll only grant petitions if they point to an objective error in tagging. Banning speech only makes a few ignorant more satisfied with their own fears. Please note that the guys running the file repositories might count as ISPs in their jurisdictions, so may have to bow to DMCA and whatever else is supposed to halt the tide. I wish I could have written the file repository to mandate IP-anonymity, but I can't, so I've given the individual administrators the option. They will likely make their own rules (e.g. no jb/cp, or 'copyrighted content') which you would be very wise to follow, or simple content guidelines ('This is a repository dedicated to slash of Hokuto no Ken. Only for fan-made MM images relating to Hokuto no Ken.') which you should not break if you want to keep your access key.</p>
<p>Another concern of mine is simple speed. If you want bells and whistles, go somewhere else. There will never be a skinnable client, nor one that posts your recent 'achievements' to some social network. I want rich queries that return thousands of results in moments. Easy navigation and sharing. No ads. That said, I realise I have zero aesthetic range, so if you are an artist/designer and the mood hits you, please do not shy from emailing me thoughts on usability or my diagrams or new icons or whatever.</p>
<p>I'd like to eventually set up a paypal/kickstarter-similar way for people to gibe moni plos, but it'll be totally voluntary.</p>
<h3>license</h3>
<p>These programs are free software. They come without any warranty, to the extent permitted by applicable law. You can redistribute them and/or modify them under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more details. Do what the fuck you want to, and if shit breaks, <span class="dealwithit">DEAL WITH IT</span>.</p>
<p class="right"><a href="getting_started_files.html">Happy? Go on to the getting started guide ----></a></p>
</div>
</body>
</html>

BIN
help/lib_gc.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

BIN
help/lib_gc_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
help/lib_party_hard.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
help/lib_party_hard_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
help/lib_rec.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 KiB

BIN
help/lib_rec_small.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
help/manage_tags.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

BIN
help/message_sync_1.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
help/message_sync_2.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
help/message_sync_3.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
help/message_sync_4.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

1067
help/messaging diagrams.svg Executable file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 90 KiB

10975
help/network diagrams.svg Executable file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 461 KiB

BIN
help/pictures.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

61
help/privacy.html Executable file
View File

@ -0,0 +1,61 @@
<html>
<head>
<title>privacy</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>privacy</h3>
<p>Repositories do not ever know what you are searching for. The client synchronises (copies) the repository's entire file or mapping list to its internal database, and does its own searches over those internal caches, all on your hard drive. <span class="warning">It <i>never</i> sends search queries outside your own computer, nor does it log what you do look for</span>. Your searches are your business, and no-one else's.</p>
<p>Repositories know nothing more about your client than they can infer, and the software usually commands them to forget as much as possible as soon as possible. Specifically:</p>
<table cellpadding="5" cellspacing="2" border="1">
<tr>
<td />
<th colspan="2">tag repository</th>
<th colspan="2">file repository</th>
</tr>
<tr>
<td />
<th>upload mappings</th>
<th>download mappings</th>
<th>upload file</th>
<th>download file</th>
</tr>
<tr>
<th>Account is linked to action</th>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>IP address is remembered</th>
<td>No</td>
<td>No</td>
<td class="warning">Maybe</td>
<td>No</td>
</tr>
</table>
<p>i.e:</p>
<p>
<ul>
<li>If you download anything from any repository, your accessing it will not be recorded. A running total of your approximate bandwidth and number of queries made for the current month <i>is</i> kept so the respective administrator can combat leechers.</li>
<li>If you upload a mapping to a tag repository, your anonymous account is linked so the administrator can quickly revoke all of any rule-breaker's awful contributions. Your IP address is forgotten.</li>
<li>If you upload a file to a file repository, your anonymous account is linked so the administrator can quickly revoke all of any rule-breaker's awful contributions. Your IP <span class="warning">may</span> be recorded, depending on whether the repository's administrator has decided to enable ip upload-logging or not. This is a DMCA/child pornography issue.</li>
</ul>
</p>
<p>Furthermore:</p>
<p>
<ul>
<li>Administrators for a particular repository can see which accounts uploaded what. If IP addresses are available, they can discover which IP uploaded a particular file, and when.</li>
<li>Repositories do not talk to each other.</li>
<li>All accounts are anonymous. Repositories do not <i>know</i> any of their accounts' access keys, and cannot produce them on demand; they can determine whether a particular access key refers to a particular account, but the access keys themselves are all irreversibly hashed inside the repository database.</li>
</ul>
</p>
<p>There are of course some clever exceptions. If you tag a file three years before it surfaces on the internet, someone with enough knowledge will be able to infer it was most likely you who created it. If you set up a file repository for just a friend and yourself, it becomes trivial by elimination to guess who uploaded the NarutoXSonichu shota diaper fanon. If you sign up for a file repository that hosts only evil stuff and rack up a huge bandwidth record for the current month, anyone who knows that and also knows the account is yours alone will know you were up to no good.</p>
<p>Note also that the file repository code is freely available and entirely mutable. If someone wants to put the time in, they can create a file repository that looks from the outside like any other but nonetheless logs the IP and nature of every request. Just make sure you trust the person running the repository. (And make sure they suck at programming python!)</p>
<p><a href="http://en.wikipedia.org/wiki/AOL_search_data_leak">Even anonymised records can reveal personally identifying information.</a> Don't trust anyone who plans to release maps of accounts -> files or accounts -> mappings, even for some benevolent academic purpose.</p>
</div>
</body>
</html>

BIN
help/ratings_dialog.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
help/ratings_filter.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
help/ratings_like.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
help/ratings_menu.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
help/ratings_numerical.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
help/ratings_preview.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
help/ratings_sort.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
help/review_repos.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
help/review_services.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

28
help/running_from_source.html Executable file
View File

@ -0,0 +1,28 @@
<html>
<head>
<title>running from source</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>running from source</h3>
<p>the hydrus network is written entirely in <a href="http://python.org">python</a>, which can run straight from source. This is not recommended for someone who just wants to get the program working, but more for those who have a general interest or wish to modify their programs.</p>
<h3>what you will need</h3>
<p>You will need to install python 2.x and a few modules:
<p><ul>
<li><a href="http://www.wxpython.org/">wxPython</a></li>
<li><a href="http://www.pythonware.com/products/pil/">PIL</a></li>
<li><a href="http://pyyaml.org/">pyYAML</a></li>
<li><a href="http://opencv.willowgarage.com/wiki/">OpenCV</a></li>
<li><a href="https://www.dlitz.net/software/pycrypto/">PyCrypto</a></li>
<li>The latest version of <a href="http://www.sqlite.org/">SQLite</a> (you may need to swap out the latest sqlite3.dll into your python/dlls directory)</li>
</ul></p>
<p>Once you have everything set up, just run client.pyw or server.pyw from your install directory. They will look for and run off the exact same database files as the executables would, and they'll hopefully run exactly the same too.</p>
<p>I develop all this on 64-bit Win 7. I don't know how it runs on osx or linux, and don't personally have the means to find out. If you are good with python and want to make it work on non-windows, even compiling a release, go ahead! I'd be interested in how you get along.</p>
<h3>my coding</h3>
<p>I seem to work very much on a conceptual, boxes-and-arrows level. Although I <i>can</i> code in any language if I have to, I find the pedantic intricacies of C and its low-level friends a pain. But Python works for me right out of the box and is far more semantically rich; one line of intelligent and word-heavy python can do the work of 20 robotic <i>t+=ord(j_temp)%2;</i>s in C, and with such less fear of memory leaks or injection attacks or buffer overflows. I like long variable names and copious whitespace. I don't do much commenting because I am working alone and it usually makes quick sense to me, even when I haven't seen something for ages. If my code looks kooky to you, I'm sorry; my nerdism is INFJ, not INTP/J.</p>
<p>I honestly don't know enough about the open source community to release my code under a specific licence, so everything is just public domain. In our internet age, copyright and copyleft seem to me equally impotent.</p>
</div>
</body>
</html>

81
help/server.html Executable file
View File

@ -0,0 +1,81 @@
<html>
<head>
<title>running your own server</title>
<link href="hydrus.ico" rel="shortcut icon" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="content">
<h3>setting up a server</h3>
<p>Would you—</p>
<ul>
<li>like to share your image collection between your computers, creating a simultaneous backup?</li>
<li>like to share images amongst friends?</li>
<li>like to publish regular manga or comic updates through a system that plugs natively into hydrus?</li>
<li>like to tag all these images, possibly with others' help, according to a specific format that you determine?</li>
<li>like to be a cool dude in cyberspace, respected by all the other console jockeys?</li>
</ul>
<p>If so, you may wish to try running your own server. But first:</p>
<ul>
<li>
<p>I—the person who writes all the code and administrates the public tag repository—have no way of knowing where other servers or services are being run, nor who runs them, nor what is being stored on them. The servers never phone home. Feel free to check and run from source if you are paranoid.</p>
<ul>
<li>Corollary: If you have a problem with something on some dude's server, please, <span class="warning">do not come to me</span>, as I can in no way help with your problem. If your ex-gf's nudes have leaked onto the internet, or you find something terribly offensive, or you just plain hate the free flow of information, I cannot help you at all. IT IS THE DAWN OF 20XX. WELCOME TO INTERNET</li>
</ul>
</li>
<li>This is not for noobs. If you are wholly unfamiliar with NAT (opening ports on firewalls) and setting up servers in general, this may be a step too far. If you get stuck, drag a nerd away from Xel'Naga Caverns to give you a hand.</li>
<li>If you want your services to thrive in a community, you shall have to manage them. If you throw out a hundred uploader keys and go on a long vacation, do not expect your long-crafted thirteen-point 'Superman vs Goku ONLY!!!!!' ruleset to be upheld. Your repositories will clog with unrelated rubbish and your bandwidth will disappear. Banning worthless people and pruning worthless content is an important part of any online ecosystem.</li>
<li>There are legal issues with running a file-hosting service. If you plan to do this on any kind of large scale, <span class="warning">especially</span> if you plan to sell access keys for cash-money, familiarise yourself with your legal rights and responsibilities. You may—without even meaning to—make yourself liable for others' sins.</li>
</ul>
<h3>still keen?</h3>
<p><b><i>If this stuff be-fuzzles you, and you just want a simple server set up on the same computer you run the client, you can now go </i>help->i don't know what I am doing->just set up the server on this computer, please<i> and you _should_ be all set up with an admin service and tag/file repos automatically.</i></b></p>
<p>In discussing the hydrus network's server, I shall use two terms, <i>server</i> and <i>service</i>, to mean two distinct concepts:</p>
<ul>
<li>A <b>server</b> is an instantiation of the executable process, server.exe. It has a complicated and flexible database that can run many different services in parallel.</li>
<li>A <b>service</b> sits on a port (e.g. 45871) and responds to certain http requests (e.g. /file or /update) that the hydrus client can plug into. A service might be a repository for a certain kind of data, the administration interface to manage what services run on a server, or anything else.</li>
</ul>
<p>Setting up a hydrus server is easy compared to, say, Apache. There are no .conf files to mess about with, and everything is controlled through the client. When started, the server does nothing more visible than placing an icon in your system tray. Right click that, and you only get an option to exit.</p>
<p>The basic process for setting up a server is thus:</p>
<ul>
<li>Start the server.</li>
<li>Set up your client with its address and initialise the administration interface</li>
<li>Set the server's options and services.</li>
<li>Make some access keys for your users.</li>
<li>???</li>
<li>Profit</li>
</ul>
<p>Let us look at these steps in more detail:</p>
<h3>start the server</h3>
<p>Since the server and client have so much common code, I have packaged them together. If you have the client, you have the server. To start it, you can hit the shortcut in your start menu or just go straight for server.exe/.pyw in the install directory. It will first try to take port 45870 or its administration interface, so make sure that is free. Open your firewall as appropriate.</p>
<h3>set up the client</h3>
<p>In the <i>add, remove or edit services</i> dialog, go to the <i>servers admin</i> tab, give your server admin interface a nickname and set the credentials to whatever-hostname:45870. Don't enter any access key. Ok those changes, and go to <i>review services</i>.</p>
<p>On the tab+page for your new server, hit the initialise button. If you have everything set right, the server should generate its first administrator account and return the access key, which the client will set for you. It will also try to save the key inside a text file.</p>
<p class="warning">YOU'LL WANT TO SAVE THAT FILE IN A SAFE PLACE</p>
<p>If you lose your admin access key, there is no way to get it back, and if you are not sqlite-proficient, you'll have to restart from the beginning by deleting your server's database files.</p>
<p>If the client can't connect to the server, it is either not running or you have a firewall/port-mapping problem. Google will help you with NAT. If you want a quick way to test the server's visibility, just put its host:port into your browser; if working, it should return some simple html identifying itself.</p>
<h3>set up the server</h3>
<p>You should notice a new menu, 'admin', in the client gui. This is where you control most server-wide stuff. <i>admin->your server->options</i> does exactly what you think.</p>
<p><i>admin->your server->manage services</i> lets you add, edit, and delete the services your server runs. Every time you add one, you should also be added as that service's first administrator, with the same access key as for the admin interface.</i>
<p>Once you add a new service, the admin menu should give you another entry. Everything is fairly self-explanatory.</p>
<h3>making access keys</h3>
<p>Go <i>admin->your service->create new accounts</i>. You can then create x access keys of account type y and try to save them to a text file.</p>
<p>Go <i>admin->manage account types</i> to add, remove, or edit account types. Make sure everyone has at least downloader (get_data) permissions so they can stay synchronised.</p>
<p>You can create as many accounts of whatever kind you like, and distribute them the same. Depending on your usage scenario, you may want to have all uploaders, one uploader and many downloaders, or just a single administrator. There are many combinations.</p>
<p>It is your server, so do what you like.</p>
<p>On that note: python is simple enough that changes to the source are easy. If you want to auto-ban anyone who does not fit a certain quota, it is not that hard to find where the magic happens and alter it. Just do not test your changes on a live repository!</p>
<h3>???</h3>
<p>The most important part is to have fun! There are no losers on the INFORMATION SUPERHIGHWAY.</p>
<h3>profit</h3>
<p>I honestly hope you can get some benefit out of my code, whether just as a backup or as part of a far more complex system. Please mail me your comments as I am keen to make improvements.</p>
<h3>btw, how to backup a repo's db</h3>
<p>All of a server's files and options are stored in its accompanying .db file and respective subdirectories, which are created on first startup (just like with the client). You can backup and restore these files just by copying them about, but you have to be careful how you do it with a server; when it is running, it has a live connection to its database, and all sorts of things could be written or read at any time. If you just try to copy the .db somewhere and someone uploads a file, something might break. Instead, you have two options:</p>
<ul>
<li>Shut down the server, copy the .db files, then restart it. This is the only way, currently, to restore a db.</li>
<li>Hit admin->your server->make a backup. This will lock the db server-side while it makes a copy right in the /db directory. The .db file will be tidied up and copied to .db.backup and the subdirectories will be copied to _backup as well. When the operation is complete, you can ftp/batch-copy/whatever these backup files wherever you like.</li>
</ul>
<h3>OMG EVERYTHING WENT WRONG</h3>
<p>If you get to a point where you can no longer boot the repository, try running SQLite Studio and opening server.db. If the issue is simple—like manually changing the port number—you may be in luck. Send me an email if it is tricky.</p>
<p>If you somehow damage your computer and want to blame me, try taking some responsibility for your mistakes. Everything is breaking all the time. Make backups.</p>
</div>
</body>
</html>

BIN
help/server_database_diagram.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
help/similar_gununu.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
help/similar_gununus.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

BIN
help/similar_icons.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

20
help/style.css Executable file
View File

@ -0,0 +1,20 @@
a { color: #222; text-decoration: none; font-weight: bold; }
a:hover { color: #555 }
body { font-family: "Calibri", Arial, sans-serif; color: #555; line-height: 1.5; }
h3 { color: #222; }
ul li { list-style: none; margin: 1.0em 0em; }
ul.bulletpoint li { list-style: disc; margin: 1.0em 0em; }
th { text-align: center; }
tr { text-align: center; }
.dealwithit { color: #ff0000; text-shadow:
1px 1px 0 #ff7f00,
2px 2px 0 #ffff00,
3px 3px 0 #00ff00,
4px 4px 0 #0000ff,
5px 5px 0 #6600ff,
6px 6px 0 #8b00ff; }
.warning { color: #d00 }
.lololol { text-decoration: line-through; }
.right { text-align: right; }
.screenshot { float: right; clear: both; margin: 10px; }

BIN
help/tag_example_ainsley.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
help/tag_example_azura.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
help/tag_example_feel.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Some files were not shown because too many files have changed in this diff Show More