mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-04-29 18:27:23 +02:00
[ui] remove old thumbnails from disk cache when launching app
This commit is contained in:
parent
1819eacbdb
commit
7566544164
2 changed files with 48 additions and 2 deletions
|
@ -121,6 +121,9 @@ class MeshroomApp(QApplication):
|
||||||
if thumbnailDir is not None:
|
if thumbnailDir is not None:
|
||||||
ThumbnailCache.thumbnailDir = thumbnailDir
|
ThumbnailCache.thumbnailDir = thumbnailDir
|
||||||
|
|
||||||
|
# Clean thumbnail directory
|
||||||
|
ThumbnailCache.clean()
|
||||||
|
|
||||||
# QML engine setup
|
# QML engine setup
|
||||||
qmlDir = os.path.join(pwd, "qml")
|
qmlDir = os.path.join(pwd, "qml")
|
||||||
url = os.path.join(qmlDir, "main.qml")
|
url = os.path.join(qmlDir, "main.qml")
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
from PySide2.QtCore import QObject, Slot, QSize, QUrl, Qt
|
from PySide2.QtCore import QObject, Slot, QSize, QUrl, Qt
|
||||||
from PySide2.QtGui import QImageReader, QImageWriter
|
from PySide2.QtGui import QImageReader, QImageWriter
|
||||||
|
|
||||||
import hashlib
|
|
||||||
import pathlib
|
|
||||||
import os
|
import os
|
||||||
|
import pathlib
|
||||||
|
import hashlib
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
class ThumbnailCache(QObject):
|
class ThumbnailCache(QObject):
|
||||||
|
@ -17,12 +18,22 @@ class ThumbnailCache(QObject):
|
||||||
~/Meshroom/thumbnails.
|
~/Meshroom/thumbnails.
|
||||||
This location can be overriden with the MESHROOM_THUMBNAIL_DIR environment variable.
|
This location can be overriden with the MESHROOM_THUMBNAIL_DIR environment variable.
|
||||||
|
|
||||||
|
This class also takes care of cleaning the thumbnail directory,
|
||||||
|
i.e. scanning this directory and removing thumbnails that have not been used for too long.
|
||||||
|
The default time limit is one week.
|
||||||
|
|
||||||
The main use case for thumbnails in Meshroom is in the ImageGallery.
|
The main use case for thumbnails in Meshroom is in the ImageGallery.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Thumbnail cache directory
|
||||||
thumbnailDir = os.path.join(pathlib.Path.home(), 'Meshroom', 'thumbnails')
|
thumbnailDir = os.path.join(pathlib.Path.home(), 'Meshroom', 'thumbnails')
|
||||||
|
|
||||||
|
# Thumbnail dimensions limit (the actual dimensions of a thumbnail will depend on the aspect ratio)
|
||||||
thumbnailSize = QSize(100, 100)
|
thumbnailSize = QSize(100, 100)
|
||||||
|
|
||||||
|
# Time limit for thumbnail storage on disk, expressed in days
|
||||||
|
storageTimeLimit = 7
|
||||||
|
|
||||||
@Slot(QUrl, result=QUrl)
|
@Slot(QUrl, result=QUrl)
|
||||||
def thumbnail(self, imgSource):
|
def thumbnail(self, imgSource):
|
||||||
"""
|
"""
|
||||||
|
@ -48,6 +59,8 @@ class ThumbnailCache(QObject):
|
||||||
|
|
||||||
# Check if thumbnail already exists
|
# Check if thumbnail already exists
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
|
# Update last modification time
|
||||||
|
pathlib.Path(path).touch(exist_ok=True)
|
||||||
return source
|
return source
|
||||||
|
|
||||||
# Thumbnail does not exist, therefore we create it:
|
# Thumbnail does not exist, therefore we create it:
|
||||||
|
@ -81,3 +94,33 @@ class ThumbnailCache(QObject):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return source
|
return source
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def clean():
|
||||||
|
"""
|
||||||
|
Scan the thumbnail directory and
|
||||||
|
remove all thumbnails that have not been used for more than storageTimeLimit days.
|
||||||
|
"""
|
||||||
|
# Get current time
|
||||||
|
now = time.time()
|
||||||
|
|
||||||
|
# Scan thumbnail directory and gather all thumbnails to remove
|
||||||
|
toRemove = []
|
||||||
|
for entry in os.scandir(ThumbnailCache.thumbnailDir):
|
||||||
|
if not entry.is_file():
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Compute storage duration since last usage of thumbnail
|
||||||
|
lastUsage = os.path.getmtime(entry.path)
|
||||||
|
storageTime = now - lastUsage
|
||||||
|
print(f'[ThumbnailCache] Thumbnail {entry.name} has been stored for {storageTime}s')
|
||||||
|
|
||||||
|
# Mark as removable if storage time exceeds limit
|
||||||
|
if storageTime > ThumbnailCache.storageTimeLimit * 3600 * 24:
|
||||||
|
print(f'[ThumbnailCache] {entry.name} exceeded storage time limit')
|
||||||
|
toRemove.append(entry.path)
|
||||||
|
|
||||||
|
# Remove all thumbnails marked as removable
|
||||||
|
for path in toRemove:
|
||||||
|
print(f'[ThumbnailCache] Remove {path}')
|
||||||
|
os.remove(path)
|
||||||
|
|
Loading…
Add table
Reference in a new issue