Fix Photo thumbnail paths to be relative to the PDB's thumb dir.
Previously they were relative to the directory from which the client was launched, meaning it usually started with ./_etiquette. Now it should be more portable and less tight.
This commit is contained in:
		
							parent
							
								
									f3eb6345f7
								
							
						
					
					
						commit
						ffe0be21f5
					
				
					 5 changed files with 34 additions and 8 deletions
				
			
		|  | @ -61,7 +61,6 @@ If you are interested in helping, please raise an issue before making any pull r | |||
| - Currently, the Jinja templates are having a tangling influence on the backend objects, because Jinja cannot import my other modules like bytestring, but it can access the methods of the objects I pass into the template. As a result, the objects have excess helper methods. Consider making them into Jinja filters instead. Which is also kind of ugly but will move that pollution out of the backend at least. | ||||
| - Perhaps instead of actually deleting objects, they should just have a `deleted` flag, to make easy restoration possible. Also consider regrouping the children of restored Groupables if those children haven't already been reassigned somewhere else. | ||||
| - Add a new table to store permanent history of add/remove of tags on photos, so that accidents or trolling can be reversed. | ||||
| - Photo thumbnail paths should be relative to the data_dir, they are currently one level up. Or maybe should remove the paths entirely and just recalculate it by the ID. Can't think of any reason to have a thumbnail point elsewhere. | ||||
| - Fix album size cache when photo reload metadata and generally improve that validation. | ||||
| - Better bookmark url validation. | ||||
| - Create a textbox which gives autocomplete tag names. | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ FILENAME_BADCHARS = '\\/:*?<>|"' | |||
| # Note: Setting user_version pragma in init sequence is safe because it only | ||||
| # happens after the out-of-date check occurs, so no chance of accidentally | ||||
| # overwriting it. | ||||
| DATABASE_VERSION = 9 | ||||
| DATABASE_VERSION = 10 | ||||
| DB_INIT = ''' | ||||
| PRAGMA count_changes = OFF; | ||||
| PRAGMA cache_size = 10000; | ||||
|  | @ -266,7 +266,9 @@ DEFAULT_CONFIGURATION = { | |||
|         'thumbs.db', | ||||
|     ], | ||||
|     'digest_exclude_dirs': [ | ||||
|         '_etiquette', | ||||
|         '_site_thumbnails', | ||||
|         'site_thumbnails', | ||||
|     ], | ||||
| 
 | ||||
|     'file_read_chunk': 2 ** 20, | ||||
|  |  | |||
|  | @ -570,7 +570,12 @@ class Photo(ObjectBase): | |||
|         self.width = db_row['width'] | ||||
|         self.height = db_row['height'] | ||||
|         self.ratio = db_row['ratio'] | ||||
|         self.thumbnail = db_row['thumbnail'] | ||||
| 
 | ||||
|         if db_row['thumbnail'] is not None: | ||||
|             self.thumbnail = self.photodb.thumbnail_directory.join(db_row['thumbnail']) | ||||
|         else: | ||||
|             self.thumbnail = None | ||||
| 
 | ||||
|         self.searchhidden = db_row['searchhidden'] | ||||
| 
 | ||||
|         if self.duration and self.bytes is not None: | ||||
|  | @ -697,8 +702,6 @@ class Photo(ObjectBase): | |||
|             For videos, you can provide a `timestamp` to take the thumbnail at. | ||||
|         ''' | ||||
|         hopeful_filepath = self.make_thumbnail_filepath() | ||||
|         hopeful_filepath = hopeful_filepath.relative_path | ||||
|         #print(hopeful_filepath) | ||||
|         return_filepath = None | ||||
| 
 | ||||
|         if self.simple_mimetype == 'image': | ||||
|  | @ -731,7 +734,7 @@ class Photo(ObjectBase): | |||
|                     image = background | ||||
| 
 | ||||
|                 image = image.convert('RGB') | ||||
|                 image.save(hopeful_filepath, quality=50) | ||||
|                 image.save(hopeful_filepath.absolute_path, quality=50) | ||||
|                 return_filepath = hopeful_filepath | ||||
| 
 | ||||
|         elif self.simple_mimetype == 'video' and constants.ffmpeg: | ||||
|  | @ -757,7 +760,7 @@ class Photo(ObjectBase): | |||
|                             timestamp = 2 | ||||
|                     constants.ffmpeg.thumbnail( | ||||
|                         self.real_path.absolute_path, | ||||
|                         outfile=hopeful_filepath, | ||||
|                         outfile=hopeful_filepath.absolute_path, | ||||
|                         quality=2, | ||||
|                         size=size, | ||||
|                         time=timestamp, | ||||
|  | @ -770,7 +773,7 @@ class Photo(ObjectBase): | |||
|         if return_filepath != self.thumbnail: | ||||
|             data = { | ||||
|                 'id': self.id, | ||||
|                 'thumbnail': return_filepath, | ||||
|                 'thumbnail': return_filepath.relative_to(self.photodb.thumbnail_directory), | ||||
|             } | ||||
|             self.photodb.sql_update(table='photos', pairs=data, where_key='id') | ||||
|             self.thumbnail = return_filepath | ||||
|  |  | |||
|  | @ -95,6 +95,9 @@ def send_file(filepath, override_mimetype=None): | |||
|     ''' | ||||
|     Range-enabled file sending. | ||||
|     ''' | ||||
|     if isinstance(filepath, pathclass.Path): | ||||
|         filepath = filepath.absolute_path | ||||
| 
 | ||||
|     try: | ||||
|         file_size = os.path.getsize(filepath) | ||||
|     except FileNotFoundError: | ||||
|  |  | |||
|  | @ -155,6 +155,25 @@ def upgrade_8_to_9(photodb): | |||
|     cur.execute('UPDATE photos SET searchhidden = 0') | ||||
|     cur.execute('CREATE INDEX index_photos_searchhidden on photos(searchhidden)') | ||||
| 
 | ||||
| def upgrade_9_to_10(photodb): | ||||
|     ''' | ||||
|     From now on, the filepath stored in Photo's thumbnail column should be a | ||||
|     relative path where . is the PhotoDB's thumbnail_directory. | ||||
|     Previously, the stored path was unnecessarily high and contained the PDB's | ||||
|     data_directory, reducing portability. | ||||
|     ''' | ||||
|     cur = photodb.sql.cursor() | ||||
|     photos = list(photodb.search(has_thumbnail=True, is_searchhidden=None)) | ||||
| 
 | ||||
|     # Since we're doing it all at once, I'm going to cheat and skip the | ||||
|     # relative_to() calculation. | ||||
|     thumbnail_dir = photodb.thumbnail_directory.absolute_path | ||||
|     for photo in photos: | ||||
|         new_thumbnail_path = photo.make_thumbnail_filepath() | ||||
|         new_thumbnail_path = new_thumbnail_path.absolute_path | ||||
|         new_thumbnail_path = '.' + new_thumbnail_path.replace(thumbnail_dir, '') | ||||
|         cur.execute('UPDATE photos SET thumbnail = ? WHERE id == ?', [new_thumbnail_path, photo.id]) | ||||
| 
 | ||||
| def upgrade_all(data_directory): | ||||
|     ''' | ||||
|     Given the directory containing a phototagger database, apply all of the | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue