summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO8
-rw-r--r--PKGBUILD8
-rw-r--r--cython-workarounds.patch581
-rw-r--r--paths-in-opt.patch14
4 files changed, 30 insertions, 581 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 6e882a7ab7e9..3eb5c08a41b6 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = hydrus
pkgdesc = Danbooru-like image tagging and searching system for the desktop
- pkgver = 165
+ pkgver = 166
pkgrel = 1
url = http://hydrusnetwork.github.io/hydrus/
install = hydrus.install
@@ -25,7 +25,7 @@ pkgbase = hydrus
optdepends = ffmpeg: show duration and other information on video thumbnails
optdepends = miniupnpc: automatic port forwarding
options = !strip
- source = hydrus::git+https://github.com/hydrusnetwork/hydrus.git#commit=701fd3f2e44906aa68d5bb544ba1b335e75f6fa0
+ source = hydrus::git+https://github.com/hydrusnetwork/hydrus.git#commit=8ab2aa1a19a78b43797bfba7d7606b30df0e253f
source = paths-in-opt.patch
source = running-the-server.patch
source = cython-workarounds.patch
@@ -33,9 +33,9 @@ pkgbase = hydrus
source = hydrus-server
source = hydrus.desktop
sha256sums = SKIP
- sha256sums = faf1bcdab469bd7bfe6616897fd355642da55c3e2b269a20d477a23d5583f75b
+ sha256sums = 503b5d833b05ade15bc9ff51180a5eceebbf3482afdb9f1f9a56d4c6588a46f9
sha256sums = b4cd358402ac8f225fe77a60aeb89dde88ba8ad050c5b04f11c1ffd44242e9d8
- sha256sums = a87934be05743148f00b1a3c7facb742b89845c4e89018c4ecb04c37a25aab84
+ sha256sums = bebb633fe4f0c449fba373d09990d32d3c16ab222fc22b5dd292b5d6eee02e26
sha256sums = b2bf66b1068969e9598742d5c128cb04fd609512b0cff0ad5e25ecb6cdd35678
sha256sums = ac7254e3cdb359ebae302655b72b9f74b85d9e817c326fa28173791b3fb4f114
sha256sums = 9ba3942ac1a37f6b39c98ae6592573402bf08d8376f64554d0696c0fed6fd0e2
diff --git a/PKGBUILD b/PKGBUILD
index b890b8a1dc6f..e6591beca7db 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -13,7 +13,7 @@ $build_cython || options=(!strip) # Don't strip libs because there aren't any;
DOC_DIRS=(opt/hydrus/help)
pkgname=hydrus
-pkgver=165
+pkgver=166
pkgrel=1
pkgdesc="Danbooru-like image tagging and searching system for the desktop"
arch=(any)
@@ -26,7 +26,7 @@ makedepends=(git)
$build_cython && makedepends+=(cython2 parallel)
optdepends=('ffmpeg: show duration and other information on video thumbnails'
'miniupnpc: automatic port forwarding')
-source=("${pkgname}::git+https://github.com/hydrusnetwork/${pkgname}.git#commit=701fd3f2e44906aa68d5bb544ba1b335e75f6fa0"
+source=("${pkgname}::git+https://github.com/hydrusnetwork/${pkgname}.git#commit=8ab2aa1a19a78b43797bfba7d7606b30df0e253f"
paths-in-opt.patch
running-the-server.patch
cython-workarounds.patch
@@ -34,9 +34,9 @@ source=("${pkgname}::git+https://github.com/hydrusnetwork/${pkgname}.git#commit=
hydrus-server
hydrus.desktop)
sha256sums=('SKIP'
- 'faf1bcdab469bd7bfe6616897fd355642da55c3e2b269a20d477a23d5583f75b'
+ '503b5d833b05ade15bc9ff51180a5eceebbf3482afdb9f1f9a56d4c6588a46f9'
'b4cd358402ac8f225fe77a60aeb89dde88ba8ad050c5b04f11c1ffd44242e9d8'
- 'a87934be05743148f00b1a3c7facb742b89845c4e89018c4ecb04c37a25aab84'
+ 'bebb633fe4f0c449fba373d09990d32d3c16ab222fc22b5dd292b5d6eee02e26'
'b2bf66b1068969e9598742d5c128cb04fd609512b0cff0ad5e25ecb6cdd35678'
'ac7254e3cdb359ebae302655b72b9f74b85d9e817c326fa28173791b3fb4f114'
'9ba3942ac1a37f6b39c98ae6592573402bf08d8376f64554d0696c0fed6fd0e2')
diff --git a/cython-workarounds.patch b/cython-workarounds.patch
index de272ce3f5c7..f1f9f29f01fc 100644
--- a/cython-workarounds.patch
+++ b/cython-workarounds.patch
@@ -1,5 +1,5 @@
diff --git a/include/ClientDB.py b/include/ClientDB.py
-index 2188e2b..e90abe6 100755
+index f2f1209..87d6bc9 100755
--- a/include/ClientDB.py
+++ b/include/ClientDB.py
@@ -2596,7 +2596,7 @@ class DB( HydrusDB.HydrusDB ):
@@ -11,13 +11,6 @@ index 2188e2b..e90abe6 100755
#
-@@ -6301,4 +6301,4 @@ class DB( HydrusDB.HydrusDB ):
- shutil.copytree( path + os.path.sep + 'client_thumbnails', HC.CLIENT_THUMBNAILS_DIR )
- shutil.copytree( path + os.path.sep + 'client_updates', HC.CLIENT_UPDATES_DIR )
-
--
-\ No newline at end of file
-+
diff --git a/include/ClientGUICanvas.py b/include/ClientGUICanvas.py
index 155bf4a..9cb413b 100755
--- a/include/ClientGUICanvas.py
@@ -33,10 +26,10 @@ index 155bf4a..9cb413b 100755
( media_width, media_height ) = media.GetResolution()
diff --git a/include/ClientGUIDialogs.py b/include/ClientGUIDialogs.py
-index 3926a31..c69092a 100755
+index 372eccc..d37d098 100755
--- a/include/ClientGUIDialogs.py
+++ b/include/ClientGUIDialogs.py
-@@ -243,7 +243,8 @@ class Dialog( wx.Dialog ):
+@@ -241,7 +241,8 @@ class Dialog( wx.Dialog ):
def EventDialogButton( self, event ): self.EndModal( event.GetId() )
@@ -47,10 +40,10 @@ index 3926a31..c69092a 100755
wx.Dialog.SetInitialSize( self, ( width, height ) )
diff --git a/include/ClientGUIManagement.py b/include/ClientGUIManagement.py
-index abfd02f..22e7a15 100755
+index 31c884d..6801f64 100755
--- a/include/ClientGUIManagement.py
+++ b/include/ClientGUIManagement.py
-@@ -63,26 +63,6 @@ def CreateManagementController( management_type, file_service_key = None ):
+@@ -64,26 +64,6 @@ def CreateManagementController( management_type, file_service_key = None ):
return management_controller
@@ -77,7 +70,7 @@ index abfd02f..22e7a15 100755
def CreateManagementControllerImportGallery( site_type, gallery_type ):
-@@ -659,734 +639,6 @@ class ManagementPanel( wx.lib.scrolledpanel.ScrolledPanel ):
+@@ -667,734 +647,6 @@ class ManagementPanel( wx.lib.scrolledpanel.ScrolledPanel ):
def TestAbleToClose( self ): pass
@@ -813,120 +806,13 @@ index abfd02f..22e7a15 100755
class ManagementPanelImport( ManagementPanel ):
diff --git a/include/ClientImporting.py b/include/ClientImporting.py
-deleted file mode 100644
-index 98576c6..0000000
+index c991bd3..a1f5fff 100644
--- a/include/ClientImporting.py
-+++ /dev/null
-@@ -1,558 +0,0 @@
--import ClientConstants as CC
--import HydrusConstants as HC
--import HydrusData
--import HydrusSerialisable
--import threading
--import traceback
--
--class ImportController( HydrusSerialisable.SerialisableBase ):
--
-- def __init__( self ):
--
-- HydrusSerialisable.SerialisableBase.__init__( self )
--
-- # queues of stuff, where every kind of queue can be serialised
-- # hence don't have __init__ for subclasses! nothing beyond temp vars
-- # everything must fit inside what I declare here
-- # subclasses should mostly fill in _ProcessQueue kind of stuff.
-- # don't forget THREAD stuff, which should probably be explicitly started by the managementpanel?
-- # also, what about page_key? how are we reporting new imports and so on? maybe that can be temp var in the daemonspawner
--
-- # hence maybe make a 'queue' object representing a list of urls or whatever -- maybe a urlcache can do that job.
--
-- # a number of queues
-- # a thing that extends a queue using a search
-- # a list of searches that will be built into queues
--
-- # maybe some class variables saying what parts to engage, like HDD doesn't accept new queues and so on
--
-- self._file_status_counts = {}
--
-- # if I decide to link search_seeds to the import_seed_queues, then why not bundle the import_seed_queue into the search_seed_info?
-- # yes, this is a good idea.
--
-- self._import_seed_queues = []
-- self._importer_status = ( '', 0, 1 )
--
-- self._search_seeds = SeedQueue()
-- self._searcher_status = ( '', 0, 1 )
--
-- self._options = {}
--
-- self._lock = threading.Lock()
-- self._import_status = ''
--
--
-- def _GetSerialisableInfo( self ):
--
-- # collapse file status counts into a list because of stupid int dict json thing
--
-- serialisable_url_cache = HydrusSerialisable.GetSerialisableTuple( self._url_cache )
--
-- serialisable_options = { name : HydrusSerialisable.GetSerialisableTuple( options ) for ( name, options ) in self._options.items() }
--
-- return ( self._site_type, self._query_type, self._query, self._get_tags_if_redundant, serialisable_url_cache, serialisable_options )
--
--
-- def _InitialiseFromSerialisableInfo( self, serialisable_info ):
--
-- ( self._site_type, self._query_type, self._query, self._get_tags_if_redundant, serialisable_url_cache_tuple, serialisable_options_tuple ) = serialisable_info
--
-- self._url_cache = HydrusSerialisable.CreateFromSerialisableTuple( serialisable_url_cache_tuple )
--
-- self._options = { name : HydrusSerialisable.CreateFromSerialisableTuple( serialisable_suboptions_tuple ) for ( name, serialisable_suboptions_tuple ) in serialisable_options_tuple.items() }
--
--
-- def _ProcessImportSeed( self, seed, seed_info ):
--
-- raise NotImplementedError()
--
--
-- def _ProcessSearchSeed( self, seed, seed_info ):
--
-- raise NotImplementedError()
--
--
-- def _DAEMONProcessImportSeeds( self ):
--
-- while True:
--
-- # if importer paused
--
-- with self._lock:
--
-- result = None
--
-- # determine paused/cancelled status via searchseedqueue or whatever
--
-- for import_seed_queue in self._import_seed_queues:
--
-- result = import_seed_queue.GetNextUnknownSeed()
--
-- if result is not None:
--
-- # remember current import_seed_queue so we can set seed status later
--
-- break
--
--
--
--
-- if result is not None:
--
-- ( seed, seed_info ) = result
--
-- self._ProcessImportSeed( import_seed, seed_info )
--
--
--
--
++++ b/include/ClientImporting.py
+@@ -113,26 +113,6 @@ class ImportController( HydrusSerialisable.SerialisableBase ):
+
+
+
- def _DAEMONProcessSearchSeeds( self ):
-
- while True:
@@ -937,7 +823,6 @@ index 98576c6..0000000
-
- result = import_seed_queue.GetNextUnknownSeed()
-
--
-
- if result is not None:
-
@@ -948,434 +833,9 @@ index 98576c6..0000000
-
-
-
-- def GetOptions( self, name ):
--
-- with self._lock:
--
-- return self._options[ name ]
--
--
--
-- def GetStatuses( self ):
--
-- with self._lock:
--
-- return ( dict( self._file_status_counts ), self._import_status, self._current_queue_status, self._searcher_status )
--
--
--
-- def PauseSearcher( self ):
--
-- with self._lock:
--
-- self._searcher_paused = True
--
--
--
-- def ResumeCurrentQueue( self ):
--
-- with self._lock:
--
-- self._current_queue_paused = False
--
--
--
-- def ResumeSearcher( self ):
--
-- with self._lock:
--
-- self._searcher_paused = False
--
--
--
-- def SetOptions( self, name, options ):
--
-- with self._lock:
--
-- self._options[ name ] = options
--
--
--
--class ImportControllerHDD( HydrusSerialisable.SerialisableBase ):
--
-- SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_HDD_IMPORT
-- SERIALISABLE_VERSION = 1
--
-- def __init__( self ):
--
-- HydrusSerialisable.SerialisableBase.__init__( self )
--
-- # this stuff is all moved to the search seed
-- self._paths_info = None
-- self._paths_to_tags = None
-- self._delete_file_after_import = None
-- self._import_file_options = None
--
-- self._lock = threading.Lock()
--
--
-- def _GetSerialisableInfo( self ):
--
-- serialisable_url_cache = HydrusSerialisable.GetSerialisableTuple( self._url_cache )
--
-- serialisable_options = { name : HydrusSerialisable.GetSerialisableTuple( options ) for ( name, options ) in self._options.items() }
--
-- return ( self._site_type, self._query_type, self._query, self._get_tags_if_redundant, serialisable_url_cache, serialisable_options )
--
--
-- def _InitialiseFromSerialisableInfo( self, serialisable_info ):
--
-- ( self._site_type, self._query_type, self._query, self._get_tags_if_redundant, serialisable_url_cache_tuple, serialisable_options_tuple ) = serialisable_info
--
-- self._url_cache = HydrusSerialisable.CreateFromSerialisableTuple( serialisable_url_cache_tuple )
--
-- self._options = { name : HydrusSerialisable.CreateFromSerialisableTuple( serialisable_suboptions_tuple ) for ( name, serialisable_suboptions_tuple ) in serialisable_options_tuple.items() }
--
--
-- def GetImportStatus( self ):
--
-- with self._lock:
--
-- return self._import_status
--
--
--
-- def GetQueueStatus( self ):
--
-- with self._lock:
--
-- gauge_value = self._current_position
-- gauge_range = len( self._paths_info )
--
-- # return progress string
-- # also return string for num_successful and so on
--
-- pass
--
--
--
-- def GetTuple( self ):
--
-- return ( self._paths_info, self._paths_to_tags, self._delete_file_after_import, self._import_file_options )
--
--
-- def MainLoop( self ):
--
-- # use the lock sparingly, remember
-- # obey pause and hc.shutdown
-- # maybe also an internal shutdown, on managementpanel cleanupbeforedestroy
-- # update file_status_counts
-- # increment current_position
--
-- pass
--
--
-- def Pause( self ):
--
-- with self._lock:
--
-- self._paused = True
--
--
--
-- def Resume( self ):
--
-- with self._lock:
--
-- self._paused = False
--
--
--
-- def SetTuple( self, paths_info, paths_to_tags, delete_file_after_import, import_file_options ):
--
-- self._paths_info = paths_info
-- self._paths_to_tags = paths_to_tags
-- self._delete_file_after_import = delete_file_after_import
-- self._import_file_options = import_file_options
--
--
-- def Start( self ):
--
-- # init a daemon to work through the list
--
-- pass
--
--
--HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_HDD_IMPORT ] = HDDImport
--
--class GalleryQuery( HydrusSerialisable.SerialisableBase ):
--
-- SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_GALLERY_QUERY
-- SERIALISABLE_VERSION = 1
--
-- def __init__( self, name ):
--
-- HydrusSerialisable.SerialisableBase.__init__( self )
--
-- self._site_type = None
-- self._query_type = None
-- self._query = None
-- self._get_tags_if_redundant = False
-- self._file_limit = 500
-- self._paused = False
-- self._page_index = 0
-- self._url_cache = None
-- self._options = {}
--
--
-- def _GetSerialisableInfo( self ):
--
-- serialisable_url_cache = HydrusSerialisable.GetSerialisableTuple( self._url_cache )
--
-- serialisable_options = { name : HydrusSerialisable.GetSerialisableTuple( options ) for ( name, options ) in self._options.items() }
--
-- return ( self._site_type, self._query_type, self._query, self._get_tags_if_redundant, self._file_limit, serialisable_url_cache, serialisable_options )
--
--
-- def _InitialiseFromSerialisableInfo( self, serialisable_info ):
--
-- ( self._site_type, self._query_type, self._query, self._get_tags_if_redundant, serialisable_url_cache_tuple, serialisable_options_tuple ) = serialisable_info
--
-- self._url_cache = HydrusSerialisable.CreateFromSerialisableTuple( serialisable_url_cache_tuple )
--
-- self._options = { name : HydrusSerialisable.CreateFromSerialisableTuple( serialisable_suboptions_tuple ) for ( name, serialisable_suboptions_tuple ) in serialisable_options_tuple.items() }
--
--
-- def GetQuery( self ):
--
-- return self._query
--
--
-- def SetTuple( self, site_type, query_type, query, get_tags_if_redundant, file_limit, options ):
--
-- self._site_type = site_type
-- self._query_type = query_type
-- self._query = query
-- self._get_tags_if_redundant = get_tags_if_redundant
-- self._file_limit = file_limit
-- self._url_cache = URLCache()
-- self._options = options
--
--
--HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_GALLERY_QUERY ] = GalleryQuery
--
--class SubscriptionController( HydrusSerialisable.SerialisableBaseNamed ):
--
-- SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_SUBSCRIPTION
-- SERIALISABLE_VERSION = 1
--
-- def __init__( self, name ):
--
-- HydrusSerialisable.SerialisableBaseNamed.__init__( self, name )
--
-- self._site_type = None
-- self._query_type = None
-- self._query = None
-- self._get_tags_if_redundant = False
-- self._file_limit = 500
-- self._periodic = None
-- self._page_index = 0
-- self._url_cache = None
-- self._options = {}
--
--
-- def _GetSerialisableInfo( self ):
--
-- return ( HydrusSerialisable.GetSerialisableTuple( self._gallery_query ), HydrusSerialisable.GetSerialisableTuple( self._periodic ) )
--
--
-- def _InitialiseFromSerialisableInfo( self, serialisable_info ):
--
-- ( serialised_gallery_query_tuple, serialised_periodic_tuple ) = serialisable_info
--
-- self._gallery_query = HydrusSerialisable.CreateFromSerialisableTuple( serialised_gallery_query_tuple )
--
-- self._periodic = HydrusSerialisable.CreateFromSerialisableTuple( serialised_periodic_tuple )
--
--
--HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_SUBSCRIPTION ] = Subscription
--
--class SeedQueue( HydrusSerialisable.SerialisableBase ):
--
-- SERIALISABLE_TYPE = HydrusSerialisable.SERIALISABLE_TYPE_SEED_QUEUE
-- SERIALISABLE_VERSION = 1
--
-- def __init__( self ):
--
-- HydrusSerialisable.SerialisableBase.__init__( self )
--
-- self._seeds_ordered = []
-- self._seeds_to_info = {}
--
-- self._lock = threading.Lock()
--
--
-- def _GetSerialisableInfo( self ):
--
-- with self._lock:
--
-- serialisable_info = []
--
-- for seed in self._seeds_ordered:
--
-- seed_info = self._seeds_to_info[ seed ]
--
-- serialisable_info.append( ( seed, seed_info ) )
--
--
-- return serialisable_info
--
--
--
-- def _InitialiseFromSerialisableInfo( self, serialisable_info ):
--
-- with self._lock:
--
-- for ( seed, seed_info ) in serialisable_info:
--
-- self._seeds_ordered.append( seed )
--
-- self._seeds_to_info[ seed ] = seed_info
--
--
--
--
-- def AddSeed( self, seed, additional_info = None ):
--
-- with self._lock:
--
-- if seed in self._seeds_to_info:
--
-- self._seeds_ordered.remove( seed )
--
--
-- self._seeds_ordered.append( seed )
--
-- seed_info = {}
--
-- seed_info[ 'status' ] = CC.STATUS_UNKNOWN
-- seed_info[ 'timestamp' ] = HydrusData.GetNow()
-- seed_info[ 'note' ] = ''
--
-- if additional_info is not None:
--
-- seed_info.update( additional_info )
--
--
-- self._seeds_to_info[ seed ] = seed_info
--
--
--
--
-- def AdvanceSeed( self, seed ):
--
-- with self._lock:
--
-- if seed in self._seeds_to_info:
--
-- index = self._seeds_ordered.index( seed )
--
-- if index > 0:
--
-- self._seeds_ordered.remove( seed )
--
-- self._seeds_ordered.insert( index - 1, seed )
--
--
--
--
--
-- def DelaySeed( self, seed ):
--
-- with self._lock:
--
-- if seed in self._seeds_to_info:
--
-- index = self._seeds_ordered.index( seed )
--
-- if index < len( self._seeds_ordered ) - 1:
--
-- self._seeds_ordered.remove( seed )
--
-- self._seeds_ordered.insert( index + 1, seed )
--
--
--
--
--
-- def GetNextUnknownSeed( self ):
--
-- with self._lock:
--
-- for seed in self._seeds_ordered:
--
-- seed_info = self._seeds_to_info[ seed ]
--
-- if seed_info[ 'status' ] == CC.STATUS_UNKNOWN:
--
-- return ( seed, seed_info )
--
--
--
--
-- return None
--
--
-- def GetSeeds( self ):
--
-- with self._lock:
--
-- return list( self._seeds_ordered )
--
--
--
-- def GetSeedsDisplayInfo( self ):
--
-- with self._lock:
--
-- all_info = []
--
-- for seed in self._seeds_ordered:
--
-- seed_info = self._seeds_to_info[ seed ]
--
-- timestamp = seed_info[ 'timestamp' ]
-- status = seed_info[ 'status' ]
-- note = seed_info[ 'note' ]
--
-- all_info.append( ( seed, status, timestamp, note ) )
--
--
-- return all_info
--
--
--
-- def RemoveSeed( self, seed ):
--
-- with self._lock:
--
-- if seed in self._seeds_to_info:
--
-- del self._seeds_to_info[ seed ]
--
-- self._seeds_ordered.remove( seed )
--
--
--
--
-- def SetSeedStatus( self, seed, status, note = '' ):
--
-- with self._lock:
--
-- seed_info = self._seeds_to_info[ seed ]
--
-- seed_info[ 'status' ] = status
-- seed_info[ 'timestamp' ] = HydrusData.GetNow()
-- seed_info[ 'note' ] = note
--
--
--
--HydrusSerialisable.SERIALISABLE_TYPES_TO_OBJECT_TYPES[ HydrusSerialisable.SERIALISABLE_TYPE_SEED_QUEUE ] = SeedQueue
+ def GetOptions( self, name ):
+
+ with self._lock:
diff --git a/include/HydrusData.py b/include/HydrusData.py
index 3b644d5..b80b5e8 100644
--- a/include/HydrusData.py
@@ -1695,17 +1155,6 @@ index dbd6c95..cbc017f 100755
- def ToTuple( self ): return ( self._type, self._text )
-
\ No newline at end of file
-diff --git a/include/HydrusSerialisable.py b/include/HydrusSerialisable.py
-index d26bf20..9518fc2 100644
---- a/include/HydrusSerialisable.py
-+++ b/include/HydrusSerialisable.py
-@@ -131,4 +131,4 @@ class SerialisableBaseNamed( SerialisableBase ):
- def GetName( self ): return self._name
-
- def SetName( self, name ): self._name = name
--
-\ No newline at end of file
-+
diff --git a/include/HydrusTags.py b/include/HydrusTags.py
index 710c20a..edd9bfd 100644
--- a/include/HydrusTags.py
diff --git a/paths-in-opt.patch b/paths-in-opt.patch
index 30dbb71fae8f..fe55c4b98149 100644
--- a/paths-in-opt.patch
+++ b/paths-in-opt.patch
@@ -1,5 +1,5 @@
diff --git a/include/ClientGUI.py b/include/ClientGUI.py
-index cb87bf1..201c069 100755
+index 6811311..8abf9a2 100755
--- a/include/ClientGUI.py
+++ b/include/ClientGUI.py
@@ -132,7 +132,7 @@ class FrameGUI( ClientGUICommon.FrameThatResizes ):
@@ -11,7 +11,7 @@ index cb87bf1..201c069 100755
aboutinfo.SetLicense( license )
-@@ -1908,7 +1908,7 @@ The password is cleartext here but obscured in the entry dialog. Enter a blank p
+@@ -1942,7 +1942,7 @@ The password is cleartext here but obscured in the entry dialog. Enter a blank p
elif command == '8chan_board': webbrowser.open( 'http://8ch.net/hydrus/index.html' )
elif command == 'file_integrity': self._CheckFileIntegrity()
@@ -21,10 +21,10 @@ index cb87bf1..201c069 100755
elif command == 'help_shortcuts': wx.MessageBox( CC.SHORTCUT_HELP )
elif command == 'import_files': self._ImportFiles()
diff --git a/include/ClientGUIDialogs.py b/include/ClientGUIDialogs.py
-index 7ffd518..520e94c 100755
+index d025f7b..372eccc 100755
--- a/include/ClientGUIDialogs.py
+++ b/include/ClientGUIDialogs.py
-@@ -621,7 +621,7 @@ class DialogFirstStart( Dialog ):
+@@ -619,7 +619,7 @@ class DialogFirstStart( Dialog ):
self._ok.SetForegroundColour( ( 0, 128, 0 ) )
message1 = 'Hi, this looks like the first time you have started the hydrus client. Don\'t forget to check out the'
@@ -34,7 +34,7 @@ index 7ffd518..520e94c 100755
message3 = 'When you close this dialog, the client will start its local http server. You will probably get a firewall warning.'
message4 = 'You can block it if you like, or you can allow it. It doesn\'t phone home, or expose your files to your network; it just provides another way to locally export your files.'
diff --git a/include/HydrusConstants.py b/include/HydrusConstants.py
-index ef81009..18d7831 100755
+index ecb6cff..563d416 100755
--- a/include/HydrusConstants.py
+++ b/include/HydrusConstants.py
@@ -3,9 +3,9 @@ import sys
@@ -67,10 +67,10 @@ index ef81009..18d7831 100755
PLATFORM_WINDOWS = False
diff --git a/include/HydrusServerResources.py b/include/HydrusServerResources.py
-index 2462cff..9afda32 100644
+index df908d4..7c04f81 100644
--- a/include/HydrusServerResources.py
+++ b/include/HydrusServerResources.py
-@@ -775,11 +775,11 @@ class HydrusResourceCommandBooruThumbnail( HydrusResourceCommandBooru ):
+@@ -806,11 +806,11 @@ class HydrusResourceCommandBooruThumbnail( HydrusResourceCommandBooru ):
mime = media_result.GetMime()
if mime in HC.MIMES_WITH_THUMBNAILS: path = ClientFiles.GetThumbnailPath( hash, full_size = False )