Use deeper queue for thumbnails
This commit is contained in:
parent
6bd0bc62b9
commit
97af0de6c2
3 changed files with 77 additions and 80 deletions
lazy_player
|
@ -8,8 +8,6 @@ from typing import Optional, overload
|
|||
|
||||
from gi.repository import Gio, GObject
|
||||
|
||||
from .thumbnailer import Thumbnailer
|
||||
|
||||
|
||||
class FileType(Enum):
|
||||
DIRECTORY = auto()
|
||||
|
@ -80,13 +78,6 @@ class FileItem(GObject.Object):
|
|||
self._has_thumbnail = value
|
||||
self.notify("has-thumbnail")
|
||||
|
||||
def ensure_thumbnail(self, thumbnailer: Thumbnailer):
|
||||
if self.thumbnail or self.attempted_thumbnail:
|
||||
return
|
||||
|
||||
if not self.attempted_thumbnail:
|
||||
thumbnailer.generate_thumbnail(self)
|
||||
|
||||
@overload
|
||||
def _load_attribute(self, name: str, dfl: str) -> str: ...
|
||||
|
||||
|
|
|
@ -471,7 +471,7 @@ class MainWindow(Gtk.ApplicationWindow):
|
|||
|
||||
# Update thumbnail if available
|
||||
if file_item := self.selection:
|
||||
file_item.ensure_thumbnail(self.thumbnailer)
|
||||
self.thumbnailer.generate_thumbnail(file_item)
|
||||
|
||||
if file_item.thumbnail and not self.thumbnail_image.get_paintable():
|
||||
gbytes = GLib.Bytes.new(cast(Any, file_item.thumbnail))
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
import threading
|
||||
from queue import Empty, Queue
|
||||
from queue import Empty, Full, LifoQueue
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from gi.repository import GLib, Gst
|
||||
|
@ -18,13 +19,15 @@ DEFAULT_SEEK_FLAGS = (
|
|||
| Gst.SeekFlags.TRICKMODE_NO_AUDIO
|
||||
)
|
||||
|
||||
__all__ = ["Thumbnailer", "generate_thumbnail_sync"]
|
||||
|
||||
|
||||
class Thumbnailer(threading.Thread):
|
||||
queue: Queue[FileItem | None]
|
||||
queue: LifoQueue[FileItem | None]
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(daemon=True)
|
||||
self.queue = Queue(maxsize=1)
|
||||
self.queue = LifoQueue(maxsize=20)
|
||||
|
||||
def generate_thumbnail(self, file_item: FileItem):
|
||||
"""Add a file item to the thumbnail queue"""
|
||||
|
@ -32,19 +35,22 @@ class Thumbnailer(threading.Thread):
|
|||
if not file_item.full_path.is_file():
|
||||
return
|
||||
|
||||
# Replace any pending item in the queue
|
||||
if file_item.attempted_thumbnail:
|
||||
return
|
||||
|
||||
try:
|
||||
self.queue.get_nowait()
|
||||
except Empty:
|
||||
self.queue.put_nowait(file_item)
|
||||
except Full:
|
||||
pass
|
||||
|
||||
self.queue.put_nowait(file_item)
|
||||
file_item.attempted_thumbnail = True
|
||||
|
||||
def stop(self):
|
||||
"""Stop the thumbnailer thread"""
|
||||
|
||||
# Replace any pending items in the queue
|
||||
try:
|
||||
# Drop all pending items
|
||||
while True:
|
||||
self.queue.get_nowait()
|
||||
except Empty:
|
||||
pass
|
||||
|
@ -61,10 +67,10 @@ class Thumbnailer(threading.Thread):
|
|||
if file_item is None:
|
||||
break
|
||||
|
||||
file_item.attempted_thumbnail = True
|
||||
self._generate_thumbnail(file_item)
|
||||
generate_thumbnail_sync(file_item)
|
||||
|
||||
def _generate_thumbnail(self, file_item: FileItem):
|
||||
|
||||
def generate_thumbnail_sync(file_item: FileItem):
|
||||
"""Generate thumbnail for a single file"""
|
||||
|
||||
pipeline_str = (
|
||||
|
@ -127,7 +133,7 @@ class Thumbnailer(threading.Thread):
|
|||
GLib.idle_add(set_thumbnail)
|
||||
|
||||
except Exception as err:
|
||||
print("Failed:", file_item.full_path, err)
|
||||
print("[thumbnailer] Error:", file_item.full_path, err, file=sys.stderr)
|
||||
|
||||
finally:
|
||||
pipeline.set_state(Gst.State.NULL)
|
||||
|
|
Loading…
Reference in a new issue