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. | - 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. | - 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. | - 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. | - Fix album size cache when photo reload metadata and generally improve that validation. | ||||||
| - Better bookmark url validation. | - Better bookmark url validation. | ||||||
| - Create a textbox which gives autocomplete tag names. | - 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 | # 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 | # happens after the out-of-date check occurs, so no chance of accidentally | ||||||
| # overwriting it. | # overwriting it. | ||||||
| DATABASE_VERSION = 9 | DATABASE_VERSION = 10 | ||||||
| DB_INIT = ''' | DB_INIT = ''' | ||||||
| PRAGMA count_changes = OFF; | PRAGMA count_changes = OFF; | ||||||
| PRAGMA cache_size = 10000; | PRAGMA cache_size = 10000; | ||||||
|  | @ -266,7 +266,9 @@ DEFAULT_CONFIGURATION = { | ||||||
|         'thumbs.db', |         'thumbs.db', | ||||||
|     ], |     ], | ||||||
|     'digest_exclude_dirs': [ |     'digest_exclude_dirs': [ | ||||||
|  |         '_etiquette', | ||||||
|         '_site_thumbnails', |         '_site_thumbnails', | ||||||
|  |         'site_thumbnails', | ||||||
|     ], |     ], | ||||||
| 
 | 
 | ||||||
|     'file_read_chunk': 2 ** 20, |     'file_read_chunk': 2 ** 20, | ||||||
|  |  | ||||||
|  | @ -570,7 +570,12 @@ class Photo(ObjectBase): | ||||||
|         self.width = db_row['width'] |         self.width = db_row['width'] | ||||||
|         self.height = db_row['height'] |         self.height = db_row['height'] | ||||||
|         self.ratio = db_row['ratio'] |         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'] |         self.searchhidden = db_row['searchhidden'] | ||||||
| 
 | 
 | ||||||
|         if self.duration and self.bytes is not None: |         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. |             For videos, you can provide a `timestamp` to take the thumbnail at. | ||||||
|         ''' |         ''' | ||||||
|         hopeful_filepath = self.make_thumbnail_filepath() |         hopeful_filepath = self.make_thumbnail_filepath() | ||||||
|         hopeful_filepath = hopeful_filepath.relative_path |  | ||||||
|         #print(hopeful_filepath) |  | ||||||
|         return_filepath = None |         return_filepath = None | ||||||
| 
 | 
 | ||||||
|         if self.simple_mimetype == 'image': |         if self.simple_mimetype == 'image': | ||||||
|  | @ -731,7 +734,7 @@ class Photo(ObjectBase): | ||||||
|                     image = background |                     image = background | ||||||
| 
 | 
 | ||||||
|                 image = image.convert('RGB') |                 image = image.convert('RGB') | ||||||
|                 image.save(hopeful_filepath, quality=50) |                 image.save(hopeful_filepath.absolute_path, quality=50) | ||||||
|                 return_filepath = hopeful_filepath |                 return_filepath = hopeful_filepath | ||||||
| 
 | 
 | ||||||
|         elif self.simple_mimetype == 'video' and constants.ffmpeg: |         elif self.simple_mimetype == 'video' and constants.ffmpeg: | ||||||
|  | @ -757,7 +760,7 @@ class Photo(ObjectBase): | ||||||
|                             timestamp = 2 |                             timestamp = 2 | ||||||
|                     constants.ffmpeg.thumbnail( |                     constants.ffmpeg.thumbnail( | ||||||
|                         self.real_path.absolute_path, |                         self.real_path.absolute_path, | ||||||
|                         outfile=hopeful_filepath, |                         outfile=hopeful_filepath.absolute_path, | ||||||
|                         quality=2, |                         quality=2, | ||||||
|                         size=size, |                         size=size, | ||||||
|                         time=timestamp, |                         time=timestamp, | ||||||
|  | @ -770,7 +773,7 @@ class Photo(ObjectBase): | ||||||
|         if return_filepath != self.thumbnail: |         if return_filepath != self.thumbnail: | ||||||
|             data = { |             data = { | ||||||
|                 'id': self.id, |                 '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.photodb.sql_update(table='photos', pairs=data, where_key='id') | ||||||
|             self.thumbnail = return_filepath |             self.thumbnail = return_filepath | ||||||
|  |  | ||||||
|  | @ -95,6 +95,9 @@ def send_file(filepath, override_mimetype=None): | ||||||
|     ''' |     ''' | ||||||
|     Range-enabled file sending. |     Range-enabled file sending. | ||||||
|     ''' |     ''' | ||||||
|  |     if isinstance(filepath, pathclass.Path): | ||||||
|  |         filepath = filepath.absolute_path | ||||||
|  | 
 | ||||||
|     try: |     try: | ||||||
|         file_size = os.path.getsize(filepath) |         file_size = os.path.getsize(filepath) | ||||||
|     except FileNotFoundError: |     except FileNotFoundError: | ||||||
|  |  | ||||||
|  | @ -155,6 +155,25 @@ def upgrade_8_to_9(photodb): | ||||||
|     cur.execute('UPDATE photos SET searchhidden = 0') |     cur.execute('UPDATE photos SET searchhidden = 0') | ||||||
|     cur.execute('CREATE INDEX index_photos_searchhidden on photos(searchhidden)') |     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): | def upgrade_all(data_directory): | ||||||
|     ''' |     ''' | ||||||
|     Given the directory containing a phototagger database, apply all of the |     Given the directory containing a phototagger database, apply all of the | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue